82 std::span<std::size_t const>
84 std::vector<std::string>
const& property_names,
87 for (
auto const& property_name : property_names)
91 property_name, reordered_properties) ||
93 reordered_properties) ||
95 reordered_properties) ||
97 reordered_properties) ||
99 property_name, reordered_properties) ||
102 reordered_properties) ||
104 property_name, reordered_properties) ||
106 reordered_properties) ||
108 property_name, reordered_properties);
111 OGS_FATAL(
"Could not reorder PropertyVector '{}'.", property_name);
116int main(
int argc,
char* argv[])
119 "Reorder mesh nodes and cells.\n\n"
120 "OpenGeoSys-6 software, version " +
123 "Copyright (c) 2012-2026, OpenGeoSys Community "
124 "(http://www.opengeosys.org)",
126 TCLAP::ValueArg<std::string> mesh_in_arg(
127 "i",
"input",
"Input (.vtu). Name of the input mesh file",
true,
"",
129 cmd.add(mesh_in_arg);
130 TCLAP::ValueArg<std::string> mesh_out_arg(
131 "o",
"output",
"Output (.vtu). Name of the output mesh file",
true,
"",
133 cmd.add(mesh_out_arg);
136 cmd.add(log_level_arg);
137 cmd.parse(argc, argv);
142 const std::string filename(mesh_in_arg.getValue());
155 OGS_FATAL(
"Property / data array '{}' has not been found in the mesh.",
159 auto const& nodes = mesh->getNodes();
160 auto const node_ids_reverse_mapping(
163 std::vector<MeshLib::Node*> reordered_nodes(nodes.size());
165 for (
auto const id : node_ids_reverse_mapping)
167 auto const& n = *(nodes[id]);
168 reordered_nodes[pos] =
new MeshLib::Node(n[0], n[1], n[2], pos);
172 auto const bulk_element_ids_string =
174 if (!mesh->getProperties().existsPropertyVector<std::size_t>(
175 bulk_element_ids_string))
177 OGS_FATAL(
"Property / data array '{}' has not been found in the mesh.",
178 bulk_element_ids_string);
180 auto const& bulk_element_ids =
181 *mesh->getProperties().getPropertyVector<std::size_t>(
182 bulk_element_ids_string);
184 std::vector<std::size_t> element_ids_reverse_mapping(
187 auto const& elements = mesh->getElements();
188 std::vector<MeshLib::Element*> reordered_elements(elements.size());
190 for (
auto const id : element_ids_reverse_mapping)
192 auto const& e = *elements[id];
193 auto* reordered_element =
196 auto const number_of_nodes = reordered_element->getNumberOfNodes();
197 for (std::size_t node_number = 0; node_number < number_of_nodes;
200 reordered_element->setNode(
203 *bulk_node_ids)[e.getNode(node_number)->getID()]]);
205 reordered_elements[pos] = reordered_element;
208 auto const& original_properties = mesh->getProperties();
210 std::vector<MeshLib::MeshItemType>
const exclude_property_vectors{
216 "reordered_mesh", reordered_nodes, reordered_elements,
218 original_properties.excludeCopyProperties(exclude_property_vectors)};
222 auto const node_property_names =
226 node_property_names, properties);
229 auto const element_property_names =
230 mesh->getProperties().getPropertyVectorNames(
233 element_property_names, properties);
236 auto const number_of_properties =
237 mesh->getProperties().getPropertyVectorNames().size();
238 if (node_property_names.size() + element_property_names.size() <
239 number_of_properties)
242 "Properties that are not assigened to nodes or elements are not "
243 "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)