Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/PDE/DGPDE.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 Partial differential equation base for discontinuous Galerkin PDEs
9 : : \details This file defines a generic partial differential equation (PDE)
10 : : class for PDEs that use discontinuous Galerkin spatial discretization.
11 : : The class uses runtime polymorphism without client-side inheritance:
12 : : inheritance is confined to the internals of the class, invisible to
13 : : client-code. The class exclusively deals with ownership enabling client-side
14 : : value semantics. Credit goes to Sean Parent at Adobe:
15 : : https://github.com/sean-parent/sean-parent.github.com/wiki/
16 : : Papers-and-Presentations.
17 : : */
18 : : // *****************************************************************************
19 : : #ifndef DGPDE_h
20 : : #define DGPDE_h
21 : :
22 : : #include <array>
23 : : #include <string>
24 : : #include <vector>
25 : : #include <memory>
26 : : #include <unordered_set>
27 : : #include <functional>
28 : :
29 : : #include "Types.hpp"
30 : : #include "Fields.hpp"
31 : : #include "FaceData.hpp"
32 : : #include "UnsMesh.hpp"
33 : : #include "Inciter/InputDeck/InputDeck.hpp"
34 : : #include "FunctionPrototypes.hpp"
35 : : #include "History.hpp"
36 : :
37 : : namespace inciter {
38 : :
39 : : extern ctr::InputDeck g_inputdeck;
40 : :
41 : : using ncomp_t = kw::ncomp::info::expect::type;
42 : : using bcconf_t = kw::sideset::info::expect::type;
43 : : using BCStateFn =
44 : : std::vector< std::pair< std::vector< bcconf_t >, tk::StateFn > >;
45 : :
46 : : //! Extract BC configuration ignoring if BC not specified
47 : : //! \note A more preferable way of catching errors such as this function
48 : : //! hides is during parsing, so that we don't even get here if BCs are
49 : : //! not correctly specified. For now we simply ignore if BCs are not
50 : : //! specified by allowing empty BC vectors from the user input.
51 : : template< class Eq > struct ConfigBC {
52 : : std::size_t system; //! Compflow system id
53 : : BCStateFn& state; //!< BC state config: sidesets + statefn
54 : : const std::vector< tk::StateFn >& fn; //!< BC state functions
55 : : std::size_t c; //!< Counts BC types configured
56 : : //! Constructor
57 : 273 : ConfigBC( std::size_t sys,
58 : : BCStateFn& s,
59 : : const std::vector< tk::StateFn >& f ) :
60 : 273 : system(sys), state(s), fn(f), c(0) {}
61 : : //! Function to call for each BC type
62 : 1638 : template< typename U > void operator()( brigand::type_<U> ) {
63 : 1638 : std::vector< bcconf_t > cfg;
64 : 1638 : const auto& v = g_inputdeck.get< tag::param, Eq, tag::bc, U >();
65 [ + + ][ + - ]: 1638 : if (v.size() > system) cfg = v[system];
66 [ - + ][ - - ]: 1638 : Assert( fn.size() > c, "StateFn missing for BC type" );
[ - - ][ - - ]
67 [ + - ][ + - ]: 1638 : state.push_back( { cfg, fn[c++] } );
68 : 1638 : }
69 : : };
70 : :
71 : : //! State function for invalid/un-configured boundary conditions
72 : : [[noreturn]] tk::StateFn::result_type
73 : : invalidBC( ncomp_t, ncomp_t, const std::vector< tk::real >&,
74 : : tk::real, tk::real, tk::real, tk::real,
75 : : const std::array< tk::real, 3> & );
76 : :
77 : : //! \brief Partial differential equation base for discontinuous Galerkin PDEs
78 : : //! \details This class uses runtime polymorphism without client-side
79 : : //! inheritance: inheritance is confined to the internals of the this class,
80 : : //! invisible to client-code. The class exclusively deals with ownership
81 : : //! enabling client-side value semantics. Credit goes to Sean Parent at Adobe:
82 : : //! https://github.com/sean-parent/sean-parent.github.com/wiki/
83 : : //! Papers-and-Presentations. For example client code that models a DGPDE,
84 : : //! see inciter::CompFlow.
85 : : class DGPDE {
86 : :
87 : : private:
88 : : using ncomp_t = kw::ncomp::info::expect::type;
89 : :
90 : : public:
91 : : //! Default constructor taking no arguments for Charm++
92 : 0 : explicit DGPDE() = default;
93 : :
94 : : //! \brief Constructor taking an object modeling Concept.
95 : : //! \details The object of class T comes pre-constructed.
96 : : //! \param[in] x Instantiated object of type T given by the template
97 : : //! argument.
98 : : template< typename T > explicit DGPDE( T x ) :
99 : : self( std::make_unique< Model<T> >( std::move(x) ) ) {}
100 : :
101 : : //! \brief Constructor taking a function pointer to a constructor of an
102 : : //! object modeling Concept.
103 : : //! \details Passing std::function allows late execution of the constructor,
104 : : //! i.e., as late as inside this class' constructor, and thus usage from
105 : : //! a factory. Note that there are at least two different ways of using
106 : : //! this constructor:
107 : : //! - Bind T's constructor arguments and place it in std::function<T()>
108 : : //! and passing no arguments as args.... This case then instantiates the
109 : : //! model via its constructor and stores it in here.
110 : : //! - Bind a single placeholder argument to T's constructor and pass it in
111 : : //! as host's args..., which then forwards it to model's constructor. This
112 : : //! allows late binding, i.e., binding the argument only here.
113 : : //! \see See also the wrapper tk::recordModel() which does the former and
114 : : //! tk::recordModelLate() which does the latter, both defined in
115 : : //! src/Base/Factory.h.
116 : : //! \param[in] x Function pointer to a constructor of an object modeling
117 : : //! Concept.
118 : : //! \param[in] args Zero or more constructor arguments
119 : : template< typename T, typename...Args >
120 : 273 : explicit DGPDE( std::function<T(Args...)> x, Args&&... args ) :
121 : : self( std::make_unique< Model<T> >(
122 [ + - ]: 273 : std::move( x( std::forward<Args>(args)... ) ) ) ) {}
123 : :
124 : : //! Public interface to find number of primitive quantities for the diff eq
125 : 918 : std::size_t nprim() const
126 : 918 : { return self->nprim(); }
127 : :
128 : : //! Public interface to find number of materials for the diff eq
129 : : std::size_t nmat() const
130 : : { return self->nmat(); }
131 : :
132 : : //! Public interface to find Dofs for each equation in pde system
133 : 918 : void numEquationDofs(std::vector< std::size_t >& numEqDof) const
134 : 918 : { return self->numEquationDofs(numEqDof); }
135 : :
136 : : //! Public interface to determine elements that lie inside the IC box
137 : 918 : void IcBoxElems( const tk::Fields& geoElem,
138 : : std::size_t nielem,
139 : : std::vector< std::unordered_set< std::size_t > >& inbox ) const
140 : 918 : { self->IcBoxElems( geoElem, nielem, inbox ); }
141 : :
142 : : //! Public interface to setting the initial conditions for the diff eq
143 : 1050 : void initialize(
144 : : const tk::Fields& L,
145 : : const std::vector< std::size_t >& inpoel,
146 : : const tk::UnsMesh::Coords& coord,
147 : : const std::vector< std::unordered_set< std::size_t > >& inbox,
148 : : tk::Fields& unk,
149 : : tk::real t,
150 : : const std::size_t nielem ) const
151 : 1050 : { self->initialize( L, inpoel, coord, inbox, unk, t, nielem ); }
152 : :
153 : : //! Public interface to computing the left-hand side matrix for the diff eq
154 : 1158 : void lhs( const tk::Fields& geoElem, tk::Fields& l ) const
155 : 1158 : { self->lhs( geoElem, l ); }
156 : :
157 : : //! Public interface to updating the interface cells for the diff eq
158 : 74580 : void updateInterfaceCells( tk::Fields& unk,
159 : : std::size_t nielem,
160 : : std::vector< std::size_t >& ndofel ) const
161 : 74580 : { self->updateInterfaceCells( unk, nielem, ndofel ); }
162 : :
163 : : //! Public interface to updating the primitives for the diff eq
164 : 75498 : void updatePrimitives( const tk::Fields& unk,
165 : : const tk::Fields& L,
166 : : const tk::Fields& geoElem,
167 : : tk::Fields& prim,
168 : : std::size_t nielem ) const
169 : 75498 : { self->updatePrimitives( unk, L, geoElem, prim, nielem ); }
170 : :
171 : : //! Public interface to cleaning up trace materials for the diff eq
172 : 74580 : void cleanTraceMaterial( const tk::Fields& geoElem,
173 : : tk::Fields& unk,
174 : : tk::Fields& prim,
175 : : std::size_t nielem ) const
176 : 74580 : { self->cleanTraceMaterial( geoElem, unk, prim, nielem ); }
177 : :
178 : : //! Public interface to reconstructing the second-order solution
179 : 44760 : void reconstruct( tk::real t,
180 : : const tk::Fields& geoFace,
181 : : const tk::Fields& geoElem,
182 : : const inciter::FaceData& fd,
183 : : const std::map< std::size_t, std::vector< std::size_t > >&
184 : : esup,
185 : : const std::vector< std::size_t >& inpoel,
186 : : const tk::UnsMesh::Coords& coord,
187 : : tk::Fields& U,
188 : : tk::Fields& P ) const
189 : : {
190 : 44760 : self->reconstruct( t, geoFace, geoElem, fd, esup, inpoel, coord, U, P );
191 : 44760 : }
192 : :
193 : : //! Public interface to limiting the second-order solution
194 : 44760 : void limit( tk::real t,
195 : : const tk::Fields& geoFace,
196 : : const tk::Fields& geoElem,
197 : : const inciter::FaceData& fd,
198 : : const std::map< std::size_t, std::vector< std::size_t > >& esup,
199 : : const std::vector< std::size_t >& inpoel,
200 : : const tk::UnsMesh::Coords& coord,
201 : : const std::vector< std::size_t >& ndofel,
202 : : const std::vector< std::size_t >& gid,
203 : : const std::unordered_map< std::size_t, std::size_t >& bid,
204 : : const std::vector< std::vector<tk::real> >& uNodalExtrm,
205 : : const std::vector< std::vector<tk::real> >& pNodalExtrm,
206 : : tk::Fields& U,
207 : : tk::Fields& P,
208 : : std::vector< std::size_t >& shockmarker ) const
209 : : {
210 : 44760 : self->limit( t, geoFace, geoElem, fd, esup, inpoel, coord, ndofel, gid,
211 : 44760 : bid, uNodalExtrm, pNodalExtrm, U, P, shockmarker );
212 : 44760 : }
213 : :
214 : : //! Public interface to computing the P1 right-hand side vector
215 : 74580 : void rhs( tk::real t,
216 : : const tk::Fields& geoFace,
217 : : const tk::Fields& geoElem,
218 : : const inciter::FaceData& fd,
219 : : const std::vector< std::size_t >& inpoel,
220 : : const std::vector< std::unordered_set< std::size_t > >& boxelems,
221 : : const tk::UnsMesh::Coords& coord,
222 : : const tk::Fields& U,
223 : : const tk::Fields& P,
224 : : const std::vector< std::size_t >& ndofel,
225 : : tk::Fields& R ) const
226 : : {
227 : 74580 : self->rhs( t, geoFace, geoElem, fd, inpoel, boxelems, coord, U, P,
228 : 74580 : ndofel, R );
229 : 74580 : }
230 : :
231 : : //! Evaluate the adaptive indicator and mark the ndof for each element
232 : 1636 : void eval_ndof( std::size_t nunk,
233 : : const tk::UnsMesh::Coords& coord,
234 : : const std::vector< std::size_t >& inpoel,
235 : : const inciter::FaceData& fd,
236 : : const tk::Fields& unk,
237 : : inciter::ctr::PrefIndicatorType indicator,
238 : : std::size_t ndof,
239 : : std::size_t ndofmax,
240 : : tk::real tolref,
241 : : std::vector< std::size_t >& ndofel ) const
242 : : {
243 : 1636 : self->eval_ndof( nunk, coord, inpoel, fd, unk, indicator, ndof, ndofmax,
244 : 1636 : tolref, ndofel );
245 : 1636 : }
246 : :
247 : : //! Public interface for computing the minimum time step size
248 : 2445 : tk::real dt( const std::array< std::vector< tk::real >, 3 >& coord,
249 : : const std::vector< std::size_t >& inpoel,
250 : : const inciter::FaceData& fd,
251 : : const tk::Fields& geoFace,
252 : : const tk::Fields& geoElem,
253 : : const std::vector< std::size_t >& ndofel,
254 : : const tk::Fields& U,
255 : : const tk::Fields& P,
256 : : const std::size_t nielem ) const
257 : 2445 : { return self->dt( coord, inpoel, fd, geoFace, geoElem, ndofel, U, P, nielem ); }
258 : :
259 : : //! Public interface to returning analytic field output labels
260 : 2234 : std::vector< std::string > analyticFieldNames() const
261 : 2234 : { return self->analyticFieldNames(); }
262 : :
263 : : //! Public interface to returning time history field output labels
264 : 0 : std::vector< std::string > histNames() const { return self->histNames(); }
265 : :
266 : : //! Public interface to returning variable names
267 : 96 : std::vector< std::string > names() const { return self->names(); }
268 : :
269 : : //! Public interface to returning surface field output
270 : : std::vector< std::vector< tk::real > >
271 : : surfOutput( const std::map< int, std::vector< std::size_t > >& bnd,
272 : : tk::Fields& U ) const
273 : : { return self->surfOutput( bnd, U ); }
274 : :
275 : : //! Public interface to return point history output
276 : : std::vector< std::vector< tk::real > >
277 : 0 : histOutput( const std::vector< HistData >& h,
278 : : const std::vector< std::size_t >& inpoel,
279 : : const tk::UnsMesh::Coords& coord,
280 : : const tk::Fields& U,
281 : : const tk::Fields& P ) const
282 : 0 : { return self->histOutput( h, inpoel, coord, U, P ); }
283 : :
284 : : //! Public interface to returning analytic solution
285 : : tk::InitializeFn::result_type
286 : 1319248 : analyticSolution( tk::real xi, tk::real yi, tk::real zi, tk::real t ) const
287 : 1319248 : { return self->analyticSolution( xi, yi, zi, t ); }
288 : :
289 : : //! Public interface to returning the analytic solution for conserved vars
290 : : tk::InitializeFn::result_type
291 : 11729902 : solution( tk::real xi, tk::real yi, tk::real zi, tk::real t ) const
292 : 11729902 : { return self->solution( xi, yi, zi, t ); }
293 : :
294 : : //! Copy assignment
295 : : DGPDE& operator=( const DGPDE& x )
296 : : { DGPDE tmp(x); *this = std::move(tmp); return *this; }
297 : : //! Copy constructor
298 : : DGPDE( const DGPDE& x ) : self( x.self->copy() ) {}
299 : : //! Move assignment
300 : : DGPDE& operator=( DGPDE&& ) noexcept = default;
301 : : //! Move constructor
302 : 273 : DGPDE( DGPDE&& ) noexcept = default;
303 : :
304 : : private:
305 : : //! \brief Concept is a pure virtual base class specifying the requirements
306 : : //! of polymorphic objects deriving from it
307 : : struct Concept {
308 : 273 : Concept() = default;
309 : 0 : Concept( const Concept& ) = default;
310 : 273 : virtual ~Concept() = default;
311 : : virtual Concept* copy() const = 0;
312 : : virtual std::size_t nprim() const = 0;
313 : : virtual std::size_t nmat() const = 0;
314 : : virtual void numEquationDofs(std::vector< std::size_t >&) const = 0;
315 : : virtual void IcBoxElems( const tk::Fields&,
316 : : std::size_t,
317 : : std::vector< std::unordered_set< std::size_t > >& ) const = 0;
318 : : virtual void initialize(
319 : : const tk::Fields&,
320 : : const std::vector< std::size_t >&,
321 : : const tk::UnsMesh::Coords&,
322 : : const std::vector< std::unordered_set< std::size_t > >&,
323 : : tk::Fields&,
324 : : tk::real,
325 : : const std::size_t nielem ) const = 0;
326 : : virtual void lhs( const tk::Fields&, tk::Fields& ) const = 0;
327 : : virtual void updateInterfaceCells( tk::Fields&,
328 : : std::size_t,
329 : : std::vector< std::size_t >& ) const = 0;
330 : : virtual void updatePrimitives( const tk::Fields&,
331 : : const tk::Fields&,
332 : : const tk::Fields&,
333 : : tk::Fields&,
334 : : std::size_t ) const = 0;
335 : : virtual void cleanTraceMaterial( const tk::Fields&,
336 : : tk::Fields&,
337 : : tk::Fields&,
338 : : std::size_t ) const = 0;
339 : : virtual void reconstruct( tk::real,
340 : : const tk::Fields&,
341 : : const tk::Fields&,
342 : : const inciter::FaceData&,
343 : : const std::map< std::size_t,
344 : : std::vector< std::size_t > >&,
345 : : const std::vector< std::size_t >&,
346 : : const tk::UnsMesh::Coords&,
347 : : tk::Fields&,
348 : : tk::Fields& ) const = 0;
349 : : virtual void limit( tk::real,
350 : : const tk::Fields&,
351 : : const tk::Fields&,
352 : : const inciter::FaceData&,
353 : : const std::map< std::size_t,
354 : : std::vector< std::size_t > >&,
355 : : const std::vector< std::size_t >&,
356 : : const tk::UnsMesh::Coords&,
357 : : const std::vector< std::size_t >&,
358 : : const std::vector< std::size_t >&,
359 : : const std::unordered_map< std::size_t, std::size_t >&,
360 : : const std::vector< std::vector<tk::real> >&,
361 : : const std::vector< std::vector<tk::real> >&,
362 : : tk::Fields&,
363 : : tk::Fields&,
364 : : std::vector< std::size_t >& ) const = 0;
365 : : virtual void rhs( tk::real,
366 : : const tk::Fields&,
367 : : const tk::Fields&,
368 : : const inciter::FaceData&,
369 : : const std::vector< std::size_t >&,
370 : : const std::vector< std::unordered_set< std::size_t > >&,
371 : : const tk::UnsMesh::Coords&,
372 : : const tk::Fields&,
373 : : const tk::Fields&,
374 : : const std::vector< std::size_t >&,
375 : : tk::Fields& ) const = 0;
376 : : virtual void eval_ndof( std::size_t,
377 : : const tk::UnsMesh::Coords&,
378 : : const std::vector< std::size_t >&,
379 : : const inciter::FaceData&,
380 : : const tk::Fields&,
381 : : inciter::ctr::PrefIndicatorType,
382 : : std::size_t,
383 : : std::size_t,
384 : : tk::real,
385 : : std::vector< std::size_t >& ) const = 0;
386 : : virtual tk::real dt( const std::array< std::vector< tk::real >, 3 >&,
387 : : const std::vector< std::size_t >&,
388 : : const inciter::FaceData&,
389 : : const tk::Fields&,
390 : : const tk::Fields&,
391 : : const std::vector< std::size_t >&,
392 : : const tk::Fields&,
393 : : const tk::Fields&,
394 : : const std::size_t ) const = 0;
395 : : virtual std::vector< std::string > analyticFieldNames() const = 0;
396 : : virtual std::vector< std::string > histNames() const = 0;
397 : : virtual std::vector< std::string > names() const = 0;
398 : : virtual std::vector< std::vector< tk::real > > surfOutput(
399 : : const std::map< int, std::vector< std::size_t > >&,
400 : : tk::Fields& ) const = 0;
401 : : virtual std::vector< std::vector< tk::real > > histOutput(
402 : : const std::vector< HistData >&,
403 : : const std::vector< std::size_t >&,
404 : : const tk::UnsMesh::Coords&,
405 : : const tk::Fields&,
406 : : const tk::Fields& ) const = 0;
407 : : virtual tk::InitializeFn::result_type analyticSolution(
408 : : tk::real xi, tk::real yi, tk::real zi, tk::real t ) const = 0;
409 : : virtual tk::InitializeFn::result_type solution(
410 : : tk::real xi, tk::real yi, tk::real zi, tk::real t ) const = 0;
411 : : };
412 : :
413 : : //! \brief Model models the Concept above by deriving from it and overriding
414 : : //! the virtual functions required by Concept
415 : : template< typename T >
416 : : struct Model : Concept {
417 : 273 : explicit Model( T x ) : data( std::move(x) ) {}
418 [ - - ]: 0 : Concept* copy() const override { return new Model( *this ); }
419 : 918 : std::size_t nprim() const override
420 : 918 : { return data.nprim(); }
421 : 0 : std::size_t nmat() const override
422 : 0 : { return data.nmat(); }
423 : 918 : void numEquationDofs(std::vector< std::size_t >& numEqDof) const override
424 : 918 : { data.numEquationDofs(numEqDof); }
425 : 918 : void IcBoxElems( const tk::Fields& geoElem,
426 : : std::size_t nielem,
427 : : std::vector< std::unordered_set< std::size_t > >& inbox )
428 : 918 : const override { data.IcBoxElems( geoElem, nielem, inbox ); }
429 : 1050 : void initialize(
430 : : const tk::Fields& L,
431 : : const std::vector< std::size_t >& inpoel,
432 : : const tk::UnsMesh::Coords& coord,
433 : : const std::vector< std::unordered_set< std::size_t > >& inbox,
434 : : tk::Fields& unk,
435 : : tk::real t,
436 : : const std::size_t nielem )
437 : 1050 : const override { data.initialize( L, inpoel, coord, inbox, unk, t,
438 : 1050 : nielem ); }
439 : 1158 : void lhs( const tk::Fields& geoElem, tk::Fields& l ) const override
440 : 1158 : { data.lhs( geoElem, l ); }
441 : 74580 : void updateInterfaceCells( tk::Fields& unk,
442 : : std::size_t nielem,
443 : : std::vector< std::size_t >& ndofel )
444 : 74580 : const override { data.updateInterfaceCells( unk, nielem, ndofel ); }
445 : 75498 : void updatePrimitives( const tk::Fields& unk,
446 : : const tk::Fields& L,
447 : : const tk::Fields& geoElem,
448 : : tk::Fields& prim,
449 : : std::size_t nielem )
450 : 75498 : const override { data.updatePrimitives( unk, L, geoElem, prim, nielem ); }
451 : 74580 : void cleanTraceMaterial( const tk::Fields& geoElem,
452 : : tk::Fields& unk,
453 : : tk::Fields& prim,
454 : : std::size_t nielem )
455 : 74580 : const override { data.cleanTraceMaterial( geoElem, unk, prim, nielem ); }
456 : 44760 : void reconstruct( tk::real t,
457 : : const tk::Fields& geoFace,
458 : : const tk::Fields& geoElem,
459 : : const inciter::FaceData& fd,
460 : : const std::map< std::size_t,
461 : : std::vector< std::size_t > >& esup,
462 : : const std::vector< std::size_t >& inpoel,
463 : : const tk::UnsMesh::Coords& coord,
464 : : tk::Fields& U,
465 : : tk::Fields& P ) const override
466 : : {
467 : 44760 : data.reconstruct( t, geoFace, geoElem, fd, esup, inpoel, coord, U, P );
468 : 44760 : }
469 : 44760 : void limit( tk::real t,
470 : : const tk::Fields& geoFace,
471 : : const tk::Fields& geoElem,
472 : : const inciter::FaceData& fd,
473 : : const std::map< std::size_t, std::vector< std::size_t > >&
474 : : esup,
475 : : const std::vector< std::size_t >& inpoel,
476 : : const tk::UnsMesh::Coords& coord,
477 : : const std::vector< std::size_t >& ndofel,
478 : : const std::vector< std::size_t >& gid,
479 : : const std::unordered_map< std::size_t, std::size_t >& bid,
480 : : const std::vector< std::vector<tk::real> >& uNodalExtrm,
481 : : const std::vector< std::vector<tk::real> >& pNodalExtrm,
482 : : tk::Fields& U,
483 : : tk::Fields& P,
484 : : std::vector< std::size_t >& shockmarker ) const override
485 : : {
486 : 44760 : data.limit( t, geoFace, geoElem, fd, esup, inpoel, coord, ndofel, gid,
487 : : bid, uNodalExtrm, pNodalExtrm, U, P, shockmarker );
488 : 44760 : }
489 : 74580 : void rhs(
490 : : tk::real t,
491 : : const tk::Fields& geoFace,
492 : : const tk::Fields& geoElem,
493 : : const inciter::FaceData& fd,
494 : : const std::vector< std::size_t >& inpoel,
495 : : const std::vector< std::unordered_set< std::size_t > >& boxelems,
496 : : const tk::UnsMesh::Coords& coord,
497 : : const tk::Fields& U,
498 : : const tk::Fields& P,
499 : : const std::vector< std::size_t >& ndofel,
500 : : tk::Fields& R ) const override
501 : : {
502 : 74580 : data.rhs( t, geoFace, geoElem, fd, inpoel, boxelems, coord, U, P,
503 : : ndofel, R );
504 : 74580 : }
505 : 1636 : void eval_ndof( std::size_t nunk,
506 : : const tk::UnsMesh::Coords& coord,
507 : : const std::vector< std::size_t >& inpoel,
508 : : const inciter::FaceData& fd,
509 : : const tk::Fields& unk,
510 : : inciter::ctr::PrefIndicatorType indicator,
511 : : std::size_t ndof,
512 : : std::size_t ndofmax,
513 : : tk::real tolref,
514 : : std::vector< std::size_t >& ndofel ) const override
515 : 1636 : { data.eval_ndof( nunk, coord, inpoel, fd, unk, indicator, ndof, ndofmax,
516 : 1636 : tolref, ndofel ); }
517 : 2445 : tk::real dt( const std::array< std::vector< tk::real >, 3 >& coord,
518 : : const std::vector< std::size_t >& inpoel,
519 : : const inciter::FaceData& fd,
520 : : const tk::Fields& geoFace,
521 : : const tk::Fields& geoElem,
522 : : const std::vector< std::size_t >& ndofel,
523 : : const tk::Fields& U,
524 : : const tk::Fields& P,
525 : : const std::size_t nielem ) const override
526 : : { return data.dt( coord, inpoel, fd, geoFace, geoElem, ndofel, U, P,
527 : 2445 : nielem ); }
528 : 2234 : std::vector< std::string > analyticFieldNames() const override
529 : 2234 : { return data.analyticFieldNames(); }
530 : 0 : std::vector< std::string > histNames() const override
531 : 0 : { return data.histNames(); }
532 : 96 : std::vector< std::string > names() const override
533 : 96 : { return data.names(); }
534 : 0 : std::vector< std::vector< tk::real > > surfOutput(
535 : : const std::map< int, std::vector< std::size_t > >& bnd,
536 : : tk::Fields& U ) const override
537 : 0 : { return data.surfOutput( bnd, U ); }
538 : 0 : std::vector< std::vector< tk::real > > histOutput(
539 : : const std::vector< HistData >& h,
540 : : const std::vector< std::size_t >& inpoel,
541 : : const tk::UnsMesh::Coords& coord,
542 : : const tk::Fields& U,
543 : : const tk::Fields& P ) const override
544 : 0 : { return data.histOutput( h, inpoel, coord, U, P ); }
545 : : tk::InitializeFn::result_type
546 : 1319248 : analyticSolution( tk::real xi, tk::real yi, tk::real zi, tk::real t )
547 : 1319248 : const override { return data.analyticSolution( xi, yi, zi, t ); }
548 : : tk::InitializeFn::result_type
549 : 11729902 : solution( tk::real xi, tk::real yi, tk::real zi, tk::real t )
550 : 11729902 : const override { return data.solution( xi, yi, zi, t ); }
551 : : T data;
552 : : };
553 : :
554 : : std::unique_ptr< Concept > self; //!< Base pointer used polymorphically
555 : : };
556 : :
557 : : } // inciter::
558 : :
559 : : #endif // DGPDE_h
|