Speeding up double integration by nested Integrate1D

Hi, I am currently running some integrations. As they are over the complex plane, I started by modifying the given example by Igor to perform a double integration. While it works, it is stuck at being single-threaded. May I know if there is a way to use multi-threading to speed it up? I tried putting multithread keywords in it but they didn't help. The below is the full function: (To give more details, it it reproducing eq(6), the Wigner function, in this paper: https://arxiv.org/abs/1011.6668)
Function/c do2DintForWF(xmin,xmax,ymin,ymax,pWave)
    Variable xmin,xmax,ymin,ymax
    wave/d pWave
   
    Variable/G globalXmin=xmin
    Variable/G globalXmax=xmax
    Variable/G globalY
   
    variable/d/c integralT
    multithread integralT = Integrate1d(outerInt,ymin,ymax,1,0,pWave)       // Romberg integration

    return  integralT
End

Function/c innerInt(pWave1,inX)
    wave/d pWave1
    Variable inX
   
    //I chose inX to be lambda_Real, globalY to be lambda_Imaginary
   
    NVAR globalY=globalY

        //obtaining parameters from pWave
    variable m,n
    n=pWave1[2]
    m=pWave1[3]
   
    variable x,p
    x = pWave1[0]
    p = pWave1[1]
   
        //Breaking down the equation into parts
    variable/d/c integral1
    variable/c/d inB=cmplx(1,0), inC=cmplx(1,0), inH, inI, inJ, inK
    variable k,l
    if (m==0)
        inB = cmplx(1,0)
        else
        multithread inB = (-cmplx(inX,-globalY))^m
        endif
    if (n==0)
        inC = cmplx(1,0)
        else   
        multithread inC = (cmplx(inX,globalY))^n
        endif  
       
    inH = exp(-0.5*cmplx(inX,globalY)*cmplx(inX,-globalY))  //tested
    inI = exp(cmplx(X,P)*cmplx(inX,-globalY))       //tested
    inJ = exp(cmplx(X,-P)*cmplx(inX,globalY))       //tested
   
    integral1 = inB*inC*inH*inI/inJ
   
    return integral1
   
End

Function/c outerInt(pWave2,inY)
    wave/d pWave2
    Variable inY
   
    NVAR globalY=globalY
    globalY=inY
    NVAR globalXmin=globalXmin
    NVAR globalXmax=globalXmax
   
    variable/d/c integral2
    multithread integral2 = Integrate1D(innerInt,globalXmin,globalXmax,1,0,pWave2)  // Romberg integration
   
    return integral2
End
In the past you posted questions relating to IP6 and IP7. Here the version of Igor that you are using is critical. In IP6 Integrate1d was NOT thread safe. I recommend using IP7 or IP8 for this task. In the later versions of Igor there is automatic multithreading that might kick in at some point. If you want to experiment with the threshold for the multi-threading read the documentation for the MultiThreadingControl operation. Also note that there is an Integrate2D operation that may be useful for your application. Note that when Integrate1D is automatically multithreaded you may not gain much by calling MultiThread inside the integrand function. A.G.
Igor wrote:
In the past you posted questions relating to IP6 and IP7. Here the version of Igor that you are using is critical. In IP6 Integrate1d was NOT thread safe. I recommend using IP7 or IP8 for this task. In the later versions of Igor there is automatic multithreading that might kick in at some point. If you want to experiment with the threshold for the multi-threading read the documentation for the MultiThreadingControl operation. Also note that there is an Integrate2D operation that may be useful for your application. Note that when Integrate1D is automatically multithreaded you may not gain much by calling MultiThread inside the integrand function. A.G.
Thanks for the note, I was using Igor 7 above. I was looking at also Integrate2D but thought that might not work if the function return were complex, maybe I misread it? It said "real-valued user define function" For thread-safe issue, I am still exploring it. Not knowing good enough about this, I tried to naively flag them thread-safe and it crushed Igor. I believe the major point where things got slow down was that, inside the innerInt function I had the "array raised to power n or m" which were unnecessarily repeated. The problem I had was that, inX and globalY were variables that I cannot simply raise them outside of the function like I could with my function in another post.
Indeed, Integrate2D applies to real functions but you might be able to write an analytic form that breaks your task into evaluating two real 2D integrals. If you were able to crash Igor in any way you should report it to support@wavemetrics.com. Clearly working with threads could sometimes lead to unexpected results but if you found a way that you can crash the application we would appreciate a report. A.G. WaveMetrics, Inc.
Igor wrote:
Indeed, Integrate2D applies to real functions but you might be able to write an analytic form that breaks your task into evaluating two real 2D integrals. If you were able to crash Igor in any way you should report it to support@wavemetrics.com. Clearly working with threads could sometimes lead to unexpected results but if you found a way that you can crash the application we would appreciate a report. A.G. WaveMetrics, Inc.
Sure, I will report it next time; I thought that was a trivial thing as I didn't know what I was doing. I do manage to crush it often when dealing with XOP and stuff, I will send a feedback next time.