【求助】OpenFOAM求解时候出现的错误



  • 在OpenFOAM求解的时候,出现了下面的错误:

    [0]
    [0]
    [0] -->FOAM FATAL ERROR
    [0] Attempt to create more than 2 tmp's referring to the same object of type tmp<N4Foam14GeometricFieldINS_6VectorIdEENS_12fvPatchFieldENS_7volMeshEEE>
    [0] 
    [0]     From function void Foam::tmp<T>::operator++() [with T = Foam::GeometricField<Foam::Vector<double>, Foam::fvPatchField, Foam::volMesh>]
    [0]     in file /opt/openfoam6/src/OpenFOAM/lnInclude/tmpI.H at line 38.
    [0]
    

    问题代码应该是这几句

    fvVectorMatrix AEqn
    (
        fvm::laplacian(A)
     ==
        -fvc::Su(miu0*js, A)
    );
    AEqn.relax();
    AEqn.solve();
    B = fvc::curl(A);
    

    A是一个矢量场,miu0是一个标量,js是一个矢量场
    这个问题觉得代码没写错
    另外,什么时候回用到tmp这个类型?tmp<volScalarField> t_scalarField 与 volScalarField scalarField 这两种声明方式主要区别是什么?
    请各位不吝赐教::shangxue:



  • 你的代码里没看到tmp?volScalarField和scalarField前者有边界条件,后者没有



  • @东岳 我的代码里没有用到tmp。这个程序是基于laplacianFoam写的,用于简单电磁场的求解,里面只有两个传输方程:

    fvScalarMatrix phieEqn
    (
        fvm::laplacian(phi_e)
    );
    phieEqn.relax();
    phieEqn.solve();
    js = fvc::reconstruct
         ( 
            -fvc::interpolate(conduct)
           * fvc::snGrad(phi_e)
           * mesh.magSf() 
         );
    
    fvVectorMatrix AEqn
    (
        fvm::laplacian(A)
     ==
        -fvc::Su(miu0*js, A)
    );
    AEqn.relax();
    AEqn.solve();
    B = fvc::curl(A);
    

    phi_e是电势;conduct是电导率,这里是一个非均匀场,所以计算电流密度js的时候差值了一下;A是磁矢势;miu0为真空磁导率
    在运行的时候,phieEqn是可以顺利求解的,但是AEqn求解的时候就出错误了
    另外,在很多OpenFOAM的底层文件中,经常用tmp<volScalarField>来声明变量,我的理解是:volScalarField声明的变量是在需要在内存中指定一块地址给这个变量的,而tmp<volScalarField>是指向一个volScalarField的指针。可是在volScalarField变量之间做赋值和参数传递的时候也只是传递的数据指针,函数调用volScalarField类型变量的时候用的也是引用传参,这样的话好像tmp可用可不用呀。
    在求解器的编写中基本上见不到tmp这个东西,但是在底层的一些代码中tmp就满天飞。有哪些场合必须用tmp<volScalarField>而不用volScalarField?tmp这个东西用的时候需要注意什么?



  • tmp是可用不可用都行的。5年前曾无聊测试过tmp,能节省内存。你看tmpI.H里面的代码,有个clear()函数,一旦tmp指向了真实的volScalarField,tmp就释放了。

    求解器里面也有类似的使用,UEqn.clear();

    tmp只是内存优化的产物,面向对象和面向过程也一样。指针、引用、const、tmp都是指上添花的东西,如果用起来感觉麻烦,可以按照最简单的来然后在优化。


  • OpenFOAM教授

    js是什么类型?怎么声明的?



  • @wwzhao js是一个矢量场,其物理意义是电流

    volVectorField js
    {
        IOobject
        (
            "js",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::AUTO_WRITE
        ),
        mesh,
        dimensionedVector("js", dimensionSet(0,-2,0,0,0,1,0), Zero)
    };
    

Log in to reply