diff --git a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleDyMFoam/correctPhi.H b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleDyMFoam/correctPhi.H index c704573276..37072312ff 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleDyMFoam/correctPhi.H +++ b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleDyMFoam/correctPhi.H @@ -1,63 +1,11 @@ -if (mesh.changing()) -{ - forAll(U.boundaryField(), patchi) - { - if (U.boundaryField()[patchi].fixesValue()) - { - U.boundaryField()[patchi].initEvaluate(); - } - } - - forAll(U.boundaryField(), patchi) - { - if (U.boundaryField()[patchi].fixesValue()) - { - U.boundaryField()[patchi].evaluate(); - - phi.boundaryField()[patchi] = - rho.boundaryField()[patchi] - *( - U.boundaryField()[patchi] - & mesh.Sf().boundaryField()[patchi] - ); - } - } -} - -{ - volScalarField pcorr - ( - IOobject - ( - "pcorr", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh, - dimensionedScalar("pcorr", p.dimensions(), 0.0), - pcorrTypes - ); - - dimensionedScalar rAUf("rAUf", dimTime, 1.0); - - while (pimple.correctNonOrthogonal()) - { - fvScalarMatrix pcorrEqn - ( - fvm::ddt(psi, pcorr) - + fvc::div(phi) - - fvm::laplacian(rAUf, pcorr) - == - divrhoU - ); - - pcorrEqn.solve(); - - if (pimple.finalNonOrthogonalIter()) - { - phi += pcorrEqn.flux(); - } - } -} +CorrectPhi +( + U, + phi, + p, + rho, + psi, + dimensionedScalar("rAUf", dimTime, 1), + divrhoU, + pimple +); diff --git a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleDyMFoam/rhoPimpleDyMFoam.C b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleDyMFoam/rhoPimpleDyMFoam.C index f3676b66db..85c86b1169 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleDyMFoam/rhoPimpleDyMFoam.C +++ b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleDyMFoam/rhoPimpleDyMFoam.C @@ -42,6 +42,7 @@ Description #include "turbulentFluidThermoModel.H" #include "bound.H" #include "pimpleControl.H" +#include "CorrectPhi.H" #include "fvIOoptionList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -58,7 +59,6 @@ int main(int argc, char *argv[]) #include "readControls.H" #include "createFields.H" #include "createFvOptions.H" - #include "createPcorrTypes.H" #include "createRhoUf.H" #include "CourantNo.H" #include "setInitialDeltaT.H" diff --git a/applications/solvers/compressible/sonicFoam/sonicDyMFoam/sonicDyMFoam.C b/applications/solvers/compressible/sonicFoam/sonicDyMFoam/sonicDyMFoam.C index a78ef861d6..dce4eaab26 100644 --- a/applications/solvers/compressible/sonicFoam/sonicDyMFoam/sonicDyMFoam.C +++ b/applications/solvers/compressible/sonicFoam/sonicDyMFoam/sonicDyMFoam.C @@ -38,6 +38,7 @@ Description #include "psiThermo.H" #include "turbulentFluidThermoModel.H" #include "pimpleControl.H" +#include "CorrectPhi.H" #include "fvIOoptionList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -54,7 +55,6 @@ int main(int argc, char *argv[]) #include "readControls.H" #include "createFields.H" #include "createFvOptions.H" - #include "createPcorrTypes.H" #include "createRhoUf.H" #include "CourantNo.H" #include "setInitialDeltaT.H" diff --git a/applications/solvers/incompressible/pimpleFoam/pimpleDyMFoam/correctPhi.H b/applications/solvers/incompressible/pimpleFoam/pimpleDyMFoam/correctPhi.H index b693bb7860..da0ee46df6 100644 --- a/applications/solvers/incompressible/pimpleFoam/pimpleDyMFoam/correctPhi.H +++ b/applications/solvers/incompressible/pimpleFoam/pimpleDyMFoam/correctPhi.H @@ -1,59 +1,11 @@ -if (mesh.changing()) -{ - forAll(U.boundaryField(), patchI) - { - if (U.boundaryField()[patchI].fixesValue()) - { - U.boundaryField()[patchI].initEvaluate(); - } - } +CorrectPhi +( + U, + phi, + p, + dimensionedScalar("rAUf", dimTime, 1), + geometricZeroField(), + pimple +); - forAll(U.boundaryField(), patchI) - { - if (U.boundaryField()[patchI].fixesValue()) - { - U.boundaryField()[patchI].evaluate(); - - phi.boundaryField()[patchI] = - U.boundaryField()[patchI] - & mesh.Sf().boundaryField()[patchI]; - } - } -} - -{ - volScalarField pcorr - ( - IOobject - ( - "pcorr", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh, - dimensionedScalar("pcorr", p.dimensions(), 0.0), - pcorrTypes - ); - - dimensionedScalar rAUf("rAUf", dimTime, 1.0); - - while (pimple.correctNonOrthogonal()) - { - fvScalarMatrix pcorrEqn - ( - fvm::laplacian(rAUf, pcorr) == fvc::div(phi) - ); - - pcorrEqn.setReference(pRefCell, pRefValue); - pcorrEqn.solve(); - - if (pimple.finalNonOrthogonalIter()) - { - phi -= pcorrEqn.flux(); - } - } - - #include "continuityErrs.H" -} +#include "continuityErrs.H" diff --git a/applications/solvers/incompressible/pimpleFoam/pimpleDyMFoam/pimpleDyMFoam.C b/applications/solvers/incompressible/pimpleFoam/pimpleDyMFoam/pimpleDyMFoam.C index 7c23e6583e..8d4edd3ed1 100644 --- a/applications/solvers/incompressible/pimpleFoam/pimpleDyMFoam/pimpleDyMFoam.C +++ b/applications/solvers/incompressible/pimpleFoam/pimpleDyMFoam/pimpleDyMFoam.C @@ -37,6 +37,7 @@ Description #include "singlePhaseTransportModel.H" #include "turbulentTransportModel.H" #include "pimpleControl.H" +#include "CorrectPhi.H" #include "fvIOoptionList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -54,7 +55,6 @@ int main(int argc, char *argv[]) #include "createUf.H" #include "createFvOptions.H" #include "readTimeControls.H" - #include "createPcorrTypes.H" #include "CourantNo.H" #include "setInitialDeltaT.H" diff --git a/applications/solvers/multiphase/cavitatingFoam/cavitatingDyMFoam/cavitatingDyMFoam.C b/applications/solvers/multiphase/cavitatingFoam/cavitatingDyMFoam/cavitatingDyMFoam.C index 9910f1a4bd..55f5786e46 100644 --- a/applications/solvers/multiphase/cavitatingFoam/cavitatingDyMFoam/cavitatingDyMFoam.C +++ b/applications/solvers/multiphase/cavitatingFoam/cavitatingDyMFoam/cavitatingDyMFoam.C @@ -37,6 +37,7 @@ Description #include "barotropicCompressibilityModel.H" #include "incompressibleTwoPhaseMixture.H" #include "turbulentTransportModel.H" +#include "CorrectPhi.H" #include "pimpleControl.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/applications/solvers/multiphase/cavitatingFoam/cavitatingDyMFoam/correctPhi.H b/applications/solvers/multiphase/cavitatingFoam/cavitatingDyMFoam/correctPhi.H index 4bb1ce9d0d..c31b07ecc6 100644 --- a/applications/solvers/multiphase/cavitatingFoam/cavitatingDyMFoam/correctPhi.H +++ b/applications/solvers/multiphase/cavitatingFoam/cavitatingDyMFoam/correctPhi.H @@ -1,25 +1,4 @@ -if (mesh.changing()) -{ - forAll(U.boundaryField(), patchI) - { - if (U.boundaryField()[patchI].fixesValue()) - { - U.boundaryField()[patchI].initEvaluate(); - } - } - - forAll(U.boundaryField(), patchI) - { - if (U.boundaryField()[patchI].fixesValue()) - { - U.boundaryField()[patchI].evaluate(); - - phi.boundaryField()[patchI] = - U.boundaryField()[patchI] - & mesh.Sf().boundaryField()[patchI]; - } - } -} +correctUphiBCs(U, phi); { volScalarField pcorr diff --git a/src/finiteVolume/cfdTools/general/include/createPcorrTypes.H b/applications/solvers/multiphase/cavitatingFoam/cavitatingDyMFoam/createPcorrTypes.H similarity index 100% rename from src/finiteVolume/cfdTools/general/include/createPcorrTypes.H rename to applications/solvers/multiphase/cavitatingFoam/cavitatingDyMFoam/createPcorrTypes.H diff --git a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/compressibleInterDyMFoam.C b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/compressibleInterDyMFoam.C index cf35e60bec..8297cd691c 100644 --- a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/compressibleInterDyMFoam.C +++ b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/compressibleInterDyMFoam.C @@ -46,6 +46,7 @@ Description #include "twoPhaseMixtureThermo.H" #include "turbulentFluidThermoModel.H" #include "pimpleControl.H" +#include "CorrectPhi.H" #include "fixedFluxPressureFvPatchScalarField.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -63,7 +64,6 @@ int main(int argc, char *argv[]) #include "createFields.H" #include "createUf.H" #include "readControls.H" - #include "createPrghCorrTypes.H" #include "CourantNo.H" #include "setInitialDeltaT.H" diff --git a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/correctPhi.H b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/correctPhi.H index 97c63e6a3e..ad73a951ff 100644 --- a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/correctPhi.H +++ b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/correctPhi.H @@ -1,59 +1,13 @@ -if (mesh.changing()) -{ - forAll(U.boundaryField(), patchi) - { - if (U.boundaryField()[patchi].fixesValue()) - { - U.boundaryField()[patchi].initEvaluate(); - } - } +CorrectPhi +( + U, + phi, + p, + dimensionedScalar("rAUf", dimTime/rho.dimensions(), 1), + divU, + pimple +); - forAll(U.boundaryField(), patchi) - { - if (U.boundaryField()[patchi].fixesValue()) - { - U.boundaryField()[patchi].evaluate(); +//***HGW phi.oldTime() = phi; - phi.boundaryField()[patchi] = - U.boundaryField()[patchi] & mesh.Sf().boundaryField()[patchi]; - } - } -} - -{ - volScalarField pcorr - ( - IOobject - ( - "pcorr", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh, - dimensionedScalar("pcorr", p.dimensions(), 0.0), - pcorrTypes - ); - - dimensionedScalar rAUf("rAUf", dimTime/rho.dimensions(), 1.0); - - while (pimple.correctNonOrthogonal()) - { - fvScalarMatrix pcorrEqn - ( - fvm::laplacian(rAUf, pcorr) == fvc::div(phi) - divU - ); - - pcorrEqn.solve(); - - if (pimple.finalNonOrthogonalIter()) - { - phi -= pcorrEqn.flux(); - } - } - - phi.oldTime() = phi; - - #include "continuityErrs.H" -} +#include "continuityErrs.H" diff --git a/applications/solvers/multiphase/interFoam/LTSInterFoam/LTSInterFoam.C b/applications/solvers/multiphase/interFoam/LTSInterFoam/LTSInterFoam.C index f08ab03306..7cd46c0a09 100644 --- a/applications/solvers/multiphase/interFoam/LTSInterFoam/LTSInterFoam.C +++ b/applications/solvers/multiphase/interFoam/LTSInterFoam/LTSInterFoam.C @@ -45,6 +45,7 @@ Description #include "fvcSmooth.H" #include "pimpleControl.H" #include "fvIOoptionList.H" +#include "CorrectPhi.H" #include "fixedFluxPressureFvPatchScalarField.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -60,7 +61,6 @@ int main(int argc, char *argv[]) #include "initContinuityErrs.H" #include "createFields.H" #include "createFvOptions.H" - #include "createPrghCorrTypes.H" #include "correctPhi.H" #include "CourantNo.H" #include "setInitialrDeltaT.H" diff --git a/applications/solvers/multiphase/interFoam/correctPhi.H b/applications/solvers/multiphase/interFoam/correctPhi.H index 0d324d1357..9afcd58a66 100644 --- a/applications/solvers/multiphase/interFoam/correctPhi.H +++ b/applications/solvers/multiphase/interFoam/correctPhi.H @@ -1,40 +1,11 @@ -{ - #include "continuityErrs.H" +CorrectPhi +( + U, + phi, + p_rgh, + dimensionedScalar("rAUf", dimTime/rho.dimensions(), 1), + geometricZeroField(), + pimple +); - volScalarField pcorr - ( - IOobject - ( - "pcorr", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh, - dimensionedScalar("pcorr", p_rgh.dimensions(), 0.0), - pcorrTypes - ); - - dimensionedScalar rAUf("rAUf", dimTime/rho.dimensions(), 1.0); - - adjustPhi(phi, U, pcorr); - - while (pimple.correctNonOrthogonal()) - { - fvScalarMatrix pcorrEqn - ( - fvm::laplacian(rAUf, pcorr) == fvc::div(phi) - ); - - pcorrEqn.setReference(pRefCell, pRefValue); - pcorrEqn.solve(); - - if (pimple.finalNonOrthogonalIter()) - { - phi -= pcorrEqn.flux(); - } - } - - #include "continuityErrs.H" -} +#include "continuityErrs.H" diff --git a/applications/solvers/multiphase/interFoam/interDyMFoam/correctPhi.H b/applications/solvers/multiphase/interFoam/interDyMFoam/correctPhi.H index 2cadf01317..0c5ea13bbc 100644 --- a/applications/solvers/multiphase/interFoam/interDyMFoam/correctPhi.H +++ b/applications/solvers/multiphase/interFoam/interDyMFoam/correctPhi.H @@ -1,65 +1,11 @@ -if (mesh.changing()) -{ - forAll(U.boundaryField(), patchI) - { - if (U.boundaryField()[patchI].fixesValue()) - { - U.boundaryField()[patchI].initEvaluate(); - } - } +CorrectPhi +( + U, + phi, + p_rgh, + surfaceScalarField("rAUf", fvc::interpolate(rAU)), + geometricZeroField(), + pimple +); - forAll(U.boundaryField(), patchI) - { - if (U.boundaryField()[patchI].fixesValue()) - { - U.boundaryField()[patchI].evaluate(); - - phi.boundaryField()[patchI] = - U.boundaryField()[patchI] - & mesh.Sf().boundaryField()[patchI]; - } - } -} - -{ - volScalarField pcorr - ( - IOobject - ( - "pcorr", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh, - dimensionedScalar("pcorr", p_rgh.dimensions(), 0.0), - pcorrTypes - ); - - surfaceScalarField rAUf("rAUf", fvc::interpolate(rAU)); - - #ifndef divUCorr - #define divUCorr - #endif - - while (pimple.correctNonOrthogonal()) - { - fvScalarMatrix pcorrEqn - ( - fvm::laplacian(rAUf, pcorr) == fvc::div(phi) divUCorr - ); - - pcorrEqn.setReference(pRefCell, pRefValue); - pcorrEqn.solve(); - - if (pimple.finalNonOrthogonalIter()) - { - phi -= pcorrEqn.flux(); - } - } - - #undef divUCorr - - #include "continuityErrs.H" -} +#include "continuityErrs.H" diff --git a/applications/solvers/multiphase/interFoam/interDyMFoam/interDyMFoam.C b/applications/solvers/multiphase/interFoam/interDyMFoam/interDyMFoam.C index b517d082c8..e17a3413f4 100644 --- a/applications/solvers/multiphase/interFoam/interDyMFoam/interDyMFoam.C +++ b/applications/solvers/multiphase/interFoam/interDyMFoam/interDyMFoam.C @@ -40,6 +40,7 @@ Description #include "turbulentTransportModel.H" #include "pimpleControl.H" #include "fvIOoptionList.H" +#include "CorrectPhi.H" #include "fixedFluxPressureFvPatchScalarField.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -56,7 +57,6 @@ int main(int argc, char *argv[]) #include "createFields.H" #include "createFvOptions.H" #include "readTimeControls.H" - #include "createPrghCorrTypes.H" volScalarField rAU ( diff --git a/applications/solvers/multiphase/interFoam/interFoam.C b/applications/solvers/multiphase/interFoam/interFoam.C index 8250667ce6..3f0a5aef45 100644 --- a/applications/solvers/multiphase/interFoam/interFoam.C +++ b/applications/solvers/multiphase/interFoam/interFoam.C @@ -44,6 +44,7 @@ Description #include "turbulentTransportModel.H" #include "pimpleControl.H" #include "fvIOoptionList.H" +#include "CorrectPhi.H" #include "fixedFluxPressureFvPatchScalarField.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -60,7 +61,6 @@ int main(int argc, char *argv[]) #include "createFields.H" #include "createFvOptions.H" #include "readTimeControls.H" - #include "createPrghCorrTypes.H" #include "correctPhi.H" #include "CourantNo.H" #include "setInitialDeltaT.H" diff --git a/applications/solvers/multiphase/interFoam/interMixingFoam/interMixingFoam.C b/applications/solvers/multiphase/interFoam/interMixingFoam/interMixingFoam.C index b1174b2c6d..d51f5a83ab 100644 --- a/applications/solvers/multiphase/interFoam/interMixingFoam/interMixingFoam.C +++ b/applications/solvers/multiphase/interFoam/interMixingFoam/interMixingFoam.C @@ -37,6 +37,7 @@ Description #include "turbulentTransportModel.H" #include "pimpleControl.H" #include "fvIOoptionList.H" +#include "CorrectPhi.H" #include "fixedFluxPressureFvPatchScalarField.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -56,7 +57,6 @@ int main(int argc, char *argv[]) #include "readTimeControls.H" #include "CourantNo.H" #include "setInitialDeltaT.H" - #include "createPrghCorrTypes.H" #include "correctPhi.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/applications/solvers/multiphase/interFoam/porousInterFoam/porousInterFoam.C b/applications/solvers/multiphase/interFoam/porousInterFoam/porousInterFoam.C index f6d7e157c5..a8d621bed1 100644 --- a/applications/solvers/multiphase/interFoam/porousInterFoam/porousInterFoam.C +++ b/applications/solvers/multiphase/interFoam/porousInterFoam/porousInterFoam.C @@ -46,6 +46,7 @@ Description #include "IOporosityModelList.H" #include "pimpleControl.H" #include "fvIOoptionList.H" +#include "CorrectPhi.H" #include "fixedFluxPressureFvPatchScalarField.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -63,7 +64,6 @@ int main(int argc, char *argv[]) #include "createFvOptions.H" #include "createPorousZones.H" #include "readTimeControls.H" - #include "createPrghCorrTypes.H" #include "correctPhi.H" #include "CourantNo.H" #include "setInitialDeltaT.H" diff --git a/applications/solvers/multiphase/interPhaseChangeFoam/interPhaseChangeDyMFoam/correctPhi.H b/applications/solvers/multiphase/interPhaseChangeFoam/interPhaseChangeDyMFoam/correctPhi.H new file mode 100644 index 0000000000..6c85d967a4 --- /dev/null +++ b/applications/solvers/multiphase/interPhaseChangeFoam/interPhaseChangeDyMFoam/correctPhi.H @@ -0,0 +1,11 @@ +CorrectPhi +( + U, + phi, + p_rgh, + surfaceScalarField("rAUf", fvc::interpolate(rAU)), + divU, + pimple +); + +#include "continuityErrs.H" diff --git a/applications/solvers/multiphase/interPhaseChangeFoam/interPhaseChangeDyMFoam/interPhaseChangeDyMFoam.C b/applications/solvers/multiphase/interPhaseChangeFoam/interPhaseChangeDyMFoam/interPhaseChangeDyMFoam.C index aa21bdecb4..9063478d69 100644 --- a/applications/solvers/multiphase/interPhaseChangeFoam/interPhaseChangeDyMFoam/interPhaseChangeDyMFoam.C +++ b/applications/solvers/multiphase/interPhaseChangeFoam/interPhaseChangeDyMFoam/interPhaseChangeDyMFoam.C @@ -50,6 +50,7 @@ Description #include "turbulentTransportModel.H" #include "pimpleControl.H" #include "fvIOoptionList.H" +#include "CorrectPhi.H" #include "fixedFluxPressureFvPatchScalarField.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -67,7 +68,6 @@ int main(int argc, char *argv[]) #include "createFields.H" #include "createFvOptions.H" #include "readTimeControls.H" - #include "createPcorrTypes.H" volScalarField rAU ( @@ -128,8 +128,7 @@ int main(int argc, char *argv[]) // Calculate absolute flux from the mapped surface velocity phi = mesh.Sf() & Uf; - #define divUCorr -divU - #include "../interFoam/interDyMFoam/correctPhi.H" + #include "correctPhi.H" // Make the flux relative to the mesh motion fvc::makeRelative(phi, U); diff --git a/applications/solvers/multiphase/interPhaseChangeFoam/interPhaseChangeFoam.C b/applications/solvers/multiphase/interPhaseChangeFoam/interPhaseChangeFoam.C index 372e072671..2364208b5a 100644 --- a/applications/solvers/multiphase/interPhaseChangeFoam/interPhaseChangeFoam.C +++ b/applications/solvers/multiphase/interPhaseChangeFoam/interPhaseChangeFoam.C @@ -65,7 +65,6 @@ int main(int argc, char *argv[]) #include "createFields.H" #include "createFvOptions.H" #include "readTimeControls.H" - #include "createPrghCorrTypes.H" #include "CourantNo.H" #include "setInitialDeltaT.H" diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/correctPhi.H b/applications/solvers/multiphase/multiphaseEulerFoam/correctPhi.H index e291b7dbcd..9767adda1d 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/correctPhi.H +++ b/applications/solvers/multiphase/multiphaseEulerFoam/correctPhi.H @@ -1,38 +1,11 @@ -{ - #include "continuityErrs.H" +CorrectPhi +( + U, + phi, + p, + dimensionedScalar("rAUf", dimTime/rho.dimensions(), 1), + geometricZeroField(), + pimple +); - volScalarField pcorr - ( - IOobject - ( - "pcorr", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh, - dimensionedScalar("pcorr", p.dimensions(), 0.0), - pcorrTypes - ); - - dimensionedScalar rAUf("rAUf", dimTime/rho.dimensions(), 1.0); - - while (pimple.correctNonOrthogonal()) - { - fvScalarMatrix pcorrEqn - ( - fvm::laplacian(rAUf, pcorr) == fvc::div(phi) - ); - - pcorrEqn.setReference(pRefCell, pRefValue); - pcorrEqn.solve(); - - if (pimple.finalNonOrthogonalIter()) - { - phi -= pcorrEqn.flux(); - } - } - - #include "continuityErrs.H" -} +#include "continuityErrs.H" diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/multiphaseEulerFoam.C b/applications/solvers/multiphase/multiphaseEulerFoam/multiphaseEulerFoam.C index 237a62a7cd..2cb3156cc6 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/multiphaseEulerFoam.C +++ b/applications/solvers/multiphase/multiphaseEulerFoam/multiphaseEulerFoam.C @@ -39,9 +39,9 @@ Description #include "turbulentTransportModel.H" #include "pimpleControl.H" #include "IOMRFZoneList.H" +#include "CorrectPhi.H" #include "fixedFluxPressureFvPatchScalarField.H" - // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) @@ -57,7 +57,6 @@ int main(int argc, char *argv[]) #include "createMRFZones.H" #include "initContinuityErrs.H" #include "readTimeControls.H" - #include "createPcorrTypes.H" #include "correctPhi.H" #include "CourantNo.H" #include "setInitialDeltaT.H" diff --git a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseInterDyMFoam/multiphaseInterDyMFoam.C b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseInterDyMFoam/multiphaseInterDyMFoam.C index 61b8d719af..f75e6d9c4b 100644 --- a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseInterDyMFoam/multiphaseInterDyMFoam.C +++ b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseInterDyMFoam/multiphaseInterDyMFoam.C @@ -38,6 +38,7 @@ Description #include "turbulentTransportModel.H" #include "pimpleControl.H" #include "fvIOoptionList.H" +#include "CorrectPhi.H" #include "fixedFluxPressureFvPatchScalarField.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -54,7 +55,6 @@ int main(int argc, char *argv[]) #include "createFields.H" #include "createFvOptions.H" #include "readTimeControls.H" - #include "createPrghCorrTypes.H" volScalarField rAU ( diff --git a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseInterFoam.C b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseInterFoam.C index e942c62231..4d148b3a45 100644 --- a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseInterFoam.C +++ b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseInterFoam.C @@ -37,6 +37,7 @@ Description #include "turbulentTransportModel.H" #include "pimpleControl.H" #include "fvIOoptionList.H" +#include "CorrectPhi.H" #include "fixedFluxPressureFvPatchScalarField.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -53,7 +54,6 @@ int main(int argc, char *argv[]) #include "createFields.H" #include "createFvOptions.H" #include "readTimeControls.H" - #include "createPrghCorrTypes.H" #include "correctPhi.H" #include "CourantNo.H" #include "setInitialDeltaT.H" diff --git a/applications/solvers/multiphase/potentialFreeSurfaceFoam/potentialFreeSurfaceDyMFoam/correctPhi.H b/applications/solvers/multiphase/potentialFreeSurfaceFoam/potentialFreeSurfaceDyMFoam/correctPhi.H index b067878377..f060cce12c 100644 --- a/applications/solvers/multiphase/potentialFreeSurfaceFoam/potentialFreeSurfaceDyMFoam/correctPhi.H +++ b/applications/solvers/multiphase/potentialFreeSurfaceFoam/potentialFreeSurfaceDyMFoam/correctPhi.H @@ -1,58 +1,11 @@ -if (mesh.changing()) -{ - forAll(U.boundaryField(), patchI) - { - if (U.boundaryField()[patchI].fixesValue()) - { - U.boundaryField()[patchI].initEvaluate(); - } - } +CorrectPhi +( + U, + phi, + p_gh, + surfaceScalarField("rAUf", fvc::interpolate(rAU)), + geometricZeroField(), + pimple +); - forAll(U.boundaryField(), patchI) - { - if (U.boundaryField()[patchI].fixesValue()) - { - U.boundaryField()[patchI].evaluate(); - - phi.boundaryField()[patchI] = - U.boundaryField()[patchI] - & mesh.Sf().boundaryField()[patchI]; - } - } -} - -{ - volScalarField pcorr - ( - IOobject - ( - "pcorr", - runTime.timeName(), - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE - ), - mesh, - dimensionedScalar("pcorr", p_gh.dimensions(), 0.0), - pcorrTypes - ); - - surfaceScalarField rAUf("rAUf", fvc::interpolate(rAU)); - - while (pimple.correctNonOrthogonal()) - { - fvScalarMatrix pcorrEqn - ( - fvm::laplacian(rAUf, pcorr) == fvc::div(phi) - ); - - pcorrEqn.solve(); - - if (pimple.finalNonOrthogonalIter()) - { - phi -= pcorrEqn.flux(); - } - } - - #include "continuityErrs.H" -} +#include "continuityErrs.H" diff --git a/applications/solvers/multiphase/potentialFreeSurfaceFoam/potentialFreeSurfaceDyMFoam/createPghCorrTypes.H b/applications/solvers/multiphase/potentialFreeSurfaceFoam/potentialFreeSurfaceDyMFoam/createPghCorrTypes.H deleted file mode 100644 index 7514369ca2..0000000000 --- a/applications/solvers/multiphase/potentialFreeSurfaceFoam/potentialFreeSurfaceDyMFoam/createPghCorrTypes.H +++ /dev/null @@ -1,13 +0,0 @@ - wordList pcorrTypes - ( - p_gh.boundaryField().size(), - zeroGradientFvPatchScalarField::typeName - ); - - for (label i=0; i. + +\*---------------------------------------------------------------------------*/ + +#include "CorrectPhi.H" +#include "volFields.H" +#include "surfaceFields.H" +#include "fvScalarMatrix.H" +#include "fvmDdt.H" +#include "fvmLaplacian.H" +#include "fvcDiv.H" +#include "fixedValueFvPatchFields.H" +#include "adjustPhi.H" +#include "pimpleControl.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +template +void Foam::CorrectPhi +( + volVectorField& U, + surfaceScalarField& phi, + const volScalarField& p, + const RAUfType& rAUf, + const DivUType& divU, + pimpleControl& pimple +) +{ + const fvMesh& mesh = U.mesh(); + const Time& runTime = mesh.time(); + + correctUphiBCs(U, phi); + + // Initialize BCs list for pcorr to zero-gradient + wordList pcorrTypes + ( + p.boundaryField().size(), + zeroGradientFvPatchScalarField::typeName + ); + + // Set BCs of pcorr to fixed-value for patches at which p is fixed + forAll(p.boundaryField(), patchi) + { + if (p.boundaryField()[patchi].fixesValue()) + { + pcorrTypes[patchi] = fixedValueFvPatchScalarField::typeName; + } + } + + volScalarField pcorr + ( + IOobject + ( + "pcorr", + runTime.timeName(), + mesh + ), + mesh, + dimensionedScalar("pcorr", p.dimensions(), 0.0), + pcorrTypes + ); + + adjustPhi(phi, U, pcorr); + + while (pimple.correctNonOrthogonal()) + { + // Solve for pcorr such that the divergence of the corrected flux + // matches the divU provided (from previous iteration, time-step...) + fvScalarMatrix pcorrEqn + ( + fvm::laplacian(rAUf, pcorr) == fvc::div(phi) - divU + ); + + pcorrEqn.setReference(0, 0); + pcorrEqn.solve(); + + if (pimple.finalNonOrthogonalIter()) + { + phi -= pcorrEqn.flux(); + } + } +} + + +template +void Foam::CorrectPhi +( + volVectorField& U, + surfaceScalarField& phi, + const volScalarField& p, + const volScalarField& rho, + const volScalarField& psi, + const RAUfType& rAUf, + const DivRhoUType& divRhoU, + pimpleControl& pimple +) +{ + const fvMesh& mesh = U.mesh(); + const Time& runTime = mesh.time(); + + correctUphiBCs(rho, U, phi); + + // Initialize BCs list for pcorr to zero-gradient + wordList pcorrTypes + ( + p.boundaryField().size(), + zeroGradientFvPatchScalarField::typeName + ); + + // Set BCs of pcorr to fixed-value for patches at which p is fixed + forAll(p.boundaryField(), patchi) + { + if (p.boundaryField()[patchi].fixesValue()) + { + pcorrTypes[patchi] = fixedValueFvPatchScalarField::typeName; + } + } + + volScalarField pcorr + ( + IOobject + ( + "pcorr", + runTime.timeName(), + mesh + ), + mesh, + dimensionedScalar("pcorr", p.dimensions(), 0.0), + pcorrTypes + ); + + while (pimple.correctNonOrthogonal()) + { + // Solve for pcorr such that the divergence of the corrected flux + // matches the divRhoU provided (from previous iteration, time-step...) + fvScalarMatrix pcorrEqn + ( + fvm::ddt(psi, pcorr) + + fvc::div(phi) + - fvm::laplacian(rAUf, pcorr) + == + divRhoU + ); + + pcorrEqn.solve(); + + if (pimple.finalNonOrthogonalIter()) + { + phi += pcorrEqn.flux(); + } + } +} + + +// ************************************************************************* // diff --git a/src/finiteVolume/cfdTools/general/CorrectPhi/CorrectPhi.H b/src/finiteVolume/cfdTools/general/CorrectPhi/CorrectPhi.H new file mode 100644 index 0000000000..ecf8559c8b --- /dev/null +++ b/src/finiteVolume/cfdTools/general/CorrectPhi/CorrectPhi.H @@ -0,0 +1,105 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Class + Foam::CorrectPhi + +Description + Flux correction functions to ensure continuity. + + Required during start-up, restart, mesh-motion etc. when non-conservative + fluxes may adversely affect the prediction-part of the solution algorithm + (the part before the first pressure solution which would ensure continuity). + This is particularly important for VoF and other multi-phase solver in + which non-conservative fluxes cause unboundedness of the phase-fraction. + +SourceFiles + CorrectPhi.C + +\*---------------------------------------------------------------------------*/ + +#ifndef CorrectPhi_H +#define CorrectPhi_H + +#include "volFieldsFwd.H" +#include "surfaceFieldsFwd.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + class pimpleControl; + + //- If the mesh is moving correct the velocity BCs on the moving walls to + // ensure the corrected fluxes and velocity are consistent + void correctUphiBCs + ( + volVectorField& U, + surfaceScalarField& phi + ); + + //- If the mesh is moving correct the velocity BCs on the moving walls to + // ensure the corrected fluxes and velocity are consistent + void correctUphiBCs + ( + const volScalarField& rho, + volVectorField& U, + surfaceScalarField& phi + ); + + template + void CorrectPhi + ( + volVectorField& U, + surfaceScalarField& phi, + const volScalarField& p, + const RAUfType& rAUf, + const DivUType& divU, + pimpleControl& pimple + ); + + template + void CorrectPhi + ( + volVectorField& U, + surfaceScalarField& phi, + const volScalarField& p, + const volScalarField& rho, + const volScalarField& psi, + const RAUfType& rAUf, + const DivRhoUType& divRhoU, + pimpleControl& pimple + ); +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "CorrectPhi.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteVolume/cfdTools/general/CorrectPhi/correctUphiBCs.C b/src/finiteVolume/cfdTools/general/CorrectPhi/correctUphiBCs.C new file mode 100644 index 0000000000..d9ab448b46 --- /dev/null +++ b/src/finiteVolume/cfdTools/general/CorrectPhi/correctUphiBCs.C @@ -0,0 +1,100 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2015 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "CorrectPhi.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +void Foam::correctUphiBCs +( + volVectorField& U, + surfaceScalarField& phi +) +{ + const fvMesh& mesh = U.mesh(); + + if (mesh.changing()) + { + forAll(U.boundaryField(), patchi) + { + if (U.boundaryField()[patchi].fixesValue()) + { + U.boundaryField()[patchi].initEvaluate(); + } + } + + forAll(U.boundaryField(), patchi) + { + if (U.boundaryField()[patchi].fixesValue()) + { + U.boundaryField()[patchi].evaluate(); + + phi.boundaryField()[patchi] = + U.boundaryField()[patchi] + & mesh.Sf().boundaryField()[patchi]; + } + } + } +} + + +void Foam::correctUphiBCs +( + const volScalarField& rho, + volVectorField& U, + surfaceScalarField& phi +) +{ + const fvMesh& mesh = U.mesh(); + + if (mesh.changing()) + { + forAll(U.boundaryField(), patchi) + { + if (U.boundaryField()[patchi].fixesValue()) + { + U.boundaryField()[patchi].initEvaluate(); + } + } + + forAll(U.boundaryField(), patchi) + { + if (U.boundaryField()[patchi].fixesValue()) + { + U.boundaryField()[patchi].evaluate(); + + phi.boundaryField()[patchi] = + rho.boundaryField()[patchi] + *( + U.boundaryField()[patchi] + & mesh.Sf().boundaryField()[patchi] + ); + } + } + } +} + + +// ************************************************************************* // diff --git a/src/finiteVolume/cfdTools/general/include/createPrghCorrTypes.H b/src/finiteVolume/cfdTools/general/include/createPrghCorrTypes.H deleted file mode 100644 index dfd4afb49b..0000000000 --- a/src/finiteVolume/cfdTools/general/include/createPrghCorrTypes.H +++ /dev/null @@ -1,13 +0,0 @@ - wordList pcorrTypes - ( - p_rgh.boundaryField().size(), - zeroGradientFvPatchScalarField::typeName - ); - - for (label i=0; i