25 std::variant<double, Eigen::Matrix<double, 2, 1>,
26 Eigen::Matrix<double, 3, 1>, Eigen::Matrix<double, 2, 2>,
27 Eigen::Matrix<double, 3, 3>, Eigen::Matrix<double, 4, 1>,
28 Eigen::Matrix<double, 6, 1>, Eigen::MatrixXd>;
48template <std::
size_t N>
55 else if constexpr (N == 2)
57 return Eigen::Vector2d{values[0], values[1]};
59 else if constexpr (N == 3)
61 return Eigen::Vector3d{values[0], values[1], values[2]};
63 else if constexpr (N == 4)
65 using M = Eigen::Matrix2d;
66 using MRM = Eigen::Matrix<double, 2, 2, Eigen::RowMajor>;
67 return M{Eigen::Map<MRM const>{values.data(), 2, 2}};
69 else if constexpr (N == 6)
71 using M = Eigen::Matrix<double, 6, 1>;
72 return M{Eigen::Map<M const>{values.data(), 6}};
74 else if constexpr (N == 9)
76 using M = Eigen::Matrix3d;
77 using MRM = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>;
78 return M{Eigen::Map<MRM const>{values.data(), 3, 3}};
82 static_assert(
false,
"Unsupported array size for fromArray.");
122 double const t,
double const dt)
const;
128 double const t,
double const dt)
const;
136 double const t,
double const dt)
const;
143 double const t,
double const dt)
const;
150 double const t,
double const dt)
const;
155 std::vector<std::unique_ptr<Phase>>
const& phases);
157 void setScale(std::variant<Medium*, Phase*, Component*> scale)
163 template <
typename T>
165 double const t)
const
171 catch (std::bad_variant_access
const&)
174 "The initial value of {:s} does not hold requested type '{:s}' "
182 template <
typename T>
190 return std::get<T>(
value());
192 catch (std::bad_variant_access
const&)
195 "The value of {:s} does not hold requested type '{:s}' but a "
203 template <
typename T>
207 double const dt)
const
215 value(variable_array, variable_array_prev, pos, t, dt));
217 catch (std::bad_variant_access
const&)
220 "The value of {:s} is not of the requested type '{:s}' but a "
225 variable_array_prev, pos, t, dt)
229 template <
typename T>
232 double const dt)
const
239 return std::get<T>(
value(variable_array, pos, t, dt));
241 catch (std::bad_variant_access
const&)
244 "The value of {:s} is not of the requested type '{:s}' but a "
253 template <
typename T>
257 double const dt)
const
264 return std::get<T>(
dValue(variable_array, variable_array_prev,
265 variable, pos, t, dt));
267 catch (std::bad_variant_access
const&)
270 "The first derivative value of {:s} is not of the requested "
271 "type '{:s}' but a {:s}.",
275 [
dValue(variable_array, variable, pos, t, dt).index()]);
278 template <
typename T>
281 double const dt)
const
288 return std::get<T>(
dValue(variable_array, variable, pos, t, dt));
290 catch (std::bad_variant_access
const&)
293 "The first derivative value of {:s} is not of the requested "
294 "type '{:s}' but a {:s}.",
298 [
dValue(variable_array, variable, pos, t, dt).index()]);
301 template <
typename T>
305 double const dt)
const
313 d2Value(variable_array, variable1, variable2, pos, t, dt));
315 catch (std::bad_variant_access
const&)
318 "The second derivative value of {:s} is not of the requested "
319 "type '{:s}' but a {:s}.",
323 variable2, pos, t, dt)
336 std::variant<Medium*, Phase*, Component*>
scale_;
352 "scalar",
"2-vector",
"3-vector",
353 "2x2-matrix",
"3x3-matrix",
"2D-Kelvin vector",
354 "3D-Kelvin vector",
"dynamic matrix type"};
356 std::variant_size_v<PropertyDataType>,
357 "The array of property data type names has different size "
358 "than the PropertyDataType variant type.");
364 std::variant<Medium*, Phase*, Component*>
367 for (std::size_t i = 0; i < properties.size(); ++i)
369 if (new_properties[i] !=
nullptr)
371 properties[i] = std::move(new_properties[i]);
372 properties[i]->setScale(scale_pointer);
379 std::vector<std::unique_ptr<Phase>>
const& phases)
381 for (
auto& p : properties)
385 p->setProperties(phases);
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
This class defines components (substances).
virtual void checkScale() const
virtual void setProperties(std::vector< std::unique_ptr< Phase > > const &phases)
Default implementation:
virtual PropertyDataType d2Value(VariableArray const &variable_array, Variable const variable1, Variable const variable2, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
Default implementation: 2nd derivative of any constant property is zero.
std::string description() const
static constexpr std::array property_data_type_names_
Corresponds to the PropertyDataType.
T dValue(VariableArray const &variable_array, VariableArray const &variable_array_prev, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
T value(VariableArray const &variable_array, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
T d2Value(VariableArray const &variable_array, Variable const &variable1, Variable const &variable2, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
PropertyDataType value_
The single value of a property.
T dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
T initialValue(ParameterLib::SpatialPosition const &pos, double const t) const
virtual PropertyDataType value() const
void setScale(std::variant< Medium *, Phase *, Component * > scale)
T value(VariableArray const &variable_array, VariableArray const &variable_array_prev, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
std::variant< Medium *, Phase *, Component * > scale_
virtual PropertyDataType initialValue(ParameterLib::SpatialPosition const &pos, double const t) const
virtual PropertyDataType dValue(VariableArray const &variable_array, VariableArray const &variable_array_prev, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
std::string typeToString()
void overwriteExistingProperties(PropertyArray &properties, PropertyArray &new_properties, std::variant< Medium *, Phase *, Component * > scale_pointer)
PropertyDataType fromVector(std::vector< double > const &values)
std::array< std::unique_ptr< Property >, PropertyType::number_of_properties > PropertyArray
void updatePropertiesForAllPhases(PropertyArray &properties, std::vector< std::unique_ptr< Phase > > const &phases)
PropertyDataType fromArray(std::array< double, N > const &values)
std::variant< double, Eigen::Matrix< double, 2, 1 >, Eigen::Matrix< double, 3, 1 >, Eigen::Matrix< double, 2, 2 >, Eigen::Matrix< double, 3, 3 >, Eigen::Matrix< double, 4, 1 >, Eigen::Matrix< double, 6, 1 >, Eigen::MatrixXd > PropertyDataType