diff --git a/ProcessLib/ProcessVariable.cpp b/ProcessLib/ProcessVariable.cpp index dc07c465b2e5dce272ad4e86738154ad583d4725..679261b1f92758af4e7bafb669771d495dfb1102 100644 --- a/ProcessLib/ProcessVariable.cpp +++ b/ProcessLib/ProcessVariable.cpp @@ -19,6 +19,59 @@ #include "ProcessLib/SourceTerms/NodalSourceTerm.h" #include "ProcessLib/Utils/ProcessUtils.h" +namespace +{ +MeshLib::Mesh const& findMeshInConfig( + BaseLib::ConfigTree const& config, + std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes) +{ + // + // Get the mesh name from the config. + // + std::string mesh_name; // Either given directly in <mesh> or constructed + // from <geometrical_set>_<geometry>. + auto optional_mesh_name = + //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__mesh} + config.getConfigParameterOptional<std::string>("mesh"); + if (optional_mesh_name) + { + mesh_name = *optional_mesh_name; + } + else + { + // Looking for the mesh created before for the given geometry. + auto const geometrical_set_name = + //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__geometrical_set} + config.getConfigParameter<std::string>("geometrical_set"); + auto const geometry_name = + //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__geometry} + config.getConfigParameter<std::string>("geometry"); + + mesh_name = geometrical_set_name + "_" + geometry_name; + } + + // + // Find and extract mesh from the list of meshes. + // + auto const mesh_it = std::find_if( + begin(meshes), end(meshes), [&mesh_name](auto const& mesh) { + assert(mesh != nullptr); + return mesh->getName() == mesh_name; + }); + if (mesh_it == end(meshes)) + { + OGS_FATAL("Required mesh with name '%s' not found.", + mesh_name.c_str()); + } + + auto const& mesh = **mesh_it; + + DBUG("Found mesh '%s' with id %d.", mesh.getName().c_str(), mesh.getID()); + + return mesh; +} +} // namespace + namespace ProcessLib { ProcessVariable::ProcessVariable( @@ -51,43 +104,7 @@ ProcessVariable::ProcessVariable( //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition} bcs_config->getConfigSubtreeList("boundary_condition")) { - std::string - bc_mesh_name; // Either given directly in <mesh> or constructed - // from <geometrical_set>_<geometry>. - auto optional_bc_mesh_name = - bc_config.getConfigParameterOptional<std::string>("mesh"); - if (optional_bc_mesh_name) - { - bc_mesh_name = *optional_bc_mesh_name; - } - else - { - // Looking for the mesh created before for the given geometry. - auto const geometrical_set_name = - //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__geometrical_set} - bc_config.getConfigParameter<std::string>( - "geometrical_set"); - auto const geometry_name = - //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__geometry} - bc_config.getConfigParameter<std::string>("geometry"); - - bc_mesh_name = geometrical_set_name + "_" + geometry_name; - } - auto const mesh_it = std::find_if( - begin(meshes), end(meshes), [&bc_mesh_name](auto const& mesh) { - assert(mesh != nullptr); - return mesh->getName() == bc_mesh_name; - }); - if (mesh_it == end(meshes)) - { - OGS_FATAL("Required mesh with name '%s' not found.", - bc_mesh_name.c_str()); - } - MeshLib::Mesh const& bc_mesh = **mesh_it; - - DBUG("Found mesh '%s' with id %d.", bc_mesh.getName().c_str(), - bc_mesh.getID()); - + auto const& mesh = findMeshInConfig(bc_config, meshes); auto component_id = //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions__boundary_condition__component} bc_config.getConfigParameterOptional<int>("component"); @@ -96,8 +113,7 @@ ProcessVariable::ProcessVariable( // default value for single component vars. component_id = 0; - _bc_configs.emplace_back(std::move(bc_config), bc_mesh, - component_id); + _bc_configs.emplace_back(std::move(bc_config), mesh, component_id); } } else { INFO("No boundary conditions found."); @@ -111,32 +127,7 @@ ProcessVariable::ProcessVariable( //! \ogs_file_param{prj__process_variables__process_variable__source_terms__source_term} sts_config->getConfigSubtreeList("source_term")) { - // TODO (naumov) Remove code duplication with the bc_config parsing. - auto const geometrical_set_name = - //! \ogs_file_param{prj__process_variables__process_variable__source_terms__source_term__geometrical_set} - st_config.getConfigParameter<std::string>("geometrical_set"); - auto const geometry_name = - //! \ogs_file_param{prj__process_variables__process_variable__source_terms__source_term__geometry} - st_config.getConfigParameter<std::string>("geometry"); - - auto const full_geometry_name = - geometrical_set_name + "_" + geometry_name; - auto const mesh_it = - std::find_if(begin(meshes), end(meshes), - [&full_geometry_name](auto const& mesh) { - assert(mesh != nullptr); - return mesh->getName() == full_geometry_name; - }); - if (mesh_it == end(meshes)) - { - OGS_FATAL("Required mesh with name '%s' not found.", - full_geometry_name.c_str()); - } - MeshLib::Mesh const& bc_mesh = **mesh_it; - - DBUG("Found mesh '%s' with id %d.", bc_mesh.getName().c_str(), - bc_mesh.getID()); - + MeshLib::Mesh const& mesh = findMeshInConfig(st_config, meshes); auto component_id = //! \ogs_file_param{prj__process_variables__process_variable__source_terms__source_term__component} st_config.getConfigParameterOptional<int>("component"); @@ -145,7 +136,7 @@ ProcessVariable::ProcessVariable( // default value for single component vars. component_id = 0; - _source_term_configs.emplace_back(std::move(st_config), bc_mesh, + _source_term_configs.emplace_back(std::move(st_config), mesh, component_id); } } else {