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++的基础薄弱,希望有人能解答~



  • mapFields很慢?我在2015年算一个高尔夫球的时候遇到过这个问题。你用的是什么版本OpenFOAM,印象中OpenFOAM-2.3.x以后对mapFields进行了大量改动,你用的是mpirun的方式?



  • @李东岳
    我的版本是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 = 00_1492506483653_log.mapFields.txt,这个log里面有我在相应类的地方加的一些输出。



  • @李东岳
    所以每一个map时间步后我把所有的0文件重命名成相应的时间步再进行下一步。
    下面是相关的附件:

    我用的脚本:
    0_1492507241431_Allrun1.txt
    mapFieldsDict:
    0_1492507250371_mapFieldsDict.txt

    Source case 转子部分
    0_1492509534847_SourceMesh_with_blades_rotwall_blade.jpg
    还有cyclicAMI类型的rotinterface_rmax _zmax _zmin没有显示出来

    Target case 转子部分,cuttingPatches的两个patch
    0_1492508448117_TargetMesh_no_blades_cuttingPatches.jpg


登录后回复
 

与 CFD 中国 的连接断开,我们正在尝试重连,请耐心等待