Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/PDE/ConfigureMultiMat.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-material compressible
9 : : flow PDE
10 : : \details Register and compile configuration for compressible multi-material
11 : : flow PDE.
12 : : */
13 : : // *****************************************************************************
14 : :
15 : : #include <set>
16 : : #include <map>
17 : : #include <vector>
18 : : #include <string>
19 : :
20 : : #include <brigand/algorithms/for_each.hpp>
21 : :
22 : : #include "Tags.hpp"
23 : : #include "CartesianProduct.hpp"
24 : : #include "PDEFactory.hpp"
25 : : #include "Inciter/Options/PDE.hpp"
26 : : #include "ContainerUtil.hpp"
27 : : #include "ConfigureMultiMat.hpp"
28 : : #include "MultiMat/Physics/DG.hpp"
29 : : #include "MultiMat/Physics/FV.hpp"
30 : : #include "MultiMat/DGMultiMat.hpp"
31 : : #include "MultiMat/FVMultiMat.hpp"
32 : : #include "MultiMat/Problem.hpp"
33 : : #include "Inciter/Options/Material.hpp"
34 : :
35 : : namespace inciter {
36 : :
37 : : void
38 : 2271 : registerMultiMat( DGFactory& df, FVFactory& ff,
39 : : std::set< ctr::PDEType >& fvt, std::set< ctr::PDEType >& dgt )
40 : : // *****************************************************************************
41 : : // Register multi-material compressible flow PDE into PDE factory
42 : : //! \param[in,out] df Discontinuous Galerkin PDE factory to register to
43 : : //! \param[in,out] ff Finite volume PDE factory to register to
44 : : //! \param[in,out] dgt Counters for equation types registered into DG factory
45 : : //! \param[in,out] fvt Counters for equation types registered into FV factory
46 : : // *****************************************************************************
47 : : {
48 : : // Construct vector of vectors for all possible policies
49 : : using DGMultiMatPolicies =
50 : : tk::cartesian_product< dg::MultiMatPhysics, MultiMatProblems >;
51 : : // Register PDEs for all combinations of policies
52 : : brigand::for_each< DGMultiMatPolicies >(
53 [ + - ]: 2271 : registerDG< dg::MultiMat >( df, dgt, ctr::PDEType::MULTIMAT ) );
54 : :
55 : : // Construct vector of vectors for all possible policies
56 : : using FVMultiMatPolicies =
57 : : tk::cartesian_product< fv::MultiMatPhysics, MultiMatProblems >;
58 : : // Register PDEs for all combinations of policies
59 : : brigand::for_each< FVMultiMatPolicies >(
60 [ + - ]: 2271 : registerFV< fv::MultiMat >( ff, fvt, ctr::PDEType::MULTIMAT ) );
61 : 2271 : }
62 : :
63 : : std::vector< std::pair< std::string, std::string > >
64 : 33 : infoMultiMat( std::map< ctr::PDEType, tk::ncomp_t >& cnt )
65 : : // *****************************************************************************
66 : : // Return information on the compressible flow system of PDEs
67 : : //! \param[inout] cnt std::map of counters for all PDE types
68 : : //! \return vector of string pairs describing the PDE configuration
69 : : // *****************************************************************************
70 : : {
71 : : using eq = tag::multimat;
72 : : using tk::parameter;
73 : : using tk::parameters;
74 : :
75 [ + - ]: 33 : auto c = ++cnt[ ctr::PDEType::MULTIMAT ]; // count eqs
76 : 33 : --c; // used to index vectors starting with 0
77 : :
78 : 33 : std::vector< std::pair< std::string, std::string > > nfo;
79 : :
80 [ + - ][ + - ]: 33 : nfo.emplace_back( ctr::PDE().name( ctr::PDEType::MULTIMAT ), "" );
[ + - ]
81 : :
82 [ + - ]: 66 : nfo.emplace_back( "physics", ctr::Physics().name(
83 [ + - ][ + - ]: 33 : g_inputdeck.get< eq, tag::physics >() ) );
84 : :
85 [ + - ]: 66 : nfo.emplace_back( "problem", ctr::Problem().name(
86 [ + - ][ + - ]: 33 : g_inputdeck.get< eq, tag::problem >() ) );
87 : :
88 [ + - ]: 66 : nfo.emplace_back( "flux", ctr::Flux().name(
89 [ + - ][ + - ]: 33 : g_inputdeck.get< tag::flux >() ) );
90 : :
91 : 33 : auto nmat = g_inputdeck.get< eq, tag::nmat >();
92 [ + - ][ + - ]: 33 : nfo.emplace_back( "number of materials", std::to_string( nmat ) );
93 : :
94 : 33 : auto prelax = g_inputdeck.get< eq, tag::prelax >();
95 [ + - ][ + - ]: 33 : nfo.emplace_back( "finite pressure relaxation", std::to_string( prelax ) );
96 : :
97 : 33 : auto intsharp = g_inputdeck.get< eq, tag::intsharp >();
98 [ + - ][ + - ]: 33 : nfo.emplace_back( "interface sharpening", std::to_string( intsharp ) );
99 : :
100 : 33 : auto viscous = g_inputdeck.get< eq, tag::viscous >();
101 [ + - ][ + - ]: 33 : nfo.emplace_back( "viscosity", std::to_string( viscous ) );
102 : :
103 : 33 : auto rho0cn = g_inputdeck.get< eq, tag::rho0constraint >();
104 [ + - ][ + - ]: 33 : nfo.emplace_back( "density constraint correction", std::to_string( rho0cn ) );
105 : :
106 : 33 : auto ncomp = g_inputdeck.get< tag::ncomp >();
107 [ + - ][ + - ]: 33 : nfo.emplace_back( "number of components", std::to_string( ncomp ) );
108 : :
109 : : // Material eos output
110 : 33 : const auto& matprop = g_inputdeck.get< tag::material >();
111 [ + + ]: 66 : for (const auto& mtype : matprop) {
112 : 33 : const auto& m_id = mtype.get< tag::id >();
113 [ + - ]: 33 : ctr::Material opt;
114 [ + - ]: 33 : nfo.emplace_back( opt.name( mtype.get< tag::eos >() ),
115 [ + - ][ + - ]: 66 : std::to_string(m_id.size())+" materials" );
[ + - ]
116 [ + - ][ + - ]: 33 : nfo.emplace_back( "material id", parameters( m_id ) );
117 : : }
118 : :
119 : : // ICs and IC-boxes
120 : :
121 : 33 : const auto& ic = g_inputdeck.get< tag::ic >();
122 : :
123 : 33 : const auto& bgmatidic = ic.get< tag::materialid >();
124 [ + - ][ + - ]: 33 : nfo.emplace_back( "IC background material id", parameter( bgmatidic ) );
125 : :
126 : 33 : const auto& icbox = ic.get< tag::box >();
127 [ - + ]: 33 : if (!icbox.empty()) {
128 : 0 : std::size_t bcnt = 0;
129 [ - - ]: 0 : for (const auto& b : icbox) { // for all boxes configured for this eq
130 : : std::vector< tk::real > box
131 : 0 : { b.get< tag::xmin >(), b.get< tag::xmax >(),
132 : 0 : b.get< tag::ymin >(), b.get< tag::ymax >(),
133 [ - - ]: 0 : b.get< tag::zmin >(), b.get< tag::zmax >() };
134 : :
135 [ - - ][ - - ]: 0 : std::string boxname = "IC box " + parameter(bcnt);
136 [ - - ][ - - ]: 0 : nfo.emplace_back( boxname, parameters( box ) );
137 : :
138 [ - - ]: 0 : nfo.emplace_back( boxname + " orientation",
139 [ - - ][ - - ]: 0 : parameters(b.get< tag::orientation >()) );
140 : :
141 [ - - ]: 0 : nfo.emplace_back( boxname + " material id",
142 [ - - ][ - - ]: 0 : parameter( b.get< tag::materialid >() ) );
143 : :
144 : 0 : const auto& initiate = b.get< tag::initiate >();
145 [ - - ]: 0 : auto opt = ctr::Initiate();
146 [ - - ][ - - ]: 0 : nfo.emplace_back( boxname + ' ' + opt.group(), opt.name(initiate) );
[ - - ][ - - ]
147 : :
148 : 0 : ++bcnt;
149 : : }
150 : : }
151 : :
152 : 33 : const auto& icblock = ic.get< tag::meshblock >();
153 [ + + ]: 34 : for (const auto& b : icblock) { // for all blocks configured for eq
154 : : std::string blockname = "IC mesh block " +
155 [ + - ][ + - ]: 2 : parameter(b.get< tag::blockid >());
156 : :
157 [ + - ]: 2 : nfo.emplace_back( blockname + " material id",
158 [ + - ][ + - ]: 3 : parameter( b.get< tag::materialid >() ) );
159 : 1 : const auto& initiate = b.get< tag::initiate >();
160 [ + - ]: 1 : auto opt = ctr::Initiate();
161 [ + - ][ + - ]: 1 : nfo.emplace_back( blockname + ' ' + opt.group(), opt.name(initiate) );
[ + - ][ + - ]
162 : : }
163 : :
164 : 33 : return nfo;
165 : : }
166 : :
167 : : } // inciter::
|