CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

    如何在程序中累加不同时刻流场

    OpenFOAM
    2
    5
    534
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 小
      小考拉 最后由 编辑

      各位前辈好!

      我有一个volScalarField场c_flow,现在想累加每一个时刻的c_flow流场,在一段时间后输出c_flow_total

      我写的程序如下:
      初始化设置c_flow_total流场为0

      Info<< "Initializing c_flow_total" << endl;
      
      volScalarField c_flow_total
      (
          IOobject
          (
              "c_flow_total",
              mesh.time().timeName(),
              mesh,
              IOobject::READ_IF_PRESENT,    
              IOobject::NO_WRITE
          ),
         mesh,
         dimensionedScalar("c_flow_total", dimensionSet(0,1,-1,0,0,0,0), 0)
      );
      

      然后在主程序中计算c_flow和c_flow_total

      Info<< "Calculating erosion index c_flow\n" << endl;
      
      volScalarField c_flow
      (
          IOobject
          (
              "c_flow",
              runTime.timeName(),
              mesh,
              IOobject::NO_READ,
              IOobject::AUTO_WRITE
          ),
         8.97pos(p_rgh - pSat)*sqrt(mag(p_rgh - pSat)/rho1)
      );
      
      Info<< "Calculating c_flow_total" << endl;
      
      volScalarField c_flow_total
      (
          IOobject
          (
              "c_flow_total",
              runTime.timeName(),
              mesh,
              IOobject::READ_IF_PRESENT,
              IOobject::AUTO_WRITE
          ),
         c_flow_total.oldTime() + c_flow  
      );
      

      程序编译没有问题,但用interPhaseChangeFoam计算case报错如下:

      Calculating c_flow_total
      #0  Foam::error::printStack(Foam::Ostream&) at ??:?
      #1  Foam::sigSegv::sigHandler(int) at ??:?
      #2  ? in "/lib64/libc.so.6"
      #3  Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>::storeOldTimes() const at ??:?
      #4  Foam::GeometricField<double, Foam::fvPatchField, Foam::volMesh>::oldTime() const at ??:?
      #5  ? at ??:?
      #6  __libc_start_main in "/lib64/libc.so.6"
      #7  ? at ??:?
      Segmentation fault
      

      我感觉可能是oldTime()的使用出现了问题,请问一下大家,在程序中 累加每一个时刻的流场有什么好的办法呢?

      T 1 条回复 最后回复 回复 引用
      • T
        Tens 讲师 @小考拉 最后由 编辑

        @小考拉
        在createFields.H添加

        volScalarField c_flow
        (
            IOobject
            (
                "c_flow",
                runTime.timeName(),
                mesh,
                IOobject::NO_READ,
                IOobject::AUTO_WRITE
            ),
           mesh,
           dimensionedScalar("c_flow", dimensionSet(0,1,-1,0,0,0,0), 0)
        );
        
        volScalarField c_flow_total
        (
            IOobject
            (
                "c_flow_total",
                mesh.time().timeName(),
                mesh,
                IOobject::READ_IF_PRESENT,    
                IOobject::NO_WRITE
            ),
           mesh,
           dimensionedScalar("c_flow_total", dimensionSet(0,1,-1,0,0,0,0), 0)
        );
        
        

        然后在主程序里添加

        c_flow = 8.97pos(p_rgh - pSat)*sqrt(mag(p_rgh - pSat)/rho1);
        c_flow_total += c_flow;
        

        我个人认为这样是可以实现的

        小 1 条回复 最后回复 回复 引用
        • 小
          小考拉 @Tens 最后由 编辑

          @tens 感谢您的回答,我试验了一下,确实可以累加流场,但我非常疑惑,在主程序中添加

          c_flow_total += c_flow;  // 展开为c_flow_total = c_flow_total + c_flow;
          

          每一次循环,主程序怎么知道等式右边的c_flow_total代表了上一个时间步的值呢?为什么替换为c_flow_total.oldTime()就不可以了呢?

          希望您能够在解答一下,谢谢:xinxin:

          T 1 条回复 最后回复 回复 引用
          • T
            Tens 讲师 @小考拉 最后由 编辑

            @小考拉
            在这句话调用之前,c_flow_total是前面所有时间步之和,这句话的作用是在c_flow_total上加上当前时间步的c_flow。就是一个简单的累加过程,你可能被oldTime给绕进去了

            小 1 条回复 最后回复 回复 引用
            • 小
              小考拉 @Tens 最后由 编辑

              @tens 谢谢您的热心指点,虽然还有点晕,我后面仔细体会体会:quwan: ,再次感谢:xinxin:

              1 条回复 最后回复 回复 引用
              • First post
                Last post