Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/PDE/ConfigureMultiMat.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 Register and compile configuration for multi-material compressible
9 : : flow PDE
10 : : \details Register and compile configuration for compressible multi-material
11 : : flow PDE.
12 : : */
13 : : // *****************************************************************************
14 : : #ifndef ConfigureMultiMat_h
15 : : #define ConfigureMultiMat_h
16 : :
17 : : #include <set>
18 : : #include <map>
19 : : #include <vector>
20 : :
21 : : #include "PDEFactory.hpp"
22 : : #include "SystemComponents.hpp"
23 : : #include "Inciter/Options/PDE.hpp"
24 : : #include "PDE/MultiMat/MultiMatIndexing.hpp"
25 : : #include "ContainerUtil.hpp"
26 : :
27 : : namespace inciter {
28 : :
29 : : //! Register compressible flow PDEs into PDE factory
30 : : void
31 : : registerMultiMat( DGFactory& df, std::set< ctr::PDEType >& dgt );
32 : :
33 : : //! Return information on the multi-material compressible flow PDE
34 : : std::vector< std::pair< std::string, std::string > >
35 : : infoMultiMat( std::map< ctr::PDEType, tk::ctr::ncomp_t >& cnt );
36 : :
37 : : //! \brief Assign function that computes physics variables from the
38 : : //! numerical solution for MultiMat
39 : : void
40 : : assignMultiMatGetVars( const std::string& name, tk::GetVarFn& f );
41 : :
42 : : /** @name Functions that compute physics variables from the numerical solution for MultiMat */
43 : : ///@{
44 : :
45 : : #if defined(__clang__)
46 : : #pragma clang diagnostic push
47 : : #pragma clang diagnostic ignored "-Wunused-function"
48 : : #endif
49 : :
50 : : namespace multimat {
51 : :
52 : : //! Compute bulk density for output to file
53 : : //! \note Must follow the signature in tk::GetVarFn
54 : : //! \param[in] U Numerical solution
55 : : //! \param[in] offset System offset specifying the position of the MultiMat
56 : : //! equation system among other systems
57 : : //! \param[in] rdof Number of reconstructed solution DOFs
58 : : //! \return Bulk density ready to be output to file
59 : : static tk::GetVarFn::result_type
60 : 155 : bulkDensityOutVar( const tk::Fields& U, tk::ctr::ncomp_t offset, std::size_t rdof )
61 : : {
62 : : using tk::operator+=;
63 : 155 : auto sys = tk::cref_find( g_inputdeck.get< tag::sys >(), offset );
64 : 155 : auto nmat = g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[ sys ];
65 : 155 : auto r = U.extract( densityDofIdx(nmat,0,rdof,0), offset );
66 [ + + ]: 325 : for (std::size_t k=1; k<nmat; ++k)
67 [ + - ][ + - ]: 340 : r += U.extract( densityDofIdx(nmat,k,rdof,0), offset );
[ - - ]
68 : 155 : return r;
69 : : }
70 : :
71 : : //! Compute bulk pressure for output to file
72 : : //! \note Must follow the signature in tk::GetVarFn
73 : : //! \param[in] U Numerical solution
74 : : //! \param[in] offset System offset specifying the position of the MultiMat
75 : : //! equation system among other systems
76 : : //! \param[in] rdof Number of reconstructed solution DOFs
77 : : //! \return Bulk pressure ready to be output to file
78 : : static tk::GetVarFn::result_type
79 : 155 : bulkPressureOutVar( const tk::Fields& U, tk::ctr::ncomp_t offset,
80 : : std::size_t rdof )
81 : : {
82 : : using tk::operator+=;
83 : 155 : auto sys = tk::cref_find( g_inputdeck.get< tag::sys >(), offset );
84 : 155 : auto nmat = g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[ sys ];
85 : 155 : auto p = U.extract( pressureDofIdx(nmat,0,rdof,0), offset );
86 [ + + ]: 325 : for (std::size_t k=1; k<nmat; ++k)
87 [ + - ][ + - ]: 340 : p += U.extract( pressureDofIdx(nmat,k,rdof,0), offset );
[ - - ]
88 : 155 : return p;
89 : : }
90 : :
91 : : //! Compute bulk specific total energy (energy per unit mass) for output to file
92 : : //! \note Must follow the signature in tk::GetVarFn
93 : : //! \param[in] U Numerical solution
94 : : //! \param[in] offset System offset specifying the position of the MultiMat
95 : : //! equation system among other systems
96 : : //! \param[in] rdof Number of reconstructed solution DOFs
97 : : //! \return Bulk specific total energy ready to be output to file
98 : : static tk::GetVarFn::result_type
99 : 155 : bulkSpecificTotalEnergyOutVar( const tk::Fields& U, tk::ctr::ncomp_t offset,
100 : : std::size_t rdof )
101 : : {
102 : : using tk::operator+=;
103 : 155 : auto sys = tk::cref_find( g_inputdeck.get< tag::sys >(), offset );
104 : 155 : auto nmat = g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[ sys ];
105 : 155 : auto e = U.extract( energyDofIdx(nmat,0,rdof,0), offset );
106 [ + + ]: 325 : for (std::size_t k=1; k<nmat; ++k)
107 [ + - ][ + - ]: 340 : e += U.extract( energyDofIdx(nmat,k,rdof,0), offset );
[ - - ]
108 : 155 : return e;
109 : : }
110 : :
111 : : //! Compute velocity component for output to file
112 : : //! \note Must follow the signature in tk::GetVarFn
113 : : //! \tparam dir Physical direction, encoded as 0:x, 1:y, 2:z
114 : : //! \param[in] U Numerical solution
115 : : //! \param[in] offset System offset specifying the position of the MultiMat
116 : : //! equation system among other systems
117 : : //! \param[in] rdof Number of reconstructed solution DOFs
118 : : //! \return Velocity component ready to be output to file
119 : : template< tk::ctr::ncomp_t dir >
120 : : tk::GetVarFn::result_type
121 : 465 : velocityOutVar( const tk::Fields& U, tk::ctr::ncomp_t offset, std::size_t rdof )
122 : : {
123 : 465 : auto sys = tk::cref_find( g_inputdeck.get< tag::sys >(), offset );
124 : 465 : auto nmat = g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[ sys ];
125 : 465 : return U.extract( velocityDofIdx(nmat,dir,rdof,0), offset );
126 : : }
127 : :
128 : : //! Compute material indicator function for output to file
129 : : //! \note Must follow the signature in tk::GetVarFn
130 : : //! \param[in] U Numerical solution
131 : : //! \param[in] offset System offset specifying the position of the MultiMat
132 : : //! equation system among other systems
133 : : //! \param[in] rdof Number of reconstructed solution DOFs
134 : : //! \return Material indicator function ready to be output to file
135 : : static tk::GetVarFn::result_type
136 : 0 : matIndicatorOutVar( const tk::Fields& U, tk::ctr::ncomp_t offset,
137 : : std::size_t rdof )
138 : : {
139 : 0 : auto sys = tk::cref_find( g_inputdeck.get< tag::sys >(), offset );
140 : 0 : auto nmat = g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[ sys ];
141 : 0 : std::vector< tk::real > m(U.nunk(), 0.0);
142 [ - - ]: 0 : for (std::size_t i=0; i<U.nunk(); ++i) {
143 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k)
144 : 0 : m[i] += U(i, volfracDofIdx(nmat,k,rdof,0), offset) *
145 : 0 : static_cast< tk::real >(k+1);
146 : : }
147 : 0 : return m;
148 : : }
149 : :
150 : : } // multimat::
151 : :
152 : : #if defined(__clang__)
153 : : #pragma clang diagnostic pop
154 : : #endif
155 : :
156 : : //@}
157 : :
158 : : } // inciter::
159 : :
160 : : #endif // ConfigureMultiMat_h
|