OGS
VariableType.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <BaseLib/Algorithm.h>
7#include <BaseLib/Error.h>
8
9#include <Eigen/Core>
10#include <array>
11#include <string>
12#include <variant>
13
14namespace MaterialPropertyLib
15{
16
52
53static const std::array<std::string,
54 static_cast<int>(Variable::number_of_variables)>
55 variable_enum_to_string{{"capillary_pressure",
56 "concentration",
57 "deformation_gradient",
58 "density",
59 "effective_pore_pressure",
60 "enthalpy",
61 "enthalpy_of_evaporation",
62 "equivalent_plastic_strain",
63 "fracture_aperture",
64 "grain_compressibility",
65 "ice_volume_fraction",
66 "liquid_phase_pressure",
67 "liquid_saturation",
68 "mechanical_strain",
69 "molar_mass",
70 "molar_mass_derivative",
71 "molar_fraction",
72 "gas_phase_pressure",
73 "porosity",
74 "solid_grain_pressure",
75 "stress",
76 "temperature",
77 "total_strain",
78 "total_stress",
79 "transport_porosity",
80 "vapour_pressure",
81 "volumetric_mechanical_strain",
82 "volumetric_strain"}};
83
86using VariableType = std::variant<std::monostate,
87 double,
88 Eigen::Vector<double, 4>,
89 Eigen::Vector<double, 5>,
90 Eigen::Vector<double, 6>,
91 Eigen::Vector<double, 9>>;
92
94{
95public:
96 using Scalar = double;
97 using KelvinVector = std::variant<std::monostate,
98 Eigen::Vector<double, 4>,
99 Eigen::Vector<double, 6>>;
100 // Compare to GMatrixPolicy::GradientVectorType. The 1d case = Vector<3>
101 // is not used so far.
102 using DeformationGradient = std::variant<std::monostate,
103 Eigen::Vector<double, 5>,
104 Eigen::Vector<double, 9>>;
105
107 variant<Scalar const*, KelvinVector const*, DeformationGradient const*>;
108
110
112 std::variant<Scalar*, KelvinVector*, DeformationGradient*>;
113
114 template <typename Visitor>
115 auto visitVariable(Visitor&& visitor, Variable const variable)
116 {
117 return std::visit(
119 std::forward<Visitor>(visitor),
120 []<typename T>(T*)
121 {
122 static_assert(!std::is_same_v<T, T>,
123 "Non-exhaustive visitor! The variable type "
124 "must be one of the VariableArray::{Scalar, "
125 "KelvinVector, DeformationGradient}.");
126 }},
127 address_of(variable));
128 }
129
130 template <typename Visitor>
131 auto visitVariable(Visitor&& visitor, Variable const variable) const
132 {
133 return std::visit(
135 std::forward<Visitor>(visitor),
136 []<typename T>(T const*)
137 {
138 static_assert(!std::is_same_v<T, T>,
139 "Non-exhaustive visitor! The variable type "
140 "must be one of the VariableArray::{Scalar, "
141 "KelvinVector, DeformationGradient}.");
142 }},
143 address_of(variable));
144 }
145
148 VariableType operator[](Variable const variable) const
149 {
150 auto identity = [](auto const& arg) -> VariableType { return arg; };
151
152 return visitVariable(
154 [](Scalar const* ptr) -> VariableType { return *ptr; },
155 [&identity](KelvinVector const* ptr) -> VariableType
156 { return std::visit(identity, *ptr); },
157 [&identity](DeformationGradient const* ptr) -> VariableType
158 { return std::visit(identity, *ptr); }},
159 variable);
160 }
161
162private:
164
165public:
169 double density = nan_;
171 double enthalpy = nan_;
180 double molar_mass = nan_;
184 double porosity = nan_;
194
195 bool is2D() const;
196 bool is3D() const;
197
198private:
199 static constexpr auto nan_ = std::numeric_limits<double>::signaling_NaN();
200};
201
203
206Variable convertStringToVariable(std::string const& string);
207} // 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)