IOSS 2.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Ioex_DecompositionData.h
Go to the documentation of this file.
1/*
2 * Copyright(C) 1999-2025 National Technology & Engineering Solutions
3 * of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
4 * NTESS, the U.S. Government retains certain rights in this software.
5 *
6 * See packages/seacas/LICENSE for details
7 */
8#pragma once
9
10#include <exodusII.h>
11#if defined PARALLEL_AWARE_EXODUS
12
13#include "Ioss_CodeTypes.h"
14#include <vector>
15
16#include "ioex_export.h"
17#if !defined(NO_PARMETIS_SUPPORT)
18#include <parmetis.h>
19#endif
20
21#undef MPICPP
22#if !defined(NO_ZOLTAN_SUPPORT)
23#include <zoltan_cpp.h>
24#endif
25#include "Ioss_Decomposition.h"
26#include "Ioss_Map.h"
28
29namespace Ioss {
30 class Field;
31 class ElementBlock;
32} // namespace Ioss
33namespace Ioex {
34 struct IOEX_EXPORT BlockFieldData
35 {
36 int64_t id{0};
37 size_t comp_count{0};
38 Ioss::NameList var_name;
39 std::vector<size_t> var_index;
40
41 BlockFieldData() : id(0), comp_count(0) {}
42 BlockFieldData(const int64_t id_) : id(id_), comp_count(0) {}
43 BlockFieldData(const int64_t id_, size_t comp_count_) : id(id_), comp_count(comp_count_) {}
44 };
45
46 class IOEX_EXPORT DecompositionDataBase
47 {
48 public:
49 DecompositionDataBase(Ioss_MPI_Comm comm) : comm_(comm) {}
50 DecompositionDataBase(const DecompositionDataBase &) = delete;
51 DecompositionDataBase &operator=(const DecompositionDataBase &) = delete;
52
53 virtual ~DecompositionDataBase() = default;
54 IOSS_NODISCARD virtual int int_size() const = 0;
55 virtual void decompose_model(int filePtr, const std::string &filename) = 0;
56 IOSS_NODISCARD virtual size_t ioss_node_count() const = 0;
57 IOSS_NODISCARD virtual size_t ioss_elem_count() const = 0;
58
59 IOSS_NODISCARD virtual int spatial_dimension() const = 0;
60 IOSS_NODISCARD virtual size_t global_node_count() const = 0;
61 IOSS_NODISCARD virtual size_t global_elem_count() const = 0;
62
63 IOSS_NODISCARD virtual size_t decomp_node_offset() const = 0;
64 IOSS_NODISCARD virtual size_t decomp_node_count() const = 0;
65 IOSS_NODISCARD virtual size_t decomp_elem_offset() const = 0;
66 IOSS_NODISCARD virtual size_t decomp_elem_count() const = 0;
67
68 IOSS_NODISCARD virtual std::vector<double> &centroids() = 0;
69 IOSS_NODISCARD virtual std::vector<float> &weights() = 0;
70
71 virtual void set_block_omissions(const Ioss::NameList &omissions) = 0;
72
73 Ioss_MPI_Comm comm_;
74
75 int m_processor{0};
76 int m_processorCount{0};
77
78 std::vector<Ioss::BlockDecompositionData> el_blocks;
79 std::vector<Ioss::SetDecompositionData> node_sets;
80 std::vector<Ioss::SetDecompositionData> side_sets;
81
82 IOSS_NODISCARD const Ioss::SetDecompositionData &get_decomp_set(ex_entity_type type,
83 ex_entity_id id) const;
84
85 template <typename T>
86 void communicate_node_data(T *file_data, T *ioss_data, size_t comp_count) const;
87
88 template <typename T>
89 void communicate_element_data(T *file_data, T *ioss_data, size_t comp_count) const;
90
91 void get_block_connectivity(int filePtr, void *data, int64_t id, size_t blk_seq,
92 size_t nnpe) const;
93
94 void read_elem_proc_map(int filePtr, void *data) const;
95
96 void get_node_entity_proc_data(void *entity_proc, const Ioss::MapContainer &node_map,
97 bool do_map) const;
98
99 int get_set_mesh_var(int filePtr, ex_entity_type type, ex_entity_id id,
100 const Ioss::Field &field, void *ioss_data) const;
101
102 int get_set_mesh_double(int filePtr, ex_entity_type type, ex_entity_id id,
103 const Ioss::Field &field, double *ioss_data) const;
104
105 IOSS_NODISCARD virtual size_t get_commset_node_size() const = 0;
106
107 virtual int get_node_coordinates(int filePtr, double *ioss_data,
108 const Ioss::Field &field) const = 0;
109 virtual int get_one_attr(int exoid, ex_entity_type obj_type, ex_entity_id obj_id,
110 int attrib_index, double *attrib) const = 0;
111 virtual int get_attr(int exoid, ex_entity_type obj_type, ex_entity_id obj_id, size_t attr_count,
112 double *attrib) const = 0;
113 virtual int get_var(int filePtr, int step, ex_entity_type type, int var_index, ex_entity_id id,
114 int64_t num_entity, std::vector<double> &data) const = 0;
115 virtual int get_user_map(int exoid, ex_entity_type obj_type, ex_entity_id id, int map_index,
116 size_t offset, size_t num_entity, void *map_data) const = 0;
117 };
118
119 template <typename INT> class DecompositionData : public DecompositionDataBase
120 {
121 public:
122 DecompositionData(const Ioss::PropertyManager &props, Ioss_MPI_Comm communicator);
123
124 IOSS_NODISCARD int int_size() const { return sizeof(INT); }
125
126 void decompose_model(int filePtr, const std::string &filename);
127
128 IOSS_NODISCARD int spatial_dimension() const { return m_decomposition.m_spatialDimension; }
129
130 IOSS_NODISCARD size_t global_node_count() const { return m_decomposition.global_node_count(); }
131 IOSS_NODISCARD size_t global_elem_count() const { return m_decomposition.global_elem_count(); }
132
133 IOSS_NODISCARD size_t ioss_node_count() const { return m_decomposition.ioss_node_count(); }
134 IOSS_NODISCARD size_t ioss_elem_count() const { return m_decomposition.ioss_elem_count(); }
135
136 IOSS_NODISCARD size_t decomp_node_offset() const { return m_decomposition.file_node_offset(); }
137 IOSS_NODISCARD size_t decomp_node_count() const { return m_decomposition.file_node_count(); }
138 IOSS_NODISCARD size_t decomp_elem_offset() const { return m_decomposition.file_elem_offset(); }
139 IOSS_NODISCARD size_t decomp_elem_count() const { return m_decomposition.file_elem_count(); }
140
141 IOSS_NODISCARD std::vector<double> &centroids() { return m_decomposition.m_centroids; }
142 IOSS_NODISCARD std::vector<float> &weights() { return m_decomposition.m_weights; }
143
144 void set_block_omissions(const Ioss::NameList &omissions)
145 {
146 m_decomposition.set_block_omissions(omissions);
147 }
148
149 template <typename T>
150 void communicate_element_data(T *file_data, T *ioss_data, size_t comp_count) const
151 {
152 m_decomposition.communicate_element_data(file_data, ioss_data, comp_count);
153 }
154
155 template <typename T>
156 void communicate_set_data(T *file_data, T *ioss_data, const Ioss::SetDecompositionData &set,
157 size_t comp_count) const
158 {
159 m_decomposition.communicate_set_data(file_data, ioss_data, set, comp_count);
160 }
161
162 template <typename T>
163 void communicate_node_data(T *file_data, T *ioss_data, size_t comp_count) const
164 {
165 m_decomposition.communicate_node_data(file_data, ioss_data, comp_count);
166 }
167
168 void get_block_connectivity(int filePtr, INT *data, int64_t id, size_t blk_seq,
169 size_t nnpe) const;
170
171 IOSS_NODISCARD size_t get_commset_node_size() const
172 {
173 return m_decomposition.m_nodeCommMap.size() / 2;
174 }
175
176 int get_attr(int filePtr, ex_entity_type obj_type, ex_entity_id id, size_t attr_count,
177 double *attrib) const;
178 int get_one_attr(int filePtr, ex_entity_type obj_type, ex_entity_id id, int attrib_index,
179 double *attrib) const;
180
181 int get_var(int filePtr, int step, ex_entity_type type, int var_index, ex_entity_id id,
182 int64_t num_entity, std::vector<double> &data) const;
183
184 int get_user_map(int exoid, ex_entity_type obj_type, ex_entity_id id, int map_index,
185 size_t offset, size_t num_entity, void *map_data) const;
186
187 template <typename T>
188 int get_set_mesh_var(int filePtr, ex_entity_type type, ex_entity_id id,
189 const Ioss::Field &field, T *ioss_data) const;
190
191 IOSS_NODISCARD size_t get_block_seq(ex_entity_type type, ex_entity_id id) const;
192 IOSS_NODISCARD size_t get_block_element_count(size_t blk_seq) const;
193 IOSS_NODISCARD size_t get_block_element_offset(size_t blk_seq) const;
194
195 void create_implicit_global_map(const std::vector<int> &owning_proc,
196 std::vector<int64_t> &global_implicit_map, Ioss::Map &node_map,
197 int64_t *locally_owned_count, int64_t *processor_offset);
198
199 // global_index is 1-based index into global list of nodes [1..global_node_count]
200 // return value is 1-based index into local list of nodes on this
201 // processor (ioss-decomposition)
202 IOSS_NODISCARD size_t node_global_to_local(size_t global_index) const
203 {
204 return m_decomposition.node_global_to_local(global_index);
205 }
206
207 IOSS_NODISCARD size_t elem_global_to_local(size_t global_index) const
208 {
209 return m_decomposition.elem_global_to_local(global_index);
210 }
211
212 private:
213#if !defined(NO_ZOLTAN_SUPPORT)
214 void zoltan_decompose(const std::string &method);
215#endif
216
217#if !defined(NO_PARMETIS_SUPPORT)
218 void metis_decompose(const std::string &method, const std::vector<INT> &element_dist);
219
220 void internal_metis_decompose(const std::string &method, idx_t *element_dist, idx_t *pointer,
221 idx_t *adjacency, idx_t *elem_partition);
222#endif
223
224 void simple_decompose(const std::string &method, const std::vector<INT> &element_dist)
225 {
226 m_decomposition.simple_decompose(method, element_dist);
227 }
228
229 void simple_node_decompose(const std::string &method, const std::vector<INT> &node_dist);
230
231 template <typename T>
232 int handle_sset_df(int filePtr, ex_entity_id id, const Ioss::Field &field, T *ioss_data) const;
233
234 int get_one_set_attr(int filePtr, ex_entity_type type, ex_entity_id id, int attr_index,
235 double *ioss_data) const;
236 int get_one_node_attr(int filePtr, ex_entity_id id, int attr_index, double *ioss_data) const;
237 int get_one_elem_attr(int filePtr, ex_entity_id id, int attr_index, double *ioss_data) const;
238
239 int get_set_attr(int filePtr, ex_entity_type type, ex_entity_id id, size_t comp_count,
240 double *ioss_data) const;
241 int get_node_attr(int filePtr, ex_entity_id id, size_t comp_count, double *ioss_data) const;
242 int get_elem_attr(int filePtr, ex_entity_id id, size_t comp_count, double *ioss_data) const;
243
244 int get_elem_map(int filePtr, ex_entity_id blk_id, int map_index, size_t offset, size_t count,
245 void *ioss_data) const;
246 int get_node_map(int filePtr, int map_index, size_t offset, size_t count,
247 void *ioss_data) const;
248
249 int get_node_var(int filePtr, int step, int var_index, ex_entity_id id, int64_t num_entity,
250 std::vector<double> &ioss_data) const;
251
252 int get_elem_var(int filePtr, int step, int var_index, ex_entity_id id, int64_t num_entity,
253 std::vector<double> &ioss_data) const;
254
255 int get_set_var(int filePtr, int step, int var_index, ex_entity_type type, ex_entity_id id,
256 int64_t num_entity, std::vector<double> &ioss_data) const;
257
258 IOSS_NODISCARD bool i_own_node(size_t node) const
259 {
260 // T/F if the node with global index `node` is owned by this processors ioss-decomp.
261 return m_decomposition.i_own_node(node);
262 }
263
264 IOSS_NODISCARD bool i_own_elem(size_t elem) const
265 // T/F if the element with global index `elem` is owned by this processors ioss-decomp.
266 {
267 return m_decomposition.i_own_elem(elem);
268 }
269
270 void build_global_to_local_elem_map() { m_decomposition.build_global_to_local_elem_map(); }
271
272 void get_element_block_communication()
273 {
274 m_decomposition.get_element_block_communication(el_blocks);
275 }
276
277 void generate_adjacency_list(int filePtr, Ioss::Decomposition<INT> &decomposition);
278 void generate_omitted_block_weights(int filePtr, Ioss::Decomposition<INT> &decomposition);
279
280 void get_common_set_data(int filePtr, ex_entity_type set_type,
281 std::vector<Ioss::SetDecompositionData> &sets,
282 const std::string &set_type_name);
283
284 void get_nodeset_data(int filePtr, size_t set_count);
285
286 void get_sideset_data(int filePtr, size_t set_count);
287
288 void calculate_element_centroids(int filePtr, const std::vector<INT> &node_dist);
289#if !defined(NO_ZOLTAN_SUPPORT)
290 void get_local_element_list(const ZOLTAN_ID_PTR &export_global_ids, size_t export_count);
291#endif
292
293 void get_shared_node_list() { m_decomposition.get_shared_node_list(); }
294
295 int get_node_coordinates(int filePtr, double *ioss_data, const Ioss::Field &field) const;
296
297 void get_local_node_list() { m_decomposition.get_local_node_list(); }
298
299 public:
300 Ioss::Decomposition<INT> m_decomposition;
301 };
302
303 class IOEX_EXPORT ElementBlockBatchReader
304 {
305 public:
306 ElementBlockBatchReader(const DecompositionDataBase *decompDB);
307
308 IOSS_NODISCARD size_t
309 get_connectivity_size(const std::vector<int64_t> &blocks_subset_index) const;
310
311 IOSS_NODISCARD std::vector<size_t>
312 get_connectivity(int filePtr, const std::vector<int64_t> &blocks_subset_index,
313 void *data) const;
314
315 IOSS_NODISCARD std::vector<size_t>
316 get_offset(const std::vector<int64_t> &blocks_subset_index,
317 const std::vector<int> &block_component_count) const;
318
319 void get_field_data(int filePtr, void *data, const std::vector<int64_t> &blocks_subset_index,
320 size_t step, const std::vector<BlockFieldData> &block_data) const;
321
322 private:
323 const DecompositionDataBase *m_decompositionDB{nullptr};
324 Ioss::ElementBlockBatchOffset m_batchOffset;
325
326 template <typename INT>
327 std::vector<size_t> get_connectivity_impl(int filePtr,
328 const std::vector<int64_t> &blocks_subset_index,
329 void *data) const;
330
331 template <typename INT>
332 void get_field_data_impl(int filePtr, void *iossData,
333 const std::vector<int64_t> &blocks_subset_index, size_t step,
334 const std::vector<BlockFieldData> &block_data) const;
335
336 template <typename INT>
337 std::vector<size_t>
338 get_connectivity_file_offset(const std::vector<int64_t> &blocks_subset_index) const;
339
340 template <typename INT>
341 std::vector<size_t> get_file_offset(const std::vector<int64_t> &blocks_subset_index,
342 const std::vector<int> &block_component_count) const;
343
344 std::vector<int>
345 get_connectivity_component_count(const std::vector<int64_t> &blocks_subset_index) const;
346
347 std::vector<int>
348 get_block_component_count(const std::vector<int64_t> &blockSubsetIndex,
349 const std::vector<BlockFieldData> &blockFieldData) const;
350
351 template <typename INT>
352 void load_field_data(int filePtr, double *fileData,
353 const std::vector<int64_t> &blockSubsetIndex, size_t step,
354 const std::vector<BlockFieldData> &blockFieldData,
355 const std::vector<int> &blockComponentCount,
356 const std::vector<size_t> &fileConnOffset) const;
357 };
358} // namespace Ioex
359#endif
#define IOSS_NODISCARD
Definition Ioss_CodeTypes.h:56
MPI_Comm Ioss_MPI_Comm
Definition Ioss_CodeTypes.h:61
A collection of elements having the same topology.
Definition Ioss_ElementBlock.h:29
Holds metadata for bulk data associated with a GroupingEntity.
Definition Ioss_Field.h:25
A namespace for the exodus database format.
Definition Ioex_BaseDatabaseIO.C:170
The main namespace for the Ioss library.
Definition Ioad_DatabaseIO.C:40
Ioss::NameList NameList
Definition Ioss_ChangeSetFactory.h:25
std::vector< int64_t > MapContainer
Definition Ioss_Map.h:29
int64_t id(Ioss::GroupingEntity *entity)
Definition io_info.C:132