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 : 2271 : 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 [ + - ]: 2271 : registerDG< dg::MultiSpecies >( df, dgt, ctr::PDEType::MULTISPECIES ) ); 50 : 2271 : } 51 : : 52 : : std::vector< std::pair< std::string, std::string > > 53 : 0 : 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 [ - - ]: 0 : auto c = ++cnt[ ctr::PDEType::MULTISPECIES ]; // count eqs 65 : 0 : --c; // used to index vectors starting with 0 66 : : 67 : 0 : std::vector< std::pair< std::string, std::string > > nfo; 68 : : 69 [ - - ][ - - ]: 0 : nfo.emplace_back( ctr::PDE().name( ctr::PDEType::MULTISPECIES ), "" ); [ - - ] 70 : : 71 [ - - ]: 0 : nfo.emplace_back( "physics", ctr::Physics().name( 72 [ - - ][ - - ]: 0 : g_inputdeck.get< eq, tag::physics >() ) ); 73 : : 74 [ - - ]: 0 : nfo.emplace_back( "problem", ctr::Problem().name( 75 [ - - ][ - - ]: 0 : g_inputdeck.get< eq, tag::problem >() ) ); 76 : : 77 [ - - ]: 0 : nfo.emplace_back( "flux", ctr::Flux().name( 78 [ - - ][ - - ]: 0 : g_inputdeck.get< tag::flux >() ) ); 79 : : 80 : 0 : auto nspec = g_inputdeck.get< eq, tag::nspec >(); 81 [ - - ][ - - ]: 0 : nfo.emplace_back( "number of species", std::to_string( nspec ) ); 82 : : 83 : 0 : auto viscous = g_inputdeck.get< eq, tag::viscous >(); 84 [ - - ][ - - ]: 0 : nfo.emplace_back( "viscosity", std::to_string( viscous ) ); 85 : : 86 : 0 : auto ncomp = g_inputdeck.get< tag::ncomp >(); 87 [ - - ][ - - ]: 0 : nfo.emplace_back( "number of components", std::to_string( ncomp ) ); 88 : : 89 : : // ICs and IC-boxes 90 : : 91 : 0 : const auto& ic = g_inputdeck.get< tag::ic >(); 92 : : 93 : 0 : const auto& bgmatidic = ic.get< tag::materialid >(); 94 [ - - ][ - - ]: 0 : nfo.emplace_back( "IC background material id", parameter( bgmatidic ) ); 95 : : 96 : 0 : const auto& icbox = ic.get< tag::box >(); 97 [ - - ]: 0 : if (!icbox.empty()) { 98 : 0 : std::size_t bcnt = 0; 99 [ - - ]: 0 : for (const auto& b : icbox) { // for all boxes configured for this eq 100 : : std::vector< tk::real > box 101 : 0 : { b.get< tag::xmin >(), b.get< tag::xmax >(), 102 : 0 : b.get< tag::ymin >(), b.get< tag::ymax >(), 103 [ - - ]: 0 : b.get< tag::zmin >(), b.get< tag::zmax >() }; 104 : : 105 [ - - ][ - - ]: 0 : std::string boxname = "IC box " + parameter(bcnt); 106 [ - - ][ - - ]: 0 : nfo.emplace_back( boxname, parameters( box ) ); 107 : : 108 [ - - ]: 0 : nfo.emplace_back( boxname + " orientation", 109 [ - - ][ - - ]: 0 : parameters(b.get< tag::orientation >()) ); 110 : : 111 [ - - ]: 0 : nfo.emplace_back( boxname + " mass fractions", 112 [ - - ][ - - ]: 0 : parameters(b.get< tag::mass_fractions >()) ); 113 : : 114 : 0 : const auto& initiate = b.get< tag::initiate >(); 115 [ - - ]: 0 : auto opt = ctr::Initiate(); 116 [ - - ][ - - ]: 0 : nfo.emplace_back( boxname + ' ' + opt.group(), opt.name(initiate) ); [ - - ][ - - ] 117 : : 118 : 0 : ++bcnt; 119 : : } 120 : : } 121 : : 122 : 0 : const auto& icblock = ic.get< tag::meshblock >(); 123 [ - - ]: 0 : 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 : 0 : 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 : 0 : return nfo; 135 : : } 136 : : 137 : : } // inciter::