def specific_volume(self, p=None, T=None): """Returns the specific volume in m³/kg""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: pi = self.p / Pressure(16.53).unit('MPa') return (self._basic_equation1('gamma_pi') * self.R * self.T * pi / self.p * 1e3) # because of kJ in R elif self._is_in_region() == 2: pi = self.p / Pressure(1).unit('MPa') return (pi * (self._basic_equation2('gamma_0_pi') + self._basic_equation2('gamma_r_pi')) * self.R * self.T / self.p * 1e3) elif self._is_in_region() == 3: return None elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass return -1
def entropy(self, p=None, T=None): """NOT IMPLEMENTED""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: pi = self.p / Pressure(16.53).unit('MPa') tau = Temperature(1386) / self.T return (tau * self._basic_equation1('gamma_tau') - self._basic_equation1('gamma')) * self.R elif self._is_in_region() == 2: pi = self.p / Pressure(1).unit('MPa') tau = 540 / self.T return ((tau * (self._basic_equation2('gamma_0_tau') + self._basic_equation2('gamma_r_tau')) - (self._basic_equation2('gamma_0') + self._basic_equation2('gamma_r'))) * self.R) elif self._is_in_region() == 3: pass elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass return -1
def temperature_saturation(self, p=None): """Yields Tsat given a pressure p.""" # module deals with pressure in MPa if p is None: p = self.p.MPa else: p = Pressure(p).MPa if p < Pressure(611.213).unit('Pa').MPa or p > self.pc: raise ValueError('Pressure out of range.') # table 34 ni = array([ 1167.0521452767, -724213.16703206, -17.073846940092, 12020.82470247, -3232555.0322333, 14.91510861353, -4823.2657361591, 405113.40542057, -0.23855557567849, 650.17534844798 ], dtype='d') beta = p**0.25 E = 1 * beta**2 + ni[2] * beta + ni[5] F = ni[0] * beta**2 + ni[3] * beta + ni[6] G = ni[1] * beta**2 + ni[4] * beta + ni[7] D = 2 * G / (-F - (F**2 - 4 * E * G)**0.5) return Temperature((ni[9] + D - ((ni[9] + D)**2 - 4 * (ni[8] + ni[9] * D))**0.5) * 0.5)
def heat_capacity_constant_v(self, p=None, T=None): """NOT IMPLEMENTED""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: pi = self.p / Pressure(16.53).unit('MPa') tau = Temperature(1386) / self.T return (-(tau**2) * self._basic_equation1('gamma_tau_tau') + ((self._basic_equation1('gamma_pi') - tau * self._basic_equation1('gamma_pi_tau'))**2) / self._basic_equation1('gamma_pi_pi')) * self.R elif self._is_in_region() == 2: pass elif self._is_in_region() == 3: pass elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass return -1
def speed_of_sound(self, p=None, T=None): """NOT IMPLEMENTED""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: pi = self.p / Pressure(16.53).unit('MPa') tau = Temperature(1386) / self.T inside_frac = (((self._basic_equation1('gamma_pi') - tau * self._basic_equation1('gamma_tau_pi'))**2) / ((tau**2) * self._basic_equation1('gamma_tau_tau'))) return sqrt( ((self._basic_equation1('gamma_pi')**2) / (inside_frac - self._basic_equation1('gamma_pi_pi'))) * self.R * self.T * 1000) elif self._is_in_region() == 2: pass elif self._is_in_region() == 3: pass elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass return -1
def test_units(): """Test units.""" Tkel = Temperature(273.15).unit('K') Tcel = Temperature(0).unit('C') assert Tkel == Tcel pressuremmhg = Pressure(760).unit('torr') pressureatm = Pressure(1).unit('atm') assert pressuremmhg == pressureatm
def _is_in_region(self): """Finds a region for the (T, p) point (see IAPWS-IF97 for details). The usefulness of these regions are to divide the physical properties of water into different sets of coefficients and equations.""" # for the 2 - 3 boundary line ni = array([ 348.05185628969, -1.1671859879975, 0.0010192970039326, 572.54459862746, 13.91883977887 ], dtype='d') theta = self.T pressure23 = Pressure(ni[0] + ni[1] * theta + ni[2] * theta**2).unit('MPa') # exceptional cases if self.T == self.Tt and self.p == self.pt: return 1 # regular cases if self.T >= Temperature(273.15) and self.T <= Temperature(623.15): if self.T < self.temperature_saturation(self.p): return 1 else: return 2 elif self.T > Temperature(623.15) and self.T <= Temperature(1073.15): if self.p > pressure23: return 3 else: return 2 elif self.T >= Temperature(1073.15) and self.T <= Temperature(2273.15): return 5 else: raise Exception('Cannot assign region to the parameters p = ' + str(self.p) + 'T = ' + str(self.T) + 'given.')
def heat_capacity(self, p=None, T=None): """Returns the isobaric heat capacity given p and T in kJ/(kg K).""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: tau = 1386 / T return (-1 * tau * tau * self.R * self._basic_equation1('gamma_tau_tau')) elif self._is_in_region() == 2: pass elif self._is_in_region() == 3: delta = rho / self.rhoc tau = self.Tc / self.T return ( -tau**2 / self._basic_equation3('PHI_tau_tau') + (delta * self._basic_equation3('PHI_delta') - delta * tau * self._basic_equation3('PHI_tau_delta'))**2 / (2 * delta * self._basic_equation3('PHI_delta') + delta**2 * self._basic_equation3('PHI_delta_delta'))) * self.R elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass return -1
def __init__(self, p, T, massic_basis=False): u"""Initializes a Water object.""" self.p = Pressure(p) self.T = Temperature(T) # check if water is specified by IAPWS-IF97 for these values if self.T < Temperature(273.15) or self.T > Temperature(2273.15): raise ValueError('Temperature ' + str(T) + ' out of range (273.15 - 2273.15K)') if self.p > Pressure(100).unit('MPa') or self.p < 0: raise ValueError('Pressure ' + str(p) + ' out of range (0 - 100 MPa)') if self.T > 1073.15 and self.p > Pressure(50).unit('MPa'): raise ValueError('p or T value out of range') # adjust R to mass or molar basis if massic_basis is True: self.R = ideal_gas_constant_massic_basis[0] # kJ/(kg K); elif massic_basis is False: self.R = ideal_gas_constant[0]
def _basic_equation1(self, value='gamma'): """Returns basic equation 1 and its derivatives, ex: 'gamma', 'gamma_tau', 'gamma_tau_pi', etc.""" # region1 Ii = array([ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 8, 8, 21, 23, 29, 30, 31, 32 ], dtype='int') Ji = array([ -2, -1, 0, 1, 2, 3, 4, 5, -9, -7, -1, 0, 1, 3, -3, 0, 1, 3, 17, -4, 0, 6, -5, -2, 10, -8, -11, -6, -29, -31, -38, -39, -40, -41 ], dtype='int') ni = array([ 0.14632971213167, -0.84548187169114, -3.756360367204, 3.3855169168385, -0.95791963387872, 0.15772038513228, -0.016616417199501, 0.00081214629983568, 0.00028319080123804, -0.00060706301565874, -0.018990068218419, -0.032529748770505, -0.021841717175414, -5.283835796993e-05, -0.00047184321073267, -0.00030001780793026, 4.7661393906987e-05, -4.4141845330846e-06, -7.2694996297594e-16, -3.1679644845054e-05, -2.8270797985312e-06, -8.5205128120103e-10, -2.2425281908e-06, -6.5171222895601e-07, -1.4341729937924e-13, -4.0516996860117e-07, -1.2734301741641e-09, -1.7424871230634e-10, -6.8762131295531e-19, 1.4478307828521e-20, 2.6335781662795e-23, -1.1947622640071e-23, 1.8228094581404e-24, -9.3537087292458e-26 ], dtype='d') pi = self.p / Pressure(16.53).unit('MPa') tau = Temperature(1386) / self.T if value == 'gamma': return sum(ni * ((7.1 - pi)**Ii) * ((tau - 1.222)**Ji)) elif value == 'gamma_tau': return sum(ni * ((7.1 - pi)**Ii) * Ji * ((tau - 1.222)**(Ji - 1))) elif value == 'gamma_tau_tau': return sum(ni * ((7.1 - pi)**Ii) * Ji * (Ji - 1) * ((tau - 1.222)**(Ji - 2))) elif value == 'gamma_pi': return -1 * sum(ni * Ii * ((7.1 - pi)**(Ii - 1)) * (tau - 1.222)**Ji) elif value == 'gamma_pi_pi': return sum(ni * Ii * (Ii - 1) * (7.1 - pi)**(Ii - 2) * (tau - 1.222)**Ji) elif value == 'gamma_pi_tau' or value == 'gamma_tau_pi': return -1 * sum(ni * Ii * (7.1 - pi)**(Ii - 1) * Ji * (tau - 1.222)**(Ji - 1)) else: raise Exception('Function not assigned in _basic_equation1()')
def enthalpy(self, p=None, T=None): """Returns the enthalpy given p and T in kJ/kg.""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: return Enthalpy(self._basic_equation1('gamma_tau') * 1386 * self.R) elif self._is_in_region() == 2: return Enthalpy(540 * self.R * (self._basic_equation2('gamma_0_tau') + self._basic_equation2('gamma_r_tau'))) elif self._is_in_region() == 3: # for region 3 rho needs to be solved numerically reg3_solved = self._basic_equation3('PHI_delta') delta = reg3_solved[1] / self.rhoc tau = self.Tc / self.T return Enthalpy((tau * self._basic_equation3('PHI_tau')[0] + delta * reg3_solved[0]) * self.R * self.T) elif self._is_in_region() == 4: return None elif self._is_in_region() == 5: pi = self.p / Pressure(1).unit('MPa') tau = Temperature(1000) / self.T return (tau * (self._basic_equation5('gamma_0_tau') + self._basic_equation5('gamma_r_tau')) * self.R * self.T)
def _basic_equation5(self, value='gamma'): """Returns equation 1 and its derivatives, ex: 'gamma', 'gamma_tau', 'gamma_tau_pi', etc.""" J0 = array([0, 1, -3, -2, -1, 2], dtype='d') n0 = array([ -13.179983674201, 6.8540841634434, -0.024805148933466, 0.36901534980333, -3.1161318213925, -0.32961626538917 ], dtype='d') Ii = array([1, 1, 1, 2, 2, 3], dtype='d') Ji = array([1, 2, 3, 3, 9, 7], dtype='d') ni = array([ 0.0015736404855259, 0.00090153761673944, -0.0050270077677648, 2.2440037409485e-06, -4.1163275453471e-06, 3.7919454822955e-08 ], dtype='d') pi = self.p / Pressure(1).unit('MPa') tau = Temperature(1000) / self.T if value == 'gamma': return (self._basic_equation5('gamma_0') + self._basic_equation5('gamma_r')) elif value == 'gamma_0': return log(pi) + sum(n0 * (tau**J0)) elif value == 'gamma_r': return sum(ni * (pi**Ii) * (tau**Ji)) elif value == 'gamma_0_pi': return 1 / pi elif value == 'gamma_0_pi_pi': return -1 / (pi**2) elif value == 'gamma_0_tau': return sum(n0 * J0 * (tau**(J0 - 1))) elif value == 'gamma_0_tau_tau': sum(n0 * J0 * (J0 - 1) * (tau**(J0 - 2))) elif value == 'gamma_0_tau_pi' or value == 'gamma_0_pi_tau': return 0 + 0 elif value == 'gamma_r_pi': return sum(ni * Ii * (pi**(Ii - 1)) * (tau**Ji)) elif value == 'gamma_r_tau': return sum(ni * (pi**Ii) * Ji * (tau**(Ji - 1))) elif value == 'gamma_r_pi_pi': return sum(ni * Ii * (Ii - 1) * (pi**(Ii - 2)) * (tau**Ji)) elif value == 'gamma_r_tau_tau': return sum(ni * (pi**Ii) * Ji * (Ji - 1) * (tau**(Ji - 2))) elif value == 'gamma_r_tau_pi' or 'gamma_r_pi_tau': return sum(ni * Ii * (pi**(Ii - 1)) * Ji * (tau**(Ji - 1)))
def gibbs_energy(self, p=None, T=None): """Returns the Gibbs Energy given p and T in kJ/kg.""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: return self._basic_equation1('gamma') * self.R * T elif self._is_in_region() == 2: return self._basic_equation2('gamma') * self.R * T elif self._is_in_region() == 3: pass elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass
def pressure_saturation(self, T=None): """Yields Psat given a temperature T""" if T is None: T = self.T else: T = Temperature(T) if T < 273.15 or T > self.Tc: raise ValueError('Temperature out of range.') # table 34 ni = array([ 1167.0521452767, -724213.16703206, -17.073846940092, 12020.82470247, -3232555.0322333, 14.91510861353, -4823.2657361591, 405113.40542057, -0.23855557567849, 650.17534844798 ], dtype='d') v = T + ni[8] / (T - ni[9]) A = 1 * v**2 + ni[0] * v + ni[1] B = ni[2] * v**2 + ni[3] * v + ni[4] C = ni[5] * v**2 + ni[6] * v + ni[7] return Pressure( (2 * C / (-B + (B**2 - 4 * A * C)**0.5))**4).unit('MPa')
class Water(object): """ Taken from The International Association for the Properties of Water and Steam. Lucerne, Switzerland. August 2007. Revised Release on the IAPWS Industrial Formulation 1997 for the Thermodynamic Properties of Water and Steam. Reference document: IAPWS-IF97. All units in SI and default is molar basis.""" def __init__(self, p, T, massic_basis=False): u"""Initializes a Water object.""" self.p = Pressure(p) self.T = Temperature(T) # check if water is specified by IAPWS-IF97 for these values if self.T < Temperature(273.15) or self.T > Temperature(2273.15): raise ValueError('Temperature ' + str(T) + ' out of range (273.15 - 2273.15K)') if self.p > Pressure(100).unit('MPa') or self.p < 0: raise ValueError('Pressure ' + str(p) + ' out of range (0 - 100 MPa)') if self.T > 1073.15 and self.p > Pressure(50).unit('MPa'): raise ValueError('p or T value out of range') # adjust R to mass or molar basis if massic_basis is True: self.R = ideal_gas_constant_massic_basis[0] # kJ/(kg K); elif massic_basis is False: self.R = ideal_gas_constant[0] # constants # ideal gas constant was already instantiated Tc = 647.096 # Critical point temperature (K) pc = Pressure(22.064).unit('MPa') # Critical point pressure (MPa) rhoc = 322.0 # Critical point density kg/m3 Tt = 273.16 # Triple point temperature (K) pt = 611.657 # Triple point pressure (Pa) ht = 0.611783 # Enthalpy at triple point (J/kg) def temperature_saturation(self, p=None): """Yields Tsat given a pressure p.""" # module deals with pressure in MPa if p is None: p = self.p.MPa else: p = Pressure(p).MPa if p < Pressure(611.213).unit('Pa').MPa or p > self.pc: raise ValueError('Pressure out of range.') # table 34 ni = array([ 1167.0521452767, -724213.16703206, -17.073846940092, 12020.82470247, -3232555.0322333, 14.91510861353, -4823.2657361591, 405113.40542057, -0.23855557567849, 650.17534844798 ], dtype='d') beta = p**0.25 E = 1 * beta**2 + ni[2] * beta + ni[5] F = ni[0] * beta**2 + ni[3] * beta + ni[6] G = ni[1] * beta**2 + ni[4] * beta + ni[7] D = 2 * G / (-F - (F**2 - 4 * E * G)**0.5) return Temperature((ni[9] + D - ((ni[9] + D)**2 - 4 * (ni[8] + ni[9] * D))**0.5) * 0.5) def pressure_saturation(self, T=None): """Yields Psat given a temperature T""" if T is None: T = self.T else: T = Temperature(T) if T < 273.15 or T > self.Tc: raise ValueError('Temperature out of range.') # table 34 ni = array([ 1167.0521452767, -724213.16703206, -17.073846940092, 12020.82470247, -3232555.0322333, 14.91510861353, -4823.2657361591, 405113.40542057, -0.23855557567849, 650.17534844798 ], dtype='d') v = T + ni[8] / (T - ni[9]) A = 1 * v**2 + ni[0] * v + ni[1] B = ni[2] * v**2 + ni[3] * v + ni[4] C = ni[5] * v**2 + ni[6] * v + ni[7] return Pressure( (2 * C / (-B + (B**2 - 4 * A * C)**0.5))**4).unit('MPa') def _is_in_region(self): """Finds a region for the (T, p) point (see IAPWS-IF97 for details). The usefulness of these regions are to divide the physical properties of water into different sets of coefficients and equations.""" # for the 2 - 3 boundary line ni = array([ 348.05185628969, -1.1671859879975, 0.0010192970039326, 572.54459862746, 13.91883977887 ], dtype='d') theta = self.T pressure23 = Pressure(ni[0] + ni[1] * theta + ni[2] * theta**2).unit('MPa') # exceptional cases if self.T == self.Tt and self.p == self.pt: return 1 # regular cases if self.T >= Temperature(273.15) and self.T <= Temperature(623.15): if self.T < self.temperature_saturation(self.p): return 1 else: return 2 elif self.T > Temperature(623.15) and self.T <= Temperature(1073.15): if self.p > pressure23: return 3 else: return 2 elif self.T >= Temperature(1073.15) and self.T <= Temperature(2273.15): return 5 else: raise Exception('Cannot assign region to the parameters p = ' + str(self.p) + 'T = ' + str(self.T) + 'given.') def _basic_equation1(self, value='gamma'): """Returns basic equation 1 and its derivatives, ex: 'gamma', 'gamma_tau', 'gamma_tau_pi', etc.""" # region1 Ii = array([ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 8, 8, 21, 23, 29, 30, 31, 32 ], dtype='int') Ji = array([ -2, -1, 0, 1, 2, 3, 4, 5, -9, -7, -1, 0, 1, 3, -3, 0, 1, 3, 17, -4, 0, 6, -5, -2, 10, -8, -11, -6, -29, -31, -38, -39, -40, -41 ], dtype='int') ni = array([ 0.14632971213167, -0.84548187169114, -3.756360367204, 3.3855169168385, -0.95791963387872, 0.15772038513228, -0.016616417199501, 0.00081214629983568, 0.00028319080123804, -0.00060706301565874, -0.018990068218419, -0.032529748770505, -0.021841717175414, -5.283835796993e-05, -0.00047184321073267, -0.00030001780793026, 4.7661393906987e-05, -4.4141845330846e-06, -7.2694996297594e-16, -3.1679644845054e-05, -2.8270797985312e-06, -8.5205128120103e-10, -2.2425281908e-06, -6.5171222895601e-07, -1.4341729937924e-13, -4.0516996860117e-07, -1.2734301741641e-09, -1.7424871230634e-10, -6.8762131295531e-19, 1.4478307828521e-20, 2.6335781662795e-23, -1.1947622640071e-23, 1.8228094581404e-24, -9.3537087292458e-26 ], dtype='d') pi = self.p / Pressure(16.53).unit('MPa') tau = Temperature(1386) / self.T if value == 'gamma': return sum(ni * ((7.1 - pi)**Ii) * ((tau - 1.222)**Ji)) elif value == 'gamma_tau': return sum(ni * ((7.1 - pi)**Ii) * Ji * ((tau - 1.222)**(Ji - 1))) elif value == 'gamma_tau_tau': return sum(ni * ((7.1 - pi)**Ii) * Ji * (Ji - 1) * ((tau - 1.222)**(Ji - 2))) elif value == 'gamma_pi': return -1 * sum(ni * Ii * ((7.1 - pi)**(Ii - 1)) * (tau - 1.222)**Ji) elif value == 'gamma_pi_pi': return sum(ni * Ii * (Ii - 1) * (7.1 - pi)**(Ii - 2) * (tau - 1.222)**Ji) elif value == 'gamma_pi_tau' or value == 'gamma_tau_pi': return -1 * sum(ni * Ii * (7.1 - pi)**(Ii - 1) * Ji * (tau - 1.222)**(Ji - 1)) else: raise Exception('Function not assigned in _basic_equation1()') def _basic_equation2(self, value='gamma'): """Returns equation 1 and its derivatives, ex: 'gamma', 'gamma_tau', 'gamma_tau_pi', etc.""" # region2; ideal part J0 = array([0, 1, -5, -4, -3, -2, -1, 2, 3], dtype='d') n0 = array([ -9.6927686500217, 10.086655968018, -0.005608791128302, 0.071452738081455, -0.40710498223928, 1.4240819171444, -4.383951131945, -0.28408632460772, 0.021268463753307 ], dtype='d') # region2; real part Ii = array([ 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 16, 16, 18, 20, 20, 20, 21, 22, 23, 24, 24, 24 ], dtype='d') Ji = array([ 0, 1, 2, 3, 6, 1, 2, 4, 7, 36, 0, 1, 3, 6, 35, 1, 2, 3, 7, 3, 16, 35, 0, 11, 25, 8, 36, 13, 4, 10, 14, 29, 50, 57, 20, 35, 48, 21, 53, 39, 26, 40, 58 ], dtype='d') ni = array([ -0.0017731742473213, -0.017834862292358, -0.045996013696365, -0.057581259083432, -0.05032527872793, -3.3032641670203e-05, -0.00018948987516315, -0.0039392777243355, -0.043797295650573, -2.6674547914087e-05, 2.0481737692309e-08, 4.3870667284435e-07, -3.227767723857e-05, -0.0015033924542148, -0.040668253562649, -7.8847309559367e-10, 1.2790717852285e-08, 4.8225372718507e-07, 2.2922076337661e-06, -1.6714766451061e-11, -0.0021171472321355, -23.895741934104, -5.905956432427e-18, -1.2621808899101e-06, -0.038946842435739, 1.1256211360459e-11, -8.2311340897998, 1.9809712802088e-08, 1.0406965210174e-19, -1.0234747095929e-13, -1.0018179379511e-09, -8.0882908646985e-11, 0.10693031879409, -0.33662250574171, 8.9185845355421e-25, 3.0629316876232e-13, -4.2002467698208e-06, -5.9056029685639e-26, 3.7826947613457e-06, -1.2768608934681e-15, 7.3087610595061e-29, 5.5414715350778e-17, -9.436970724121e-07 ], dtype='d') pi = self.p / Pressure(1).unit('MPa') tau = 540 / self.T # arrays if value == 'gamma': return (self._basic_equation2('gamma_0') + self._basic_equation2('gamma_r')) elif value == 'gamma_0': return log(pi) + sum(n0 * (tau**J0)) elif value == 'gamma_r': return sum(ni * (pi**Ii) * (tau - 0.5)**Ji) elif value == 'gamma_0_pi': return 1 / pi elif value == 'gamme_0_pi_pi': return -1 / (pi**2) elif value == 'gamma_0_tau': return 0 + sum(n0 * J0 * (tau**(J0 - 1))) elif value == 'gamma_0_tau_tau': return 0 + sum(n0 * J0 * (J0 - 1) * tau**(J0 - 2)) elif value == 'gamma_0_pi_tau' or value == 'gamma_0_tau_pi': return 0 elif value == 'gamma_r_pi': return sum(ni * Ii * (pi**(Ii - 1)) * ((tau - 0.5)**Ji)) elif value == 'gamma_r_tau': return sum(ni * (pi**Ii) * Ji * (tau - 0.5)**(Ji - 1)) elif value == 'gamma_r_pi_pi': return sum(ni * Ii * (Ii - 1) * (pi**(Ii - 2))(tau - 0.5)**Ji) elif value == 'gamma_r_tau_tau': return sum(ni * (pi**Ii) * Ji * (Ji - 1) * (tau - 0.5)**(Ji - 2)) elif value == 'gamma_pi_tau' or value == 'gamma_tau_pi': pass def _basic_equation3(self, value='PHI'): """Returns equation 3 and its derivatives, ex: 'gamma', 'gamma_tau', 'gamma_tau_pi', etc.""" # do not forget that the first term is not used Ii = array([ -1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 10, 10, 11 ], dtype='d') # do not forget that the first term is not used Ji = array([ -1, 0, 1, 2, 7, 10, 12, 23, 2, 6, 15, 17, 0, 2, 6, 7, 22, 26, 0, 2, 4, 16, 26, 0, 2, 4, 26, 1, 3, 26, 0, 2, 26, 2, 26, 2, 26, 0, 1, 26 ], dtype='d') ni = array([ 1.0658070028513, -15.732845290239, 20.944396974307, -7.6867707878716, 2.6185947787954, -2.808078114862, 1.2053369696517, -0.0084566812812502, -1.2654315477714, -1.1524407806681, 0.88521043984318, -0.64207765181607, 0.38493460186671, -0.85214708824206, 4.8972281541877, -3.0502617256965, 0.039420536879154, 0.12558408424308, -0.2799932969871, 1.389979956946, -2.018991502357, -0.0082147637173963, -0.47596035734923, 0.0439840744735, -0.44476435428739, 0.90572070719733, 0.70522450087967, 0.10770512626332, -0.32913623258954, -0.50871062041158, -0.022175400873096, 0.094260751665092, 0.16436278447961, -0.013503372241348, -0.014834345352472, 0.00057922953628084, 0.0032308904703711, 8.0964802996215e-05, -0.00016557679795037, -4.4923899061815e-05 ], dtype='d') # it looks like the first term is never used # except in the PHI equations Ii = Ii[1:] Ji = Ji[1:] ni = ni[1:] n1 = 1.0658070028513 tau = self.Tc / self.T # from equations 28 and p given as input, # calculate rho to be used in PHI def obj(x): print(type(self.p)) print(type(x), x) print(type(self.rhoc), self.rhoc) return ( self.p - 1000 * x * self.R * self.T * (x / self.rhoc) * (n1 / (x / self.rhoc) + sum(ni * Ii * (x / self.rhoc)**(Ii - 1) * tau**Ji))) for i in range(1, 580, 1): a = i b = a + 1 if obj(a) * obj(b) < 0: break rho = scipy.optimize.bisect(obj, a, b, xtol=1e-10) delta = rho / self.rhoc # returns PHI and found rho as tuple (PHI, rho) if value == 'PHI': return (n1 * log(delta) + sum(ni * delta**Ii * tau**Ji), rho) elif value == 'PHI_delta': return (n1 / delta + sum(ni * Ii * delta**(Ii - 1) * tau**Ji), rho) elif value == 'PHI_delta_delta': return (-n1 / (delta**2) + sum(ni * Ii * (Ii - 1) * delta**(Ii - 2) * tau**Ji), rho) elif value == 'PHI_tau': return (sum(ni * delta**Ii * Ji * tau**(Ji - 1)), rho) elif value == 'PHI_tau_tau': return (sum(ni * delta**Ii * Ji * (Ji - 1) * tau**(Ji - 2)), rho) elif value == 'PHI_delta_tau' or value == 'PHI_tau_delta': return (sum(ni * Ii * delta**(Ii - 1) * Ji * tau**(Ji - 1)), rho) # there is no region 4; region 4 is the saturation line of water/vapor def _basic_equation5(self, value='gamma'): """Returns equation 1 and its derivatives, ex: 'gamma', 'gamma_tau', 'gamma_tau_pi', etc.""" J0 = array([0, 1, -3, -2, -1, 2], dtype='d') n0 = array([ -13.179983674201, 6.8540841634434, -0.024805148933466, 0.36901534980333, -3.1161318213925, -0.32961626538917 ], dtype='d') Ii = array([1, 1, 1, 2, 2, 3], dtype='d') Ji = array([1, 2, 3, 3, 9, 7], dtype='d') ni = array([ 0.0015736404855259, 0.00090153761673944, -0.0050270077677648, 2.2440037409485e-06, -4.1163275453471e-06, 3.7919454822955e-08 ], dtype='d') pi = self.p / Pressure(1).unit('MPa') tau = Temperature(1000) / self.T if value == 'gamma': return (self._basic_equation5('gamma_0') + self._basic_equation5('gamma_r')) elif value == 'gamma_0': return log(pi) + sum(n0 * (tau**J0)) elif value == 'gamma_r': return sum(ni * (pi**Ii) * (tau**Ji)) elif value == 'gamma_0_pi': return 1 / pi elif value == 'gamma_0_pi_pi': return -1 / (pi**2) elif value == 'gamma_0_tau': return sum(n0 * J0 * (tau**(J0 - 1))) elif value == 'gamma_0_tau_tau': sum(n0 * J0 * (J0 - 1) * (tau**(J0 - 2))) elif value == 'gamma_0_tau_pi' or value == 'gamma_0_pi_tau': return 0 + 0 elif value == 'gamma_r_pi': return sum(ni * Ii * (pi**(Ii - 1)) * (tau**Ji)) elif value == 'gamma_r_tau': return sum(ni * (pi**Ii) * Ji * (tau**(Ji - 1))) elif value == 'gamma_r_pi_pi': return sum(ni * Ii * (Ii - 1) * (pi**(Ii - 2)) * (tau**Ji)) elif value == 'gamma_r_tau_tau': return sum(ni * (pi**Ii) * Ji * (Ji - 1) * (tau**(Ji - 2))) elif value == 'gamma_r_tau_pi' or 'gamma_r_pi_tau': return sum(ni * Ii * (pi**(Ii - 1)) * Ji * (tau**(Ji - 1))) def gibbs_energy(self, p=None, T=None): """Returns the Gibbs Energy given p and T in kJ/kg.""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: return self._basic_equation1('gamma') * self.R * T elif self._is_in_region() == 2: return self._basic_equation2('gamma') * self.R * T elif self._is_in_region() == 3: pass elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass def specific_volume(self, p=None, T=None): """Returns the specific volume in m³/kg""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: pi = self.p / Pressure(16.53).unit('MPa') return (self._basic_equation1('gamma_pi') * self.R * self.T * pi / self.p * 1e3) # because of kJ in R elif self._is_in_region() == 2: pi = self.p / Pressure(1).unit('MPa') return (pi * (self._basic_equation2('gamma_0_pi') + self._basic_equation2('gamma_r_pi')) * self.R * self.T / self.p * 1e3) elif self._is_in_region() == 3: return None elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass return -1 def internal_energy(self, p=None, T=None): """NOT IMPLEMENTED""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: pi = self.p / Pressure(16.53).unit('MPa') tau = Temperature(1386) / self.T return (tau * self._basic_equation1('gamma_tau') - pi * self._basic_equation1('gamma_pi')) * self.R * self.T elif self._is_in_region() == 2: pi = self.p / Pressure(1).unit('MPa') tau = 540 / self.T return (tau * (self._basic_equation2('gamma_0_tau') + self._basic_equation2('gamma_r_tau')) - pi * (self._basic_equation2('gamma_0_pi') + self._basic_equation2('gamma_r_pi'))) * self.R * self.T elif self._is_in_region() == 3: pass elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass return -1 def entropy(self, p=None, T=None): """NOT IMPLEMENTED""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: pi = self.p / Pressure(16.53).unit('MPa') tau = Temperature(1386) / self.T return (tau * self._basic_equation1('gamma_tau') - self._basic_equation1('gamma')) * self.R elif self._is_in_region() == 2: pi = self.p / Pressure(1).unit('MPa') tau = 540 / self.T return ((tau * (self._basic_equation2('gamma_0_tau') + self._basic_equation2('gamma_r_tau')) - (self._basic_equation2('gamma_0') + self._basic_equation2('gamma_r'))) * self.R) elif self._is_in_region() == 3: pass elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass return -1 def enthalpy(self, p=None, T=None): """Returns the enthalpy given p and T in kJ/kg.""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: return Enthalpy(self._basic_equation1('gamma_tau') * 1386 * self.R) elif self._is_in_region() == 2: return Enthalpy(540 * self.R * (self._basic_equation2('gamma_0_tau') + self._basic_equation2('gamma_r_tau'))) elif self._is_in_region() == 3: # for region 3 rho needs to be solved numerically reg3_solved = self._basic_equation3('PHI_delta') delta = reg3_solved[1] / self.rhoc tau = self.Tc / self.T return Enthalpy((tau * self._basic_equation3('PHI_tau')[0] + delta * reg3_solved[0]) * self.R * self.T) elif self._is_in_region() == 4: return None elif self._is_in_region() == 5: pi = self.p / Pressure(1).unit('MPa') tau = Temperature(1000) / self.T return (tau * (self._basic_equation5('gamma_0_tau') + self._basic_equation5('gamma_r_tau')) * self.R * self.T) def heat_capacity(self, p=None, T=None): """Returns the isobaric heat capacity given p and T in kJ/(kg K).""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: tau = 1386 / T return (-1 * tau * tau * self.R * self._basic_equation1('gamma_tau_tau')) elif self._is_in_region() == 2: pass elif self._is_in_region() == 3: delta = rho / self.rhoc tau = self.Tc / self.T return ( -tau**2 / self._basic_equation3('PHI_tau_tau') + (delta * self._basic_equation3('PHI_delta') - delta * tau * self._basic_equation3('PHI_tau_delta'))**2 / (2 * delta * self._basic_equation3('PHI_delta') + delta**2 * self._basic_equation3('PHI_delta_delta'))) * self.R elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass return -1 def heat_capacity_constant_v(self, p=None, T=None): """NOT IMPLEMENTED""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: pi = self.p / Pressure(16.53).unit('MPa') tau = Temperature(1386) / self.T return (-(tau**2) * self._basic_equation1('gamma_tau_tau') + ((self._basic_equation1('gamma_pi') - tau * self._basic_equation1('gamma_pi_tau'))**2) / self._basic_equation1('gamma_pi_pi')) * self.R elif self._is_in_region() == 2: pass elif self._is_in_region() == 3: pass elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass return -1 def speed_of_sound(self, p=None, T=None): """NOT IMPLEMENTED""" if p is None: p = self.p else: p = Pressure(p) if T is None: T = self.T else: T = Temperature(T) if self._is_in_region() == 1: pi = self.p / Pressure(16.53).unit('MPa') tau = Temperature(1386) / self.T inside_frac = (((self._basic_equation1('gamma_pi') - tau * self._basic_equation1('gamma_tau_pi'))**2) / ((tau**2) * self._basic_equation1('gamma_tau_tau'))) return sqrt( ((self._basic_equation1('gamma_pi')**2) / (inside_frac - self._basic_equation1('gamma_pi_pi'))) * self.R * self.T * 1000) elif self._is_in_region() == 2: pass elif self._is_in_region() == 3: pass elif self._is_in_region() == 4: pass elif self._is_in_region() == 5: pass return -1
def _basic_equation2(self, value='gamma'): """Returns equation 1 and its derivatives, ex: 'gamma', 'gamma_tau', 'gamma_tau_pi', etc.""" # region2; ideal part J0 = array([0, 1, -5, -4, -3, -2, -1, 2, 3], dtype='d') n0 = array([ -9.6927686500217, 10.086655968018, -0.005608791128302, 0.071452738081455, -0.40710498223928, 1.4240819171444, -4.383951131945, -0.28408632460772, 0.021268463753307 ], dtype='d') # region2; real part Ii = array([ 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10, 16, 16, 18, 20, 20, 20, 21, 22, 23, 24, 24, 24 ], dtype='d') Ji = array([ 0, 1, 2, 3, 6, 1, 2, 4, 7, 36, 0, 1, 3, 6, 35, 1, 2, 3, 7, 3, 16, 35, 0, 11, 25, 8, 36, 13, 4, 10, 14, 29, 50, 57, 20, 35, 48, 21, 53, 39, 26, 40, 58 ], dtype='d') ni = array([ -0.0017731742473213, -0.017834862292358, -0.045996013696365, -0.057581259083432, -0.05032527872793, -3.3032641670203e-05, -0.00018948987516315, -0.0039392777243355, -0.043797295650573, -2.6674547914087e-05, 2.0481737692309e-08, 4.3870667284435e-07, -3.227767723857e-05, -0.0015033924542148, -0.040668253562649, -7.8847309559367e-10, 1.2790717852285e-08, 4.8225372718507e-07, 2.2922076337661e-06, -1.6714766451061e-11, -0.0021171472321355, -23.895741934104, -5.905956432427e-18, -1.2621808899101e-06, -0.038946842435739, 1.1256211360459e-11, -8.2311340897998, 1.9809712802088e-08, 1.0406965210174e-19, -1.0234747095929e-13, -1.0018179379511e-09, -8.0882908646985e-11, 0.10693031879409, -0.33662250574171, 8.9185845355421e-25, 3.0629316876232e-13, -4.2002467698208e-06, -5.9056029685639e-26, 3.7826947613457e-06, -1.2768608934681e-15, 7.3087610595061e-29, 5.5414715350778e-17, -9.436970724121e-07 ], dtype='d') pi = self.p / Pressure(1).unit('MPa') tau = 540 / self.T # arrays if value == 'gamma': return (self._basic_equation2('gamma_0') + self._basic_equation2('gamma_r')) elif value == 'gamma_0': return log(pi) + sum(n0 * (tau**J0)) elif value == 'gamma_r': return sum(ni * (pi**Ii) * (tau - 0.5)**Ji) elif value == 'gamma_0_pi': return 1 / pi elif value == 'gamme_0_pi_pi': return -1 / (pi**2) elif value == 'gamma_0_tau': return 0 + sum(n0 * J0 * (tau**(J0 - 1))) elif value == 'gamma_0_tau_tau': return 0 + sum(n0 * J0 * (J0 - 1) * tau**(J0 - 2)) elif value == 'gamma_0_pi_tau' or value == 'gamma_0_tau_pi': return 0 elif value == 'gamma_r_pi': return sum(ni * Ii * (pi**(Ii - 1)) * ((tau - 0.5)**Ji)) elif value == 'gamma_r_tau': return sum(ni * (pi**Ii) * Ji * (tau - 0.5)**(Ji - 1)) elif value == 'gamma_r_pi_pi': return sum(ni * Ii * (Ii - 1) * (pi**(Ii - 2))(tau - 0.5)**Ji) elif value == 'gamma_r_tau_tau': return sum(ni * (pi**Ii) * Ji * (Ji - 1) * (tau - 0.5)**(Ji - 2)) elif value == 'gamma_pi_tau' or value == 'gamma_tau_pi': pass
def test_iapws(): """ Tests are given inside the IAPWS document. See references for more details. """ #test Tsat given P assert round(Water(1e5, 373.15).temperature_saturation(0.1e6), 6) == 372.755919 assert round(Water(1e5, 373.15).temperature_saturation(1e6), 6) == 453.035632 assert round(Water(1e5, 373.15).temperature_saturation(10e6), 6) == 584.149488 #test Psat given T assert round(Water(1e5, 373.15).pressure_saturation(300).MPa, 11) == 0.00353658941 assert round(Water(1e5, 373.15).pressure_saturation(500).MPa, 8) == 2.63889776 assert round(Water(1e5, 373.15).pressure_saturation(600).MPa, 7) == 12.3443146 #test regions # arbitrary points point_in_region1 = (Pressure(20e6), Temperature(300)) point_in_region2 = (Pressure(1e5), Temperature(373.15)) point_in_region3 = (Pressure(40e6), Temperature(700)) point_in_region4 = (Pressure(1).unit('atm'), Temperature(373.1243)) point_in_region5 = (Pressure(20e6), Temperature(1500)) assert Water(*point_in_region1)._is_in_region() == 1 assert Water(*point_in_region2)._is_in_region() == 2 assert Water(*point_in_region3)._is_in_region() == 3 # region 4 does not exist as a region; it is rather the saturation line assert Water(*point_in_region5)._is_in_region() == 5 #region 1 #assert specific volume assert round(Water(3e6, 300, massic_basis=True).specific_volume(), 11) == 0.00100215168 assert round(Water(80e6, 300, massic_basis=True).specific_volume(), 12) == 0.000971180894 assert round(Water(3e6, 500, massic_basis=True).specific_volume(), 11) == 0.00120241800 # # #assert internal energy assert round(Water(3e6, 300, massic_basis=True).internal_energy(), 6) == 112.324818 assert round(Water(80e6, 300, massic_basis=True).internal_energy(), 6) == 106.448356 assert round(Water(3e6, 500, massic_basis=True).internal_energy(), 6) == 971.934985 # # #assert enthropy assert round(Water(3e6, 300, massic_basis=True).entropy(), 9) == 0.392294792 assert round(Water(80e6, 300, massic_basis=True).entropy(), 9) == 0.368563852 assert round(Water(3e6, 500, massic_basis=True).entropy(), 8) == 2.58041912 #assert enthalpy assert round(Water(3e6, 300, massic_basis=True).enthalpy(), 6) == 115.331273 assert round(Water(80e6, 300, massic_basis=True).enthalpy(), 6) == 184.142828 assert round(Water(3e6, 500, massic_basis=True).enthalpy(), 6) == 975.542239 #assert cp assert round(Water(3e6, 300, massic_basis=True).heat_capacity(), 8) == 4.17301218 assert round(Water(80e6, 300, massic_basis=True).heat_capacity(), 8) == 4.01008987 assert round(Water(3e6, 500, massic_basis=True).heat_capacity(), 8) == 4.65580682 # #assert cv # assert round(Water(3e6, 300).enthalpy(),6) == 115.331273 # assert round(Water(80e6, 300).enthalpy(),6) == 184.142828 # assert round(Water(3e6, 500).enthalpy(),6) == 975.542239 # #assert speed of sound assert round(Water(3e6, 300, massic_basis=True).speed_of_sound(), 5) == 1507.73921 assert round(Water(80e6, 300, massic_basis=True).speed_of_sound(), 5) == 1634.69054 assert round(Water(3e6, 500, massic_basis=True).speed_of_sound(), 5) == 1240.71337 #region 2 #assert specific volume assert round(Water(3500, 300, massic_basis=True).specific_volume(), 7) == 39.4913866 assert round(Water(3500, 700, massic_basis=True).specific_volume(), 7) == 92.3015898 assert round(Water(30e6, 700, massic_basis=True).specific_volume(), 11) == 0.00542946619 # # #assert internal energy assert round(Water(3500, 300, massic_basis=True).internal_energy(), 5) == 2411.69160 assert round(Water(3500, 700, massic_basis=True).internal_energy(), 5) == 3012.62819 assert round(Water(30e6, 700, massic_basis=True).internal_energy(), 5) == 2468.61076 # # #assert enthropy assert round(Water(3500, 300, massic_basis=True).entropy(), 8) == 8.52238967 assert round(Water(3500, 700, massic_basis=True).entropy(), 7) == 10.1749996 assert round(Water(30e6, 700, massic_basis=True).entropy(), 8) == 5.17540298 #assert enthalpy assert round(Water(3500, 300, massic_basis=True).enthalpy(), 5) == 2549.91145 assert round(Water(3500, 700, massic_basis=True).enthalpy(), 5) == 3335.68375 assert round(Water(30e6, 700, massic_basis=True).enthalpy(), 5) == 2631.49474 #assert cp # assert round(Water(3e6, 300).heat_capacity(),8) == 4.17301218 # assert round(Water(80e6, 300).heat_capacity(),8) == 4.01008987 # assert round(Water(3e6, 500).heat_capacity(),8) == 4.65580682 # #assert enthalpy # assert round(Water(3e6, 300).enthalpy(),6) == 115.331273 # assert round(Water(80e6, 300).enthalpy(),6) == 184.142828 # assert round(Water(3e6, 500).enthalpy(),6) == 975.542239 # # #assert enthalpy # assert round(Water(3e6, 300).enthalpy(),6) == 115.331273 # assert round(Water(80e6, 300).enthalpy(),6) == 184.142828 # assert round(Water(3e6, 500).enthalpy(),6) == 975.542239 #region 3 #assert specific volume # assert round(Water(3500, 300).specific_volume(),7) == 39.4913866 # assert round(Water(3500, 700).specific_volume(),7) == 92.3015898 # assert round(Water(30e6, 700).specific_volume(),11) == 0.00542946619 # # #assert internal energy # assert round(Water(3e6, 300).enthalpy(),6) == 115.331273 # assert round(Water(80e6, 300).enthalpy(),6) == 184.142828 # assert round(Water(3e6, 500).enthalpy(),6) == 975.542239 # # #assert enthropy # assert round(Water(3e6, 300).enthalpy(),6) == 115.331273 # assert round(Water(80e6, 300).enthalpy(),6) == 184.142828 # assert round(Water(3e6, 500).enthalpy(),6) == 975.542239 #assert enthalpy assert round(Water(25.5837018e6, 650, massic_basis=True).enthalpy(), 5) == 1863.43019 assert round(Water(22.2930643e6, 650, massic_basis=True).enthalpy(), 5) == round(2375.12401, 3) assert round(Water(78.3095639e6, 750, massic_basis=True).enthalpy(), 5) == 2258.68845 #assert cp # assert round(Water(3e6, 300).heat_capacity(),8) == 4.17301218 # assert round(Water(80e6, 300).heat_capacity(),8) == 4.01008987 # assert round(Water(3e6, 500).heat_capacity(),8) == 4.65580682 # #assert enthalpy # assert round(Water(3e6, 300).enthalpy(),6) == 115.331273 # assert round(Water(80e6, 300).enthalpy(),6) == 184.142828 # assert round(Water(3e6, 500).enthalpy(),6) == 975.542239 # # #assert enthalpy # assert round(Water(3e6, 300).enthalpy(),6) == 115.331273 # assert round(Water(80e6, 300).enthalpy(),6) == 184.142828 # assert round(Water(3e6, 500).enthalpy(),6) == 975.542239 # region 4 # There is no region 4; instead region 4 is the saturation line # region 5 #assert specific volume # assert round(Water(3500, 300).specific_volume(),7) == 39.4913866 # assert round(Water(3500, 700).specific_volume(),7) == 92.3015898 # assert round(Water(30e6, 700).specific_volume(),11) == 0.00542946619 # # #assert internal energy # assert round(Water(3e6, 300).enthalpy(),6) == 115.331273 # assert round(Water(80e6, 300).enthalpy(),6) == 184.142828 # assert round(Water(3e6, 500).enthalpy(),6) == 975.542239 # # #assert enthropy # assert round(Water(3e6, 300).enthalpy(),6) == 115.331273 # assert round(Water(80e6, 300).enthalpy(),6) == 184.142828 # assert round(Water(3e6, 500).enthalpy(),6) == 975.542239 #assert enthalpy assert round(Water(0.5e6, 1500, massic_basis=True).enthalpy(), 5) == 5219.76855 assert round(Water(30e6, 1500, massic_basis=True).enthalpy(), 5) == 5167.23514 assert round(Water(30e6, 2000, massic_basis=True).enthalpy(), 5) == 6571.22604