要考虑液体的表面张力,需要在porousSimpleFoam求解器中添加表面张力模型。具体步骤如下:

  1. 在porousSimpleFoam文件夹下创建一个名为surfaceTension的文件夹。

  2. 在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));
        }
    }
}
  1. 在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
  1. 在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;
  1. 在上述代码后面添加以下代码:
// 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(); 
  1. 在constant文件夹下的transportProperties文件中添加以下代码:
sigma   dimensionless   0.0728;

其中,sigma是液体的表面张力系数,可以根据实际情况进行修改。

  1. 在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;
    }
}
  1. 在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;
  1. 运行求解器即可考虑液体的表面张力效应
如果考虑液体的表面张力应该怎么改porousSimpleFoam求解器呢

原文地址: https://www.cveoy.top/t/topic/eaZn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录