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