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