Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/PDE/ConfigureMultiSpecies.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 multi-species compressible
9 : : flow PDE
10 : : */
11 : : // *****************************************************************************
12 : :
13 : : #include <set>
14 : : #include <map>
15 : : #include <vector>
16 : : #include <string>
17 : :
18 : : #include <brigand/algorithms/for_each.hpp>
19 : :
20 : : #include "Tags.hpp"
21 : : #include "CartesianProduct.hpp"
22 : : #include "PDEFactory.hpp"
23 : : #include "Inciter/Options/PDE.hpp"
24 : : #include "ContainerUtil.hpp"
25 : : #include "ConfigureMultiSpecies.hpp"
26 : : #include "MultiSpecies/Physics/DG.hpp"
27 : : #include "MultiSpecies/DGMultiSpecies.hpp"
28 : : #include "MultiSpecies/Problem.hpp"
29 : : #include "Inciter/Options/Material.hpp"
30 : :
31 : : namespace inciter {
32 : :
33 : : void
34 : 2310 : registerMultiSpecies( DGFactory& df, FVFactory& /*ff*/,
35 : : std::set< ctr::PDEType >& /*fvt*/, std::set< ctr::PDEType >& dgt )
36 : : // *****************************************************************************
37 : : // Register multi-material compressible flow PDE into PDE factory
38 : : //! \param[in,out] df Discontinuous Galerkin PDE factory to register to
39 : : // //! \param[in,out] ff Finite volume PDE factory to register to
40 : : //! \param[in,out] dgt Counters for equation types registered into DG factory
41 : : // //! \param[in,out] fvt Counters for equation types registered into FV factory
42 : : // *****************************************************************************
43 : : {
44 : : // Construct vector of vectors for all possible policies
45 : : using DGMultiSpeciesPolicies =
46 : : tk::cartesian_product< dg::MultiSpeciesPhysics, MultiSpeciesProblems >;
47 : : // Register PDEs for all combinations of policies
48 : : brigand::for_each< DGMultiSpeciesPolicies >(
49 : : registerDG< dg::MultiSpecies >( df, dgt, ctr::PDEType::MULTISPECIES ) );
50 : 2310 : }
51 : :
52 : : std::vector< std::pair< std::string, std::string > >
53 : 3 : infoMultiSpecies( std::map< ctr::PDEType, tk::ncomp_t >& cnt )
54 : : // *****************************************************************************
55 : : // Return information on the compressible flow system of PDEs
56 : : //! \param[inout] cnt std::map of counters for all PDE types
57 : : //! \return vector of string pairs describing the PDE configuration
58 : : // *****************************************************************************
59 : : {
60 : : using eq = tag::multispecies;
61 : : using tk::parameter;
62 : : using tk::parameters;
63 : :
64 [ + - ]: 3 : auto c = ++cnt[ ctr::PDEType::MULTISPECIES ]; // count eqs
65 : : --c; // used to index vectors starting with 0
66 : :
67 : : std::vector< std::pair< std::string, std::string > > nfo;
68 : :
69 [ + - ][ + - ]: 6 : nfo.emplace_back( ctr::PDE().name( ctr::PDEType::MULTISPECIES ), "" );
70 : :
71 [ + - ]: 3 : nfo.emplace_back( "physics", ctr::Physics().name(
72 [ + - ]: 6 : g_inputdeck.get< eq, tag::physics >() ) );
73 : :
74 [ + - ]: 3 : nfo.emplace_back( "problem", ctr::Problem().name(
75 [ + - ]: 6 : g_inputdeck.get< eq, tag::problem >() ) );
76 : :
77 [ + - ]: 3 : nfo.emplace_back( "flux", ctr::Flux().name(
78 [ + - ]: 6 : g_inputdeck.get< tag::flux >() ) );
79 : :
80 [ + - ]: 3 : auto nspec = g_inputdeck.get< eq, tag::nspec >();
81 [ + - ]: 3 : nfo.emplace_back( "number of species", std::to_string( nspec ) );
82 : :
83 : 3 : auto viscous = g_inputdeck.get< eq, tag::viscous >();
84 [ + - ][ + - ]: 3 : nfo.emplace_back( "viscosity", std::to_string( viscous ) );
85 : :
86 [ + - ]: 3 : auto ncomp = g_inputdeck.get< tag::ncomp >();
87 [ + - ]: 3 : nfo.emplace_back( "number of components", std::to_string( ncomp ) );
88 : :
89 : : // ICs and IC-boxes
90 : :
91 : : const auto& ic = g_inputdeck.get< tag::ic >();
92 : :
93 : : const auto& bgmatidic = ic.get< tag::materialid >();
94 [ + - ][ + - ]: 6 : nfo.emplace_back( "IC background material id", parameter( bgmatidic ) );
[ + - ]
95 : :
96 : : const auto& icbox = ic.get< tag::box >();
97 [ + - ]: 3 : if (!icbox.empty()) {
98 : 3 : std::size_t bcnt = 0;
99 [ + + ]: 6 : for (const auto& b : icbox) { // for all boxes configured for this eq
100 : : std::vector< tk::real > box
101 : 3 : { b.get< tag::xmin >(), b.get< tag::xmax >(),
102 : 3 : b.get< tag::ymin >(), b.get< tag::ymax >(),
103 [ + - ]: 3 : b.get< tag::zmin >(), b.get< tag::zmax >() };
104 : :
105 [ + - ][ + - ]: 3 : std::string boxname = "IC box " + parameter(bcnt);
[ - - ]
106 [ + - ][ + - ]: 6 : nfo.emplace_back( boxname, parameters( box ) );
[ + - ]
107 : :
108 [ + - ][ - + ]: 6 : nfo.emplace_back( boxname + " orientation",
[ - - ]
109 [ + - ][ + - ]: 9 : parameters(b.get< tag::orientation >()) );
[ + - ]
110 : :
111 [ + - ][ - + ]: 6 : nfo.emplace_back( boxname + " mass fractions",
[ - - ]
112 [ + - ][ + - ]: 6 : parameters(b.get< tag::mass_fractions >()) );
[ - - ]
113 : :
114 : : const auto& initiate = b.get< tag::initiate >();
115 [ + - ]: 3 : auto opt = ctr::Initiate();
116 [ + - ][ + - ]: 9 : nfo.emplace_back( boxname + ' ' + opt.group(), opt.name(initiate) );
[ + - ][ - + ]
[ - - ]
117 : :
118 : 3 : ++bcnt;
119 : : }
120 : : }
121 : :
122 : : const auto& icblock = ic.get< tag::meshblock >();
123 [ - + ]: 3 : for (const auto& b : icblock) { // for all blocks configured for eq
124 : : std::string blockname = "IC mesh block " +
125 [ - - ][ - - ]: 0 : parameter(b.get< tag::blockid >());
[ - - ]
126 : :
127 [ - - ][ - - ]: 0 : nfo.emplace_back( blockname + " material id",
[ - - ]
128 [ - - ][ - - ]: 0 : parameter( b.get< tag::materialid >() ) );
[ - - ]
129 : : const auto& initiate = b.get< tag::initiate >();
130 [ - - ]: 0 : auto opt = ctr::Initiate();
131 [ - - ][ - - ]: 0 : nfo.emplace_back( blockname + ' ' + opt.group(), opt.name(initiate) );
[ - - ][ - - ]
[ - - ]
132 : : }
133 : :
134 : 3 : return nfo;
135 : : }
136 : :
137 : : } // inciter::
|