mirror of
https://gitlab.astro-wise.org/micado/atmosphericmodel.git
synced 2026-10-29 20:51:05 +00:00
Added TPH dependency to Edlen and BonschPotulski functions.
This commit is contained in:
1 parent
160818cdf7
commit
7771c59268
2 files changed
+97
-16
No files matched your search
@@ -36,9 +36,9 @@ def BarrellAndSears(l, T=288.15, p=101325, RH=0, f=None):
|
|||||||
'''
|
'''
|
||||||
if f is None:
|
if f is None:
|
||||||
f = RH * svp(T)
|
f = RH * svp(T)
|
||||||
f_mmHg = hPA2mmHg(f/100)
|
f_mmHg = hPa2mmHg(f/100)
|
||||||
T = K2C(T)
|
T = K2C(T)
|
||||||
P = hPA2mmHg(p/100)
|
P = hPa2mmHg(p/100)
|
||||||
R = (0.378125 + 0.0021414 / l**2 + 0.00001793 / l**4) * (P*(1 + (1.049 - 0.0157*T) * P * 1e-6)/(1 + 0.003661*T)) - (0.0624 - 0.000680 / l**2) * f_mmHg / (1 + 0.003661*T)
|
R = (0.378125 + 0.0021414 / l**2 + 0.00001793 / l**4) * (P*(1 + (1.049 - 0.0157*T) * P * 1e-6)/(1 + 0.003661*T)) - (0.0624 - 0.000680 / l**2) * f_mmHg / (1 + 0.003661*T)
|
||||||
n = R/1e6 + 1
|
n = R/1e6 + 1
|
||||||
return n
|
return n
|
||||||
@@ -55,6 +55,8 @@ def Ciddor(l, CO2=450):
|
|||||||
----------
|
----------
|
||||||
l : float
|
l : float
|
||||||
Wavelength in microns
|
Wavelength in microns
|
||||||
|
CO2 : float
|
||||||
|
CO2 density in parts per million
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
@@ -86,6 +88,8 @@ def Edlen1953(l, T=288.15, p=101325, RH=0, f=None):
|
|||||||
Temperature in Kelvin
|
Temperature in Kelvin
|
||||||
p : float
|
p : float
|
||||||
Atmospheric pressure in Pascal
|
Atmospheric pressure in Pascal
|
||||||
|
RH : float
|
||||||
|
Relative humidity (0=<H=<1)
|
||||||
f : float
|
f : float
|
||||||
Water vapor pressure in Pascal
|
Water vapor pressure in Pascal
|
||||||
|
|
||||||
@@ -98,11 +102,11 @@ def Edlen1953(l, T=288.15, p=101325, RH=0, f=None):
|
|||||||
R = 6432.8 + 2949810 / (146 - s**2) + 25540/(41-s**2)
|
R = 6432.8 + 2949810 / (146 - s**2) + 25540/(41-s**2)
|
||||||
n_standard = R/1e8 + 1
|
n_standard = R/1e8 + 1
|
||||||
|
|
||||||
pHg = hPA2mmHg(p/100)
|
pHg = hPa2mmHg(p/100)
|
||||||
Tc = K2C(T)
|
Tc = K2C(T)
|
||||||
if f is None:
|
if f is None:
|
||||||
f = RH * svp(T)
|
f = RH * svp(T)
|
||||||
f_mmHg = hPA2mmHg(f/100)
|
f_mmHg = hPa2mmHg(f/100)
|
||||||
|
|
||||||
# Changes in temperature and pressure, from Barrell (1951)
|
# Changes in temperature and pressure, from Barrell (1951)
|
||||||
n_tp = R/1e8 * (pHg * (1 + (1.049 - 0.0157*Tc) * 1e-6 * pHg ) ) / ( 720.883 * (1 + 0.003661 * Tc)) + 1
|
n_tp = R/1e8 * (pHg * (1 + (1.049 - 0.0157*Tc) * 1e-6 * pHg ) ) / ( 720.883 * (1 + 0.003661 * Tc)) + 1
|
||||||
@@ -113,10 +117,10 @@ def Edlen1953(l, T=288.15, p=101325, RH=0, f=None):
|
|||||||
return n
|
return n
|
||||||
|
|
||||||
|
|
||||||
def Edlen1966(l):
|
def Edlen1966(l, T=288.15, p=101325, RH=0, CO2=300, f=None):
|
||||||
'''
|
'''
|
||||||
From Edlen, 1966
|
From Edlen, 1966
|
||||||
Equation 1
|
Equations 1, 12, 17, 22
|
||||||
|
|
||||||
At standard conditions only
|
At standard conditions only
|
||||||
|
|
||||||
@@ -124,6 +128,16 @@ def Edlen1966(l):
|
|||||||
----------
|
----------
|
||||||
l : float
|
l : float
|
||||||
Wavelength in microns
|
Wavelength in microns
|
||||||
|
T : float
|
||||||
|
Temperature in Kelvin
|
||||||
|
p : float
|
||||||
|
Atmospheric pressure in Pascal
|
||||||
|
RH : float
|
||||||
|
Relative humidity (0=<H=<1)
|
||||||
|
CO2 : float
|
||||||
|
CO2 density in parts per million
|
||||||
|
f : float
|
||||||
|
Water vapor pressure in Pascal
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
@@ -133,6 +147,27 @@ def Edlen1966(l):
|
|||||||
s = 1 / l
|
s = 1 / l
|
||||||
R = 8342.13 + 2406030 / (130 - s**2) + 15997 / (38.9 - s**2)
|
R = 8342.13 + 2406030 / (130 - s**2) + 15997 / (38.9 - s**2)
|
||||||
n = R/1e8 + 1
|
n = R/1e8 + 1
|
||||||
|
|
||||||
|
# Influence of temperature and pressure, eq. 12
|
||||||
|
Tc = K2C(T)
|
||||||
|
Ptorr = Pa2Torr(p)
|
||||||
|
R_tp = ( Ptorr * R/1e8 ) / 720.775 * (1 + Ptorr * (0.817 - 0.0133 * Tc) * 1e-6) / ( 1 + 0.0036610 * Tc)
|
||||||
|
|
||||||
|
# Allow for a CO2 fraction, eq. 17, but we include T and P dependence.
|
||||||
|
# This is okay from "Asthe refractivity of CO, is about 50% higher than
|
||||||
|
# that of air this CO,-content increases the refractivity over that of
|
||||||
|
# CO2-free air by approximately 0.5 x 0.0003 x (n-1)s" and "As the
|
||||||
|
# density factor of CO, is not much different from that of air this ratio r
|
||||||
|
# can be taken as independent of t and p ."
|
||||||
|
R_x = R_tp * (1 + 0.540 * (CO2/1e6 - 0.0003))
|
||||||
|
n_x = R_x + 1
|
||||||
|
|
||||||
|
# Correction for water vapour, eq. 22
|
||||||
|
if f is None:
|
||||||
|
f = RH * svp(T)
|
||||||
|
ftorr = Pa2Torr(f)
|
||||||
|
|
||||||
|
n = n_x - ftorr * (5.7224 - 0.0457 * s**2) * 1e-8
|
||||||
return n
|
return n
|
||||||
|
|
||||||
|
|
||||||
@@ -159,7 +194,7 @@ def Owens(l, T=288.15, p=101325, RH=0):
|
|||||||
n : float
|
n : float
|
||||||
Refractive index of atmospheric air at the given conditions
|
Refractive index of atmospheric air at the given conditions
|
||||||
'''
|
'''
|
||||||
P = hPA2mmHg(p/100)
|
P = hPa2mmHg(p/100)
|
||||||
T = K2C(T)
|
T = K2C(T)
|
||||||
s = 1 / l
|
s = 1 / l
|
||||||
R = 8342.13 + 2406030 / (130 - s**2) + 15997 / (38.9 - s**2) * (P/720.775) * ((1 + P * (0.817 - 0.0133) * 1e-6)/(1 + 0.0036610*T)) - RH * (5.722 - 0.0457*s**2)
|
R = 8342.13 + 2406030 / (130 - s**2) + 15997 / (38.9 - s**2) * (P/720.775) * ((1 + P * (0.817 - 0.0133) * 1e-6)/(1 + 0.0036610*T)) - RH * (5.722 - 0.0457*s**2)
|
||||||
@@ -167,10 +202,10 @@ def Owens(l, T=288.15, p=101325, RH=0):
|
|||||||
return n
|
return n
|
||||||
|
|
||||||
|
|
||||||
def BonschPotulski(l, T=288.15, p=101325, CO2=450):
|
def BonschPotulski(l, T=288.15, p=101325, RH=0, CO2=400, f=None):
|
||||||
'''
|
'''
|
||||||
From Bonsch & Potulski, 1998
|
From Bonsch & Potulski, 1998
|
||||||
Equations 6, 7, 8
|
Equations 6, 7, 8 and 9a
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
@@ -180,8 +215,12 @@ def BonschPotulski(l, T=288.15, p=101325, CO2=450):
|
|||||||
Temperature in Kelvin
|
Temperature in Kelvin
|
||||||
p : float
|
p : float
|
||||||
Atmospheric pressure in Pa
|
Atmospheric pressure in Pa
|
||||||
|
RH : float
|
||||||
|
Relative humidity (0<=H<=1)
|
||||||
CO2 : float
|
CO2 : float
|
||||||
Particles per million of CO2
|
Particles per million of CO2
|
||||||
|
f : float
|
||||||
|
Water vapor pressure in Pascal
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
@@ -189,14 +228,19 @@ def BonschPotulski(l, T=288.15, p=101325, CO2=450):
|
|||||||
Refractive index of atmospheric air at the given conditions
|
Refractive index of atmospheric air at the given conditions
|
||||||
'''
|
'''
|
||||||
x = CO2 / 1e6
|
x = CO2 / 1e6
|
||||||
T = K2C(T)
|
Tc = K2C(T)
|
||||||
s = 1 / l
|
s = 1 / l
|
||||||
# Rs = 8092.33 + 2333983 / (130 - s**2) + 15518 / (38.9 - s**2)
|
|
||||||
Rs = 8091.37 + 2333983 / (130 - s**2) + 15518 / (38.9 - s**2)
|
Rs = 8091.37 + 2333983 / (130 - s**2) + 15518 / (38.9 - s**2)
|
||||||
Rs = Rs / 1e8
|
Rs = Rs / 1e8
|
||||||
Rx = Rs * (1 + 0.5327 * (x - 0.0004))
|
Rx = Rs * (1 + 0.5327 * (x - 0.0004))
|
||||||
Rtp = Rx * p / 93214.60 * (1 + 1e-8 * (0.5953 - 0.009876 * T)*p) / (1 + 0.0036610 * T)
|
Rtp = Rx * p / 93214.60 * (1 + 1e-8 * (0.5953 - 0.009876 * Tc)*p) / (1 + 0.0036610 * Tc)
|
||||||
n = Rtp + 1
|
|
||||||
|
if f is None:
|
||||||
|
f = RH * svp(T)
|
||||||
|
|
||||||
|
n_tp = Rtp + 1
|
||||||
|
n = n_tp - f * (3.8020 - 0.0384 * s**2) * 1e-10
|
||||||
return n
|
return n
|
||||||
|
|
||||||
|
|
||||||
@@ -490,7 +534,7 @@ def Mathar(l, T=288.15, p=101325, RH=0):
|
|||||||
σref = 1e4/20 # cm^−1, reference wavenumber
|
σref = 1e4/20 # cm^−1, reference wavenumber
|
||||||
Tref = 273.15+17.5 # K, reference temperature
|
Tref = 273.15+17.5 # K, reference temperature
|
||||||
pref = 75000 # Pa, reference pressure
|
pref = 75000 # Pa, reference pressure
|
||||||
Href = 10 #%, reference humdity in percent
|
Href = 10 # %, reference humdity in percent
|
||||||
########################################################################
|
########################################################################
|
||||||
|
|
||||||
s = 1e4/l # cm^-1
|
s = 1e4/l # cm^-1
|
||||||
@@ -525,7 +569,7 @@ def K2C(K):
|
|||||||
return K - 273.15
|
return K - 273.15
|
||||||
|
|
||||||
|
|
||||||
def hPA2mmHg(hPa):
|
def hPa2mmHg(hPa):
|
||||||
'''
|
'''
|
||||||
hPa to mmHg conversion
|
hPa to mmHg conversion
|
||||||
|
|
||||||
@@ -542,6 +586,24 @@ def hPA2mmHg(hPa):
|
|||||||
return 0.7500616827 * hPa
|
return 0.7500616827 * hPa
|
||||||
|
|
||||||
|
|
||||||
|
def Pa2Torr(Pa):
|
||||||
|
'''
|
||||||
|
Pa to Torr conversion
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
Pa : float
|
||||||
|
Atmospheric pressure in Pa (Pascal)
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
Torr : float
|
||||||
|
Atmospheric pressure in Torr
|
||||||
|
'''
|
||||||
|
|
||||||
|
return Pa * 760/101325
|
||||||
|
|
||||||
|
|
||||||
def svp(T):
|
def svp(T):
|
||||||
'''
|
'''
|
||||||
Saturation vapour pressure in Pa.
|
Saturation vapour pressure in Pa.
|
||||||
|
|||||||
@@ -81,7 +81,26 @@ class atmosphericModel:
|
|||||||
def slalib(self, l=None):
|
def slalib(self, l=None):
|
||||||
if not l:
|
if not l:
|
||||||
l = self.lrange
|
l = self.lrange
|
||||||
return(AstroAtmosphere.slalib(l, T=self.T, p=self.P, RH=self.H)-1)
|
try:
|
||||||
|
from pyslalib import slalib
|
||||||
|
return(AstroAtmosphere.slalib(l, T=self.T, p=self.P, RH=self.H)-1)
|
||||||
|
except ImportError as e:
|
||||||
|
print('Could not import pyslalib.slalib. Using slower Python native function sla_refro().')
|
||||||
|
h=0
|
||||||
|
lat=-24
|
||||||
|
tlr=0.0065
|
||||||
|
eps=1e-10
|
||||||
|
zObs = np.deg2rad(45.07182)
|
||||||
|
p = self.P/100
|
||||||
|
R = []
|
||||||
|
if type(l) == float:
|
||||||
|
l = [l]
|
||||||
|
for wl in l:
|
||||||
|
R.append(AstroAtmosphere.sla_refro(zObs, h, self.T, p, self.H, wl, lat, tlr, eps))
|
||||||
|
if len(l) == 1:
|
||||||
|
return R[0]
|
||||||
|
else:
|
||||||
|
return np.asarray(R)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
Reference in new issue
Block a user