Skip to content
Snippets Groups Projects
pEqn.H 7.66 KiB
Newer Older
Henry's avatar
Henry committed
{
    // rho1 = rho10 + psi1*p;
    // rho2 = rho20 + psi2*p;

    // tmp<fvScalarMatrix> pEqnComp1;
    // tmp<fvScalarMatrix> pEqnComp2;

    // //if (transonic)
    // //{
    // //}
    // //else
    // {
    //     surfaceScalarField phid1("phid1", fvc::interpolate(psi1)*phi1);
    //     surfaceScalarField phid2("phid2", fvc::interpolate(psi2)*phi2);

    //     pEqnComp1 =
    //         fvc::ddt(rho1) + psi1*correction(fvm::ddt(p))
    //       + fvc::div(phid1, p)
    //       - fvc::Sp(fvc::div(phid1), p);

    //     pEqnComp2 =
    //         fvc::ddt(rho2) + psi2*correction(fvm::ddt(p))
    //       + fvc::div(phid2, p)
    //       - fvc::Sp(fvc::div(phid2), p);
    // }

    PtrList<surfaceScalarField> alphafs(fluid.phases().size());
Henry's avatar
Henry committed
    PtrList<volVectorField> HbyAs(fluid.phases().size());
    PtrList<surfaceScalarField> phiHbyAs(fluid.phases().size());
Henry's avatar
Henry committed
    PtrList<volScalarField> rAUs(fluid.phases().size());
    PtrList<surfaceScalarField> rAlphaAUfs(fluid.phases().size());

    phasei = 0;
    forAllIter(PtrDictionary<phaseModel>, fluid.phases(), iter)
    {
        phaseModel& phase = iter();

Henry's avatar
Henry committed
        mrfZones.absoluteFlux(phase.phi().oldTime());
        mrfZones.absoluteFlux(phase.phi());
Henry's avatar
Henry committed
        HbyAs.set(phasei, new volVectorField(phase.U()));
        phiHbyAs.set(phasei, new surfaceScalarField(1.0*phase.phi()));
Henry's avatar
Henry committed
        phasei++;
Henry's avatar
Henry committed
    surfaceScalarField phiHbyA
Henry's avatar
Henry committed
            "phiHbyA",
            runTime.timeName(),
            mesh,
            IOobject::NO_READ,
            IOobject::AUTO_WRITE
        ),
        mesh,
Henry's avatar
Henry committed
        dimensionedScalar("phiHbyA", dimArea*dimVelocity, 0)
Henry's avatar
Henry committed
    phasei = 0;
    forAllIter(PtrDictionary<phaseModel>, fluid.phases(), iter)
    {
        phaseModel& phase = iter();
        const volScalarField& alpha = phase;

        alphafs.set(phasei, fvc::interpolate(alpha).ptr());

        volScalarField dragCoeffi
        (
            IOobject
            (
                "dragCoeffi",
                runTime.timeName(),
                mesh
            ),
            fluid.dragCoeff(phase, dragCoeffs())/phase.rho(),
            zeroGradientFvPatchScalarField::typeName
        );
        dragCoeffi.correctBoundaryConditions();

        rAUs.set(phasei, (1.0/(UEqns[phasei].A() + dragCoeffi)).ptr());
        rAlphaAUfs.set
        (
            phasei,
            (
                alphafs[phasei]
               /fvc::interpolate(UEqns[phasei].A() + dragCoeffi)
            ).ptr()
        );
Henry's avatar
Henry committed
        HbyAs[phasei] = rAUs[phasei]*UEqns[phasei].H();
Henry's avatar
Henry committed
        phiHbyAs[phasei] =
Henry's avatar
Henry committed
        (
Henry's avatar
Henry committed
            (fvc::interpolate(HbyAs[phasei]) & mesh.Sf())
Henry's avatar
Henry committed
          + fvc::ddtPhiCorr(rAUs[phasei], alpha, phase.U(), phase.phi())
        );
        mrfZones.relativeFlux(phiHbyAs[phasei]);

        phiHbyAs[phasei] +=
            rAlphaAUfs[phasei]
           *(
               fluid.surfaceTension(phase)*mesh.magSf()/phase.rho()
             + (g & mesh.Sf())
Henry's avatar
Henry committed
        multiphaseSystem::dragModelTable::const_iterator dmIter =
            fluid.dragModels().begin();
        multiphaseSystem::dragCoeffFields::const_iterator dcIter =
            dragCoeffs().begin();
Henry's avatar
Henry committed
        for
        (
            ;
            dmIter != fluid.dragModels().end() && dcIter != dragCoeffs().end();
            ++dmIter, ++dcIter
        )
        {
            const phaseModel *phase2Ptr = NULL;

            if (&phase == &dmIter()->phase1())
            {
                phase2Ptr = &dmIter()->phase2();
            }
            else if (&phase == &dmIter()->phase2())
Henry's avatar
Henry committed
                phase2Ptr = &dmIter()->phase1();
Henry's avatar
Henry committed

            phiHbyAs[phasei] +=
                fvc::interpolate((*dcIter())/phase.rho())
               /fvc::interpolate(UEqns[phasei].A() + dragCoeffi)
               *phase2Ptr->phi();
Henry's avatar
Henry committed

            HbyAs[phasei] +=
                (1.0/phase.rho())*rAUs[phasei]*(*dcIter())
               *phase2Ptr->U();

Henry's avatar
Henry committed
            // Alternative flux-pressure consistent drag
            // but not momentum conservative
Henry's avatar
Henry committed
            // HbyAs[phasei] += fvc::reconstruct
            // (
            //     fvc::interpolate
            //     (
            //         (1.0/phase.rho())*rAUs[phasei]*(*dcIter())
            //     )*phase2Ptr->phi()
            // );
Henry's avatar
Henry committed
        phiHbyA += alphafs[phasei]*phiHbyAs[phasei];
Henry's avatar
Henry committed
        phasei++;
    }

    // Reset phi BCs
    phi.boundaryField() = 0;

    phasei = 0;
    forAllIter(PtrDictionary<phaseModel>, fluid.phases(), iter)
    {
        phaseModel& phase = iter();

        phase.phi().boundaryField() ==
            (mesh.Sf().boundaryField() & phase.U().boundaryField());

        mrfZones.relativeFlux(phase.phi().oldTime());
        mrfZones.relativeFlux(phase.phi());

        // Update phi BCs before pEqn
        phi.boundaryField() +=
            alphafs[phasei].boundaryField()*phase.phi().boundaryField();

Henry's avatar
Henry committed
    surfaceScalarField Dp
    (
        IOobject
        (
            "Dp",
            runTime.timeName(),
            mesh
        ),
        mesh,
        dimensionedScalar("Dp", dimensionSet(-1, 3, 1, 0, 0), 0)
    );

    phasei = 0;
    forAllIter(PtrDictionary<phaseModel>, fluid.phases(), iter)
    {
        phaseModel& phase = iter();
        Dp += mag(alphafs[phasei]*rAlphaAUfs[phasei])/phase.rho();
    while (pimple.correctNonOrthogonal())
Henry's avatar
Henry committed
    {
        fvScalarMatrix pEqnIncomp
        (
Henry's avatar
Henry committed
            fvc::div(phiHbyA)
Henry's avatar
Henry committed
          - fvm::laplacian(Dp, p)
        );

        pEqnIncomp.setReference(pRefCell, pRefValue);

Henry's avatar
Henry committed
        solve
        (
            // (
            //     (alpha1/rho1)*pEqnComp1()
            //   + (alpha2/rho2)*pEqnComp2()
            // ) +
            pEqnIncomp,
            mesh.solver(p.select(pimple.finalInnerIter()))
        if (pimple.finalNonOrthogonalIter())
            surfaceScalarField mSfGradp(pEqnIncomp.flux()/Dp);
Henry's avatar
Henry committed

            phasei = 0;
            phi = dimensionedScalar("phi", phi.dimensions(), 0);
            forAllIter(PtrDictionary<phaseModel>, fluid.phases(), iter)
            {
                phaseModel& phase = iter();

Henry's avatar
Henry committed
                phase.phi() =
                    phiHbyAs[phasei]
                  + rAlphaAUfs[phasei]*mSfGradp/phase.rho();
                phi +=
                    alphafs[phasei]*phiHbyAs[phasei]
                  + mag(alphafs[phasei]*rAlphaAUfs[phasei])
                   *mSfGradp/phase.rho();
Henry's avatar
Henry committed

                phasei++;
            }

            // dgdt =
Henry's avatar
Henry committed
            // (
            //     pos(alpha2)*(pEqnComp2 & p)/rho2
            //   - pos(alpha1)*(pEqnComp1 & p)/rho1
            // );

            p.relax();
            mSfGradp = pEqnIncomp.flux()/Dp;

            U = dimensionedVector("U", dimVelocity, vector::zero);
Henry's avatar
Henry committed

            phasei = 0;
            forAllIter(PtrDictionary<phaseModel>, fluid.phases(), iter)
            {
                phaseModel& phase = iter();
                const volScalarField& alpha = phase;

Henry's avatar
Henry committed
                phase.U() =
                    HbyAs[phasei]
                  + fvc::reconstruct
Henry's avatar
Henry committed
                    (
                        rAlphaAUfs[phasei]*(g & mesh.Sf())
                      + rAlphaAUfs[phasei]*mSfGradp/phase.rho()
                    );

                //phase.U() = fvc::reconstruct(phase.phi());
Henry's avatar
Henry committed
                phase.U().correctBoundaryConditions();

                U += alpha*phase.U();

                phasei++;
            }
        }
    }

    //p = max(p, pMin);

    #include "continuityErrs.H"

    // rho1 = rho10 + psi1*p;
    // rho2 = rho20 + psi2*p;

    // Dp1Dt = fvc::DDt(phi1, p);
    // Dp2Dt = fvc::DDt(phi2, p);
}