OGS
ClausiusClapeyron.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
5
8
10{
12 const double triple_temperature,
13 const double triple_pressure,
14 const double critical_temperature,
15 const double critical_pressure,
16 const double ref_temperature,
17 const double ref_pressure)
18 : T_triple_(triple_temperature),
19 p_triple_(triple_pressure),
22 T_ref_(ref_temperature),
23 p_ref_(ref_pressure)
24{
25 name_ = std::move(name);
26}
27
29{
30 if (!(std::holds_alternative<Phase*>(scale_) ||
31 std::holds_alternative<Component*>(scale_)))
32 {
34 "The property 'ClausiusClapeyron' is implemented on 'phase' and "
35 "'component' scales only.");
36 }
37}
38
40 std::variant<Medium*, Phase*, Component*> const scale,
41 VariableArray const& variable_array,
42 ParameterLib::SpatialPosition const& pos, double const t,
43 double const dt) const
44{
45 return std::visit(
46 [&variable_array, &pos, t, dt](auto&& s) -> double
47 {
48 return s->property(PropertyType::molar_mass)
49 .template value<double>(variable_array, pos, t, dt);
50 },
51 scale);
52}
53
55 VariableArray const& variable_array,
56 ParameterLib::SpatialPosition const& pos, double const t,
57 double const dt) const
58{
59 const double T = variable_array.temperature;
60
61 const double M = molarMass(scale_, variable_array, pos, t, dt);
62
63 if (T >= T_critical_)
64 {
65 return p_critical_;
66 }
67 if (T <= T_triple_)
68 {
69 return p_triple_;
70 }
71
72 const double dh = variable_array.enthalpy_of_evaporation;
74
75 return p_ref_ * std::exp((1. / T_ref_ - 1. / T) * M * dh / R);
76}
77
79 VariableArray const& variable_array, Variable const variable,
80 ParameterLib::SpatialPosition const& pos, double const t,
81 double const dt) const
82{
83 const double T = variable_array.temperature;
84 const double M = molarMass(scale_, variable_array, pos, t, dt);
85
86 if (T > T_critical_)
87 {
88 return 0.;
89 }
90 if (T < T_triple_)
91 {
92 return 0.;
93 }
94 if (variable == Variable::gas_phase_pressure)
95 {
96 return 0.;
97 }
98
100 const double dh = variable_array.enthalpy_of_evaporation;
101 const double p_vap = std::get<double>(value(variable_array, pos, t, dt));
102
103 if (variable == Variable::temperature)
104 {
105 return p_vap * M * dh / (R * T * T);
106 }
107 OGS_FATAL(
108 "ClausiusClapeyron::dValue is implemented for derivatives with respect "
109 "to phase pressure and temperature only.");
110}
111
113 VariableArray const& /*variable_array*/, Variable const /*variable1*/,
114 Variable const /*variable2*/, ParameterLib::SpatialPosition const& /*pos*/,
115 double const /*t*/, double const /*dt*/) const
116{
117 OGS_FATAL("ClausiusClapeyron::d2Value is not implemented.");
118}
119
120} // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition Error.h:19
PropertyDataType dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
ClausiusClapeyron(std::string name, const double triple_temperature, const double triple_pressure, const double critical_temperature, const double critical_pressure, const double ref_temperature, const double ref_pressure)
PropertyDataType d2Value(VariableArray const &variable_array, Variable const variable1, Variable const variable2, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
Default implementation: 2nd derivative of any constant property is zero.
double molarMass(std::variant< Medium *, Phase *, Component * > const scale, VariableArray const &variable_array, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
virtual PropertyDataType value() const
std::variant< Medium *, Phase *, Component * > scale_
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