From 61a0fb168ae03c187e68e3de638ecd0597e08daa Mon Sep 17 00:00:00 2001
From: Henry <Henry>
Date: Wed, 21 Mar 2012 17:39:07 +0000
Subject: [PATCH] twoPhaseEulerFoam/pEqn.H: use cell-based drag in momentum
 corrector

---
 .../multiphase/twoPhaseEulerFoam/pEqn.H       |  53 ++++----
 .../multiphase/twoPhaseEulerFoam/pEqn.H.old   | 118 ++++++++++++++++++
 2 files changed, 142 insertions(+), 29 deletions(-)
 create mode 100644 applications/solvers/multiphase/twoPhaseEulerFoam/pEqn.H.old

diff --git a/applications/solvers/multiphase/twoPhaseEulerFoam/pEqn.H b/applications/solvers/multiphase/twoPhaseEulerFoam/pEqn.H
index 348cc847d71..9b543bcd254 100644
--- a/applications/solvers/multiphase/twoPhaseEulerFoam/pEqn.H
+++ b/applications/solvers/multiphase/twoPhaseEulerFoam/pEqn.H
@@ -5,8 +5,8 @@
     volScalarField rAU1(1.0/U1Eqn.A());
     volScalarField rAU2(1.0/U2Eqn.A());
 
-    rAU1f = fvc::interpolate(rAU1);
-    surfaceScalarField rAU2f(fvc::interpolate(rAU2));
+    rAU1f = 1.0/fvc::interpolate(U1Eqn.A());
+    surfaceScalarField rAU2f(1.0/fvc::interpolate(U2Eqn.A()));
 
     volVectorField HbyA1("HbyA1", U1);
     HbyA1 = rAU1*U1Eqn.H();
@@ -16,39 +16,19 @@
 
     mrfZones.absoluteFlux(phi1.oldTime());
     mrfZones.absoluteFlux(phi1);
-
     mrfZones.absoluteFlux(phi2.oldTime());
     mrfZones.absoluteFlux(phi2);
 
-    surfaceScalarField phiDrag1
-    (
-        fvc::interpolate(alpha2/rho1*K*rAU1)*phi2 + rAU1f*(g & mesh.Sf())
-    );
+    surfaceScalarField ppDrag("ppDrag", 0.0*phi1);
 
     if (g0.value() > 0.0)
     {
-        phiDrag1 -= ppMagf*fvc::snGrad(alpha1)*mesh.magSf();
+        ppDrag -= ppMagf*fvc::snGrad(alpha1)*mesh.magSf();
     }
 
     if (kineticTheory.on())
     {
-        phiDrag1 -= rAU1f*fvc::snGrad(kineticTheory.pa()/rho1)*mesh.magSf();
-    }
-
-
-    surfaceScalarField phiDrag2
-    (
-        fvc::interpolate(alpha1/rho2*K*rAU2)*phi1 + rAU2f*(g & mesh.Sf())
-    );
-
-    // Fix for gravity on outlet boundary.
-    forAll(p.boundaryField(), patchi)
-    {
-        if (isA<zeroGradientFvPatchScalarField>(p.boundaryField()[patchi]))
-        {
-            phiDrag1.boundaryField()[patchi] = 0.0;
-            phiDrag2.boundaryField()[patchi] = 0.0;
-        }
+        ppDrag -= rAU1f*fvc::snGrad(kineticTheory.pa()/rho1)*mesh.magSf();
     }
 
     surfaceScalarField phiHbyA1
@@ -56,7 +36,9 @@
         "phiHbyA1",
         (fvc::interpolate(HbyA1) & mesh.Sf())
       + fvc::ddtPhiCorr(rAU1, U1, phi1)
-      + phiDrag1
+      + fvc::interpolate(alpha2/rho1*K*rAU1)*phi2
+      + ppDrag
+      + rAU1f*(g & mesh.Sf())
     );
     mrfZones.relativeFlux(phiHbyA1);
 
@@ -65,7 +47,8 @@
         "phiHbyA2",
         (fvc::interpolate(HbyA2) & mesh.Sf())
       + fvc::ddtPhiCorr(rAU2, U2, phi2)
-      + phiDrag2
+      + fvc::interpolate(alpha1/rho2*K*rAU2)*phi1
+      + rAU2f*(g & mesh.Sf())
     );
     mrfZones.relativeFlux(phiHbyA2);
 
@@ -76,6 +59,9 @@
 
     surfaceScalarField phiHbyA("phiHbyA", alpha1f*phiHbyA1 + alpha2f*phiHbyA2);
 
+    HbyA1 += alpha2*(1.0/rho1)*rAU1*K*U2;
+    HbyA2 += alpha1*(1.0/rho2)*rAU2*K*U1;
+
     surfaceScalarField Dp
     (
         "Dp",
@@ -104,10 +90,19 @@
             p.relax();
             SfGradp = pEqn.flux()/Dp;
 
-            U1 = HbyA1 + fvc::reconstruct(phiDrag1 - rAU1f*SfGradp/rho1);
+            U1 = HbyA1
+               + fvc::reconstruct
+                 (
+                     ppDrag
+                   + rAU1f*((g & mesh.Sf()) - SfGradp/rho1)
+                 );
             U1.correctBoundaryConditions();
 
-            U2 = HbyA2 + fvc::reconstruct(phiDrag2 - rAU2f*SfGradp/rho2);
+            U2 = HbyA2
+               + fvc::reconstruct
+                 (
+                     rAU2f*((g & mesh.Sf()) - SfGradp/rho2)
+                 );
             U2.correctBoundaryConditions();
 
             U = alpha1*U1 + alpha2*U2;
diff --git a/applications/solvers/multiphase/twoPhaseEulerFoam/pEqn.H.old b/applications/solvers/multiphase/twoPhaseEulerFoam/pEqn.H.old
new file mode 100644
index 00000000000..348cc847d71
--- /dev/null
+++ b/applications/solvers/multiphase/twoPhaseEulerFoam/pEqn.H.old
@@ -0,0 +1,118 @@
+{
+    surfaceScalarField alpha1f(fvc::interpolate(alpha1));
+    surfaceScalarField alpha2f(scalar(1) - alpha1f);
+
+    volScalarField rAU1(1.0/U1Eqn.A());
+    volScalarField rAU2(1.0/U2Eqn.A());
+
+    rAU1f = fvc::interpolate(rAU1);
+    surfaceScalarField rAU2f(fvc::interpolate(rAU2));
+
+    volVectorField HbyA1("HbyA1", U1);
+    HbyA1 = rAU1*U1Eqn.H();
+
+    volVectorField HbyA2("HbyA2", U2);
+    HbyA2 = rAU2*U2Eqn.H();
+
+    mrfZones.absoluteFlux(phi1.oldTime());
+    mrfZones.absoluteFlux(phi1);
+
+    mrfZones.absoluteFlux(phi2.oldTime());
+    mrfZones.absoluteFlux(phi2);
+
+    surfaceScalarField phiDrag1
+    (
+        fvc::interpolate(alpha2/rho1*K*rAU1)*phi2 + rAU1f*(g & mesh.Sf())
+    );
+
+    if (g0.value() > 0.0)
+    {
+        phiDrag1 -= ppMagf*fvc::snGrad(alpha1)*mesh.magSf();
+    }
+
+    if (kineticTheory.on())
+    {
+        phiDrag1 -= rAU1f*fvc::snGrad(kineticTheory.pa()/rho1)*mesh.magSf();
+    }
+
+
+    surfaceScalarField phiDrag2
+    (
+        fvc::interpolate(alpha1/rho2*K*rAU2)*phi1 + rAU2f*(g & mesh.Sf())
+    );
+
+    // Fix for gravity on outlet boundary.
+    forAll(p.boundaryField(), patchi)
+    {
+        if (isA<zeroGradientFvPatchScalarField>(p.boundaryField()[patchi]))
+        {
+            phiDrag1.boundaryField()[patchi] = 0.0;
+            phiDrag2.boundaryField()[patchi] = 0.0;
+        }
+    }
+
+    surfaceScalarField phiHbyA1
+    (
+        "phiHbyA1",
+        (fvc::interpolate(HbyA1) & mesh.Sf())
+      + fvc::ddtPhiCorr(rAU1, U1, phi1)
+      + phiDrag1
+    );
+    mrfZones.relativeFlux(phiHbyA1);
+
+    surfaceScalarField phiHbyA2
+    (
+        "phiHbyA2",
+        (fvc::interpolate(HbyA2) & mesh.Sf())
+      + fvc::ddtPhiCorr(rAU2, U2, phi2)
+      + phiDrag2
+    );
+    mrfZones.relativeFlux(phiHbyA2);
+
+    mrfZones.relativeFlux(phi1.oldTime());
+    mrfZones.relativeFlux(phi1);
+    mrfZones.relativeFlux(phi2.oldTime());
+    mrfZones.relativeFlux(phi2);
+
+    surfaceScalarField phiHbyA("phiHbyA", alpha1f*phiHbyA1 + alpha2f*phiHbyA2);
+
+    surfaceScalarField Dp
+    (
+        "Dp",
+        alpha1f*rAU1f/rho1 + alpha2f*rAU2f/rho2
+    );
+
+    while (pimple.correctNonOrthogonal())
+    {
+        fvScalarMatrix pEqn
+        (
+            fvm::laplacian(Dp, p) == fvc::div(phiHbyA)
+        );
+
+        pEqn.setReference(pRefCell, pRefValue);
+
+        pEqn.solve(mesh.solver(p.select(pimple.finalInnerIter())));
+
+        if (pimple.finalNonOrthogonalIter())
+        {
+            surfaceScalarField SfGradp(pEqn.flux()/Dp);
+
+            phi1 = phiHbyA1 - rAU1f*SfGradp/rho1;
+            phi2 = phiHbyA2 - rAU2f*SfGradp/rho2;
+            phi = alpha1f*phi1 + alpha2f*phi2;
+
+            p.relax();
+            SfGradp = pEqn.flux()/Dp;
+
+            U1 = HbyA1 + fvc::reconstruct(phiDrag1 - rAU1f*SfGradp/rho1);
+            U1.correctBoundaryConditions();
+
+            U2 = HbyA2 + fvc::reconstruct(phiDrag2 - rAU2f*SfGradp/rho2);
+            U2.correctBoundaryConditions();
+
+            U = alpha1*U1 + alpha2*U2;
+        }
+    }
+}
+
+#include "continuityErrs.H"
-- 
GitLab