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 0000000000000000000000000000000000000000..13289a8507e981c3a9aa12484cfc453c7c461804 --- /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 d9febf6331422803ef6b40227cb4b49bd1e6ac41..3ad6b7cce0f6318ef99e1573261a4b83191d6b35 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 b4c7714e146b580c35f9915bb98c0543c0fa6ca8..df9d2cf41860780fe92a193b5caf77a543107f44 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 3ff877701624cea1593760a9aba135030485d38c..0801fdf08224bbdd02c0c797ca8998c0eae47af2 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