Расчёт теплофизических свойств воды и водяного пара.
Область 1 - вода.

In [1]:
from region1 import Region1
In [2]:
#Создаём объект Область 1
r1 = Region1()
In [3]:
T = 300; p = 50e6
#Расчитываем теплофизические свойства воды по T и p
props_Tp = r1.props_Tp(T, p)
props_Tp #результат расчёта
Out[3]:
{'T': 300,
 'p': 50000000.0,
 'h': 157765.68435556034,
 's': 378.31490909015923,
 'cp': 4063.139391966865,
 'cv': 3987.031288157004,
 'v': 0.000982469086496767,
 'u': 108642.230030722,
 'w': 1584.4141732828423,
 'x': -1}
In [4]:
#Расчитываем теплофизические свойства воды по p и h
props_ph = r1.props_ph(p, props_Tp['h'])
props_ph #результат расчёта
Out[4]:
{'T': 299.9790295715254,
 'p': 50000000.0,
 'h': 157765.68435556034,
 's': 378.03088058002055,
 'cp': 4063.120402058519,
 'cv': 3987.0866903310657,
 'v': 0.0009824624761569482,
 'u': 108557.35497280325,
 'w': 1584.3594919826276,
 'x': -1}
In [5]:
#Расчитываем теплофизические свойства воды по p и s
props_ps = r1.props_ps(p, props_Tp['s'])
props_ps #результат расчёта
Out[5]:
{'T': 299.9895474148367,
 'p': 50000000.0,
 'h': 157723.21409449406,
 's': 378.31490909015923,
 'cp': 4063.1299280749076,
 'cv': 3987.058907380835,
 'v': 0.0009824657912524005,
 'u': 108599.92453187404,
 'w': 1584.3869213917942,
 'x': -1}
In [6]:
#Определение температуры по p и h
r1.T_ph(p, props_Tp['h']) #результат расчёта - температура, К
Out[6]:
299.9790295715254
In [7]:
#Определение температуры по p и s
r1.T_ps(p, props_Tp['s']) #результат расчёта - температура, К
Out[7]:
299.9895474148367

Проверка на корректность результатов расчёта метода props_Tp(T, p)

см. в [1] табл. 5 на стр. 9

In [8]:
#Тестовые исходные данные
inputs = [{'T': 300, 'p': 3e6},
         {'T': 300, 'p': 80e6},
         {'T': 500, 'p': 3e6}]
In [9]:
#Точные значения результата расчёта
true_answers = [{'v': 0.100215168e-2, 'h': 0.115331273e6, 'u': 0.112324818e6, 's': 0.392294792e3,
               'cp': 0.417301218e4, 'w': 0.150773921e4},
               {'v': 0.971180894e-3, 'h': 0.184142828e6, 'u': 0.106448356e6, 's': 0.368563852e3,
               'cp': 0.401008987e4, 'w': 0.163469054e4},
               {'v': 0.120241800e-2, 'h': 0.975542239e6, 'u': 0.971934985e6, 's': 0.258041912e4,
               'cp': 0.465580682e4, 'w': 0.124071337e4}]
In [10]:
errs = []
for i in range(len(true_answers)):
    props = r1.props_Tp(inputs[i]['T'], inputs[i]['p'])
    errs.append({})
    for key in true_answers[i].keys():
        #относительное отклонение результата расчёта от точного значения, %
        errs[i][key] = (props[key] / true_answers[i][key] - 1) * 100
In [11]:
import pandas as pd
table = pd.DataFrame(errs)
#относительные отклонения результата расчёта от точных значений, %
table
Out[11]:
v h u s cp w
0 -3.126329e-08 1.858895e-08 -1.568771e-08 1.026335e-07 9.747843e-08 -2.195133e-08
1 2.227152e-09 -1.443148e-07 1.996502e-07 1.081173e-07 -8.819523e-09 1.903516e-07
2 2.809621e-07 9.966250e-09 8.960477e-09 2.007794e-09 4.534570e-08 2.499953e-07

Проверка на корректность результатов расчёта метода T_ph(p, h)

см. в [1] табл. 7 на стр. 11

In [12]:
#Тестовые исходные данные
inputs_ph = [{'p': 3e6, 'h': 500e3},
         {'p': 80e6, 'h': 500e3},
         {'p': 80e6, 'h': 1500e3}]
In [13]:
#Точные значения результата расчёта
true_answers_ph = [0.391798509e3, 0.378108626e3, 0.611041229e3]
In [14]:
errs_ph = []
for i in range(len(true_answers_ph)):
    T = r1.T_ph(inputs_ph[i]['p'], inputs_ph[i]['h'])
    errs_ph.append((T / true_answers_ph[i] - 1) * 100)
In [15]:
#Относительные отклонения результата расчёта от точных значений, %
errs_ph
Out[15]:
[-6.063689550472873e-08, -3.189515318524627e-08, 6.589795376044094e-08]

Проверка на корректность результатов расчёта метода T_ph(p, s)

см. в [1] табл. 9 на стр. 12

In [16]:
#Тестовые исходные данные
inputs_ps = [{'p': 3e6, 's': 0.5e3},
         {'p': 80e6, 's': 0.5e3},
         {'p': 80e6, 's': 3e3}]
In [17]:
#Точные значения результата расчёта
true_answers_ps = [0.307842258e3, 0.309979785e3, 0.565899909e3]
In [18]:
errs_ps = []
for i in range(len(true_answers_ps)):
    T = r1.T_ps(inputs_ps[i]['p'], inputs_ps[i]['s'])
    errs_ps.append((T / true_answers_ps[i] - 1) * 100)
In [19]:
#Относительные отклонения результата расчёта от точных значений, %
errs_ps
Out[19]:
[-1.165935015201569e-07, -5.853493245666641e-08, -4.2675263323133095e-08]

Проверка на корректность методов tp_in, ph_in, ps_in

In [20]:
#Проверка Tp_in
#Точки на границе области (с левого нижнего угла по часовой стрелке)
Tp_edge = [{'T': 273.15, 'p': r1.sc.p_T(273.15)},
            {'T': 273.15, 'p': 100e6},
            {'T': 623.15, 'p': 100e6},
            {'T': 623.15, 'p': r1.sc.p_T(623.15)}]
Tp_in_edge = []
for point in Tp_edge:
    Tp_in_edge.append(r1.Tp_in(point['T'], point['p']))
Tp_in_edge
Out[20]:
[True, True, True, True]
In [21]:
#Значения T и p вне области
Tp_edge_out = [{'T': 273.15 - 1, 'p': r1.sc.p_T(273.15) -1 },
            {'T': 273.15 - 1, 'p': 100e6 + 1},
            {'T': 623.15 + 1, 'p': 100e6 + 1},
            {'T': 623.15 +1 , 'p': r1.sc.p_T(623.15) - 1}]
Tp_in_edge_out = []
for point in Tp_edge_out:
    Tp_in_edge_out.append(r1.Tp_in(point['T'], point['p']))
Tp_in_edge_out
Out[21]:
[False, False, False, False]
In [22]:
#Значения T и p внутри области
Tp_edge_in = [{'T': 273.15 + 1, 'p': r1.sc.p_T(273.15 + 1) + 1 },
            {'T': 273.15 + 1, 'p': 100e6 - 1},
            {'T': 623.15 - 1, 'p': 100e6 - 1},
            {'T': 623.15 - 1 , 'p': r1.sc.p_T(623.15) + 1}]
Tp_in_edge_in = []
for point in Tp_edge_in:
    Tp_in_edge_in.append(r1.Tp_in(point['T'], point['p']))
Tp_in_edge_in
Out[22]:
[True, True, True, True]
In [23]:
#Проверка ph_in
ph_edge = []
for point in Tp_edge:
    ph_edge.append({'p': point['p'], 'h': r1.props_Tp(point['T'], point['p'])['h']})
ph_in_edge = []
for point in ph_edge:
    ph_in_edge.append(r1.ph_in(point['p'], point['h']))
ph_in_edge
Out[23]:
[True, True, True, True]
In [24]:
#Левая верхняя точка границы: p и h внутри области
r1.ph_in(ph_edge[1]['p'] - 1, ph_edge[1]['h'] + 1)
Out[24]:
True
In [25]:
#Правая верхняя точка границы: p внутри области, h вне области
r1.ph_in(ph_edge[2]['p'] - 1, ph_edge[2]['h'] + 1)
Out[25]:
False
In [26]:
#Проверка ps_in
#Точки на границе области
ps_edge = []
for point in Tp_edge:
    ps_edge.append({'p': point['p'], 's': r1.props_Tp(point['T'], point['p'])['s']})
ps_in_edge = []
for point in ps_edge:
    ps_in_edge.append(r1.ps_in(point['p'], point['s']))
ps_in_edge
Out[26]:
[True, True, True, True]
In [27]:
#Правая верхняя точка границы: p и s внутри области
r1.ps_in(ps_edge[2]['p'] - 1, ps_edge[2]['s'] - 1)
Out[27]:
True
In [28]:
#Правая нижняя точка границы: p внутри области, s вне области
r1.ps_in(ps_edge[3]['p'] + 1, ps_edge[3]['s'] + 1)
Out[28]:
False

Ссылки

  1. Revised Release on the IAPWS Industrial Formulation 1997 for the Thermodynamic Properties of Water and Steam (The revision only relates to the extension of region 5 to 50 MPa) http://www.iapws.org/relguide/IF97-Rev.pdf

Инженерные расчёты на Python, С.В. Медведев, 2020 https://zen.yandex.ru/id/5f33dcd5554adc5b33aaee83