VOF添加斥力模型
-
谢谢李老师提供的思路。我的理解是有两种方法:
- 处理相方程,粗略看了一下,感觉这个方法挺复杂。
- 可以改一改斥力的表达式,让它不那么大。
我在输出两个volVectorField,用来比较斥力和表面张力的大小,具体编程上也想请教一下,控制体体心的alpha的单位梯度怎么写。我目前是这样的,单位梯度必须加一个1e-300防止发散。
// Cell gradient of alpha const volVectorField gradAlpha(fvc::grad(alpha1)); repulsion_Compare = repulsion_Sum*gradAlpha/(mag(gradAlpha)+dimensionedScalar(dimensionSet(0,-1,0,0,0,0,0), 1e-300)); surfaceTensionMy=mixture.sigmaK()*gradAlpha;
OpenFOAM在算表面张力的时候,算曲率 $\kappa$ 的时候用到了面心的alpha单位梯度,也分享一下代码。
const surfaceVectorField& Sf = mesh.Sf(); // Cell gradient of alpha const volVectorField gradAlpha(fvc::grad(alpha1_, "nHat")); // Interpolated face-gradient of alpha surfaceVectorField gradAlphaf(fvc::interpolate(gradAlpha)); // Face unit interface normal surfaceVectorField nHatfv(gradAlphaf/(mag(gradAlphaf) + deltaN_)); correctContactAngle(nHatfv.boundaryFieldRef(), gradAlphaf.boundaryField()); // Face unit interface normal flux nHatf_ = nHatfv & Sf; // Simple expression for curvature K_ = -fvc::div(nHatf_);
-
我没有写全,就在function里面测试了一下这个力的大小(很多参数都是拍脑袋硬植入):
functions { setDeltaT { type coded; libs ("libutilityFunctionObjects.so"); writeControl writeTime; executeControl timeStep; code #{ #}; codeExecute #{ const volScalarField& alpha ( mesh().lookupObject<volScalarField>("alpha.air") ); const surfaceVectorField& Sf = mesh().Sf(); const volVectorField gradAlpha("gradAlpha", fvc::grad(alpha)); surfaceVectorField gradAlphaf(fvc::interpolate(gradAlpha)); const dimensionedScalar deltaN_ ( "deltaN", 1e-8/pow(average(mesh().V()), 1.0/3.0) ); surfaceVectorField nHatfv(gradAlphaf/(mag(gradAlphaf) + deltaN_)); volVectorField nHatv("nHatv", gradAlpha/(mag(gradAlpha) + deltaN_)); surfaceScalarField nHatf = nHatfv & Sf; volScalarField K("K", -fvc::div(nHatf)); volScalarField interface("interface", alpha); volVectorField force("force", nHatv); List<label> markedCell; forAll(mesh().C(), i) { force[i] = Zero; if (alpha[i] < 0.99 && alpha[i] > 0.01) { interface[i] = 1.0; markedCell.append(i); } else { interface[i] = 0.0; } } forAll(markedCell, i) { label celli = markedCell[i]; forAll(markedCell, j) { label cellj = markedCell[j]; scalar dij = mag(mesh().C()[celli] - mesh().C()[cellj]); scalar posneg = nHatv[celli] & nHatv[cellj]; if (posneg < 0.0) { if (dij < 0.15) { scalar K = 1e-2; force[celli] += K*nHatv[celli]/pow3(dij); } } } } markedCell.clear(); K.write(); nHatv.write(); gradAlpha.write(); force.write(); interface.write(); #}; } }
-
李老师,想请教一下源项的添加的问题。
比如我现在在有一个repulsion源项,要想植入,应该是有三个地方要添加。
一,速度预测方程,即UEqn.H中的fvMatrix UEqn。但我不清楚这里是否要加上源项。
加的理由是:fvOptions这种人工添加的源项都在。
不加的理由是:写的那个icoFoam解析,以及这里实际上只保留了对流项和粘度项,压力、表面张力和重力都没有加,这个斥力在形式上是和表面张力有关的,就像表面张力那样处理。fvVectorMatrix UEqn ( fvm::ddt(rho, U) + fvm::div(rhoPhi, U) + MRF.DDt(rho, U) + turbulence->divDevRhoReff(rho, U) == fvOptions(rho, U) + repulsion_Vector // add );
二,真实速度方程,一般的想法都是加上这个源项,就是最后的速度修正项是
但是在reactingTwoPhaseEulerFoam中,我看到这些源项都是直接加到最后的速度上的,不知道这里是您省略它们的具体形式了,还是这些$M$确实就不除以$ A_{d,p} $
就是这两种方式应该是哪一种?还是两种都可以?
三,上面两种不同方式的速度方程,对应不同的压力泊松方程,也就差个$ A_{d,p} $
-