IOSS 2.0
Loading...
Searching...
No Matches
Ioexnl_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 "ioexnl_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}
32namespace Ioexnl {
33
34 class IOEXNL_EXPORT DecompositionDataBase
35 {
36 public:
37 DecompositionDataBase(Ioss_MPI_Comm comm) : comm_(comm) {}
38 DecompositionDataBase(const DecompositionDataBase &) = delete;
39 DecompositionDataBase &operator=(const DecompositionDataBase &) = delete;
40
41 virtual ~DecompositionDataBase() = default;
42 IOSS_NODISCARD virtual int int_size() const = 0;
43 IOSS_NODISCARD virtual size_t ioss_node_count() const = 0;
44 IOSS_NODISCARD virtual size_t ioss_elem_count() const = 0;
45
46 IOSS_NODISCARD virtual int spatial_dimension() const = 0;
47 IOSS_NODISCARD virtual size_t global_node_count() const = 0;
48 IOSS_NODISCARD virtual size_t global_elem_count() const = 0;
49
50 IOSS_NODISCARD virtual size_t decomp_node_offset() const = 0;
51 IOSS_NODISCARD virtual size_t decomp_node_count() const = 0;
52 IOSS_NODISCARD virtual size_t decomp_elem_offset() const = 0;
53 IOSS_NODISCARD virtual size_t decomp_elem_count() const = 0;
54
55 Ioss_MPI_Comm comm_;
56
57 int m_processor{0};
58 int m_processorCount{0};
59
60 std::vector<Ioss::BlockDecompositionData> el_blocks;
61 std::vector<Ioss::SetDecompositionData> node_sets;
62 std::vector<Ioss::SetDecompositionData> side_sets;
63 };
64
65 template <typename INT> class DecompositionData : public DecompositionDataBase
66 {
67 public:
68 DecompositionData(const Ioss::PropertyManager &props, Ioss_MPI_Comm communicator);
69 ~DecompositionData() = default;
70
71 IOSS_NODISCARD int int_size() const { return sizeof(INT); }
72
73 IOSS_NODISCARD int spatial_dimension() const { return m_decomposition.m_spatialDimension; }
74
75 IOSS_NODISCARD size_t global_node_count() const { return m_decomposition.global_node_count(); }
76 IOSS_NODISCARD size_t global_elem_count() const { return m_decomposition.global_elem_count(); }
77
78 IOSS_NODISCARD size_t ioss_node_count() const { return m_decomposition.ioss_node_count(); }
79 IOSS_NODISCARD size_t ioss_elem_count() const { return m_decomposition.ioss_elem_count(); }
80
81 IOSS_NODISCARD size_t decomp_node_offset() const { return m_decomposition.file_node_offset(); }
82 IOSS_NODISCARD size_t decomp_node_count() const { return m_decomposition.file_node_count(); }
83 IOSS_NODISCARD size_t decomp_elem_offset() const { return m_decomposition.file_elem_offset(); }
84 IOSS_NODISCARD size_t decomp_elem_count() const { return m_decomposition.file_elem_count(); }
85
86 void create_implicit_global_map(const std::vector<int> &owning_proc,
87 std::vector<int64_t> &global_implicit_map, Ioss::Map &node_map,
88 int64_t *locally_owned_count, int64_t *processor_offset);
89
90 private:
91 void simple_decompose(const std::string &method, const std::vector<INT> &element_dist)
92 {
93 m_decomposition.simple_decompose(method, element_dist);
94 }
95
96 void simple_node_decompose(const std::string &method, const std::vector<INT> &node_dist);
97
98 template <typename T>
99 int handle_sset_df(int filePtr, ex_entity_id id, const Ioss::Field &field, T *ioss_data) const;
100
101 IOSS_NODISCARD bool i_own_node(size_t node) const
102 {
103 // T/F if the node with global index `node` is owned by this processors ioss-decomp.
104 return m_decomposition.i_own_node(node);
105 }
106
107 IOSS_NODISCARD bool i_own_elem(size_t elem) const
108 // T/F if the element with global index `elem` is owned by this processors ioss-decomp.
109 {
110 return m_decomposition.i_own_elem(elem);
111 }
112
113 // global_index is 1-based index into global list of nodes [1..global_node_count]
114 // return value is 1-based index into local list of nodes on this
115 // processor (ioss-decomposition)
116 IOSS_NODISCARD size_t node_global_to_local(size_t global_index) const
117 {
118 return m_decomposition.node_global_to_local(global_index);
119 }
120
121 IOSS_NODISCARD size_t elem_global_to_local(size_t global_index) const
122 {
123 return m_decomposition.elem_global_to_local(global_index);
124 }
125
126 void build_global_to_local_elem_map()
127 {
128 return m_decomposition.build_global_to_local_elem_map();
129 }
130
131 void get_shared_node_list() { m_decomposition.get_shared_node_list(); }
132
133 void get_local_node_list() { m_decomposition.get_local_node_list(); }
134
135 public:
136 Ioss::Decomposition<INT> m_decomposition;
137 };
138} // namespace Ioexnl
139#endif
#define IOSS_NODISCARD
Definition Ioss_CodeTypes.h:54
int Ioss_MPI_Comm
Definition Ioss_CodeTypes.h:63
Definition Ioss_Decomposition.h:180
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
A namespace for the exodus database format.
Definition Ioexnl_BaseDatabaseIO.C:76
The main namespace for the Ioss library.
Definition Ioad_DatabaseIO.C:40