From 3e5b2ee2ecf0de3121a00a01ebf605edd4946e51 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <dmitri.naumov@ufz.de>
Date: Wed, 27 Sep 2023 17:25:34 +0200
Subject: [PATCH] [PL] Use MaterialSpatialDistr.Map as value

The structure is small and does not require to be stored on heap.
---
 .../CreateMaterialSpatialDistributionMap.cpp  |  6 ++--
 .../CreateMaterialSpatialDistributionMap.h    |  3 +-
 .../ComponentTransportFEM.h                   | 30 +++++++++----------
 .../ComponentTransportProcessData.h           |  5 ++--
 .../CreateComponentTransportProcess.cpp       |  2 +-
 ProcessLib/HT/CreateHTProcess.cpp             |  2 +-
 ProcessLib/HT/HTFEM.h                         |  8 ++---
 ProcessLib/HT/HTProcessData.h                 |  4 +--
 ProcessLib/HT/MonolithicHTFEM.h               |  2 +-
 ProcessLib/HT/StaggeredHTFEM-impl.h           |  4 +--
 .../CreateHeatConductionProcess.cpp           |  2 +-
 ProcessLib/HeatConduction/HeatConductionFEM.h |  6 ++--
 .../HeatConductionProcessData.h               |  4 +--
 .../HeatTransportBHEProcessData.h             |  8 ++---
 .../HeatTransportBHELocalAssemblerSoil-impl.h |  2 +-
 .../CreateHydroMechanicsProcess.cpp           |  4 +--
 .../HydroMechanics/HydroMechanicsFEM-impl.h   | 14 ++++-----
 .../HydroMechanicsProcessData.h               |  3 +-
 .../LiquidFlow/CreateLiquidFlowProcess.cpp    |  2 +-
 ProcessLib/LiquidFlow/LiquidFlowData.h        | 10 ++-----
 .../LiquidFlowLocalAssembler-impl.h           | 10 +++----
 ...reateRichardsComponentTransportProcess.cpp |  2 +-
 .../RichardsComponentTransportFEM-impl.h      |  6 ++--
 .../RichardsComponentTransportProcessData.h   |  9 ++----
 .../CreateRichardsFlowProcess.cpp             |  2 +-
 ProcessLib/RichardsFlow/RichardsFlowFEM.h     |  4 +--
 .../RichardsFlow/RichardsFlowProcessData.h    | 10 ++-----
 .../RichardsMechanicsFEM-impl.h               | 10 +++----
 .../RichardsMechanicsProcessData.h            |  3 +-
 .../SmallDeformation/SmallDeformationFEM.h    |  2 +-
 .../SmallDeformationProcessData.h             |  3 +-
 .../CreateSteadyStateDiffusion.cpp            |  2 +-
 .../SteadyStateDiffusionData.h                |  3 +-
 .../SteadyStateDiffusionFEM.h                 |  6 ++--
 .../StokesFlow/CreateStokesFlowProcess.cpp    |  2 +-
 ProcessLib/StokesFlow/StokesFlowFEM.h         |  2 +-
 ProcessLib/StokesFlow/StokesFlowProcessData.h |  9 +-----
 ProcessLib/TH2M/TH2MFEM-impl.h                |  4 +--
 ProcessLib/TH2M/TH2MProcessData.h             |  3 +-
 ...malTwoPhaseFlowWithPPLocalAssembler-impl.h |  2 +-
 .../ThermalTwoPhaseFlowWithPPProcessData.h    |  3 +-
 .../ThermoHydroMechanicsFEM-impl.h            |  6 ++--
 .../ThermoHydroMechanicsProcessData.h         |  3 +-
 .../ThermoMechanics/ThermoMechanicsFEM-impl.h |  6 ++--
 .../ThermoMechanicsProcessData.h              |  3 +-
 .../ThermoRichardsFlowFEM-impl.h              | 10 +++----
 .../ThermoRichardsFlowProcessData.h           | 10 ++-----
 .../ThermoRichardsMechanicsFEM-impl.h         |  6 ++--
 .../ThermoRichardsMechanicsFEM.h              |  2 +-
 .../ThermoRichardsMechanicsProcessData.h      |  3 +-
 .../TwoPhaseFlowWithPPLocalAssembler-impl.h   |  2 +-
 .../TwoPhaseFlowWithPPProcessData.h           |  3 +-
 52 files changed, 113 insertions(+), 159 deletions(-)

diff --git a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp
index e5b1651bfa1..afa6cd7f8b0 100644
--- a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp
+++ b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp
@@ -15,8 +15,7 @@
 
 namespace MaterialPropertyLib
 {
-std::unique_ptr<MaterialSpatialDistributionMap>
-createMaterialSpatialDistributionMap(
+MaterialSpatialDistributionMap createMaterialSpatialDistributionMap(
     std::map<int, std::shared_ptr<Medium>> const& media,
     MeshLib::Mesh const& mesh)
 {
@@ -45,7 +44,6 @@ createMaterialSpatialDistributionMap(
             "in the mesh.",
             media.size(), max_material_id - 1);
     }
-    return std::make_unique<MaterialSpatialDistributionMap>(media,
-                                                            material_ids);
+    return {media, material_ids};
 }
 }  // namespace MaterialPropertyLib
diff --git a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h
index 05ed6b64b64..9f946d4b2a4 100644
--- a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h
+++ b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h
@@ -24,8 +24,7 @@ class MaterialSpatialDistributionMap;
 
 class Medium;
 
-std::unique_ptr<MaterialSpatialDistributionMap>
-createMaterialSpatialDistributionMap(
+MaterialSpatialDistributionMap createMaterialSpatialDistributionMap(
     std::map<int, std::shared_ptr<Medium>> const& media,
     MeshLib::Mesh const& mesh);
 }  // namespace MaterialPropertyLib
diff --git a/ProcessLib/ComponentTransport/ComponentTransportFEM.h b/ProcessLib/ComponentTransport/ComponentTransportFEM.h
index ce87c55479b..6bfb29afcbc 100644
--- a/ProcessLib/ComponentTransport/ComponentTransportFEM.h
+++ b/ProcessLib/ComponentTransport/ComponentTransportFEM.h
@@ -268,7 +268,7 @@ public:
                                       GlobalDim>(element, is_axially_symmetric,
                                                  _integration_method);
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         for (unsigned ip = 0; ip < n_integration_points; ip++)
         {
             _ip_data.emplace_back(
@@ -314,7 +314,7 @@ public:
         assert(_process_data.chemical_solver_interface);
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
 
         ParameterLib::SpatialPosition pos;
         pos.setElementID(_element.getID());
@@ -355,7 +355,7 @@ public:
         assert(_process_data.chemical_solver_interface);
 
         auto const& medium =
-            _process_data.media_map->getMedium(_element.getID());
+            _process_data.media_map.getMedium(_element.getID());
 
         MaterialPropertyLib::VariableArray vars;
         MaterialPropertyLib::VariableArray vars_prev;
@@ -417,7 +417,7 @@ public:
             return;
         }
 
-        auto const& medium = *_process_data.media_map->getMedium(ele_id);
+        auto const& medium = *_process_data.media_map.getMedium(ele_id);
 
         ParameterLib::SpatialPosition pos;
         pos.setElementID(ele_id);
@@ -566,7 +566,7 @@ public:
 
         // Get material properties
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         // Select the only valid for component transport liquid phase.
         auto const& phase = medium.phase("AqueousLiquid");
 
@@ -738,7 +738,7 @@ public:
         MaterialPropertyLib::VariableArray vars;
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& phase = medium.phase("AqueousLiquid");
         auto const& component = phase.component(
             _transport_process_variables[component_id].get().getName());
@@ -822,7 +822,7 @@ public:
                 .projected_specific_body_force_vectors[_element.getID()];
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& phase = medium.phase("AqueousLiquid");
 
         MaterialPropertyLib::VariableArray vars;
@@ -961,7 +961,7 @@ public:
         MaterialPropertyLib::VariableArray vars_prev;
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& phase = medium.phase("AqueousLiquid");
         // Hydraulic process id is 0 and thus transport process id starts
         // from 1.
@@ -1161,7 +1161,7 @@ public:
                 .projected_specific_body_force_vectors[_element.getID()];
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& phase = medium.phase("AqueousLiquid");
 
         MaterialPropertyLib::VariableArray vars;
@@ -1283,7 +1283,7 @@ public:
         MaterialPropertyLib::VariableArray vars_prev;
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& phase = medium.phase("AqueousLiquid");
         auto const& component = phase.component(
             _transport_process_variables[component_id].get().getName());
@@ -1409,7 +1409,7 @@ public:
         MaterialPropertyLib::VariableArray vars_prev;
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const component_id = transport_process_id - 1;
         for (unsigned ip(0); ip < n_integration_points; ++ip)
         {
@@ -1525,7 +1525,7 @@ public:
         MaterialPropertyLib::VariableArray vars;
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& phase = medium.phase("AqueousLiquid");
 
         for (unsigned ip = 0; ip < n_integration_points; ++ip)
@@ -1607,7 +1607,7 @@ public:
         MaterialPropertyLib::VariableArray vars;
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& phase = medium.phase("AqueousLiquid");
 
         // local_x contains the local concentration and pressure values
@@ -1676,7 +1676,7 @@ public:
 
         if (_process_data.chemically_induced_porosity_change)
         {
-            auto const& medium = *_process_data.media_map->getMedium(ele_id);
+            auto const& medium = *_process_data.media_map.getMedium(ele_id);
 
             for (auto& ip_data : _ip_data)
             {
@@ -1748,7 +1748,7 @@ public:
         MaterialPropertyLib::VariableArray vars;
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& phase = medium.phase("AqueousLiquid");
 
         int const component_id = 0;
diff --git a/ProcessLib/ComponentTransport/ComponentTransportProcessData.h b/ProcessLib/ComponentTransport/ComponentTransportProcessData.h
index 173dbe584e7..7dadd0c9640 100644
--- a/ProcessLib/ComponentTransport/ComponentTransportProcessData.h
+++ b/ProcessLib/ComponentTransport/ComponentTransportProcessData.h
@@ -15,7 +15,7 @@
 
 #include "ChemistryLib/ChemicalSolverInterface.h"
 #include "LookupTable.h"
-#include "MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h"
+#include "MaterialLib/MPL/MaterialSpatialDistributionMap.h"
 #include "MathLib/LinAlg/Eigen/EigenMapTools.h"
 #include "NumLib/NumericalStability/NumericalStabilization.h"
 #include "ParameterLib/ConstantParameter.h"
@@ -38,8 +38,7 @@ namespace ComponentTransport
 {
 struct ComponentTransportProcessData
 {
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
     bool const has_gravity;
     bool const non_advective_form;
     /// This optional tag provides a simple means of considering the temperature
diff --git a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp
index c203dab5051..b0069d927c0 100644
--- a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp
+++ b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp
@@ -235,7 +235,7 @@ std::unique_ptr<Process> createComponentTransportProcess(
         process_variables);
 
     DBUG("Check the media properties of ComponentTransport process ...");
-    checkMPLProperties(mesh, *media_map);
+    checkMPLProperties(mesh, media_map);
     DBUG("Media properties verified.");
 
     auto stabilizer = NumLib::createNumericalStabilization(mesh, config);
diff --git a/ProcessLib/HT/CreateHTProcess.cpp b/ProcessLib/HT/CreateHTProcess.cpp
index b5f0862f80f..59daec2658f 100644
--- a/ProcessLib/HT/CreateHTProcess.cpp
+++ b/ProcessLib/HT/CreateHTProcess.cpp
@@ -181,7 +181,7 @@ std::unique_ptr<Process> createHTProcess(
         MaterialPropertyLib::createMaterialSpatialDistributionMap(media, mesh);
 
     DBUG("Check the media properties of HT process ...");
-    checkMPLProperties(mesh, *media_map);
+    checkMPLProperties(mesh, media_map);
     DBUG("Media properties verified.");
 
     auto stabilizer = NumLib::createNumericalStabilization(mesh, config);
diff --git a/ProcessLib/HT/HTFEM.h b/ProcessLib/HT/HTFEM.h
index a34db67b82b..36fb68354c4 100644
--- a/ProcessLib/HT/HTFEM.h
+++ b/ProcessLib/HT/HTFEM.h
@@ -125,7 +125,7 @@ public:
         vars.phase_pressure = p_int_pt;
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& liquid_phase = medium.phase("AqueousLiquid");
 
         // TODO (naumov) Temporary value not used by current material models.
@@ -181,7 +181,7 @@ protected:
         double const dt)
     {
         auto const& medium =
-            *_process_data.media_map->getMedium(this->_element.getID());
+            *_process_data.media_map.getMedium(this->_element.getID());
         auto const& solid_phase = medium.phase("Solid");
 
         auto const specific_heat_capacity_solid =
@@ -206,7 +206,7 @@ protected:
         double const dt)
     {
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
 
         auto thermal_conductivity =
             MaterialPropertyLib::formEigenTensor<GlobalDim>(
@@ -267,7 +267,7 @@ protected:
             &local_p[0], ShapeFunction::NPOINTS);
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& liquid_phase = medium.phase("AqueousLiquid");
 
         for (unsigned ip = 0; ip < n_integration_points; ++ip)
diff --git a/ProcessLib/HT/HTProcessData.h b/ProcessLib/HT/HTProcessData.h
index c76d32b7d12..cfa3662ec2d 100644
--- a/ProcessLib/HT/HTProcessData.h
+++ b/ProcessLib/HT/HTProcessData.h
@@ -11,7 +11,6 @@
 #pragma once
 
 #include <Eigen/Core>
-#include <memory>
 #include <utility>
 
 #include "MaterialLib/MPL/MaterialSpatialDistributionMap.h"
@@ -25,8 +24,7 @@ namespace HT
 {
 struct HTProcessData final
 {
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
     bool const has_fluid_thermal_expansion;
     ParameterLib::Parameter<double> const& solid_thermal_expansion;
     ParameterLib::Parameter<double> const& biot_constant;
diff --git a/ProcessLib/HT/MonolithicHTFEM.h b/ProcessLib/HT/MonolithicHTFEM.h
index 40e6cb9e473..42e632bd120 100644
--- a/ProcessLib/HT/MonolithicHTFEM.h
+++ b/ProcessLib/HT/MonolithicHTFEM.h
@@ -104,7 +104,7 @@ public:
             &local_x[pressure_index], pressure_size);
 
         auto const& medium =
-            *process_data.media_map->getMedium(this->_element.getID());
+            *process_data.media_map.getMedium(this->_element.getID());
         auto const& liquid_phase = medium.phase("AqueousLiquid");
         auto const& solid_phase = medium.phase("Solid");
 
diff --git a/ProcessLib/HT/StaggeredHTFEM-impl.h b/ProcessLib/HT/StaggeredHTFEM-impl.h
index 053e96b8359..f123ad7411f 100644
--- a/ProcessLib/HT/StaggeredHTFEM-impl.h
+++ b/ProcessLib/HT/StaggeredHTFEM-impl.h
@@ -66,7 +66,7 @@ void StaggeredHTFEM<ShapeFunction, GlobalDim>::assembleHydraulicEquation(
 
     auto const& process_data = this->_process_data;
     auto const& medium =
-        *this->_process_data.media_map->getMedium(this->_element.getID());
+        *this->_process_data.media_map.getMedium(this->_element.getID());
     auto const& liquid_phase = medium.phase("AqueousLiquid");
     auto const& solid_phase = medium.phase("Solid");
 
@@ -192,7 +192,7 @@ void StaggeredHTFEM<ShapeFunction, GlobalDim>::assembleHeatTransportEquation(
 
     auto const& process_data = this->_process_data;
     auto const& medium =
-        *process_data.media_map->getMedium(this->_element.getID());
+        *process_data.media_map.getMedium(this->_element.getID());
     auto const& liquid_phase = medium.phase("AqueousLiquid");
 
     auto const& b =
diff --git a/ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp b/ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp
index d14037c3a52..03853c0a2e0 100644
--- a/ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp
+++ b/ProcessLib/HeatConduction/CreateHeatConductionProcess.cpp
@@ -71,7 +71,7 @@ std::unique_ptr<Process> createHeatConductionProcess(
         MaterialPropertyLib::createMaterialSpatialDistributionMap(media, mesh);
 
     DBUG("Check the media properties of heat conduction process ...");
-    checkMPLProperties(mesh, *media_map);
+    checkMPLProperties(mesh, media_map);
     DBUG("Media properties verified.");
 
     /// \section parametersheatconduction Process Parameters
diff --git a/ProcessLib/HeatConduction/HeatConductionFEM.h b/ProcessLib/HeatConduction/HeatConductionFEM.h
index 74cb85a0fce..f364a3f5edc 100644
--- a/ProcessLib/HeatConduction/HeatConductionFEM.h
+++ b/ProcessLib/HeatConduction/HeatConductionFEM.h
@@ -102,7 +102,7 @@ public:
             _integration_method.getNumberOfPoints();
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         MaterialPropertyLib::VariableArray vars;
 
         for (unsigned ip = 0; ip < n_integration_points; ip++)
@@ -185,7 +185,7 @@ public:
         pos.setElementID(_element.getID());
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         MaterialPropertyLib::VariableArray vars;
 
         for (unsigned ip = 0; ip < n_integration_points; ip++)
@@ -260,7 +260,7 @@ public:
         pos.setElementID(_element.getID());
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         MaterialPropertyLib::VariableArray vars;
 
         double const dt = std::numeric_limits<double>::quiet_NaN();
diff --git a/ProcessLib/HeatConduction/HeatConductionProcessData.h b/ProcessLib/HeatConduction/HeatConductionProcessData.h
index 714ddf6c349..d14418b3f66 100644
--- a/ProcessLib/HeatConduction/HeatConductionProcessData.h
+++ b/ProcessLib/HeatConduction/HeatConductionProcessData.h
@@ -10,15 +10,13 @@
 
 #pragma once
 
-#include <memory>
 #include "MaterialLib/MPL/MaterialSpatialDistributionMap.h"
 
 namespace ProcessLib::HeatConduction
 {
 struct HeatConductionProcessData
 {
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 
     /// If set mass lumping will be applied to the equation.
     bool const mass_lumping;
diff --git a/ProcessLib/HeatTransportBHE/HeatTransportBHEProcessData.h b/ProcessLib/HeatTransportBHE/HeatTransportBHEProcessData.h
index d8af776ae2e..1490d565760 100644
--- a/ProcessLib/HeatTransportBHE/HeatTransportBHEProcessData.h
+++ b/ProcessLib/HeatTransportBHE/HeatTransportBHEProcessData.h
@@ -26,22 +26,20 @@ namespace ProcessLib::HeatTransportBHE
 struct HeatTransportBHEProcessData final
 {
     HeatTransportBHEProcessData(
-        std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>&&
-            media_map_,
+        MaterialPropertyLib::MaterialSpatialDistributionMap media_map_,
         std::vector<BHE::BHETypes>&& vec_BHEs_,
         BHEInflowPythonBoundaryConditionPythonSideInterface* py_bc_object_ =
             nullptr,
         const bool use_tespy = false,
         const bool use_server_communication = false)
-        : media_map(std::move(media_map_)),
+        : media_map(media_map_),
           _vec_BHE_property(std::move(vec_BHEs_)),
           py_bc_object(py_bc_object_),
           _use_tespy(use_tespy),
           _use_server_communication(use_server_communication)
     {
     }
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 
     std::vector<BHE::BHETypes> _vec_BHE_property;
 
diff --git a/ProcessLib/HeatTransportBHE/LocalAssemblers/HeatTransportBHELocalAssemblerSoil-impl.h b/ProcessLib/HeatTransportBHE/LocalAssemblers/HeatTransportBHELocalAssemblerSoil-impl.h
index ab7aa2aaa59..9e2d23f7e29 100644
--- a/ProcessLib/HeatTransportBHE/LocalAssemblers/HeatTransportBHELocalAssemblerSoil-impl.h
+++ b/ProcessLib/HeatTransportBHE/LocalAssemblers/HeatTransportBHELocalAssemblerSoil-impl.h
@@ -85,7 +85,7 @@ void HeatTransportBHELocalAssemblerSoil<ShapeFunction>::assemble(
     ParameterLib::SpatialPosition pos;
     pos.setElementID(_element_id);
 
-    auto const& medium = *_process_data.media_map->getMedium(_element_id);
+    auto const& medium = *_process_data.media_map.getMedium(_element_id);
     auto const& solid_phase = medium.phase("Solid");
     auto const& liquid_phase = medium.phase("AqueousLiquid");
 
diff --git a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp
index 35dc9873386..a2fba3a9c57 100644
--- a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp
+++ b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp
@@ -216,8 +216,8 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
 
     for (auto const& element_id : mesh.getElements() | MeshLib::views::ids)
     {
-        media_map->checkElementHasMedium(element_id);
-        auto const& medium = *media_map->getMedium(element_id);
+        media_map.checkElementHasMedium(element_id);
+        auto const& medium = *media_map.getMedium(element_id);
         checkRequiredProperties(medium, requiredMediumProperties);
         checkRequiredProperties(fluidPhase(medium), requiredFluidProperties);
         checkRequiredProperties(medium.phase("Solid"), requiredSolidProperties);
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h
index 1fd0979fc11..ddde9d3d8ab 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h
+++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h
@@ -182,7 +182,7 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement,
         _integration_method.getNumberOfPoints();
 
     auto const& b = _process_data.specific_body_force;
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     auto const& solid = medium->phase("Solid");
     auto const& fluid = fluidPhase(*medium);
     MPL::VariableArray vars;
@@ -408,7 +408,7 @@ std::vector<double> const& HydroMechanicsLocalAssembler<
     ParameterLib::SpatialPosition x_position;
     x_position.setElementID(_element.getID());
 
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     auto const& fluid = fluidPhase(*medium);
     MPL::VariableArray vars;
 
@@ -530,7 +530,7 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement,
     ParameterLib::SpatialPosition x_position;
     x_position.setElementID(_element.getID());
 
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     auto const& fluid = fluidPhase(*medium);
     MPL::VariableArray vars;
 
@@ -691,7 +691,7 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement,
     ParameterLib::SpatialPosition x_position;
     x_position.setElementID(_element.getID());
 
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     auto const& solid = medium->phase("Solid");
     auto const& fluid = fluidPhase(*medium);
     MPL::VariableArray vars;
@@ -908,7 +908,7 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement,
         x_position.setElementID(_element.getID());
 
         auto const& medium =
-            _process_data.media_map->getMedium(_element.getID());
+            _process_data.media_map.getMedium(_element.getID());
 
         auto const T_ref =
             medium->property(MPL::PropertyType::reference_temperature)
@@ -986,7 +986,7 @@ void HydroMechanicsLocalAssembler<
                     _element.getID());
 
             auto const& medium =
-                _process_data.media_map->getMedium(_element.getID());
+                _process_data.media_map.getMedium(_element.getID());
             MPL::VariableArray vars;
 
             auto const T_ref =
@@ -1156,7 +1156,7 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement,
     unsigned const n_integration_points =
         _integration_method.getNumberOfPoints();
 
-    auto const& medium = _process_data.media_map->getMedium(elem_id);
+    auto const& medium = _process_data.media_map.getMedium(elem_id);
     MPL::VariableArray vars;
 
     SymmetricTensor k_sum = SymmetricTensor::Zero(KelvinVectorSize);
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h b/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h
index 25a334af0c8..6875355da40 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h
+++ b/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h
@@ -61,8 +61,7 @@ struct HydroMechanicsProcessData
 {
     MeshLib::PropertyVector<int> const* const material_ids = nullptr;
 
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map = nullptr;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 
     /// The constitutive relation for the mechanical part.
     std::map<int, std::unique_ptr<
diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp b/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp
index 3e6cd606ee7..7a2cd406b25 100644
--- a/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp
+++ b/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp
@@ -129,7 +129,7 @@ std::unique_ptr<Process> createLiquidFlowProcess(
     }
 
     DBUG("Check the media properties of LiquidFlow process ...");
-    checkMPLProperties(mesh, *media_map);
+    checkMPLProperties(mesh, media_map);
     DBUG("Media properties verified.");
 
     auto const* aperture_size_parameter = &ParameterLib::findParameter<double>(
diff --git a/ProcessLib/LiquidFlow/LiquidFlowData.h b/ProcessLib/LiquidFlow/LiquidFlowData.h
index bf8a1bd3278..b97982db23e 100644
--- a/ProcessLib/LiquidFlow/LiquidFlowData.h
+++ b/ProcessLib/LiquidFlow/LiquidFlowData.h
@@ -11,23 +11,17 @@
 #pragma once
 
 #include <Eigen/Core>
-#include <memory>
 
+#include "MaterialLib/MPL/MaterialSpatialDistributionMap.h"
 #include "ParameterLib/Parameter.h"
 
-namespace MaterialPropertyLib
-{
-class MaterialSpatialDistributionMap;
-}
-
 namespace ProcessLib
 {
 namespace LiquidFlow
 {
 struct LiquidFlowData final
 {
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 
     /// A vector of the rotation matrices for all elements.
     std::vector<Eigen::MatrixXd> const element_rotation_matrices;
diff --git a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h
index 3f74cb05240..5f3bffe46f4 100644
--- a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h
+++ b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler-impl.h
@@ -32,7 +32,7 @@ void LiquidFlowLocalAssembler<ShapeFunction, GlobalDim>::assemble(
     ParameterLib::SpatialPosition pos;
     pos.setElementID(_element.getID());
 
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     MaterialPropertyLib::VariableArray vars;
     vars.temperature =
         medium[MaterialPropertyLib::PropertyType::reference_temperature]
@@ -80,7 +80,7 @@ Eigen::Vector3d LiquidFlowLocalAssembler<ShapeFunction, GlobalDim>::getFlux(
     ParameterLib::SpatialPosition pos;
     pos.setElementID(_element.getID());
 
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     auto const& liquid_phase = medium.phase("AqueousLiquid");
 
     MaterialPropertyLib::VariableArray vars;
@@ -130,7 +130,7 @@ void LiquidFlowLocalAssembler<ShapeFunction, GlobalDim>::
     ParameterLib::SpatialPosition pos;
     pos.setElementID(_element.getID());
 
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     auto const& liquid_phase = medium.phase("AqueousLiquid");
 
     MaterialPropertyLib::VariableArray vars;
@@ -235,7 +235,7 @@ LiquidFlowLocalAssembler<ShapeFunction, GlobalDim>::getIntPtDarcyVelocity(
     ParameterLib::SpatialPosition pos;
     pos.setElementID(_element.getID());
 
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     MaterialPropertyLib::VariableArray vars;
     vars.temperature =
         medium[MaterialPropertyLib::PropertyType::reference_temperature]
@@ -279,7 +279,7 @@ void LiquidFlowLocalAssembler<ShapeFunction, GlobalDim>::
     unsigned const n_integration_points =
         _integration_method.getNumberOfPoints();
 
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     auto const& liquid_phase = medium.phase("AqueousLiquid");
 
     MaterialPropertyLib::VariableArray vars;
diff --git a/ProcessLib/RichardsComponentTransport/CreateRichardsComponentTransportProcess.cpp b/ProcessLib/RichardsComponentTransport/CreateRichardsComponentTransportProcess.cpp
index 4af0e66b0a9..aa3b3f844ab 100644
--- a/ProcessLib/RichardsComponentTransport/CreateRichardsComponentTransportProcess.cpp
+++ b/ProcessLib/RichardsComponentTransport/CreateRichardsComponentTransportProcess.cpp
@@ -152,7 +152,7 @@ std::unique_ptr<Process> createRichardsComponentTransportProcess(
 
     DBUG(
         "Check the media properties of RichardsComponentTransport process ...");
-    checkMPLProperties(mesh, *media_map);
+    checkMPLProperties(mesh, media_map);
     DBUG("Media properties verified.");
 
     RichardsComponentTransportProcessData process_data{
diff --git a/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM-impl.h b/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM-impl.h
index 5ce660c1f86..84c7c86843b 100644
--- a/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM-impl.h
+++ b/ProcessLib/RichardsComponentTransport/RichardsComponentTransportFEM-impl.h
@@ -94,7 +94,7 @@ void LocalAssemblerData<ShapeFunction, GlobalDim>::assemble(
         GlobalDimMatrixType::Identity(GlobalDim, GlobalDim));
 
     // Get material properties
-    auto const& medium = *_process_data.media_map->getMedium(_element_id);
+    auto const& medium = *_process_data.media_map.getMedium(_element_id);
     auto const& phase = medium.phase("AqueousLiquid");
     auto const& component =
         phase.component(_transport_process_variable.getName());
@@ -254,7 +254,7 @@ LocalAssemblerData<ShapeFunction, GlobalDim>::getIntPtDarcyVelocity(
     MaterialPropertyLib::VariableArray vars;
 
     // Get material properties
-    auto const& medium = *_process_data.media_map->getMedium(_element_id);
+    auto const& medium = *_process_data.media_map.getMedium(_element_id);
     auto const& phase = medium.phase("AqueousLiquid");
 
     auto const p_nodal_values = Eigen::Map<const NodalVectorType>(
@@ -329,7 +329,7 @@ LocalAssemblerData<ShapeFunction, GlobalDim>::getIntPtSaturation(
 
     MaterialPropertyLib::VariableArray vars;
 
-    auto const& medium = *_process_data.media_map->getMedium(_element_id);
+    auto const& medium = *_process_data.media_map.getMedium(_element_id);
 
     unsigned const n_integration_points =
         _integration_method.getNumberOfPoints();
diff --git a/ProcessLib/RichardsComponentTransport/RichardsComponentTransportProcessData.h b/ProcessLib/RichardsComponentTransport/RichardsComponentTransportProcessData.h
index 85448a28922..420798de9d6 100644
--- a/ProcessLib/RichardsComponentTransport/RichardsComponentTransportProcessData.h
+++ b/ProcessLib/RichardsComponentTransport/RichardsComponentTransportProcessData.h
@@ -11,12 +11,8 @@
 #pragma once
 
 #include <Eigen/Core>
-#include <memory>
 
-namespace MaterialPropertyLib
-{
-class MaterialSpatialDistributionMap;
-}
+#include "MaterialLib/MPL/MaterialSpatialDistributionMap.h"
 
 namespace ProcessLib
 {
@@ -24,8 +20,7 @@ namespace RichardsComponentTransport
 {
 struct RichardsComponentTransportProcessData
 {
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
     Eigen::VectorXd const specific_body_force;
     bool const has_gravity;
 };
diff --git a/ProcessLib/RichardsFlow/CreateRichardsFlowProcess.cpp b/ProcessLib/RichardsFlow/CreateRichardsFlowProcess.cpp
index 7b977846acd..9a8b7d07058 100644
--- a/ProcessLib/RichardsFlow/CreateRichardsFlowProcess.cpp
+++ b/ProcessLib/RichardsFlow/CreateRichardsFlowProcess.cpp
@@ -106,7 +106,7 @@ std::unique_ptr<Process> createRichardsFlowProcess(
         MaterialPropertyLib::createMaterialSpatialDistributionMap(media, mesh);
 
     DBUG("Check the media properties of RichardsFlow process ...");
-    checkMPLProperties(mesh, *media_map);
+    checkMPLProperties(mesh, media_map);
     DBUG("Media properties verified.");
 
     RichardsFlowProcessData process_data{
diff --git a/ProcessLib/RichardsFlow/RichardsFlowFEM.h b/ProcessLib/RichardsFlow/RichardsFlowFEM.h
index 846d6f9c3ea..270863bcef7 100644
--- a/ProcessLib/RichardsFlow/RichardsFlowFEM.h
+++ b/ProcessLib/RichardsFlow/RichardsFlowFEM.h
@@ -158,7 +158,7 @@ public:
         pos.setElementID(_element.getID());
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& liquid_phase = medium.phase("AqueousLiquid");
         MaterialPropertyLib::VariableArray vars;
         vars.temperature =
@@ -290,7 +290,7 @@ public:
         pos.setElementID(_element.getID());
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& liquid_phase = medium.phase("AqueousLiquid");
 
         MaterialPropertyLib::VariableArray vars;
diff --git a/ProcessLib/RichardsFlow/RichardsFlowProcessData.h b/ProcessLib/RichardsFlow/RichardsFlowProcessData.h
index 95d2fb5aab2..6075b7a50fe 100644
--- a/ProcessLib/RichardsFlow/RichardsFlowProcessData.h
+++ b/ProcessLib/RichardsFlow/RichardsFlowProcessData.h
@@ -10,12 +10,9 @@
 
 #pragma once
 
-#include <memory>
+#include <Eigen/Core>
 
-namespace MaterialPropertyLib
-{
-class MaterialSpatialDistributionMap;
-}
+#include "MaterialLib/MPL/MaterialSpatialDistributionMap.h"
 
 namespace ProcessLib
 {
@@ -23,8 +20,7 @@ namespace RichardsFlow
 {
 struct RichardsFlowProcessData
 {
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
     Eigen::VectorXd const specific_body_force;
     bool const has_gravity;
     bool const has_mass_lumping;
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
index c6f55bb5bfa..73ffda62eb7 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
@@ -149,7 +149,7 @@ RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
             _process_data.solid_materials, _process_data.material_ids,
             e.getID());
 
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
 
     ParameterLib::SpatialPosition x_position;
     x_position.setElementID(_element.getID());
@@ -293,7 +293,7 @@ void RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
                                   pressure_size);
 
     constexpr double dt = std::numeric_limits<double>::quiet_NaN();
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     MPL::VariableArray variables;
 
     ParameterLib::SpatialPosition x_position;
@@ -406,7 +406,7 @@ void RichardsMechanicsLocalAssembler<
         MathLib::KelvinVector::kelvin_vector_dimensions(
             DisplacementDim)>::identity2;
 
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     auto const& liquid_phase = medium->phase("AqueousLiquid");
     auto const& solid_phase = medium->phase("Solid");
     MPL::VariableArray variables;
@@ -760,7 +760,7 @@ void RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
             pressure_size, displacement_size>::Zero(pressure_size,
                                                     displacement_size);
 
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     auto const& liquid_phase = medium->phase("AqueousLiquid");
     auto const& solid_phase = medium->phase("Solid");
     MPL::VariableArray variables;
@@ -1530,7 +1530,7 @@ void RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
         MathLib::KelvinVector::kelvin_vector_dimensions(
             DisplacementDim)>::identity2;
 
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     auto const& liquid_phase = medium->phase("AqueousLiquid");
     auto const& solid_phase = medium->phase("Solid");
     MPL::VariableArray variables;
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h b/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h
index bf7c803f269..91def3102e4 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcessData.h
@@ -35,8 +35,7 @@ struct RichardsMechanicsProcessData
 {
     MeshLib::PropertyVector<int> const* const material_ids = nullptr;
 
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map = nullptr;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 
     /// The constitutive relation for the mechanical part.
     std::map<int, std::unique_ptr<
diff --git a/ProcessLib/SmallDeformation/SmallDeformationFEM.h b/ProcessLib/SmallDeformation/SmallDeformationFEM.h
index 759173f8400..d69d1ac738d 100644
--- a/ProcessLib/SmallDeformation/SmallDeformationFEM.h
+++ b/ProcessLib/SmallDeformation/SmallDeformationFEM.h
@@ -274,7 +274,7 @@ public:
             ip_data) const
     {
         auto const& solid_phase =
-            this->_process_data.media_map->getMedium(this->_element.getID())
+            this->_process_data.media_map.getMedium(this->_element.getID())
                 ->phase("Solid");
 
         MPL::VariableArray variables_prev;
diff --git a/ProcessLib/SmallDeformation/SmallDeformationProcessData.h b/ProcessLib/SmallDeformation/SmallDeformationProcessData.h
index 806df330aaa..fce0cdc1bd4 100644
--- a/ProcessLib/SmallDeformation/SmallDeformationProcessData.h
+++ b/ProcessLib/SmallDeformation/SmallDeformationProcessData.h
@@ -34,8 +34,7 @@ struct SmallDeformationProcessData
 {
     MeshLib::PropertyVector<int> const* const material_ids = nullptr;
 
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map = nullptr;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 
     std::map<
         int,
diff --git a/ProcessLib/SteadyStateDiffusion/CreateSteadyStateDiffusion.cpp b/ProcessLib/SteadyStateDiffusion/CreateSteadyStateDiffusion.cpp
index 51a1facba0b..dcd84ce209d 100644
--- a/ProcessLib/SteadyStateDiffusion/CreateSteadyStateDiffusion.cpp
+++ b/ProcessLib/SteadyStateDiffusion/CreateSteadyStateDiffusion.cpp
@@ -72,7 +72,7 @@ std::unique_ptr<Process> createSteadyStateDiffusion(
         MaterialPropertyLib::createMaterialSpatialDistributionMap(media, mesh);
 
     DBUG("Check the media properties of steady state diffusion process ...");
-    checkMPLProperties(mesh, *media_map);
+    checkMPLProperties(mesh, media_map);
     DBUG("Media properties verified.");
 
     SteadyStateDiffusionData process_data{std::move(media_map)};
diff --git a/ProcessLib/SteadyStateDiffusion/SteadyStateDiffusionData.h b/ProcessLib/SteadyStateDiffusion/SteadyStateDiffusionData.h
index a7b2f2e55c8..74cc2fc1c62 100644
--- a/ProcessLib/SteadyStateDiffusion/SteadyStateDiffusionData.h
+++ b/ProcessLib/SteadyStateDiffusion/SteadyStateDiffusionData.h
@@ -23,8 +23,7 @@ namespace SteadyStateDiffusion
 {
 struct SteadyStateDiffusionData final
 {
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 };
 
 } // namespace SteadyStateDiffusion
diff --git a/ProcessLib/SteadyStateDiffusion/SteadyStateDiffusionFEM.h b/ProcessLib/SteadyStateDiffusion/SteadyStateDiffusionFEM.h
index e48ebc875c8..7de0fc8991d 100644
--- a/ProcessLib/SteadyStateDiffusion/SteadyStateDiffusionFEM.h
+++ b/ProcessLib/SteadyStateDiffusion/SteadyStateDiffusionFEM.h
@@ -100,7 +100,7 @@ public:
         pos.setElementID(_element.getID());
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         MaterialPropertyLib::VariableArray vars;
         vars.temperature =
             medium
@@ -149,7 +149,7 @@ public:
         ParameterLib::SpatialPosition pos;
         pos.setElementID(_element.getID());
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
 
         MaterialPropertyLib::VariableArray vars;
         vars.temperature =
@@ -213,7 +213,7 @@ public:
         pos.setElementID(_element.getID());
 
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
 
         MaterialPropertyLib::VariableArray vars;
         vars.temperature =
diff --git a/ProcessLib/StokesFlow/CreateStokesFlowProcess.cpp b/ProcessLib/StokesFlow/CreateStokesFlowProcess.cpp
index 90264123151..3c0d7f4eb79 100644
--- a/ProcessLib/StokesFlow/CreateStokesFlowProcess.cpp
+++ b/ProcessLib/StokesFlow/CreateStokesFlowProcess.cpp
@@ -147,7 +147,7 @@ std::unique_ptr<Process> createStokesFlowProcess(
         MaterialPropertyLib::createMaterialSpatialDistributionMap(media, mesh);
 
     DBUG("Check the media properties of StokesFlow process ...");
-    checkMPLProperties(mesh, *media_map, use_stokes_brinkman_form);
+    checkMPLProperties(mesh, media_map, use_stokes_brinkman_form);
     DBUG("Media properties verified.");
 
     StokesFlowProcessData process_data{std::move(media_map),
diff --git a/ProcessLib/StokesFlow/StokesFlowFEM.h b/ProcessLib/StokesFlow/StokesFlowFEM.h
index 1d02dfbf934..22100998ab1 100644
--- a/ProcessLib/StokesFlow/StokesFlowFEM.h
+++ b/ProcessLib/StokesFlow/StokesFlowFEM.h
@@ -166,7 +166,7 @@ public:
 
         // Get material properties
         auto const& medium =
-            *_process_data.media_map->getMedium(_element.getID());
+            *_process_data.media_map.getMedium(_element.getID());
         auto const& phase = medium.phase("AqueousLiquid");
 
         for (unsigned ip(0); ip < n_integration_points; ++ip)
diff --git a/ProcessLib/StokesFlow/StokesFlowProcessData.h b/ProcessLib/StokesFlow/StokesFlowProcessData.h
index 2e3f392bfaf..83aa52c49a7 100644
--- a/ProcessLib/StokesFlow/StokesFlowProcessData.h
+++ b/ProcessLib/StokesFlow/StokesFlowProcessData.h
@@ -11,23 +11,16 @@
 #pragma once
 
 #include <Eigen/Core>
-#include <memory>
 
 #include "MeshLib/PropertyVector.h"
 
-namespace MaterialPropertyLib
-{
-class MaterialSpatialDistributionMap;
-}
-
 namespace ProcessLib
 {
 namespace StokesFlow
 {
 struct StokesFlowProcessData
 {
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
     /// an external force that applies in the bulk of the fluid, like gravity.
     Eigen::VectorXd const specific_body_force;
 
diff --git a/ProcessLib/TH2M/TH2MFEM-impl.h b/ProcessLib/TH2M/TH2MFEM-impl.h
index 03b9175f787..930b4a23b6f 100644
--- a/ProcessLib/TH2M/TH2MFEM-impl.h
+++ b/ProcessLib/TH2M/TH2MFEM-impl.h
@@ -113,7 +113,7 @@ std::vector<ConstitutiveVariables<DisplacementDim>> TH2MLocalAssembler<
     auto const displacement =
         local_x.template segment<displacement_size>(displacement_index);
 
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     auto const& gas_phase = medium.phase("Gas");
     auto const& liquid_phase = medium.phase("AqueousLiquid");
     auto const& solid_phase = medium.phase("Solid");
@@ -942,7 +942,7 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
         local_x.template segment<temperature_size>(temperature_index);
 
     constexpr double dt = std::numeric_limits<double>::quiet_NaN();
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     auto const& solid_phase = medium.phase("Solid");
 
     unsigned const n_integration_points =
diff --git a/ProcessLib/TH2M/TH2MProcessData.h b/ProcessLib/TH2M/TH2MProcessData.h
index e3c8da8d1fd..d1faea0402b 100644
--- a/ProcessLib/TH2M/TH2MProcessData.h
+++ b/ProcessLib/TH2M/TH2MProcessData.h
@@ -28,8 +28,7 @@ struct TH2MProcessData
 {
     MeshLib::PropertyVector<int> const* const material_ids = nullptr;
 
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map = nullptr;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 
     /// The constitutive relation for the mechanical part.
     std::map<int, std::unique_ptr<
diff --git a/ProcessLib/ThermalTwoPhaseFlowWithPP/ThermalTwoPhaseFlowWithPPLocalAssembler-impl.h b/ProcessLib/ThermalTwoPhaseFlowWithPP/ThermalTwoPhaseFlowWithPPLocalAssembler-impl.h
index fd2371eaa96..5febeba6387 100644
--- a/ProcessLib/ThermalTwoPhaseFlowWithPP/ThermalTwoPhaseFlowWithPPLocalAssembler-impl.h
+++ b/ProcessLib/ThermalTwoPhaseFlowWithPP/ThermalTwoPhaseFlowWithPPLocalAssembler-impl.h
@@ -170,7 +170,7 @@ void ThermalTwoPhaseFlowWithPPLocalAssembler<ShapeFunction, GlobalDim>::
         vars.phase_pressure = pg_int_pt;
 
         auto const& medium =
-            *_process_data.media_map->getMedium(this->_element.getID());
+            *_process_data.media_map.getMedium(this->_element.getID());
         auto const& liquid_phase = medium.phase("AqueousLiquid");
         auto const& solid_phase = medium.phase("Solid");
         auto const& gas_phase = medium.phase("Gas");
diff --git a/ProcessLib/ThermalTwoPhaseFlowWithPP/ThermalTwoPhaseFlowWithPPProcessData.h b/ProcessLib/ThermalTwoPhaseFlowWithPP/ThermalTwoPhaseFlowWithPPProcessData.h
index 14e478a676f..ee6867a4de5 100644
--- a/ProcessLib/ThermalTwoPhaseFlowWithPP/ThermalTwoPhaseFlowWithPPProcessData.h
+++ b/ProcessLib/ThermalTwoPhaseFlowWithPP/ThermalTwoPhaseFlowWithPPProcessData.h
@@ -21,8 +21,7 @@ namespace ThermalTwoPhaseFlowWithPP
 {
 struct ThermalTwoPhaseFlowWithPPProcessData
 {
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
     Eigen::VectorXd const specific_body_force;
 
     bool const has_gravity;
diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM-impl.h b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM-impl.h
index 995a2e9452c..5993811df26 100644
--- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM-impl.h
+++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM-impl.h
@@ -71,7 +71,7 @@ ThermoHydroMechanicsLocalAssembler<ShapeFunctionDisplacement,
 
     // Consistency check: if frozen liquid phase is given, then the constitutive
     // relation for ice must also be given, and vice versa.
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     if (medium->hasPhase("FrozenLiquid") !=
         (_process_data.ice_constitutive_relation != nullptr))
     {
@@ -166,7 +166,7 @@ ConstitutiveRelationsValues<DisplacementDim> ThermoHydroMechanicsLocalAssembler<
             _process_data.solid_materials, _process_data.material_ids,
             _element.getID());
 
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     auto const& liquid_phase = medium->phase("AqueousLiquid");
     auto const& solid_phase = medium->phase("Solid");
     auto* const frozen_liquid_phase = medium->hasPhase("FrozenLiquid")
@@ -528,7 +528,7 @@ void ThermoHydroMechanicsLocalAssembler<
         Kup;
     Kup.setZero(displacement_size, pressure_size);
 
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     bool const has_frozen_liquid_phase = medium->hasPhase("FrozenLiquid");
 
     unsigned const n_integration_points =
diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcessData.h b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcessData.h
index 1cd5de077f1..9dcecc5dfcf 100644
--- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcessData.h
+++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcessData.h
@@ -35,8 +35,7 @@ struct ThermoHydroMechanicsProcessData
 {
     MeshLib::PropertyVector<int> const* const material_ids = nullptr;
 
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map = nullptr;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 
     /// The constitutive relation for the mechanical part.
     std::map<int, std::unique_ptr<
diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsFEM-impl.h b/ProcessLib/ThermoMechanics/ThermoMechanicsFEM-impl.h
index d188ac47300..921e27dd20b 100644
--- a/ProcessLib/ThermoMechanics/ThermoMechanicsFEM-impl.h
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsFEM-impl.h
@@ -162,7 +162,7 @@ void ThermoMechanicsLocalAssembler<ShapeFunction, DisplacementDim>::
     ParameterLib::SpatialPosition x_position;
     x_position.setElementID(_element.getID());
 
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     auto const& solid_phase = medium->phase("Solid");
 
     for (unsigned ip = 0; ip < n_integration_points; ip++)
@@ -382,7 +382,7 @@ void ThermoMechanicsLocalAssembler<ShapeFunction, DisplacementDim>::
     MPL::VariableArray variables_prev;
     ParameterLib::SpatialPosition x_position;
     x_position.setElementID(_element.getID());
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     auto const& solid_phase = medium->phase("Solid");
 
     for (unsigned ip = 0; ip < n_integration_points; ip++)
@@ -520,7 +520,7 @@ void ThermoMechanicsLocalAssembler<ShapeFunction, DisplacementDim>::
 
     ParameterLib::SpatialPosition x_position;
     x_position.setElementID(_element.getID());
-    auto const& medium = _process_data.media_map->getMedium(_element.getID());
+    auto const& medium = _process_data.media_map.getMedium(_element.getID());
     auto const& solid_phase = medium->phase("Solid");
     MPL::VariableArray variables;
 
diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcessData.h b/ProcessLib/ThermoMechanics/ThermoMechanicsProcessData.h
index 2a284319889..8b12f7d0f25 100644
--- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcessData.h
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcessData.h
@@ -34,8 +34,7 @@ struct ThermoMechanicsProcessData
 {
     MeshLib::PropertyVector<int> const* const material_ids = nullptr;
 
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map = nullptr;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 
     /// The constitutive relation for the mechanical part.
     std::map<int, std::unique_ptr<
diff --git a/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowFEM-impl.h b/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowFEM-impl.h
index e353ec4515b..7f301cab832 100644
--- a/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowFEM-impl.h
+++ b/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowFEM-impl.h
@@ -52,7 +52,7 @@ ThermoRichardsFlowLocalAssembler<ShapeFunction, GlobalDim>::
         NumLib::initShapeMatrices<ShapeFunction, ShapeMatricesType, GlobalDim>(
             e, is_axially_symmetric, _integration_method);
 
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
 
     for (unsigned ip = 0; ip < n_integration_points; ip++)
     {
@@ -120,7 +120,7 @@ void ThermoRichardsFlowLocalAssembler<ShapeFunction, GlobalDim>::
         typename ShapeMatricesType::template VectorType<pressure_size> const>(
         local_x.data() + pressure_index, pressure_size);
 
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     MPL::VariableArray variables;
 
     unsigned const n_integration_points =
@@ -219,7 +219,7 @@ void ThermoRichardsFlowLocalAssembler<ShapeFunction, GlobalDim>::
     typename ShapeMatricesType::NodalMatrixType storage_p_a_S =
         ShapeMatricesType::NodalMatrixType::Zero(pressure_size, pressure_size);
 
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     auto const& liquid_phase = medium.phase("AqueousLiquid");
     auto const& solid_phase = medium.phase("Solid");
     MPL::Phase const* gas_phase =
@@ -717,7 +717,7 @@ void ThermoRichardsFlowLocalAssembler<ShapeFunction, GlobalDim>::assemble(
         typename ShapeMatricesType::template VectorType<local_matrix_dim>>(
         local_rhs_data, local_matrix_dim);
 
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     auto const& liquid_phase = medium.phase("AqueousLiquid");
     auto const& solid_phase = medium.phase("Solid");
     MPL::Phase const* gas_phase =
@@ -1207,7 +1207,7 @@ void ThermoRichardsFlowLocalAssembler<ShapeFunction, GlobalDim>::
     auto p_L_prev =
         local_x_prev.template segment<pressure_size>(pressure_index);
 
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     auto const& liquid_phase = medium.phase("AqueousLiquid");
     auto const& solid_phase = medium.phase("Solid");
     MPL::VariableArray variables;
diff --git a/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowProcessData.h b/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowProcessData.h
index 3d5d9cd7c95..9605af55950 100644
--- a/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowProcessData.h
+++ b/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowProcessData.h
@@ -13,6 +13,8 @@
 #include <Eigen/Core>
 #include <memory>
 
+#include "MaterialLib/MPL/MaterialSpatialDistributionMap.h"
+
 namespace ProcessLib
 {
 namespace ThermoRichardsFlow
@@ -21,19 +23,13 @@ struct SimplifiedElasticityModel;
 }
 }
 
-namespace MaterialPropertyLib
-{
-class MaterialSpatialDistributionMap;
-}
-
 namespace ProcessLib
 {
 namespace ThermoRichardsFlow
 {
 struct ThermoRichardsFlowProcessData
 {
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map = nullptr;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 
     /// Specific body forces applied to solid and fluid.
     /// It is usually used to apply gravitational forces.
diff --git a/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM-impl.h b/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM-impl.h
index fca55c74931..2a44d66ca82 100644
--- a/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM-impl.h
+++ b/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM-impl.h
@@ -101,7 +101,7 @@ void ThermoRichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
 
     constexpr double dt = std::numeric_limits<double>::quiet_NaN();
     auto const& medium =
-        this->process_data_.media_map->getMedium(this->element_.getID());
+        this->process_data_.media_map.getMedium(this->element_.getID());
     MPL::VariableArray variables;
 
     auto const& solid_phase = medium->phase("Solid");
@@ -167,7 +167,7 @@ void ThermoRichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
                          std::vector<double>& local_Jac_data)
 {
     auto& medium =
-        *this->process_data_.media_map->getMedium(this->element_.getID());
+        *this->process_data_.media_map.getMedium(this->element_.getID());
 
     LocalMatrices loc_mat;
     loc_mat.setZero();
@@ -459,7 +459,7 @@ void ThermoRichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
 
     auto const e_id = this->element_.getID();
     auto const& process_data = this->process_data_;
-    auto& medium = *process_data.media_map->getMedium(e_id);
+    auto& medium = *process_data.media_map.getMedium(e_id);
 
     unsigned const n_integration_points =
         this->integration_method_.getNumberOfPoints();
diff --git a/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM.h b/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM.h
index 48af8148109..5da3af91f0a 100644
--- a/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM.h
+++ b/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM.h
@@ -277,7 +277,7 @@ public:
             this->integration_method_.getNumberOfPoints();
         auto const time_independent = std::numeric_limits<double>::quiet_NaN();
         auto const& medium =
-            *this->process_data_.media_map->getMedium(this->element_.getID());
+            *this->process_data_.media_map.getMedium(this->element_.getID());
 
         for (unsigned ip = 0; ip < n_integration_points; ip++)
         {
diff --git a/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsProcessData.h b/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsProcessData.h
index 60648ebf4c8..cbf21df32cc 100644
--- a/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsProcessData.h
+++ b/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsProcessData.h
@@ -26,8 +26,7 @@ struct ThermoRichardsMechanicsProcessData
 {
     MeshLib::PropertyVector<int> const* const material_ids = nullptr;
 
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map = nullptr;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 
     /// The constitutive relation for the mechanical part.
     std::map<int, std::unique_ptr<
diff --git a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPLocalAssembler-impl.h b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPLocalAssembler-impl.h
index e3239bf3fc2..370176a4348 100644
--- a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPLocalAssembler-impl.h
+++ b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPLocalAssembler-impl.h
@@ -88,7 +88,7 @@ void TwoPhaseFlowWithPPLocalAssembler<ShapeFunction, GlobalDim>::assemble(
     auto Bl =
         local_b.template segment<cap_pressure_size>(cap_pressure_matrix_index);
 
-    auto const& medium = *_process_data.media_map->getMedium(_element.getID());
+    auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     auto const& liquid_phase = medium.phase("AqueousLiquid");
     auto const& gas_phase = medium.phase("Gas");
 
diff --git a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPProcessData.h b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPProcessData.h
index 074b0d730ff..2e3cfce5553 100644
--- a/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPProcessData.h
+++ b/ProcessLib/TwoPhaseFlowWithPP/TwoPhaseFlowWithPPProcessData.h
@@ -30,8 +30,7 @@ struct TwoPhaseFlowWithPPProcessData
     //! Enables lumping of the mass matrix.
     bool const has_mass_lumping;
     ParameterLib::Parameter<double> const& temperature;
-    std::unique_ptr<MaterialPropertyLib::MaterialSpatialDistributionMap>
-        media_map;
+    MaterialPropertyLib::MaterialSpatialDistributionMap media_map;
 };
 
 }  // namespace TwoPhaseFlowWithPP
-- 
GitLab