Branch data Line data Source code
1 : : // *****************************************************************************
2 : : /*!
3 : : \file src/PDE/EoS/EOS.hpp
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 Polymorphic variant-style implementation for equations of state,
9 : : where children implement specific EOS functions.
10 : : */
11 : : // *****************************************************************************
12 : : #ifndef EOS_h
13 : : #define EOS_h
14 : :
15 : : #include <variant>
16 : :
17 : : #include "PUPUtil.hpp"
18 : : #include "Inciter/Options/Material.hpp"
19 : : #include "EoS/StiffenedGas.hpp"
20 : : #include "EoS/JWL.hpp"
21 : : #include "EoS/SmallShearSolid.hpp"
22 : : #include "EoS/GodunovRomenskiAluminum.hpp"
23 : :
24 : : namespace inciter {
25 : :
26 : : //! Equation types
27 : : enum class EqType : uint8_t { compflow
28 : : , multimat
29 : : , multispecies
30 : : };
31 : :
32 : : //! Base class for generic forwarding interface to eos types
33 : : class EOS {
34 : :
35 : : private:
36 : : //! Variant type listing all eos types modeling the same concept
37 : : std::variant< StiffenedGas
38 : : , JWL
39 : : , SmallShearSolid
40 : : , GodunovRomenskiAluminum
41 : : > m_material;
42 : :
43 : : public:
44 : : //! Empty constructor for Charm++
45 : : explicit EOS() {}
46 : :
47 : : //! Constructor
48 : : explicit EOS( ctr::MaterialType mattype, EqType eq, std::size_t k );
49 : :
50 : : //! Entry method tags for specific EOS classes to use with compute()
51 : : struct density {};
52 : : struct pressure {};
53 : : struct soundspeed {};
54 : : struct shearspeed {};
55 : : struct totalenergy {};
56 : : struct temperature {};
57 : : struct min_eff_pressure {};
58 : : struct refDensity {};
59 : : struct refPressure {};
60 : : struct rho0 {};
61 : : //! Call EOS function
62 : : //! \tparam Fn Function tag identifying the function to call
63 : : //! \tparam Args Types of arguments to pass to function
64 : : //! \param[in] args Arguments to member function to be called
65 : : //! \details This function issues a call to a member function of the
66 : : //! EOS vector and is thus equivalent to mat_blk[imat].Fn(...).
67 : : template< typename Fn, typename... Args >
68 : 452479043 : tk::real compute( Args&&... args ) const {
69 : 904958086 : return std::visit( [&]( const auto& m )-> tk::real {
70 : : if constexpr( std::is_same_v< Fn, density > )
71 : 2169630 : return m.density( std::forward< Args >( args )... );
72 : :
73 : : else if constexpr( std::is_same_v< Fn, pressure > )
74 [ - - ][ - - ]: 170227687 : return m.pressure( std::forward< Args >( args )... );
[ - - ][ + - ]
[ - - ][ - - ]
[ - - ][ + - ]
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ + - ]
[ - - ][ - - ]
[ - - ][ + - ]
75 : :
76 : : else if constexpr( std::is_same_v< Fn, soundspeed > )
77 [ - - ][ - - ]: 168422731 : return m.soundspeed( std::forward< Args >( args )... );
[ - - ][ + - ]
[ - - ][ - - ]
[ - - ][ + - ]
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ - - ]
[ - - ][ + - ]
[ - - ][ - - ]
[ - - ][ + - ]
78 : :
79 : : else if constexpr( std::is_same_v< Fn, shearspeed > )
80 : : return m.shearspeed( std::forward< Args >( args )... );
81 : :
82 : : else if constexpr( std::is_same_v< Fn, totalenergy > )
83 [ - - ][ - - ]: 14948273 : return m.totalenergy( std::forward< Args >( args )... );
[ - - ][ + - ]
[ - - ][ - - ]
[ - - ][ + - ]
[ - - ][ - - ]
[ - - ][ + - ]
[ - - ][ - - ]
[ - - ][ + - ]
[ - - ][ - - ]
[ - - ][ + - ]
[ - - ][ - - ]
[ - - ][ + - ]
[ - - ][ - - ]
[ - - ][ + - ]
84 : :
85 : : else if constexpr( std::is_same_v< Fn, temperature > )
86 [ - - ][ - - ]: 2458344 : return m.temperature( std::forward< Args >( args )... );
[ - - ][ + - ]
87 : :
88 : : else if constexpr( std::is_same_v< Fn, min_eff_pressure > )
89 : 94252378 : return m.min_eff_pressure( std::forward< Args >( args )... );
90 : :
91 : : else if constexpr( std::is_same_v< Fn, refDensity > )
92 : : return m.refDensity( std::forward< Args >( args )... );
93 : :
94 : : else if constexpr( std::is_same_v< Fn, refPressure > )
95 : : return m.refPressure( std::forward< Args >( args )... );
96 : :
97 : : else if constexpr( std::is_same_v< Fn, rho0 > )
98 : 0 : return m.rho0( std::forward< Args >( args )... );
99 [ + - ]: 904958086 : }, m_material );
100 : : }
101 : :
102 : : //! Entry method tags for specific EOS classes to use with computeTensor()
103 : : struct CauchyStress {};
104 : : //! Call EOS function returning a tensor
105 : : //! \tparam Fn Function tag identifying the function to call
106 : : //! \tparam Args Types of arguments to pass to function
107 : : //! \param[in] args Arguments to member function to be called
108 : : //! \details This function issues a call to a member function of the
109 : : //! EOS vector and is thus equivalent to mat_blk[imat].Fn(...).
110 : : template< typename Fn, typename... Args >
111 : 0 : std::array< std::array< tk::real, 3 >, 3 > computeTensor( Args&&... args )
112 : : const {
113 : 0 : return std::visit( [&]( const auto& m )->
114 : : std::array< std::array< tk::real, 3 >, 3 > {
115 : : if constexpr( std::is_same_v< Fn, CauchyStress > )
116 : 0 : return m.CauchyStress( std::forward< Args >( args )... );
117 : :
118 [ - - ]: 0 : }, m_material );
119 : : }
120 : :
121 : : //! Entry method tags for specific EOS classes to use with set()
122 : : struct setRho0 {};
123 : : //! Call EOS function
124 : : //! \tparam Fn Function tag identifying the function to call
125 : : //! \tparam Args Types of arguments to pass to function
126 : : //! \param[in] args Arguments to member function to be called
127 : : //! \details This function issues a call to a member function of the
128 : : //! EOS vector and is thus equivalent to mat_blk[imat].Fn(...).
129 : : template< typename Fn, typename... Args >
130 : 559 : void set( Args&&... args ) {
131 : 2236 : std::visit( [&]( auto& m )-> void {
132 : : if constexpr( std::is_same_v< Fn, setRho0 > )
133 : 559 : m.setRho0( std::forward< Args >( args )... );
134 [ + - ]: 559 : }, m_material );
135 : 559 : }
136 : :
137 : : /** @name Charm++ pack/unpack serializer member functions */
138 : : ///@{
139 : : //! \brief Pack/Unpack serialize member function
140 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
141 : : void pup( PUP::er &p ) {
142 : : p | m_material;
143 : : }
144 : : //! \brief Pack/Unpack serialize operator|
145 : : //! \param[in,out] p Charm++'s PUP::er serializer object reference
146 : : //! \param[in,out] s EOS object reference
147 : : friend void operator|( PUP::er& p, EOS& s ) { s.pup(p); }
148 : : //@}
149 : : };
150 : :
151 : : } // inciter::
152 : :
153 : : #endif // EOS_h
|