From 419409bd0b13317173c9ae130867fd4aed41016e Mon Sep 17 00:00:00 2001
From: Thomas Fischer <thomas.fischer@ufz.de>
Date: Thu, 30 Mar 2017 09:26:35 +0200
Subject: [PATCH] [PL/HC] Change handling of body force vector.

---
 ProcessLib/HC/CreateHCProcess.cpp | 10 +++++++++-
 ProcessLib/HC/HCFEM.h             | 12 +++++++++---
 ProcessLib/HC/HCProcessData.h     |  4 ++--
 3 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/ProcessLib/HC/CreateHCProcess.cpp b/ProcessLib/HC/CreateHCProcess.cpp
index 078fcfee26c..ac617993cdc 100644
--- a/ProcessLib/HC/CreateHCProcess.cpp
+++ b/ProcessLib/HC/CreateHCProcess.cpp
@@ -116,14 +116,22 @@ std::unique_ptr<Process> createHCProcess(
         "decay_rate", parameters, 1);
 
     // Specific body force parameter.
-    Eigen::Vector3d specific_body_force;
+    Eigen::VectorXd specific_body_force;
     std::vector<double> const b =
         //! \ogs_file_param{prj__processes__process__HC__specific_body_force}
         config.getConfigParameter<std::vector<double>>("specific_body_force");
     assert(b.size() > 0 && b.size() < 4);
+    if (b.size() < mesh.getDimension())
+        OGS_FATAL(
+            "specific body force (gravity vector) has %d components, mesh "
+            "dimension is %d",
+            b.size(), mesh.getDimension());
     bool const has_gravity = MathLib::toVector(b).norm() > 0;
     if (has_gravity)
+    {
+        specific_body_force.resize(b.size());
         std::copy_n(b.data(), b.size(), specific_body_force.data());
+    }
 
     HCProcessData process_data{
         std::move(porous_media_properties),
diff --git a/ProcessLib/HC/HCFEM.h b/ProcessLib/HC/HCFEM.h
index 6464581e7b9..11c2c65aa7c 100644
--- a/ProcessLib/HC/HCFEM.h
+++ b/ProcessLib/HC/HCFEM.h
@@ -144,7 +144,7 @@ public:
         auto p_nodal_values =
             Eigen::Map<const NodalVectorType>(&local_x[num_nodes], num_nodes);
 
-        auto const & b = _process_data.specific_body_force.head(GlobalDim);
+        auto const& b = _process_data.specific_body_force;
 
         MaterialLib::Fluid::FluidProperty::ArrayType vars;
 
@@ -212,7 +212,12 @@ public:
             GlobalDimMatrixType const K_over_mu = K / mu;
 
             GlobalDimVectorType const velocity =
-                -perm_over_visc * (dNdx * p_nodal_values - density_water * b);
+                _process_data.has_gravity
+                    ? GlobalDimVectorType(
+                          -perm_over_visc *
+                          (dNdx * p_nodal_values - density_water * b))
+                    : GlobalDimVectorType(-perm_over_visc * dNdx *
+                                          p_nodal_values);
 
             double const velocity_magnitude = velocity.norm();
             GlobalDimMatrixType const& I(
@@ -245,7 +250,8 @@ public:
                 w * N.transpose() * porosity * retardation_factor * N;
             Kpp.noalias() += w * dNdx.transpose() * perm_over_visc * dNdx;
             Mpp.noalias() += w * N.transpose() * specific_storage * N;
-            Bp += w * density_water * dNdx.transpose() * perm_over_visc * b;
+            if (_process_data.has_gravity)
+                Bp += w * density_water * dNdx.transpose() * perm_over_visc * b;
             /* with Oberbeck-Boussing assumption density difference only exists
              * in buoyancy effects */
         }
diff --git a/ProcessLib/HC/HCProcessData.h b/ProcessLib/HC/HCProcessData.h
index d92119210ff..f83c9c55ccf 100644
--- a/ProcessLib/HC/HCProcessData.h
+++ b/ProcessLib/HC/HCProcessData.h
@@ -41,7 +41,7 @@ struct HCProcessData
         ProcessLib::Parameter<double> const& solute_dispersivity_transverse_,
         ProcessLib::Parameter<double> const& retardation_factor_,
         ProcessLib::Parameter<double> const& decay_rate_,
-        Eigen::Vector3d const& specific_body_force_,
+        Eigen::VectorXd const& specific_body_force_,
         bool const has_gravity_)
         : porous_media_properties(std::move(porous_media_properties_)),
           viscosity_model(std::move(viscosity_model_)),
@@ -92,7 +92,7 @@ struct HCProcessData
     Parameter<double> const& solute_dispersivity_transverse;
     Parameter<double> const& retardation_factor;
     Parameter<double> const& decay_rate;
-    Eigen::Vector3d const specific_body_force;
+    Eigen::VectorXd const specific_body_force;
     bool const has_gravity;
 };
 
-- 
GitLab