mirror of
https://gitlab.astro-wise.org/micado/atmosphericmodel.git
synced 2026-10-30 05:01:02 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7588bb7fc7 | ||
|
|
c07d42c1fd | ||
|
|
3e5224e8bb | ||
|
|
4ee1ee662e | ||
|
|
f6d13a624f | ||
|
|
3ff1af98e0 | ||
|
|
ee7134da7d | ||
|
|
27abba5f5d | ||
|
|
03d583a9cd | ||
|
|
3cdf4ccd39 | ||
|
|
2652d75eec |
No files matched your search
@@ -1,3 +1,6 @@
|
||||
.DS_Store
|
||||
__pychache__/
|
||||
.ipynb_checkpoints/
|
||||
dist/
|
||||
AstroAtmosphere.egg-info/
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -387,6 +387,73 @@ class dispersion(Observatory):
|
||||
return np.degrees(_dispersionError)
|
||||
|
||||
|
||||
def independentCassiniError(self, n1, n2, zenith, dn1=0, dn2=0, dz=0,
|
||||
lat=None, h=None):
|
||||
'''
|
||||
Calculates the uncertainty in the atmospheric dispersion,
|
||||
following the Cassini model, without assumptions about the
|
||||
refractivity model.
|
||||
This involves a much shorter use the chain rule.
|
||||
|
||||
Not taken into account is the errror propagation in the scale height
|
||||
of the atmosphere, from my results this should give a small or even
|
||||
negligible difference.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
n1 : float
|
||||
Refractive index at the first wavelength of interest at the
|
||||
observer
|
||||
n2 : float
|
||||
Refractive index at the second wavelength of interest at the
|
||||
observer
|
||||
zenith : float
|
||||
Angle of observation in degrees.
|
||||
zenith = 0 means the observation is directly overhead.
|
||||
dn1 : float
|
||||
Uncertainty in the provided value of the refractive index
|
||||
at the first wavelength
|
||||
dn2 : float
|
||||
Uncertainty in the provided value of the refractive index
|
||||
at the second wavelength
|
||||
dz : float (default: 0)
|
||||
Uncertainty in the zenith angle, in degrees.
|
||||
lat : float (default: None)
|
||||
If entered, overrides the latitude attribute of the class.
|
||||
h : float (default=None)
|
||||
If entered, overrides the altitude attribute of the class.
|
||||
|
||||
Returns
|
||||
-------
|
||||
dRR : float
|
||||
Uncertainty in the atmospheric dispersion in degrees.
|
||||
'''
|
||||
if lat == None:
|
||||
lat = self.lat
|
||||
else:
|
||||
self.lat = lat
|
||||
if h == None:
|
||||
h = self.h
|
||||
else:
|
||||
self.h = h
|
||||
|
||||
# Some precalculation and variable setting
|
||||
_zenith = np.deg2rad(zenith)
|
||||
_dz = np.deg2rad(dz)
|
||||
_R = self.rc
|
||||
_H = self.H
|
||||
|
||||
# Partial derivatives for derivation to n1, n2, and z
|
||||
_dddn1 = - _R * np.sin(_zenith) / ( (_R + _H) * np.sqrt(1 - (n1 * _R * np.sin(_zenith) / (_R + _H))**2 ) )
|
||||
_dddn2 = _R * np.sin(_zenith) / ( (_R + _H) * np.sqrt(1 - (n2 * _R * np.sin(_zenith) / (_R + _H))**2 ) )
|
||||
_dddz = (_R * np.cos(_zenith)) / (_R + _H) * ( n1 / np.sqrt(1-(n1**2 * _R**2 * np.sin(_zenith)**2)/(_R + _H)**2) - n2 / np.sqrt(1-(n2**2 * _R**2 * np.sin(_zenith)**2)/(_R + _H)**2) )
|
||||
|
||||
# Combining the partial derivatives
|
||||
_dispersionError = np.sqrt( (_dddn1 * dn1)**2 + (_dddn2 * dn2)**2 + (_dddz * dz)**2)
|
||||
|
||||
return np.degrees(_dispersionError)
|
||||
|
||||
|
||||
def corbard(self, n1, n2, zenith, reduced_height=None):
|
||||
'''
|
||||
Corbard et al., 2019, mention an additional formula based on
|
||||
|
||||
+43
-17
@@ -4,8 +4,9 @@ from .refractionModels import refraction
|
||||
from .dispersionModels import dispersion
|
||||
from .neoslalib import sla_refro
|
||||
from .observatories import observatories
|
||||
from .refractivityModels import Edlen1953
|
||||
from .refractivityModels import Edlen1953, Mathar
|
||||
import numpy as np
|
||||
import warnings
|
||||
|
||||
'''
|
||||
@ Author: Joost van den Born
|
||||
@@ -102,7 +103,9 @@ def quick_refractive_index(l, conditions='STANDARD', T=288.15, p=101325,
|
||||
Parameters
|
||||
----------
|
||||
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
|
||||
Refers to the standard conditions of the
|
||||
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:
|
||||
T, p, RH, xc, lat, h, _ = get_conditions(conditions).values()
|
||||
|
||||
# Initializing dispersion model
|
||||
at = Observatory()
|
||||
if l <= 2.5:
|
||||
# Initializing dispersion model
|
||||
at = Observatory()
|
||||
|
||||
# Calculating indices of refraction for l
|
||||
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)
|
||||
return n
|
||||
|
||||
|
||||
@@ -147,7 +154,8 @@ def quick_refraction(l, zenith, conditions='STANDARD', T=288.15, p=101325,
|
||||
Parameters
|
||||
----------
|
||||
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
|
||||
Angle of observation in degrees.
|
||||
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
|
||||
at = Observatory()
|
||||
|
||||
# Calculating indices of refraction for l
|
||||
n = at.n_tph(l=l, T=T, p=p, RH=RH, xc=xc)
|
||||
if l <= 2.5:
|
||||
# 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)
|
||||
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
|
||||
----------
|
||||
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
|
||||
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
|
||||
Angle of observation in degrees.
|
||||
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
|
||||
at = Observatory()
|
||||
|
||||
# Calculating indices of refraction for l1 and l2
|
||||
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)
|
||||
if l1 <= 2.5 and l2 <= 2.5:
|
||||
# Calculating indices of refraction for l1 and l2
|
||||
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)
|
||||
rho = at.rho(p=p, T=T, RH=RH, xc=xc)
|
||||
@@ -310,7 +336,7 @@ def slalib_refraction(l, zenith, conditions='STANDARD', T=288.15, p=101325,
|
||||
_phi = np.deg2rad(lat) # From degrees to radians
|
||||
|
||||
R = []
|
||||
if type(l) == float or type(l) == int:
|
||||
if isinstance(l, float) or isinstance(l, int):
|
||||
l = [l]
|
||||
if use_pyslalib:
|
||||
try:
|
||||
@@ -319,13 +345,13 @@ def slalib_refraction(l, zenith, conditions='STANDARD', T=288.15, p=101325,
|
||||
print('pySLALIB package not found! Try installing it first.')
|
||||
for wl in l:
|
||||
# If using original slalib (e.g. PySLALIB)
|
||||
Refrac = slalib.sla_refro(_zenith, h, T, _P, RH, wl, phi, tlr, eps)
|
||||
Refrac = slalib.sla_refro(_zenith, h, T, _P, RH, wl, _phi, tlr, eps)
|
||||
R.append(np.degrees(Refrac))
|
||||
|
||||
# If using internal slalib port
|
||||
else:
|
||||
for wl in l:
|
||||
Refrac = sla_refro(_zenith, h, T, _P, RH, wl, phi, tlr, eps)
|
||||
Refrac = sla_refro(_zenith, h, T, _P, RH, wl, _phi, tlr, eps)
|
||||
R.append(np.degrees(Refrac))
|
||||
|
||||
if len(l) == 1:
|
||||
|
||||
@@ -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):
|
||||
'''
|
||||
From Owens, 1967
|
||||
Equation 32
|
||||
Note that the pressure P and H are in torricelli (Torr),
|
||||
however, this is almost precisely 1 Torr = 1 mmHg
|
||||
Equations 29 to 31
|
||||
|
||||
Code heavily based on ScopeSIM (https://scopesim.readthedocs.io/)
|
||||
and http://www.caha.es/newsletter/news03b/pedraz/newslet.html
|
||||
|
||||
Parameters
|
||||
----------
|
||||
@@ -194,10 +195,27 @@ def Owens(l, T=288.15, p=101325, RH=0):
|
||||
n : float
|
||||
Refractive index of atmospheric air at the given conditions
|
||||
'''
|
||||
P = hPa2mmHg(p/100)
|
||||
T = K2C(T)
|
||||
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)
|
||||
# Calculation from ScopeSIM.effects.atmospheric_refraction()
|
||||
pres = p / 100 # from mbar to Pa
|
||||
Ps = -10474. + 116.43 * T - 0.43284 * T**2 + 0.0005384 * T**3
|
||||
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
|
||||
return n
|
||||
|
||||
@@ -244,10 +262,10 @@ def BonschPotulski(l, T=288.15, p=101325, RH=0, CO2=400, f=None):
|
||||
return n
|
||||
|
||||
|
||||
def BirchDowns(l):
|
||||
def BirchDowns(l, T=288.15, p=101325, RH=0, f=None):
|
||||
'''
|
||||
From Birch & Downs, 1993 and 1994 (correction)
|
||||
Equations 1 and 2
|
||||
Equations 1, 2 and 3
|
||||
|
||||
Only at standard conditions
|
||||
|
||||
@@ -255,15 +273,32 @@ def BirchDowns(l):
|
||||
----------
|
||||
l : float
|
||||
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
|
||||
-------
|
||||
n : float
|
||||
Refractive index of atmospheric air at the given conditions
|
||||
'''
|
||||
Tc = K2C(T)
|
||||
s = 1 / l
|
||||
R = 8342.54 + 2406147 / (130 - s**2) + 15998 / (38.9-s**2)
|
||||
n = R/1e8 + 1
|
||||
Rs = 8342.54 + 2406147 / (130 - s**2) + 15998 / (38.9-s**2)
|
||||
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
|
||||
|
||||
|
||||
@@ -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.
|
||||
'''
|
||||
try:
|
||||
from pyslalib import slalib
|
||||
from pyslalib import slalib
|
||||
except ImportError as e:
|
||||
print('pySLALIB package not found! Try installing it first.\nReturning n=1.')
|
||||
return 1
|
||||
print('pySLALIB package not found! Try installing it first.\nReturning n=1.')
|
||||
return 1
|
||||
|
||||
zObs = np.deg2rad(45.06563)
|
||||
p = p/100
|
||||
@@ -438,7 +473,7 @@ def Mathar(l, T=288.15, p=101325, RH=0):
|
||||
if l < 1.3 or l > 24:
|
||||
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
|
||||
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
|
||||
########################################################################
|
||||
|
||||
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
|
||||
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
|
||||
########################################################################
|
||||
|
||||
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
|
||||
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
|
||||
########################################################################
|
||||
|
||||
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
|
||||
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
|
||||
cref = [ 0.199436e-3, 0.299123e-8, -0.214862e-10, 0.143338e-12, 0.122398e-14, -0.114628e-16] # cm^j
|
||||
|
||||
@@ -110,7 +110,7 @@ Input parameters for the spherical atmosphere models (all but the first):
|
||||
- xc - CO2 density [ppm]
|
||||
- lat - Latitude [deg]
|
||||
- h - Height above sea level [m]
|
||||
- l - Wavelength(s) [um]
|
||||
- l - Wavelength(s) [μm]
|
||||
- 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.
|
||||
@@ -190,11 +190,12 @@ Included are
|
||||
| Barrell & Sears (1939) | `BarrellAndSears()` | Outdated model, especially poor for short wavelengths. |
|
||||
| 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 (1966) | `Edlen1966()` | Only at standard atmosphere. Function requires wavelength only. |
|
||||
| Owens (1967) | `Owens()` | - |
|
||||
| Bonsch & Potulski (1998) | `BonschPotulski()` | Function does not include humidity |
|
||||
| Edlen (1966) | `Edlen1966()` | Allows for any temperature, pressure, humidity and CO2 density.|
|
||||
| Owens (1967) | `Owens()` | Allows for any temperature, pressure, 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. |
|
||||
| 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) | `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. |
|
||||
| La Silla Observatory | `LA_SILLA` | ESO 3.6m telescope, NTG, BlackGEM and others. |
|
||||
| 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
|
||||
|
||||
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.
|
||||
Binary file not shown.
Binary file not shown.
@@ -21,14 +21,14 @@ def setup_package():
|
||||
# write_version_py()
|
||||
|
||||
setup(name='AstroAtmosphere',
|
||||
version='1.4',
|
||||
version='1.6',
|
||||
description='Collection of equations for refractive index, refraction and dispersion calculations of atmospheric air.',
|
||||
long_description=__readme__,
|
||||
long_description_content_type='text/markdown',
|
||||
author='Joost van den Born',
|
||||
author_email='born@astron.nl',
|
||||
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.6/atmosphericmodel-v1.6.tar.gz',
|
||||
license='GNU General Public License v3',
|
||||
data_files = [('',['LICENSE.txt'])],
|
||||
package_dir={'AstroAtmosphere': 'AstroAtmosphere'},
|
||||
|
||||
Reference in new issue
Block a user