关于网格高度变化的动网格设置
-
我写过类似的东西,网格可以根据当前的场值进行变动,用于研究风场作用下的积雪沉积/侵蚀。代码和算例可以参考[https://github.com/fightingxiaoxiao/driftScalarDyFoam],如果有用的话,也可以引下我的论文[https://doi.org/10.3389/feart.2022.822140]。
大致的思路是这样的:
- 在
dynamicMeshDict
中定义速度相关的动网格:
dynamicFvMesh dynamicMotionSolverFvMesh; motionSolverLibs (fvMotionSolvers); motionSolver velocityLaplacian; //displacementLaplacian; diffusivity quadratic inverseDistance 3(bottom.snow roof top);
- 定义
pointMotionU
边界条件为codedFixedValue
bottom.snow { type codedFixedValue; value uniform (0 0 0); name erosionDeposition; }
- 最后在
codeDict
嵌入代码,这里比较大的一个坑就是动网格使用节点值进行位移,但是实际计算拿到的都是面心值和体心值,需要做一个插值。另外,deltaH
是我自己求解器里定义的场,需要替换成你自己的内容。
erosionDeposition { code #{ label patchIndex = patch().index(); const volScalarField& deltaH = this->db().objectRegistry::lookupObject<volScalarField>("deltaH"); primitivePatchInterpolation facePointInterp(deltaH.mesh().boundaryMesh()[patchIndex]); //初始化插值类 const scalarField& deltaHp = deltaH.boundaryField()[patchIndex]; auto deltaHpp = facePointInterp.faceToPointInterpolate(deltaHp); //面心向节点插值 Info << "Successfully interpolate "<< deltaHpp().size() << " points." << endl; Info << "Local points number = " << patch().localPoints().size() << endl; pointField pVec(deltaHpp().size()); const scalar lowerLimit = 0.; forAll(pVec, i) { pVec[i][0] = 0; pVec[i][1] = 0; pVec[i][2] = deltaHpp()[i]; if(patch().localPoints()[i][2] + pVec[i][2] * this->db().time().deltaTValue() < lowerLimit) { pVec[i][2] = (lowerLimit - patch().localPoints()[i][2])/this->db().time().deltaTValue(); } } (*this) == pVec; #}; codeInclude #{ #include "fvCFD.H" #include "primitivePatchInterpolation.H" #}; codeOptions #{ -I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude #};
- 最终效果如下,一个方块周边的时变积雪
- 在