From 9bda6a862c66612ec1b6a8adf1ed830e277dfd25 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <github@naumov.de>
Date: Sun, 7 Jun 2020 19:54:49 +0200
Subject: [PATCH] [PL/RM] Compute p_SR before rho_SR computation.

---
 .../RichardsMechanicsFEM-impl.h               | 23 ++++++++++++++-----
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
index 3360233067e..f3549417cde 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
@@ -657,15 +657,12 @@ void RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
         variables[static_cast<int>(MPL::Variable::temperature)] = temperature;
 
         auto& eps = _ip_data[ip].eps;
-        auto& sigma_eff = _ip_data[ip].sigma_eff;
+        auto const& sigma_eff = _ip_data[ip].sigma_eff;
         auto& S_L = _ip_data[ip].saturation;
         auto const S_L_prev = _ip_data[ip].saturation_prev;
         auto const alpha =
             solid_phase.property(MPL::PropertyType::biot_coefficient)
                 .template value<double>(variables, x_position, t, dt);
-        auto const rho_SR =
-            solid_phase.property(MPL::PropertyType::density)
-                .template value<double>(variables, x_position, t, dt);
 
         auto const C_el = _ip_data[ip].computeElasticTangentStiffness(
             t, x_position, dt, temperature);
@@ -803,6 +800,15 @@ void RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
                 displacement_index, displacement_index)
             .noalias() += B.transpose() * C * B * w;
 
+        auto const phi = _ip_data[ip].porosity;
+        double const p_FR = -chi_S_L * p_cap_ip;
+        // p_SR
+        variables[static_cast<int>(MPL::Variable::solid_grain_pressure)] =
+            p_FR - (sigma_eff + sigma_sw).dot(identity2) / (3 * (1 - phi));
+        auto const rho_SR =
+            solid_phase.property(MPL::PropertyType::density)
+                .template value<double>(variables, x_position, t, dt);
+
         double const rho = rho_SR * (1 - porosity) + S_L * porosity * rho_LR;
         local_rhs.template segment<displacement_size>(displacement_index)
             .noalias() -= (B.transpose() * (sigma_eff + sigma_sw) -
@@ -1535,10 +1541,15 @@ void RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
 
         GlobalDimMatrixType const K_over_mu = k_rel * K_intrinsic / mu;
 
+        auto const phi = _ip_data[ip].porosity;
+        auto const& sigma_eff = _ip_data[ip].sigma_eff;
+        double const p_FR = -chi_S_L * p_cap_ip;
+        // p_SR
+        variables[static_cast<int>(MPL::Variable::solid_grain_pressure)] =
+            p_FR - (sigma_eff + sigma_sw).dot(identity2) / (3 * (1 - phi));
         auto const rho_SR =
             solid_phase.property(MPL::PropertyType::density)
                 .template value<double>(variables, x_position, t, dt);
-        auto const phi = _ip_data[ip].porosity;
         _ip_data[ip].dry_density_solid = (1 - phi) * rho_SR;
         _ip_data[ip].dry_density_pellet_saturated =
             (phi - phi_tr) * rho_LR + (1 - phi) * rho_SR;
@@ -1561,7 +1572,7 @@ void RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
         porosity_avg +=
             _ip_data[ip].porosity;  // Note, this is not updated, because needs
                                     // xdot and dt to be passed.
-        sigma_avg += _ip_data[ip].sigma_eff;
+        sigma_avg += sigma_eff;
     }
     saturation_avg /= n_integration_points;
     porosity_avg /= n_integration_points;
-- 
GitLab