OGS
VariableType.h
Go to the documentation of this file.
1
13#pragma once
14
15#include <BaseLib/Algorithm.h>
16#include <BaseLib/Error.h>
17
18#include <Eigen/Core>
19#include <array>
20#include <string>
21#include <variant>
22
23namespace MaterialPropertyLib
24{
25
60
61static const std::array<std::string,
62 static_cast<int>(Variable::number_of_variables)>
63 variable_enum_to_string{{"capillary_pressure",
64 "concentration",
65 "deformation_gradient",
66 "density",
67 "effective_pore_pressure",
68 "enthalpy",
69 "enthalpy_of_evaporation",
70 "equivalent_plastic_strain",
71 "fracture_aperture",
72 "grain_compressibility",
73 "liquid_phase_pressure",
74 "liquid_saturation",
75 "mechanical_strain",
76 "molar_mass",
77 "molar_mass_derivative",
78 "molar_fraction",
79 "gas_phase_pressure",
80 "porosity",
81 "solid_grain_pressure",
82 "stress",
83 "temperature",
84 "total_strain",
85 "total_stress",
86 "transport_porosity",
87 "vapour_pressure",
88 "volumetric_mechanical_strain",
89 "volumetric_strain"}};
90
93using VariableType = std::variant<std::monostate,
94 double,
95 Eigen::Vector<double, 4>,
96 Eigen::Vector<double, 5>,
97 Eigen::Vector<double, 6>,
98 Eigen::Vector<double, 9>>;
99
101{
102public:
103 using Scalar = double;
104 using KelvinVector = std::variant<std::monostate,
105 Eigen::Vector<double, 4>,
106 Eigen::Vector<double, 6>>;
107 // Compare to GMatrixPolicy::GradientVectorType. The 1d case = Vector<3>
108 // is not used so far.
109 using DeformationGradient = std::variant<std::monostate,
110 Eigen::Vector<double, 5>,
111 Eigen::Vector<double, 9>>;
112
114 variant<Scalar const*, KelvinVector const*, DeformationGradient const*>;
115
117
119 std::variant<Scalar*, KelvinVector*, DeformationGradient*>;
120
121 template <typename Visitor>
122 auto visitVariable(Visitor&& visitor, Variable const variable)
123 {
124 return std::visit(
126 std::forward<Visitor>(visitor),
127 []<typename T>(T*)
128 {
129 static_assert(!std::is_same_v<T, T>,
130 "Non-exhaustive visitor! The variable type "
131 "must be one of the VariableArray::{Scalar, "
132 "KelvinVector, DeformationGradient}.");
133 }},
134 address_of(variable));
135 }
136
137 template <typename Visitor>
138 auto visitVariable(Visitor&& visitor, Variable const variable) const
139 {
140 return std::visit(
142 std::forward<Visitor>(visitor),
143 []<typename T>(T const*)
144 {
145 static_assert(!std::is_same_v<T, T>,
146 "Non-exhaustive visitor! The variable type "
147 "must be one of the VariableArray::{Scalar, "
148 "KelvinVector, DeformationGradient}.");
149 }},
150 address_of(variable));
151 }
152
155 VariableType operator[](Variable const variable) const
156 {
157 auto identity = [](auto const& arg) -> VariableType { return arg; };
158
159 return visitVariable(
161 [](Scalar const* ptr) -> VariableType { return *ptr; },
162 [&identity](KelvinVector const* ptr) -> VariableType
163 { return std::visit(identity, *ptr); },
164 [&identity](DeformationGradient const* ptr) -> VariableType
165 { return std::visit(identity, *ptr); }},
166 variable);
167 }
168
169private:
171
172public:
176 double density = nan_;
178 double enthalpy = nan_;
186 double molar_mass = nan_;
190 double porosity = nan_;
200
201 bool is2D() const;
202 bool is3D() const;
203
204private:
205 static constexpr auto nan_ = std::numeric_limits<double>::signaling_NaN();
206};
207
209
212Variable convertStringToVariable(std::string const& string);
213} // namespace MaterialPropertyLib
DeformationGradient deformation_gradient
std::variant< Scalar *, KelvinVector *, DeformationGradient * > VariablePointer
VariableType operator[](Variable const variable) const
std::variant< std::monostate, Eigen::Vector< double, 5 >, Eigen::Vector< double, 9 > > DeformationGradient
std:: variant< Scalar const *, KelvinVector const *, DeformationGradient const * > VariablePointerConst
std::variant< std::monostate, Eigen::Vector< double, 4 >, Eigen::Vector< double, 6 > > KelvinVector
VariablePointerConst address_of(Variable const v) const
auto visitVariable(Visitor &&visitor, Variable const variable) const
auto visitVariable(Visitor &&visitor, Variable const variable)
std::variant< std::monostate, double, Eigen::Vector< double, 4 >, Eigen::Vector< double, 5 >, Eigen::Vector< double, 6 >, Eigen::Vector< double, 9 > > VariableType
static const VariableArray EmptyVariableArray
static const std::array< std::string, static_cast< int >(Variable::number_of_variables)> variable_enum_to_string
@ concentration
used to specify decay rate of a substance.
Variable convertStringToVariable(std::string const &string)