OGS
ReorderMesh.cpp File Reference

Detailed Description

Definition in file ReorderMesh.cpp.

#include <tclap/CmdLine.h>
#include <memory>
#include <string>
#include "BaseLib/MPI.h"
#include "InfoLib/GitInfo.h"
#include "MeshLib/Elements/Element.h"
#include "MeshLib/IO/readMeshFromFile.h"
#include "MeshLib/IO/writeMeshToFile.h"
#include "MeshLib/Mesh.h"
#include "MeshLib/Node.h"
Include dependency graph for ReorderMesh.cpp:

Go to the source code of this file.

Functions

std::vector< std::size_t > generateBulkIDsReverseMapping (std::span< std::size_t const > bulk_ids)
 
template<typename T >
bool reorderProperty (MeshLib::PropertyVector< T > const &original_pv, std::span< std::size_t const > bulk_ids, MeshLib::PropertyVector< T > &reordered_pv)
 
template<typename T >
bool reorderProperty (MeshLib::Properties const &original_properties, std::span< std::size_t const > bulk_ids, std::string const &property_name, MeshLib::Properties &reordered_properties)
 
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)
 
int main (int argc, char *argv[])
 

Function Documentation

◆ generateBulkIDsReverseMapping()

std::vector< std::size_t > generateBulkIDsReverseMapping ( std::span< std::size_t const > bulk_ids)

Definition at line 23 of file ReorderMesh.cpp.

25{
26 std::vector<std::size_t> parallel_to_sequential_node_ids(bulk_ids.size());
27
28 std::size_t pos = 0;
29 for (auto const id : bulk_ids)
30 {
31 parallel_to_sequential_node_ids[id] = pos;
32 pos++;
33 }
34 return parallel_to_sequential_node_ids;
35}

Referenced by main().

◆ main()

int main ( int argc,
char * argv[] )

Definition at line 120 of file ReorderMesh.cpp.

121{
122 TCLAP::CmdLine cmd(
123 "Reorder mesh nodes and cells.\n\n"
124 "OpenGeoSys-6 software, version " +
126 ".\n"
127 "Copyright (c) 2012-2025, OpenGeoSys Community "
128 "(http://www.opengeosys.org)",
130 TCLAP::ValueArg<std::string> mesh_in_arg(
131 "i", "input", "Input (.vtu). Name of the input mesh file", true, "",
132 "INPUT_FILE");
133 cmd.add(mesh_in_arg);
134 TCLAP::ValueArg<std::string> mesh_out_arg(
135 "o", "output", "Output (.vtu). Name of the output mesh file", true, "",
136 "OUTPUT_FILE");
137 cmd.add(mesh_out_arg);
138
139 cmd.parse(argc, argv);
140
141 BaseLib::MPI::Setup mpi_setup(argc, argv);
142
143 const std::string filename(mesh_in_arg.getValue());
144
145 // read the mesh file
146 auto const mesh =
147 std::unique_ptr<MeshLib::Mesh>(MeshLib::IO::readMeshFromFile(filename));
148 if (!mesh)
149 {
150 return EXIT_FAILURE;
151 }
152
153 auto const* bulk_node_ids = MeshLib::bulkNodeIDs(*mesh);
154 if (!bulk_node_ids)
155 {
156 OGS_FATAL("Property / data array '{}' has not been found in the mesh.",
158 }
159
160 auto const& nodes = mesh->getNodes();
161 auto const node_ids_reverse_mapping(
162 generateBulkIDsReverseMapping(*bulk_node_ids));
163
164 std::vector<MeshLib::Node*> reordered_nodes(nodes.size());
165 std::size_t pos = 0;
166 for (auto const id : node_ids_reverse_mapping)
167 {
168 auto const& n = *(nodes[id]);
169 reordered_nodes[pos] = new MeshLib::Node(n[0], n[1], n[2], pos);
170 pos++;
171 }
172
173 auto const bulk_element_ids_string =
175 if (!mesh->getProperties().existsPropertyVector<std::size_t>(
176 bulk_element_ids_string))
177 {
178 OGS_FATAL("Property / data array '{}' has not been found in the mesh.",
179 bulk_element_ids_string);
180 }
181 auto const& bulk_element_ids =
182 *mesh->getProperties().getPropertyVector<std::size_t>(
183 bulk_element_ids_string);
184
185 std::vector<std::size_t> element_ids_reverse_mapping(
186 generateBulkIDsReverseMapping(bulk_element_ids));
187
188 auto const& elements = mesh->getElements();
189 std::vector<MeshLib::Element*> reordered_elements(elements.size());
190 pos = 0;
191 for (auto const id : element_ids_reverse_mapping)
192 {
193 auto const& e = *elements[id];
194 auto* reordered_element =
195 e.clone(); // use clone to have the same element type
196 // reset the nodes to the reordered nodes
197 auto const number_of_nodes = reordered_element->getNumberOfNodes();
198 for (std::size_t node_number = 0; node_number < number_of_nodes;
199 node_number++)
200 {
201 reordered_element->setNode(
202 node_number,
203 reordered_nodes[(
204 *bulk_node_ids)[e.getNode(node_number)->getID()]]);
205 }
206 reordered_elements[pos] = reordered_element;
207 pos++;
208 }
209 auto const& original_properties = mesh->getProperties();
210 // reordering of PropertyVector with following MeshItemTypes isn't supported
211 std::vector<MeshLib::MeshItemType> const exclude_property_vectors{
214 // Create reordered mesh - only the PropertyVectors for which the reordering
215 // is implemented are copied
216 MeshLib::Mesh reordered_mesh{
217 "reordered_mesh", reordered_nodes, reordered_elements,
218 false /* compute_element_neighbors */,
219 original_properties.excludeCopyProperties(exclude_property_vectors)};
220 auto& properties = reordered_mesh.getProperties();
221
222 // node based properties
223 auto const node_property_names =
224 mesh->getProperties().getPropertyVectorNames(
226 reorderProperties(original_properties, std::span{*bulk_node_ids},
227 node_property_names, properties);
228
229 // element based properties
230 auto const element_property_names =
231 mesh->getProperties().getPropertyVectorNames(
233 reorderProperties(original_properties, bulk_element_ids,
234 element_property_names, properties);
235 MeshLib::IO::writeMeshToFile(reordered_mesh, mesh_out_arg.getValue());
236
237 auto const number_of_properties =
238 mesh->getProperties().getPropertyVectorNames().size();
239 if (node_property_names.size() + element_property_names.size() <
240 number_of_properties)
241 {
242 WARN(
243 "Properties that are not assigened to nodes or elements are not "
244 "transferred to the reordered mesh.");
245 }
246
247 return EXIT_SUCCESS;
248}
#define OGS_FATAL(...)
Definition Error.h:26
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:40
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)
std::vector< std::size_t > generateBulkIDsReverseMapping(std::span< std::size_t const > bulk_ids)
Properties & getProperties()
Definition Mesh.h:136
std::vector< std::string > getPropertyVectorNames() const
GITINFOLIB_EXPORT const std::string ogs_version
MeshLib::Mesh * readMeshFromFile(const std::string &file_name, bool const compute_element_neighbors)
int writeMeshToFile(const MeshLib::Mesh &mesh, std::filesystem::path const &file_path, std::set< std::string > variable_output_names)
constexpr std::string_view getBulkIDString(MeshItemType mesh_item_type)
Definition Properties.h:191
PropertyVector< std::size_t > const * bulkNodeIDs(Mesh const &mesh)
Definition Mesh.cpp:293

References MeshLib::bulkNodeIDs(), MeshLib::Cell, MeshLib::Edge, MeshLib::Face, generateBulkIDsReverseMapping(), MeshLib::getBulkIDString(), MeshLib::Mesh::getProperties(), MeshLib::Properties::getPropertyVectorNames(), MeshLib::IntegrationPoint, MeshLib::Node, OGS_FATAL, GitInfoLib::GitInfo::ogs_version, MeshLib::IO::readMeshFromFile(), reorderProperties(), WARN(), and MeshLib::IO::writeMeshToFile().

◆ reorderProperties()

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 )

Definition at line 85 of file ReorderMesh.cpp.

90{
91 for (auto const& property_name : property_names)
92 {
93 bool const success =
94 reorderProperty<double>(original_properties, bulk_ids,
95 property_name, reordered_properties) ||
96 reorderProperty<float>(original_properties, bulk_ids, property_name,
97 reordered_properties) ||
98 reorderProperty<int>(original_properties, bulk_ids, property_name,
99 reordered_properties) ||
100 reorderProperty<long>(original_properties, bulk_ids, property_name,
101 reordered_properties) ||
102 reorderProperty<unsigned>(original_properties, bulk_ids,
103 property_name, reordered_properties) ||
104 reorderProperty<unsigned long>(original_properties, bulk_ids,
105 property_name,
106 reordered_properties) ||
107 reorderProperty<std::size_t>(original_properties, bulk_ids,
108 property_name, reordered_properties) ||
109 reorderProperty<char>(original_properties, bulk_ids, property_name,
110 reordered_properties) ||
111 reorderProperty<unsigned char>(original_properties, bulk_ids,
112 property_name, reordered_properties);
113 if (!success)
114 {
115 OGS_FATAL("Could not reorder PropertyVector '{}'.", property_name);
116 }
117 }
118}
bool reorderProperty(MeshLib::PropertyVector< T > const &original_pv, std::span< std::size_t const > bulk_ids, MeshLib::PropertyVector< T > &reordered_pv)

References OGS_FATAL, and reorderProperty().

Referenced by main().

◆ reorderProperty() [1/2]

template<typename T >
bool reorderProperty ( MeshLib::Properties const & original_properties,
std::span< std::size_t const > bulk_ids,
std::string const & property_name,
MeshLib::Properties & reordered_properties )

Definition at line 68 of file ReorderMesh.cpp.

73{
74 if (!reordered_properties.existsPropertyVector<T>(property_name))
75 {
76 return false;
77 }
78 auto const& original_property =
79 *original_properties.getPropertyVector<T>(property_name);
80 auto& reordered_property =
81 *reordered_properties.getPropertyVector<T>(property_name);
82 return reorderProperty(original_property, bulk_ids, reordered_property);
83}
bool existsPropertyVector(std::string_view name) const
Definition Properties.h:93
PropertyVector< T > const * getPropertyVector(std::string_view name) const

References MeshLib::Properties::existsPropertyVector(), MeshLib::Properties::getPropertyVector(), and reorderProperty().

◆ reorderProperty() [2/2]

template<typename T >
bool reorderProperty ( MeshLib::PropertyVector< T > const & original_pv,
std::span< std::size_t const > bulk_ids,
MeshLib::PropertyVector< T > & reordered_pv )

Definition at line 38 of file ReorderMesh.cpp.

42{
43 if (original_pv.getNumberOfGlobalComponents() !=
44 reordered_pv.getNumberOfGlobalComponents())
45 {
47 "Could not reorder property {} since the number of components "
48 "isn't equal ({} != {}).",
49 original_pv.getPropertyName(),
50 original_pv.getNumberOfGlobalComponents(),
51 reordered_pv.getNumberOfGlobalComponents());
52 }
53
54 auto const number_of_components = original_pv.getNumberOfGlobalComponents();
55 std::size_t pos = 0;
56 for (auto const& id : bulk_ids)
57 {
58 for (int c = 0; c < number_of_components; c++)
59 {
60 reordered_pv.getComponent(id, c) = original_pv.getComponent(pos, c);
61 }
62 pos++;
63 }
64 return true;
65}
int getNumberOfGlobalComponents() const
std::string const & getPropertyName() const
PROP_VAL_TYPE & getComponent(std::size_t tuple_index, int component)
Returns the value for the given component stored in the given tuple.

References MeshLib::PropertyVector< T >::getComponent(), MeshLib::PropertyVectorBase::getNumberOfGlobalComponents(), MeshLib::PropertyVectorBase::getPropertyName(), and OGS_FATAL.

Referenced by reorderProperties(), and reorderProperty().