Source code for pyseaflux.vapour_pressure

"""
Water vapour pressure
---------------------
"""


[docs]def weiss1980(salt, temp_K, checks=False): """Water vapour pressure of seawater after Weiss and Price (1980) For a given salinity and temperature using the methods defined in Weiss (1974) Args: salt (array): salinity in PSU temp_K (array): temperature in deg Kelvin Returns: array: sea water vapour pressure in atm (:math:`pH_2O`) Examples: >>> vapress_weiss1980(35, 25+273.15) # tempC + 273.15 0.03065529996317971 References: Weiss, R. (1974). Carbon dioxide in water and seawater: the solubility of a non-ideal gas. Marine Chemistry, 2(3), 203–215. https://doi.org/10.1016/0304-4203(74)90015-2 Weiss, R., & Price, B. a. (1980). Nitrous oxide solubility in water and seawater. Marine Chemistry, 8(4), 347–359. https://doi.org/10.1016/0304-4203(80)90024-9 """ from numpy import exp, log, nanmedian from xarray import DataArray if checks: if nanmedian(temp_K) > 270: raise ValueError("Temperature is not in Kelvin") if nanmedian(salt) > 50: raise ValueError("Salinity units are not correct") T = temp_K S = salt # Equation comes straight from Weiss and Price (1980) pH2O = exp(+24.4543 - 67.4509 * (100 / T) - 4.8489 * log(T / 100) - 0.000544 * S) if isinstance(pH2O, DataArray): pH2O = pH2O.assign_attrs( units="atm", description="Water vapour pressure based on Weiss (1980)" ) return pH2O
[docs]def dickson2007(salt, temp_K, checks=False): """Water vapour pressure of seawater after Dickson et al. (2007) Calculates :math:`pH_2O` at a given salinity and temperature using the methods defined in Dickson et al. (2007; CO2 manual) Parameters ---------- salt : np.array salinity temp_K : np.array temperature in deg Kelvin Returns ------- sea_vapress : np.array sea water vapour pressure in atm Examples -------- >>> vapress_dickson2007(35, 298.15) # from Dickson et al. (2007) Ch 5.3.2 0.030698866245809465 """ from numpy import exp, nanmedian from xarray import DataArray if checks: if nanmedian(temp_K) > 270: raise ValueError("Temperature is not in Kelvin") if nanmedian(salt) > 50: raise ValueError("Salinity units are not correct") T = temp_K S = salt ################################################### # WATER VAPOUR PRESSURE FOR PURE WATER ################################################### # alpha coefficients from Wafner and Pruss, (2002) a1 = -7.85951783 a2 = +1.84408259 a3 = -11.7866497 a4 = +22.6807411 a5 = -15.9618719 a6 = +1.80122502 # critical points for water Pc = 22.064 / 101325.0e-6 # convert to atmosphers Tc = 647.096 # zeta numbers correspond with alpha numbers z = 1 - T / Tc z1 = z z2 = z ** 1.5 z3 = z ** 3 z4 = z ** 3.5 z5 = z ** 4 z6 = z ** 7.5 # vapour pressure of pure water pure_water = Pc * exp( (Tc / T) * (a1 * z1 + a2 * z2 + a3 * z3 + a4 * z4 + a5 * z5 + a6 * z6) ) ################################################### # WATER VAPOUR PRESSURE FOR SEA WATER ################################################### # osmotic coefficients at 25C - Millero 1974 c0 = +0.90799 c1 = -0.08992 c2 = +0.18458 c3 = -0.07395 c4 = -0.00221 # total molality of dissolved species total_molality = 31.998 * S / (1e3 - 1.005 * S) B1 = total_molality * 0.5 B2 = B1 ** 2 B3 = B1 ** 3 B4 = B1 ** 4 osmotic_coeff = c0 + c1 * B1 + c2 * B2 + c3 * B3 + c4 * B4 seawater = pure_water * exp(-0.018 * osmotic_coeff * total_molality) if isinstance(seawater, DataArray): seawater = seawater.assign_attrs( units="atm", description="Water vapour pressure based on Dickson et al. (2007)", ) return seawater