OGS
ClausiusClapeyron.cpp
Go to the documentation of this file.
1 
17 
18 #include "MaterialLib/MPL/Medium.h"
20 
21 namespace MaterialPropertyLib
22 {
24  const double triple_temperature,
25  const double triple_pressure,
26  const double critical_temperature,
27  const double critical_pressure,
28  const double ref_temperature,
29  const double ref_pressure)
30  : T_triple_(triple_temperature),
31  p_triple_(triple_pressure),
32  T_critical_(critical_temperature),
33  p_critical_(critical_pressure),
34  T_ref_(ref_temperature),
35  p_ref_(ref_pressure)
36 {
37  name_ = std::move(name);
38 }
39 
41 {
42  if (!(std::holds_alternative<Phase*>(scale_) ||
43  std::holds_alternative<Component*>(scale_)))
44  {
45  OGS_FATAL(
46  "The property 'ClausiusClapeyron' is implemented on 'phase' and "
47  "'component' scales only.");
48  }
49 }
50 
52  std::variant<Medium*, Phase*, Component*> const scale,
53  VariableArray const& variable_array,
54  ParameterLib::SpatialPosition const& pos, double const t,
55  double const dt) const
56 {
57  return std::visit(
58  [&variable_array, &pos, t, dt](auto&& s) -> double
59  {
60  return s->property(PropertyType::molar_mass)
61  .template value<double>(variable_array, pos, t, dt);
62  },
63  scale);
64 }
65 
67  std::variant<Medium*, Phase*, Component*> const scale,
68  VariableArray const& variable_array, Variable const primary_variable,
69  ParameterLib::SpatialPosition const& pos, double const t,
70  double const dt) const
71 {
72  return std::visit(
73  [&variable_array, &primary_variable, &pos, t, dt](auto&& s) -> double
74  {
75  return s->property(PropertyType::molar_mass)
76  .template dValue<double>(variable_array, primary_variable, pos,
77  t, dt);
78  },
79  scale);
80 }
81 
83  VariableArray const& variable_array,
84  ParameterLib::SpatialPosition const& pos, double const t,
85  double const dt) const
86 {
87  const double T = std::get<double>(
88  variable_array[static_cast<int>(Variable::temperature)]);
89 
90  const double M = molarMass(scale_, variable_array, pos, t, dt);
91 
92  if (T >= T_critical_)
93  {
94  return p_critical_;
95  }
96  if (T <= T_triple_)
97  {
98  return p_triple_;
99  }
100 
101  const double dh = std::get<double>(
102  variable_array[static_cast<int>(Variable::enthalpy_of_evaporation)]);
104 
105  return p_ref_ * std::exp((1. / T_ref_ - 1. / T) * M * dh / R);
106 }
107 
109  VariableArray const& variable_array, Variable const primary_variable,
110  ParameterLib::SpatialPosition const& pos, double const t,
111  double const dt) const
112 {
113  const double T = std::get<double>(
114  variable_array[static_cast<int>(Variable::temperature)]);
115 
116  const double M = molarMass(scale_, variable_array, pos, t, dt);
117  const double dM =
118  dMolarMass(scale_, variable_array, primary_variable, pos, t, dt);
119 
120  if (T > T_critical_)
121  {
122  return 0.;
123  }
124  if (T < T_triple_)
125  {
126  return 0.;
127  }
128 
130  const double dh = std::get<double>(
131  variable_array[static_cast<int>(Variable::enthalpy_of_evaporation)]);
132  const double p_vap = std::get<double>(value(variable_array, pos, t, dt));
133 
134  if (primary_variable == Variable::temperature)
135  {
136  return p_vap * dh / R * ((1. / T_ref_ - 1. / T) * dM + M / (T * T));
137  }
138  if (primary_variable == Variable::phase_pressure)
139  {
140  return p_vap * dh / R * (1. / T_ref_ - 1. / T) * dM;
141  }
142  OGS_FATAL(
143  "ClausiusClapeyron::dValue is implemented for derivatives with respect "
144  "to phase pressure or temperature only.");
145 }
146 
148  VariableArray const& /*variable_array*/,
149  Variable const /*primary_variable1*/, Variable const /*primary_variable2*/,
150  ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
151  double const /*dt*/) const
152 {
153  OGS_FATAL("ClausiusClapeyron::d2Value is not implemented.");
154 }
155 
156 } // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition: Error.h:26
PropertyDataType d2Value(VariableArray const &variable_array, Variable const primary_variable1, Variable const primary_variable2, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
Default implementation: 2nd derivative of any constant property is zero.
double dMolarMass(std::variant< Medium *, Phase *, Component * > const scale, VariableArray const &variable_array, Variable const primary_variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
PropertyDataType dValue(VariableArray const &variable_array, Variable const primary_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)
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
Definition: Property.cpp:72
std::variant< Medium *, Phase *, Component * > scale_
Definition: Property.h:287
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 > > PropertyDataType
Definition: Property.h:35
std::array< VariableType, static_cast< int >(Variable::number_of_variables)> VariableArray
Definition: VariableType.h:108
void scale(PETScVector &x, double const a)
Definition: LinAlg.cpp:44