11#if defined PARALLEL_AWARE_EXODUS
16#include "ioex_export.h"
17#if !defined(NO_PARMETIS_SUPPORT)
22#if !defined(NO_ZOLTAN_SUPPORT)
23#include <zoltan_cpp.h>
34 struct IOEX_EXPORT BlockFieldData
39 std::vector<size_t> var_index;
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_) {}
46 class IOEX_EXPORT DecompositionDataBase
50 DecompositionDataBase(
const DecompositionDataBase &) =
delete;
51 DecompositionDataBase &operator=(
const DecompositionDataBase &) =
delete;
53 virtual ~DecompositionDataBase() =
default;
55 virtual void decompose_model(
int filePtr,
const std::string &filename) = 0;
71 virtual void set_block_omissions(
const Ioss::NameList &omissions) = 0;
76 int m_processorCount{0};
78 std::vector<Ioss::BlockDecompositionData> el_blocks;
79 std::vector<Ioss::SetDecompositionData> node_sets;
80 std::vector<Ioss::SetDecompositionData> side_sets;
82 IOSS_NODISCARD const Ioss::SetDecompositionData &get_decomp_set(ex_entity_type type,
83 ex_entity_id
id)
const;
86 void communicate_node_data(T *file_data, T *ioss_data,
size_t comp_count)
const;
89 void communicate_element_data(T *file_data, T *ioss_data,
size_t comp_count)
const;
91 void get_block_connectivity(
int filePtr,
void *data, int64_t
id,
size_t blk_seq,
94 void read_elem_proc_map(
int filePtr,
void *data)
const;
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;
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;
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;
119 template <
typename INT>
class DecompositionData :
public DecompositionDataBase
122 DecompositionData(
const Ioss::PropertyManager &props,
Ioss_MPI_Comm communicator);
126 void decompose_model(
int filePtr,
const std::string &filename);
128 IOSS_NODISCARD int spatial_dimension()
const {
return m_decomposition.m_spatialDimension; }
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(); }
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(); }
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(); }
141 IOSS_NODISCARD std::vector<double> ¢roids() {
return m_decomposition.m_centroids; }
142 IOSS_NODISCARD std::vector<float> &weights() {
return m_decomposition.m_weights; }
146 m_decomposition.set_block_omissions(omissions);
149 template <
typename T>
150 void communicate_element_data(T *file_data, T *ioss_data,
size_t comp_count)
const
152 m_decomposition.communicate_element_data(file_data, ioss_data, comp_count);
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
159 m_decomposition.communicate_set_data(file_data, ioss_data, set, comp_count);
162 template <
typename T>
163 void communicate_node_data(T *file_data, T *ioss_data,
size_t comp_count)
const
165 m_decomposition.communicate_node_data(file_data, ioss_data, comp_count);
168 void get_block_connectivity(
int filePtr, INT *data, int64_t
id,
size_t blk_seq,
173 return m_decomposition.m_nodeCommMap.size() / 2;
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;
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;
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;
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;
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;
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);
202 IOSS_NODISCARD size_t node_global_to_local(
size_t global_index)
const
204 return m_decomposition.node_global_to_local(global_index);
207 IOSS_NODISCARD size_t elem_global_to_local(
size_t global_index)
const
209 return m_decomposition.elem_global_to_local(global_index);
213#if !defined(NO_ZOLTAN_SUPPORT)
214 void zoltan_decompose(
const std::string &method);
217#if !defined(NO_PARMETIS_SUPPORT)
218 void metis_decompose(
const std::string &method,
const std::vector<INT> &element_dist);
220 void internal_metis_decompose(
const std::string &method, idx_t *element_dist, idx_t *pointer,
221 idx_t *adjacency, idx_t *elem_partition);
224 void simple_decompose(
const std::string &method,
const std::vector<INT> &element_dist)
226 m_decomposition.simple_decompose(method, element_dist);
229 void simple_node_decompose(
const std::string &method,
const std::vector<INT> &node_dist);
231 template <
typename T>
232 int handle_sset_df(
int filePtr, ex_entity_id
id,
const Ioss::Field &field, T *ioss_data)
const;
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;
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;
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;
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;
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;
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;
261 return m_decomposition.i_own_node(node);
267 return m_decomposition.i_own_elem(elem);
270 void build_global_to_local_elem_map() { m_decomposition.build_global_to_local_elem_map(); }
272 void get_element_block_communication()
274 m_decomposition.get_element_block_communication(el_blocks);
277 void generate_adjacency_list(
int filePtr, Ioss::Decomposition<INT> &decomposition);
278 void generate_omitted_block_weights(
int filePtr, Ioss::Decomposition<INT> &decomposition);
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);
284 void get_nodeset_data(
int filePtr,
size_t set_count);
286 void get_sideset_data(
int filePtr,
size_t set_count);
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);
293 void get_shared_node_list() { m_decomposition.get_shared_node_list(); }
295 int get_node_coordinates(
int filePtr,
double *ioss_data,
const Ioss::Field &field)
const;
297 void get_local_node_list() { m_decomposition.get_local_node_list(); }
300 Ioss::Decomposition<INT> m_decomposition;
303 class IOEX_EXPORT ElementBlockBatchReader
306 ElementBlockBatchReader(
const DecompositionDataBase *decompDB);
309 get_connectivity_size(
const std::vector<int64_t> &blocks_subset_index)
const;
312 get_connectivity(
int filePtr,
const std::vector<int64_t> &blocks_subset_index,
316 get_offset(
const std::vector<int64_t> &blocks_subset_index,
317 const std::vector<int> &block_component_count)
const;
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;
323 const DecompositionDataBase *m_decompositionDB{
nullptr};
324 Ioss::ElementBlockBatchOffset m_batchOffset;
326 template <
typename INT>
327 std::vector<size_t> get_connectivity_impl(
int filePtr,
328 const std::vector<int64_t> &blocks_subset_index,
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;
336 template <
typename INT>
338 get_connectivity_file_offset(
const std::vector<int64_t> &blocks_subset_index)
const;
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;
345 get_connectivity_component_count(
const std::vector<int64_t> &blocks_subset_index)
const;
348 get_block_component_count(
const std::vector<int64_t> &blockSubsetIndex,
349 const std::vector<BlockFieldData> &blockFieldData)
const;
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;
#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