OGS
WaterVapourDensity.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
6#include <cmath>
7
8#include "BaseLib/Error.h"
11
12namespace MaterialPropertyLib
13{
15static double saturatedVaporDensity(double const T)
16{
17 return 1.0e-3 * std::exp(19.819 - 4975.9 / T);
18}
19
21static double dsaturatedVaporDensitydT(double const T)
22{
23 return 4.9759 * std::exp(19.819 - 4975.9 / T) / (T * T);
24}
25
26static double humidity(double const T, double const p,
27 double const water_density)
28{
29 return std::exp(
31 T * water_density));
32}
33
35 VariableArray const& variable_array,
36 ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
37 double const /*dt*/) const
38{
39 double const p = variable_array.liquid_phase_pressure;
40 double const T = variable_array.temperature;
41 assert(T >= 273.);
42 double const water_density = variable_array.density;
43 assert(water_density > 0.);
44
45 return humidity(T, p, water_density) * saturatedVaporDensity(T);
46}
47
49 VariableArray const& variable_array, Variable const variable,
50 ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
51 double const /*dt*/) const
52{
53 double const p = variable_array.liquid_phase_pressure;
54 double const T = variable_array.temperature;
55 assert(T >= 273.);
56 double const water_density = variable_array.density;
57 assert(water_density > 0.);
58
59 if (variable == Variable::temperature)
60 {
61 double const h = humidity(T, p, water_density);
62 double const rho_v = h * saturatedVaporDensity(T);
63 double const drho_vS_dT = dsaturatedVaporDensitydT(T);
64
65 return h * drho_vS_dT - rho_v * p /
66 (water_density * T * T *
67 MaterialLib::PhysicalConstant::
68 SpecificGasConstant::WaterVapour);
69 }
70
71 if (variable == Variable::liquid_phase_pressure)
72 {
73 double const factor =
74 1.0 /
76 T * water_density);
77 double const dhumiditydp = factor * std::exp(factor * p);
78
79 return dhumiditydp * saturatedVaporDensity(T);
80 }
81
83 "WaterVapourDensity::dValue is implemented for derivatives with "
84 "respect to temperature or liquid_phase_pressure only.");
85}
86
87} // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition Error.h:19
virtual PropertyDataType value() const
PropertyDataType dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
constexpr double WaterVapour
Specific gas constant for water vapour.
static double humidity(double const T, double const p, double const water_density)
static double saturatedVaporDensity(double const T)
static double dsaturatedVaporDensitydT(double const T)
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