Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/PDE/CompFlow/Problem/RayleighTaylor.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/CompFlow/CompFlow.h. See PDE/CompFlow/Problem.h
11 : : for general requirements on Problem policy classes for CompFlow.
12 : : */
13 : : // *****************************************************************************
14 : :
15 : : #include "RayleighTaylor.hpp"
16 : : #include "Inciter/InputDeck/InputDeck.hpp"
17 : : #include "FieldOutput.hpp"
18 : :
19 : : namespace inciter {
20 : :
21 : : extern ctr::InputDeck g_inputdeck;
22 : :
23 : : } // ::inciter
24 : :
25 : : using inciter::CompFlowProblemRayleighTaylor;
26 : :
27 : : tk::InitializeFn::result_type
28 : 603642 : CompFlowProblemRayleighTaylor::initialize( ncomp_t system,
29 : : ncomp_t,
30 : : tk::real x,
31 : : tk::real y,
32 : : tk::real z,
33 : : tk::real t )
34 : : // *****************************************************************************
35 : : //! Evaluate analytical solution at (x,y,z,t) for all components
36 : : //! \param[in] system Equation system index, i.e., which compressible
37 : : //! flow equation system we operate on among the systems of PDEs
38 : : //! \param[in] x X coordinate where to evaluate the solution
39 : : //! \param[in] y Y coordinate where to evaluate the solution
40 : : //! \param[in] z Z coordinate where to evaluate the solution
41 : : //! \param[in] t Time where to evaluate the solution
42 : : //! \return Values of all components evaluated at (x,y,z,t)
43 : : //! \note The function signature must follow tk::InitializeFn
44 : : // *****************************************************************************
45 : : {
46 : : using tag::param; using std::sin; using std::cos;
47 : :
48 : : // manufactured solution parameters
49 : 603642 : const auto a = g_inputdeck.get< param, eq, tag::alpha >()[system];
50 : 603642 : const auto bx = g_inputdeck.get< param, eq, tag::betax >()[system];
51 : 603642 : const auto by = g_inputdeck.get< param, eq, tag::betay >()[system];
52 : 603642 : const auto bz = g_inputdeck.get< param, eq, tag::betaz >()[system];
53 : 603642 : const auto p0 = g_inputdeck.get< param, eq, tag::p0 >()[system];
54 : 603642 : const auto r0 = g_inputdeck.get< param, eq, tag::r0 >()[system];
55 : 603642 : const auto k = g_inputdeck.get< param, eq, tag::kappa >()[system];
56 : : // spatial component of density and pressure fields
57 : 603642 : const tk::real gx = bx*x*x + by*y*y + bz*z*z;
58 : : // density
59 : 603642 : const tk::real r = r0 - gx;
60 : : // pressure
61 : 603642 : const tk::real p = p0 + a*gx;
62 : : // velocity
63 : 603642 : const tk::real ft = cos(k*M_PI*t);
64 : 603642 : const tk::real u = ft*z*sin(M_PI*x);
65 : 603642 : const tk::real v = ft*z*cos(M_PI*y);
66 : 603642 : const tk::real w = ft*(-0.5*M_PI*z*z*(cos(M_PI*x)-sin(M_PI*y)));
67 : : // total specific energy
68 : 603642 : const tk::real rE = eos_totalenergy< eq >( system, r, u, v, w, p );
69 : :
70 : 603642 : return {{ r, r*u, r*v, r*w, rE }};
71 : : }
72 : :
73 : : tk::InitializeFn::result_type
74 : 9571 : CompFlowProblemRayleighTaylor::analyticSolution( ncomp_t system,
75 : : ncomp_t,
76 : : tk::real x,
77 : : tk::real y,
78 : : tk::real z,
79 : : tk::real t )
80 : : // *****************************************************************************
81 : : //! Evaluate analytical solution at (x,y,z,t) for all components
82 : : //! \param[in] system Equation system index, i.e., which compressible
83 : : //! flow equation system we operate on among the systems of PDEs
84 : : //! \param[in] x X coordinate where to evaluate the solution
85 : : //! \param[in] y Y coordinate where to evaluate the solution
86 : : //! \param[in] z Z coordinate where to evaluate the solution
87 : : //! \param[in] t Time where to evaluate the solution
88 : : //! \return Values of all components evaluated at (x,y,z,t)
89 : : //! \note The function signature must follow tk::InitializeFn
90 : : // *****************************************************************************
91 : : {
92 : : using tag::param; using std::sin; using std::cos;
93 : :
94 : : // manufactured solution parameters
95 : 9571 : auto a = g_inputdeck.get< param, eq, tag::alpha >()[system];
96 : 9571 : auto bx = g_inputdeck.get< param, eq, tag::betax >()[system];
97 : 9571 : auto by = g_inputdeck.get< param, eq, tag::betay >()[system];
98 : 9571 : auto bz = g_inputdeck.get< param, eq, tag::betaz >()[system];
99 : 9571 : auto p0 = g_inputdeck.get< param, eq, tag::p0 >()[system];
100 : 9571 : auto r0 = g_inputdeck.get< param, eq, tag::r0 >()[system];
101 : 9571 : auto k = g_inputdeck.get< param, eq, tag::kappa >()[system];
102 : : // spatial component of density and pressure fields
103 : 9571 : auto gx = bx*x*x + by*y*y + bz*z*z;
104 : : // density
105 : 9571 : auto r = r0 - gx;
106 : : // pressure
107 : 9571 : auto p = p0 + a*gx;
108 : : // velocity
109 : 9571 : auto ft = cos(k*M_PI*t);
110 : 9571 : auto u = ft*z*sin(M_PI*x);
111 : 9571 : auto v = ft*z*cos(M_PI*y);
112 : 9571 : auto w = ft*(-0.5*M_PI*z*z*(cos(M_PI*x)-sin(M_PI*y)));
113 : : // total specific energy
114 : 9571 : auto E = eos_totalenergy< eq >( system, r, u, v, w, p ) / r;
115 : :
116 : 9571 : return {{ r, u, v, w, E, p }};
117 : : }
118 : :
119 : : std::vector< std::string >
120 [ + - ]: 85 : CompFlowProblemRayleighTaylor::analyticFieldNames( ncomp_t ) const
121 : : // *****************************************************************************
122 : : // Return analytic field names to be output to file
123 : : //! \return Vector of strings labelling fields output in file
124 : : // *****************************************************************************
125 : : {
126 : : std::vector< std::string > n;
127 : :
128 [ + - ]: 85 : n.push_back( "density_analytical" );
129 [ + - ]: 85 : n.push_back( "x-velocity_analytical" );
130 [ + - ]: 85 : n.push_back( "y-velocity_analytical" );
131 [ + - ]: 85 : n.push_back( "z-velocity_analytical" );
132 [ + - ]: 85 : n.push_back( "specific_total_energy_analytical" );
133 [ + - ]: 85 : n.push_back( "pressure_analytical" );
134 : :
135 : 85 : return n;
136 : : }
137 : :
138 : : std::vector< std::string >
139 : 4 : CompFlowProblemRayleighTaylor::names( ncomp_t /*ncomp*/ ) const
140 : : // *****************************************************************************
141 : : // Return names of integral variables to be output to diagnostics file
142 : : //! \return Vector of strings labelling integral variables output
143 : : // *****************************************************************************
144 : : {
145 [ + - ][ + - ]: 24 : return { "r", "ru", "rv", "rw", "re" };
[ + - ][ + - ]
[ + - ][ - + ]
[ + + ][ - + ]
[ - - ][ - - ]
146 : : }
|