/** * \file * \author Karsten Rink * \date 2014-03-25 * \brief Implementation of Duplicate functions. * * \copyright * Copyright (c) 2012-2023, OpenGeoSys Community (http://www.opengeosys.org) * Distributed under a Modified BSD License. * See accompanying file LICENSE.txt or * http://www.opengeosys.org/project/license * */ #include "DuplicateMeshComponents.h" #include "MeshLib/Elements/Elements.h" namespace MeshLib { std::vector copyNodeVector(const std::vector& nodes) { const std::size_t nNodes(nodes.size()); std::vector new_nodes; new_nodes.reserve(nNodes); for (std::size_t k = 0; k < nNodes; ++k) { new_nodes.push_back(new Node(nodes[k]->data(), new_nodes.size())); } return new_nodes; } std::vector copyElementVector( std::vector const& elements, std::vector const& new_nodes, std::vector const* const node_id_map) { std::vector new_elements; new_elements.reserve(elements.size()); std::transform(elements.begin(), elements.end(), std::back_inserter(new_elements), [&new_nodes, &node_id_map](auto const& element) { return copyElement(element, new_nodes, node_id_map); }); return new_elements; } /// Copies an element without change, using the nodes vector from the result /// mesh. template Element* copyElement(Element const* const element, const std::vector& nodes, std::vector const* const id_map) { unsigned const number_of_element_nodes(element->getNumberOfNodes()); auto** new_nodes = new Node*[number_of_element_nodes]; if (id_map) { for (unsigned i = 0; i < number_of_element_nodes; ++i) { new_nodes[i] = nodes[(*id_map)[element->getNode(i)->getID()]]; } } else { for (unsigned i = 0; i < number_of_element_nodes; ++i) { new_nodes[i] = nodes[element->getNode(i)->getID()]; } } return new E(new_nodes); } Element* copyElement(Element const* const element, const std::vector& nodes, std::vector const* const id_map) { switch (element->getCellType()) { case CellType::LINE2: return copyElement(element, nodes, id_map); case CellType::LINE3: return copyElement(element, nodes, id_map); case CellType::TRI3: return copyElement(element, nodes, id_map); case CellType::TRI6: return copyElement(element, nodes, id_map); case CellType::QUAD4: return copyElement(element, nodes, id_map); case CellType::QUAD8: return copyElement(element, nodes, id_map); case CellType::QUAD9: return copyElement(element, nodes, id_map); case CellType::TET4: return copyElement(element, nodes, id_map); case CellType::TET10: return copyElement(element, nodes, id_map); case CellType::HEX8: return copyElement(element, nodes, id_map); case CellType::HEX20: return copyElement(element, nodes, id_map); case CellType::PYRAMID5: return copyElement(element, nodes, id_map); case CellType::PYRAMID13: return copyElement(element, nodes, id_map); case CellType::PRISM6: return copyElement(element, nodes, id_map); case CellType::PRISM15: return copyElement(element, nodes, id_map); default: { ERR("Error: Unknown cell type."); return nullptr; } } } std::vector cloneElements(std::vector const& elements) { std::vector cloned_elements; cloned_elements.reserve(elements.size()); std::transform(begin(elements), end(elements), std::back_inserter(cloned_elements), [](Element* const e) { return e->clone(); }); return cloned_elements; } } // namespace MeshLib