diff --git a/ProcessLib/DeactivatedSubdomain.cpp b/ProcessLib/DeactivatedSubdomain.cpp index 30ee2680aab795f2b3c10bf850caccecc5e2af75..d1574823d87ae1f3042ed11de5ef00517e6117b2 100644 --- a/ProcessLib/DeactivatedSubdomain.cpp +++ b/ProcessLib/DeactivatedSubdomain.cpp @@ -63,82 +63,77 @@ std::unique_ptr<DeactivatedSubdomain const> createDeactivatedSubdomain( //! \ogs_file_param{prj__process_variables__process_variable__deactivated_subdomains__deactivated_subdomain__material_ids} config.getConfigParameter<std::vector<int>>("material_ids", std::vector<int>{}); - if (!deactivated_subdomain_material_ids.empty()) + + if (deactivated_subdomain_material_ids.empty()) { - std::sort(deactivated_subdomain_material_ids.begin(), - deactivated_subdomain_material_ids.end()); + OGS_FATAL( + "The material IDs of the deactivated subdomains are not given."); + } + + std::sort(deactivated_subdomain_material_ids.begin(), + deactivated_subdomain_material_ids.end()); - auto const* const material_ids = MeshLib::materialIDs(mesh); + auto const* const material_ids = MeshLib::materialIDs(mesh); - std::vector<std::unique_ptr<DeactivetedSubdomainMesh>> - deactivated_sudomain_meshes; - deactivated_sudomain_meshes.reserve( - deactivated_subdomain_material_ids.size()); + std::vector<std::unique_ptr<DeactivetedSubdomainMesh>> + deactivated_sudomain_meshes; + deactivated_sudomain_meshes.reserve( + deactivated_subdomain_material_ids.size()); - for (auto const ids : deactivated_subdomain_material_ids) + for (auto const ids : deactivated_subdomain_material_ids) + { + std::vector<MeshLib::Element*> deactivated_elements; + std::vector<MeshLib::Node*> deactivated_nodes; + + // temporary vector to enhance node searching. + std::vector<bool> deactivation_flag_of_nodes(mesh.getNumberOfNodes(), + false); + + for (std::size_t i = 0; i < mesh.getNumberOfElements(); i++) { - std::vector<MeshLib::Element*> deactivated_elements; - std::vector<MeshLib::Node*> deactivated_nodes; + if (ids != (*material_ids)[i]) + continue; - // temporary vector to enhance node searching. - std::vector<bool> deactivation_flag_of_nodes( - mesh.getNumberOfNodes(), false); + auto* element = mesh.getElement(i); + deactivated_elements.push_back( + const_cast<MeshLib::Element*>(element)); - for (std::size_t i = 0; i < mesh.getNumberOfElements(); i++) + for (unsigned i = 0; i < element->getNumberOfNodes(); i++) { - if (ids != (*material_ids)[i]) - continue; + auto const* const node = element->getNode(i); + const auto& connected_elements = node->getElements(); - auto* element = mesh.getElement(i); - deactivated_elements.push_back( - const_cast<MeshLib::Element*>(element)); - - for (unsigned i = 0; i < element->getNumberOfNodes(); i++) - { - auto const* const node = element->getNode(i); - const auto& connected_elements = node->getElements(); - - if (deactivation_flag_of_nodes[node->getID()]) - continue; - - // Check whether this node is in an activated element. - if (std::find_if( - connected_elements.begin(), - connected_elements.end(), - [&](auto const* const connected_elem) -> bool { - return ids != - (*material_ids)[connected_elem->getID()]; - }) != connected_elements.end()) - continue; - - deactivated_nodes.push_back( - const_cast<MeshLib::Node*>(node)); - deactivation_flag_of_nodes[node->getID()] = true; - } - } + if (deactivation_flag_of_nodes[node->getID()]) + continue; - auto bc_mesh = MeshLib::createMeshFromElementSelection( - "deactivate_subdomain" + std::to_string(ids), - MeshLib::cloneElements(deactivated_elements)); + // Check whether this node is in an activated element. + if (std::find_if( + connected_elements.begin(), + connected_elements.end(), + [&](auto const* const connected_elem) -> bool { + return ids != + (*material_ids)[connected_elem->getID()]; + }) != connected_elements.end()) + continue; - deactivated_sudomain_meshes.emplace_back( - std::make_unique<DeactivetedSubdomainMesh>( - std::move(bc_mesh), std::move(deactivated_nodes))); + deactivated_nodes.push_back(const_cast<MeshLib::Node*>(node)); + deactivation_flag_of_nodes[node->getID()] = true; + } } - return std::make_unique<DeactivatedSubdomain const>( - std::move(time_interval), - std::move(deactivated_subdomain_material_ids), - std::move(deactivated_sudomain_meshes)); - } - else - { - OGS_FATAL( - "The material IDs of the deactivated subdomains are not " - "given."); + auto bc_mesh = MeshLib::createMeshFromElementSelection( + "deactivate_subdomain" + std::to_string(ids), + MeshLib::cloneElements(deactivated_elements)); + + deactivated_sudomain_meshes.emplace_back( + std::make_unique<DeactivetedSubdomainMesh>( + std::move(bc_mesh), std::move(deactivated_nodes))); } - return nullptr; + return std::make_unique<DeactivatedSubdomain const>( + std::move(time_interval), + std::move(deactivated_subdomain_material_ids), + std::move(deactivated_sudomain_meshes)); } std::vector<std::unique_ptr<DeactivatedSubdomain const>> @@ -148,9 +143,9 @@ createDeactivatedSubdomains(BaseLib::ConfigTree const& config, std::vector<std::unique_ptr<DeactivatedSubdomain const>> deactivated_subdomains; // Deactivated subdomains - //! \ogs_file_param{prj__process_variables__process_variable__deactivated_subdomains} if (auto subdomains_config = - config.getConfigSubtreeOptional("deactivated_subdomains")) + //! \ogs_file_param{prj__process_variables__process_variable__deactivated_subdomains} + config.getConfigSubtreeOptional("deactivated_subdomains")) { INFO("There are subdomains being deactivated.");