fsiFoam 无法识别 interflow 传输模型问题

流体部分用的是两相流么?自己写了 interFlow 部分吗?

你好,是两相流,我是初学者按别人的论文上改了interflow.C 和.H

意思是 transportModel 这一行没有在 transportProperties 文件里面,可能用到了单相流里面的传输模型。

需要新定义 twoPhaseMixture 对象,不要用 singlePhaseTransportModel 。

重新定义 twoPhaseMixture 对象具体是怎么操作?改哪个文件?我刚入门不是很懂,希望能说具体点,真的麻烦你了,先谢谢你

是要在interflow里面修改吗

不在 foam-extend-3.1 的 src 里面修改。需要在 fluidStructureInteraction/src/fluidStructureInteraction/flowModels/ 里面新建一个求解器,你看到了吗?这里有 consistentFLow, pisoFlow 之类的。需要把你的求解器加入到这里。求解器的结构要和其他求解器类似。

然后在上一级的 Make/files 添加 inteFlow.C,就像这个文件的前面几行类似。

然后在 src/fluidStructureIntreaction/ 目录下进行编译:

[user@localhost fluidStructureInteraction]$ make libso

如果没有错误的话,就可以进行试算了。试算的时候,还需要修改 case/fluid/constant/flowProperties 里面的 flowModel 参数。

如果你的 interFlow 里面正确定义了 twoPhaseMixture 应该没有大的问题。

博主你好,我按着你的说法编译了库,把incompressibleTwoPhaseMixture包括进去了,然后构造了interflow.C和.H 依旧没法识别 :innocent:

EXE_INC = \
    -I./numerics/fvMeshSubset \
    -I./stressModels/componentReference \
    -I./numerics/findRefCell \
    -I./stressModels/constitutiveModel/plasticityStressReturnMethods/plasticityStressReturn \
    -I./stressModels/constitutiveModel \
    -I./stressModels/stressModel/fvMeshSubset \
    -I./numerics/ggi/ExtendedGGIInterpolation \
    -I./fluidStructureInterface \
    -I./numerics/leastSquaresVolPointInterpolation \
    -I./numerics/skewCorrectedSnGrad \
    -I./numerics/skewCorrectedVectorSnGrad \
    -I./numerics/fvc \
    -I./stressModels/fvPatchFields/tractionDisplacement \
    -I./stressModels/fvPatchFields/tractionDisplacementIncrement \
    -I./stressModels/fvPatchFields/fixedDisplacement \
    -I./stressModels/fvPatchFields/symmetryDisplacement \
    -I./stressModels/stressModel \
    -I./numerics/ddtSchemes \
    -I./flowModels/flowModel \
    -I./interFoam \
    -I$(LIB_SRC)/finiteVolume/lnInclude \
    -I$(LIB_SRC)/turbulenceModels/incompressible/turbulenceModel \
    -I$(LIB_SRC)/transportModels \
    -I$(LIB_SRC)/transportModels/incompressible/lnInclude \
    -I$(LIB_SRC)/transportModels/interfaceProperties/lnInclude \
    -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \
    -I$(LIB_SRC)/transportModels/incompressible/incompressibleTwoPhaseMixture \
    -I$(LIB_SRC)/dynamicMesh/dynamicFvMesh/lnInclude \
    -I$(LIB_SRC)/dynamicMesh/dynamicMesh/lnInclude \
    -I$(LIB_SRC)/dynamicMesh/meshMotion/RBFMotionSolver/lnInclude \
    -I$(LIB_SRC)/dynamicMesh/meshMotion/fvMotionSolver/lnInclude \
    -I$(LIB_SRC)/finiteArea/lnInclude \
    -I$(LIB_SRC)/lagrangian/basic/lnInclude \
    -I$(LIB_SRC)/meshTools/lnInclude \
    -I$(LIB_SRC)/tetFiniteElement/lnInclude \
    -I$(LIB_SRC)/solidModels/lnInclude

EXE_LIBS = \
    -linterfaceProperties \
    -lincompressibleTurbulenceModel \
    -lincompressibleRASModels \
    -lincompressibleLESModels \
    -lincompressibleTransportModels \
    -lfiniteVolume \
    -ldynamicFvMesh \
    -ldynamicMesh \
    -lmeshTools \
    -ltopoChangerFvMesh \ 
    -llduSolvers \
    -L$(MESQUITE_LIB_DIR) -lmesquite
    -lsolidModels


  1. 在 Make/files 里面加 interFlow.C 了吗?
  2. 看你的 interFlow.H 里,还是 singlePhaseTransportModel 呢?这个需要换成 twoPhaseMixture 的。
  3. 这个模型最好放在 flowModels 里面

笔者你好,我已经在make|file加入了interflow。通过wmake libso > make.log 2>&1没有报错

然后我听从你的建议把interflow.H的include改成 twoPhaseMixture ,在下面的改成 //- Transport model
twoPhaseMixture laminarTransport_;
他就出现了 请问这又是怎么回事。真的万分感谢,为我做了那么多解答

感觉识别了transportmodel 可是里面的rho又识别不了

我试着将传输模型改成单向流的,他又变成phase1识别不了

识别 rho 的方法需要跟利用 twoPhaseMixture 配合才行。

\rho = \alpha_\text{L} \rho_\text{L} + (1-\alpha_\text{L} ) \rho_\text{G}

需要新建 rho 场。以下为示例,可以根据你的情况更改

    dimensionedScalar rho10
    (
        transportProperties.subDict("phase1").lookup("rho0")
    );

    dimensionedScalar rho20
    (
        transportProperties.subDict("phase2").lookup("rho0")
    );

    volScalarField rho
    (
        IOobject
        (
            "rho",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::AUTO_WRITE
        ),
        alpha1*rho10 + (1.0-alpha1)*rho20,   // 这里是初始值
        alpha1.boundaryField().types()       // 边界类型
    );

每次算完 alpha 后,需要更新 rho 场。

:rofl:这个是要改interflow.c吗 初学者看不懂

这个的确需要改一点代码。其实也不算难,你也已经在改了。在你的 interFlow.H 里面要有定义,替换原来的 dimensionedScalar rho_;

    dimensionedScalar rho10_;

    dimensionedScalar rho20_;

    volScalarField rho_;

在 interFlow.C 里面的构造函数初始化时,把这几个替换掉原来的 rho_(...)

    rho10_(transportProperties.subDict("phase1").lookup("rho0")),
    rho20_(transportProperties.subDict("phase2").lookup("rho0")),
    rho_
    (
        IOobject
        (
            "rho",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::AUTO_WRITE
        ),
        alpha1_*rho10_ + (1.0-alpha1_)*rho20_,   // 这里是初始值
        alpha1_.boundaryField().types()       // 边界类型
    )

编译通过后,在你的每一相属性里面,要有 rho0 的值。

1.没有有效安装种类dimensionedScalar& :rofl:
2.在interflow.H识别不了rho10_(transportProperties.subDict(“phase1”).lookup(“rho0”)),
3.这句话好像也有问题alpha1_.boundaryField().types()

rho_.value() 就不能用了,直接用 rho()

函数 rho() 的类型应使用 volScalarField& ,在 .C 和 .H 里面都要修改

transportProperties.subDict(“phase1”).lookup(“rho0”) 换成 twoPhaseProperties.rho1(), twoPHaseProperties 就是你定义的两相流的属性 laminarTransport_ 。
相应地 rho2_ 就换成 twoPhaseProperties.rho1()

    rho10_(laminarTransport_.rho1()),
    rho20_(laminarTransport_.rho2()),
    rho_
    (
        IOobject
        (
            "rho",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::AUTO_WRITE
        ),
        alpha1_*rho10_ + (1.0-alpha1_)*rho20_,   // 这里是初始值
        alpha1_.boundaryField().types()          // 边界类型
    )

弄了很久还是不行 :rofl: 还是报错了 难受 还能帮帮我看下吗

这样,你把 .C 和 .H 贴上来,我帮你修一下。