diff --git a/applications/solvers/combustion/reactingFoam/createFields.H b/applications/solvers/combustion/reactingFoam/createFields.H index 6fcf83624c..bc09358193 100644 --- a/applications/solvers/combustion/reactingFoam/createFields.H +++ b/applications/solvers/combustion/reactingFoam/createFields.H @@ -52,27 +52,7 @@ volScalarField& p = thermo.p(); #include "compressibleCreatePhi.H" -dimensionedScalar rhoMax -( - dimensionedScalar::lookupOrDefault - ( - "rhoMax", - pimple.dict(), - dimDensity, - GREAT - ) -); - -dimensionedScalar rhoMin -( - dimensionedScalar::lookupOrDefault - ( - "rhoMin", - pimple.dict(), - dimDensity, - 0 - ) -); +pressureControl pressureControl(p, rho, pimple.dict(), false); mesh.setFluxRequired(p.name()); diff --git a/applications/solvers/combustion/reactingFoam/pEqn.H b/applications/solvers/combustion/reactingFoam/pEqn.H index ac7107acf0..81ab6424b4 100644 --- a/applications/solvers/combustion/reactingFoam/pEqn.H +++ b/applications/solvers/combustion/reactingFoam/pEqn.H @@ -1,7 +1,4 @@ rho = thermo.rho(); -rho = max(rho, rhoMin); -rho = min(rho, rhoMax); -rho.relax(); volScalarField rAU(1.0/UEqn.A()); surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU)); @@ -87,19 +84,17 @@ else // Explicitly relax pressure for momentum corrector p.relax(); -// Recalculate density from the relaxed pressure -rho = thermo.rho(); -rho = max(rho, rhoMin); -rho = min(rho, rhoMax); -rho.relax(); -Info<< "rho max/min : " << max(rho).value() - << " " << min(rho).value() << endl; - U = HbyA - rAU*fvc::grad(p); U.correctBoundaryConditions(); fvOptions.correct(U); K = 0.5*magSqr(U); +if (pressureControl.limit(p)) +{ + p.correctBoundaryConditions(); + rho = thermo.rho(); +} + if (thermo.dpdt()) { dpdt = fvc::ddt(p); diff --git a/applications/solvers/combustion/reactingFoam/pcEqn.H b/applications/solvers/combustion/reactingFoam/pcEqn.H index 713f443fc5..a1564b0f20 100644 --- a/applications/solvers/combustion/reactingFoam/pcEqn.H +++ b/applications/solvers/combustion/reactingFoam/pcEqn.H @@ -1,7 +1,4 @@ rho = thermo.rho(); -rho = max(rho, rhoMin); -rho = min(rho, rhoMax); -rho.relax(); volScalarField rAU(1.0/UEqn.A()); volScalarField rAtU(1.0/(1.0/rAU - UEqn.H1())); @@ -109,19 +106,13 @@ U.correctBoundaryConditions(); fvOptions.correct(U); K = 0.5*magSqr(U); +if (pressureControl.limit(p)) +{ + p.correctBoundaryConditions(); + rho = thermo.rho(); +} + if (thermo.dpdt()) { dpdt = fvc::ddt(p); } - -// Recalculate density from the relaxed pressure -rho = thermo.rho(); -rho = max(rho, rhoMin); -rho = min(rho, rhoMax); - -if (!pimple.transonic()) -{ - rho.relax(); -} - -Info<< "rho max/min : " << max(rho).value() << " " << min(rho).value() << endl; diff --git a/applications/solvers/combustion/reactingFoam/reactingFoam.C b/applications/solvers/combustion/reactingFoam/reactingFoam.C index a06eef279c..d3e1b19ad3 100644 --- a/applications/solvers/combustion/reactingFoam/reactingFoam.C +++ b/applications/solvers/combustion/reactingFoam/reactingFoam.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -37,6 +37,7 @@ Description #include "psiCombustionModel.H" #include "multivariateScheme.H" #include "pimpleControl.H" +#include "pressureControl.H" #include "fvOptions.H" #include "localEulerDdtScheme.H" #include "fvcSmooth.H" @@ -114,6 +115,8 @@ int main(int argc, char *argv[]) } } + rho = thermo.rho(); + runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" diff --git a/applications/solvers/combustion/reactingFoam/rhoReactingBuoyantFoam/pEqn.H b/applications/solvers/combustion/reactingFoam/rhoReactingBuoyantFoam/pEqn.H index 926e69f7c1..04296ddfc2 100644 --- a/applications/solvers/combustion/reactingFoam/rhoReactingBuoyantFoam/pEqn.H +++ b/applications/solvers/combustion/reactingFoam/rhoReactingBuoyantFoam/pEqn.H @@ -1,76 +1,74 @@ +rho = thermo.rho(); + +// Thermodynamic density needs to be updated by psi*d(p) after the +// pressure solution +const volScalarField psip0(psi*p); + +volScalarField rAU(1.0/UEqn.A()); +surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU)); +volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p)); + +surfaceScalarField phig(-rhorAUf*ghf*fvc::snGrad(rho)*mesh.magSf()); + +surfaceScalarField phiHbyA +( + "phiHbyA", + ( + fvc::flux(rho*HbyA) + + rhorAUf*fvc::ddtCorr(rho, U, phi) + ) + + phig +); + +MRF.makeRelative(fvc::interpolate(rho), phiHbyA); + +// Update the pressure BCs to ensure flux consistency +constrainPressure(p_rgh, rho, U, phiHbyA, rhorAUf, MRF); + +fvScalarMatrix p_rghDDtEqn +( + fvc::ddt(rho) + psi*correction(fvm::ddt(p_rgh)) + + fvc::div(phiHbyA) + == + fvOptions(psi, p_rgh, rho.name()) +); + +while (pimple.correctNonOrthogonal()) { - rho = thermo.rho(); - - // Thermodynamic density needs to be updated by psi*d(p) after the - // pressure solution - done in 2 parts. Part 1: - thermo.rho() -= psi*p; - - volScalarField rAU(1.0/UEqn.A()); - surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU)); - volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p)); - - surfaceScalarField phig(-rhorAUf*ghf*fvc::snGrad(rho)*mesh.magSf()); - - surfaceScalarField phiHbyA + fvScalarMatrix p_rghEqn ( - "phiHbyA", - ( - fvc::flux(rho*HbyA) - + rhorAUf*fvc::ddtCorr(rho, U, phi) - ) - + phig + p_rghDDtEqn + - fvm::laplacian(rhorAUf, p_rgh) ); - MRF.makeRelative(fvc::interpolate(rho), phiHbyA); + p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter()))); - // Update the pressure BCs to ensure flux consistency - constrainPressure(p_rgh, rho, U, phiHbyA, rhorAUf, MRF); - - fvScalarMatrix p_rghDDtEqn - ( - fvc::ddt(rho) + psi*correction(fvm::ddt(p_rgh)) - + fvc::div(phiHbyA) - == - fvOptions(psi, p_rgh, rho.name()) - ); - - while (pimple.correctNonOrthogonal()) + if (pimple.finalNonOrthogonalIter()) { - fvScalarMatrix p_rghEqn - ( - p_rghDDtEqn - - fvm::laplacian(rhorAUf, p_rgh) - ); + // Calculate the conservative fluxes + phi = phiHbyA + p_rghEqn.flux(); - p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter()))); + // Explicitly relax pressure for momentum corrector + p_rgh.relax(); - if (pimple.finalNonOrthogonalIter()) - { - // Calculate the conservative fluxes - phi = phiHbyA + p_rghEqn.flux(); - - // Explicitly relax pressure for momentum corrector - p_rgh.relax(); - - // Correct the momentum source with the pressure gradient flux - // calculated from the relaxed pressure - U = HbyA + rAU*fvc::reconstruct((phig + p_rghEqn.flux())/rhorAUf); - U.correctBoundaryConditions(); - fvOptions.correct(U); - K = 0.5*magSqr(U); - } + // Correct the momentum source with the pressure gradient flux + // calculated from the relaxed pressure + U = HbyA + rAU*fvc::reconstruct((phig + p_rghEqn.flux())/rhorAUf); + U.correctBoundaryConditions(); + fvOptions.correct(U); + K = 0.5*magSqr(U); } - - p = p_rgh + rho*gh; - - // Second part of thermodynamic density update - thermo.rho() += psi*p; - - if (thermo.dpdt()) - { - dpdt = fvc::ddt(p); - } - - #include "rhoEqn.H" - #include "compressibleContinuityErrs.H" } + +p = p_rgh + rho*gh; + +// Thermodynamic density update +thermo.correctRho(psi*p - psip0); + +if (thermo.dpdt()) +{ + dpdt = fvc::ddt(p); +} + +#include "rhoEqn.H" +#include "compressibleContinuityErrs.H" diff --git a/applications/solvers/combustion/reactingFoam/rhoReactingFoam/createFields.H b/applications/solvers/combustion/reactingFoam/rhoReactingFoam/createFields.H index 687dffcc13..e56035f24a 100644 --- a/applications/solvers/combustion/reactingFoam/rhoReactingFoam/createFields.H +++ b/applications/solvers/combustion/reactingFoam/rhoReactingFoam/createFields.H @@ -52,6 +52,8 @@ volScalarField& p = thermo.p(); #include "compressibleCreatePhi.H" +pressureControl pressureControl(p, rho, pimple.dict(), false); + mesh.setFluxRequired(p.name()); diff --git a/applications/solvers/combustion/reactingFoam/rhoReactingFoam/pEqn.H b/applications/solvers/combustion/reactingFoam/rhoReactingFoam/pEqn.H deleted file mode 100644 index eff014cf43..0000000000 --- a/applications/solvers/combustion/reactingFoam/rhoReactingFoam/pEqn.H +++ /dev/null @@ -1,109 +0,0 @@ -{ - rho = thermo.rho(); - - // Thermodynamic density needs to be updated by psi*d(p) after the - // pressure solution - done in 2 parts. Part 1: - thermo.rho() -= psi*p; - - volScalarField rAU(1.0/UEqn.A()); - surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU)); - volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p)); - - if (pimple.transonic()) - { - surfaceScalarField phiHbyA - ( - "phiHbyA", - ( - fvc::flux(HbyA) - + rhorAUf*fvc::ddtCorr(rho, U, phi)/fvc::interpolate(rho) - ) - ); - - MRF.makeRelative(phiHbyA); - - surfaceScalarField phid("phid", fvc::interpolate(thermo.psi())*phiHbyA); - - phiHbyA *= fvc::interpolate(rho); - - fvScalarMatrix pDDtEqn - ( - fvc::ddt(rho) + fvc::div(phiHbyA) - + correction(psi*fvm::ddt(p) + fvm::div(phid, p)) - ); - - while (pimple.correctNonOrthogonal()) - { - fvScalarMatrix pEqn - ( - pDDtEqn - - fvm::laplacian(rhorAUf, p) - == - fvOptions(psi, p, rho.name()) - ); - - pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter()))); - - if (pimple.finalNonOrthogonalIter()) - { - phi = phiHbyA + pEqn.flux(); - } - } - } - else - { - surfaceScalarField phiHbyA - ( - "phiHbyA", - ( - fvc::flux(rho*HbyA) - + rhorAUf*fvc::ddtCorr(rho, U, phi) - ) - ); - - MRF.makeRelative(fvc::interpolate(rho), phiHbyA); - - // Update the pressure BCs to ensure flux consistency - constrainPressure(p, rho, U, phiHbyA, rhorAUf, MRF); - - fvScalarMatrix pDDtEqn - ( - fvc::ddt(rho) + psi*correction(fvm::ddt(p)) - + fvc::div(phiHbyA) - == - fvOptions(psi, p, rho.name()) - ); - - while (pimple.correctNonOrthogonal()) - { - fvScalarMatrix pEqn - ( - pDDtEqn - - fvm::laplacian(rhorAUf, p) - ); - - pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter()))); - - if (pimple.finalNonOrthogonalIter()) - { - phi = phiHbyA + pEqn.flux(); - } - } - } - - // Second part of thermodynamic density update - thermo.rho() += psi*p; - - #include "rhoEqn.H" - #include "compressibleContinuityErrs.H" - - U = HbyA - rAU*fvc::grad(p); - U.correctBoundaryConditions(); - fvOptions.correct(U); - K = 0.5*magSqr(U); - - if (thermo.dpdt()) - { - dpdt = fvc::ddt(p); - } -} diff --git a/applications/solvers/combustion/reactingFoam/rhoReactingFoam/rhoReactingFoam.C b/applications/solvers/combustion/reactingFoam/rhoReactingFoam/rhoReactingFoam.C index 55de274d83..5be897c6c7 100644 --- a/applications/solvers/combustion/reactingFoam/rhoReactingFoam/rhoReactingFoam.C +++ b/applications/solvers/combustion/reactingFoam/rhoReactingFoam/rhoReactingFoam.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -38,6 +38,7 @@ Description #include "turbulentFluidThermoModel.H" #include "multivariateScheme.H" #include "pimpleControl.H" +#include "pressureControl.H" #include "fvOptions.H" #include "localEulerDdtScheme.H" #include "fvcSmooth.H" @@ -100,7 +101,14 @@ int main(int argc, char *argv[]) // --- Pressure corrector loop while (pimple.correct()) { - #include "pEqn.H" + if (pimple.consistent()) + { + #include "../../../compressible/rhoPimpleFoam/pcEqn.H" + } + else + { + #include "../../../compressible/rhoPimpleFoam/pEqn.H" + } } if (pimple.turbCorr()) diff --git a/applications/solvers/compressible/rhoPimpleFoam/createFields.H b/applications/solvers/compressible/rhoPimpleFoam/createFields.H index 84f70f2cd0..8079428225 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/createFields.H +++ b/applications/solvers/compressible/rhoPimpleFoam/createFields.H @@ -42,6 +42,8 @@ volVectorField U pressureControl pressureControl(p, rho, pimple.dict(), false); +mesh.setFluxRequired(p.name()); + Info<< "Creating turbulence model\n" << endl; autoPtr turbulence ( @@ -54,8 +56,6 @@ autoPtr turbulence ) ); -mesh.setFluxRequired(p.name()); - Info<< "Creating field dpdt\n" << endl; volScalarField dpdt ( @@ -73,3 +73,26 @@ Info<< "Creating field kinetic energy K\n" << endl; volScalarField K("K", 0.5*magSqr(U)); #include "createMRF.H" + + +dimensionedScalar rhoMax +( + dimensionedScalar::lookupOrDefault + ( + "rhoMax", + pimple.dict(), + dimDensity, + GREAT + ) +); + +dimensionedScalar rhoMin +( + dimensionedScalar::lookupOrDefault + ( + "rhoMin", + pimple.dict(), + dimDensity, + 0 + ) +); diff --git a/applications/solvers/compressible/rhoPimpleFoam/pEqn.H b/applications/solvers/compressible/rhoPimpleFoam/pEqn.H index 5aab536239..ab89fcd811 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/pEqn.H +++ b/applications/solvers/compressible/rhoPimpleFoam/pEqn.H @@ -1,3 +1,12 @@ +if (!pimple.SIMPLErho()) +{ + rho = thermo.rho(); +} + +// Thermodynamic density needs to be updated by psi*d(p) after the +// pressure solution +const volScalarField psip0(psi*p); + volScalarField rAU(1.0/UEqn.A()); surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU)); volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p)); @@ -10,7 +19,7 @@ if (pimple.nCorrPISO() <= 1) surfaceScalarField phiHbyA ( "phiHbyA", - fvc::flux(rho*HbyA) + fvc::interpolate(rho)*fvc::flux(HbyA) + rhorAUf*fvc::ddtCorr(rho, U, phi) ); @@ -26,19 +35,20 @@ if (pimple.transonic()) "phid", (fvc::interpolate(psi)/fvc::interpolate(rho))*phiHbyA ); - phiHbyA -= fvc::interpolate(p)*phid; + + phiHbyA -= fvc::interpolate(psi*p)*phiHbyA/fvc::interpolate(rho); + + fvScalarMatrix pDDtEqn + ( + fvc::ddt(rho) + psi*correction(fvm::ddt(p)) + + fvc::div(phiHbyA) + fvm::div(phid, p) + == + fvOptions(psi, p, rho.name()) + ); while (pimple.correctNonOrthogonal()) { - fvScalarMatrix pEqn - ( - fvm::ddt(psi, p) - + fvc::div(phiHbyA) - + fvm::div(phid, p) - - fvm::laplacian(rhorAUf, p) - == - fvOptions(psi, p, rho.name()) - ); + fvScalarMatrix pEqn(pDDtEqn - fvm::laplacian(rhorAUf, p)); // Relax the pressure equation to ensure diagonal-dominance pEqn.relax(); @@ -53,16 +63,17 @@ if (pimple.transonic()) } else { + fvScalarMatrix pDDtEqn + ( + fvc::ddt(rho) + psi*correction(fvm::ddt(p)) + + fvc::div(phiHbyA) + == + fvOptions(psi, p, rho.name()) + ); + while (pimple.correctNonOrthogonal()) { - fvScalarMatrix pEqn - ( - fvm::ddt(psi, p) - + fvc::div(phiHbyA) - - fvm::laplacian(rhorAUf, p) - == - fvOptions(psi, p, rho.name()) - ); + fvScalarMatrix pEqn(pDDtEqn - fvm::laplacian(rhorAUf, p)); pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter()))); @@ -84,13 +95,20 @@ U.correctBoundaryConditions(); fvOptions.correct(U); K = 0.5*magSqr(U); -pressureControl.limit(p); -p.correctBoundaryConditions(); -rho = thermo.rho(); - -if (!pimple.transonic()) +if (pressureControl.limit(p)) { - rho.relax(); + p.correctBoundaryConditions(); + thermo.correctRho(psi*p - psip0, rhoMin, rhoMax); + rho = thermo.rho(); +} +else if (pimple.SIMPLErho()) +{ + thermo.correctRho(psi*p - psip0, rhoMin, rhoMax); + rho = thermo.rho(); +} +else +{ + thermo.correctRho(psi*p - psip0, rhoMin, rhoMax) ; } if (thermo.dpdt()) diff --git a/applications/solvers/compressible/rhoPimpleFoam/pcEqn.H b/applications/solvers/compressible/rhoPimpleFoam/pcEqn.H index afbc2851e4..55be311749 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/pcEqn.H +++ b/applications/solvers/compressible/rhoPimpleFoam/pcEqn.H @@ -1,3 +1,12 @@ +if (!pimple.SIMPLErho()) +{ + rho = thermo.rho(); +} + +// Thermodynamic density needs to be updated by psi*d(p) after the +// pressure solution +const volScalarField psip0(psi*p); + volScalarField rAU(1.0/UEqn.A()); volScalarField rAtU(1.0/(1.0/rAU - UEqn.H1())); volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p)); @@ -11,7 +20,7 @@ surfaceScalarField phiHbyA ( "phiHbyA", ( - fvc::flux(rho*HbyA) + fvc::interpolate(rho)*fvc::flux(HbyA) + fvc::interpolate(rho*rAU)*fvc::ddtCorr(rho, U, phi) ) ); @@ -33,21 +42,21 @@ if (pimple.transonic()) phiHbyA += fvc::interpolate(rho*(rAtU - rAU))*fvc::snGrad(p)*mesh.magSf() - - fvc::interpolate(p)*phid; + - fvc::interpolate(psi*p)*phiHbyA/fvc::interpolate(rho); HbyA -= (rAU - rAtU)*fvc::grad(p); + fvScalarMatrix pDDtEqn + ( + fvc::ddt(rho) + psi*correction(fvm::ddt(p)) + + fvc::div(phiHbyA) + fvm::div(phid, p) + == + fvOptions(psi, p, rho.name()) + ); + while (pimple.correctNonOrthogonal()) { - fvScalarMatrix pEqn - ( - fvm::ddt(psi, p) - + fvc::div(phiHbyA) - + fvm::div(phid, p) - - fvm::laplacian(rhorAtU, p) - == - fvOptions(psi, p, rho.name()) - ); + fvScalarMatrix pEqn(pDDtEqn - fvm::laplacian(rhorAtU, p)); // Relax the pressure equation to ensure diagonal-dominance pEqn.relax(); @@ -65,16 +74,17 @@ else phiHbyA += fvc::interpolate(rho*(rAtU - rAU))*fvc::snGrad(p)*mesh.magSf(); HbyA -= (rAU - rAtU)*fvc::grad(p); + fvScalarMatrix pDDtEqn + ( + fvc::ddt(rho) + psi*correction(fvm::ddt(p)) + + fvc::div(phiHbyA) + == + fvOptions(psi, p, rho.name()) + ); + while (pimple.correctNonOrthogonal()) { - fvScalarMatrix pEqn - ( - fvm::ddt(psi, p) - + fvc::div(phiHbyA) - - fvm::laplacian(rhorAtU, p) - == - fvOptions(psi, p, rho.name()) - ); + fvScalarMatrix pEqn(pDDtEqn - fvm::laplacian(rhorAtU, p)); pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter()))); @@ -96,13 +106,20 @@ U.correctBoundaryConditions(); fvOptions.correct(U); K = 0.5*magSqr(U); -pressureControl.limit(p); -p.correctBoundaryConditions(); -rho = thermo.rho(); - -if (!pimple.transonic()) +if (pressureControl.limit(p)) { - rho.relax(); + p.correctBoundaryConditions(); + thermo.correctRho(psi*p - psip0, rhoMin, rhoMax); + rho = thermo.rho(); +} +else if (pimple.SIMPLErho()) +{ + thermo.correctRho(psi*p - psip0, rhoMin, rhoMax); + rho = thermo.rho(); +} +else +{ + thermo.correctRho(psi*p - psip0, rhoMin, rhoMax); } if (thermo.dpdt()) diff --git a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleDyMFoam/pEqn.H b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleDyMFoam/pEqn.H index 0f85562618..ed802ba6d2 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleDyMFoam/pEqn.H +++ b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleDyMFoam/pEqn.H @@ -1,3 +1,5 @@ +rho = thermo.rho(); + volScalarField rAU(1.0/UEqn.A()); surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU)); volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p)); @@ -27,13 +29,14 @@ if (pimple.transonic()) "phid", (fvc::interpolate(psi)/fvc::interpolate(rho))*phiHbyA ); - phiHbyA -= fvc::interpolate(p)*phid; + + phiHbyA -= fvc::interpolate(psi*p)*phiHbyA/fvc::interpolate(rho); while (pimple.correctNonOrthogonal()) { fvScalarMatrix pEqn ( - fvm::ddt(psi, p) + fvc::ddt(rho) + psi*correction(fvm::ddt(p)) + fvc::div(phiHbyA) + fvm::div(phid, p) - fvm::laplacian(rhorAUf, p) @@ -59,7 +62,7 @@ else // Pressure corrector fvScalarMatrix pEqn ( - fvm::ddt(psi, p) + fvc::ddt(rho) + psi*correction(fvm::ddt(p)) + fvc::div(phiHbyA) - fvm::laplacian(rhorAUf, p) == @@ -86,13 +89,10 @@ U.correctBoundaryConditions(); fvOptions.correct(U); K = 0.5*magSqr(U); -pressureControl.limit(p); -p.correctBoundaryConditions(); -rho = thermo.rho(); - -if (!pimple.transonic()) +if (pressureControl.limit(p)) { - rho.relax(); + p.correctBoundaryConditions(); + rho = thermo.rho(); } { diff --git a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C index 0fbe7717e3..5d5ed3f5f4 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C +++ b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C @@ -122,6 +122,8 @@ int main(int argc, char *argv[]) } } + rho = thermo.rho(); + runTime.write(); Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" diff --git a/applications/solvers/compressible/rhoSimpleFoam/pEqn.H b/applications/solvers/compressible/rhoSimpleFoam/pEqn.H index c7edbb9e87..0f290ed273 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/pEqn.H +++ b/applications/solvers/compressible/rhoSimpleFoam/pEqn.H @@ -1,109 +1,110 @@ +volScalarField rAU(1.0/UEqn.A()); +surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU)); +volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p)); +tUEqn.clear(); + +bool closedVolume = false; + +surfaceScalarField phiHbyA("phiHbyA", fvc::interpolate(rho)*fvc::flux(HbyA)); +MRF.makeRelative(fvc::interpolate(rho), phiHbyA); + +// Update the pressure BCs to ensure flux consistency +constrainPressure(p, rho, U, phiHbyA, rhorAUf, MRF); + +if (simple.transonic()) { - volScalarField rAU(1.0/UEqn.A()); - surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU)); - volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p)); - tUEqn.clear(); + surfaceScalarField phid + ( + "phid", + (fvc::interpolate(psi)/fvc::interpolate(rho))*phiHbyA + ); - bool closedVolume = false; + phiHbyA -= fvc::interpolate(psi*p)*phiHbyA/fvc::interpolate(rho); - surfaceScalarField phiHbyA("phiHbyA", fvc::flux(rho*HbyA)); - MRF.makeRelative(fvc::interpolate(rho), phiHbyA); - - // Update the pressure BCs to ensure flux consistency - constrainPressure(p, rho, U, phiHbyA, rhorAUf, MRF); - - if (simple.transonic()) + while (simple.correctNonOrthogonal()) { - surfaceScalarField phid + fvScalarMatrix pEqn ( - "phid", - (fvc::interpolate(psi)/fvc::interpolate(rho))*phiHbyA + fvc::div(phiHbyA) + + fvm::div(phid, p) + - fvm::laplacian(rhorAUf, p) + == + fvOptions(psi, p, rho.name()) ); - phiHbyA -= fvc::interpolate(p)*phid; - while (simple.correctNonOrthogonal()) + // Relax the pressure equation to ensure diagonal-dominance + pEqn.relax(); + + pEqn.setReference + ( + pressureControl.refCell(), + pressureControl.refValue() + ); + + pEqn.solve(); + + if (simple.finalNonOrthogonalIter()) { - fvScalarMatrix pEqn - ( - fvc::div(phiHbyA) - + fvm::div(phid, p) - - fvm::laplacian(rhorAUf, p) - == - fvOptions(psi, p, rho.name()) - ); - - // Relax the pressure equation to ensure diagonal-dominance - pEqn.relax(); - - pEqn.setReference - ( - pressureControl.refCell(), - pressureControl.refValue() - ); - - pEqn.solve(); - - if (simple.finalNonOrthogonalIter()) - { - phi = phiHbyA + pEqn.flux(); - } + phi = phiHbyA + pEqn.flux(); } } - else - { - closedVolume = adjustPhi(phiHbyA, U, p); - - while (simple.correctNonOrthogonal()) - { - fvScalarMatrix pEqn - ( - fvc::div(phiHbyA) - - fvm::laplacian(rhorAUf, p) - == - fvOptions(psi, p, rho.name()) - ); - - pEqn.setReference - ( - pressureControl.refCell(), - pressureControl.refValue() - ); - - pEqn.solve(); - - if (simple.finalNonOrthogonalIter()) - { - phi = phiHbyA + pEqn.flux(); - } - } - } - - - #include "incompressible/continuityErrs.H" - - // Explicitly relax pressure for momentum corrector - p.relax(); - - U = HbyA - rAU*fvc::grad(p); - U.correctBoundaryConditions(); - fvOptions.correct(U); - - pressureControl.limit(p); - - // For closed-volume cases adjust the pressure and density levels - // to obey overall mass continuity - if (closedVolume) - { - p += (initialMass - fvc::domainIntegrate(psi*p)) - /fvc::domainIntegrate(psi); - } - - p.correctBoundaryConditions(); - - rho = thermo.rho(); - - if (!simple.transonic()) - { - rho.relax(); - } +} +else +{ + closedVolume = adjustPhi(phiHbyA, U, p); + + while (simple.correctNonOrthogonal()) + { + fvScalarMatrix pEqn + ( + fvc::div(phiHbyA) + - fvm::laplacian(rhorAUf, p) + == + fvOptions(psi, p, rho.name()) + ); + + pEqn.setReference + ( + pressureControl.refCell(), + pressureControl.refValue() + ); + + pEqn.solve(); + + if (simple.finalNonOrthogonalIter()) + { + phi = phiHbyA + pEqn.flux(); + } + } +} + +#include "incompressible/continuityErrs.H" + +// Explicitly relax pressure for momentum corrector +p.relax(); + +U = HbyA - rAU*fvc::grad(p); +U.correctBoundaryConditions(); +fvOptions.correct(U); + +bool pLimited = pressureControl.limit(p); + +// For closed-volume cases adjust the pressure and density levels +// to obey overall mass continuity +if (closedVolume) +{ + p += (initialMass - fvc::domainIntegrate(psi*p)) + /fvc::domainIntegrate(psi); +} + +if (pLimited || closedVolume) +{ + p.correctBoundaryConditions(); +} + +rho = thermo.rho(); + +if (!simple.transonic()) +{ + rho.relax(); } diff --git a/applications/solvers/compressible/rhoSimpleFoam/pcEqn.H b/applications/solvers/compressible/rhoSimpleFoam/pcEqn.H index c7dc0f864d..51560aab5f 100644 --- a/applications/solvers/compressible/rhoSimpleFoam/pcEqn.H +++ b/applications/solvers/compressible/rhoSimpleFoam/pcEqn.H @@ -1,3 +1,5 @@ +rho = thermo.rho(); + volScalarField rAU(1.0/UEqn.A()); volScalarField rAtU(1.0/(1.0/rAU - UEqn.H1())); volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p)); @@ -5,7 +7,7 @@ tUEqn.clear(); bool closedVolume = false; -surfaceScalarField phiHbyA("phiHbyA", fvc::flux(rho*HbyA)); +surfaceScalarField phiHbyA("phiHbyA", fvc::interpolate(rho)*fvc::flux(HbyA)); MRF.makeRelative(fvc::interpolate(rho), phiHbyA); volScalarField rhorAtU("rhorAtU", rho*rAtU); @@ -23,7 +25,7 @@ if (simple.transonic()) phiHbyA += fvc::interpolate(rho*(rAtU - rAU))*fvc::snGrad(p)*mesh.magSf() - - fvc::interpolate(p)*phid; + - fvc::interpolate(psi*p)*phiHbyA/fvc::interpolate(rho); HbyA -= (rAU - rAtU)*fvc::grad(p); @@ -98,7 +100,7 @@ U = HbyA - rAtU*fvc::grad(p); U.correctBoundaryConditions(); fvOptions.correct(U); -pressureControl.limit(p); +bool pLimited = pressureControl.limit(p); // For closed-volume cases adjust the pressure and density levels // to obey overall mass continuity @@ -108,9 +110,11 @@ if (closedVolume) /fvc::domainIntegrate(psi); } -p.correctBoundaryConditions(); +if (pLimited || closedVolume) +{ + p.correctBoundaryConditions(); +} -// Recalculate density from the relaxed pressure rho = thermo.rho(); if (!simple.transonic()) diff --git a/applications/solvers/heatTransfer/buoyantPimpleFoam/pEqn.H b/applications/solvers/heatTransfer/buoyantPimpleFoam/pEqn.H index 15c87f9c85..677fabffd5 100644 --- a/applications/solvers/heatTransfer/buoyantPimpleFoam/pEqn.H +++ b/applications/solvers/heatTransfer/buoyantPimpleFoam/pEqn.H @@ -1,115 +1,108 @@ + +dimensionedScalar compressibility = fvc::domainIntegrate(psi); +bool compressible = (compressibility.value() > SMALL); + +rho = thermo.rho(); + +// Thermodynamic density needs to be updated by psi*d(p) after the +// pressure solution +const volScalarField psip0(psi*p); + +volScalarField rAU(1.0/UEqn.A()); +surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU)); +volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p_rgh)); + +surfaceScalarField phig(-rhorAUf*ghf*fvc::snGrad(rho)*mesh.magSf()); + +surfaceScalarField phiHbyA +( + "phiHbyA", + ( + fvc::flux(rho*HbyA) + + rhorAUf*fvc::ddtCorr(rho, U, phi) + ) + + phig +); + +MRF.makeRelative(fvc::interpolate(rho), phiHbyA); + +// Update the pressure BCs to ensure flux consistency +constrainPressure(p_rgh, rho, U, phiHbyA, rhorAUf, MRF); + +fvScalarMatrix p_rghDDtEqn +( + fvc::ddt(rho) + psi*correction(fvm::ddt(p_rgh)) + + fvc::div(phiHbyA) + == + fvOptions(psi, p_rgh, rho.name()) +); + +while (pimple.correctNonOrthogonal()) { - bool closedVolume = p_rgh.needReference(); - - dimensionedScalar compressibility = fvc::domainIntegrate(psi); - bool compressible = (compressibility.value() > SMALL); - - rho = thermo.rho(); - - // Thermodynamic density needs to be updated by psi*d(p) after the - // pressure solution - done in 2 parts. Part 1: - thermo.rho() -= psi*p_rgh; - - volScalarField rAU(1.0/UEqn.A()); - surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU)); - volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p_rgh)); - - surfaceScalarField phig(-rhorAUf*ghf*fvc::snGrad(rho)*mesh.magSf()); - - surfaceScalarField phiHbyA + fvScalarMatrix p_rghEqn ( - "phiHbyA", - ( - fvc::flux(rho*HbyA) - + rhorAUf*fvc::ddtCorr(rho, U, phi) - ) - + phig + p_rghDDtEqn + - fvm::laplacian(rhorAUf, p_rgh) ); - MRF.makeRelative(fvc::interpolate(rho), phiHbyA); - - // Update the pressure BCs to ensure flux consistency - constrainPressure(p_rgh, rho, U, phiHbyA, rhorAUf, MRF); - - tmp p_rghDDtEqn + p_rghEqn.setReference ( - new fvScalarMatrix(p_rgh, dimMass/dimTime) + pRefCell, + compressible ? getRefCellValue(p_rgh, pRefCell) : pRefValue ); - if (compressible) + p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter()))); + + if (pimple.finalNonOrthogonalIter()) { - p_rghDDtEqn = + // Calculate the conservative fluxes + phi = phiHbyA + p_rghEqn.flux(); + + // Explicitly relax pressure for momentum corrector + p_rgh.relax(); + + // Correct the momentum source with the pressure gradient flux + // calculated from the relaxed pressure + U = HbyA + rAU*fvc::reconstruct((phig + p_rghEqn.flux())/rhorAUf); + U.correctBoundaryConditions(); + fvOptions.correct(U); + K = 0.5*magSqr(U); + } +} + +p = p_rgh + rho*gh; + +#include "rhoEqn.H" +#include "compressibleContinuityErrs.H" + +if (p_rgh.needReference()) +{ + if (!compressible) + { + p += dimensionedScalar ( - fvc::ddt(rho) + psi*correction(fvm::ddt(p_rgh)) + "p", + p.dimensions(), + pRefValue - getRefCellValue(p, pRefCell) ); } - - while (pimple.correctNonOrthogonal()) + else { - fvScalarMatrix p_rghEqn - ( - p_rghDDtEqn() - + fvc::div(phiHbyA) - - fvm::laplacian(rhorAUf, p_rgh) - == - fvOptions(psi, p_rgh, rho.name()) - ); - - p_rghEqn.solve(mesh.solver(p_rgh.select(pimple.finalInnerIter()))); - - if (pimple.finalNonOrthogonalIter()) - { - // Calculate the conservative fluxes - phi = phiHbyA + p_rghEqn.flux(); - - // Explicitly relax pressure for momentum corrector - p_rgh.relax(); - - // Correct the momentum source with the pressure gradient flux - // calculated from the relaxed pressure - U = HbyA + rAU*fvc::reconstruct((phig + p_rghEqn.flux())/rhorAUf); - U.correctBoundaryConditions(); - fvOptions.correct(U); - K = 0.5*magSqr(U); - } - } - - p = p_rgh + rho*gh; - - // Second part of thermodynamic density update - thermo.rho() += psi*p_rgh; - - if (thermo.dpdt()) - { - dpdt = fvc::ddt(p); - } - - if (compressible) - { - #include "rhoEqn.H" - } - #include "compressibleContinuityErrs.H" - - if (closedVolume) - { - if (!compressible) - { - p += dimensionedScalar - ( - "p", - p.dimensions(), - pRefValue - getRefCellValue(p, pRefCell) - ); - } - else - { - p += (initialMass - fvc::domainIntegrate(thermo.rho())) - /compressibility; - rho = thermo.rho(); - } + p += (initialMass - fvc::domainIntegrate(psi*p)) + /compressibility; + thermo.correctRho(psi*p - psip0); + rho = thermo.rho(); p_rgh = p - rho*gh; } - - Info<< "rho max/min : " << max(rho).value() << " " << min(rho).value() - << endl; +} +else +{ + thermo.correctRho(psi*p - psip0); +} + +rho = thermo.rho(); + +if (thermo.dpdt()) +{ + dpdt = fvc::ddt(p); } diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/createFields.H b/applications/solvers/heatTransfer/buoyantSimpleFoam/createFields.H index b9f275407f..64bc8558c8 100644 --- a/applications/solvers/heatTransfer/buoyantSimpleFoam/createFields.H +++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/createFields.H @@ -88,3 +88,26 @@ dimensionedScalar totalVolume = sum(mesh.V()); #include "createMRF.H" #include "createRadiationModel.H" + +dimensionedScalar rhoMax +( + dimensionedScalar::lookupOrDefault + ( + "rhoMax", + simple.dict(), + dimDensity, + GREAT + ) +); + +dimensionedScalar rhoMin +( + dimensionedScalar::lookupOrDefault + ( + "rhoMin", + simple.dict(), + dimDensity, + 0 + ) +); + diff --git a/applications/solvers/heatTransfer/buoyantSimpleFoam/pEqn.H b/applications/solvers/heatTransfer/buoyantSimpleFoam/pEqn.H index 647cf954bb..13ffff11b6 100644 --- a/applications/solvers/heatTransfer/buoyantSimpleFoam/pEqn.H +++ b/applications/solvers/heatTransfer/buoyantSimpleFoam/pEqn.H @@ -1,7 +1,4 @@ { - rho = thermo.rho(); - rho.relax(); - volScalarField rAU("rAU", 1.0/UEqn.A()); surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU)); volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p_rgh)); @@ -24,6 +21,8 @@ // Update the pressure BCs to ensure flux consistency constrainPressure(p_rgh, rho, U, phiHbyA, rhorAUf, MRF); + dimensionedScalar compressibility = fvc::domainIntegrate(psi); + bool compressible = (compressibility.value() > SMALL); while (simple.correctNonOrthogonal()) { @@ -32,7 +31,12 @@ fvm::laplacian(rhorAUf, p_rgh) == fvc::div(phiHbyA) ); - p_rghEqn.setReference(pRefCell, getRefCellValue(p_rgh, pRefCell)); + p_rghEqn.setReference + ( + pRefCell, + compressible ? getRefCellValue(p_rgh, pRefCell) : pRefValue + ); + p_rghEqn.solve(); if (simple.finalNonOrthogonalIter()) @@ -51,12 +55,9 @@ } } - #include "continuityErrs.H" - p = p_rgh + rho*gh; - dimensionedScalar compressibility = fvc::domainIntegrate(psi); - bool compressible = (compressibility.value() > SMALL); + #include "continuityErrs.H" // For closed-volume cases adjust the pressure level // to obey overall mass continuity @@ -75,8 +76,8 @@ { p += (initialMass - fvc::domainIntegrate(psi*p)) /fvc::domainIntegrate(psi); + p_rgh = p - rho*gh; } - p_rgh = p - rho*gh; } rho = thermo.rho(); diff --git a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/pEqn.H b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/pEqn.H index 7fe544d6a5..410fc7166d 100644 --- a/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/pEqn.H +++ b/applications/solvers/heatTransfer/chtMultiRegionFoam/chtMultiRegionSimpleFoam/fluid/pEqn.H @@ -1,8 +1,10 @@ { + /* rho = thermo.rho(); rho = max(rho, rhoMin[i]); rho = min(rho, rhoMax[i]); rho.relax(); + */ volScalarField rAU("rAU", 1.0/UEqn.A()); surfaceScalarField rhorAUf("rhorAUf", fvc::interpolate(rho*rAU)); @@ -67,11 +69,23 @@ // For closed-volume cases adjust the pressure level // to obey overall mass continuity - if (closedVolume && compressible) + if (closedVolume) { - p += (initialMass - fvc::domainIntegrate(thermo.rho())) - /compressibility; - p_rgh = p - rho*gh; + if (!compressible) + { + p += dimensionedScalar + ( + "p", + p.dimensions(), + pRefValue - getRefCellValue(p, pRefCell) + ); + } + else + { + p += (initialMass - fvc::domainIntegrate(psi*p)) + /compressibility; + p_rgh = p - rho*gh; + } } rho = thermo.rho(); diff --git a/applications/solvers/heatTransfer/chtMultiRegionFoam/fluid/createFluidFields.H b/applications/solvers/heatTransfer/chtMultiRegionFoam/fluid/createFluidFields.H index be3ec79a2c..87e372fcae 100644 --- a/applications/solvers/heatTransfer/chtMultiRegionFoam/fluid/createFluidFields.H +++ b/applications/solvers/heatTransfer/chtMultiRegionFoam/fluid/createFluidFields.H @@ -19,6 +19,9 @@ List frozenFlowFluid(fluidRegions.size(), false); PtrList MRFfluid(fluidRegions.size()); PtrList fluidFvOptions(fluidRegions.size()); +List