OGS
WaterSaturationCurveIAPWSIF97Region4.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 <spdlog/fmt/fmt.h>
7
8#include <array>
9#include <cmath>
10#include <string_view>
11
13#include "NumLib/Exceptions.h"
14
16{
22constexpr double minimum_saturation_pressure = 611.213;
23
38inline void checkPressureInRange(double const pressure,
39 std::string_view const quantity)
40{
41 constexpr double maximum_saturation_pressure =
43
44 if ((pressure < minimum_saturation_pressure) ||
45 (pressure > maximum_saturation_pressure))
46 {
47 throw NumLib::AssemblyException(fmt::format(
48 "Pressure {:g} Pa is out of the range [{:g}, {:g}] Pa for {}.",
49 pressure, minimum_saturation_pressure, maximum_saturation_pressure,
50 quantity));
51 }
52}
53
57inline double waterSaturationTemperature(double const pressure)
58{
59 static constexpr std::array n = {0.11670521452767e4, -0.72421316703206e6,
60 -0.17073846940092e2, 0.12020824702470e5,
61 -0.32325550322333e7, 0.14915108613530e2,
62 -0.48232657361591e4, 0.40511340542057e6,
63 -0.23855557567849, 0.65017534844798e3};
64
65 static constexpr double p_c = 1e6;
66
67 double const beta2 = std::sqrt(pressure / p_c);
68 double const beta = std::sqrt(beta2);
69
70 double const E = beta2 + n[2] * beta + n[5];
71 double const F = n[0] * beta2 + n[3] * beta + n[6];
72 double const G = n[1] * beta2 + n[4] * beta + n[7];
73
74 double const D = 2 * G / (-F - std::sqrt(F * F - 4 * E * G));
75
76 double const n10pD = n[9] + D;
77
78 return (n10pD - std::sqrt(n10pD * n10pD - 4 * (n[8] + n[9] * D))) / 2;
79}
80} // namespace MaterialPropertyLib::IAPWSIF97Region4
void checkPressureInRange(double const pressure, std::string_view const quantity)