From 25581ae2a071c7416273045443d3542ef0931ecd Mon Sep 17 00:00:00 2001
From: renchao_lu <renchao.lu@gmail.com>
Date: Wed, 5 May 2021 11:03:40 +0200
Subject: [PATCH] [PL/RCT] check material properties.

---
 ...reateRichardsComponentTransportProcess.cpp | 60 +++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/ProcessLib/RichardsComponentTransport/CreateRichardsComponentTransportProcess.cpp b/ProcessLib/RichardsComponentTransport/CreateRichardsComponentTransportProcess.cpp
index ec6f6cc6e0f..9aa8f3c2d12 100644
--- a/ProcessLib/RichardsComponentTransport/CreateRichardsComponentTransportProcess.cpp
+++ b/ProcessLib/RichardsComponentTransport/CreateRichardsComponentTransportProcess.cpp
@@ -24,6 +24,61 @@ namespace ProcessLib
 {
 namespace RichardsComponentTransport
 {
+namespace
+{
+void checkMPLProperties(
+    MeshLib::Mesh const& mesh,
+    MaterialPropertyLib::MaterialSpatialDistributionMap const& media_map)
+{
+    std::array const required_properties_medium = {
+        MaterialPropertyLib::PropertyType::porosity,
+        MaterialPropertyLib::PropertyType::transversal_dispersivity,
+        MaterialPropertyLib::PropertyType::longitudinal_dispersivity,
+        MaterialPropertyLib::PropertyType::permeability,
+        MaterialPropertyLib::PropertyType::saturation,
+        MaterialPropertyLib::PropertyType::storage,
+        MaterialPropertyLib::PropertyType::relative_permeability};
+
+    std::array const required_properties_liquid_phase = {
+        MaterialPropertyLib::PropertyType::density,
+        MaterialPropertyLib::PropertyType::viscosity};
+
+    std::array const required_properties_components = {
+        MaterialPropertyLib::PropertyType::retardation_factor,
+        MaterialPropertyLib::PropertyType::decay_rate,
+        MaterialPropertyLib::PropertyType::pore_diffusion};
+
+    for (auto const& element : mesh.getElements())
+    {
+        auto const element_id = element->getID();
+
+        auto const& medium = *media_map.getMedium(element_id);
+        checkRequiredProperties(medium, required_properties_medium);
+
+        // check if liquid phase definition and the corresponding properties
+        // exist
+        auto const& liquid_phase = medium.phase("AqueousLiquid");
+        checkRequiredProperties(liquid_phase, required_properties_liquid_phase);
+
+        // check if components and the corresponding properties exist
+        auto const number_of_components = liquid_phase.numberOfComponents();
+        for (std::size_t component_id = 0; component_id < number_of_components;
+             ++component_id)
+        {
+            if (!liquid_phase.hasComponent(component_id))
+            {
+                OGS_FATAL(
+                    "The component {:d} in the AqueousLiquid phase isn't "
+                    "specified.",
+                    component_id);
+            }
+            auto const& component = liquid_phase.component(component_id);
+            checkRequiredProperties(component, required_properties_components);
+        }
+    }
+}
+}  // namespace
+
 std::unique_ptr<Process> createRichardsComponentTransportProcess(
     std::string name,
     MeshLib::Mesh& mesh,
@@ -104,6 +159,11 @@ std::unique_ptr<Process> createRichardsComponentTransportProcess(
     auto media_map =
         MaterialPropertyLib::createMaterialSpatialDistributionMap(media, mesh);
 
+    DBUG(
+        "Check the media properties of RichardsComponentTransport process ...");
+    checkMPLProperties(mesh, *media_map);
+    DBUG("Media properties verified.");
+
     RichardsComponentTransportProcessData process_data{
         std::move(media_map),
         std::move(porous_media_properties),
-- 
GitLab