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 : : const auto& ic = g_inputdeck.get< tag::ic >();
50 : : const auto& bgmassfrac = ic.get< tag::mass_fractions >();
51 : : const auto& bgvelic = ic.get< tag::velocity >();
52 : : const auto& bgpreic = ic.get< tag::pressure >();
53 : : 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 : : 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 : : }
|