Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/PDE/ConfigureCompFlow.cpp
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 compressible flow PDE
9 : : \details Register and compile configuration for compressible flow PDE.
10 : : */
11 : : // *****************************************************************************
12 : :
13 : : #include <set>
14 : : #include <map>
15 : : #include <vector>
16 : : #include <string>
17 : : #include <limits>
18 : :
19 : : #include <brigand/algorithms/for_each.hpp>
20 : :
21 : : #include "Tags.hpp"
22 : : #include "CartesianProduct.hpp"
23 : : #include "PDEFactory.hpp"
24 : : #include "Inciter/Options/PDE.hpp"
25 : : #include "ContainerUtil.hpp"
26 : : #include "ConfigureCompFlow.hpp"
27 : : #include "CompFlow/Physics/CG.hpp"
28 : : #include "CompFlow/Physics/DG.hpp"
29 : : #include "CompFlow/CGCompFlow.hpp"
30 : : #include "CompFlow/DGCompFlow.hpp"
31 : : #include "CompFlow/Problem.hpp"
32 : : #include "InfoMesh.hpp"
33 : :
34 : : namespace inciter {
35 : :
36 : : void
37 : 1565 : registerCompFlow( CGFactory& cf,
38 : : DGFactory& df,
39 : : std::set< ctr::PDEType >& cgt,
40 : : std::set< ctr::PDEType >& dgt )
41 : : // *****************************************************************************
42 : : // Register compressible flow PDE into PDE factory
43 : : //! \param[in,out] cf Continuous Galerkin PDE factory to register to
44 : : //! \param[in,out] df Discontinuous Galerkin PDE factory to register to
45 : : //! \param[in,out] cgt Counters for equation types registered into CG factory
46 : : //! \param[in,out] dgt Counters for equation types registered into DG factory
47 : : // *****************************************************************************
48 : : {
49 : : // Construct vector of vectors for all possible policies
50 : : using CGCompFlowPolicies =
51 : : tk::cartesian_product< cg::CompFlowPhysics, CompFlowProblems >;
52 : : // Register PDEs for all combinations of policies
53 : : brigand::for_each< CGCompFlowPolicies >(
54 [ + - ]: 1565 : registerCG< cg::CompFlow >( cf, cgt, ctr::PDEType::COMPFLOW ) );
55 : :
56 : : // Construct vector of vectors for all possible policies
57 : : using DGCompFlowPolicies =
58 : : tk::cartesian_product< dg::CompFlowPhysics, CompFlowProblems >;
59 : : // Register PDEs for all combinations of policies
60 : : brigand::for_each< DGCompFlowPolicies >(
61 [ + - ]: 1565 : registerDG< dg::CompFlow >( df, dgt, ctr::PDEType::COMPFLOW ) );
62 : 1565 : }
63 : :
64 : : std::vector< std::pair< std::string, std::string > >
65 : 95 : infoCompFlow( std::map< ctr::PDEType, tk::ctr::ncomp_t >& cnt )
66 : : // *****************************************************************************
67 : : // Return information on the compressible flow system of PDEs
68 : : //! \param[inout] cnt std::map of counters for all PDE types
69 : : //! \return vector of string pairs describing the PDE configuration
70 : : // *****************************************************************************
71 : : {
72 : : using eq = tag::compflow;
73 : : using tk::parameter;
74 : : using tk::parameters;
75 : :
76 [ + - ]: 95 : auto c = ++cnt[ ctr::PDEType::COMPFLOW ]; // count eqs
77 : 95 : --c; // used to index vectors starting with 0
78 : :
79 : 95 : std::vector< std::pair< std::string, std::string > > nfo;
80 : :
81 [ + - ][ + - ]: 95 : nfo.emplace_back( ctr::PDE().name( ctr::PDEType::COMPFLOW ), "" );
[ + - ]
82 : :
83 [ + - ]: 285 : nfo.emplace_back( "dependent variable", std::string( 1,
84 [ + - ]: 190 : g_inputdeck.get< tag::param, eq, tag::depvar >()[c] ) );
85 : :
86 [ + - ]: 95 : infoMesh< eq >( c, nfo );
87 : :
88 [ + - ]: 190 : nfo.emplace_back( "physics", ctr::Physics().name(
89 [ + - ][ + - ]: 95 : g_inputdeck.get< tag::param, eq, tag::physics >()[c] ) );
90 : :
91 [ + - ]: 190 : nfo.emplace_back( "problem", ctr::Problem().name(
92 [ + - ][ + - ]: 95 : g_inputdeck.get< tag::param, eq, tag::problem >()[c] ) );
93 : :
94 : 95 : auto ncomp = g_inputdeck.get< tag::component >().get< eq >()[c];
95 [ + - ][ + - ]: 95 : nfo.emplace_back( "number of components", parameter( ncomp ) );
96 : :
97 : 95 : const auto scheme = g_inputdeck.get< tag::discr, tag::scheme >();
98 [ + + ][ + + ]: 95 : if (scheme != ctr::SchemeType::DiagCG && scheme != ctr::SchemeType::ALECG)
99 [ + - ]: 70 : nfo.emplace_back( "flux", ctr::Flux().name(
100 [ + - ][ + - ]: 35 : g_inputdeck.get< tag::param, eq, tag::flux >().at(c) ) );
[ + - ]
101 : :
102 : 95 : nfo.emplace_back( "start offset in unknowns array", parameter(
103 [ + - ][ + - ]: 95 : g_inputdeck.get< tag::component >().offset< eq >(c) ) );
104 : :
105 : : // Material property output
106 : 95 : const auto& matprop = g_inputdeck.get< tag::param, eq, tag::material >()[c][0];
107 : 95 : const auto& m_id = matprop.get< tag::id >();
108 [ + - ]: 190 : ctr::Material mopt;
109 [ + - ]: 95 : nfo.emplace_back( mopt.name( matprop.get< tag::eos >() ),
110 [ + - ][ + - ]: 190 : std::to_string(m_id.size()) );
111 : :
112 : : nfo.emplace_back( "ratio of specific heats",
113 [ + - ][ + - ]: 95 : parameters(matprop.get< tag::gamma >()) );
114 : 95 : const auto& cv = matprop.get< tag::cv >();
115 [ + - ]: 95 : if (!cv.empty())
116 : : nfo.emplace_back( "specific heat at constant volume",
117 [ + - ][ + - ]: 95 : parameters(cv) );
118 : 95 : const auto& pstiff = matprop.get< tag::pstiff >();
119 [ + - ]: 95 : if (!pstiff.empty())
120 : : nfo.emplace_back( "material stiffness",
121 [ + - ][ + - ]: 95 : parameters(pstiff) );
122 : :
123 : : // Viscosity is optional: vector may be empty
124 : 95 : const auto& mu = matprop.get< tag::mu >();
125 [ - + ]: 95 : if (!mu.empty())
126 [ - - ][ - - ]: 0 : nfo.emplace_back( "dynamic viscosity", parameters( mu ) );
127 : :
128 : : // Heat conductivity is optional: vector may be empty
129 : 95 : const auto& k = matprop.get< tag::k >();
130 [ - + ]: 95 : if (!k.empty())
131 [ - - ][ - - ]: 0 : nfo.emplace_back( "heat conductivity", parameters( k ) );
132 : :
133 : 95 : const auto& npar = g_inputdeck.get< tag::param, eq, tag::npar >();
134 [ - + ]: 95 : if (!npar.empty())
135 [ - - ][ - - ]: 0 : nfo.emplace_back( "number of tracker particles", parameters( npar ) );
136 : :
137 : 95 : const auto& alpha = g_inputdeck.get< tag::param, eq, tag::alpha >();
138 [ + + ][ + - ]: 95 : if (!alpha.empty()) nfo.emplace_back( "coeff alpha", parameters( alpha ) );
[ + - ]
139 : :
140 : : const auto& beta =
141 : 95 : g_inputdeck.get< tag::param, eq, tag::beta >();
142 [ + + ]: 95 : if (!beta.empty())
143 [ + - ][ + - ]: 34 : nfo.emplace_back( "coeff beta", parameters( beta ) );
144 : :
145 : 95 : const auto& bx = g_inputdeck.get< tag::param, eq, tag::betax >();
146 [ + + ][ + - ]: 95 : if (!bx.empty()) nfo.emplace_back( "coeff betax", parameters( bx ) );
[ + - ]
147 : :
148 : 95 : const auto& by = g_inputdeck.get< tag::param, eq, tag::betay >();
149 [ + + ][ + - ]: 95 : if (!by.empty()) nfo.emplace_back( "coeff betay", parameters( by ) );
[ + - ]
150 : :
151 : 95 : const auto& bz = g_inputdeck.get< tag::param, eq, tag::betaz >();
152 [ + + ][ + - ]: 95 : if (!bz.empty()) nfo.emplace_back( "coeff betaz", parameters( bz ) );
[ + - ]
153 : :
154 : 95 : const auto& r0 = g_inputdeck.get< tag::param, eq, tag::r0 >();
155 [ + + ][ + - ]: 95 : if (!r0.empty()) nfo.emplace_back( "coeff r0", parameters( r0 ) );
[ + - ]
156 : :
157 : 95 : const auto& ce = g_inputdeck.get< tag::param, eq, tag::ce >();
158 [ + + ][ + - ]: 95 : if (!ce.empty()) nfo.emplace_back( "coeff ce", parameters( ce ) );
[ + - ]
159 : :
160 : 95 : const auto& kappa = g_inputdeck.get< tag::param, eq, tag::kappa >();
161 [ + + ][ + - ]: 95 : if (!kappa.empty()) nfo.emplace_back( "coeff k", parameters( kappa ) );
[ + - ]
162 : :
163 : 95 : const auto& p0 = g_inputdeck.get< tag::param, eq, tag::p0 >();
164 [ + + ][ + - ]: 95 : if (!p0.empty()) nfo.emplace_back( "coeff p0", parameters( p0 ) );
[ + - ]
165 : :
166 : : // ICs
167 : :
168 : 95 : const auto& ic = g_inputdeck.get< tag::param, eq, tag::ic >();
169 : :
170 : 95 : const auto& bgdensityic = ic.get< tag::density >();
171 [ + + ][ + - ]: 95 : if (bgdensityic.size() > c && !bgdensityic[c].empty())
[ + + ]
172 : : nfo.emplace_back( "IC background density",
173 [ + - ][ + - ]: 7 : parameter( bgdensityic[c][0] ) );
174 : 95 : const auto& bgvelocityic = ic.get< tag::velocity >();
175 [ + + ][ + - ]: 95 : if (bgvelocityic.size() > c && !bgvelocityic[c].empty())
[ + + ]
176 : : nfo.emplace_back( "IC background velocity",
177 [ + - ][ + - ]: 7 : parameters( bgvelocityic[c] ) );
178 : 95 : const auto& bgpressureic = ic.get< tag::pressure >();
179 [ + + ][ + - ]: 95 : if (bgpressureic.size() > c && !bgpressureic[c].empty())
[ + + ]
180 : : nfo.emplace_back( "IC background pressure",
181 [ + - ][ + - ]: 7 : parameter( bgpressureic[c][0] ) );
182 : 95 : const auto& bgenergyic = ic.get< tag::energy >();
183 [ - + ][ - - ]: 95 : if (bgenergyic.size() > c && !bgenergyic[c].empty())
[ - + ]
184 : : nfo.emplace_back( "IC background energy",
185 [ - - ][ - - ]: 0 : parameter( bgenergyic[c][0] ) );
186 : 95 : const auto& bgtemperatureic = ic.get< tag::temperature >();
187 [ - + ][ - - ]: 95 : if (bgtemperatureic.size() > c && !bgtemperatureic[c].empty())
[ - + ]
188 : : nfo.emplace_back( "IC background temperature",
189 [ - - ][ - - ]: 0 : parameter( bgtemperatureic[c][0] ) );
190 : :
191 : 95 : const auto& icbox = ic.get< tag::box >();
192 [ + - ]: 95 : if (icbox.size() > c) {
193 : 95 : std::size_t bcnt = 0;
194 [ + + ]: 98 : for (const auto& b : icbox[c]) { // for all boxes configured for this eq
195 : : std::vector< tk::real > box
196 : 3 : { b.get< tag::xmin >(), b.get< tag::xmax >(),
197 : 9 : b.get< tag::ymin >(), b.get< tag::ymax >(),
198 [ + - ]: 6 : b.get< tag::zmin >(), b.get< tag::zmax >() };
199 : :
200 [ + - ][ + - ]: 6 : std::string boxname = "IC box " + parameter(bcnt);
201 [ + - ][ + - ]: 3 : nfo.emplace_back( boxname, parameters( box ) );
202 : :
203 [ + - ]: 6 : nfo.emplace_back( boxname + " density",
204 [ + - ][ + - ]: 9 : parameter( b.get< tag::density >() ) );
205 [ + - ]: 6 : nfo.emplace_back( boxname + " velocity",
206 [ + - ][ + - ]: 9 : parameters( b.get< tag::velocity >() ) );
207 [ + - ]: 6 : nfo.emplace_back( boxname + " pressure",
208 [ + - ][ + - ]: 9 : parameter( b.get< tag::pressure >() ) );
209 [ + - ]: 6 : nfo.emplace_back( boxname + " internal energy per unit mass",
210 [ + - ][ + - ]: 9 : parameter( b.get< tag::energy >() ) );
211 [ + - ]: 6 : nfo.emplace_back( boxname + " mass",
212 [ + - ][ + - ]: 9 : parameter( b.get< tag::mass >() ) );
213 [ + - ]: 6 : nfo.emplace_back( boxname + " internal energy per unit volume",
214 [ + - ][ + - ]: 9 : parameter( b.get< tag::energy_content >() ) );
215 [ + - ]: 6 : nfo.emplace_back( boxname + " temperature",
216 [ + - ][ + - ]: 9 : parameter( b.get< tag::temperature >() ) );
217 : :
218 : 3 : const auto& initiate = b.get< tag::initiate >();
219 : 3 : const auto& inittype = initiate.get< tag::init >();
220 [ + - ]: 3 : auto opt = ctr::Initiate();
221 [ + - ][ + - ]: 3 : nfo.emplace_back( boxname + ' ' + opt.group(), opt.name(inittype) );
[ + - ][ + - ]
222 [ + + ]: 3 : if (inittype == ctr::InitiateType::LINEAR) {
223 [ + - ]: 2 : nfo.emplace_back( boxname + " initiate linear point(s)",
224 [ + - ][ + - ]: 3 : parameters( initiate.get< tag::point >() ) );
225 [ + - ]: 2 : nfo.emplace_back( boxname + " initiate linear radius",
226 [ + - ][ + - ]: 3 : parameter( initiate.get< tag::radius >() ) );
227 [ + - ]: 2 : nfo.emplace_back( boxname + " initiate linear velocity",
228 [ + - ][ + - ]: 3 : parameter( initiate.get< tag::velocity >() ) );
229 : : }
230 : 3 : ++bcnt;
231 : : }
232 : : }
233 : :
234 : : // BCs
235 : :
236 : 95 : const auto& stag = g_inputdeck.get< tag::param, eq, tag::stag >();
237 : 95 : const auto& spoint = stag.get< tag::point >();
238 [ + + ]: 95 : if (spoint.size() > c)
239 [ + - ][ + - ]: 3 : nfo.emplace_back( "Stagnation point(s)", parameters( spoint[c] ) );
240 : 95 : const auto& sradius = stag.get< tag::radius >();
241 [ + + ]: 95 : if (sradius.size() > c)
242 [ + - ][ + - ]: 3 : nfo.emplace_back( "Stagnation point(s) radii", parameters( sradius[c] ) );
243 : :
244 : 95 : const auto& skip = g_inputdeck.get< tag::param, eq, tag::skip >();
245 : 95 : const auto& kpoint = skip.get< tag::point >();
246 [ - + ]: 95 : if (kpoint.size() > c)
247 [ - - ][ - - ]: 0 : nfo.emplace_back( "Skip point(s)", parameters( kpoint[c] ) );
248 : 95 : const auto& kradius = skip.get< tag::radius >();
249 [ - + ]: 95 : if (kradius.size() > c)
250 [ - - ][ - - ]: 0 : nfo.emplace_back( "Skip point(s) radii", parameters( kradius[c] ) );
251 : :
252 : : const auto& fs =
253 : 95 : g_inputdeck.get< tag::param, eq, tag::bc, tag::bcfarfield >();
254 [ + + ]: 95 : if (fs.size() > c) {
255 [ + - ][ + - ]: 6 : nfo.emplace_back( "Farfield BC sideset(s)", parameters( fs[c] ) );
256 : : const auto& fr =
257 : 6 : g_inputdeck.get< tag::param, eq, tag::farfield_density >();
258 [ + - ]: 6 : if (fr.size() > c)
259 [ + - ][ + - ]: 6 : nfo.emplace_back( "Farfield BC density", std::to_string(fr[c]) );
260 : : const auto& fu =
261 : 6 : g_inputdeck.get< tag::param, eq, tag::farfield_velocity >();
262 [ + - ]: 6 : if (fu.size() > c)
263 [ + - ][ + - ]: 6 : nfo.emplace_back( "Farfield BC velocity", parameters( fu[c] ) );
264 : : const auto& fp =
265 : 6 : g_inputdeck.get< tag::param, eq, tag::farfield_pressure >();
266 [ + - ]: 6 : if (fp.size() > c)
267 [ + - ][ + - ]: 6 : nfo.emplace_back( "Farfield BC pressure", std::to_string(fp[c]) );
268 : : }
269 : :
270 : : const auto& sym =
271 : 95 : g_inputdeck.get< tag::param, eq, tag::bc, tag::bcsym >();
272 [ + + ]: 95 : if (sym.size() > c) {
273 [ + - ][ + - ]: 41 : nfo.emplace_back( "Symmetry BC sideset(s)", parameters( sym[c] ) );
274 : :
275 : 41 : const auto& sponge = g_inputdeck.get< tag::param, eq, tag::sponge >();
276 : 41 : const auto& ss = sponge.get< tag::sideset >();
277 [ + + ]: 41 : if (ss.size() > c)
278 [ + - ][ + - ]: 2 : nfo.emplace_back( "Sponge sideset(s)", parameters( ss[c] ) );
279 : 41 : const auto& spvel = sponge.get< tag::velocity >();
280 [ + + ]: 41 : if (spvel.size() > c)
281 [ + - ][ + - ]: 1 : nfo.emplace_back( "Sponge velocity parameters", parameters( spvel[c] ) );
282 : 41 : const auto& sppre = sponge.get< tag::pressure >();
283 [ + + ]: 41 : if (sppre.size() > c)
284 [ + - ][ + - ]: 1 : nfo.emplace_back( "Sponge pressure parameters", parameters( sppre[c] ) );
285 : : }
286 : :
287 : : const auto& dir =
288 : 95 : g_inputdeck.get< tag::param, eq, tag::bc, tag::bcdir >();
289 [ + + ]: 95 : if (dir.size() > c)
290 [ + - ][ + - ]: 62 : nfo.emplace_back( "Dirichlet BC sideset(s)", parameters( dir[c] ) );
291 : :
292 : 95 : const auto& timedep = g_inputdeck.get< tag::param, eq, tag::bctimedep >();
293 [ + - ]: 95 : if (timedep.size() > c) {
294 [ + + ]: 96 : for (const auto& bndry : timedep[c]) {
295 : : nfo.emplace_back( "Time dependent BC sideset(s)",
296 [ + - ][ + - ]: 1 : parameters(bndry.get< tag::sideset >()) );
297 : : }
298 : : }
299 : :
300 : : // FCT
301 : :
302 : 28 : auto bool_to_string = [](bool B) -> std::string {
303 [ + + ][ + - ]: 28 : return B ? "true" : "false";
304 : : };
305 : :
306 : 95 : const auto fct = g_inputdeck.get< tag::discr, tag::fct >();
307 [ + + ][ + - ]: 95 : if (scheme == ctr::SchemeType::DiagCG && fct) {
308 : :
309 : 28 : const auto& sys = g_inputdeck.get< tag::param, eq, tag::sysfct >();
310 [ + - ]: 28 : if (sys.size() > c) {
311 [ + - ][ + - ]: 28 : nfo.emplace_back( "FCT system character", bool_to_string( sys[c] ) );
312 : :
313 [ + + ]: 28 : if (sys[c]) { // if system FCT is enabled for this system
314 : 4 : const auto& sv = g_inputdeck.get< tag::param, eq, tag::sysfctvar >();
315 [ + - ]: 4 : if (sv.size() > c) {
316 [ + - ][ + - ]: 4 : nfo.emplace_back( "System-FCT variables", parameters( sv[c] ) );
317 : : }
318 : : }
319 : : }
320 : :
321 : : }
322 : :
323 : 190 : return nfo;
324 : : }
325 : :
326 : : void
327 : 3170 : assignCompFlowGetVars( const std::string& name, tk::GetVarFn& f )
328 : : // *****************************************************************************
329 : : // Assign functions that compute physics variables from the numerical solution
330 : : // for CompFlow
331 : : //! \param[in] name Name of variable whose tk::GetVarFn is to be assigned
332 : : //! \param[in,out] f Function assigned
333 : : // *****************************************************************************
334 : : {
335 : : using namespace kw;
336 : : using namespace compflow;
337 : :
338 [ + - ]: 3170 : assign< outvar_density >( name, densityOutVar, f );
339 [ + - ]: 3170 : assign< outvar_xvelocity >( name, velocityOutVar<0>, f );
340 [ + - ]: 3170 : assign< outvar_yvelocity >( name, velocityOutVar<1>, f );
341 [ + - ]: 3170 : assign< outvar_zvelocity >( name, velocityOutVar<2>, f );
342 [ + - ]: 3170 : assign< outvar_specific_total_energy >( name, specificTotalEnergyOutVar, f );
343 : : assign< outvar_volumetric_total_energy >
344 [ + - ]: 3170 : ( name, volumetricTotalEnergyOutVar, f );
345 [ + - ]: 3170 : assign< outvar_xmomentum >( name, momentumOutVar<0>, f );
346 [ + - ]: 3170 : assign< outvar_ymomentum >( name, momentumOutVar<1>, f );
347 [ + - ]: 3170 : assign< outvar_zmomentum >( name, momentumOutVar<2>, f );
348 [ + - ]: 3170 : assign< outvar_pressure >( name, pressureOutVar, f );
349 : 3170 : }
350 : :
351 : : } // inciter::
|