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 : : 33 : : namespace inciter { 34 : : 35 : : void 36 : 2271 : registerCompFlow( CGFactory& cf, 37 : : DGFactory& df, 38 : : std::set< ctr::PDEType >& cgt, 39 : : std::set< ctr::PDEType >& dgt ) 40 : : // ***************************************************************************** 41 : : // Register compressible flow PDE into PDE factory 42 : : //! \param[in,out] cf Continuous Galerkin PDE factory to register to 43 : : //! \param[in,out] df Discontinuous Galerkin PDE factory to register to 44 : : //! \param[in,out] cgt Counters for equation types registered into CG factory 45 : : //! \param[in,out] dgt Counters for equation types registered into DG factory 46 : : // ***************************************************************************** 47 : : { 48 : : // Construct vector of vectors for all possible policies 49 : : using CGCompFlowPolicies = 50 : : tk::cartesian_product< cg::CompFlowPhysics, CompFlowProblems >; 51 : : // Register PDEs for all combinations of policies 52 : : brigand::for_each< CGCompFlowPolicies >( 53 [ + - ]: 2271 : registerCG< cg::CompFlow >( cf, cgt, ctr::PDEType::COMPFLOW ) ); 54 : : 55 : : // Construct vector of vectors for all possible policies 56 : : using DGCompFlowPolicies = 57 : : tk::cartesian_product< dg::CompFlowPhysics, CompFlowProblems >; 58 : : // Register PDEs for all combinations of policies 59 : : brigand::for_each< DGCompFlowPolicies >( 60 [ + - ]: 2271 : registerDG< dg::CompFlow >( df, dgt, ctr::PDEType::COMPFLOW ) ); 61 : 2271 : } 62 : : 63 : : std::vector< std::pair< std::string, std::string > > 64 : 64 : infoCompFlow( 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::compflow; 72 : : using tk::parameter; 73 : : using tk::parameters; 74 : : 75 [ + - ]: 64 : auto c = ++cnt[ ctr::PDEType::COMPFLOW ]; // count eqs 76 : 64 : --c; // used to index vectors starting with 0 77 : : 78 : 64 : std::vector< std::pair< std::string, std::string > > nfo; 79 : : 80 [ + - ][ + - ]: 64 : nfo.emplace_back( ctr::PDE().name( ctr::PDEType::COMPFLOW ), "" ); [ + - ] 81 : : 82 [ + - ]: 128 : nfo.emplace_back( "physics", ctr::Physics().name( 83 [ + - ][ + - ]: 64 : g_inputdeck.get< eq, tag::physics >() ) ); 84 : : 85 [ + - ]: 128 : nfo.emplace_back( "problem", ctr::Problem().name( 86 [ + - ][ + - ]: 64 : g_inputdeck.get< eq, tag::problem >() ) ); 87 : : 88 : 64 : auto ncomp = g_inputdeck.get< tag::ncomp >(); 89 [ + - ][ + - ]: 64 : nfo.emplace_back( "number of components", parameter( ncomp ) ); 90 : : 91 : 64 : const auto scheme = g_inputdeck.get< tag::scheme >(); 92 [ + + ][ + + ]: 64 : if (scheme != ctr::SchemeType::ALECG && scheme != ctr::SchemeType::OversetFE) 93 [ + - ]: 64 : nfo.emplace_back( "flux", ctr::Flux().name( 94 [ + - ][ + - ]: 32 : g_inputdeck.get< tag::flux >() ) ); 95 : : 96 : : // ICs 97 : : 98 : 64 : const auto& ic = g_inputdeck.get< tag::ic >(); 99 : : 100 : 64 : const auto& icbox = ic.get< tag::box >(); 101 [ + + ]: 64 : if (!icbox.empty()) { 102 : 3 : std::size_t bcnt = 0; 103 [ + + ]: 7 : for (const auto& b : icbox) { // for all boxes configured for this eq 104 : : std::vector< tk::real > box 105 : 4 : { b.get< tag::xmin >(), b.get< tag::xmax >(), 106 : 12 : b.get< tag::ymin >(), b.get< tag::ymax >(), 107 [ + - ]: 8 : b.get< tag::zmin >(), b.get< tag::zmax >() }; 108 : : 109 [ + - ][ + - ]: 8 : std::string boxname = "IC box " + parameter(bcnt); 110 [ + - ][ + - ]: 4 : nfo.emplace_back( boxname, parameters( box ) ); 111 : : 112 [ + - ]: 8 : nfo.emplace_back( boxname + " orientation", 113 [ + - ][ + - ]: 12 : parameters(b.get< tag::orientation >()) ); 114 : : 115 : 4 : const auto& initiate = b.get< tag::initiate >(); 116 [ + - ]: 4 : auto opt = ctr::Initiate(); 117 [ + - ][ + - ]: 4 : nfo.emplace_back( boxname + ' ' + opt.group(), opt.name(initiate) ); [ + - ][ + - ] 118 : : 119 : 4 : ++bcnt; 120 : : } 121 : : } 122 : : 123 : 64 : const auto& icblock = ic.get< tag::meshblock >(); 124 [ - + ]: 64 : for (const auto& b : icblock) { // for all blocks configured for eq 125 : : std::string blockname = "IC mesh block " + 126 [ - - ][ - - ]: 0 : parameter(b.get< tag::blockid >()); 127 : : 128 : 0 : const auto& initiate = b.get< tag::initiate >(); 129 [ - - ]: 0 : auto opt = ctr::Initiate(); 130 [ - - ][ - - ]: 0 : nfo.emplace_back( blockname + ' ' + opt.group(), opt.name(initiate) ); [ - - ][ - - ] 131 : : } 132 : : 133 : : // BCs 134 : : 135 : 64 : const auto& bc = g_inputdeck.get< tag::bc >(); 136 [ + + ]: 130 : for (const auto& ib : bc) { 137 : 66 : const auto& stag = ib.get< tag::stag_point >(); 138 : 66 : const auto& radius = ib.get< tag::radius >(); 139 [ + + ]: 66 : if (!stag.empty()) { 140 [ + - ][ + - ]: 1 : nfo.emplace_back( "Stagnation point(s)", parameters( stag ) ); 141 [ + - ][ + - ]: 1 : nfo.emplace_back( "Stagnation point(s) radii", parameter( radius ) ); 142 : : } 143 : : 144 : 66 : const auto& fs = ib.get< tag::farfield >(); 145 [ + + ]: 66 : if (!fs.empty()) 146 [ + - ][ + - ]: 9 : nfo.emplace_back( "Farfield BC sideset(s)", parameters( fs ) ); 147 : : 148 : 66 : const auto& sym = ib.get< tag::symmetry >(); 149 [ + + ]: 66 : if (!sym.empty()) 150 [ + - ][ + - ]: 33 : nfo.emplace_back( "Symmetry BC sideset(s)", parameters( sym ) ); 151 : : 152 : 66 : const auto& dir = ib.get< tag::dirichlet >(); 153 [ + + ]: 66 : if (!dir.empty()) 154 [ + - ][ + - ]: 36 : nfo.emplace_back( "Dirichlet BC sideset(s)", parameters( dir ) ); 155 : : 156 : 66 : const auto& timedep = ib.get< tag::timedep >(); 157 [ + + ]: 66 : if (!timedep.empty()) { 158 [ + + ]: 4 : for (const auto& bndry : timedep) { 159 : : nfo.emplace_back( "Time dependent BC sideset(s)", 160 [ + - ][ + - ]: 2 : parameters(bndry.get< tag::sideset >()) ); 161 : : } 162 : : } 163 : : } 164 : : 165 : 128 : return nfo; 166 : : } 167 : : 168 : : } // inciter::