mapFields 太慢,想在里面加入cputime这样的输出
-
我做一个转子在流体里搅动的算例,有两套网格:源网格是动网格(AMI),目标网格不是动网格没有叶片,所以在映射的时候没有用-consistent。问题是时间很长,12个cpu要三个小时,源网格大小是610万左右,目标网格接近600万,所以想要在代码里面加入一些输出来看每段调用花的时间。于是就从icoFoam里面的例子出发:
int main(int argc, char *argv[]) { #include "setRootCase" #include "createTime" // ... Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s" << nl << endl;
刚好在mapFields.C里面找到有Time类的runTimeSource和runTimeTarget:
#include "createTimes.H"
所以在main函数里面按照icoFoam那样输出cpu time没有问题。再深入一点,进入到其它的函数里面会怎么样呢?在我的例子里consistent为假:
else { mapSubMesh ( meshSource, meshTarget, patchMap, addProcessorPatches(meshTarget, cuttingPatches), mapMethod, patchMapMethod, subtract, selectedFields, noLagrangian ); }
去找mapSubMesh,还在mapFields.C里面,里面又有一个meshToMesh类的构造函数,嵌套了constructFromCuttingPatches,最后比如说我来到其中的calculate(methodName);想在这样一个函数体里面用mapFields里面main中初始化的runTimeTarget
void Foam::meshToMesh::calculate(const word& methodName) { Info<< runTimeTarget.elapsedCpuTime() << endl; // 就加了上面一行 } $ wmake meshToMeshInterpolation/meshToMesh/meshToMesh.C: In member function 'void Foam::meshToMesh::calculate(const Foam::word&)': meshToMeshInterpolation/meshToMesh/meshToMesh.C:161:42: error: 'runTimeTarget' was not declared in this scope Info<< "Hi, if runTime available" << runTimeTarget.elaspedCpuTime() << endl; ^ make: *** [Make/linux64GccDPDebug/meshToMesh.o] Error 1
我的问题可以总结为在main里面的Time实例,如何在像calculate这样的函数里面使用?
Time继承自clock(OpenFOAM/global/clock)和cpuTime(OSspecific/POSIX/cpuTime),但我不明白global文件夹的意思?C++的基础薄弱,希望有人能解答~
-
@李东岳
我的版本是OpenFOAM-2.3.x,命令为mpirun -np 12 mapFields $sourceCase -noFunctionObjects -fields '(U)' -sourceTime '0.2' -parallel
在3.0.1里面有parallelSource选项什么的:
$ mapFields -help -parallelSource the source is decomposed -parallelTarget the target is decomposed
但是我用的2.3.x没有,具体做这个map的过程是从souceCase里面拷贝constant(网格)和system(主要是decomposeParDict),然后
decomposePar
,这时候每一个processor*
文件中都会有constant,[0_1492506170401_log.mapFields.txt],这个时候做mapFields,具体-time
写的什么我记不清楚了,但是mapFields每次默认的Target time = 0
0_1492506483653_log.mapFields.txt,这个log里面有我在相应类的地方加的一些输出。 -
@李东岳
所以每一个map时间步后我把所有的0
文件重命名成相应的时间步再进行下一步。
下面是相关的附件:我用的脚本:
0_1492507241431_Allrun1.txt
mapFieldsDict:
0_1492507250371_mapFieldsDict.txtSource case 转子部分
还有cyclicAMI类型的rotinterface_rmax _zmax _zmin没有显示出来Target case 转子部分,cuttingPatches的两个patch