diff --git a/applications/solvers/multiphase/interFoam/LTSInterFoam/LTSInterFoam.C b/applications/solvers/multiphase/interFoam/LTSInterFoam/LTSInterFoam.C index e9aa9fb9b9efa54295d25c629fa901ca72bc9073..494acaf05fd83d7cc934cb0dd737d1d90af1b4af 100644 --- a/applications/solvers/multiphase/interFoam/LTSInterFoam/LTSInterFoam.C +++ b/applications/solvers/multiphase/interFoam/LTSInterFoam/LTSInterFoam.C @@ -77,8 +77,6 @@ int main(int argc, char *argv[]) #include "setrDeltaT.H" - tmp<surfaceScalarField> tphiAlpha; - // --- Pressure-velocity PIMPLE corrector loop while (pimple.loop()) { @@ -91,8 +89,6 @@ int main(int argc, char *argv[]) #define LTSSOLVE #include "alphaEqnSubCycle.H" #undef LTSSOLVE - - interface.correct(); } turbulence->correct(); diff --git a/applications/solvers/multiphase/interFoam/MRFInterFoam/MRFInterFoam.C b/applications/solvers/multiphase/interFoam/MRFInterFoam/MRFInterFoam.C index 56527781a25b4f3b5093f04ccd5c370438e48635..ccf89e5467dc309e2162679dd8d1445a7fa46329 100644 --- a/applications/solvers/multiphase/interFoam/MRFInterFoam/MRFInterFoam.C +++ b/applications/solvers/multiphase/interFoam/MRFInterFoam/MRFInterFoam.C @@ -81,8 +81,6 @@ int main(int argc, char *argv[]) Info<< "Time = " << runTime.timeName() << nl << endl; - tmp<surfaceScalarField> tphiAlpha; - // --- Pressure-velocity PIMPLE corrector loop while (pimple.loop()) { diff --git a/applications/solvers/multiphase/interFoam/alphaEqn.H b/applications/solvers/multiphase/interFoam/alphaEqn.H index f0e9dab4036dd0cde2e72f377e37290158bd008f..195ed09fc903d15ab4a23b357926364e44fceebe 100644 --- a/applications/solvers/multiphase/interFoam/alphaEqn.H +++ b/applications/solvers/multiphase/interFoam/alphaEqn.H @@ -2,11 +2,29 @@ word alphaScheme("div(phi,alpha)"); word alpharScheme("div(phirb,alpha)"); - surfaceScalarField phic(mag(phi/mesh.magSf())); - phic = min(interface.cAlpha()*phic, max(phic)); - surfaceScalarField phir(phic*interface.nHatf()); + //surfaceScalarField phic(mag(phi/mesh.magSf())); + //phic = min(interface.cAlpha()*phic, max(phic)); + surfaceScalarField phic + ( + (0.5*interface.cAlpha()) + *fvc::interpolate(volScalarField("tauc", fvc::surfaceSum(mag(phi)))) + /mesh.magSf() + ); + + // Do not compress interface at non-coupled boundary faces + // (inlets, outlets etc.) + forAll(phic.boundaryField(), patchi) + { + fvsPatchScalarField& phicp = phic.boundaryField()[patchi]; + + if (!phicp.coupled()) + { + phicp == 0; + } + } + + tmp<surfaceScalarField> tphiAlpha; - //***HGW if (pimple.firstIter() && MULESCorr) if (MULESCorr) { fvScalarMatrix alpha1Eqn @@ -32,12 +50,37 @@ << " Max(alpha1) = " << max(alpha1).value() << endl; - tphiAlpha = alpha1Eqn.flux(); + tmp<surfaceScalarField> tphiAlphaUD(alpha1Eqn.flux()); + tphiAlpha = tmp<surfaceScalarField> + ( + new surfaceScalarField(tphiAlphaUD()) + ); + + if (alphaApplyPrevCorr && tphiAlphaCorr0.valid()) + { + Info<< "Applying the previous iteration compression flux" << endl; + #ifdef LTSSOLVE + MULES::LTScorrect(alpha1, tphiAlpha(), tphiAlphaCorr0(), 1, 0); + #else + MULES::correct(alpha1, tphiAlpha(), tphiAlphaCorr0(), 1, 0); + #endif + + tphiAlpha() += tphiAlphaCorr0(); + } + + // Cache the upwind-flux + tphiAlphaCorr0 = tphiAlphaUD; + + alpha2 = 1.0 - alpha1; + + interface.correct(); } for (int aCorr=0; aCorr<nAlphaCorr; aCorr++) { - tmp<surfaceScalarField> tphiAlpha0 + surfaceScalarField phir(phic*interface.nHatf()); + + tmp<surfaceScalarField> tphiAlphaUn ( fvc::flux ( @@ -47,7 +90,7 @@ ) + fvc::flux ( - -fvc::flux(-phir, alpha2, alpharScheme), + -fvc::flux(-phir, alpha2, alpharScheme), alpha1, alpharScheme ) @@ -55,17 +98,29 @@ if (MULESCorr) { - tphiAlpha0() -= tphiAlpha(); + tmp<surfaceScalarField> tphiAlphaCorr(tphiAlphaUn() - tphiAlpha()); + volScalarField alpha10(alpha1); + #ifdef LTSSOLVE - MULES::LTScorrect(alpha1, tphiAlpha0(), 1, 0); + MULES::LTScorrect(alpha1, tphiAlphaUn(), tphiAlphaCorr(), 1, 0); #else - MULES::correct(alpha1, tphiAlpha0(), 1, 0); + MULES::correct(alpha1, tphiAlphaUn(), tphiAlphaCorr(), 1, 0); #endif - tphiAlpha() += tphiAlpha0(); + + // Under-relax the correction for more than 3 correctors + if (aCorr < 3) + { + tphiAlpha() += tphiAlphaCorr(); + } + else + { + alpha1 = 0.5*alpha1 + 0.5*alpha10; + tphiAlpha() += 0.5*tphiAlphaCorr(); + } } else { - tphiAlpha = tphiAlpha0; + tphiAlpha = tphiAlphaUn; #ifdef LTSSOLVE MULES::explicitLTSSolve(alpha1, phi, tphiAlpha(), 1, 0); @@ -75,10 +130,17 @@ } alpha2 = 1.0 - alpha1; + + interface.correct(); } rhoPhi = tphiAlpha()*(rho1 - rho2) + phi*rho2; + if (alphaApplyPrevCorr && MULESCorr) + { + tphiAlphaCorr0 = tphiAlpha() - tphiAlphaCorr0; + } + Info<< "Phase-1 volume fraction = " << alpha1.weightedAverage(mesh.Vsc()).value() << " Min(alpha1) = " << min(alpha1).value() diff --git a/applications/solvers/multiphase/interFoam/createFields.H b/applications/solvers/multiphase/interFoam/createFields.H index 3039171f77a74c38d46bb5770ed85d8357f3d597..00a7d12db6ea3167de00e508756cce472626ffe6 100644 --- a/applications/solvers/multiphase/interFoam/createFields.H +++ b/applications/solvers/multiphase/interFoam/createFields.H @@ -135,3 +135,6 @@ } fv::IOoptionList fvOptions(mesh); + + + tmp<surfaceScalarField> tphiAlphaCorr0; diff --git a/applications/solvers/multiphase/interFoam/interDyMFoam/interDyMFoam.C b/applications/solvers/multiphase/interFoam/interDyMFoam/interDyMFoam.C index d56e300581d9d9e4cbd46dc79270392f4d51f887..0a3d7ed11e97ed60f03d44a5b8e61705d303c4f5 100644 --- a/applications/solvers/multiphase/interFoam/interDyMFoam/interDyMFoam.C +++ b/applications/solvers/multiphase/interFoam/interDyMFoam/interDyMFoam.C @@ -77,8 +77,6 @@ int main(int argc, char *argv[]) Info<< "Time = " << runTime.timeName() << nl << endl; - tmp<surfaceScalarField> tphiAlpha; - // --- Pressure-velocity PIMPLE corrector loop while (pimple.loop()) { diff --git a/applications/solvers/multiphase/interFoam/interFoam.C b/applications/solvers/multiphase/interFoam/interFoam.C index 0ddfed50396eefbe37953f16d608fa60b69d83f1..f221ff9ad392adecef1637c88d4cf96a2acb75b4 100644 --- a/applications/solvers/multiphase/interFoam/interFoam.C +++ b/applications/solvers/multiphase/interFoam/interFoam.C @@ -80,8 +80,6 @@ int main(int argc, char *argv[]) Info<< "Time = " << runTime.timeName() << nl << endl; - tmp<surfaceScalarField> tphiAlpha; - // --- Pressure-velocity PIMPLE corrector loop while (pimple.loop()) { diff --git a/applications/solvers/multiphase/interFoam/interMixingFoam/interMixingFoam.C b/applications/solvers/multiphase/interFoam/interMixingFoam/interMixingFoam.C index 3321da57f9dffa699ab0a136187f94c34810f49f..fad22244619414c05db570ecc9ebc26b5d81c500 100644 --- a/applications/solvers/multiphase/interFoam/interMixingFoam/interMixingFoam.C +++ b/applications/solvers/multiphase/interFoam/interMixingFoam/interMixingFoam.C @@ -74,8 +74,6 @@ int main(int argc, char *argv[]) Info<< "Time = " << runTime.timeName() << nl << endl; - tmp<surfaceScalarField> tphiAlpha; - // --- Pressure-velocity PIMPLE corrector loop while (pimple.loop()) { diff --git a/applications/solvers/multiphase/interFoam/porousInterFoam/porousInterFoam.C b/applications/solvers/multiphase/interFoam/porousInterFoam/porousInterFoam.C index 15b4439220846d0079623443d49ef38b0530ac86..d81f5c93d383300994b3827f11559d6d55935a79 100644 --- a/applications/solvers/multiphase/interFoam/porousInterFoam/porousInterFoam.C +++ b/applications/solvers/multiphase/interFoam/porousInterFoam/porousInterFoam.C @@ -83,8 +83,6 @@ int main(int argc, char *argv[]) Info<< "Time = " << runTime.timeName() << nl << endl; - tmp<surfaceScalarField> tphiAlpha; - // --- Pressure-velocity PIMPLE corrector loop while (pimple.loop()) {