88 std::span<std::size_t const>
90 std::vector<std::string>
const& property_names,
93 for (
auto const& property_name : property_names)
97 property_name, reordered_properties) ||
99 reordered_properties) ||
101 reordered_properties) ||
103 reordered_properties) ||
105 property_name, reordered_properties) ||
108 reordered_properties) ||
110 property_name, reordered_properties) ||
112 reordered_properties) ||
114 property_name, reordered_properties);
117 OGS_FATAL(
"Could not reorder PropertyVector '{}'.", property_name);
122int main(
int argc,
char* argv[])
125 "Reorder mesh nodes and cells.\n\n"
126 "OpenGeoSys-6 software, version " +
129 "Copyright (c) 2012-2025, OpenGeoSys Community "
130 "(http://www.opengeosys.org)",
132 TCLAP::ValueArg<std::string> mesh_in_arg(
133 "i",
"input",
"Input (.vtu). Name of the input mesh file",
true,
"",
135 cmd.add(mesh_in_arg);
136 TCLAP::ValueArg<std::string> mesh_out_arg(
137 "o",
"output",
"Output (.vtu). Name of the output mesh file",
true,
"",
139 cmd.add(mesh_out_arg);
142 cmd.add(log_level_arg);
143 cmd.parse(argc, argv);
148 const std::string filename(mesh_in_arg.getValue());
161 OGS_FATAL(
"Property / data array '{}' has not been found in the mesh.",
165 auto const& nodes = mesh->getNodes();
166 auto const node_ids_reverse_mapping(
169 std::vector<MeshLib::Node*> reordered_nodes(nodes.size());
171 for (
auto const id : node_ids_reverse_mapping)
173 auto const& n = *(nodes[id]);
174 reordered_nodes[pos] =
new MeshLib::Node(n[0], n[1], n[2], pos);
178 auto const bulk_element_ids_string =
180 if (!mesh->getProperties().existsPropertyVector<std::size_t>(
181 bulk_element_ids_string))
183 OGS_FATAL(
"Property / data array '{}' has not been found in the mesh.",
184 bulk_element_ids_string);
186 auto const& bulk_element_ids =
187 *mesh->getProperties().getPropertyVector<std::size_t>(
188 bulk_element_ids_string);
190 std::vector<std::size_t> element_ids_reverse_mapping(
193 auto const& elements = mesh->getElements();
194 std::vector<MeshLib::Element*> reordered_elements(elements.size());
196 for (
auto const id : element_ids_reverse_mapping)
198 auto const& e = *elements[id];
199 auto* reordered_element =
202 auto const number_of_nodes = reordered_element->getNumberOfNodes();
203 for (std::size_t node_number = 0; node_number < number_of_nodes;
206 reordered_element->setNode(
209 *bulk_node_ids)[e.getNode(node_number)->getID()]]);
211 reordered_elements[pos] = reordered_element;
214 auto const& original_properties = mesh->getProperties();
216 std::vector<MeshLib::MeshItemType>
const exclude_property_vectors{
222 "reordered_mesh", reordered_nodes, reordered_elements,
224 original_properties.excludeCopyProperties(exclude_property_vectors)};
228 auto const node_property_names =
232 node_property_names, properties);
235 auto const element_property_names =
236 mesh->getProperties().getPropertyVectorNames(
239 element_property_names, properties);
242 auto const number_of_properties =
243 mesh->getProperties().getPropertyVectorNames().size();
244 if (node_property_names.size() + element_property_names.size() <
245 number_of_properties)
248 "Properties that are not assigened to nodes or elements are not "
249 "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)