Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Inciter/KozCG.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 KozCG: Taylor-Galerkin, FCT, element-based continuous Galerkin
10 : : */
11 : : // *****************************************************************************
12 : :
13 : : #pragma once
14 : :
15 : : #include <vector>
16 : : #include <map>
17 : :
18 : : #include "Types.hpp"
19 : : #include "Fields.hpp"
20 : : #include "Table.hpp"
21 : : #include "DerivedData.hpp"
22 : : #include "NodeDiagnostics.hpp"
23 : :
24 : : #include "NoWarning/kozcg.decl.h"
25 : :
26 : : namespace inciter {
27 : :
28 : : //! KozCG Charm++ chare array used to advance PDEs in time with KozCG
29 : : class KozCG : public CBase_KozCG {
30 : :
31 : : public:
32 : : #if defined(__clang__)
33 : : #pragma clang diagnostic push
34 : : #pragma clang diagnostic ignored "-Wunused-parameter"
35 : : #pragma clang diagnostic ignored "-Wdeprecated-declarations"
36 : : #elif defined(STRICT_GNUC)
37 : : #pragma GCC diagnostic push
38 : : #pragma GCC diagnostic ignored "-Wunused-parameter"
39 : : #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
40 : : #elif defined(__INTEL_COMPILER)
41 : : #pragma warning( push )
42 : : #pragma warning( disable: 1478 )
43 : : #endif
44 : : // Include Charm++ SDAG code. See http://charm.cs.illinois.edu/manuals/html/
45 : : // charm++/manual.html, Sec. "Structured Control Flow: Structured Dagger".
46 : : KozCG_SDAG_CODE
47 : : #if defined(__clang__)
48 : : #pragma clang diagnostic pop
49 : : #elif defined(STRICT_GNUC)
50 : : #pragma GCC diagnostic pop
51 : : #elif defined(__INTEL_COMPILER)
52 : : #pragma warning( pop )
53 : : #endif
54 : :
55 : : //! Constructor
56 : : explicit KozCG( const CProxy_Discretization& disc,
57 : : const std::map< int, std::vector< std::size_t > >& bface,
58 : : const std::map< int, std::vector< std::size_t > >& bnode,
59 : : const std::vector< std::size_t >& triinpoel );
60 : :
61 : : #if defined(__clang__)
62 : : #pragma clang diagnostic push
63 : : #pragma clang diagnostic ignored "-Wundefined-func-template"
64 : : #endif
65 : : //! Migrate constructor
66 : : // cppcheck-suppress uninitMemberVar
67 : 936 : explicit KozCG( CkMigrateMessage* m ) : CBase_KozCG( m ) {}
68 : : #if defined(__clang__)
69 : : #pragma clang diagnostic pop
70 : : #endif
71 : :
72 : : //! Configure Charm++ custom reduction types initiated from this chare array
73 : : static void registerReducers();
74 : :
75 : : //! Return from migration
76 : : void ResumeFromSync() override;
77 : :
78 : : //! Start setup for solution
79 : : void setup( tk::real v );
80 : :
81 : : // Start time stepping
82 : : void start();
83 : :
84 : : //! Advance equations to next time step
85 : : void advance( tk::real newdt );
86 : :
87 : : //! Start (re-)computing domain and boundary integrals
88 : : void feop();
89 : :
90 : : //! Receive contributions to boundary point normals on chare-boundaries
91 : : void comnorm( const std::unordered_map< int,
92 : : std::unordered_map< std::size_t, std::array< tk::real, 4 > > >& inbnd );
93 : :
94 : : //! Receive contributions to right-hand side vector on chare-boundaries
95 : : void comrhs( const std::unordered_map< std::size_t,
96 : : std::vector< tk::real > >& inrhs );
97 : :
98 : : //! Receive antidiffusive and low-order contributions on chare-boundaries
99 : : void comaec( const std::unordered_map< std::size_t,
100 : : std::vector< tk::real > >& inaec );
101 : :
102 : :
103 : : //! Receive allowed limits contributions on chare-boundaries
104 : : void comalw( const std::unordered_map< std::size_t,
105 : : std::vector< tk::real > >& inalw );
106 : :
107 : : //! Receive limited antidiffusive contributions on chare-boundaries
108 : : void comlim( const std::unordered_map< std::size_t,
109 : : std::vector< tk::real > >& inlim );
110 : :
111 : : //! Evaluate residuals
112 : : void evalres( const std::vector< tk::real >& l2res );
113 : :
114 : : //! Receive new mesh from Refiner
115 : : void resizePostAMR(
116 : : const std::vector< std::size_t >& ginpoel,
117 : : const tk::UnsMesh::Chunk& chunk,
118 : : const tk::UnsMesh::Coords& coord,
119 : : const std::unordered_map< std::size_t, tk::UnsMesh::Edge >& addedNodes,
120 : : const std::unordered_map< std::size_t, std::size_t >& addedTets,
121 : : const std::set< std::size_t >& removedNodes,
122 : : const std::unordered_map< int, std::unordered_set< std::size_t > >&
123 : : nodeCommMap,
124 : : const std::map< int, std::vector< std::size_t > >& bface,
125 : : const std::map< int, std::vector< std::size_t > >& bnode,
126 : : const std::vector< std::size_t >& triinpoel );
127 : :
128 : : //! Const-ref access to current solution
129 : : //! \return Const-ref to current solution
130 : : const tk::Fields& solution() const { return m_u; }
131 : :
132 : : //! Compute integral quantities for output
133 : : void integrals();
134 : :
135 : : //! Evaluate whether to continue with next time step
136 : : void step();
137 : :
138 : : //! Evaluate whether to do load balancing
139 : : void evalLB( int nrestart );
140 : :
141 : : /** @name Charm++ pack/unpack serializer member functions */
142 : : ///@{
143 : : //! \brief Pack/Unpack serialize member function
144 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
145 : 2970 : void pup( PUP::er &p ) override {
146 : : p | m_disc;
147 : 2970 : p | m_nrhs;
148 : 2970 : p | m_nnorm;
149 : 2970 : p | m_naec;
150 : 2970 : p | m_nalw;
151 : 2970 : p | m_nlim;
152 : 2970 : p | m_bnode;
153 : 2970 : p | m_bface;
154 : 2970 : p | m_triinpoel;
155 : 2970 : p | m_u;
156 : 2970 : p | m_p;
157 : 2970 : p | m_pc;
158 : 2970 : p | m_q;
159 : 2970 : p | m_qc;
160 : 2970 : p | m_a;
161 : 2970 : p | m_ac;
162 : : // do not pup these, will recompute after migration anyway
163 [ + + ]: 2970 : if (p.isUnpacking()) {
164 : : m_rhs.resize( m_u.nunk(), m_u.nprop() );
165 : : }
166 : 2970 : p | m_rhsc;
167 : : p | m_diag;
168 : 2970 : p | m_bnorm;
169 : 2970 : p | m_bnormc;
170 : 2970 : p | m_bndpoinint;
171 : 2970 : p | m_dirbcmasks;
172 : 2970 : p | m_prebcnodes;
173 : 2970 : p | m_prebcvals;
174 : 2970 : p | m_symbcnodeset;
175 : 2970 : p | m_symbcnodes;
176 : 2970 : p | m_symbcnorms;
177 : 2970 : p | m_farbcnodeset;
178 : 2970 : p | m_farbcnodes;
179 : 2970 : p | m_farbcnorms;
180 : 2970 : p | m_surfint;
181 : 2970 : p | m_dtp;
182 : 2970 : p | m_tp;
183 : 2970 : p | m_finished;
184 : 2970 : p | m_freezeflow;
185 : 2970 : }
186 : : //! \brief Pack/Unpack serialize operator|
187 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
188 : : //! \param[in,out] i KozCG object reference
189 : : friend void operator|( PUP::er& p, KozCG& i ) { i.pup(p); }
190 : : //@}
191 : :
192 : : private:
193 : : //! Discretization proxy
194 : : CProxy_Discretization m_disc;
195 : : //! Counter for right-hand side vector nodes updated
196 : : std::size_t m_nrhs;
197 : : //! Counter for receiving boundary point normals
198 : : std::size_t m_nnorm;
199 : : //! Counter for receiving antidiffusive contributions
200 : : std::size_t m_naec;
201 : : //! Counter for receiving allowed limits
202 : : std::size_t m_nalw;
203 : : //! Counter for receiving limited antidiffusive contributions
204 : : std::size_t m_nlim;
205 : : //! Boundary node lists mapped to side set ids used in the input file
206 : : std::map< int, std::vector< std::size_t > > m_bnode;
207 : : //! Boundary face lists mapped to side set ids used in the input file
208 : : std::map< int, std::vector< std::size_t > > m_bface;
209 : : //! Boundary triangle face connecitivity where BCs are set by user
210 : : std::vector< std::size_t > m_triinpoel;
211 : : //! Unknown/solution vector at mesh nodes
212 : : tk::Fields m_u;
213 : : //! Max/min antidiffusive edge contributions at mesh nodes
214 : : tk::Fields m_p;
215 : : //! Receive buffer for max/min antidiffusive edge contributions
216 : : //! \details Key: global node id, value: max/min antidiff edge contributions
217 : : //! in nodes.
218 : : std::unordered_map< std::size_t, std::vector< tk::real > > m_pc;
219 : : //! Max/min allowed limits at mesh nodes
220 : : tk::Fields m_q;
221 : : //! Receive buffer for max/min allowed limits
222 : : //! \details Key: global node id, value: max/min allowed limits in nodes.
223 : : std::unordered_map< std::size_t, std::vector< tk::real > > m_qc;
224 : : //! Limited antidiffusive contributions at mesh nodes
225 : : tk::Fields m_a;
226 : : //! Receive buffer for limited antidiffusive contributions
227 : : //! \details Key: global node id, value: limited antidiffusive contributions
228 : : //! in nodes.
229 : : std::unordered_map< std::size_t, std::vector< tk::real > > m_ac;
230 : : //! Right-hand side vector (for the high order system)
231 : : tk::Fields m_rhs;
232 : : //! Receive buffer for communication of the right hand side
233 : : //! \details Key: global node id, value: rhs for all scalar components per
234 : : //! node.
235 : : std::unordered_map< std::size_t, std::vector< tk::real > > m_rhsc;
236 : : //! Diagnostics object
237 : : NodeDiagnostics m_diag;
238 : : //! Boundary point normals
239 : : //! \details Outer key: side set id. Inner key: global node id of boundary
240 : : //! point, value: weighted normals, inverse distance square, nodal area.
241 : : std::unordered_map< int,
242 : : std::unordered_map< std::size_t, std::array< tk::real, 4 > > > m_bnorm;
243 : : //! Boundary point normals receive buffer
244 : : //! \details Outer key: side set id. Inner key: global node id of boundary
245 : : //! point, value: weighted normals and inverse distance square.
246 : : decltype(m_bnorm) m_bnormc;
247 : : //! Boundary point integrals
248 : : //! \details Key: global node id of boundary point, value: boundary point
249 : : //! integral contributions.
250 : : std::unordered_map< std::size_t, std::array< tk::real, 3 > > m_bndpoinint;
251 : : //! Nodes and their Dirichlet BC masks
252 : : std::vector< std::size_t > m_dirbcmasks;
253 : : //! Nodes at pressure BCs
254 : : std::vector< std::size_t > m_prebcnodes;
255 : : //! Density and pressure values at pressure BCs
256 : : std::vector< tk::real > m_prebcvals;
257 : : //! Unique set of ordered nodes at which symmetry BCs are set
258 : : std::set< std::size_t > m_symbcnodeset;
259 : : //! Streamable nodes at which symmetry BCs are set
260 : : std::vector< std::size_t > m_symbcnodes;
261 : : //! Streamable normals at nodes at which symmetry BCs are set
262 : : std::vector< tk::real > m_symbcnorms;
263 : : //! Unique set of ordered nodes at which farfield BCs are set
264 : : std::set< std::size_t > m_farbcnodeset;
265 : : //! Streamable nodes at which farfield BCs are set
266 : : std::vector< std::size_t > m_farbcnodes;
267 : : //! Streamable normals at nodes at which farfield BCs are set
268 : : std::vector< tk::real > m_farbcnorms;
269 : : //! Streamable surface integral nodes and normals * dA on surfaces
270 : : std::map< int, std::pair< std::vector< std::size_t >,
271 : : std::vector< tk::real > > > m_surfint;
272 : : //! Time step size for each mesh node
273 : : std::vector< tk::real > m_dtp;
274 : : //! Physical time for each mesh node
275 : : std::vector< tk::real > m_tp;
276 : : //! True in the last time step
277 : : int m_finished;
278 : : //! dt multiplier after flow no longer updated
279 : : tk::real m_freezeflow;
280 : :
281 : : //! Access bound Discretization class pointer
282 : 341096 : Discretization* Disc() const {
283 : : Assert( m_disc[ thisIndex ].ckLocal() != nullptr, "ckLocal() null" );
284 : 682192 : return m_disc[ thisIndex ].ckLocal();
285 : : }
286 : :
287 : : //! Prepare boundary condition data structures
288 : : void setupBC();
289 : :
290 : : //! Compute chare-boundary edges
291 : : void bndEdges();
292 : :
293 : : //! Compute boundary point normals
294 : : void bndint();
295 : :
296 : : //! Combine own and communicated portions of the boundary point normals
297 : : void bnorm();
298 : :
299 : : //! Convert integrals into streamable data structures
300 : : void streamable();
301 : :
302 : : //! Output mesh and particle fields to files
303 : : void out();
304 : :
305 : : //! Output mesh-based fields to file
306 : : void writeFields( CkCallback cb );
307 : :
308 : : //! Combine own and communicated portions of the integrals
309 : : void merge();
310 : :
311 : : //! Compute righ-hand side vector of transport equations
312 : : void rhs();
313 : :
314 : : //! Continue with flux-corrected transport if enabled
315 : : void fct();
316 : :
317 : : //! Compute antidiffusive contributions: P+/-, low-order solution: ul
318 : : void aec();
319 : :
320 : : //! Compute allowed limits, Q+/-
321 : : void alw();
322 : :
323 : : //! Compute limit coefficients
324 : : void lim();
325 : :
326 : : //! Advance systems of equations
327 : : void solve();
328 : :
329 : : //! Refine/derefine mesh
330 : : void refine();
331 : :
332 : : //! Compute time step size
333 : : void dt();
334 : :
335 : : //! Evaluate whether to save checkpoint/restart
336 : : void evalRestart();
337 : :
338 : : //! Apply boundary conditions
339 : : void BC( tk::Fields& u, tk::real t );
340 : :
341 : : //! Apply scalar source to solution
342 : : void src();
343 : : };
344 : :
345 : : } // inciter::
|