Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/PDE/MultiMat/Problem/ShockHeBubble.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 multi-material flow equations
9 : : \details This file defines a Problem policy class for the multi-material
10 : : compressible flow equations, defined in PDE/MultiMat/DGMultiMat.hpp. See
11 : : PDE/MultiMat/Problem.hpp for general requirements on Problem policy classes
12 : : for MultiMat.
13 : : */
14 : : // *****************************************************************************
15 : :
16 : : #include "ShockHeBubble.hpp"
17 : : #include "Inciter/InputDeck/InputDeck.hpp"
18 : : #include "EoS/EoS.hpp"
19 : : #include "MultiMat/MultiMatIndexing.hpp"
20 : :
21 : : namespace inciter {
22 : :
23 : : extern ctr::InputDeck g_inputdeck;
24 : :
25 : : } // ::inciter
26 : :
27 : : using inciter::MultiMatProblemShockHeBubble;
28 : :
29 : : tk::InitializeFn::result_type
30 : 0 : MultiMatProblemShockHeBubble::initialize( ncomp_t system,
31 : : ncomp_t ncomp,
32 : : tk::real x,
33 : : tk::real y,
34 : : tk::real z,
35 : : tk::real )
36 : : // *****************************************************************************
37 : : //! Evaluate analytical solution at (x,y,z,t) for all components
38 : : //! \param[in] system Equation system index, i.e., which multi-material
39 : : //! flow equation system we operate on among the systems of PDEs
40 : : //! \param[in] ncomp Number of scalar components in this PDE system
41 : : //! \param[in] x X coordinate where to evaluate the solution
42 : : //! \param[in] y Y coordinate where to evaluate the solution
43 : : //! \param[in] z Z coordinate where to evaluate the solution
44 : : //! \return Values of all components evaluated at (x)
45 : : //! \note The function signature must follow tk::InitializeFn
46 : : //! \details This function only initializes the shock He-bubble interaction
47 : : //! problem, but does not actually give the analytical solution at time
48 : : //! greater than 0.
49 : : // *****************************************************************************
50 : : {
51 : : // see also Control/Inciter/InputDeck/Grammar.hpp
52 : : Assert( ncomp == 9, "Number of scalar components must be 9" );
53 : :
54 : : auto nmat =
55 : 0 : g_inputdeck.get< tag::param, eq, tag::nmat >()[system];
56 : :
57 [ - - ][ - - ]: 0 : std::vector< tk::real > s(ncomp, 0.0), r(nmat, 0.0);
58 : : tk::real p, u, v, w, temp;
59 : : auto alphamin = 1.0e-12;
60 : :
61 : : // pre-shock state
62 : 0 : s[volfracIdx(nmat, 0)] = alphamin;
63 : 0 : s[volfracIdx(nmat, 1)] = 1.0-alphamin;
64 : : p = 1.0e5;
65 : : u = 0.0;
66 : : v = 0.0;
67 : : w = 0.0;
68 : : temp = 248.88;
69 : :
70 : : // post-shock state
71 [ - - ]: 0 : if (x >= 0.2125) {
72 : : // volume-fraction
73 : : s[volfracIdx(nmat, 0)] = alphamin;
74 : : s[volfracIdx(nmat, 1)] = 1.0-alphamin;
75 : : // pressure
76 : : p = 1.5698e5;
77 : : // velocity
78 : : u = -113.5;
79 : : // temperature
80 : : temp = 283.86;
81 : : }
82 : :
83 : : // bubble
84 : 0 : auto radb = std::sqrt((x-0.1725)*(x-0.1725) + y*y + z*z);
85 [ - - ]: 0 : if (radb <= 0.025) {
86 : : // volume-fraction
87 : 0 : s[volfracIdx(nmat, 0)] = 1.0-alphamin;
88 : 0 : s[volfracIdx(nmat, 1)] = alphamin;
89 : : }
90 : :
91 : : auto rb(0.0);
92 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k)
93 : : {
94 : : // densities
95 : 0 : r[k] = eos_density< eq >( system, p, temp, k );
96 : : // partial density
97 : 0 : s[densityIdx(nmat, k)] = s[volfracIdx(nmat, k)]*r[k];
98 : : // total specific energy
99 : 0 : s[energyIdx(nmat, k)] = s[volfracIdx(nmat, k)]*
100 : 0 : eos_totalenergy< eq >( system, r[k], u, v, w, p, k );
101 : 0 : rb += s[densityIdx(nmat, k)];
102 : : }
103 : :
104 [ - - ]: 0 : s[momentumIdx(nmat, 0)] = rb * u;
105 : 0 : s[momentumIdx(nmat, 1)] = rb * v;
106 [ - - ]: 0 : s[momentumIdx(nmat, 2)] = rb * w;
107 : :
108 : 0 : return s;
109 : : }
110 : :
111 : : std::vector< std::string >
112 : 0 : MultiMatProblemShockHeBubble::names( ncomp_t )
113 : : // *****************************************************************************
114 : : // Return names of integral variables to be output to diagnostics file
115 : : //! \return Vector of strings labelling integral variables output
116 : : // *****************************************************************************
117 : : {
118 [ - - ][ - - ]: 0 : return { "r", "ru", "rv", "rw", "re" };
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ - - ]
119 : : }
|