Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/Inciter/DistFCT.hpp
4 : : \copyright 2012-2015 J. Bakosi,
5 : : 2016-2018 Los Alamos National Security, LLC.,
6 : : 2019-2021 Triad National Security, LLC.
7 : : All rights reserved. See the LICENSE file for details.
8 : : \brief Charm++ chare array for distributed flux-corrected transport
9 : : \details Charm++ chare array for asynchronous distributed
10 : : flux-corrected transport (FCT).
11 : :
12 : : There are a potentially large number of DistFCT Charm++ chares created by
13 : : Transporter. Each DistFCT gets a chunk of the full load (part of the mesh)
14 : : and performs flux-corrected transport.
15 : :
16 : : The implementation uses the Charm++ runtime system and is fully
17 : : asynchronous, overlapping computation and communication. The algorithm
18 : : utilizes the structured dagger (SDAG) Charm++ functionality. The high-level
19 : : overview of the algorithm structure and how it interfaces with Charm++ is
20 : : discussed in the Charm++ interface file src/Inciter/distfct.ci.
21 : : */
22 : : // *****************************************************************************
23 : : #ifndef DistFCT_h
24 : : #define DistFCT_h
25 : :
26 : : #include <cstddef>
27 : : #include <iosfwd>
28 : : #include <utility>
29 : : #include <vector>
30 : : #include <cstring>
31 : : #include <cmath>
32 : : #include <unordered_map>
33 : : #include <unordered_set>
34 : : #include <set>
35 : :
36 : : #include "Types.hpp"
37 : : #include "Fields.hpp"
38 : : #include "DerivedData.hpp"
39 : : #include "FluxCorrector.hpp"
40 : : #include "Discretization.hpp"
41 : : #include "DiagCG.hpp"
42 : : #include "Inciter/InputDeck/InputDeck.hpp"
43 : :
44 : : #include "NoWarning/distfct.decl.h"
45 : :
46 : : namespace inciter {
47 : :
48 : : //! DistFCT Charm++ chare array used to advance PDEs in time with DiagCG+LW+FCT
49 : : class DistFCT : public CBase_DistFCT {
50 : :
51 : : public:
52 : : #if defined(__clang__)
53 : : #pragma clang diagnostic push
54 : : #pragma clang diagnostic ignored "-Wunused-parameter"
55 : : #pragma clang diagnostic ignored "-Wdeprecated-declarations"
56 : : #elif defined(STRICT_GNUC)
57 : : #pragma GCC diagnostic push
58 : : #pragma GCC diagnostic ignored "-Wunused-parameter"
59 : : #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
60 : : #elif defined(__INTEL_COMPILER)
61 : : #pragma warning( push )
62 : : #pragma warning( disable: 1478 )
63 : : #endif
64 : : // Include Charm++ SDAG code. See http://charm.cs.illinois.edu/manuals/html/
65 : : // charm++/manual.html, Sec. "Structured Control Flow: Structured Dagger".
66 : : DistFCT_SDAG_CODE
67 : : #if defined(__clang__)
68 : : #pragma clang diagnostic pop
69 : : #elif defined(STRICT_GNUC)
70 : : #pragma GCC diagnostic pop
71 : : #elif defined(__INTEL_COMPILER)
72 : : #pragma warning( pop )
73 : : #endif
74 : :
75 : : //! Constructor
76 : : explicit
77 : : DistFCT( int nchare,
78 : : std::size_t nu,
79 : : std::size_t np,
80 : : const tk::NodeCommMap& nodeCommMap,
81 : : const std::unordered_map< std::size_t, std::size_t >& bid,
82 : : const std::unordered_map< std::size_t, std::size_t >& lid,
83 : : const std::vector< std::size_t >& inpoel );
84 : :
85 : : #if defined(__clang__)
86 : : #pragma clang diagnostic push
87 : : #pragma clang diagnostic ignored "-Wundefined-func-template"
88 : : #endif
89 : : //! Migrate constructor
90 : : // cppcheck-suppress uninitMemberVar
91 [ + - ]: 1896 : explicit DistFCT( CkMigrateMessage* ) {}
92 : : #if defined(__clang__)
93 : : #pragma clang diagnostic pop
94 : : #endif
95 : :
96 : : //! \brief Compute mass diffusion rhs contribution required for the low
97 : : //! order solution
98 : : tk::Fields diff( const Discretization& d, const tk::Fields& Un );
99 : :
100 : : //! Prepare for next time step stage
101 : : void next();
102 : :
103 : : //! Receive sums of antidiffusive element contributions on chare-boundaries
104 : : void comaec( const std::vector< std::size_t >& gid,
105 : : const std::vector< std::vector< tk::real > >& P );
106 : :
107 : : //! \brief Receive contributions to the maxima and minima of unknowns of all
108 : : //! elements surrounding mesh nodes on chare-boundaries
109 : : void comalw( const std::vector< std::size_t >& gid,
110 : : const std::vector< std::vector< tk::real > >& Q );
111 : :
112 : : //! \brief Receive contributions of limited antidiffusive element
113 : : //! contributions on chare-boundaries
114 : : void comlim( const std::vector< std::size_t >& gid,
115 : : const std::vector< std::vector< tk::real > >& A );
116 : :
117 : : //! Compute and sum antidiffusive element contributions (AEC) to mesh nodes
118 : : void aec(
119 : : const Discretization& d,
120 : : const tk::Fields& dUh,
121 : : const tk::Fields& Un,
122 : : const std::unordered_map< std::size_t,
123 : : std::vector< std::pair< bool, tk::real > > >& bcdir,
124 : : const std::unordered_map< int,
125 : : std::unordered_set< std::size_t > >& symbcnodemap,
126 : : const std::unordered_map< int,
127 : : std::unordered_map< std::size_t, std::array< tk::real, 4 > > >& bnorm );
128 : :
129 : : //! \brief Compute the maximum and minimum unknowns of all elements
130 : : //! surrounding nodes
131 : : void alw( const tk::Fields& Un,
132 : : const tk::Fields& Ul,
133 : : tk::Fields&& dUl,
134 : : const CProxy_DiagCG& host );
135 : :
136 : : //! Remap local ids after a mesh node reorder
137 : : void remap( const Discretization& d );
138 : :
139 : : //! Resize FCT data structures (e.g., after mesh refinement)
140 : : void resize( std::size_t nu,
141 : : const tk::NodeCommMap& nodeCommMap,
142 : : const std::unordered_map< std::size_t, std::size_t >& bid,
143 : : const std::unordered_map< std::size_t, std::size_t >& lid,
144 : : const std::vector< std::size_t >& inpoel );
145 : :
146 : : //! Collect mesh output fields from FCT
147 : : std::tuple< std::vector< std::string >,
148 : : std::vector< std::vector< tk::real > >,
149 : : std::vector< std::string >,
150 : : std::vector< std::vector< tk::real > > >
151 : : fields() const;
152 : :
153 : : /** @name Pack/unpack (Charm++ serialization) routines */
154 : : ///@{
155 : : //! \brief Pack/Unpack serialize member function
156 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
157 : 5688 : void pup( PUP::er &p ) override {
158 : 5688 : p | m_naec;
159 : 5688 : p | m_nalw;
160 : 5688 : p | m_nlim;
161 : 5688 : p | m_nchare;
162 : 5688 : p | m_nodeCommMap;
163 : 5688 : p | m_bid;
164 : 5688 : p | m_lid;
165 : 5688 : p | m_inpoel;
166 : 11376 : p | m_fluxcorrector;
167 : 5688 : p | m_p;
168 : 5688 : p | m_q;
169 : 5688 : p | m_a;
170 : 5688 : p | m_pc;
171 : 5688 : p | m_qc;
172 : 5688 : p | m_ac;
173 : 5688 : p | m_ul;
174 : 5688 : p | m_dul;
175 : 5688 : p | m_du;
176 : : p | m_host;
177 : 5688 : }
178 : : //! \brief Pack/Unpack serialize operator|
179 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
180 : : //! \param[in,out] i DistFCT object reference
181 : : friend void operator|( PUP::er& p, DistFCT& i ) { i.pup(p); }
182 : : ///@}
183 : :
184 : : private:
185 : : using ncomp_t = kw::ncomp::info::expect::type;
186 : :
187 : : //! \brief Number of chares from which we received antidiffusive element
188 : : //! contributions on chare boundaries
189 : : std::size_t m_naec;
190 : : //! \brief Number of chares from which we received maximum and minimum
191 : : //! unknowns of elements surrounding nodes on chare boundaries
192 : : std::size_t m_nalw;
193 : : //! \brief Number of chares from which we received limited antidiffusion
194 : : //! element contributiones on chare boundaries
195 : : std::size_t m_nlim;
196 : : //! Total number of worker chares
197 : : std::size_t m_nchare;
198 : : //! \brief Global mesh node IDs bordering the mesh chunk held by fellow
199 : : //! chares associated to their chare IDs
200 : : //! \note This is a copy. Original in (bound) Discretization
201 : : tk::NodeCommMap m_nodeCommMap;
202 : : //! \brief Local chare-boundary mesh node IDs at which we receive
203 : : //! contributions associated to global mesh node IDs of mesh elements we
204 : : //! contribute to
205 : : //! \note This is a copy. Original in (bound) Discretization
206 : : std::unordered_map< std::size_t, std::size_t > m_bid;
207 : : //! Local mesh node ids associated to the global ones of owned elements
208 : : //! \note This is a copy. Original in (bound) Discretization
209 : : std::unordered_map< std::size_t, std::size_t > m_lid;
210 : : //! Mesh connectivity of our chunk of the mesh
211 : : //! \note This is a copy. Original in (bound) Discretization
212 : : std::vector< std::size_t > m_inpoel;
213 : : //! Flux corrector performing FCT
214 : : FluxCorrector m_fluxcorrector;
215 : : //! Flux-corrected transport data structures
216 : : tk::Fields m_p, m_q, m_a;
217 : : //! Receive buffers for FCT
218 : : std::vector< std::vector< tk::real > > m_pc, m_qc, m_ac;
219 : : //! Pointer to low order solution vector and increment
220 : : //! \note These are copies. Original in (bound) Discretization
221 : : tk::Fields m_ul, m_dul, m_du;
222 : : //! Host proxy (DiagCG) we interoperate with
223 : : CProxy_DiagCG m_host;
224 : :
225 : : //! Size FCT communication buffers
226 : : void resizeComm();
227 : :
228 : : //! Compute the limited antidiffusive element contributions
229 : : void lim( const std::unordered_map< std::size_t,
230 : : std::vector< std::pair< bool, tk::real > > >& bcdir );
231 : :
232 : : //! Apply limited antidiffusive element contributions
233 : : void apply();
234 : : };
235 : :
236 : : } // inciter::
237 : :
238 : : #endif // DistFCT_h
|