From b39b80bd847a8f56c58ea53d6f8126f19f5660a3 Mon Sep 17 00:00:00 2001
From: Nicolas Schwenck <nicolas.schwenck@iws.uni-stuttgart.de>
Date: Tue, 2 Dec 2014 09:28:07 +0000
Subject: [PATCH] fixed bug in potential gradient calculation with gravity in
 fractures in 2pdfm.

reviewed by Alex K.


git-svn-id: svn://svn.iws.uni-stuttgart.de/DUMUX/dumux/trunk@13832 2fb0f335-1f38-0410-981e-8018bf24f1b0
---
 dumux/implicit/2pdfm/2pdfmfluxvariables.hh | 32 ++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/dumux/implicit/2pdfm/2pdfmfluxvariables.hh b/dumux/implicit/2pdfm/2pdfmfluxvariables.hh
index e5476d9b03..9bd7cbcf48 100644
--- a/dumux/implicit/2pdfm/2pdfmfluxvariables.hh
+++ b/dumux/implicit/2pdfm/2pdfmfluxvariables.hh
@@ -214,6 +214,38 @@ private:
                     potentialGradFracture_[phaseIdx] =
                         (elemVolVars[j].pressure(phaseIdx) - elemVolVars[i].pressure(phaseIdx))
                         / diff_ij.two_norm();
+
+                    // correct the pressure gradient by the gravitational acceleration
+                    if (GET_PARAM_FROM_GROUP(TypeTag, bool, Problem, EnableGravity))
+                    {
+                        // ask for the gravitational acceleration at the given SCV face
+                        GlobalPosition g(problem.gravityAtPos(this->face().ipGlobal));
+
+                        // calculate the phase density at the integration point. we
+                        // only do this if the wetting phase is present in both cells
+                        Scalar SI = elemVolVars[this->face().i].fluidState().saturation(phaseIdx);
+                        Scalar SJ = elemVolVars[this->face().j].fluidState().saturation(phaseIdx);
+                        Scalar rhoI = elemVolVars[this->face().i].fluidState().density(phaseIdx);
+                        Scalar rhoJ = elemVolVars[this->face().j].fluidState().density(phaseIdx);
+                        Scalar fI = std::max(0.0, std::min(SI/1e-5, 0.5));
+                        Scalar fJ = std::max(0.0, std::min(SJ/1e-5, 0.5));
+                        if (fI + fJ == 0)
+                            // doesn't matter because no wetting phase is present in
+                            // both cells!
+                            fI = fJ = 0.5;
+                        const Scalar density = (fI*rhoI + fJ*rhoJ)/(fI + fJ);
+
+                        // make gravity acceleration a force
+                        GlobalPosition f(g);
+                        f *= density;
+
+                        //transform into fracture local coordinates
+                        diff_ij/=diff_ij.two_norm();
+                        Scalar fractureLocalGravityForce=diff_ij*f;
+
+                        // calculate the final potential gradient
+                        potentialGradFracture_[phaseIdx] -= fractureLocalGravityForce;
+                    }// gravity
                 }
                 else
                 {
-- 
GitLab