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
38 std::vector<std::string> var_name;
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) = 0;
73 int m_processorCount{0};
75 std::vector<Ioss::BlockDecompositionData> el_blocks;
76 std::vector<Ioss::SetDecompositionData> node_sets;
77 std::vector<Ioss::SetDecompositionData> side_sets;
80 ex_entity_id
id)
const;
83 void communicate_node_data(T *file_data, T *ioss_data,
size_t comp_count)
const;
86 void communicate_element_data(T *file_data, T *ioss_data,
size_t comp_count)
const;
88 void get_block_connectivity(
int filePtr,
void *data, int64_t
id,
size_t blk_seq,
91 void read_elem_proc_map(
int filePtr,
void *data)
const;
96 int get_set_mesh_var(
int filePtr, ex_entity_type type, ex_entity_id
id,
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;
104 virtual int get_node_coordinates(
int filePtr,
double *ioss_data,
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;
116 template <
typename INT>
class DecompositionData :
public DecompositionDataBase
123 void decompose_model(
int filePtr);
125 IOSS_NODISCARD int spatial_dimension()
const {
return m_decomposition.m_spatialDimension; }
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(); }
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(); }
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(); }
138 IOSS_NODISCARD std::vector<double> ¢roids() {
return m_decomposition.m_centroids; }
140 template <
typename T>
141 void communicate_element_data(T *file_data, T *ioss_data,
size_t comp_count)
const
143 m_decomposition.communicate_element_data(file_data, ioss_data, comp_count);
146 template <
typename T>
148 size_t comp_count)
const
150 m_decomposition.communicate_set_data(file_data, ioss_data, set, comp_count);
153 template <
typename T>
154 void communicate_node_data(T *file_data, T *ioss_data,
size_t comp_count)
const
156 m_decomposition.communicate_node_data(file_data, ioss_data, comp_count);
159 void get_block_connectivity(
int filePtr, INT *data, int64_t
id,
size_t blk_seq,
164 return m_decomposition.m_nodeCommMap.size() / 2;
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;
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;
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;
178 template <
typename T>
179 int get_set_mesh_var(
int filePtr, ex_entity_type type, ex_entity_id
id,
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;
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);
193 IOSS_NODISCARD size_t node_global_to_local(
size_t global_index)
const
195 return m_decomposition.node_global_to_local(global_index);
198 IOSS_NODISCARD size_t elem_global_to_local(
size_t global_index)
const
200 return m_decomposition.elem_global_to_local(global_index);
204#if !defined(NO_ZOLTAN_SUPPORT)
205 void zoltan_decompose(
const std::string &method);
208#if !defined(NO_PARMETIS_SUPPORT)
209 void metis_decompose(
const std::string &method,
const std::vector<INT> &element_dist);
211 void internal_metis_decompose(
const std::string &method, idx_t *element_dist, idx_t *pointer,
212 idx_t *adjacency, idx_t *elem_partition);
215 void simple_decompose(
const std::string &method,
const std::vector<INT> &element_dist)
217 m_decomposition.simple_decompose(method, element_dist);
220 void simple_node_decompose(
const std::string &method,
const std::vector<INT> &node_dist);
222 template <
typename T>
223 int handle_sset_df(
int filePtr, ex_entity_id
id,
const Ioss::Field &field, T *ioss_data)
const;
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;
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;
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;
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;
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;
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;
252 return m_decomposition.i_own_node(node);
258 return m_decomposition.i_own_elem(elem);
261 void build_global_to_local_elem_map() { m_decomposition.build_global_to_local_elem_map(); }
263 void get_element_block_communication()
265 m_decomposition.get_element_block_communication(el_blocks);
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);
274 void get_nodeset_data(
int filePtr,
size_t set_count);
276 void get_sideset_data(
int filePtr,
size_t set_count);
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);
283 void get_shared_node_list() { m_decomposition.get_shared_node_list(); }
285 int get_node_coordinates(
int filePtr,
double *ioss_data,
const Ioss::Field &field)
const;
287 void get_local_node_list() { m_decomposition.get_local_node_list(); }
293 class IOEX_EXPORT ElementBlockBatchReader
296 ElementBlockBatchReader(
const DecompositionDataBase *decompDB);
299 get_connectivity_size(
const std::vector<int64_t> &blocks_subset_index)
const;
302 get_connectivity(
int filePtr,
const std::vector<int64_t> &blocks_subset_index,
306 get_offset(
const std::vector<int64_t> &blocks_subset_index,
307 const std::vector<int> &block_component_count)
const;
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;
313 const DecompositionDataBase *m_decompositionDB{
nullptr};
316 template <
typename INT>
317 std::vector<size_t> get_connectivity_impl(
int filePtr,
318 const std::vector<int64_t> &blocks_subset_index,
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;
326 template <
typename INT>
328 get_connectivity_file_offset(
const std::vector<int64_t> &blocks_subset_index)
const;
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;
335 get_connectivity_component_count(
const std::vector<int64_t> &blocks_subset_index)
const;
338 get_block_component_count(
const std::vector<int64_t> &blockSubsetIndex,
339 const std::vector<BlockFieldData> &blockFieldData)
const;
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;
#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
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