FLuent与OpenFOAM中关于压力限制的区别
-
使用compressibleInterFoam计算气泡动力学问题的时候经常会出现液体内的绝对负压,pMin的作用如:https://www.cfd-online.com/Forums/openfoam-solving/218998-influence-pmin-compressibleinterfoam-oscillatory-pressure-boundary.html
所说,
是防止出现基于气体状态方程计算密度时不能出现绝对负压导致的负密度,但是在液体中一定的绝对负压是被允许的。
fluent中在solution limit有关于pressure-limit的设置,但是根据:https://innovationspace.ansys.com/knowledge/forums/topic/how-does-ansys-fluent-handle-negative-absolute-pressure-for-compressible-multiphase-cases/
中描述的,限制压力只作用于计算材料属性时将其限制为pMin,而正常流场中绝对负压并不作约束。在OpenFOAM中,像是为了限制pMin而将整个流场的压力值全部截断到pMin。现在我想通过把涉及到pMin的文件中相关语句注释掉,来消除pMin的影响。在OpenFOAM-9文件夹中使用grep -r pMin得到如下文件
src/twoPhaseModels/twoPhaseMixture/MPLIC/MPLICcell.C: const scalar pMin = cmptMin(pCubicAlphas_); src/twoPhaseModels/twoPhaseMixture/MPLIC/MPLICcell.C: if (root < pMax && root > pMin && rootOld != root) src/sampling/meshToMesh/calcMethod/meshToMeshMethod/meshToMeshMethod.C: return overlapEngine.cellCellOverlapMinDecomp src/finiteVolume/cfdTools/general/pressureReference/pressureReference.C: dict.found("pMin") src/finiteVolume/cfdTools/general/pressureReference/pressureReference.C: || dict.found("pMinFactor") src/finiteVolume/cfdTools/general/pressureReference/pressureReference.C: if (dict.found("pMin")) src/finiteVolume/cfdTools/general/pressureReference/pressureReference.C: << " min " << dict.lookup<scalar>("pMin") src/finiteVolume/cfdTools/general/pressureReference/pressureReference.C: if (dict.found("pMinFactor")) src/finiteVolume/cfdTools/general/pressureReference/pressureReference.C: << " minFactor " << dict.lookup<scalar>("pMinFactor") src/meshTools/tetOverlapVolume/tetOverlapVolume.C:bool Foam::tetOverlapVolume::cellCellOverlapMinDecomp src/meshTools/tetOverlapVolume/tetOverlapVolume.H: bool cellCellOverlapMinDecomp src/meshTools/edgeFaceCirculator/edgeFaceCirculatorI.H: label fpMin1 = f.rcIndex(fp); src/meshTools/edgeFaceCirculator/edgeFaceCirculatorI.H: if (f[fpMin1] == v1) src/meshTools/edgeFaceCirculator/edgeFaceCirculatorI.H: fp = fpMin1; src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8/hexRef8.C: label fpMin1 = f.rcIndex(fp0); src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8/hexRef8.C: if (pointLevel_[f[fpMin1]] <= cLevel) src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8/hexRef8.C: label edgeI = fEdges[fpMin1]; src/dynamicMesh/polyTopoChange/polyTopoChange/hexRef8/hexRef8.C: fpMin1, src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: label fpMin1 = fpA; src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: label fp = f.fcIndex(fpMin1); src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: // See where fp sorts. Make sure it is above fpMin1! src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: if (w <= dist[fpMin1]) src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: w = dist[fpMin1] + 1e-6*(dist[fpB] - dist[fpA]); src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: fpMin1 = fp; src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: fp = f.fcIndex(fpMin1); src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: fpMin1 = fpA; src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: fp = f.rcIndex(fpMin1); src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: // See where fp sorts. Make sure it is below fpMin1! src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: if (w <= dist[fpMin1]) src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: w = dist[fpMin1] + 1e-6*(dist[fpB] - dist[fpA]); src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: fpMin1 = fp; src/dynamicMesh/polyTopoChange/polyTopoChange/faceCollapser.C: fp = f.rcIndex(fpMin1); src/lagrangian/molecularDynamics/potential/tetherPotential/derived/pitchForkRing/pitchForkRing.C: scalar pMinusRSqr = sqr(p - rOrbit_); src/lagrangian/molecularDynamics/potential/tetherPotential/derived/pitchForkRing/pitchForkRing.C: -0.5 * mu_ * pMinusRSqr src/lagrangian/molecularDynamics/potential/tetherPotential/derived/pitchForkRing/pitchForkRing.C: + 0.25 * pMinusRSqr * pMinusRSqr src/lagrangian/molecularDynamics/potential/tetherPotential/derived/pitchForkRing/pitchForkRing.C: scalar pMinusR = (p - rOrbit_); src/lagrangian/molecularDynamics/potential/tetherPotential/derived/pitchForkRing/pitchForkRing.C: (mu_ - sqr(pMinusR)) * pMinusR * r.x()/(p + vSmall), src/lagrangian/molecularDynamics/potential/tetherPotential/derived/pitchForkRing/pitchForkRing.C: (mu_ - sqr(pMinusR)) * pMinusR * r.y()/(p + vSmall), src/lagrangian/parcel/parcels/Templates/ReactingParcel/ReactingParcel.H: demandDrivenEntry<scalar> pMin_; src/lagrangian/parcel/parcels/Templates/ReactingParcel/ReactingParcel.H: inline scalar pMin() const; src/lagrangian/parcel/parcels/Templates/ReactingParcel/ReactingParcel.C: if (td.pc() < cloud.constProps().pMin()) src/lagrangian/parcel/parcels/Templates/ReactingParcel/ReactingParcel.C: << " to " << cloud.constProps().pMin() << nl << endl; src/lagrangian/parcel/parcels/Templates/ReactingParcel/ReactingParcel.C: td.pc() = cloud.constProps().pMin(); src/lagrangian/parcel/parcels/Templates/ReactingParcel/ReactingParcelI.H: pMin_(this->dict_, 0.0), src/lagrangian/parcel/parcels/Templates/ReactingParcel/ReactingParcelI.H: pMin_(cp.pMin_), src/lagrangian/parcel/parcels/Templates/ReactingParcel/ReactingParcelI.H: pMin_(this->dict_, "pMin", 1000.0), src/lagrangian/parcel/parcels/Templates/ReactingParcel/ReactingParcelI.H:Foam::ReactingParcel<ParcelType>::constantProperties::pMin() const src/lagrangian/parcel/parcels/Templates/ReactingParcel/ReactingParcelI.H: return pMin_.value(); src/lagrangian/parcel/parcels/Templates/SprayParcel/SprayParcel.H: const scalar pMin, src/lagrangian/parcel/parcels/Templates/SprayParcel/SprayParcelI.H: const scalar pMin, src/lagrangian/parcel/parcels/Templates/SprayParcel/SprayParcelI.H: pMin, src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C: label fpMin1 = curFace.rcIndex(fp); src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C: else if (nbFace[nbPlus1] == curFace[fpMin1]) src/OpenFOAM/meshes/primitiveMesh/primitiveMeshCheck/primitiveMeshCheck.C: else if (nbFace[nbMin1] == curFace[fpMin1]) src/fvConstraints/limitPressure/limitPressure.H: dimensionedScalar pMin_; src/fvConstraints/limitPressure/limitPressure.C: pMin_.value() = dict.lookup<scalar>("min"); src/fvConstraints/limitPressure/limitPressure.C: scalar pMin = vGreat; src/fvConstraints/limitPressure/limitPressure.C: pMin = min(pMin, min(pbf[patchi])); src/fvConstraints/limitPressure/limitPressure.C: reduce(pMin, minOp<scalar>()); src/fvConstraints/limitPressure/limitPressure.C: pMin_.value() = dict.lookup<scalar>("min"); src/fvConstraints/limitPressure/limitPressure.C: const scalar pMinFactor(dict.lookup<scalar>("minFactor")); src/fvConstraints/limitPressure/limitPressure.C: pMin_.value() = pMinFactor*pMin; src/fvConstraints/limitPressure/limitPressure.C: Info<< " min " << pMin_.value() << nl; src/fvConstraints/limitPressure/limitPressure.C: pMin_("pMin", dimPressure, 0), src/fvConstraints/limitPressure/limitPressure.C: const scalar pMin = min(p).value(); src/fvConstraints/limitPressure/limitPressure.C: if (pMin < pMin_.value()) src/fvConstraints/limitPressure/limitPressure.C: Info<< "limitPressure: p min " << pMin << endl; src/fvConstraints/limitPressure/limitPressure.C: p = min(p, pMin_); applications/solvers/multiphase/compressibleInterFoam/pEqn.H: p = min(p_rgh + (alpha1*rho1 + alpha2*rho2)*gh, pMin); applications/solvers/multiphase/compressibleInterFoam/createFields.H:dimensionedScalar pMin applications/solvers/multiphase/compressibleInterFoam/createFields.H: "pMin", applications/solvers/multiphase/compressibleMultiphaseInterFoam/pEqn.H: p = max(p_rgh + mixture.rho()*gh, pMin); applications/solvers/multiphase/compressibleMultiphaseInterFoam/createFields.H:dimensionedScalar pMin("pMin", dimPressure, mixture); applications/solvers/multiphase/multiphaseEulerFoam/multiphaseEulerFoam/createFields.H:if (fluid.found("pMin")) applications/solvers/multiphase/multiphaseEulerFoam/multiphaseEulerFoam/createFields.H: << "Pressure limits, pMin and pMax, are now read from " applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/diameterModels/velocityGroup/sizeGroup/shapeModels/fractal/sinteringModels/KochFriedlander/KochFriedlander.C: dpMin_(dict_.lookupOrDefault<scalar>("dpMin", 0)) applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/diameterModels/velocityGroup/sizeGroup/shapeModels/fractal/sinteringModels/KochFriedlander/KochFriedlander.C: Cs_*pow(dp, n_)*pow(T[celli], m_)*exp(Ta_/T[celli]*(1 - dpMin_/dp)); applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/diameterModels/velocityGroup/sizeGroup/shapeModels/fractal/sinteringModels/KochFriedlander/KochFriedlander.H: dpMin | Minimum primary particle diameter | no | 0 applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/diameterModels/velocityGroup/sizeGroup/shapeModels/fractal/sinteringModels/KochFriedlander/KochFriedlander.H: scalar dpMin_; tutorials/multiphase/compressibleInterFoam/laminar/plateFilm/constant/thermophysicalProperties:pMin 10000; tutorials/multiphase/compressibleInterFoam/laminar/cylinder/constant/thermophysicalProperties:pMin 10000; tutorials/multiphase/compressibleInterFoam/laminar/sloshingTank2D/constant/thermophysicalProperties:pMin 1000; tutorials/multiphase/compressibleInterFoam/laminar/depthCharge2D/constant/thermophysicalProperties:pMin 10000; tutorials/multiphase/compressibleInterFoam/laminar/climbingRod/constant/thermophysicalProperties:pMin 10000; tutorials/multiphase/compressibleInterFoam/laminar/depthCharge3D/constant/thermophysicalProperties:pMin 10000; tutorials/multiphase/compressibleMultiphaseInterFoam/laminar/damBreak4phase/constant/thermophysicalProperties:pMin 10000; tutorials/multiphase/multiphaseEulerFoam/laminar/mixerVesselAMI2D/constant/phasePropertiesAll:pMin 10000; grep: platforms/linux64GccDPInt32Opt/bin/compressibleInterFoam: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/bin/compressibleMultiphaseInterFoam: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/bin/multiphaseEulerFoam: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/src/sampling/meshToMesh/calcMethod/meshToMeshMethod/meshToMeshMethod.o: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/src/finiteVolume/cfdTools/general/pressureReference/pressureReference.o: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/src/meshTools/tetOverlapVolume/tetOverlapVolume.o: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/src/lagrangian/parcel/clouds/derived/sprayCloud/sprayCloud.o: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/src/lagrangian/parcel/clouds/derived/reactingMultiphaseCloud/reactingMultiphaseCloud.o: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/src/lagrangian/parcel/clouds/derived/reactingCloud/reactingCloud.o: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/src/fvConstraints/limitPressure/limitPressure.o: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/applications/solvers/multiphase/compressibleInterFoam/compressibleInterFoam.o: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/applications/solvers/multiphase/compressibleMultiphaseInterFoam/compressibleMultiphaseInterFoam.o: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/applications/solvers/multiphase/multiphaseEulerFoam/multiphaseEulerFoam/multiphaseEulerFoam.o: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/diameterModels/velocityGroup/sizeGroup/shapeModels/fractal/sinteringModels/KochFriedlander/KochFriedlander.o: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/lib/libphaseSystem.so: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/lib/libsampling.so: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/lib/libfvConstraints.so: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/lib/libfiniteVolume.so: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/lib/liblagrangianParcel.so: 匹配到二进制文件 grep: platforms/linux64GccDPInt32Opt/lib/libmeshTools.so: 匹配到二进制文件 etc/templates/compressibleInflowOutflow/system/fvSolution: pMinFactor 0.1; etc/templates/singleFluidCHT/templates/system/fluid/fvSolution:// pMinFactor 0.1;
其中相关的文件应该只有
applications/solvers/multiphase/compressibleInterFoam/pEqn.H
src/finiteVolume/cfdTools/general/pressureReference/pressureReference.C
src/fvConstraints/limitPressure/limitPressure.C
而pressureReference这一文件的作用应该是识别pMin并将其指向fvConstraints的,我只更改了pEqn和limitPressure这两个文件,将其中pMin的语句注释掉。但是同样的算例文件,更改前能够计算,更改后迭代几个计算步后就会报负温度停止计算。
求助,第一次尝试更改求解器,担心是不是有其他相关的文件没有更改?我这个思路有没有问题?如果我想消除pMin的限制,应该怎么做,我希望的是能够在OpenFOAM实现与fluent相同的处理方式,而不是直接将最终结果也直接截断。
-
@李东岳 老师,我现在在尝试取消pMin对流场压力的限制,来达到允许流场出现绝对负压的计算结果。
想请教一下老师您,如果我想消除pMin的限制,下面两个方法是否可行?如果思路没问题的话,您觉得有没有可能是存在其他关联文件没有修改的缘故导致的报错?或者,您能花时间指点一下,如何修改求解器来取消pMin限制?目前我尝试了两种方法:
-
直接将compressibleInterFoam求解器文件夹中的压力文件中,将关于pMin的语句直接注释掉的方法(同时在createField中取消pMin的声明),但是重新编译后的求解器运行修改前能正常计算的算例会很快报错(大概三四个时间步)——这个方法不知道该如何再继续推进下去了
-
OpenFOAM-11中是通过fvConstrains-limitPressure来限制压力的,我对这个文件对压力的语句也进行了修改——将max(p,pMin),改为min(p,pMin),然后提供一个巨大的pMin值(1e12)。这样应该也能消除压力下限的限制,但算例的结果也会发现压力和温度计算有问题。
-