Skip to content

Commit 2b9ad6a

Browse files
committed
rework tests to use tables and helper function
1 parent a41a73a commit 2b9ad6a

File tree

10 files changed

+132
-123
lines changed

10 files changed

+132
-123
lines changed

pyXSteam/IAPWS_R12.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ def R12_my_dash_2(rho: float, T: float) -> float:
123123
return 1.0
124124

125125

126-
def my_rhoT(rho: float, T: float, industrial_application: bool = False) -> float:
126+
def my_rhoT(rho: float, T: float, industrial_application: bool = True) -> float:
127127
"""eq 10, viscosity"""
128128

129129
rho_dash = rho / R12_08.RHO_STAR

tests/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-

tests/helpers.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
4+
import numpy
5+
6+
7+
def array_1d_test(function, input, reference, rel_error, add_msg=""):
8+
"""helper function to test a function with one input parameter"""
9+
res = numpy.zeros(len(reference))
10+
11+
for i, in1 in enumerate(input):
12+
res[i] = function(in1)
13+
14+
error = numpy.sum(numpy.absolute((res - reference) / reference))
15+
16+
msg = f"Array test of {function.__name__} failed with error {error}, allowed is {rel_error}."
17+
if add_msg:
18+
msg += f" {add_msg}"
19+
20+
assert error < rel_error, msg
21+
22+
23+
def array_2d_test(function, inputs, reference, rel_error, add_msg=""):
24+
"""helper function to test a function with two input parameter"""
25+
res = numpy.zeros(len(reference))
26+
27+
for i, (in1, in2) in enumerate(zip(inputs[0], inputs[1])):
28+
res[i] = function(in1, in2)
29+
30+
error = numpy.sum(numpy.absolute((res - reference) / reference))
31+
32+
msg = f"Array test of {function.__name__} failed with error {error}, allowed is {rel_error}."
33+
if add_msg:
34+
msg += f" {add_msg}"
35+
36+
assert error < rel_error, msg

tests/test_HeavyWater.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@
22

33
import math
44
import unittest
5-
import numpy
65

76
from pyXSteam import XSteam_HW
87
from pyXSteam.Constants import TRIPLE_POINT_TEMPERATURE, CRITICAL_TEMPERATURE
98
from pyXSteam.TransportProperties_HW import surface_tension_T
9+
from pyXSteam.tables import R5_85
10+
from . import helpers
1011

1112

1213
class HWTester(unittest.TestCase):
1314
"""tester for functions specific to heavy water in XSteam_HW"""
1415

1516
def setUp(self):
16-
self.max_error = 1e-6
17+
self.max_error = 1e-1
1718
self.steam_table = XSteam_HW(XSteam_HW.UNIT_SYSTEM_MKS)
1819

1920
def tearDown(self):
@@ -22,16 +23,13 @@ def tearDown(self):
2223
def test_R5_surface_tension(self):
2324
"""R5-85(1994) test calculation of surface tension from T"""
2425
# selected values from Table 1
25-
in_T = [3.8, 5, 30, 55, 80, 105, 130, 155, 180, 205, 230, 255, 280, 305, 330, 355, 370]
26-
in_T = [t + TRIPLE_POINT_TEMPERATURE for t in in_T] # # quick convert to Klevin
27-
ref = [74.93, 74.76, 71.09, 67.06, 62.67, 57.96, 52.95, 47.67, 42.16, 36.45, 30.59, 24.65, 18.69, 12.83, 7.24, 2.26, 0.05]
28-
res = numpy.zeros(len(ref))
2926

30-
for i, t in enumerate(in_T):
31-
res[i] = surface_tension_T(t)
32-
33-
error = numpy.sum(numpy.absolute((res - ref) / ref))
34-
self.assertLess(error, 1e-1, "Test of st_D2O(t) failed")
27+
helpers.array_1d_test(
28+
surface_tension_T,
29+
[t + TRIPLE_POINT_TEMPERATURE for t in R5_85.Table1_t], # quick convert to Klevin,
30+
R5_85.Table1_st_calc,
31+
self.max_error,
32+
)
3533

3634
assert math.isnan(surface_tension_T(TRIPLE_POINT_TEMPERATURE - 0.01))
3735

tests/test_R12.py

Lines changed: 35 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from pyXSteam import IAPWS_R12
77
from pyXSteam.tables import R12_08
8+
from . import helpers
89

910

1011
class R12_FunctionTester(unittest.TestCase):
@@ -16,85 +17,47 @@ def tearDown(self):
1617

1718
def test_R12_industrial(self):
1819

19-
res = numpy.zeros(len(R12_08.Table4_my))
20-
for i, (T, rho) in enumerate(zip(R12_08.Table4_T, R12_08.Table4_rho)):
21-
res[i] = IAPWS_R12.my_rhoT(rho, T, industrial_application=True)
22-
23-
error = numpy.sum(numpy.absolute((res - R12_08.Table4_my) / R12_08.Table4_my))
24-
self.assertLess(error, self.max_error, "Test of simplifyed viscosity function for rho and T in R12 failed")
25-
26-
# def test_R12(self):
27-
# values = list()
28-
# values.append({"T": 647.35, "rho": 122, "result": 25.520677e-6})
29-
# values.append({"T": 647.35, "rho": 222, "result": 31.337589e-6})
30-
# # values.append({"T": 647.35, "rho": 272, "result": 36.228143e-6})
31-
# # values.append({"T": 647.35, "rho": 322, "result": 42.961579e-6})
32-
# # values.append({"T": 647.35, "rho": 372, "result": 45.688204e-6})
33-
# values.append({"T": 647.35, "rho": 422, "result": 49.436256e-6})
34-
35-
# for value in values:
36-
# calc = IAPWS_R12.eq10(T=value["T"], rho=value["rho"], industrial=False)
37-
# error = calc - value["result"]
38-
# self.assertLess(
39-
# error,
40-
# self.max_error,
41-
# "ep10 not passed for values T %(T)f rho %(rho)f: Error is %(error)e allowed: %(max)e"
42-
# % {
43-
# "T": value["T"],
44-
# "rho": value["rho"],
45-
# "error": error,
46-
# "max": self.max_error,
47-
# },
48-
# )
20+
helpers.array_2d_test(
21+
IAPWS_R12.my_rhoT,
22+
(R12_08.Table4_rho, R12_08.Table4_T),
23+
R12_08.Table4_my,
24+
self.max_error,
25+
)
26+
27+
def test_R12(self):
28+
self.skipTest("Not implemented yet")
29+
30+
values = list()
31+
values.append({"T": 647.35, "rho": 122, "result": 25.520677e-6})
32+
values.append({"T": 647.35, "rho": 222, "result": 31.337589e-6})
33+
values.append({"T": 647.35, "rho": 272, "result": 36.228143e-6})
34+
values.append({"T": 647.35, "rho": 322, "result": 42.961579e-6})
35+
values.append({"T": 647.35, "rho": 372, "result": 45.688204e-6})
36+
values.append({"T": 647.35, "rho": 422, "result": 49.436256e-6})
37+
38+
for value in values:
39+
calc = IAPWS_R12.eq10(T=value["T"], rho=value["rho"], industrial=False)
40+
error = calc - value["result"]
41+
self.assertLess(
42+
error,
43+
self.max_error,
44+
"ep10 not passed for values T %(T)f rho %(rho)f: Error is %(error)e allowed: %(max)e"
45+
% {
46+
"T": value["T"],
47+
"rho": value["rho"],
48+
"error": error,
49+
"max": self.max_error,
50+
},
51+
)
4952

5053
def test_R12_internal(self):
5154

55+
self.skipTest("Not implemented yet")
56+
5257
res = numpy.zeros(len(R12_08.Table5_xi))
5358
for i, (T, rho) in enumerate(zip(R12_08.Table5_T, R12_08.Table5_rho)):
5459
print(IAPWS_R12.R12_xi(rho, T))
5560
res[i] = IAPWS_R12.R12_xi(rho, T)
5661

5762
error = numpy.sum(numpy.absolute((res - R12_08.Table5_xi) / R12_08.Table5_xi))
5863
self.assertLess(error, self.max_error, "Test of internal calculation of correlation length ξ failed")
59-
60-
# in_T = [647.35] * 6 # K
61-
# in_rho = [
62-
# 122.0,
63-
# 222.0,
64-
# 272.0,
65-
# 322.0,
66-
# 372.0,
67-
# 422.0,
68-
# ] # kg / m^3
69-
70-
# ref_xi = [
71-
# 0.309247,
72-
# 1.571405,
73-
# 5.266522,
74-
# 16.590209,
75-
# 5.603768,
76-
# 1.876244,
77-
# ] # nm
78-
79-
# res = numpy.zeros(len(ref_xi))
80-
# for i, (rho, T) in enumerate(zip(in_rho, in_T)):
81-
# res[i] = IAPWS_R12.R12_xi(rho, T)
82-
83-
# error = numpy.sum(numpy.absolute((res - ref_xi) / ref_xi))
84-
# self.assertLess(error, self.max_error * 2, "Test of internal function R12_xi(rho,T) Function failed")
85-
86-
# ref_my_dash_2 = [
87-
# 1.00000289,
88-
# 1.00375120,
89-
# 1.03416789,
90-
# 1.09190440,
91-
# 1.03665871,
92-
# 1.00596332,
93-
# ]
94-
95-
# res = numpy.zeros(len(ref_my_dash_2))
96-
# for i, (rho, T) in enumerate(zip(in_rho, in_T)):
97-
# res[i] = IAPWS_R12.R12_my_dash_2(rho, T)
98-
99-
# error = numpy.sum(numpy.absolute((res - ref_my_dash_2) / ref_my_dash_2))
100-
# self.assertLess(error, self.max_error * 2, "Test of internal function R12_my_dash_2(rho,T) Function failed")

tests/test_R15.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import unittest
44

5-
# import numpy
6-
# from pyXSteam import IAPWS_R15
5+
import numpy
6+
from pyXSteam import IAPWS_R15
77

88

99
class TransportTester(unittest.TestCase):
@@ -14,15 +14,17 @@ def setUp(self):
1414
def tearDown(self):
1515
pass
1616

17-
# def test_R15_thermal_conductvity(self):
18-
# """R15-11 test correlating equation"""
19-
# in_T = [298.15, 298.15, 298.15, 873.15] # in K
20-
# in_rho = [0.0, 998.0, 1200.0, 0.0] # in kg/m^3
21-
# ref = [18.4341883, 607.712868, 799.038144, 79.1034659] # mW / m K
22-
# res = numpy.zeros(len(ref))
17+
def test_R15_thermal_conductvity(self):
18+
"""R15-11 test correlating equation"""
19+
self.skipTest("Not implemented yet")
2320

24-
# for i, (T, rho) in enumerate(zip(in_T, in_rho)):
25-
# res[i] = IAPWS_R15.R15_11_correlation(T, rho)
21+
in_T = [298.15, 298.15, 298.15, 873.15] # in K
22+
in_rho = [0.0, 998.0, 1200.0, 0.0] # in kg/m^3
23+
ref = [18.4341883, 607.712868, 799.038144, 79.1034659] # mW / m K
24+
res = numpy.zeros(len(ref))
2625

27-
# error = numpy.sum(numpy.absolute((res - ref) / ref))
28-
# self.assertLess(error, self.max_error, "Test of correlation function for T and rho in R15 failed")
26+
for i, (T, rho) in enumerate(zip(in_T, in_rho)):
27+
res[i] = IAPWS_R15.R15_11_correlation(T, rho)
28+
29+
error = numpy.sum(numpy.absolute((res - ref) / ref))
30+
self.assertLess(error, self.max_error, "Test of correlation function for T and rho in R15 failed")

tests/test_R6.py

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
# -*- coding: utf-8 -*-
22

33
import unittest
4-
import numpy
54
from pyXSteam import IAPWS_R6
65
from pyXSteam.tables import R6_95
6+
from . import helpers
77

88

99
class R6_FunctionTester(unittest.TestCase):
1010

1111
def setUp(self):
1212
self.max_error = 1e-8
13-
# self.max_matrix_error = 3e-3
13+
self.max_matrix_error = self.max_error * 2
1414

1515
def tearDown(self):
1616
pass
@@ -56,27 +56,30 @@ def test_R6_internal(self):
5656
def test_p_function(self):
5757
"""check functions against values of R6-95 Table 7"""
5858

59-
res = numpy.zeros(len(R6_95.Table7_p))
60-
for i, (rho, T) in enumerate(zip(R6_95.Table7_rho, R6_95.Table7_T)):
61-
res[i] = IAPWS_R6.R6_p_rhoT(rho, T)
62-
error = numpy.sum(numpy.absolute((res - R6_95.Table7_p) / R6_95.Table7_p))
63-
self.assertLess(error, self.max_error * 2, "Test of p(rho,T) Function failed")
64-
65-
res = numpy.zeros(len(R6_95.Table7_cv))
66-
for i, (rho, T) in enumerate(zip(R6_95.Table7_rho, R6_95.Table7_T)):
67-
res[i] = IAPWS_R6.R6_cv_rhoT(rho, T)
68-
error = numpy.sum(numpy.absolute((res - R6_95.Table7_cv) / R6_95.Table7_cv))
69-
self.assertLess(error, self.max_error * 2, "Test of cv(rho,T) Function failed")
70-
71-
res = numpy.zeros(len(R6_95.Table7_w))
72-
for i, (rho, T) in enumerate(zip(R6_95.Table7_rho, R6_95.Table7_T)):
73-
res[i] = IAPWS_R6.R6_w_rhoT(rho, T)
74-
# FIXME
75-
error = numpy.sum(numpy.absolute((res - R6_95.Table7_w) / R6_95.Table7_w))
76-
self.assertLess(error, 5.3e-3, "Test of w(rho,T) Function failed")
77-
78-
res = numpy.zeros(len(R6_95.Table7_s))
79-
for i, (rho, T) in enumerate(zip(R6_95.Table7_rho, R6_95.Table7_T)):
80-
res[i] = IAPWS_R6.R6_s_rhoT(rho, T)
81-
error = numpy.sum(numpy.absolute((res - R6_95.Table7_s) / R6_95.Table7_s))
82-
self.assertLess(error, self.max_error * 2, "Test of s(rho,T) Function failed")
59+
helpers.array_2d_test(
60+
IAPWS_R6.R6_p_rhoT,
61+
(R6_95.Table7_rho, R6_95.Table7_T),
62+
R6_95.Table7_p,
63+
self.max_matrix_error,
64+
)
65+
66+
helpers.array_2d_test(
67+
IAPWS_R6.R6_cv_rhoT,
68+
(R6_95.Table7_rho, R6_95.Table7_T),
69+
R6_95.Table7_cv,
70+
self.max_matrix_error,
71+
)
72+
73+
helpers.array_2d_test(
74+
IAPWS_R6.R6_w_rhoT,
75+
(R6_95.Table7_rho, R6_95.Table7_T),
76+
R6_95.Table7_w,
77+
5.3e-3,
78+
)
79+
80+
helpers.array_2d_test(
81+
IAPWS_R6.R6_s_rhoT,
82+
(R6_95.Table7_rho, R6_95.Table7_T),
83+
R6_95.Table7_s,
84+
self.max_matrix_error,
85+
)

tests/test_RegionBorders.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import unittest
44

5-
from test_Regions import REGION_ERROR
5+
from .test_Regions import REGION_ERROR
66
import pyXSteam.RegionBorders as RB
77

88

tests/test_Regions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ def test_T_function(self):
385385

386386
def test_p_functions(self):
387387
"""R7-97(2012) Tests to verify all functions with the Parameters p of region 4"""
388+
# TODO find correct table number
388389
in_p = [0.1, 1.0, 10.0]
389390
ref = [0.372755919e3, 0.453035632e3, 0.584149488e3]
390391
res = numpy.zeros(3)
@@ -397,6 +398,7 @@ def test_p_functions(self):
397398
def test_SR4_04_h_boundary(self):
398399
"""SR4-04(2014): computer-program verification for boundary functions for h"""
399400
# Table 11 and Table 18
401+
# TODO split table
400402
in_s = [1.0, 2.0, 3.0, 3.8, 4.0, 4.2, 7.0, 8.0, 9.0, 5.5, 5.0, 4.5]
401403
ref = [
402404
3.085509647e2, # h'_1

tests/test_TransportProperties.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
from pyXSteam.TransportProperties import surface_tension_T
88
from pyXSteam.Constants import TRIPLE_POINT_TEMPERATURE, CRITICAL_TEMPERATURE
99

10+
# from pyXSteam.tables import R1_76
11+
# from . import helpers
12+
1013

1114
class TransportTester(unittest.TestCase):
1215
"""tests for functions in Transport Properties"""

0 commit comments

Comments
 (0)