diff --git a/Documentation/ProjectFile/prj/processes/process/HYDRO_MECHANICS/t_mass_lumping.md b/Documentation/ProjectFile/prj/processes/process/HYDRO_MECHANICS/t_mass_lumping.md new file mode 100644 index 0000000000000000000000000000000000000000..fb209990048c2bf38cf028265aadd0d60994b03f --- /dev/null +++ b/Documentation/ProjectFile/prj/processes/process/HYDRO_MECHANICS/t_mass_lumping.md @@ -0,0 +1 @@ +\copydoc ProcessLib::HydroMechanics::HydroMechanicsProcessData::mass_lumping diff --git a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp index c381578582e18576612e92a9bada8b56b4a0532d..b4c8cf25cf569781e375ece9b87794896f83d63b 100644 --- a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp +++ b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp @@ -131,6 +131,9 @@ std::unique_ptr<Process> createHydroMechanicsProcess( std::copy_n(b.data(), b.size(), specific_body_force.data()); } + //! \ogs_file_param{prj__processes__process__HYDRO_MECHANICS__mass_lumping} + auto mass_lumping = config.getConfigParameter<bool>("mass_lumping", false); + auto media_map = MaterialPropertyLib::createMaterialSpatialDistributionMap(media, mesh); @@ -165,7 +168,8 @@ std::unique_ptr<Process> createHydroMechanicsProcess( HydroMechanicsProcessData<DisplacementDim> process_data{ materialIDs(mesh), std::move(media_map), std::move(solid_constitutive_relations), - initial_stress, specific_body_force}; + initial_stress, specific_body_force, + mass_lumping}; SecondaryVariableCollection secondary_variables; diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h index 7138be5cf4a6247a90e1cf29c026cf8da0a9bdb5..02ba47c17fd8cead4d4fa443c4079a779161bb22 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h +++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h @@ -303,6 +303,11 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, pressure_index) .noalias() = -Kup; + if (_process_data.mass_lumping) + { + storage_p = storage_p.colwise().sum().eval().asDiagonal(); + } + // pressure equation, pressure part. local_Jac .template block<pressure_size, pressure_size>(pressure_index, diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h b/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h index 362f502ebd10abda8e3ac86d0d84b818449658cc..ddeafa5b5221ccf18e915f4b3556a436c8e034ee 100644 --- a/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h +++ b/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h @@ -55,6 +55,8 @@ struct HydroMechanicsProcessData /// A vector of displacement dimension's length. Eigen::Matrix<double, DisplacementDim, 1> const specific_body_force; + bool const mass_lumping; + MeshLib::PropertyVector<double>* pressure_interpolated = nullptr; std::array<MeshLib::PropertyVector<double>*, 3> principal_stress_vector = { nullptr, nullptr, nullptr};