Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Inciter/Sorter.hpp
4 : : \copyright 2012-2015 J. Bakosi,
5 : : 2016-2018 Los Alamos National Security, LLC.,
6 : : 2019-2021 Triad National Security, LLC.,
7 : : 2022-2024 J. Bakosi
8 : : All rights reserved. See the LICENSE file for details.
9 : : \brief Mesh sorter for global distributed mesh reordering
10 : : \details Mesh sorter is Charm++ chare array and is used to do global
11 : : distributed mesh node reordering that yields consecutive unique global node
12 : : IDs with increasing PE IDs in asynchronous distributed-memory parallel
13 : : fashion.
14 : : */
15 : : // *****************************************************************************
16 : : #ifndef Sorter_h
17 : : #define Sorter_h
18 : :
19 : : #include <vector>
20 : : #include <map>
21 : : #include <unordered_map>
22 : :
23 : : #include "TaggedTuple.hpp"
24 : : #include "Callback.hpp"
25 : : #include "UnsMesh.hpp"
26 : : #include "UnsMesh.hpp"
27 : :
28 : : #include "NoWarning/transporter.decl.h"
29 : : #include "NoWarning/sorter.decl.h"
30 : :
31 : : namespace inciter {
32 : :
33 : : //! Mesh sorter for global distributed mesh node reordering
34 : : class Sorter : public CBase_Sorter {
35 : :
36 : : #if defined(__clang__)
37 : : #pragma clang diagnostic push
38 : : #pragma clang diagnostic ignored "-Wunused-parameter"
39 : : #pragma clang diagnostic ignored "-Wdeprecated-declarations"
40 : : #elif defined(STRICT_GNUC)
41 : : #pragma GCC diagnostic push
42 : : #pragma GCC diagnostic ignored "-Wunused-parameter"
43 : : #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
44 : : #elif defined(__INTEL_COMPILER)
45 : : #pragma warning( push )
46 : : #pragma warning( disable: 1478 )
47 : : #endif
48 : : // Include Charm++ SDAG code. See http://charm.cs.illinois.edu/manuals/html/
49 : : // charm++/manual.html, Sec. "Structured Control Flow: Structured Dagger".
50 : : Sorter_SDAG_CODE
51 : : #if defined(__clang__)
52 : : #pragma clang diagnostic pop
53 : : #elif defined(STRICT_GNUC)
54 : : #pragma GCC diagnostic pop
55 : : #elif defined(__INTEL_COMPILER)
56 : : #pragma warning( pop )
57 : : #endif
58 : :
59 : : public:
60 : : //! Constructor
61 : : explicit Sorter( std::size_t meshid,
62 : : const CProxy_Transporter& transporter,
63 : : const tk::CProxy_MeshWriter& meshwriter,
64 : : const tk::SorterCallback& cbs,
65 : : const CProxy_Discretization& discretization,
66 : : const CProxy_RieCG& riecg,
67 : : const CProxy_LaxCG& laxcg,
68 : : const CProxy_ZalCG& zalcg,
69 : : const CProxy_KozCG& kozcg,
70 : : const CProxy_ChoCG& chocg,
71 : : const CProxy_LohCG& lohcg,
72 : : const tk::CProxy_ConjugateGradients& cgpre,
73 : : const tk::CProxy_ConjugateGradients& cgmom,
74 : : CkCallback reorderRefiner,
75 : : const std::vector< std::size_t >& ginpoel,
76 : : const tk::UnsMesh::CoordMap& coordmap,
77 : : const tk::UnsMesh::Chunk& el,
78 : : const std::map< int, std::vector< std::size_t > >& bface,
79 : : const std::vector< std::size_t >& triinpoel,
80 : : const std::map< int, std::vector< std::size_t > >& bnode,
81 : : int nchare );
82 : :
83 : : #if defined(__clang__)
84 : : #pragma clang diagnostic push
85 : : #pragma clang diagnostic ignored "-Wundefined-func-template"
86 : : #endif
87 : : //! Migrate constructor
88 : : // cppcheck-suppress uninitMemberVarPrivate
89 [ + - ]: 4675 : explicit Sorter( CkMigrateMessage* m ) : CBase_Sorter( m ) {}
90 : : #if defined(__clang__)
91 : : #pragma clang diagnostic pop
92 : : #endif
93 : :
94 : : //! Configure Charm++ reduction types
95 : : static void registerReducers();
96 : :
97 : : //! Setup chare mesh boundary node communication map
98 : : void setup( std::size_t npoin );
99 : : //! \brief Incoming query for a list mesh nodes for which this chare
100 : : //! compiles communication maps
101 : : void query( int fromch, const std::unordered_set< std::size_t >& bnd );
102 : : //! Report receipt of boundary node lists
103 : : void recvquery();
104 : : //! Respond to boundary node list queries
105 : : void response();
106 : : //! Receive boundary node communication map for our mesh chunk
107 : : void bnd( int fromch,
108 : : const std::map< int, std::unordered_set< std::size_t > >& nodeCommMap );
109 : :
110 : : //! Receive receipt of boundary node communication map
111 : : void recvbnd();
112 : :
113 : : //! Start reordering (if user enabled it)
114 : : void start();
115 : :
116 : : //! \brief Receive number of uniquely assigned global mesh node IDs from
117 : : //! chares with lower indices
118 : : void offset( int c, std::size_t u );
119 : :
120 : : //! Request new global node IDs for old node IDs
121 : : void request( int c, const std::unordered_set< std::size_t >& nd );
122 : :
123 : : //! Receive lower bound of node IDs our PE operates on after reordering
124 : : void lower( std::size_t low );
125 : :
126 : : //! Receive new (reordered) global node IDs and coordinates
127 : : void neworder( const std::unordered_map< std::size_t,
128 : : std::tuple< std::size_t, tk::UnsMesh::Coord > >& nodes );
129 : :
130 : : //! Create worker chare array elements on this PE
131 : : void createWorkers();
132 : :
133 : : //! Update mesh data we hold for whoever calls this function
134 : : void mesh( std::vector< std::size_t >& ginpoel,
135 : : tk::UnsMesh::CoordMap& coordmap,
136 : : std::vector< std::size_t >& triinpoel,
137 : : std::map< int, std::vector< std::size_t > >& bnode );
138 : :
139 : : /** @name Charm++ pack/unpack serializer member functions */
140 : : ///@{
141 : : //! \brief Pack/Unpack serialize member function
142 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
143 : 14707 : void pup( PUP::er &p ) override {
144 : 14707 : p | m_meshid;
145 : 14707 : p | m_host;
146 : 14707 : p | m_meshwriter;
147 : 14707 : p | m_cbs;
148 : 14707 : p | m_discretization;
149 : 14707 : p | m_riecg;
150 : 14707 : p | m_laxcg;
151 : 14707 : p | m_kozcg;
152 : 14707 : p | m_chocg;
153 : 14707 : p | m_lohcg;
154 : 14707 : p | m_cgpre;
155 : 14707 : p | m_cgmom;
156 : 14707 : p | m_reorderRefiner;
157 : 14707 : p | m_ginpoel;
158 : 14707 : p | m_coordmap;
159 : 14707 : p | m_el;
160 : 14707 : p | m_nbnd;
161 : 14707 : p | m_bface;
162 : 14707 : p | m_triinpoel;
163 : 14707 : p | m_bnode;
164 : 14707 : p | m_nchare;
165 : 14707 : p | m_nodeset;
166 : 14707 : p | m_noffset;
167 : 14707 : p | m_nodech;
168 : 14707 : p | m_chnode;
169 : 14707 : p | m_nodeCommMap;
170 : 14707 : p | m_reordcomm;
171 : 14707 : p | m_start;
172 : 14707 : p | m_newnodes;
173 : 14707 : p | m_newcoordmap;
174 : 14707 : p | m_reqnodes;
175 : 14707 : p | m_lower;
176 : 14707 : p | m_upper;
177 : 14707 : }
178 : : //! \brief Pack/Unpack serialize operator|
179 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
180 : : //! \param[in,out] s Sorter object reference
181 : : friend void operator|( PUP::er& p, Sorter& s ) { s.pup(p); }
182 : : //@}
183 : :
184 : : private:
185 : : //! Mesh ID
186 : : std::size_t m_meshid;
187 : : //! Host proxy
188 : : CProxy_Transporter m_host;
189 : : //! MeshWriter proxy
190 : : tk::CProxy_MeshWriter m_meshwriter;
191 : : //! Charm++ callbacks associated to compile-time tags for sorter
192 : : tk::SorterCallback m_cbs;
193 : : //! Discretization base proxy
194 : : CProxy_Discretization m_discretization;
195 : : //! Discretization scheme proxy
196 : : CProxy_RieCG m_riecg;
197 : : //! Discretization scheme proxy
198 : : CProxy_LaxCG m_laxcg;
199 : : //! Discretization scheme proxy
200 : : CProxy_ZalCG m_zalcg;
201 : : //! Discretization scheme proxy
202 : : CProxy_KozCG m_kozcg;
203 : : //! Discretization scheme proxy
204 : : CProxy_ChoCG m_chocg;
205 : : //! Discretization scheme proxy
206 : : CProxy_LohCG m_lohcg;
207 : : //! Conjugate Gradients Charm++ proxy for pressure solve
208 : : tk::CProxy_ConjugateGradients m_cgpre;
209 : : //! Conjugate Gradients Charm++ proxy for momentum solve
210 : : tk::CProxy_ConjugateGradients m_cgmom;
211 : : //! Callback to use to send reordered mesh to Refiner
212 : : CkCallback m_reorderRefiner;
213 : : //! Tetrtahedron element connectivity of our chunk of the mesh (global ids)
214 : : std::vector< std::size_t > m_ginpoel;
215 : : //! Coordinates associated to global node IDs of our mesh chunk
216 : : tk::UnsMesh::CoordMap m_coordmap;
217 : : //! Elements of the mesh chunk we operate on
218 : : tk::UnsMesh::Chunk m_el;
219 : : //! Counter for number of chares contributing to chare boundary nodes
220 : : std::size_t m_nbnd;
221 : : //! List of boundary faces associated to side-set IDs
222 : : std::map< int, std::vector< std::size_t > > m_bface;
223 : : //! Boundary face-node connectivity
224 : : std::vector< std::size_t > m_triinpoel;
225 : : //! List of boundary nodes associated to side-set IDs
226 : : std::map< int, std::vector< std::size_t > > m_bnode;
227 : : //! Total number of sorter chares
228 : : int m_nchare;
229 : : //! Unique global node IDs chares on our PE will contribute to
230 : : std::set< std::size_t > m_nodeset;
231 : : //! \brief Counter for the number of chares from which this chare has
232 : : //! received node reordering offsets from
233 : : int m_noffset;
234 : : //! Node->chare map used to build boundary node communication maps
235 : : std::unordered_map< std::size_t, std::vector< int > > m_nodech;
236 : : //! Chare->node map used to build boundary node communication maps
237 : : std::unordered_map< int, std::unordered_set< std::size_t > > m_chnode;
238 : : //! Node lists associated to chare IDs
239 : : std::map< int, std::unordered_set< std::size_t > > m_nodeCommMap;
240 : : //! \brief Communication map used for distributed mesh node reordering
241 : : //! \details This map associates the list of global mesh point
242 : : //! indices to fellow chare IDs from which this chare receives new node
243 : : //! IDs during reordering. Only data that will be received from chares
244 : : //! with a lower index are stored, thus this is an asymmetric
245 : : //! communication map.
246 : : std::unordered_map< int, std::unordered_set< std::size_t > > m_reordcomm;
247 : : //! \brief Starting global mesh node ID for node reordering on this chare
248 : : //! during mesh node reordering
249 : : std::size_t m_start;
250 : : //! Map associating new node IDs (value) to old node IDs (key)
251 : : std::unordered_map< std::size_t, std::size_t > m_newnodes;
252 : : //! Coordinates associated to global (new) node IDs during reordering
253 : : tk::UnsMesh::CoordMap m_newcoordmap;
254 : : //! Queue of requested node IDs from chares
255 : : std::vector< std::pair< int, std::unordered_set<std::size_t> > > m_reqnodes;
256 : : //! Lower bound of node IDs this chare contributes to in a linear system
257 : : std::size_t m_lower;
258 : : //! Upper bound of node IDs this chare contributes to in a linear system
259 : : std::size_t m_upper;
260 : :
261 : : //! Start preparing for mesh node reordering in parallel
262 : : void mask();
263 : :
264 : : //! Reorder global mesh node IDs
265 : : void reorder();
266 : :
267 : : //! Associate new node IDs to old ones and return them to the requestor(s)
268 : : void prepare();
269 : :
270 : : //! Compute final result of reordering
271 : : void finish();
272 : :
273 : : //! Create Discretization chare array elements on this PE
274 : : void createDiscWorkers();
275 : : };
276 : :
277 : : } // inciter::
278 : :
279 : : #endif // Sorter_h
|