mirror of
https://github.com/CoolProp/CoolProp.git
synced 2026-02-03 10:24:58 -05:00
Closes https://github.com/CoolProp/CoolProp/issues/125 Signed-off-by: Ian Bell <ian.h.bell@gmail.com>
144 lines
7.5 KiB
Cython
144 lines
7.5 KiB
Cython
#This file gets directly included in CoolProp.pyx, separate here for cleanness of code
|
|
|
|
cpdef HAPropsSI(string OutputName, string Input1Name, Input1, string Input2Name, Input2, string Input3Name, Input3):
|
|
"""
|
|
Copyright Ian Bell, 2011 email: ian.h.bell@gmail.com
|
|
|
|
The function is called like
|
|
|
|
HAPropsSI('H','T',298.15,'P',101325,'R',0.5)
|
|
|
|
which will return the enthalpy of the air for a set of inputs of dry bulb temperature of 25C, atmospheric pressure, and a relative humidity of 50%.
|
|
|
|
This function implements humid air properties based on the analysis in ASHRAE RP-1845 which is available online: http://rp.ashrae.biz/page/ASHRAE-D-RP-1485-20091216.pdf
|
|
|
|
It employs real gas properties for both air and water, as well as the most accurate interaction parameters and enhancement factors. The IAPWS-95 formulation for the properties of water is used throughout in preference to the industrial formulation. It is unclear why the industrial formulation is used in the first place.
|
|
|
|
Since humid air is nominally a binary mixture, three variables are needed to fix the state. At least one of the input parameters must be dry-bulb temperature, relative humidity, dew-point temperature, or humidity ratio. The others will be calculated. If the output variable is a transport property (conductivity or viscosity), the state must be able to be found directly - i.e. make sure you give temperature and relative humidity or humidity ratio. The list of possible input variables are
|
|
|
|
======== ======== ========================================
|
|
String Aliases Description
|
|
======== ======== ========================================
|
|
T Tdb Dry-Bulb Temperature [K]
|
|
B Twb Wet-Bulb Temperature [K]
|
|
D Tdp Dew-Point Temperature [K]
|
|
P Pressure [Pa]
|
|
V Vda Mixture volume [m3/kg dry air]
|
|
R RH Relative humidity in (0,1) [-]
|
|
W Omega Humidity Ratio [kg water/kg dry air]
|
|
H Hda Mixture enthalpy [J/kg dry air]
|
|
S Sda Mixture entropy [J/kg dry air/K]
|
|
C cp Mixture specific heat [J/kg dry air/K]
|
|
M Visc Mixture viscosity [Pa-s]
|
|
K Mixture thermal conductivity [W/m/K]
|
|
======== ======== ========================================
|
|
|
|
There are also strings for the mixture volume and mixture enthalpy that will return the properties on a total humid air flow rate basis, they are given by 'Vha' [units of m^3/kg humid air] and 'Cha' [units of kJ/kg humid air/K] and 'Hha' [units of kJ/kg humid air] respectively.
|
|
|
|
For more information, go to http://www.coolprop.org
|
|
"""
|
|
|
|
if isinstance(Input1, (int, long, float, complex)) and isinstance(Input2, (int, long, float, complex)) and isinstance(Input3, (int, long, float, complex)):
|
|
val = _HAPropsSI(OutputName, Input1Name, Input1, Input2Name, Input2, Input3Name, Input3)
|
|
|
|
if math.isinf(val) or math.isnan(val):
|
|
err_string = _get_global_param_string('errstring')
|
|
if not len(err_string) == 0:
|
|
raise ValueError("{err:s} :: inputs were:\"{out:s}\",\"{in1n:s}\",{in1:0.16e},\"{in2n:s}\",{in2:0.16e},\"{in3n:s}\",{in3:0.16e} ".format(err=err_string,out=OutputName,in1n=Input1Name,in1=Input1,in2n=Input2Name,in2=Input2,in3n=Input3Name,in3=Input3))
|
|
else:
|
|
raise ValueError("HAProps failed ungracefully with inputs: \"{out:s}\",\"{in1n:s}\",{in1:0.16e},\"{in2n:s}\",{in2:0.16e},\"{in3n:s}\",{in3:0.16e} ".format(out=OutputName,in1n=Input1Name,in1=Input1,in2n=Input2Name,in2=Input2,in3n=Input3Name,in3=Input3))
|
|
|
|
return val #Error raised by HAProps on failure
|
|
|
|
# At least one is iterable, convert non-iterable to a list of the same length
|
|
elif iterable(Input1) or iterable(Input2) or iterable(Input3):
|
|
|
|
iterable_lengths = []
|
|
if iterable(Input1):
|
|
iterable_lengths.append(len(Input1))
|
|
if iterable(Input2):
|
|
iterable_lengths.append(len(Input2))
|
|
if iterable(Input3):
|
|
iterable_lengths.append(len(Input3))
|
|
|
|
if not len(set(iterable_lengths)) == 1:
|
|
raise TypeError("Iterable inputs are not all the same length. Lengths: "+str(iterable_lengths))
|
|
else:
|
|
L = iterable_lengths[0]
|
|
|
|
if not iterable(Input1):
|
|
Input1vec = [Input1]*L
|
|
else:
|
|
Input1vec = Input1
|
|
|
|
if not iterable(Input2):
|
|
Input2vec = [Input2]*L
|
|
else:
|
|
Input2vec = Input2
|
|
|
|
if not iterable(Input3):
|
|
Input3vec = [Input3]*L
|
|
else:
|
|
Input3vec = Input3
|
|
|
|
vals = []
|
|
|
|
for _Input1, _Input2, _Input3 in zip(Input1vec, Input2vec, Input3vec):
|
|
val = _HAPropsSI(OutputName, Input1Name, _Input1, Input2Name, _Input2, Input3Name, _Input3)
|
|
|
|
if math.isinf(val) or math.isnan(val):
|
|
err_string = _get_global_param_string('errstring')
|
|
if not len(err_string) == 0:
|
|
raise ValueError("{err:s} :: inputs were:\"{out:s}\",\"{in1n:s}\",{in1:0.16e},\"{in2n:s}\",{in2:0.16e},\"{in3n:s}\",{in3:0.16e}".format(err=err_string,out=OutputName,in1n=Input1Name,in1=_Input1,in2n=Input2Name,in2=_Input2,in3n=Input3Name,in3=_Input3))
|
|
else:
|
|
raise ValueError("HAPropsSI failed ungracefully with inputs: \"{out:s}\",\"{in1n:s}\",{in1:0.16e},\"{in2n:s}\",{in2:0.16e},\"{in3n:s}\",{in3:0.16e} ".format(out=OutputName,in1n=Input1Name,in1=_Input1,in2n=Input2Name,in2=_Input2,in3n=Input3Name,in3=_Input3))
|
|
|
|
vals.append(val)
|
|
|
|
if _numpy_supported and isinstance(Input1, np.ndarray):
|
|
return np.array(vals).reshape(Input1.shape)
|
|
elif _numpy_supported and isinstance(Input2, np.ndarray):
|
|
return np.array(vals).reshape(Input2.shape)
|
|
elif _numpy_supported and isinstance(Input3, np.ndarray):
|
|
return np.array(vals).reshape(Input3.shape)
|
|
else:
|
|
return vals
|
|
|
|
else:
|
|
raise TypeError('Numerical inputs to HAPropsSI must be ints, floats, lists, or 1D numpy arrays.')
|
|
|
|
cpdef tuple HAProps_Aux(str OutputName, double T, double p, double w):
|
|
"""
|
|
Allows low-level access to some of the routines employed in HumidAirProps
|
|
|
|
Returns tuples of the form ``(Value, Units)`` where ``Value`` is the actual value and ``Units`` is a string that describes the units
|
|
|
|
The list of possible inputs is
|
|
|
|
* Baa [First virial air-air coefficient]
|
|
* Caaa [Second virial air coefficient]
|
|
* Bww [First virial water-water coefficient]
|
|
* Cwww [Second virial water coefficient]
|
|
* Baw [First cross virial coefficient]
|
|
* Caww [Second air-water-water virial coefficient]
|
|
* Caaw [Second air-air-water virial coefficient]
|
|
* beta_H
|
|
* kT
|
|
* vbar_ws [Molar saturated volume of water vapor]
|
|
* p_ws [Saturated vapor pressure of pure water (>=0.01C) or ice (<0.01 C)]
|
|
* f [Enhancement factor]
|
|
"""
|
|
#Convert all strings to byte-strings
|
|
cdef bytes units = (' '*100).encode('ascii')
|
|
cdef bytes _OutputName = OutputName.encode('ascii')
|
|
|
|
output = _HAProps_Aux(_OutputName,T,p,w,units)
|
|
units = units.strip()
|
|
units = units[0:len(units)-1] #Leave off the null character
|
|
return output, units
|
|
|
|
cpdef double cair_sat(double T):
|
|
"""
|
|
The derivative of the saturation enthalpy cair_sat = d(hsat)/dT
|
|
"""
|
|
return _cair_sat(T) |