Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/PDE/MultiMat/Problem/UnderwaterEx.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 "UnderwaterEx.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::MultiMatProblemUnderwaterEx;
28 : :
29 : : tk::InitializeFn::result_type
30 : 0 : MultiMatProblemUnderwaterEx::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 underwater explosion problem,
47 : : //! but does not actually give the analytical solution at time greater than 0.
48 : : // *****************************************************************************
49 : : {
50 : : // see also Control/Inciter/InputDeck/Grammar.hpp
51 [ - - ][ - - ]: 0 : Assert( ncomp == 12, "Number of scalar components must be 12" );
[ - - ][ - - ]
52 : :
53 : : auto nmat =
54 : 0 : g_inputdeck.get< tag::param, eq, tag::nmat >()[system];
55 : :
56 [ - - ][ - - ]: 0 : std::vector< tk::real > s(ncomp, 0.0), r(nmat, 0.0);
57 : : tk::real p, u, v, w, temp;
58 : 0 : auto alphamin = 1.0e-12;
59 : :
60 : : // velocity
61 : 0 : u = 0.0;
62 : 0 : v = 0.0;
63 : 0 : w = 0.0;
64 : :
65 : : // background state (air)
66 : : // volume-fraction
67 : 0 : s[volfracIdx(nmat, 0)] = alphamin;
68 : 0 : s[volfracIdx(nmat, 1)] = alphamin;
69 : 0 : s[volfracIdx(nmat, 2)] = 1.0-2.0*alphamin;
70 : : // pressure
71 : 0 : p = 1.01325e5;
72 : : // temperature
73 : 0 : temp = 288.2;
74 : :
75 : 0 : auto radb = std::sqrt((y-1.0)*(y-1.0) + x*x + z*z);
76 : :
77 : : // high-pressure gas bubble
78 [ - - ]: 0 : if (radb <= 0.3) {
79 : : // volume-fraction
80 : 0 : s[volfracIdx(nmat, 0)] = alphamin;
81 : 0 : s[volfracIdx(nmat, 1)] = 1.0-2.0*alphamin;
82 : 0 : s[volfracIdx(nmat, 2)] = alphamin;
83 : : // pressure
84 : 0 : p = 1.0e9;
85 : : // temperature
86 : 0 : temp = 2000.0;
87 : : }
88 : : // water level
89 [ - - ]: 0 : else if (y <= 1.5) {
90 : : // volume-fraction
91 : 0 : s[volfracIdx(nmat, 0)] = 1.0-2.0*alphamin;
92 : 0 : s[volfracIdx(nmat, 1)] = alphamin;
93 : 0 : s[volfracIdx(nmat, 2)] = alphamin;
94 : : // temperature
95 : 0 : temp = 185.52;
96 : : }
97 : :
98 : 0 : auto rb(0.0);
99 [ - - ]: 0 : for (std::size_t k=0; k<nmat; ++k)
100 : : {
101 : : // densities
102 [ - - ]: 0 : r[k] = eos_density< eq >( system, p, temp, k );
103 : : // partial density
104 : 0 : s[densityIdx(nmat, k)] = s[volfracIdx(nmat, k)]*r[k];
105 : : // total specific energy
106 : 0 : s[energyIdx(nmat, k)] = s[volfracIdx(nmat, k)]*
107 [ - - ]: 0 : eos_totalenergy< eq >( system, r[k], u, v, w, p, k );
108 : 0 : rb += s[densityIdx(nmat, k)];
109 : : }
110 : :
111 : 0 : s[momentumIdx(nmat, 0)] = rb * u;
112 : 0 : s[momentumIdx(nmat, 1)] = rb * v;
113 : 0 : s[momentumIdx(nmat, 2)] = rb * w;
114 : :
115 : 0 : return s;
116 : : }
117 : :
118 : : std::vector< std::string >
119 : 0 : MultiMatProblemUnderwaterEx::names( ncomp_t )
120 : : // *****************************************************************************
121 : : // Return names of integral variables to be output to diagnostics file
122 : : //! \return Vector of strings labelling integral variables output
123 : : // *****************************************************************************
124 : : {
125 [ - - ][ - - ]: 0 : return { "r", "ru", "rv", "rw", "re" };
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ - - ]
126 : : }
|