Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/PDE/MultiMat/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/MultiMat/MultiMat.h. See PDE/MultiMat/Problem.h
11 : : for general requirements on Problem policy classes for MultiMat.
12 : : */
13 : : // *****************************************************************************
14 : :
15 : : #include <limits>
16 : :
17 : : #include "UserDefined.hpp"
18 : : #include "Inciter/InputDeck/InputDeck.hpp"
19 : : #include "FieldOutput.hpp"
20 : : #include "EoS/EoS.hpp"
21 : : #include "MultiMat/MultiMatIndexing.hpp"
22 : :
23 : : namespace inciter {
24 : :
25 : : extern ctr::InputDeck g_inputdeck;
26 : :
27 : : } // ::inciter
28 : :
29 : : using inciter::MultiMatProblemUserDefined;
30 : :
31 : : tk::InitializeFn::result_type
32 : 0 : MultiMatProblemUserDefined::initialize( ncomp_t system,
33 : : ncomp_t ncomp,
34 : : tk::real,
35 : : tk::real,
36 : : tk::real,
37 : : tk::real )
38 : : // *****************************************************************************
39 : : //! Set initial conditions
40 : : //! \param[in] system Equation system index, i.e., which multi-material
41 : : //! flow equation system we operate on among the systems of PDEs
42 : : //! \param[in] ncomp Number of scalar components in this PDE system
43 : : //! \return Values of all components
44 : : //! \note The function signature must follow tk::InitializeFn
45 : : // *****************************************************************************
46 : : {
47 : 0 : tk::InitializeFn::result_type s( ncomp, 0.0 );
48 : :
49 : : auto nmat =
50 : 0 : g_inputdeck.get< tag::param, eq, tag::nmat >()[system];
51 : :
52 : : // Set background ICs
53 : : const auto& ic = g_inputdeck.get< tag::param, eq, tag::ic >();
54 : : const auto& bgmatid = ic.get< tag::materialid >();
55 : : const auto& bgvelic = ic.get< tag::velocity >();
56 : : const auto& bgpreic = ic.get< tag::pressure >();
57 : : const auto& bgtempic = ic.get< tag::temperature >();
58 : :
59 : : Assert( bgtempic.size() > system, "No background temperature IC" );
60 : : Assert( bgpreic.size() > 3*system, "No background pressure IC" );
61 : :
62 : : auto alphamin = 1.0e-12;
63 : :
64 : : // initialize background material states
65 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k) {
66 [ - - ]: 0 : if (k == bgmatid.at(system).at(0)-1) {
67 : 0 : s[volfracIdx(nmat,k)] = 1.0 - (static_cast< tk::real >(nmat-1))*alphamin;
68 : : }
69 : : else {
70 : 0 : s[volfracIdx(nmat,k)] = alphamin;
71 : : }
72 : : }
73 : :
74 : 0 : tk::real u = bgvelic[system][0];
75 : 0 : tk::real v = bgvelic[system][1];
76 : 0 : tk::real w = bgvelic[system][2];
77 : :
78 : : auto rb = 0.0;
79 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k) {
80 : : // density
81 : 0 : auto rhok = eos_density< eq >(system, bgpreic[system][0],
82 : 0 : bgtempic[system][0], k);
83 : : // partial density
84 : 0 : s[densityIdx(nmat,k)] = s[volfracIdx(nmat,k)] * rhok;
85 : : // total specific energy
86 : 0 : s[energyIdx(nmat,k)] = s[volfracIdx(nmat,k)] *
87 : 0 : eos_totalenergy< eq >(system, rhok, u, v, w, bgpreic[system][0], k);
88 : : // bulk density
89 : 0 : rb += s[densityIdx(nmat,k)];
90 : : }
91 : :
92 : : // bulk momentum
93 [ - - ]: 0 : s[momentumIdx(nmat,0)] = rb * u;
94 : 0 : s[momentumIdx(nmat,1)] = rb * v;
95 : 0 : s[momentumIdx(nmat,2)] = rb * w;
96 : :
97 [ - - ][ - - ]: 0 : if (bgpreic[system].empty() || bgtempic[system].empty())
98 [ - - ][ - - ]: 0 : Throw("User must specify background pressure and temperature in IC.");
[ - - ][ - - ]
[ - - ][ - - ]
99 : :
100 : 0 : return s;
101 : : }
102 : :
103 : : std::vector< std::string >
104 : 0 : MultiMatProblemUserDefined::names( ncomp_t )
105 : : // *****************************************************************************
106 : : // Return names of integral variables to be output to diagnostics file
107 : : //! \return Vector of strings labelling integral variables output
108 : : // *****************************************************************************
109 : : {
110 [ - - ][ - - ]: 0 : return { "r", "ru", "rv", "rw", "re" };
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ - - ]
111 : : }
|