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