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 : : #include "MultiSpecies/Mixture/Mixture.hpp" 22 : : 23 : : namespace inciter { 24 : : 25 : : extern ctr::InputDeck g_inputdeck; 26 : : 27 : : } // ::inciter 28 : : 29 : : using inciter::MultiSpeciesProblemUserDefined; 30 : : 31 : : tk::InitializeFn::result_type 32 : 238746 : MultiSpeciesProblemUserDefined::initialize( ncomp_t ncomp, 33 : : const std::vector< EOS >& mat_blk, 34 : : tk::real, 35 : : tk::real, 36 : : tk::real, 37 : : tk::real ) 38 : : // ***************************************************************************** 39 : : //! Set initial conditions 40 : : //! \param[in] ncomp Number of scalar components in this PDE system 41 : : //! \return Values of all components 42 : : //! \note The function signature must follow tk::InitializeFn 43 : : // ***************************************************************************** 44 : : { 45 [ + - ]: 238746 : tk::InitializeFn::result_type s( ncomp, 0.0 ); 46 : : 47 : 238746 : auto nspec = g_inputdeck.get< eq, tag::nspec >(); 48 : : 49 : : // Set background ICs 50 : 238746 : const auto& ic = g_inputdeck.get< tag::ic >(); 51 : 238746 : const auto& bgmassfrac = ic.get< tag::mass_fractions >(); 52 : 238746 : const auto& bgvelic = ic.get< tag::velocity >(); 53 : 238746 : const auto& bgpreic = ic.get< tag::pressure >(); 54 : 238746 : const auto& bgtempic = ic.get< tag::temperature >(); 55 : : 56 [ - + ][ - - ]: 238746 : if (bgtempic < 1e-12) Throw( "No background temperature IC" ); [ - - ][ - - ] 57 [ - + ][ - - ]: 238746 : if (bgpreic < 1e-12) Throw( "No background pressure IC" ); [ - - ][ - - ] 58 : : 59 : 238746 : auto alphamin = 1.0e-12; 60 : : 61 : : // initialize background species states 62 [ + - ]: 477492 : auto Ys = bgmassfrac; 63 : 238746 : tk::real total_al(0.0); 64 [ + + ]: 595740 : for (std::size_t k=0; k<nspec; ++k) { 65 : 356994 : Ys[k] = std::max(Ys[k], alphamin); 66 : 356994 : total_al += Ys[k]; 67 : : } 68 [ + + ]: 595740 : for (std::size_t k=0; k<nspec; ++k) Ys[k] /= total_al; 69 : : 70 : 238746 : tk::real u = bgvelic[0]; 71 : 238746 : tk::real v = bgvelic[1]; 72 : 238746 : tk::real w = bgvelic[2]; 73 : : 74 : : // Initialize mixture 75 [ + - ]: 477492 : Mixture mix(nspec, Ys, bgpreic, bgtempic, mat_blk); 76 : : 77 : 238746 : auto rb = mix.get_mix_density(); 78 [ + + ]: 595740 : for (std::size_t k=0; k<nspec; ++k) { 79 : : // partial density 80 : 356994 : s[multispecies::densityIdx(nspec,k)] = Ys[k] * rb; 81 : : } 82 : : 83 : : // total specific energy 84 [ + - ]: 238746 : s[multispecies::energyIdx(nspec,0)] = mix.totalenergy(rb, 85 : : u, v, w, bgtempic, mat_blk); 86 : : 87 : : // bulk momentum 88 : 238746 : s[multispecies::momentumIdx(nspec,0)] = rb * u; 89 : 238746 : s[multispecies::momentumIdx(nspec,1)] = rb * v; 90 : 238746 : s[multispecies::momentumIdx(nspec,2)] = rb * w; 91 : : 92 [ + - ][ - + ]: 238746 : if (bgpreic< 1e-12 || bgtempic< 1e-12) 93 [ - - ][ - - ]: 0 : Throw("User must specify background pressure and temperature in IC."); [ - - ] 94 : : 95 : 477492 : return s; 96 : : }