Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/PDE/Integrate/Initialize.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 Functions for initialization of system of PDEs in DG methods
9 : : \details This file contains functionality for setting initial conditions
10 : : and evaluating known solutions used in discontinuous Galerkin methods for
11 : : various orders of numerical representation.
12 : : */
13 : : // *****************************************************************************
14 : : #ifndef Initialize_h
15 : : #define Initialize_h
16 : :
17 : : #include "Basis.hpp"
18 : : #include "Types.hpp"
19 : : #include "Fields.hpp"
20 : : #include "UnsMesh.hpp"
21 : : #include "FunctionPrototypes.hpp"
22 : : #include "Inciter/InputDeck/InputDeck.hpp"
23 : :
24 : : namespace inciter {
25 : :
26 : : extern ctr::InputDeck g_inputdeck;
27 : :
28 : : } // inciter::
29 : :
30 : : namespace tk {
31 : :
32 : : //! Initalize a PDE system for DG by projecting the exact solution
33 : : //! in the DG solution space
34 : : void
35 : : initialize( ncomp_t system,
36 : : ncomp_t ncomp,
37 : : ncomp_t offset,
38 : : const Fields& L,
39 : : const std::vector< std::size_t >& inpoel,
40 : : const UnsMesh::Coords& coord,
41 : : const InitializeFn& solution,
42 : : Fields& unk,
43 : : real t,
44 : : const std::size_t nielem );
45 : :
46 : : //! Update the rhs by adding the initial analytical solution term
47 : : void
48 : : update_rhs( ncomp_t ncomp,
49 : : const std::size_t ndof,
50 : : const tk::real wt,
51 : : const std::vector< tk::real >& B,
52 : : const std::vector< tk::real >& s,
53 : : std::vector< tk::real >& R );
54 : :
55 : :
56 : : //! Compute the initial conditions
57 : : void
58 : : eval_init( ncomp_t ncomp,
59 : : ncomp_t offset,
60 : : const std::size_t ndof,
61 : : const std::size_t rdof,
62 : : const std::size_t e,
63 : : const std::vector< tk::real >& R,
64 : : const Fields& L,
65 : : Fields& unk );
66 : :
67 : : template< class eq >
68 : : void
69 : 277 : BoxElems( std::size_t system,
70 : : const tk::Fields& geoElem,
71 : : std::size_t nielem,
72 : : std::vector< std::unordered_set< std::size_t > >& inbox )
73 : : // *****************************************************************************
74 : : //! Determine if elements lie inside user defined IC boxes
75 : : //! \tparam eq Equation type to operate on, e.g., tag::compflow, tag::multimat
76 : : //! \param[in] system Equation system index
77 : : //! \param[in] geoElem Element geometry array
78 : : //! \param[in] nielem Number of internal elements
79 : : //! \param[in,out] inbox List of nodes at which box user ICs are set for
80 : : //! each IC box
81 : : // *****************************************************************************
82 : : {
83 : : // Detect if user has configured a IC boxes
84 : 277 : const auto& icbox = inciter::g_inputdeck.get<tag::param, eq, tag::ic,
85 : : tag::box>();
86 [ + - ]: 277 : if (icbox.size() > system) {
87 : 277 : std::size_t bcnt = 0;
88 [ - + ]: 277 : for (const auto& b : icbox[system]) { // for all boxes for this eq
89 [ - - ]: 0 : inbox.emplace_back();
90 [ - - ]: 0 : std::vector< tk::real > box
91 : : { b.template get< tag::xmin >(), b.template get< tag::xmax >(),
92 : : b.template get< tag::ymin >(), b.template get< tag::ymax >(),
93 : : b.template get< tag::zmin >(), b.template get< tag::zmax >() };
94 : :
95 : 0 : const auto eps = std::numeric_limits< tk::real >::epsilon();
96 : : // Determine which elements lie in the IC box
97 [ - - ]: 0 : for (ncomp_t e=0; e<nielem; ++e) {
98 [ - - ]: 0 : auto x = geoElem(e,1,0);
99 [ - - ]: 0 : auto y = geoElem(e,2,0);
100 [ - - ]: 0 : auto z = geoElem(e,3,0);
101 [ - - ]: 0 : if ( std::any_of( begin(box), end(box),
102 : 0 : [=](auto p){ return abs(p) > eps; } ) &&
103 [ - - ][ - - ]: 0 : x>box[0] && x<box[1] &&
104 [ - - ][ - - ]: 0 : y>box[2] && y<box[3] &&
105 [ - - ][ - - ]: 0 : z>box[4] && z<box[5] )
[ - - ][ - - ]
106 : : {
107 [ - - ]: 0 : inbox[bcnt].insert( e );
108 : : }
109 : : }
110 : 0 : ++bcnt;
111 : : }
112 : : }
113 : 277 : }
114 : :
115 : : } // tk::
116 : :
117 : : #endif // Initialize_h
|