From b167c95f19d431a43097ed0f7804ec294180ab64 Mon Sep 17 00:00:00 2001
From: Henry Weller <http://cfd.direct>
Date: Thu, 9 Feb 2017 17:31:57 +0000
Subject: [PATCH] compressibleInterFoam: Completed LTS and semi-implicit MULES
 support

Now the interFoam and compressibleInterFoam families of solvers use the same
alphaEqn formulation and supporting all of the MULES options without
code-duplication.

The semi-implicit MULES support allows running with significantly larger
time-steps but this does reduce the interface sharpness.
---
 .../{interFoam => VoF}/alphaCourantNo.H       |  2 +-
 .../multiphase/{interFoam => VoF}/alphaEqn.H  | 36 ++++++++-
 .../{interFoam => VoF}/alphaEqnSubCycle.H     |  0
 .../multiphase/{interFoam => VoF}/setDeltaT.H |  2 +-
 .../{interFoam => VoF}/setRDeltaT.H           |  0
 .../compressibleInterFoam/Make/options        |  2 +-
 .../multiphase/compressibleInterFoam/UEqn.H   |  4 +-
 .../compressibleInterFoam/alphaControls.H     |  5 --
 .../compressibleInterFoam/alphaEqn.H          | 51 ------------
 .../compressibleInterFoam/alphaEqnSubCycle.H  | 38 ---------
 .../compressibleInterFoam/alphaSuSp.H         | 76 +++++++++---------
 .../compressibleAlphaEqnSubCycle.H            |  3 +
 .../compressibleInterDyMFoam/Make/options     |  3 +-
 .../compressibleInterDyMFoam.C                |  8 +-
 .../compressibleInterDyMFoam/pEqn.H           |  3 +-
 .../compressibleInterFoam.C                   |  6 +-
 .../compressibleInterFoam/createFields.H      | 20 +++++
 .../multiphase/compressibleInterFoam/pEqn.H   |  3 +-
 .../multiphase/compressibleInterFoam/rhofs.H  |  2 +
 .../Make/options                              |  1 +
 .../solvers/multiphase/interFoam/Make/options |  1 +
 .../solvers/multiphase/interFoam/alphaSuSp.H  |  3 +
 .../interFoam/interDyMFoam/Make/options       |  1 +
 .../multiphase/interFoam/interDyMFoam/pEqn.H  |  2 +-
 .../interFoam/interMixingFoam/Make/options    |  1 +
 .../solvers/multiphase/interFoam/rhofs.H      |  2 +
 .../multiphaseInterFoam/Make/options          |  1 +
 .../multiphaseInterDyMFoam/Make/options       |  1 +
 .../twoLiquidMixingFoam/Make/options          |  2 +-
 .../fields/Fields/zeroField/zeroField.H       |  6 +-
 .../fields/Fields/zeroField/zeroFieldI.H      | 78 ++++++++++++++++++-
 .../geometricZeroField/geometricZeroField.H   |  6 +-
 .../geometricZeroField/geometricZeroFieldI.H  |  7 +-
 .../laminar/depthCharge2D/system/controlDict  | 11 ++-
 .../laminar/depthCharge2D/system/fvSolution   | 12 ++-
 .../laminar/depthCharge3D/system/controlDict  |  7 +-
 .../laminar/depthCharge3D/system/fvSolution   | 12 ++-
 37 files changed, 251 insertions(+), 167 deletions(-)
 rename applications/solvers/multiphase/{interFoam => VoF}/alphaCourantNo.H (96%)
 rename applications/solvers/multiphase/{interFoam => VoF}/alphaEqn.H (86%)
 rename applications/solvers/multiphase/{interFoam => VoF}/alphaEqnSubCycle.H (100%)
 rename applications/solvers/multiphase/{interFoam => VoF}/setDeltaT.H (95%)
 rename applications/solvers/multiphase/{interFoam => VoF}/setRDeltaT.H (100%)
 delete mode 100644 applications/solvers/multiphase/compressibleInterFoam/alphaControls.H
 delete mode 100644 applications/solvers/multiphase/compressibleInterFoam/alphaEqn.H
 delete mode 100644 applications/solvers/multiphase/compressibleInterFoam/alphaEqnSubCycle.H
 create mode 100644 applications/solvers/multiphase/compressibleInterFoam/compressibleAlphaEqnSubCycle.H
 create mode 100644 applications/solvers/multiphase/compressibleInterFoam/rhofs.H
 create mode 100644 applications/solvers/multiphase/interFoam/alphaSuSp.H
 create mode 100644 applications/solvers/multiphase/interFoam/rhofs.H

diff --git a/applications/solvers/multiphase/interFoam/alphaCourantNo.H b/applications/solvers/multiphase/VoF/alphaCourantNo.H
similarity index 96%
rename from applications/solvers/multiphase/interFoam/alphaCourantNo.H
rename to applications/solvers/multiphase/VoF/alphaCourantNo.H
index a084155c8ae..24f6e48a22c 100644
--- a/applications/solvers/multiphase/interFoam/alphaCourantNo.H
+++ b/applications/solvers/multiphase/VoF/alphaCourantNo.H
@@ -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
diff --git a/applications/solvers/multiphase/interFoam/alphaEqn.H b/applications/solvers/multiphase/VoF/alphaEqn.H
similarity index 86%
rename from applications/solvers/multiphase/interFoam/alphaEqn.H
rename to applications/solvers/multiphase/VoF/alphaEqn.H
index 312c1d6723d..570442a3049 100644
--- a/applications/solvers/multiphase/interFoam/alphaEqn.H
+++ b/applications/solvers/multiphase/VoF/alphaEqn.H
@@ -79,6 +79,8 @@
 
     if (MULESCorr)
     {
+        #include "alphaSuSp.H"
+
         fvScalarMatrix alpha1Eqn
         (
             (
@@ -92,6 +94,8 @@
                 phiCN,
                 upwind<scalar>(mesh, phiCN)
             ).fvmDiv(phiCN, alpha1)
+         ==
+            Su + fvm::Sp(Sp + divU, alpha1)
         );
 
         alpha1Eqn.solve();
@@ -124,6 +128,8 @@
 
     for (int aCorr=0; aCorr<nAlphaCorr; aCorr++)
     {
+        #include "alphaSuSp.H"
+
         surfaceScalarField phir(phic*mixture.nHatf());
 
         tmp<surfaceScalarField> talphaPhiUn
@@ -154,7 +160,17 @@
             tmp<surfaceScalarField> talphaPhiCorr(talphaPhiUn() - alphaPhi);
             volScalarField alpha10("alpha10", alpha1);
 
-            MULES::correct(alpha1, talphaPhiUn(), talphaPhiCorr.ref(), 1, 0);
+            MULES::correct
+            (
+                geometricOneField(),
+                alpha1,
+                talphaPhiUn(),
+                talphaPhiCorr.ref(),
+                Sp,
+                (-Sp*alpha1)(),
+                1,
+                0
+            );
 
             // Under-relax the correction for all but the 1st corrector
             if (aCorr == 0)
@@ -171,7 +187,17 @@
         {
             alphaPhi = talphaPhiUn;
 
-            MULES::explicitSolve(alpha1, phiCN, alphaPhi, 1, 0);
+            MULES::explicitSolve
+            (
+                geometricOneField(),
+                alpha1,
+                phiCN,
+                alphaPhi,
+                Sp,
+                (Su + divU*min(alpha1(), scalar(1)))(),
+                1,
+                0
+            );
         }
 
         alpha2 = 1.0 - alpha1;
@@ -195,7 +221,8 @@
      == fv::EulerDdtScheme<vector>::typeName
     )
     {
-        rhoPhi = alphaPhi*(rho1 - rho2) + phiCN*rho2;
+        #include "rhofs.H"
+        rhoPhi = alphaPhi*(rho1f - rho2f) + phiCN*rho2f;
     }
     else
     {
@@ -206,7 +233,8 @@
         }
 
         // Calculate the end-of-time-step mass flux
-        rhoPhi = alphaPhi*(rho1 - rho2) + phi*rho2;
+        #include "rhofs.H"
+        rhoPhi = alphaPhi*(rho1f - rho2f) + phi*rho2f;
     }
 
     Info<< "Phase-1 volume fraction = "
diff --git a/applications/solvers/multiphase/interFoam/alphaEqnSubCycle.H b/applications/solvers/multiphase/VoF/alphaEqnSubCycle.H
similarity index 100%
rename from applications/solvers/multiphase/interFoam/alphaEqnSubCycle.H
rename to applications/solvers/multiphase/VoF/alphaEqnSubCycle.H
diff --git a/applications/solvers/multiphase/interFoam/setDeltaT.H b/applications/solvers/multiphase/VoF/setDeltaT.H
similarity index 95%
rename from applications/solvers/multiphase/interFoam/setDeltaT.H
rename to applications/solvers/multiphase/VoF/setDeltaT.H
index 9cc860c032e..924d24c8ea7 100644
--- a/applications/solvers/multiphase/interFoam/setDeltaT.H
+++ b/applications/solvers/multiphase/VoF/setDeltaT.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
diff --git a/applications/solvers/multiphase/interFoam/setRDeltaT.H b/applications/solvers/multiphase/VoF/setRDeltaT.H
similarity index 100%
rename from applications/solvers/multiphase/interFoam/setRDeltaT.H
rename to applications/solvers/multiphase/VoF/setRDeltaT.H
diff --git a/applications/solvers/multiphase/compressibleInterFoam/Make/options b/applications/solvers/multiphase/compressibleInterFoam/Make/options
index 27e73ef53aa..b947836f65e 100644
--- a/applications/solvers/multiphase/compressibleInterFoam/Make/options
+++ b/applications/solvers/multiphase/compressibleInterFoam/Make/options
@@ -1,6 +1,6 @@
 EXE_INC = \
     -I. \
-    -I../interFoam \
+    -I../VoF \
     -ItwoPhaseMixtureThermo \
     -I$(LIB_SRC)/transportModels/compressible/lnInclude \
     -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
diff --git a/applications/solvers/multiphase/compressibleInterFoam/UEqn.H b/applications/solvers/multiphase/compressibleInterFoam/UEqn.H
index 2eaeaa25f4b..b5e66ec33fb 100644
--- a/applications/solvers/multiphase/compressibleInterFoam/UEqn.H
+++ b/applications/solvers/multiphase/compressibleInterFoam/UEqn.H
@@ -1,7 +1,7 @@
     fvVectorMatrix UEqn
     (
-        fvm::ddt(rho, U)
-      + fvm::div(rhoPhi, U)
+        fvm::ddt(rho, U) + fvm::div(rhoPhi, U)
+      + MRF.DDt(rho, U)
       + turbulence->divDevRhoReff(U)
      ==
         fvOptions(rho, U)
diff --git a/applications/solvers/multiphase/compressibleInterFoam/alphaControls.H b/applications/solvers/multiphase/compressibleInterFoam/alphaControls.H
deleted file mode 100644
index a99a0b39e28..00000000000
--- a/applications/solvers/multiphase/compressibleInterFoam/alphaControls.H
+++ /dev/null
@@ -1,5 +0,0 @@
-const dictionary& alphaControls = mesh.solverDict(alpha1.name());
-
-label nAlphaCorr(readLabel(alphaControls.lookup("nAlphaCorr")));
-
-label nAlphaSubCycles(readLabel(alphaControls.lookup("nAlphaSubCycles")));
diff --git a/applications/solvers/multiphase/compressibleInterFoam/alphaEqn.H b/applications/solvers/multiphase/compressibleInterFoam/alphaEqn.H
deleted file mode 100644
index 8105650296f..00000000000
--- a/applications/solvers/multiphase/compressibleInterFoam/alphaEqn.H
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-    word alphaScheme("div(phi,alpha)");
-    word alpharScheme("div(phirb,alpha)");
-
-    surfaceScalarField phir(phic*mixture.nHatf());
-
-    for (int gCorr=0; gCorr<nAlphaCorr; gCorr++)
-    {
-        #include "alphaSuSp.H"
-
-        surfaceScalarField alphaPhi1
-        (
-            fvc::flux
-            (
-                phi,
-                alpha1,
-                alphaScheme
-            )
-          + fvc::flux
-            (
-                -fvc::flux(-phir, alpha2, alpharScheme),
-                alpha1,
-                alpharScheme
-            )
-        );
-
-        MULES::explicitSolve
-        (
-            geometricOneField(),
-            alpha1,
-            phi,
-            alphaPhi1,
-            Sp,
-            Su,
-            1,
-            0
-        );
-
-        surfaceScalarField rho1f(fvc::interpolate(rho1));
-        surfaceScalarField rho2f(fvc::interpolate(rho2));
-        rhoPhi = alphaPhi1*(rho1f - rho2f) + phi*rho2f;
-
-        alpha2 = scalar(1) - alpha1;
-    }
-
-    Info<< "Liquid phase volume fraction = "
-        << alpha1.weightedAverage(mesh.V()).value()
-        << "  Min(" << alpha1.name() << ") = " << min(alpha1).value()
-        << "  Min(" << alpha2.name() << ") = " << min(alpha2).value()
-        << endl;
-}
diff --git a/applications/solvers/multiphase/compressibleInterFoam/alphaEqnSubCycle.H b/applications/solvers/multiphase/compressibleInterFoam/alphaEqnSubCycle.H
deleted file mode 100644
index 54141d34a78..00000000000
--- a/applications/solvers/multiphase/compressibleInterFoam/alphaEqnSubCycle.H
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-    surfaceScalarField phic(mag(phi/mesh.magSf()));
-    phic = min(mixture.cAlpha()*phic, max(phic));
-
-    volScalarField divU(fvc::div(fvc::absolute(phi, U)));
-
-    if (nAlphaSubCycles > 1)
-    {
-        dimensionedScalar totalDeltaT = runTime.deltaT();
-        surfaceScalarField rhoPhiSum
-        (
-            IOobject
-            (
-                "rhoPhiSum",
-                runTime.timeName(),
-                mesh
-            ),
-            mesh,
-            dimensionedScalar("0", rhoPhi.dimensions(), 0)
-        );
-
-        for
-        (
-            subCycle<volScalarField> alphaSubCycle(alpha1, nAlphaSubCycles);
-            !(++alphaSubCycle).end();
-        )
-        {
-            #include "alphaEqn.H"
-            rhoPhiSum += (runTime.deltaT()/totalDeltaT)*rhoPhi;
-        }
-
-        rhoPhi = rhoPhiSum;
-    }
-    else
-    {
-        #include "alphaEqn.H"
-    }
-}
diff --git a/applications/solvers/multiphase/compressibleInterFoam/alphaSuSp.H b/applications/solvers/multiphase/compressibleInterFoam/alphaSuSp.H
index a1b383e89e2..81309cd091f 100644
--- a/applications/solvers/multiphase/compressibleInterFoam/alphaSuSp.H
+++ b/applications/solvers/multiphase/compressibleInterFoam/alphaSuSp.H
@@ -1,37 +1,43 @@
-        volScalarField::Internal Sp
-        (
-            IOobject
-            (
-                "Sp",
-                runTime.timeName(),
-                mesh
-            ),
-            mesh,
-            dimensionedScalar("Sp", dgdt.dimensions(), 0.0)
-        );
+volScalarField::Internal Sp
+(
+    IOobject
+    (
+        "Sp",
+        runTime.timeName(),
+        mesh
+    ),
+    mesh,
+    dimensionedScalar("Sp", dgdt.dimensions(), 0)
+);
 
-        volScalarField::Internal Su
-        (
-            IOobject
-            (
-                "Su",
-                runTime.timeName(),
-                mesh
-            ),
-            // Divergence term is handled explicitly to be
-            // consistent with the explicit transport solution
-            divU*min(alpha1, scalar(1))
-        );
+volScalarField::Internal Su
+(
+    IOobject
+    (
+        "Su",
+        runTime.timeName(),
+        mesh
+    ),
+    mesh,
+    dimensionedScalar("Su", dgdt.dimensions(), 0)
+);
 
-        forAll(dgdt, celli)
-        {
-            if (dgdt[celli] > 0.0 && alpha1[celli] > 0.0)
-            {
-                Sp[celli] -= dgdt[celli]*alpha1[celli];
-                Su[celli] += dgdt[celli]*alpha1[celli];
-            }
-            else if (dgdt[celli] < 0.0 && alpha1[celli] < 1.0)
-            {
-                Sp[celli] += dgdt[celli]*(1.0 - alpha1[celli]);
-            }
-        }
+forAll(dgdt, celli)
+{
+    if (dgdt[celli] > 0.0 && alpha1[celli] > 0.0)
+    {
+        Sp[celli] -= dgdt[celli]*alpha1[celli];
+        Su[celli] += dgdt[celli]*alpha1[celli];
+    }
+    else if (dgdt[celli] < 0.0 && alpha1[celli] < 1.0)
+    {
+        Sp[celli] += dgdt[celli]*(1.0 - alpha1[celli]);
+    }
+}
+
+volScalarField::Internal divU
+(
+    mesh.moving()
+  ? fvc::div(phiCN() + mesh.phi())
+  : fvc::div(phiCN())
+);
diff --git a/applications/solvers/multiphase/compressibleInterFoam/compressibleAlphaEqnSubCycle.H b/applications/solvers/multiphase/compressibleInterFoam/compressibleAlphaEqnSubCycle.H
new file mode 100644
index 00000000000..f8d0a158360
--- /dev/null
+++ b/applications/solvers/multiphase/compressibleInterFoam/compressibleAlphaEqnSubCycle.H
@@ -0,0 +1,3 @@
+{
+    #include "alphaEqnSubCycle.H"
+}
diff --git a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/Make/options b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/Make/options
index 73e50e5ef64..b44af44a723 100644
--- a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/Make/options
+++ b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/Make/options
@@ -1,6 +1,7 @@
 EXE_INC = \
+    -I. \
     -I.. \
-    -I../../interFoam \
+    -I../../VoF \
     -I../twoPhaseMixtureThermo \
     -I$(LIB_SRC)/transportModels/compressible/lnInclude \
     -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
diff --git a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/compressibleInterDyMFoam.C b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/compressibleInterDyMFoam.C
index 9f09b35184b..f82665a49e4 100644
--- a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/compressibleInterDyMFoam.C
+++ b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/compressibleInterDyMFoam.C
@@ -39,7 +39,10 @@ Description
 
 #include "fvCFD.H"
 #include "dynamicFvMesh.H"
-#include "MULES.H"
+#include "CMULES.H"
+#include "EulerDdtScheme.H"
+#include "localEulerDdtScheme.H"
+#include "CrankNicolsonDdtScheme.H"
 #include "subCycle.H"
 #include "twoPhaseMixture.H"
 #include "twoPhaseMixtureThermo.H"
@@ -47,7 +50,6 @@ Description
 #include "pimpleControl.H"
 #include "fvOptions.H"
 #include "CorrectPhi.H"
-#include "localEulerDdtScheme.H"
 #include "fvcSmooth.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -141,7 +143,7 @@ int main(int argc, char *argv[])
             }
 
             #include "alphaControls.H"
-            #include "alphaEqnSubCycle.H"
+            #include "compressibleAlphaEqnSubCycle.H"
 
             solve(fvm::ddt(rho) + fvc::div(rhoPhi));
 
diff --git a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/pEqn.H b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/pEqn.H
index d0dbfada563..7733f6a2888 100644
--- a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/pEqn.H
+++ b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterDyMFoam/pEqn.H
@@ -8,6 +8,7 @@
         fvc::flux(HbyA)
       + fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, Uf)
     );
+    MRF.makeRelative(phiHbyA);
 
     surfaceScalarField phig
     (
@@ -20,7 +21,7 @@
     phiHbyA += phig;
 
     // Update the pressure BCs to ensure flux consistency
-    constrainPressure(p_rgh, U, phiHbyA, rAUf);
+    constrainPressure(p_rgh, U, phiHbyA, rAUf, MRF);
 
     // Make the fluxes relative to the mesh motion
     fvc::makeRelative(phiHbyA, U);
diff --git a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterFoam.C b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterFoam.C
index bcc28de1bdc..f6ec5d20cd2 100644
--- a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterFoam.C
+++ b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterFoam.C
@@ -36,7 +36,10 @@ Description
 \*---------------------------------------------------------------------------*/
 
 #include "fvCFD.H"
-#include "MULES.H"
+#include "CMULES.H"
+#include "EulerDdtScheme.H"
+#include "localEulerDdtScheme.H"
+#include "CrankNicolsonDdtScheme.H"
 #include "subCycle.H"
 #include "rhoThermo.H"
 #include "twoPhaseMixture.H"
@@ -44,7 +47,6 @@ Description
 #include "turbulentFluidThermoModel.H"
 #include "pimpleControl.H"
 #include "fvOptions.H"
-#include "localEulerDdtScheme.H"
 #include "fvcSmooth.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/applications/solvers/multiphase/compressibleInterFoam/createFields.H b/applications/solvers/multiphase/compressibleInterFoam/createFields.H
index 7af8f15fe4f..9bac4d82592 100644
--- a/applications/solvers/multiphase/compressibleInterFoam/createFields.H
+++ b/applications/solvers/multiphase/compressibleInterFoam/createFields.H
@@ -63,6 +63,7 @@ dimensionedScalar pMin
 );
 
 mesh.setFluxRequired(p_rgh.name());
+mesh.setFluxRequired(alpha1.name());
 
 
 #include "readGravitationalAcceleration.H"
@@ -99,3 +100,22 @@ autoPtr<compressible::turbulenceModel> turbulence
 
 Info<< "Creating field kinetic energy K\n" << endl;
 volScalarField K("K", 0.5*magSqr(U));
+
+// MULES flux from previous time-step
+surfaceScalarField alphaPhi
+(
+    IOobject
+    (
+        "alphaPhi",
+        runTime.timeName(),
+        mesh,
+        IOobject::READ_IF_PRESENT,
+        IOobject::AUTO_WRITE
+    ),
+    phi*fvc::interpolate(alpha1)
+);
+
+// MULES Correction
+tmp<surfaceScalarField> talphaPhiCorr0;
+
+#include "createMRF.H"
diff --git a/applications/solvers/multiphase/compressibleInterFoam/pEqn.H b/applications/solvers/multiphase/compressibleInterFoam/pEqn.H
index a40a98fd0ac..51c58ba5368 100644
--- a/applications/solvers/multiphase/compressibleInterFoam/pEqn.H
+++ b/applications/solvers/multiphase/compressibleInterFoam/pEqn.H
@@ -8,6 +8,7 @@
         fvc::flux(HbyA)
       + fvc::interpolate(rho*rAU)*fvc::ddtCorr(U, phi)
     );
+    MRF.makeRelative(phiHbyA);
 
     surfaceScalarField phig
     (
@@ -20,7 +21,7 @@
     phiHbyA += phig;
 
     // Update the pressure BCs to ensure flux consistency
-    constrainPressure(p_rgh, U, phiHbyA, rAUf);
+    constrainPressure(p_rgh, U, phiHbyA, rAUf, MRF);
 
     tmp<fvScalarMatrix> p_rghEqnComp1;
     tmp<fvScalarMatrix> p_rghEqnComp2;
diff --git a/applications/solvers/multiphase/compressibleInterFoam/rhofs.H b/applications/solvers/multiphase/compressibleInterFoam/rhofs.H
new file mode 100644
index 00000000000..67dc10f3784
--- /dev/null
+++ b/applications/solvers/multiphase/compressibleInterFoam/rhofs.H
@@ -0,0 +1,2 @@
+surfaceScalarField rho1f(fvc::interpolate(rho1));
+surfaceScalarField rho2f(fvc::interpolate(rho2));
diff --git a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/Make/options b/applications/solvers/multiphase/compressibleMultiphaseInterFoam/Make/options
index f3010e0e57f..9df3add9e22 100644
--- a/applications/solvers/multiphase/compressibleMultiphaseInterFoam/Make/options
+++ b/applications/solvers/multiphase/compressibleMultiphaseInterFoam/Make/options
@@ -1,5 +1,6 @@
 EXE_INC = \
     -I. \
+    -I../VoF \
     -I../interFoam \
     -ImultiphaseMixtureThermo/lnInclude \
     -I$(LIB_SRC)/transportModels/compressible/lnInclude \
diff --git a/applications/solvers/multiphase/interFoam/Make/options b/applications/solvers/multiphase/interFoam/Make/options
index cfe4a920729..7f2fed1d162 100644
--- a/applications/solvers/multiphase/interFoam/Make/options
+++ b/applications/solvers/multiphase/interFoam/Make/options
@@ -1,4 +1,5 @@
 EXE_INC = \
+    -I../VoF \
     -I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
     -I$(LIB_SRC)/transportModels \
     -I$(LIB_SRC)/transportModels/incompressible/lnInclude \
diff --git a/applications/solvers/multiphase/interFoam/alphaSuSp.H b/applications/solvers/multiphase/interFoam/alphaSuSp.H
new file mode 100644
index 00000000000..0b8e05e1871
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/alphaSuSp.H
@@ -0,0 +1,3 @@
+zeroField Su;
+zeroField Sp;
+zeroField divU;
diff --git a/applications/solvers/multiphase/interFoam/interDyMFoam/Make/options b/applications/solvers/multiphase/interFoam/interDyMFoam/Make/options
index bceea20c814..3d028feaf7e 100644
--- a/applications/solvers/multiphase/interFoam/interDyMFoam/Make/options
+++ b/applications/solvers/multiphase/interFoam/interDyMFoam/Make/options
@@ -1,6 +1,7 @@
 EXE_INC = \
     -I. \
     -I.. \
+    -I../../VoF \
     -I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
     -I$(LIB_SRC)/transportModels \
     -I$(LIB_SRC)/transportModels/incompressible/lnInclude \
diff --git a/applications/solvers/multiphase/interFoam/interDyMFoam/pEqn.H b/applications/solvers/multiphase/interFoam/interDyMFoam/pEqn.H
index 2c7df14ae78..aafc10bcc45 100644
--- a/applications/solvers/multiphase/interFoam/interDyMFoam/pEqn.H
+++ b/applications/solvers/multiphase/interFoam/interDyMFoam/pEqn.H
@@ -28,7 +28,7 @@
     phiHbyA += phig;
 
     // Update the pressure BCs to ensure flux consistency
-    constrainPressure(p_rgh, U, phiHbyA, rAUf);
+    constrainPressure(p_rgh, U, phiHbyA, rAUf, MRF);
 
     while (pimple.correctNonOrthogonal())
     {
diff --git a/applications/solvers/multiphase/interFoam/interMixingFoam/Make/options b/applications/solvers/multiphase/interFoam/interMixingFoam/Make/options
index ce7222ff1bc..a07545b2163 100644
--- a/applications/solvers/multiphase/interFoam/interMixingFoam/Make/options
+++ b/applications/solvers/multiphase/interFoam/interMixingFoam/Make/options
@@ -1,6 +1,7 @@
 EXE_INC = \
     -I. \
     -I.. \
+    -I../../VoF \
     -I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
     -IimmiscibleIncompressibleThreePhaseMixture \
     -IincompressibleThreePhaseMixture \
diff --git a/applications/solvers/multiphase/interFoam/rhofs.H b/applications/solvers/multiphase/interFoam/rhofs.H
new file mode 100644
index 00000000000..5949bf1e0a6
--- /dev/null
+++ b/applications/solvers/multiphase/interFoam/rhofs.H
@@ -0,0 +1,2 @@
+const dimensionedScalar& rho1f(rho1);
+const dimensionedScalar& rho2f(rho2);
diff --git a/applications/solvers/multiphase/multiphaseInterFoam/Make/options b/applications/solvers/multiphase/multiphaseInterFoam/Make/options
index 99850d69be7..576e7aa224c 100644
--- a/applications/solvers/multiphase/multiphaseInterFoam/Make/options
+++ b/applications/solvers/multiphase/multiphaseInterFoam/Make/options
@@ -1,5 +1,6 @@
 EXE_INC = \
     -I. \
+    -I../VoF \
     -I../interFoam \
     -ImultiphaseMixture/lnInclude \
     -I$(LIB_SRC)/transportModels \
diff --git a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseInterDyMFoam/Make/options b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseInterDyMFoam/Make/options
index 1a210c20e68..b7d051f1ca8 100644
--- a/applications/solvers/multiphase/multiphaseInterFoam/multiphaseInterDyMFoam/Make/options
+++ b/applications/solvers/multiphase/multiphaseInterFoam/multiphaseInterDyMFoam/Make/options
@@ -1,5 +1,6 @@
 EXE_INC = \
     -I.. \
+    -I../../VoF \
     -I../../interFoam/interDyMFoam \
     -I../../interFoam \
     -I../multiphaseMixture/lnInclude \
diff --git a/applications/solvers/multiphase/twoLiquidMixingFoam/Make/options b/applications/solvers/multiphase/twoLiquidMixingFoam/Make/options
index 4dfc63419d1..e9549744cea 100644
--- a/applications/solvers/multiphase/twoLiquidMixingFoam/Make/options
+++ b/applications/solvers/multiphase/twoLiquidMixingFoam/Make/options
@@ -1,6 +1,6 @@
 EXE_INC = \
     -I. \
-    -I../interFoam \
+    -I../VoF \
     -I$(LIB_SRC)/transportModels/twoPhaseMixture/lnInclude \
     -I$(LIB_SRC)/transportModels \
     -I$(LIB_SRC)/transportModels/incompressible/lnInclude \
diff --git a/src/OpenFOAM/fields/Fields/zeroField/zeroField.H b/src/OpenFOAM/fields/Fields/zeroField/zeroField.H
index f8e53959e63..15f25f504db 100644
--- a/src/OpenFOAM/fields/Fields/zeroField/zeroField.H
+++ b/src/OpenFOAM/fields/Fields/zeroField/zeroField.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -66,6 +66,10 @@ public:
         inline scalar operator[](const label) const;
 
         inline zeroField field() const;
+
+        inline zeroField operator()() const;
+
+        inline zeroField operator-() const;
 };
 
 
diff --git a/src/OpenFOAM/fields/Fields/zeroField/zeroFieldI.H b/src/OpenFOAM/fields/Fields/zeroField/zeroFieldI.H
index fb63a48bf9e..59287815fd5 100644
--- a/src/OpenFOAM/fields/Fields/zeroField/zeroFieldI.H
+++ b/src/OpenFOAM/fields/Fields/zeroField/zeroFieldI.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -39,4 +39,80 @@ inline Foam::zeroField Foam::zeroField::field() const
 }
 
 
+inline Foam::zeroField Foam::zeroField::operator()() const
+{
+    return zeroField();
+}
+
+
+inline Foam::zeroField Foam::zeroField::operator-() const
+{
+    return zeroField();
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inline const zeroField operator+(const zeroField&, const zeroField&)
+{
+    return zeroField();
+}
+
+template<class Type>
+inline const Type& operator+(const Type& t, const zeroField&)
+{
+    return t;
+}
+
+template<class Type>
+inline const Type& operator+(const zeroField&, const Type& t)
+{
+    return t;
+}
+
+inline const zeroField operator-(const zeroField&, const zeroField&)
+{
+    return zeroField();
+}
+
+template<class Type>
+inline const Type& operator-(const Type& t, const zeroField&)
+{
+    return t;
+}
+
+template<class Type>
+inline Type operator-(const zeroField&, const Type& t)
+{
+    return -t;
+}
+
+template<class Type>
+inline zeroField operator*(const Type& t, const zeroField&)
+{
+    return zeroField();
+}
+
+template<class Type>
+inline zeroField operator*(const zeroField&, const Type& t)
+{
+    return zeroField();
+}
+
+template<class Type>
+inline zeroField operator/(const zeroField&, const Type& t)
+{
+    return zeroField();
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
 // ************************************************************************* //
diff --git a/src/OpenFOAM/fields/GeometricFields/geometricZeroField/geometricZeroField.H b/src/OpenFOAM/fields/GeometricFields/geometricZeroField/geometricZeroField.H
index 0eb7c87235d..2a9b4fe591a 100644
--- a/src/OpenFOAM/fields/GeometricFields/geometricZeroField/geometricZeroField.H
+++ b/src/OpenFOAM/fields/GeometricFields/geometricZeroField/geometricZeroField.H
@@ -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
@@ -72,6 +72,8 @@ public:
 
         inline zeroField field() const;
 
+        inline zeroField operator()() const;
+
         inline zeroField oldTime() const;
 
         inline zeroFieldField boundaryField() const;
@@ -84,7 +86,7 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-    #include "geometricZeroFieldI.H"
+#include "geometricZeroFieldI.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/OpenFOAM/fields/GeometricFields/geometricZeroField/geometricZeroFieldI.H b/src/OpenFOAM/fields/GeometricFields/geometricZeroField/geometricZeroFieldI.H
index d6188702d58..ca5d89f3f05 100644
--- a/src/OpenFOAM/fields/GeometricFields/geometricZeroField/geometricZeroFieldI.H
+++ b/src/OpenFOAM/fields/GeometricFields/geometricZeroField/geometricZeroFieldI.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -42,6 +42,11 @@ inline Foam::zeroField Foam::geometricZeroField::field() const
     return zeroField();
 }
 
+inline Foam::zeroField Foam::geometricZeroField::operator()() const
+{
+    return zeroField();
+}
+
 inline Foam::zeroField Foam::geometricZeroField::oldTime() const
 {
     return zeroField();
diff --git a/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge2D/system/controlDict b/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge2D/system/controlDict
index c1d09089d0e..dc0b7630a10 100644
--- a/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge2D/system/controlDict
+++ b/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge2D/system/controlDict
@@ -29,15 +29,15 @@ deltaT          0.0001;
 
 writeControl    adjustableRunTime;
 
-writeInterval   0.005;
+writeInterval   0.01;
 
 purgeWrite      0;
 
-writeFormat     ascii;
+writeFormat     binary;
 
 writePrecision  8;
 
-writeCompression compressed;
+writeCompression off;
 
 timeFormat      general;
 
@@ -47,10 +47,9 @@ runTimeModifiable yes;
 
 adjustTimeStep  yes;
 
-maxCo           0.25;
-
+maxCo           0.5;
+maxAlphaCo      0.5;
 maxDeltaT       1;
-maxAlphaCo      1;
 
 
 // ************************************************************************* //
diff --git a/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge2D/system/fvSolution b/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge2D/system/fvSolution
index 7c97abb05a8..041112222d9 100644
--- a/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge2D/system/fvSolution
+++ b/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge2D/system/fvSolution
@@ -17,11 +17,19 @@ FoamFile
 
 solvers
 {
-    alpha.water
+    "alpha.water.*"
     {
         nAlphaCorr      1;
-        nAlphaSubCycles 1;
+        nAlphaSubCycles 2;
         cAlpha          1;
+
+        MULESCorr       no;
+        nLimiterIter    5;
+
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-8;
+        relTol          0;
     }
 
     ".*(rho|rhoFinal)"
diff --git a/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge3D/system/controlDict b/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge3D/system/controlDict
index bb61973589f..a049876aa2b 100644
--- a/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge3D/system/controlDict
+++ b/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge3D/system/controlDict
@@ -29,7 +29,7 @@ deltaT          0.0001;
 
 writeControl    adjustableRunTime;
 
-writeInterval   0.005;
+writeInterval   0.01;
 
 purgeWrite      0;
 
@@ -47,10 +47,9 @@ runTimeModifiable yes;
 
 adjustTimeStep  yes;
 
-maxCo           0.25;
-
+maxCo           0.5;
+maxAlphaCo      0.5;
 maxDeltaT       1;
-maxAlphaCo      1;
 
 
 // ************************************************************************* //
diff --git a/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge3D/system/fvSolution b/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge3D/system/fvSolution
index f75504c6755..dac0efd3b8b 100644
--- a/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge3D/system/fvSolution
+++ b/tutorials/multiphase/compressibleInterFoam/laminar/depthCharge3D/system/fvSolution
@@ -17,11 +17,19 @@ FoamFile
 
 solvers
 {
-    alpha.water
+    "alpha.water.*"
     {
         nAlphaCorr      1;
-        nAlphaSubCycles 1;
+        nAlphaSubCycles 2;
         cAlpha          1;
+
+        MULESCorr       no;
+        nLimiterIter    5;
+
+        solver          smoothSolver;
+        smoother        symGaussSeidel;
+        tolerance       1e-8;
+        relTol          0;
     }
 
     pcorr
-- 
GitLab