From 4cdbf044807f4565cf9d160d3e0b5b0517919f45 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <dmitri.naumov@ufz.de>
Date: Fri, 2 Dec 2016 21:28:28 +0100
Subject: [PATCH] [PL] BCs: Relax requirement of <component> tag.

Some boundary conditions might not be applicable to a specific component
but to all components. In this case the optional component id is not
initialized and it is no longer an error.
---
 .../BoundaryCondition/BoundaryCondition.cpp     | 12 ++++++------
 .../BoundaryCondition/BoundaryConditionConfig.h |  4 ++--
 .../BoundaryConditionBuilder.cpp                |  2 +-
 ProcessLib/ProcessVariable.cpp                  | 17 ++++-------------
 4 files changed, 13 insertions(+), 22 deletions(-)

diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
index 4a164b8deca..6e90534adf2 100644
--- a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
@@ -85,7 +85,7 @@ BoundaryConditionBuilder::createDirichletBoundaryCondition(
     std::vector<std::size_t> sorted_nodes_ids;
 
     auto const& mesh_subsets =
-        dof_table.getMeshSubsets(variable_id, config.component_id);
+        dof_table.getMeshSubsets(variable_id, *config.component_id);
     for (auto const& mesh_subset : mesh_subsets)
     {
         auto const& nodes = mesh_subset->getNodes();
@@ -106,11 +106,11 @@ BoundaryConditionBuilder::createDirichletBoundaryCondition(
     ids.erase(ids_new_end_iterator, std::end(ids));
 
     DBUG("Found %d nodes for Dirichlet BCs for the variable %d and component %d",
-         ids.size(), variable_id, config.component_id);
+         ids.size(), variable_id, *config.component_id);
 
     return ProcessLib::createDirichletBoundaryCondition(
         config.config, std::move(ids), dof_table, mesh.getID(), variable_id,
-        config.component_id, parameters);
+        *config.component_id, parameters);
 }
 
 std::unique_ptr<BoundaryCondition>
@@ -134,7 +134,7 @@ BoundaryConditionBuilder::createNeumannBoundaryCondition(
     return ProcessLib::createNeumannBoundaryCondition(
         config.config,
         getClonedElements(boundary_element_searcher, config.geometry),
-        dof_table, variable_id, config.component_id,
+        dof_table, variable_id, *config.component_id,
         mesh.isAxiallySymmetric(), integration_order, shapefunction_order, mesh.getDimension(),
         parameters);
 }
@@ -160,7 +160,7 @@ BoundaryConditionBuilder::createRobinBoundaryCondition(
     return ProcessLib::createRobinBoundaryCondition(
         config.config,
         getClonedElements(boundary_element_searcher, config.geometry),
-        dof_table, variable_id, config.component_id,
+        dof_table, variable_id, *config.component_id,
         mesh.isAxiallySymmetric(), integration_order, shapefunction_order, mesh.getDimension(),
         parameters);
 }
@@ -173,7 +173,7 @@ BoundaryConditionBuilder::createNonuniformNeumannBoundaryCondition(
     const unsigned shapefunction_order)
 {
     return ProcessLib::createNonuniformNeumannBoundaryCondition(
-        config.config, dof_table, variable_id, config.component_id,
+        config.config, dof_table, variable_id, *config.component_id,
         integration_order, shapefunction_order, mesh);
 }
 
diff --git a/ProcessLib/BoundaryCondition/BoundaryConditionConfig.h b/ProcessLib/BoundaryCondition/BoundaryConditionConfig.h
index 17bcb4aeae1..756ce055c20 100644
--- a/ProcessLib/BoundaryCondition/BoundaryConditionConfig.h
+++ b/ProcessLib/BoundaryCondition/BoundaryConditionConfig.h
@@ -19,7 +19,7 @@ struct BoundaryConditionConfig final
 {
     BoundaryConditionConfig(BaseLib::ConfigTree&& config_,
                             GeoLib::GeoObject const& geometry_,
-                            int const component_id_)
+                            boost::optional<int> const component_id_)
         : config(std::move(config_)),
           geometry(geometry_),
           component_id(component_id_)
@@ -35,7 +35,7 @@ struct BoundaryConditionConfig final
 
     BaseLib::ConfigTree config;
     GeoLib::GeoObject const& geometry;
-    int const component_id;
+    boost::optional<int> const component_id;
 };
 
 }  // ProcessLib
diff --git a/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp b/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
index 7a6d7605591..a6cb2e84301 100644
--- a/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
+++ b/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
@@ -41,7 +41,7 @@ BoundaryConditionBuilder::createNeumannBoundaryCondition(
     return ProcessLib::LIE::createNeumannBoundaryCondition(
         config.config,
         getClonedElements(boundary_element_searcher, config.geometry),
-        dof_table, variable_id, config.component_id,
+        dof_table, variable_id, *config.component_id,
         mesh.isAxiallySymmetric(), integration_order, shapefunction_order, mesh.getDimension(),
         parameters, _fracture_prop);
 }
diff --git a/ProcessLib/ProcessVariable.cpp b/ProcessLib/ProcessVariable.cpp
index fc9f3e4a5e0..404c978e2df 100644
--- a/ProcessLib/ProcessVariable.cpp
+++ b/ProcessLib/ProcessVariable.cpp
@@ -72,21 +72,12 @@ ProcessVariable::ProcessVariable(
                 //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__component}
                 bc_config.getConfigParameterOptional<int>("component");
 
-            if (!component_id)
-            {
-                if (_n_components == 1)
-                    // default value for single component vars.
-                    component_id = 0;
-                else
-                    OGS_FATAL(
-                        "The <component> tag could not be found for the "
-                        "multi-component boundary condition of the process "
-                        "variable `%s'.",
-                        _name.c_str());
-            }
+            if (!component_id && _n_components == 1)
+                // default value for single component vars.
+                component_id = 0;
 
             _bc_configs.emplace_back(std::move(bc_config), *geometry,
-                                     *component_id);
+                                     component_id);
         }
     } else {
         INFO("No boundary conditions found.");
-- 
GitLab