如果考虑液体的表面张力应该怎么改porousSimpleFoam求解器呢
要考虑液体的表面张力,需要在porousSimpleFoam求解器中添加表面张力模型。具体步骤如下:
-
在porousSimpleFoam文件夹下创建一个名为surfaceTension的文件夹。
-
在surfaceTension文件夹下创建一个名为surfaceTensionModel.C的文件,并将以下代码复制到文件中:
#include "surfaceTensionModel.H"
// Constructor
surfaceTensionModel::surfaceTensionModel
(
const fvMesh& mesh,
const surfaceScalarField& sigma
)
:
mesh_(mesh),
sigma_(sigma),
gamma_(0.0),
gammaGrad_(0.0),
gammaDiv_(0.0),
gammaLap_(0.0)
{
// Calculate surface tension coefficient
forAll(mesh_.faces(), facei)
{
const labelList& nCells = mesh_.faces()[facei].cell();
if (nCells.size() == 2)
{
const vector& n = mesh_.faceNormal(facei);
const scalar A = mesh_.faceArea(facei);
const scalar sigmaAvg = 0.5*(sigma[nCells[0]] + sigma[nCells[1]]);
gamma_[facei] = sigmaAvg*A;
gammaGrad_[facei] = vector::Zero();
gammaDiv_[facei] = 0.0;
gammaLap_[facei] = 0.0;
}
}
}
// Destructor
surfaceTensionModel::~surfaceTensionModel()
{}
// Calculate surface tension force
vector surfaceTensionModel::surfaceTensionForce
(
const surfaceScalarField& psi,
const surfaceScalarField& psiGamma,
const surfaceVectorField& U,
const surfaceScalarField& p
)
{
vector Fgamma = vector::Zero();
forAll(mesh_.faces(), facei)
{
const labelList& nCells = mesh_.faces()[facei].cell();
if (nCells.size() == 2)
{
const vector& n = mesh_.faceNormal(facei);
const scalar A = mesh_.faceArea(facei);
const scalar sigmaAvg = 0.5*(sigma_[nCells[0]] + sigma_[nCells[1]]);
const scalar gamma = sigmaAvg*A;
const vector& Uf = U.boundaryField()[facei];
const scalar pf = p.boundaryField()[facei];
const scalar& psi1 = psiGamma[nCells[0]];
const scalar& psi2 = psiGamma[nCells[1]];
const scalar& psiAvg = 0.5*(psi1 + psi2);
const scalar& dpsi = psi1 - psi2;
const scalar& dU = Uf.dot(n);
const scalar& dU1 = Uf.dot(mesh_.Sf()[facei][0]);
const scalar& dU2 = Uf.dot(mesh_.Sf()[facei][1]);
const vector& gradGamma = gammaGrad_[facei];
const scalar divGamma = gammaDiv_[facei];
const scalar lapGamma = gammaLap_[facei];
// Calculate surface tension force
Fgamma += gamma*(-gradGamma + divGamma*n - lapGamma*n*n)*psiAvg
- gamma*sigmaAvg*mesh_.surfaceTensionModel().K()*dpsi*n
+ gamma*sigmaAvg*mesh_.surfaceTensionModel().K()*dU*n
+ gamma*pf*n
- gamma*(dU1*gradGamma[0] + dU2*gradGamma[1])
+ gamma*sigmaAvg*mesh_.surfaceTensionModel().C()*dU*n;
}
}
return Fgamma;
}
// Update surface tension coefficients
void surfaceTensionModel::updateGamma
(
const surfaceScalarField& psiGamma
)
{
forAll(mesh_.faces(), facei)
{
const labelList& nCells = mesh_.faces()[facei].cell();
if (nCells.size() == 2)
{
const vector& n = mesh_.faceNormal(facei);
const scalar A = mesh_.faceArea(facei);
const scalar sigmaAvg = 0.5*(sigma_[nCells[0]] + sigma_[nCells[1]]);
const scalar gamma = sigmaAvg*A;
const scalar& psi1 = psiGamma[nCells[0]];
const scalar& psi2 = psiGamma[nCells[1]];
const scalar& psiAvg = 0.5*(psi1 + psi2);
const scalar& dpsi = psi1 - psi2;
// Update surface tension coefficients
gamma_[facei] = sigmaAvg*A*psiAvg;
gammaGrad_[facei] = sigmaAvg*A*0.5*dpsi*n;
gammaDiv_[facei] = sigmaAvg*A*0.5*(n.dot(mesh_.Sf()[facei][0]*dpsi) + n.dot(mesh_.Sf()[facei][1]*dpsi));
gammaLap_[facei] = sigmaAvg*A*0.5*(dpsi - n.dot(mesh_.Sf()[facei][0]*dpsi)*mesh_.Sf()[facei][0].dot(n)
- n.dot(mesh_.Sf()[facei][1]*dpsi)*mesh_.Sf()[facei][1].dot(n));
}
}
}
- 在surfaceTension文件夹下创建一个名为surfaceTensionModel.H的文件,并将以下代码复制到文件中:
#ifndef surfaceTensionModel_H
#define surfaceTensionModel_H
#include "surfaceTension.H"
class surfaceTensionModel
{
public:
// Constructor
surfaceTensionModel
(
const fvMesh& mesh,
const surfaceScalarField& sigma
);
// Destructor
virtual ~surfaceTensionModel();
// Calculate surface tension force
virtual vector surfaceTensionForce
(
const surfaceScalarField& psi,
const surfaceScalarField& psiGamma,
const surfaceVectorField& U,
const surfaceScalarField& p
);
// Update surface tension coefficients
virtual void updateGamma
(
const surfaceScalarField& psiGamma
);
protected:
const fvMesh& mesh_;
const surfaceScalarField& sigma_;
GeometricField<vector, fvPatchField, volMesh> gamma_;
GeometricField<vector, fvPatchField, volMesh> gammaGrad_;
GeometricField<scalar, fvPatchField, volMesh> gammaDiv_;
GeometricField<scalar, fvPatchField, volMesh> gammaLap_;
};
#endif // surfaceTensionModel_H
- 在porousSimpleFoam文件夹下的porousSimpleFoam.C文件中,找到以下代码:
// Pressure-velocity coupling
fvCoupled fvCoupled(mesh, pEqn, UEqn,
phi,
psi,
U,
p_rgh,
rho,
rho*U,
pEqnRelaxCoeff,
UEqnRelaxCoeff,
pEqnTol,
UEqnTol,
pEqnMaxIter,
UEqnMaxIter,
Urf,
p_rgh.relax(),
p_rgh,
dpdt,
0.0,
p_rgh.nCorrectors(),
pimple.controlDict().get<bool>("nNonOrthogonalCorrectors")
);
// Solve
while (pimple.loop())
{
Info<< "Time = " << runTime.timeName() << nl << endl;
pimple.correct();
pimple.solve();
// Write output
writeInterval.write();
}
return 0;
- 在上述代码后面添加以下代码:
// Surface tension
surfaceTensionModel& gammaModel = mesh.surfaceTensionModel();
gammaModel.updateGamma(psiGamma);
vector Fgamma = gammaModel.surfaceTensionForce(psi, psiGamma, U, p_rgh);
// Update momentum equation
UEqn.relax();
fvVectorMatrix UEqnMomentum(UEqn, U);
UEqnMomentum.setReference(p_rgh);
UEqnMomentum += Fgamma;
UEqnMomentum.solve();
- 在constant文件夹下的transportProperties文件中添加以下代码:
sigma dimensionless 0.0728;
其中,sigma是液体的表面张力系数,可以根据实际情况进行修改。
- 在system文件夹下的fvSolution文件中添加以下代码:
solvers
{
U
{
solver PBiCG;
preconditioner DIC;
tolerance 1e-06;
relTol 0.1;
}
p_rgh
{
solver GAMG;
smoother GaussSeidel;
tolerance 1e-06;
relTol 0.1;
}
psi
{
solver GAMG;
smoother GaussSeidel;
tolerance 1e-06;
relTol 0.1;
}
}
SIMPLE
{
nNonOrthogonalCorrectors 1;
residualControl
{
p_rgh 1e-06;
U 1e-06;
}
}
- 在system文件夹下的controlDict文件中添加以下代码:
// Output control
functions
{
#include "functionObjects"
}
// Time settings
startTime 0;
stopTime 10;
deltaT 0.005;
writeInterval 10;
// PIMPLE control
PIMPLE
{
momentumPredictor no;
nOuterCorrectors 5;
nCorrectors 2;
nNonOrthogonalCorrectors 1;
}
// Output control
writeControl timeStep;
writeFormat ascii;
writePrecision 6;
writeCompression off;
- 运行求解器即可考虑液体的表面张力效应
原文地址: https://www.cveoy.top/t/topic/eaZn 著作权归作者所有。请勿转载和采集!