Branch data Line data Source code
1 : : // ***************************************************************************** 2 : : /*! 3 : : \file src/PDE/MultiSpecies/Problem/UserDefined.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 Problem configuration for the compressible flow equations 9 : : \details This file defines a Problem policy class for the compressible flow 10 : : equations, defined in PDE/MultiSpecies/MultiSpecies.h. See PDE/MultiSpecies/Problem.h 11 : : for general requirements on Problem policy classes for MultiSpecies. 12 : : */ 13 : : // ***************************************************************************** 14 : : 15 : : #include <limits> 16 : : 17 : : #include "UserDefined.hpp" 18 : : #include "Inciter/InputDeck/InputDeck.hpp" 19 : : #include "FieldOutput.hpp" 20 : : #include "MultiSpecies/MultiSpeciesIndexing.hpp" 21 : : 22 : : namespace inciter { 23 : : 24 : : extern ctr::InputDeck g_inputdeck; 25 : : 26 : : } // ::inciter 27 : : 28 : : using inciter::MultiSpeciesProblemUserDefined; 29 : : 30 : : tk::InitializeFn::result_type 31 : 0 : MultiSpeciesProblemUserDefined::initialize( ncomp_t ncomp, 32 : : const std::vector< EOS >& mat_blk, 33 : : tk::real, 34 : : tk::real, 35 : : tk::real, 36 : : tk::real ) 37 : : // ***************************************************************************** 38 : : //! Set initial conditions 39 : : //! \param[in] ncomp Number of scalar components in this PDE system 40 : : //! \return Values of all components 41 : : //! \note The function signature must follow tk::InitializeFn 42 : : // ***************************************************************************** 43 : : { 44 [ - - ]: 0 : tk::InitializeFn::result_type s( ncomp, 0.0 ); 45 : : 46 : 0 : auto nspec = g_inputdeck.get< eq, tag::nspec >(); 47 : : 48 : : // Set background ICs 49 : 0 : const auto& ic = g_inputdeck.get< tag::ic >(); 50 : 0 : const auto& bgmassfrac = ic.get< tag::mass_fractions >(); 51 : 0 : const auto& bgvelic = ic.get< tag::velocity >(); 52 : 0 : const auto& bgpreic = ic.get< tag::pressure >(); 53 : 0 : const auto& bgtempic = ic.get< tag::temperature >(); 54 : : 55 [ - - ][ - - ]: 0 : if (bgtempic < 1e-12) Throw( "No background temperature IC" ); [ - - ][ - - ] 56 [ - - ][ - - ]: 0 : if (bgpreic < 1e-12) Throw( "No background pressure IC" ); [ - - ][ - - ] 57 : : 58 : 0 : auto alphamin = 1.0e-12; 59 : : 60 : : // initialize background species states 61 [ - - ]: 0 : auto alphas = bgmassfrac; 62 : 0 : tk::real total_al(0.0); 63 [ - - ]: 0 : for (std::size_t k=0; k<nspec; ++k) { 64 : 0 : alphas[k] = std::max(alphas[k], alphamin); 65 : 0 : total_al += alphas[k]; 66 : : } 67 [ - - ]: 0 : for (std::size_t k=0; k<nspec; ++k) alphas[k] /= total_al; 68 : : 69 : 0 : tk::real u = bgvelic[0]; 70 : 0 : tk::real v = bgvelic[1]; 71 : 0 : tk::real w = bgvelic[2]; 72 : : 73 : 0 : auto rb = 0.0; 74 [ - - ]: 0 : for (std::size_t k=0; k<nspec; ++k) { 75 : : // density 76 [ - - ]: 0 : auto rhok = mat_blk[0].compute< EOS::density >(bgpreic, bgtempic); 77 : : // partial density 78 : 0 : s[multispecies::densityIdx(nspec,k)] = alphas[k] * rhok; 79 : : // bulk density 80 : 0 : rb += s[multispecies::densityIdx(nspec,k)]; 81 : : } 82 : : 83 : : // total specific energy 84 : 0 : s[multispecies::energyIdx(nspec,0)] = 85 [ - - ]: 0 : mat_blk[0].compute< EOS::totalenergy >(rb, u, v, w, bgpreic); 86 : : 87 : : // bulk momentum 88 : 0 : s[multispecies::momentumIdx(nspec,0)] = rb * u; 89 : 0 : s[multispecies::momentumIdx(nspec,1)] = rb * v; 90 : 0 : s[multispecies::momentumIdx(nspec,2)] = rb * w; 91 : : 92 [ - - ][ - - ]: 0 : if (bgpreic< 1e-12 || bgtempic< 1e-12) 93 [ - - ][ - - ]: 0 : Throw("User must specify background pressure and temperature in IC."); [ - - ] 94 : : 95 : 0 : return s; 96 : : }