Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. 【求助】OpenFOAM求解时候出现的错误

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

已定时 已固定 已锁定 已移动 OpenFOAM
6 帖子 3 发布者 6.1k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 史 离线
    史 离线
    史浩 神
    写于 最后由 编辑
    #1

    在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:

    让我们随波逐流

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #2

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

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    史 1 条回复 最后回复
  • 史 离线
    史 离线
    史浩 神
    在 中回复了 李东岳 最后由 编辑
    #3

    @东岳 我的代码里没有用到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这个东西用的时候需要注意什么?

    让我们随波逐流

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 李东岳 编辑
    #4

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

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

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

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • W 离线
    W 离线
    wwzhao 超神
    写于 最后由 编辑
    #5

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

    史 1 条回复 最后回复
  • 史 离线
    史 离线
    史浩 神
    在 中回复了 wwzhao 最后由 李东岳 编辑
    #6

    @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)
    };
    

    让我们随波逐流

    1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]