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): | 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: |     if lon > 180: | ||||||
|         lonwrap = lon - 360 |         lon_wrap = lon - 360 | ||||||
|     else: |     else: | ||||||
|         lonwrap = lon |         lon_wrap = lon | ||||||
|     return lonwrap  |     return lon_wrap  | ||||||
| 
 | 
 | ||||||
| def hms2s(h,m,s): | def wraplons(lons): | ||||||
|     ''' |     ''' | ||||||
|     Convert hour/minute/second to seconds |     Wrap a set of longitudes in range of [0,360] to [-180,180]. | ||||||
|     ''' |  | ||||||
|     return h*3.6E3 + m*60 + s |  | ||||||
| 
 | 
 | ||||||
| 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