86 std::span<std::size_t const>
88 std::vector<std::string>
const& property_names,
91 for (
auto const& property_name : property_names)
95 property_name, reordered_properties) ||
97 reordered_properties) ||
99 reordered_properties) ||
101 reordered_properties) ||
103 property_name, reordered_properties) ||
106 reordered_properties) ||
108 property_name, reordered_properties) ||
110 reordered_properties) ||
112 property_name, reordered_properties);
115 OGS_FATAL(
"Could not reorder PropertyVector '{}'.", property_name);
120int main(
int argc,
char* argv[])
123 "Reorder mesh nodes and cells.\n\n"
124 "OpenGeoSys-6 software, version " +
127 "Copyright (c) 2012-2025, OpenGeoSys Community "
128 "(http://www.opengeosys.org)",
130 TCLAP::ValueArg<std::string> mesh_in_arg(
131 "i",
"input",
"name of the input mesh file",
true,
"",
"string");
132 cmd.add(mesh_in_arg);
133 TCLAP::ValueArg<std::string> mesh_out_arg(
134 "o",
"output",
"name of the output mesh file",
true,
"",
"string");
135 cmd.add(mesh_out_arg);
137 cmd.parse(argc, argv);
141 const std::string filename(mesh_in_arg.getValue());
154 OGS_FATAL(
"Property / data array '{}' has not been found in the mesh.",
158 auto const& nodes = mesh->getNodes();
159 auto const node_ids_reverse_mapping(
162 std::vector<MeshLib::Node*> reordered_nodes(nodes.size());
164 for (
auto const id : node_ids_reverse_mapping)
166 auto const& n = *(nodes[id]);
167 reordered_nodes[pos] =
new MeshLib::Node(n[0], n[1], n[2], pos);
171 auto const bulk_element_ids_string =
173 if (!mesh->getProperties().existsPropertyVector<std::size_t>(
174 bulk_element_ids_string))
176 OGS_FATAL(
"Property / data array '{}' has not been found in the mesh.",
177 bulk_element_ids_string);
179 auto const& bulk_element_ids =
180 *mesh->getProperties().getPropertyVector<std::size_t>(
181 bulk_element_ids_string);
183 std::vector<std::size_t> element_ids_reverse_mapping(
186 auto const& elements = mesh->getElements();
187 std::vector<MeshLib::Element*> reordered_elements(elements.size());
189 for (
auto const id : element_ids_reverse_mapping)
191 auto const& e = *elements[id];
192 auto* reordered_element =
195 auto const number_of_nodes = reordered_element->getNumberOfNodes();
196 for (std::size_t node_number = 0; node_number < number_of_nodes;
199 reordered_element->setNode(
202 *bulk_node_ids)[e.getNode(node_number)->getID()]]);
204 reordered_elements[pos] = reordered_element;
207 auto const& original_properties = mesh->getProperties();
209 std::vector<MeshLib::MeshItemType>
const exclude_property_vectors{
215 "reordered_mesh", reordered_nodes, reordered_elements,
217 original_properties.excludeCopyProperties(exclude_property_vectors)};
221 auto const node_property_names =
225 node_property_names, properties);
228 auto const element_property_names =
229 mesh->getProperties().getPropertyVectorNames(
232 element_property_names, properties);
235 auto const number_of_properties =
236 mesh->getProperties().getPropertyVectorNames().size();
237 if (node_property_names.size() + element_property_names.size() <
238 number_of_properties)
241 "Properties that are not assigened to nodes or elements are not "
242 "transferred to the reordered mesh.");
void reorderProperties(MeshLib::Properties const &original_properties, std::span< std::size_t const > bulk_ids, std::vector< std::string > const &property_names, MeshLib::Properties &reordered_properties)