add functions related to coesa76
This commit is contained in:
parent
20bc2fdc0c
commit
8fbcbb7f68
@ -1,21 +1,122 @@
|
||||
import numpy as np
|
||||
import warnings
|
||||
|
||||
from . import Const
|
||||
|
||||
def vectorize(x):
|
||||
'''
|
||||
Vectorize a number(int, float) or a list to a numpy array.
|
||||
'''
|
||||
try:
|
||||
n = len(x)
|
||||
x = np.array(x)
|
||||
except:
|
||||
x = np.array([x])
|
||||
return x
|
||||
|
||||
def wraplon(lon):
|
||||
'''
|
||||
Wrap a longitude in range of [0,360] to [-180,180]
|
||||
Wrap a longitude in range of [0,360] to [-180,180].
|
||||
|
||||
Usage:
|
||||
lon_wrap = wraplon(lon)
|
||||
|
||||
Inputs:
|
||||
lon -> [float] longitude in range of [0,360]
|
||||
|
||||
Outputs:
|
||||
lon_wrap -> [float] wrapped longitude in range of [-180,180]
|
||||
'''
|
||||
if lon > 180:
|
||||
lonwrap = lon - 360
|
||||
lon_wrap = lon - 360
|
||||
else:
|
||||
lonwrap = lon
|
||||
return lonwrap
|
||||
lon_wrap = lon
|
||||
return lon_wrap
|
||||
|
||||
def hms2s(h,m,s):
|
||||
def wraplons(lons):
|
||||
'''
|
||||
Convert hour/minute/second to seconds
|
||||
'''
|
||||
return h*3.6E3 + m*60 + s
|
||||
Wrap a set of longitudes in range of [0,360] to [-180,180].
|
||||
|
||||
def hms2h(h,m,s):
|
||||
Usage:
|
||||
lons_wrap = wraplons(lons)
|
||||
|
||||
Inputs:
|
||||
lons -> [float list/array] longitudes in range of [0,360]
|
||||
|
||||
Outputs:
|
||||
lons_wrap -> [float array] wrapped longitudes in range of [-180,180]
|
||||
'''
|
||||
Convert hour/minute/second to hours
|
||||
lons = vectorize(lons)
|
||||
lons_wrap = lons.copy()
|
||||
flags = lons > 180
|
||||
lons_wrap[flags] = lons[flags] - 360
|
||||
|
||||
return lons_wrap
|
||||
|
||||
def hms_conver(h,m,s):
|
||||
'''
|
||||
return h + m/60 + s/3.6E3
|
||||
Convert the form of hour/minute/second to hours and seconds.
|
||||
|
||||
Uasge:
|
||||
hours,seconds = hms_conversion(h,m,s)
|
||||
'''
|
||||
hours = h + m/60 + s/3.6e3
|
||||
seconds = h*3.6e3 + m*60 + s
|
||||
return hours,seconds
|
||||
|
||||
def alt_conver(alts,alt_type='geometric'):
|
||||
'''
|
||||
Fulfill conversions between geometric altitudes and geopotential altitudes.
|
||||
|
||||
Usage:
|
||||
zs,hs = alt_conver(alts,'geometric')
|
||||
or
|
||||
zs,hs = alt_conver(alts,'geopotential')
|
||||
|
||||
Inputs:
|
||||
alts -> [float list/array] geometric altitudes or geopotential altitudes, [km]
|
||||
|
||||
Parameters:
|
||||
alt_type -> [string] 'geometric' or 'geopotential'
|
||||
|
||||
Outputs:
|
||||
zs -> [float array] geometric altitudes, [km]
|
||||
hs -> [float array] geopotential altitudes, [km]
|
||||
'''
|
||||
|
||||
alts = vectorize(alts)
|
||||
|
||||
r0 = Const.r0
|
||||
|
||||
if alt_type == 'geometric':
|
||||
zs = alts
|
||||
# from geometric altitude to geopotential altitude
|
||||
hs = zs*r0/(r0+zs)
|
||||
|
||||
elif alt_type == 'geopotential':
|
||||
hs = alts
|
||||
# from geopotential altitude to geometric altitude
|
||||
zs = hs*r0/(r0-hs)
|
||||
return zs,hs
|
||||
|
||||
def check_altitude(zs,z_range,mode):
|
||||
'''
|
||||
Checks if altitudes are inside a valid range.
|
||||
|
||||
Inputs:
|
||||
zs -> [float list/array] geometric altitude to be checked
|
||||
lower_z -> [float] lower limit of geometric altitudes
|
||||
upper_z -> [float] upper limit of geometric altitudes
|
||||
'''
|
||||
zs = np.array(zs)
|
||||
|
||||
lower_z,upper_z = z_range
|
||||
# Assert in range
|
||||
|
||||
if (zs < lower_z).any() or (zs > upper_z).any():
|
||||
msg_warning = "Geometric altitudes are outside the range of [{}, {}] km. Output values will be extrapolated for those heights.".format(lower_z,upper_z)
|
||||
msg_error = "Geometric altitudes are outside the range of [{}, {}] km.".format(lower_z,upper_z)
|
||||
if mode == 'warning':
|
||||
warnings.warn(msg_warning)
|
||||
elif mode == 'error':
|
||||
raise Exception(msg_error)
|
Loading…
x
Reference in New Issue
Block a user