5 Commits
Author SHA1 Message Date
yosata ee7134da7d Fixed Owens (1967) model 2022-07-06 12:19:31 +02:00
Joost van den Born 27abba5f5d Update README.md 2022-03-23 08:55:21 +00:00
yosata 03d583a9cd Improved quick functions 2022-03-23 08:42:45 +01:00
yosata 3cdf4ccd39 Added TPH dependence to BirchDowns() 2021-03-10 12:27:07 +01:00
yosata 2652d75eec Update README 2021-03-10 12:04:27 +01:00
4 changed files with 103 additions and 40 deletions

No files matched your search

+40 -14
View File
@@ -4,8 +4,9 @@ from .refractionModels import refraction
from .dispersionModels import dispersion from .dispersionModels import dispersion
from .neoslalib import sla_refro from .neoslalib import sla_refro
from .observatories import observatories from .observatories import observatories
from .refractivityModels import Edlen1953 from .refractivityModels import Edlen1953, Mathar
import numpy as np import numpy as np
import warnings
''' '''
@ Author: Joost van den Born @ Author: Joost van den Born
@@ -102,7 +103,9 @@ def quick_refractive_index(l, conditions='STANDARD', T=288.15, p=101325,
Parameters Parameters
---------- ----------
l : float l : float
Wavelength in microns Wavelength in microns. If the wavelength is above
2.5 microns, then the Mathar refractivity model
is used.
conditions: string conditions: string
Refers to the standard conditions of the Refers to the standard conditions of the
observatory. See get_conditions() for more info. observatory. See get_conditions() for more info.
@@ -129,11 +132,15 @@ def quick_refractive_index(l, conditions='STANDARD', T=288.15, p=101325,
if conditions is not None: if conditions is not None:
T, p, RH, xc, lat, h, _ = get_conditions(conditions).values() T, p, RH, xc, lat, h, _ = get_conditions(conditions).values()
# Initializing dispersion model if l <= 2.5:
at = Observatory() # Initializing dispersion model
at = Observatory()
# Calculating indices of refraction for l # Calculating indices of refraction for l
n = at.n_tph(l=l, T=T, p=p, RH=RH, xc=xc) n = at.n_tph(l=l, T=T, p=p, RH=RH, xc=xc)
else:
# Using the Mathar description for infrared wavelengths
n = Mathar(l=l, T=T, p=p, RH=RH)
return n return n
@@ -147,7 +154,8 @@ def quick_refraction(l, zenith, conditions='STANDARD', T=288.15, p=101325,
Parameters Parameters
---------- ----------
l : float l : float
Wavelength in microns Wavelength in microns. If the wavelength is above 2.5 micron
then the Mathar refractivity model is used.
zenith : float zenith : float
Angle of observation in degrees. Angle of observation in degrees.
zenith = 0 means the observation is directly overhead. zenith = 0 means the observation is directly overhead.
@@ -180,8 +188,12 @@ def quick_refraction(l, zenith, conditions='STANDARD', T=288.15, p=101325,
# Initializing dispersion model # Initializing dispersion model
at = Observatory() at = Observatory()
# Calculating indices of refraction for l if l <= 2.5:
n = at.n_tph(l=l, T=T, p=p, RH=RH, xc=xc) # Calculating indices of refraction for l
n = at.n_tph(l=l, T=T, p=p, RH=RH, xc=xc)
else:
# Using the Mathar description for infrared wavelengths
n = Mathar(l=l, T=T, p=p, RH=RH)
# Density of the atmosphere (following CIPM-81/91 equations) # Density of the atmosphere (following CIPM-81/91 equations)
rho = at.rho(p=p, T=T, RH=RH, xc=xc) rho = at.rho(p=p, T=T, RH=RH, xc=xc)
@@ -202,9 +214,11 @@ def quick_dispersion(l1, l2, zenith, conditions='STANDARD', T=288.15,
Parameters Parameters
---------- ----------
l1 : float l1 : float
Shortest wavelength of interest in micron. Shortest wavelength of interest in micron. If the wavelength
is above 2.5 microns, then the Mathar model is used.
l2 : float l2 : float
Longest wavelength of interest in micron. Longest wavelength of interest in micron. If the wavelength
is above 2.5 microns, then the Mathar model is used.
zenith : float zenith : float
Angle of observation in degrees. Angle of observation in degrees.
zenith = 0 means the observation is directly overhead. zenith = 0 means the observation is directly overhead.
@@ -237,9 +251,21 @@ def quick_dispersion(l1, l2, zenith, conditions='STANDARD', T=288.15,
# Initializing dispersion model # Initializing dispersion model
at = Observatory() at = Observatory()
# Calculating indices of refraction for l1 and l2 if l1 <= 2.5 and l2 <= 2.5:
n1 = at.n_tph(l=l1, T=T, p=p, RH=RH, xc=xc) # Calculating indices of refraction for l1 and l2
n2 = at.n_tph(l=l2, T=T, p=p, RH=RH, xc=xc) n1 = at.n_tph(l=l1, T=T, p=p, RH=RH, xc=xc)
n2 = at.n_tph(l=l2, T=T, p=p, RH=RH, xc=xc)
elif l1 > 1.4 and l2 > 1.4:
# Using the Mathar description for infrared wavelengths
n1 = Mathar(l=l1, T=T, p=p, RH=RH)
n2 = Mathar(l=l2, T=T, p=p, RH=RH)
else:
warnings.warn('Using two refractivity models (Ciddor and Mathar). \
Make sure you trust the results!')
l1n = np.min([l1, l2])
l2n = np.max([l1, l2])
n1 = at.n_tph(l=l1n, T=T, p=p, RH=RH, xc=xc)
n2 = Mathar(l=l2n, T=T, p=p, RH=RH)
# Density of the atmosphere (following CIPM-81/91 equations) # Density of the atmosphere (following CIPM-81/91 equations)
rho = at.rho(p=p, T=T, RH=RH, xc=xc) rho = at.rho(p=p, T=T, RH=RH, xc=xc)
+54 -19
View File
@@ -174,9 +174,10 @@ def Edlen1966(l, T=288.15, p=101325, RH=0, CO2=300, f=None):
def Owens(l, T=288.15, p=101325, RH=0): def Owens(l, T=288.15, p=101325, RH=0):
''' '''
From Owens, 1967 From Owens, 1967
Equation 32 Equations 29 to 31
Note that the pressure P and H are in torricelli (Torr),
however, this is almost precisely 1 Torr = 1 mmHg Code heavily based on ScopeSIM (https://scopesim.readthedocs.io/)
and http://www.caha.es/newsletter/news03b/pedraz/newslet.html
Parameters Parameters
---------- ----------
@@ -194,10 +195,27 @@ 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) # Calculation from ScopeSIM.effects.atmospheric_refraction()
T = K2C(T) pres = p / 100 # from mbar to Pa
s = 1 / l Ps = -10474. + 116.43 * T - 0.43284 * T**2 + 0.0005384 * T**3
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) Pw = Ps * RH / 100.
Pa = pres - Pw
# Wavenumber s
s = 1. / l
# Density factor of dry air, eq. 30
Da = (Pa / T) * (1. + Pa * (57.9E-8 - 0.0009325 / T + 0.25844 / T**2))
# Density factor of moist air, eq. 31
Dw = (Pw / T) * (1. + Pw * (1. + 3.7E-4 * Pw) *
(-2.37321E-3 + 2.23366 / T - 710.792 / T**2 +
77514.1 / T**3))
# Combining the two into eq. 29
na = Da * (2371.34 + 683939.7 / (130. - s**2) + 4547.3 / (38.9 - s**2))
nw = Dw * (6487.31 + 58.058 * s**2 - 0.7115 * s**4 + 0.08851 * s**6)
R = na + nw
n = R/1e8 + 1 n = R/1e8 + 1
return n return n
@@ -244,10 +262,10 @@ def BonschPotulski(l, T=288.15, p=101325, RH=0, CO2=400, f=None):
return n return n
def BirchDowns(l): def BirchDowns(l, T=288.15, p=101325, RH=0, f=None):
''' '''
From Birch & Downs, 1993 and 1994 (correction) From Birch & Downs, 1993 and 1994 (correction)
Equations 1 and 2 Equations 1, 2 and 3
Only at standard conditions Only at standard conditions
@@ -255,15 +273,32 @@ def BirchDowns(l):
---------- ----------
l : float l : float
wavelength in micron wavelength in micron
T : float
Temperature in Kelvin
p : float
Atmospheric pressure in Pa
RH : float
Relative humidity (0<=H<=1)
f : float
Water vapor pressure in Pascal
Returns Returns
------- -------
n : float n : float
Refractive index of atmospheric air at the given conditions Refractive index of atmospheric air at the given conditions
''' '''
Tc = K2C(T)
s = 1 / l s = 1 / l
R = 8342.54 + 2406147 / (130 - s**2) + 15998 / (38.9-s**2) Rs = 8342.54 + 2406147 / (130 - s**2) + 15998 / (38.9-s**2)
n = R/1e8 + 1 n = Rs/1e8 + 1
R_tp = (p * Rs/1e8) / 96095.43 * (1 + 1e-8 * (0.601 - 0.00972 * Tc) * p) / (1 + 0.0036610 * Tc)
n_tp = R_tp + 1
if f is None:
f = RH * svp(T)
n = n_tp - f * (3.7345 - 0.0401 * s**2) * 1e-10
return n return n
@@ -392,10 +427,10 @@ def slalib(l, T=288.15, p=101325, RH=0, h=0, lat=-24, tlr=0.0065, eps=1e-10):
conditions. conditions.
''' '''
try: try:
from pyslalib import slalib from pyslalib import slalib
except ImportError as e: except ImportError as e:
print('pySLALIB package not found! Try installing it first.\nReturning n=1.') print('pySLALIB package not found! Try installing it first.\nReturning n=1.')
return 1 return 1
zObs = np.deg2rad(45.06563) zObs = np.deg2rad(45.06563)
p = p/100 p = p/100
@@ -438,7 +473,7 @@ def Mathar(l, T=288.15, p=101325, RH=0):
if l < 1.3 or l > 24: if l < 1.3 or l > 24:
print('Using the Mathar model at this wavelength (l={:.3f}) is not recommended!'.format(l)) print('Using the Mathar model at this wavelength (l={:.3f}) is not recommended!'.format(l))
if l <= 2.65: elif l <= 2.65:
######################################################################## ########################################################################
# model parameters for wavelengths between 1.3 and 2.5 microns # model parameters for wavelengths between 1.3 and 2.5 microns
cref = [ 0.200192e-3, 0.113474e-9, -0.424595e-14, 0.100957e-16, -0.293315e-20, 0.307228e-24] # cm^j cref = [ 0.200192e-3, 0.113474e-9, -0.424595e-14, 0.100957e-16, -0.293315e-20, 0.307228e-24] # cm^j
@@ -458,7 +493,7 @@ def Mathar(l, T=288.15, p=101325, RH=0):
Href = 10 #%, reference humdity in percent Href = 10 #%, reference humdity in percent
######################################################################## ########################################################################
if l > 2.65 and l <= 4.275: elif l > 2.65 and l <= 4.275:
######################################################################## ########################################################################
# model parameters for wavelengths between 2.8 and 4.2 microns # model parameters for wavelengths between 2.8 and 4.2 microns
cref = [ 0.200049e-3, 0.145221e-9, 0.250951e-12, -0.745834e-15, -0.161432e-17, 0.352780e-20] # cm^j cref = [ 0.200049e-3, 0.145221e-9, 0.250951e-12, -0.745834e-15, -0.161432e-17, 0.352780e-20] # cm^j
@@ -478,7 +513,7 @@ def Mathar(l, T=288.15, p=101325, RH=0):
Href = 10 #%, reference humdity in percent Href = 10 #%, reference humdity in percent
######################################################################## ########################################################################
if l > 4.275 and l <= 6.35: elif l > 4.275 and l <= 6.35:
######################################################################## ########################################################################
# model parameters for wavelengths between 4.35 and 5.2 microns # model parameters for wavelengths between 4.35 and 5.2 microns
cref = [ 0.200020e-3, 0.275346e-9, 0.325702e-12, -0.693603e-14, 0.285610e-17, 0.338758e-18] # cm^j cref = [ 0.200020e-3, 0.275346e-9, 0.325702e-12, -0.693603e-14, 0.285610e-17, 0.338758e-18] # cm^j
@@ -497,7 +532,7 @@ def Mathar(l, T=288.15, p=101325, RH=0):
Href = 10 #%, reference humdity in percent Href = 10 #%, reference humdity in percent
######################################################################## ########################################################################
if l > 6.35 and l <= 15.05: elif l > 6.35 and l <= 15.05:
######################################################################## ########################################################################
# model parameters for wavelengths between 7.5 and 14.1 microns # model parameters for wavelengths between 7.5 and 14.1 microns
cref = [ 0.199885e-3, 0.344739e-9, -0.273714e-12, 0.393383e-15, -0.569488e-17, 0.164556e-19] # cm^j cref = [ 0.199885e-3, 0.344739e-9, -0.273714e-12, 0.393383e-15, -0.569488e-17, 0.164556e-19] # cm^j
@@ -517,7 +552,7 @@ def Mathar(l, T=288.15, p=101325, RH=0):
######################################################################## ########################################################################
if l > 15.05: elif l > 15.05:
######################################################################## ########################################################################
# model parameters for wavelengths between 16 and 24 microns # model parameters for wavelengths between 16 and 24 microns
cref = [ 0.199436e-3, 0.299123e-8, -0.214862e-10, 0.143338e-12, 0.122398e-14, -0.114628e-16] # cm^j cref = [ 0.199436e-3, 0.299123e-8, -0.214862e-10, 0.143338e-12, 0.122398e-14, -0.114628e-16] # cm^j
+7 -5
View File
@@ -110,7 +110,7 @@ Input parameters for the spherical atmosphere models (all but the first):
- xc - CO2 density [ppm] - xc - CO2 density [ppm]
- lat - Latitude [deg] - lat - Latitude [deg]
- h - Height above sea level [m] - h - Height above sea level [m]
- l - Wavelength(s) [um] - l - Wavelength(s) [μm]
- z - Zenith angle [deg] - z - Zenith angle [deg]
An example - To calculate the atmospheric refraction we set up a `refraction()` object. This requires the latitude and altitude of the observer. The atmospheric dispersion is calculated similarly, but by exchanging the `refraction()` object by a `dispersion()` object and parsing two refractive indices into the `cassini()` function. An example - To calculate the atmospheric refraction we set up a `refraction()` object. This requires the latitude and altitude of the observer. The atmospheric dispersion is calculated similarly, but by exchanging the `refraction()` object by a `dispersion()` object and parsing two refractive indices into the `cassini()` function.
@@ -190,11 +190,12 @@ Included are
| Barrell & Sears (1939) | `BarrellAndSears()` | Outdated model, especially poor for short wavelengths. | | Barrell & Sears (1939) | `BarrellAndSears()` | Outdated model, especially poor for short wavelengths. |
| Ciddor (1996) | `Ciddor()` | Only at standard atmosphere. CO2 density can be changed. | | Ciddor (1996) | `Ciddor()` | Only at standard atmosphere. CO2 density can be changed. |
| Edlen (1953) | `Edlen1953()` | The equation by Edlèn, 1953, combined with modification from Barrel (1951), to include temperature, pressure and humidity dependence. | | Edlen (1953) | `Edlen1953()` | The equation by Edlèn, 1953, combined with modification from Barrel (1951), to include temperature, pressure and humidity dependence. |
| Edlen (1966) | `Edlen1966()` | Only at standard atmosphere. Function requires wavelength only. | | Edlen (1966) | `Edlen1966()` | Allows for any temperature, pressure, humidity and CO2 density.|
| Owens (1967) | `Owens()` | - | | Owens (1967) | `Owens()` | Allows for any temperature, pressure, humidity. |
| Bonsch & Potulski (1998) | `BonschPotulski()` | Function does not include humidity | | Bonsch & Potulski (1998) | `BonschPotulski()` | Allows for any temperature, pressure, humidity and CO2 density. |
| Birch & Downs (1994) | `BirchDowns()` | Only at standard atmosphere. Function requires wavelength only. | | Birch & Downs (1994) | `BirchDowns()` | Only at standard atmosphere. Function requires wavelength only. |
| Peck & Reeder (1972) | `PeckReeder()` | Only at standard atmosphere. Function requires wavelength only. | | Peck & Reeder (1972) | `PeckReeder()` | Only at standard atmosphere. Function requires wavelength only. |
| Mathar (2006) | `Mathar()` | Allows for temperature, pressure and humidity specification. Works best at wavelengths above 1.4 μm. |
| Hohenkerk & Sinclair (1985) | `HohenkerkAndSinclair()` | Based on Barrell & Sears equation. Generally, gives slightly larger values.| | Hohenkerk & Sinclair (1985) | `HohenkerkAndSinclair()` | Based on Barrell & Sears equation. Generally, gives slightly larger values.|
| Hohenkerk & Sinclair (1985) | `slalib()` | Uses pySLALIB to retrieve the refractive index at standard atmospheric conditions.| | Hohenkerk & Sinclair (1985) | `slalib()` | Uses pySLALIB to retrieve the refractive index at standard atmospheric conditions.|
@@ -226,9 +227,10 @@ Presently, several observatories are known. These can all be found in the `obser
| Roque de los Muchachos Observatory (La Palma) | `LA_PALMA` | GTC, INT, WHT, NOT, and others. | | Roque de los Muchachos Observatory (La Palma) | `LA_PALMA` | GTC, INT, WHT, NOT, and others. |
| La Silla Observatory | `LA_SILLA` | ESO 3.6m telescope, NTG, BlackGEM and others. | | La Silla Observatory | `LA_SILLA` | ESO 3.6m telescope, NTG, BlackGEM and others. |
| Las Campanas Observatory | `LAS_CAMPANAS` | Site of the future GMT. | | Las Campanas Observatory | `LAS_CAMPANAS` | Site of the future GMT. |
| Mauna Kea Observatory (Hawaii) | `MAUNA_KEA` | Location of Keck, Subaru, Gemini North and others.|
## Other ## Other
This package also contains a python native port of the `SLA_REFRO()` routine of the pyslalib package, which was originally written in FORTRAN by P.T. Wallace. It can be called directly using `sla_refro()`. When using the same units as the other refraction functions, you might prefer using `slalib_refraction()` or `slalib_dispersion()`. This package also contains a python native port of the `SLA_REFRO()` routine of the pyslalib package, which was originally written in FORTRAN by P.T. Wallace. It can be called directly using `sla_refro()`. When using the same units as the other refraction functions, you might prefer using `slalib_refraction()` or `slalib_dispersion()`. Do note that this implementation is slower than the (compiled) FORTRAN implementation.
Finally, the dispersion model used by Alexei Filippenko in 1982 is also included. This model is a combination of the (modified) Edlèn equation and a plane-parallel atmospheric geometry. This calculation can be accessed by calling the `Filippenko1982()` function. Finally, the dispersion model used by Alexei Filippenko in 1982 is also included. This model is a combination of the (modified) Edlèn equation and a plane-parallel atmospheric geometry. This calculation can be accessed by calling the `Filippenko1982()` function.
+2 -2
View File
@@ -21,14 +21,14 @@ def setup_package():
# write_version_py() # write_version_py()
setup(name='AstroAtmosphere', setup(name='AstroAtmosphere',
version='1.4', version='1.5',
description='Collection of equations for refractive index, refraction and dispersion calculations of atmospheric air.', description='Collection of equations for refractive index, refraction and dispersion calculations of atmospheric air.',
long_description=__readme__, long_description=__readme__,
long_description_content_type='text/markdown', long_description_content_type='text/markdown',
author='Joost van den Born', author='Joost van den Born',
author_email='born@astron.nl', author_email='born@astron.nl',
url='https://gitlab.astro-wise.org/micado/atmosphericmodel', url='https://gitlab.astro-wise.org/micado/atmosphericmodel',
download_url='https://gitlab.astro-wise.org/micado/atmosphericmodel/-/archive/v1.4/atmosphericmodel-v1.4.tar.gz', download_url='https://gitlab.astro-wise.org/micado/atmosphericmodel/-/archive/v1.5/atmosphericmodel-v1.5.tar.gz',
license='GNU General Public License v3', license='GNU General Public License v3',
data_files = [('',['LICENSE.txt'])], data_files = [('',['LICENSE.txt'])],
package_dir={'AstroAtmosphere': 'AstroAtmosphere'}, package_dir={'AstroAtmosphere': 'AstroAtmosphere'},