Skip to content

OpenFOAM

OpenFOAM交流区

5.3k 主题 31.1k 帖子
  • 从0开始计算没问题,停掉再续算过几步就出错

    9
    9 帖子
    6k 浏览
    R

    @Tens
    您好,我参考您的代码也在compressibleInterFoam中添加了组分方程,目前出现了某种组分的质量分数超过1的情况,这个问题困扰我很久了,可以麻烦您帮我看一下代码有什么问题吗?万分感谢!

    tmp<fv::convectionScheme<scalar>> mvConvection ( fv::convectionScheme<scalar>::New//convectionScheme:Abstract base class for convection schemes. ( mesh, fields, alpha2rho2phi, mesh.divScheme("div(alpha2rho2phi,Yi)") ) ); { forAll(Y, i) { if (i != inertIndex && composition.active(i)) { volScalarField& Yi = Y[i]; fvScalarMatrix YEqn ( fvm::ddt(alpha2rho2, Yi) + mvConvection->fvmDiv(alpha2rho2phi, Yi) - fvm::laplacian(turbulence.muEff()*alpha2, Yi) == alpha2*parcels.SYi(i, Yi) + fvOptions(rho2, Yi) ); YEqn.relax(); fvOptions.constrain(YEqn); YEqn.solve(mesh.solver("Yi")); fvOptions.correct(Yi); Yi.max(0.0); Yt += Yi; } Y[inertIndex] = scalar(1) - Yt; Info<<"info::inertIndex.................="<< inertIndex <<endl; Info<<"info::Y[inertIndex].................="<< max(Y[inertIndex]) <<endl; Y[inertIndex].max(0.0);

    我在createField.H中声明了下列变量:

    volScalarField alpha2rho2 ( IOobject ( "alpha2rho2", runTime.timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE ), alpha2*rho2 ); surfaceScalarField alpha2rho2phi ( IOobject ( "alpha2rho2phi", runTime.timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE ), linearInterpolate(alpha2*rho2*U) & mesh.Sf() );
  • 5 帖子
    3k 浏览
    R

    @李东岳 是跑求解器的时候出错的

  • 拉格朗日求解器添加颗粒受力的问题

    4
    4 帖子
    2k 浏览
    李东岳
    pressureGradient { alpha alpha; }

    类似的,试试

  • 2 帖子
    1k 浏览
    李东岳

    边界条件的移植相对来说简单一些。你边界条件的代码发来看看。不过我不会给你亲自移植,但是可以给你判断几个好走的路 :-)

  • reactingTwoPhaseEulerFoam添加空化模型

    2
    2 帖子
    1k 浏览
    李东岳

    openfoam这面要注意版本问题。你这个链接里面我看起码是2017年之前的文章。然后你用的openfoam2206。这里面版本不对。按照之前的弄,100%会有问题。

  • twoPhaseMixture类修改,编译通过,运行出错

    5
    5 帖子
    3k 浏览
    W

    @Rachel0096 在 twoPhaseMixture类修改,编译通过,运行出错 中说:

    还是卡在了下面的for循环当中

    没瞧出有啥问题。看输出的信息就是遍历网格,计算每个网格内的密度倒数。
    如果猜测是卡在for循环里了,这个cellVolMixture函数在heRhoThermo.C文件里也有调用,那里面也有一个for循环,瞅瞅是不是那里边有问题。

  • 关于cyclic boundary condition

    11
    11 帖子
    11k 浏览
    G

    关于cyclic boundary最近有一些发现,跟楼主和各位高手探讨一下,看看能否有所启发。

    本人的测试用例为大佬李东岳翻译的openfoam用户指南-9里面的顶盖驱动流,差别是左右边界设置为cyclic边界,设置方法为陈与论帖子(https://zhuanlan.zhihu.com/p/84137342 )前半段那个简单的方法,网格x和y两个方向各画了3个网格。openfoam版本用的是OpenFOAM-9.

    针对这个案例,在研究对流项的离散时,在gaussConvectionScheme.C中fvmDiv函数里发现,计算边界对矩阵A和源项的影响时,fvm.internalCoeffs()[patchi]和fvm.boundaryCoeffs()[patchi]的计算没有区分边界是否为coupled(),是否coupled()是通过调用不同类型的valueInternalCoeffs(pw)和valueBoundaryCoeffs(pw)实现的。通过valueInternalCoeffs(pw)和valueBoundaryCoeffs(pw)的返回值我们可以看到,对于cyclic的两个边界,这俩函数在coupledFvPatchField.C中计算,分别返回了

    Type(pTraits<Type>::one)*w; Type(pTraits<Type>::one)*(1.0 - w);

    由于

    fvm.internalCoeffs()[patchi] = patchFlux*psf.valueInternalCoeffs(pw); fvm.boundaryCoeffs()[patchi] = -patchFlux*psf.valueBoundaryCoeffs(pw);

    结合phi_f = A*phi_c+B(https://zhuanlan.zhihu.com/p/609043262 )的理论,相当于在cyclic边界上fvm计算面心的值时,只用到了边界单元的体心值phi_c,而没有用到周期边界另一头的单元值。分析其原因,这可能是由于openfoam矩阵存储方式的限制不得已而为之,因为非对角元是由lduAddressing来定位的,对于本案例而言,非对角上的非零元个数与内部面数目相同,为12个,如果在cyclic边界上计算面心的值时用到两个体心的值,则会新增一个非零元(相当于这个面变成了内部面),那么就出现了13个内部面,没办法在当前体系下存储。openfoam在处理周期边界fvm对流项的离散时相当于有一个窟窿。

    那么,既然没有用到cyclic另一头的单元,OpenFOAM怎么实现周期边界的呢。在surfaceInterpolationScheme.C:287可以发现,在fvc类型计算插值时,对于coupled()的情况进行了分别处理,用到了patchNeighbourField(),相当于在计算通量时补上了前面的窟窿。但是感觉影响应该还是会有,因此我建议楼主考察一下,遇到的问题是否与openfoam这个窟窿有关。

    最后,想跟大家探讨一下,假如想补上这个窟窿,有没有什么办法能够存储由于周期边界带来的矩阵中多的这个非零元素?这个问题非常关键,一是可以解决周期边界现有的问题,二是有可能解除当前openfoam面心插值时只有owner和neighbour两个体心值可用的限制。以上是个人的一些粗浅理解,希望大佬们指正!

  • 21 帖子
    17k 浏览
    C

    @李东岳 Fluent对用户来说其实都没有并行、分区、合并这种概念。印象很深,我刚转到OpenFOAM的时候才“发现”原来并行计算之前是需要分区的,自然分完区后也是需要合并的。虽然这个过程在我知道了之后很符合直觉,也慢慢习惯,但不得不说这方面Fluent做的真的很好。计算前设置好并行数量,跑完算例之后直接在GUI上看云图,流畅的一比。

    我记得Fluent用的是Metis,好像本来是开源的后来商业化了?会不会跟它有关,商业化的东西在用户体验这块肯定是好的。

  • 标量输运方程中的扩散项的正负

    3
    3 帖子
    2k 浏览
    vbcwlV

    @李东岳 感谢东岳老师,扩散项我明白了,但是对流项还有一个疑问,就是他的正负只跟速度有关,跟浓度梯度没有任何关系么还是受到二者共同影响?

  • 颗粒的平均量和脉动量的统计

    1
    1 帖子
    764 浏览

    请教一下,有什么办法可以获得openfoam中颗粒的平均速度,直径等量 以及RMS的信息,或者怎么后处理可以得到?

  • 添加粒子后计算速度变慢

    12
    12 帖子
    8k 浏览
    vbcwlV

    @星星星星晴 明白了,谢谢星星前辈

  • 超音速喷管CDV算例

    2
    2 帖子
    2k 浏览
    李东岳

    亚音速的算例:CDV-subsonic-rhoPimpleFoam.tar.xz

  • 42 帖子
    28k 浏览
    李东岳

    @Caijinjin 如果可以提供下述信息:CPU型号、节点数、操作系统、价格这些参数(如果不方便公开,可以发我邮箱),我可以远程给你向日葵看一下。另外,你们为什么换IB交换机?我看你们去年6月份买的集群,这半年一直没用么

  • 并行计算浮点报错

    2
    2 帖子
    1k 浏览
    李东岳

    @洱聿 在 并行计算浮点报错 中说:

    单核可以运算。并行运算到某个时间步库朗数突然增大

    类似这种问题。有的时候会发生。很难debug。这个一般来自于矩阵求解器,你可以试试换一下,比如GAMG换成PCG。但不保证解决

  • 使用A100和V100GPU运行RapidCFD

    13
    13 帖子
    8k 浏览
    李东岳

    @gtian 是否可以测试下200万网格的效果?https://www.cfd-china.com/topic/3988/200万网格并行算力测试-openfoam版本

  • 使用paraview时出现segmentation fault错误

    4
    4 帖子
    3k 浏览
    李东岳

    @TStones 在 使用paraview时出现segmentation fault错误 中说:

    这个等于是子系统自身的原因造成的问题吗?

    是的。类似linux远程+x也会有这个问题。

  • 1 帖子
    856 浏览
    L

    怎样输出与一个patch发生碰撞的颗粒的速度,位置信息

  • multiphaseEulerFoam对相变的计算

    1
    1 帖子
    1k 浏览

    各位老师和学者好,我最近在尝试使用multiphaseEulerFoam来计算水的闪蒸过程。但是遇到了一些问题。对于纯水的两相流动(没有空气),应该是调用ThermalPhaseChangePhaseSystem

    type thermalPhaseChangeMultiphaseSystem; phases (steam water); phaseChange on; steam { type purePhaseModel; diameterModel isothermal; isothermalCoeffs { d0 3e-3; p0 1e5; } residualAlpha 1e-3; } water { type purePhaseModel; diameterModel constant; constantCoeffs { d 1e-4; } residualAlpha 1e-3; }

    在此基础上,后续的换热模型选用了RanzMarshall,但是我发现根本不会发生闪蒸(我在能量方程里对water相直接补充了热量,保证了温度上升)

    in EEqns.H

    forAll(fluid.anisothermalPhases(), anisothermalPhasei) { phaseModel& phase = fluid.anisothermalPhases()[anisothermalPhasei]; const volScalarField& alpha = phase; tmp<volScalarField> tRho = phase.rho(); const volScalarField& rho = tRho(); tmp<volVectorField> tU = phase.U(); const volVectorField& U = tU(); volScalarField q = alpha*rho*(U&g)-alpha*rho*(U&g); if(phase.name() == "water") { q[93] = 5.0E8; q[94] = 5.0E8; q[95] = 5.0E8; q[96] = 5.0E8; q[97] = 5.0E8; } ···········

    不会发生相变的原因确定于代码中,对于质量源项的计算有

    ThermalPhaseChangePhaseSystem.C

    // Interfacial mass transfer update { volScalarField& dmdtf(*this->dmdtfs_[pair]); volScalarField& Tf(*this->Tfs_[pair]); const volScalarField Tsat(saturationModelIter()->Tsat(thermo1.p())); const volScalarField L ( volatile_ != "none" ? this->Li(pair, volatile_, dmdtf, Tsat, latentHeatScheme::upwind) : this->L(pair, dmdtf, Tsat, latentHeatScheme::upwind) ); volScalarField H1(this->heatTransferModels_[pair].first()->K(0)); volScalarField H2(this->heatTransferModels_[pair].second()->K(0)); volScalarField dmdtfNew((H1*(Tsat - T1) + H2*(Tsat - T2))/L);

    其中,换热系数H1与2的计算
    RanzMarshall.C

    Foam::tmp<Foam::volScalarField> Foam::heatTransferModels::RanzMarshall::K(const scalar residualAlpha) const { volScalarField Nu(2 + 0.6*sqrt(pair_.Re())*cbrt(pair_.Pr())); return 6 *max(pair_.dispersed(), residualAlpha) *pair_.continuous().thermo().kappa() *Nu /sqr(pair_.dispersed().d()); }

    可以发现,当离散相为水蒸气(初始条件下为0),连续相为水时,输入的残差为0时,

    volScalarField H1(this->heatTransferModels_[pair].first()->K(0)); volScalarField H2(this->heatTransferModels_[pair].second()->K(0));

    这个H1和H2必然为0,因此计算所得到的相变量dmdtfNew也必然为0,无论液体的温度高过饱和温度多少。

    请问有老师碰到过这种情况吗,任何点拨都感激不尽:xinlei:

  • 浸没边界法边界条件报错

    3
    3 帖子
    2k 浏览
    T

    @李东岳 好的,谢谢李老师,我去看一下

  • openfoam中添加湍流激励

    8
    8 帖子
    5k 浏览
    李东岳

    @杨英狄

    pturb=0.39*(密度*湍动能)

    类似这种,可以通过这个实现,不需要复杂的操作

    const volScalarField& k = mesh_.lookupObject<volScalarField>("k");