From 01c2a206195695d5e99bb48ef1ceb5b2af853c20 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <github@naumov.de>
Date: Wed, 8 Jul 2020 20:14:35 +0200
Subject: [PATCH] [PL] HeatConduction; Add optional mass lumping.

---
 .../processes/process/HEAT_CONDUCTION/t_mass_lumping.md   | 1 +
 ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp | 6 +++++-
 ProcessLib/HeatConduction/HeatConductionFEM.h             | 8 ++++++++
 ProcessLib/HeatConduction/HeatConductionProcessData.h     | 3 +++
 4 files changed, 17 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/ProjectFile/prj/processes/process/HEAT_CONDUCTION/t_mass_lumping.md

diff --git a/Documentation/ProjectFile/prj/processes/process/HEAT_CONDUCTION/t_mass_lumping.md b/Documentation/ProjectFile/prj/processes/process/HEAT_CONDUCTION/t_mass_lumping.md
new file mode 100644
index 00000000000..13289a8507e
--- /dev/null
+++ b/Documentation/ProjectFile/prj/processes/process/HEAT_CONDUCTION/t_mass_lumping.md
@@ -0,0 +1 @@
+\copydoc ProcessLib::HeatConduction::HeatConductionProcessData::mass_lumping
diff --git a/ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp b/ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp
index d9febf63314..3ad6b7cce0f 100644
--- a/ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp
+++ b/ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp
@@ -72,8 +72,12 @@ std::unique_ptr<Process> createHeatConductionProcess(
 
     DBUG("Use '{:s}' as density parameter.", density.name);
 
+    //! \ogs_file_param{prj__processes__process__HEAT_CONDUCTION__mass_lumping}
+    auto const mass_lumping =
+        config.getConfigParameter<bool>("mass_lumping", false);
+
     HeatConductionProcessData process_data{thermal_conductivity, heat_capacity,
-                                           density};
+                                           density, mass_lumping};
 
     SecondaryVariableCollection secondary_variables;
 
diff --git a/ProcessLib/HeatConduction/HeatConductionFEM.h b/ProcessLib/HeatConduction/HeatConductionFEM.h
index b4c7714e146..df9d2cf4186 100644
--- a/ProcessLib/HeatConduction/HeatConductionFEM.h
+++ b/ProcessLib/HeatConduction/HeatConductionFEM.h
@@ -128,6 +128,10 @@ public:
                                  sm.N * sm.detJ * wp.getWeight() *
                                  sm.integralMeasure;
         }
+        if (_process_data.mass_lumping)
+        {
+            local_M = local_M.colwise().sum().eval().asDiagonal();
+        }
     }
 
     void assembleWithJacobian(double const t, double const dt,
@@ -182,6 +186,10 @@ public:
             storage.noalias() +=
                 sm.N.transpose() * density * heat_capacity * sm.N * w;
         }
+        if (_process_data.mass_lumping)
+        {
+            storage = storage.colwise().sum().eval().asDiagonal();
+        }
 
         local_Jac.noalias() += laplace + storage / dt;
         local_rhs.noalias() -= laplace * x + storage * x_dot;
diff --git a/ProcessLib/HeatConduction/HeatConductionProcessData.h b/ProcessLib/HeatConduction/HeatConductionProcessData.h
index 3ff87770162..0801fdf0822 100644
--- a/ProcessLib/HeatConduction/HeatConductionProcessData.h
+++ b/ProcessLib/HeatConduction/HeatConductionProcessData.h
@@ -23,5 +23,8 @@ struct HeatConductionProcessData
     ParameterLib::Parameter<double> const& thermal_conductivity;
     ParameterLib::Parameter<double> const& heat_capacity;
     ParameterLib::Parameter<double> const& density;
+
+    /// If set mass lumping will be applied to the equation.
+    bool const mass_lumping;
 };
 }  // namespace ProcessLib::HeatConduction
-- 
GitLab