included fail-safe: in case analytical equations do not yield plausible result, output from AstroPy sunangles will be used

This commit is contained in:
Marcel Christian Frommelt 2021-05-03 17:42:26 +09:00
parent 449f92da0f
commit 89e9ec1db1
1 changed files with 44 additions and 39 deletions

View File

@ -37,7 +37,8 @@ def sun_angles_astropy(lat, lon, h, utc): # get current sun elevation and azimu
return az, elv
def sun_angles_analytical(lat, lon, utc): # get current sun elevation and azimuth through several equations (see [xx])
def sun_angles_analytical(lat, lon, h, utc): # get current sun elevation and azimuth through several equations (see [xx])
try:
if np.abs(lat) == 90: # handling collapse of longitudes at poles by
lat = np.sign(lat) * 89.999999 # expanding one point to a very small circle
else:
@ -68,17 +69,21 @@ def sun_angles_analytical(lat, lon, utc): # get current sun elevation and azimu
ha = tst / 4 - 180
sza = np.rad2deg(np.arccos(
np.sin(np.deg2rad(lat)) * np.sin(np.deg2rad(sd)) + np.cos(np.deg2rad(lat)) * np.cos(np.deg2rad(sd)) * np.cos(
np.sin(np.deg2rad(lat)) * np.sin(np.deg2rad(sd)) + np.cos(np.deg2rad(lat)) * np.cos(
np.deg2rad(sd)) * np.cos(
np.deg2rad(ha))))
sea = 90 - sza
if ha > 0:
saa = (np.rad2deg(np.arccos(((np.sin(np.deg2rad(lat)) * np.cos(np.deg2rad(sza))) - np.sin(np.deg2rad(sd))) / (
saa = (np.rad2deg(
np.arccos(((np.sin(np.deg2rad(lat)) * np.cos(np.deg2rad(sza))) - np.sin(np.deg2rad(sd))) / (
np.cos(np.deg2rad(lat)) * np.sin(np.deg2rad(sza))))) + 180) % 360
else:
saa = (540 - np.rad2deg(np.arccos(
((np.sin(np.deg2rad(lat)) * np.cos(np.deg2rad(sza))) - np.sin(np.deg2rad(sd))) / (
np.cos(np.deg2rad(lat)) * np.sin(np.deg2rad(sza)))))) % 360
except:
saa, sea = sun_angles_astropy(lat, lon, h, utc)
return saa, sea # Azimuth, Elevation
@ -95,11 +100,11 @@ def AirMass(p_air, p_0, ELV, h): # get atmospheric air mass over balloon
return res
def tau(ELV, h, p_air): # get atmospheric transmissivity as function of balloon altitude and sun elevation
def tau(ELV, h, p_air, p0): # get atmospheric transmissivity as function of balloon altitude and sun elevation
if ELV >= -(180 / np.pi * np.arccos(R_E / (R_E + h))):
tau_atm = 0.5 * (
np.exp(-0.65 * AirMass(p_air, p_0, ELV, h)) + np.exp(-0.095 * AirMass(p_air, p_0, ELV, h)))
tau_atmIR = 1.716 - 0.5 * (np.exp(-0.65 * p_air / p_0) + np.exp(-0.095 * p_air / p_0))
np.exp(-0.65 * AirMass(p_air, p0, ELV, h)) + np.exp(-0.095 * AirMass(p_air, p0, ELV, h)))
tau_atmIR = 1.716 - 0.5 * (np.exp(-0.65 * p_air / p0) + np.exp(-0.095 * p_air / p0))
else:
tau_atm = 0
tau_atmIR = 0