CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   OpenFOAM Running, Solving & CFD (http://www.cfd-online.com/Forums/openfoam-solving/)
-   -   volum integral of mag(U)...? (http://www.cfd-online.com/Forums/openfoam-solving/97841-volum-integral-mag-u.html)

 sawyer86 February 27, 2012 06:31

volum integral of mag(U)...?

Hi there,

my question is how is possible to get the scalar value of the volume integral of the mag(U) in OpenFoam?

To me it will be ok at least to know what is the function/command/whatever that allow to compute the scalar value of the volume integral of mag(U) for a given mesh...

thank you very much in advance!

 alberto February 28, 2012 05:06

The fast way (but not necessarily the easy one :D), if you use OpenFOAM 2.1.x, is to add this piece of code to the controlDict of your case:

Code:

functions
(
magUIntegral
{
functionObjectLibs ("libutilityFunctionObjects.so");
type coded;
redirectType integral;
outputControl timeStep;
code
#{
const volVectorField& U = mesh().lookupObject<volVectorField>("U");
volScalarField magU(mag(U));

scalar volIntegral = 0;

forAll (magU, cellI)
{
volIntegral += magU[cellI]*mesh().V()[cellI];
}

Info<<"Volume integral: " << volIntegral << endl;

#};
}
);

To be able to run the case, you must allow system operations in the system controlDict. You have to locate it with

foamEtcFile controlDict

and change

allowSystemOperations 1;

When you run the code the first time, OpenFOAM will compile the additional code, and print the volume integral at each time step.

 sawyer86 February 28, 2012 05:08

Quote:
 Originally Posted by alberto (Post 346594) The fast way (but not necessarily the easy one :D), if you use OpenFOAM 2.1.x, is to add this piece of code to the controlDict of your case: Code: functions (   magUIntegral   {     functionObjectLibs ("libutilityFunctionObjects.so");     type coded;     redirectType integral;     outputControl timeStep;     code     #{       const volVectorField& U = mesh().lookupObject("U");       volScalarField magU(mag(U));       scalar volIntegral = 0;       forAll (magU, cellI)       {     volIntegral += magU[cellI]*mesh().V()[cellI];       }       Info<<"Volume integral: " << volIntegral << endl;     #};   } ); To be able to run the case, you must allow system operations in the system controlDict. You have to locate it with foamEtcFile controlDict and change allowSystemOperations 1; When you run the code the first time, OpenFOAM will compile the additional code, and print the volume integral at each time step.
Thank you very much Alberto! I will test it but it seems to be very useful and smart!

Regards

 sawyer86 February 28, 2012 05:48

Quote:
 Originally Posted by alberto (Post 346594) The fast way (but not necessarily the easy one :D), if you use OpenFOAM 2.1.x, is to add this piece of code to the controlDict of your case: Code: functions (   magUIntegral   {     functionObjectLibs ("libutilityFunctionObjects.so");     type coded;     redirectType integral;     outputControl timeStep;     code     #{       const volVectorField& U = mesh().lookupObject("U");       volScalarField magU(mag(U));       scalar volIntegral = 0;       forAll (magU, cellI)       {     volIntegral += magU[cellI]*mesh().V()[cellI];       }       Info<<"Volume integral: " << volIntegral << endl;     #};   } ); To be able to run the case, you must allow system operations in the system controlDict. You have to locate it with foamEtcFile controlDict and change allowSystemOperations 1; When you run the code the first time, OpenFOAM will compile the additional code, and print the volume integral at each time step.
Hi Alberto,

i did what you suggest me, and it works good! :)

But how can I do to print the value of run.Time and the mag(U) in a file instead than to screen...without modify the code, that means always in the controlDict...?

 alberto February 28, 2012 14:02

You can store the execution log, and process it to extract the values you need (and the corresponding times) with the standard Linux utilities.

As an alternative, you could try to open a text file in the code snippet, but I am not sure it's going to work.

 akidess February 29, 2012 04:17

If I may shamelessly promote my own utility here:

I extended the standard foamCalc tool to support min, max and volumeIntegrate calculations.

Code:

foamCalcEx mag U
foamCalcEx volIntegrate magU > data.txt

The above lines will write the volume integral into a text file data.txt.

 eelcovv February 29, 2012 10:31

Hi Anton,

Seems to be an interesting utility. I would like to check it out, but the hg clone command as described on your page does not work for me. Could you upload a tar-ball to the forum with source ?
Thanks!
Eelco

 akidess February 29, 2012 11:14

1 Attachment(s)

I'm attaching a tarball with the code to this post. Let me know if you have any troubles with it.

 eelcovv February 29, 2012 12:07

Hi Anton,

Yes, and then I tried

but this hg think does not work properly on our system Anyway, I will try you ultility.
Thanks!
Eelco

 Andrea_85 March 7, 2012 11:52

Hi Anton,
I downloaded and compiled your utility (i put it under OpenFoam/application/utility/postprocessing/miscellaneous/ but now how can i use it?
neither ./foamCalcEx nor foamCalcEx works.

best

andrea

 akidess March 7, 2012 12:49

Andrea, are you sure it compiled correctly, and that you started your foam environment? At the end of the compilation, you will see the location of the executable (highlighted in red here):

Code:

g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter \
-Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 \
-I/home/user/OpenFOAM/OpenFOAM-2.0.x/src/finiteVolume/lnInclude \
-I../postProcessing/foamCalcFunctionsEx/lnInclude/ -IlnInclude -I. \
-I/home/user/OpenFOAM/OpenFOAM-2.0.x/src/OpenFOAM/lnInclude \
-I/home/user/OpenFOAM/OpenFOAM-2.0.x/src/OSspecific/POSIX/lnInclude  \
-lfiniteVolume    -lgenericPatchFields -L/home/user/OpenFOAM/akidess-2.0.x/platforms/linux64GccDPOpt/lib \
-lfoamCalcFunctionsEx -lOpenFOAM -ldl  -lm -o /home/user/OpenFOAM/OpenFOAM-2.0.x/platforms/linux64GccDPOpt/bin/foamCalcEx

This corresponds to \${FOAM_APPBIN}/foamCalcEx. You should be able to call the tool using "foamCalcEx". "./foamCalcEx" will generally NOT work.

- Anton

 Andrea_85 March 7, 2012 12:56

Hi Anton,
i used ./Allwmake and this is what i got

Code:

+ wmake libo postCalc
wmakeLnInclude: linking include files to ./lnInclude
Making dependency list for source file postCalc.C
SOURCE=postCalc.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/postCalc.o
ld -r -o /home/aferrari/OpenFOAM/OpenFOAM-2.1.0/platforms/linux64GccDPOpt/lib/postCalc.o Make/linux64GccDPOpt/postCalc.o
'/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/platforms/linux64GccDPOpt/lib/postCalc.o' is up to date.
+ wmake libso foamCalcFunctionsEx
wmakeLnInclude: linking include files to ./lnInclude
Making dependency list for source file calcType/calcType.C
Making dependency list for source file calcType/calcTypeNew.C
Making dependency list for source file field/components/components.C
Making dependency list for source file field/mag/mag.C
Making dependency list for source file field/magSqr/magSqr.C
Making dependency list for source file field/div/div.C
Making dependency list for source file field/randomise/randomise.C
Making dependency list for source file field/interpolate/interpolate.C
Making dependency list for source file field/min/min.C
Making dependency list for source file field/max/max.C
Making dependency list for source file field/maxAbs/maxAbs.C
Making dependency list for source file field/volIntegrate/volIntegrate.C
SOURCE=calcType/calcType.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/calcType.o
SOURCE=calcType/calcTypeNew.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/calcTypeNew.o
SOURCE=field/components/components.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/components.o
SOURCE=field/mag/mag.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/mag.o
SOURCE=field/magSqr/magSqr.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/magSqr.o
SOURCE=field/magGrad/magGrad.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/magGrad.o
SOURCE=field/div/div.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/div.o
SOURCE=field/randomise/randomise.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/randomise.o
SOURCE=field/interpolate/interpolate.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/interpolate.o
SOURCE=field/min/min.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/min.o
SOURCE=field/max/max.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/max.o
SOURCE=field/maxAbs/maxAbs.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/maxAbs.o
SOURCE=field/volIntegrate/volIntegrate.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/volIntegrate.o
SOURCE=basic/addSubtract/addSubtract.C ;  g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3  -DNoRepository -ftemplate-depth-100 -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/aferrari/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude  -fPIC -c \$SOURCE -o Make/linux64GccDPOpt/addSubtract.o
'/home/aferrari/OpenFOAM/aferrari-2.1.0/platforms/linux64GccDPOpt/lib/libfoamCalcFunctionsEx.so' is up to date.

actually i cannot see the executable.:confused:
i'm using OF 2.1.0 as you can see.

best

andrea

 akidess March 7, 2012 13:27

You just compiled the post-processing libraries postCalc and foamCalcFunctionsEx, but not the application. I think you are in the wrong directory.

The directory tree should look like this:

Code:

foamcalcex
---- Allwmake
---- foamCalcExApp
-------- foamCalc.C
-------- Make
---- postProcessing
-------- Allwmake
-------- foamCalcFunctionsEx
-------- postCalc

Are you using the Allwmake script in the top level directory?

 eelcovv March 7, 2012 16:17

Hi Alberto,

I tried you piece of code to do the volume averaging. It works, so this is very useful. Thanks for that! Only one thing: it seems that it does not work if I run the code in parallel. Any quick example how to deal with that ?

Thanks!

Regards
Eelco

 Andrea_85 March 8, 2012 05:07

Hi,
you area right Anton, i was copiling from second level.:D
Thanks

andrea

 laurensvd March 26, 2012 04:23

Quote:
 Originally Posted by eelcovv (Post 348219) Hi Alberto, I tried you piece of code to do the volume averaging. It works, so this is very useful. Thanks for that! Only one thing: it seems that it does not work if I run the code in parallel. Any quick example how to deal with that ? Thanks! Regards Eelco
I have the same problem with a code which I wrote myself. I use the same code in a boundary condition code and it works but when I try it with the coded functions it crashes when using parallel. Any idea on how we can fix this (Alberto)?

Ok after searching for a day I find the solution right after posting this :) Very typical

Quote:
 in OpenFoam-2.x.x/etc/controlDict, you need to change this line to fileModificationChecking timeStamp;
Also, is there a reason (performance/accuracy) that you calculate the volume integral by looping over the cells instead of using the standard fvc::domainIntegrate(field).value() function?

 eelcovv March 26, 2012 04:46

I reported it as a bug at Mantis. The error can be avoided by the following suggestion

'As a workaround switch off the 'masterOnly' file reading (set fileModificationChecking to timeStamp instead of timeStampMaster) in the etc/controlDict (or your personal one). '

So copy the \$FOAM_INST_DIR/etc/bashrc

to the directory (create is if you dont have it yet, with the appropriate OF version of course)

\$HOME/.OpenFOAM/2.1.0/

and change line with timeStampMaster

Eelco

 laurensvd March 26, 2012 05:05

I found it minutes earlier in another posts of yours.

Bedankt :)

 eelcovv March 26, 2012 07:30

I just saw your remark on the fvc::domainIntegrate. Thanks for that hint! I did not know this function. I just worked out the parallelisation of the routine for manually integrating over the cell. In case of a parallel run, this requires that information from the slave is explicitely communicated to the master. The makes the scripting error prone and more complex. I just tried you domainIntegrate function, and now live gets much more easy. I reprogrammed the script and checked it: the results are identical.

In case anybody is interested for an example of code funtions of both example: I try to obain the average position of a single gas bubble in a grid by calculating int_(gasfraction*position)/int_(gasfraction). My first version uses the explicite integration

Code:

bubblePosition
{
functionObjectLibs ("libutilityFunctionObjects.so");
type coded;
redirectType average;
outputControl timeStep;
code
#{
const volScalarField& alpha1=mesh().lookupObject<volScalarField>("alpha1");

scalar sumGasFraction = 0;
vector sumGasPosition  = vector(0,0,0);

// store number of processors np and current processor id
label np=Pstream::nProcs();
label id=Pstream::myProcNo();

// loop over the cells and caclutate integral of gasfraction*position
forAll (alpha1, cellI)
{
scalar gf=(1-alpha1[cellI])*mesh().V()[cellI];
vector pos=mesh().C()[cellI];
sumGasFraction += gf;
sumGasPosition += gf*pos;
}

if(id==0)
{
// on the master: receive values from other nodes
scalar getSumGasFraction=0;
vector getSumGasPosition=vector(0,0,0);

for(label i=1; i<np; i++)
{
// receive a stream with heat flux and area from the others
IPstream vStream(Pstream::blocking, i);
vStream >> getSumGasFraction >> getSumGasPosition;
sumGasFraction += getSumGasFraction;
sumGasPosition += getSumGasPosition;
}

// report mean bubble position
vector meanBubblePosition=vector(0,0,0);
if(sumGasFraction>0)
{
meanBubblePosition=sumGasPosition/sumGasFraction;
Info<<"Mean bubble position : " << meanBubblePosition << endl;
}
else
{
Info<<"No gas present." << endl;
}
}
else
{
// on the slaves: send info to the master node
OPstream infoStream (Pstream::blocking, 0);
infoStream << sumGasFraction << sumGasPosition;
}
#};
}

It works, however, is quite a long script for something simple. Now the domainIntegrate version of the same routine

Code:

bubblePosition
{
functionObjectLibs ("libutilityFunctionObjects.so");
type coded;
redirectType average;
outputControl timeStep;
code
#{
const volScalarField& alpha1=mesh().lookupObject<volScalarField>("alpha1");
const volVectorField& positions=mesh().C();

scalar sumGasFrc=fvc::domainIntegrate((1-alpha1)).value();
vector sumGasPos=fvc::domainIntegrate((1-alpha1)*positions).value();

vector meanBubblePosition=vector(0,0,0);
if(sumGasFrc>0)
{
meanBubblePosition=sumGasPos/sumGasFrc;
Info<<"Mean bubble position : " << meanBubblePosition << endl;
}
else
{
Info<<"No gas present." << endl;
}

#};
}

Much shorter, and it yields exactly the same result (in both serial and parallel mode) as the first example. In order words, I would recommend the domainIntegrate version.

Regards
Eelco

 alberto March 26, 2012 10:07

Quote:
 Originally Posted by laurensvd (Post 351442) I have the same problem with a code which I wrote myself. I use the same code in a boundary condition code and it works but when I try it with the coded functions it crashes when using parallel. Any idea on how we can fix this (Alberto)? Ok after searching for a day I find the solution right after posting this :) Very typical
It was cited already, but for reference: http://www.openfoam.org/mantisbt/view.php?id=480

Quote:
 Also, is there a reason (performance/accuracy) that you calculate the volume integral by looping over the cells instead of using the standard fvc::domainIntegrate(field).value() function?
No preference, they are equivalent in terms of accuracy and performance. The only difference is that fvc::domainIntegrate uses gsum to perform the summation, and, as such, takes advantage of parallelization.

Best,

All times are GMT -4. The time now is 06:09.