IOSS 2.0
Loading...
Searching...
No Matches
Ioex_DecompositionData.h
Go to the documentation of this file.
1/*
2 * Copyright(C) 1999-2024 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 std::vector<std::string> 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) = 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
70 Ioss_MPI_Comm comm_;
71
72 int m_processor{0};
73 int m_processorCount{0};
74
75 std::vector<Ioss::BlockDecompositionData> el_blocks;
76 std::vector<Ioss::SetDecompositionData> node_sets;
77 std::vector<Ioss::SetDecompositionData> side_sets;
78
79 IOSS_NODISCARD const Ioss::SetDecompositionData &get_decomp_set(ex_entity_type type,
80 ex_entity_id id) const;
81
82 template <typename T>
83 void communicate_node_data(T *file_data, T *ioss_data, size_t comp_count) const;
84
85 template <typename T>
86 void communicate_element_data(T *file_data, T *ioss_data, size_t comp_count) const;
87
88 void get_block_connectivity(int filePtr, void *data, int64_t id, size_t blk_seq,
89 size_t nnpe) const;
90
91 void read_elem_proc_map(int filePtr, void *data) const;
92
93 void get_node_entity_proc_data(void *entity_proc, const Ioss::MapContainer &node_map,
94 bool do_map) const;
95
96 int get_set_mesh_var(int filePtr, ex_entity_type type, ex_entity_id id,
97 const Ioss::Field &field, void *ioss_data) const;
98
99 int get_set_mesh_double(int filePtr, ex_entity_type type, ex_entity_id id,
100 const Ioss::Field &field, double *ioss_data) const;
101
102 IOSS_NODISCARD virtual size_t get_commset_node_size() const = 0;
103
104 virtual int get_node_coordinates(int filePtr, double *ioss_data,
105 const Ioss::Field &field) const = 0;
106 virtual int get_one_attr(int exoid, ex_entity_type obj_type, ex_entity_id obj_id,
107 int attrib_index, double *attrib) const = 0;
108 virtual int get_attr(int exoid, ex_entity_type obj_type, ex_entity_id obj_id, size_t attr_count,
109 double *attrib) const = 0;
110 virtual int get_var(int filePtr, int step, ex_entity_type type, int var_index, ex_entity_id id,
111 int64_t num_entity, std::vector<double> &data) const = 0;
112 virtual int get_user_map(int exoid, ex_entity_type obj_type, ex_entity_id id, int map_index,
113 size_t offset, size_t num_entity, void *map_data) const = 0;
114 };
115
116 template <typename INT> class DecompositionData : public DecompositionDataBase
117 {
118 public:
119 DecompositionData(const Ioss::PropertyManager &props, Ioss_MPI_Comm communicator);
120
121 IOSS_NODISCARD int int_size() const { return sizeof(INT); }
122
123 void decompose_model(int filePtr);
124
125 IOSS_NODISCARD int spatial_dimension() const { return m_decomposition.m_spatialDimension; }
126
127 IOSS_NODISCARD size_t global_node_count() const { return m_decomposition.global_node_count(); }
128 IOSS_NODISCARD size_t global_elem_count() const { return m_decomposition.global_elem_count(); }
129
130 IOSS_NODISCARD size_t ioss_node_count() const { return m_decomposition.ioss_node_count(); }
131 IOSS_NODISCARD size_t ioss_elem_count() const { return m_decomposition.ioss_elem_count(); }
132
133 IOSS_NODISCARD size_t decomp_node_offset() const { return m_decomposition.file_node_offset(); }
134 IOSS_NODISCARD size_t decomp_node_count() const { return m_decomposition.file_node_count(); }
135 IOSS_NODISCARD size_t decomp_elem_offset() const { return m_decomposition.file_elem_offset(); }
136 IOSS_NODISCARD size_t decomp_elem_count() const { return m_decomposition.file_elem_count(); }
137
138 IOSS_NODISCARD std::vector<double> &centroids() { return m_decomposition.m_centroids; }
139
140 template <typename T>
141 void communicate_element_data(T *file_data, T *ioss_data, size_t comp_count) const
142 {
143 m_decomposition.communicate_element_data(file_data, ioss_data, comp_count);
144 }
145
146 template <typename T>
147 void communicate_set_data(T *file_data, T *ioss_data, const Ioss::SetDecompositionData &set,
148 size_t comp_count) const
149 {
150 m_decomposition.communicate_set_data(file_data, ioss_data, set, comp_count);
151 }
152
153 template <typename T>
154 void communicate_node_data(T *file_data, T *ioss_data, size_t comp_count) const
155 {
156 m_decomposition.communicate_node_data(file_data, ioss_data, comp_count);
157 }
158
159 void get_block_connectivity(int filePtr, INT *data, int64_t id, size_t blk_seq,
160 size_t nnpe) const;
161
162 IOSS_NODISCARD size_t get_commset_node_size() const
163 {
164 return m_decomposition.m_nodeCommMap.size() / 2;
165 }
166
167 int get_attr(int filePtr, ex_entity_type obj_type, ex_entity_id id, size_t attr_count,
168 double *attrib) const;
169 int get_one_attr(int filePtr, ex_entity_type obj_type, ex_entity_id id, int attrib_index,
170 double *attrib) const;
171
172 int get_var(int filePtr, int step, ex_entity_type type, int var_index, ex_entity_id id,
173 int64_t num_entity, std::vector<double> &data) const;
174
175 int get_user_map(int exoid, ex_entity_type obj_type, ex_entity_id id, int map_index,
176 size_t offset, size_t num_entity, void *map_data) const;
177
178 template <typename T>
179 int get_set_mesh_var(int filePtr, ex_entity_type type, ex_entity_id id,
180 const Ioss::Field &field, T *ioss_data) const;
181
182 IOSS_NODISCARD size_t get_block_seq(ex_entity_type type, ex_entity_id id) const;
183 IOSS_NODISCARD size_t get_block_element_count(size_t blk_seq) const;
184 IOSS_NODISCARD size_t get_block_element_offset(size_t blk_seq) const;
185
186 void create_implicit_global_map(const std::vector<int> &owning_proc,
187 std::vector<int64_t> &global_implicit_map, Ioss::Map &node_map,
188 int64_t *locally_owned_count, int64_t *processor_offset);
189
190 // global_index is 1-based index into global list of nodes [1..global_node_count]
191 // return value is 1-based index into local list of nodes on this
192 // processor (ioss-decomposition)
193 IOSS_NODISCARD size_t node_global_to_local(size_t global_index) const
194 {
195 return m_decomposition.node_global_to_local(global_index);
196 }
197
198 IOSS_NODISCARD size_t elem_global_to_local(size_t global_index) const
199 {
200 return m_decomposition.elem_global_to_local(global_index);
201 }
202
203 private:
204#if !defined(NO_ZOLTAN_SUPPORT)
205 void zoltan_decompose(const std::string &method);
206#endif
207
208#if !defined(NO_PARMETIS_SUPPORT)
209 void metis_decompose(const std::string &method, const std::vector<INT> &element_dist);
210
211 void internal_metis_decompose(const std::string &method, idx_t *element_dist, idx_t *pointer,
212 idx_t *adjacency, idx_t *elem_partition);
213#endif
214
215 void simple_decompose(const std::string &method, const std::vector<INT> &element_dist)
216 {
217 m_decomposition.simple_decompose(method, element_dist);
218 }
219
220 void simple_node_decompose(const std::string &method, const std::vector<INT> &node_dist);
221
222 template <typename T>
223 int handle_sset_df(int filePtr, ex_entity_id id, const Ioss::Field &field, T *ioss_data) const;
224
225 int get_one_set_attr(int filePtr, ex_entity_type type, ex_entity_id id, int attr_index,
226 double *ioss_data) const;
227 int get_one_node_attr(int filePtr, ex_entity_id id, int attr_index, double *ioss_data) const;
228 int get_one_elem_attr(int filePtr, ex_entity_id id, int attr_index, double *ioss_data) const;
229
230 int get_set_attr(int filePtr, ex_entity_type type, ex_entity_id id, size_t comp_count,
231 double *ioss_data) const;
232 int get_node_attr(int filePtr, ex_entity_id id, size_t comp_count, double *ioss_data) const;
233 int get_elem_attr(int filePtr, ex_entity_id id, size_t comp_count, double *ioss_data) const;
234
235 int get_elem_map(int filePtr, ex_entity_id blk_id, int map_index, size_t offset, size_t count,
236 void *ioss_data) const;
237 int get_node_map(int filePtr, int map_index, size_t offset, size_t count,
238 void *ioss_data) const;
239
240 int get_node_var(int filePtr, int step, int var_index, ex_entity_id id, int64_t num_entity,
241 std::vector<double> &ioss_data) const;
242
243 int get_elem_var(int filePtr, int step, int var_index, ex_entity_id id, int64_t num_entity,
244 std::vector<double> &ioss_data) const;
245
246 int get_set_var(int filePtr, int step, int var_index, ex_entity_type type, ex_entity_id id,
247 int64_t num_entity, std::vector<double> &ioss_data) const;
248
249 IOSS_NODISCARD bool i_own_node(size_t node) const
250 {
251 // T/F if the node with global index `node` is owned by this processors ioss-decomp.
252 return m_decomposition.i_own_node(node);
253 }
254
255 IOSS_NODISCARD bool i_own_elem(size_t elem) const
256 // T/F if the element with global index `elem` is owned by this processors ioss-decomp.
257 {
258 return m_decomposition.i_own_elem(elem);
259 }
260
261 void build_global_to_local_elem_map() { m_decomposition.build_global_to_local_elem_map(); }
262
263 void get_element_block_communication()
264 {
265 m_decomposition.get_element_block_communication(el_blocks);
266 }
267
268 void generate_adjacency_list(int filePtr, Ioss::Decomposition<INT> &decomposition);
269
270 void get_common_set_data(int filePtr, ex_entity_type set_type,
271 std::vector<Ioss::SetDecompositionData> &sets,
272 const std::string &set_type_name);
273
274 void get_nodeset_data(int filePtr, size_t set_count);
275
276 void get_sideset_data(int filePtr, size_t set_count);
277
278 void calculate_element_centroids(int filePtr, const std::vector<INT> &node_dist);
279#if !defined(NO_ZOLTAN_SUPPORT)
280 void get_local_element_list(const ZOLTAN_ID_PTR &export_global_ids, size_t export_count);
281#endif
282
283 void get_shared_node_list() { m_decomposition.get_shared_node_list(); }
284
285 int get_node_coordinates(int filePtr, double *ioss_data, const Ioss::Field &field) const;
286
287 void get_local_node_list() { m_decomposition.get_local_node_list(); }
288
289 public:
290 Ioss::Decomposition<INT> m_decomposition;
291 };
292
293 class IOEX_EXPORT ElementBlockBatchReader
294 {
295 public:
296 ElementBlockBatchReader(const DecompositionDataBase *decompDB);
297
298 IOSS_NODISCARD size_t
299 get_connectivity_size(const std::vector<int64_t> &blocks_subset_index) const;
300
301 IOSS_NODISCARD std::vector<size_t>
302 get_connectivity(int filePtr, const std::vector<int64_t> &blocks_subset_index,
303 void *data) const;
304
305 IOSS_NODISCARD std::vector<size_t>
306 get_offset(const std::vector<int64_t> &blocks_subset_index,
307 const std::vector<int> &block_component_count) const;
308
309 void get_field_data(int filePtr, void *data, const std::vector<int64_t> &blocks_subset_index,
310 size_t step, const std::vector<BlockFieldData> &block_data) const;
311
312 private:
313 const DecompositionDataBase *m_decompositionDB{nullptr};
314 Ioss::ElementBlockBatchOffset m_batchOffset;
315
316 template <typename INT>
317 std::vector<size_t> get_connectivity_impl(int filePtr,
318 const std::vector<int64_t> &blocks_subset_index,
319 void *data) const;
320
321 template <typename INT>
322 void get_field_data_impl(int filePtr, void *iossData,
323 const std::vector<int64_t> &blocks_subset_index, size_t step,
324 const std::vector<BlockFieldData> &block_data) const;
325
326 template <typename INT>
327 std::vector<size_t>
328 get_connectivity_file_offset(const std::vector<int64_t> &blocks_subset_index) const;
329
330 template <typename INT>
331 std::vector<size_t> get_file_offset(const std::vector<int64_t> &blocks_subset_index,
332 const std::vector<int> &block_component_count) const;
333
334 std::vector<int>
335 get_connectivity_component_count(const std::vector<int64_t> &blocks_subset_index) const;
336
337 std::vector<int>
338 get_block_component_count(const std::vector<int64_t> &blockSubsetIndex,
339 const std::vector<BlockFieldData> &blockFieldData) const;
340
341 template <typename INT>
342 void load_field_data(int filePtr, double *fileData,
343 const std::vector<int64_t> &blockSubsetIndex, size_t step,
344 const std::vector<BlockFieldData> &blockFieldData,
345 const std::vector<int> &blockComponentCount,
346 const std::vector<size_t> &fileConnOffset) const;
347 };
348} // namespace Ioex
349#endif
#define IOSS_NODISCARD
Definition Ioss_CodeTypes.h:54
int Ioss_MPI_Comm
Definition Ioss_CodeTypes.h:63
Definition Ioss_Decomposition.h:180
Definition Ioss_Decomposition.h:140
Holds metadata for bulk data associated with a GroupingEntity.
Definition Ioss_Field.h:25
Definition Ioss_Map.h:46
A collection of Ioss::Property objects.
Definition Ioss_PropertyManager.h:36
Definition Ioss_Decomposition.h:92
A namespace for the exodus database format.
Definition Ioex_BaseDatabaseIO.C:198
The main namespace for the Ioss library.
Definition Ioad_DatabaseIO.C:40
std::vector< int64_t > MapContainer
Definition Ioss_Map.h:29
int64_t id(Ioss::GroupingEntity *entity)
Definition io_info.C:124