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
5 帖子 2 发布者 3.9k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 小 离线
    小 离线
    小考拉
    写于 最后由 编辑
    #1

    各位前辈好!

    我有一个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 离线
    T 离线
    Tens 神
    在 中回复了 小考拉 最后由 编辑
    #2

    @小考拉
    在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 最后由 编辑
    #3

    @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 离线
    T 离线
    Tens 神
    在 中回复了 小考拉 最后由 编辑
    #4

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

    小 1 条回复 最后回复
  • 小 离线
    小 离线
    小考拉
    在 中回复了 Tens 最后由 编辑
    #5

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

    1 条回复 最后回复

  • 登录

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