请教密度随深度连续变化设置问题
-
大家好,目前我正在使用interfoam,上层是空气,下层是水,对于水体,如何在边界和初始场文件设置密度随深度连续变化?已知其分布规律
-
interFoam
是不可压缩的,如果是水和空气,只有2个密度不具备梯度变化。你那个需要compressibleInterFoam
。密度随深度连续变化需要做硬植入或者写个utility,比如这种:https://coding.net/u/dyfluid/p/Solvers_DYFLUID/git/blob/master/pipeU/pipeU.C -
@东岳 谢谢版主。您给我的例子中是速度随深度变化U[cell].y() = 0.7 - mag(x - 0.075);,这个我用groovybc实现过。我的问题是一个水池,左侧入口速度恒定,但是密度需要连续分层,并且初始流场密度也要分层,与入口一致。研究流场中的障碍物影响,这个是否有相似的例子可以参考?
-
设置初始场可以用东岳大哥的方法(自己写一个 utility),边界条件则可以使用
codedFixedValue
。
举个例子:wall { type codedFixedValue; value uniform 550; name suibian; code #{ scalarField x = this->patch().Cf().component(0); // Cf 表示此 patch 的所有面心坐标,是一个 vectoeField,component(0) 表示取其第 0 个分量,即 x 坐标。 scalarField T = 550*x; operator==(T); #}; }
-
-
@浪迹天大 您好,我有些疑惑。
初始场密度分布的unity是写在compressibleInterFoam求解器中的‘createFields.H’文件中吗?在Info<< "Reading thermophysical properties\n" << endl; volScalarField& p = mixture.p(); volScalarField& T = mixture.T(); volScalarField& rho1 = mixture.thermo1().rho(); const volScalarField& psi1 = mixture.thermo1().psi(); volScalarField& rho2 = mixture.thermo2().rho(); const volScalarField& psi2 = mixture.thermo2().psi(); volScalarField rho ( IOobject ( "rho", runTime.timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE ), alpha1*rho1 + alpha2*rho2 );
代码中,我只需要把rho1重新定义成随函数变化就行吗?
边界条件部分,使用codedFixedValue可以按照您的给的例子把T换成密度吗?“0.org”文件夹中就没有rho这个文件呀?
-
@东岳 李老师,compressibleInterFoam求解器该如何设置边界密度随空间变化呢
-
compressibleInterFoam读入rho的方式是READ_IF_PRESENT,也就是说存在rho文件的话,就会被读进去。所以可以在0文件夹下自己添加一个rho,然后用funkySetField 设置你要的初始场。
至于“如何设置边界密度随空间变化”,compressibleInterFoam是基于压力的求解器,也就是密度由压力决定。所以只要把p_rgh设置对了就可以吧? -
@Jacobian 您好,谢谢您的回复。在我的算例里面,水和空气的密度可在constant文件夹中的thermalphysicalProperties设置成多项式形式,即随温度变化。我现在遇到的问题是希望能够设置水体(rho1)部分的数值按照一个特定的函数随空间变化,初始时刻满足、入口边界满足即可,我不是很清楚用压力是否合适
-
抱歉说漏了,rho、rho.water、rho.air这三个文件都要放进0文件夹。funkySetFields是能够使用函数表达式的,用来设置场内分布;边界上的值可以用funkySetBoundaryField来设置。在system下添加funkySetFieldsDict和funkySetBoundaryDict来使用。里面的内容,随便举个例子:
//funkySetFields expressions ( pressureWater { field p_rgh; //需要设置的物理量 expression "100000 - 99800*pos().y"; //这行写你要的函数 condition "(pos().x <= 5) && (pos().x >= 0)"; //起作用的范围、可以注释掉,不影响使用 keepPatches 1; //填1就好,要不然可能把边界条件改成zeroGradient } ); //funkySetBoundaryField pressureWater { field p_rgh; expressions ( { target value; patchName INLET; //选择边界面 //variables "maxY=max(pts().y);"; //可以注释掉,不影响使用 expression "100000 - 99800*pos().y"; //这行写你要的函数 } //可以再expression下同时写多个边界的设置 { target value; patchName OUTLET; //variables "maxY=max(pts().y);"; expression "100000 - 99800*pos().y"; } ); } 更多细节参考这里链接文本,以及swak4foam的tutorials
另外,你的这个算例里面压力也应当要设置,需要和密度相匹配。 -
@Jacobian 谢谢您的帮助。如果我把rho、rho.water、rho.air这三个文件放进0文件夹,此时thermalphysicalProperties设置的密度就没有用了吧
-
@Jacobian 我尝试了您的方法,其实不需要设置rho.water、rho.air。我设置了水的密度随高度按照双曲函数变化,初始时刻以及边界密度是没有问题的。但是运算开始后出现问题,密度分布立即按照thermalphysicalProperties设置变化,也就是说按照目前的方法无法控制密度与其他物理场的联系。实际上我的密度场是可以随着流场变化的,因此我觉得应该添加一个浓度输运方程,然后重新定义热物性,使密度随之变化。
7/13