Source code for sharppy.sharptab.utils

''' Frequently used functions '''
from __future__ import division
import numpy as np
import numpy.ma as ma
from sharppy.sharptab.constants import MISSING, TOL

__all__ = ['INT2STR','FLOAT2STR','MS2KTS', 'KTS2MS', 'MS2MPH']
__all__ += ['MPH2MS', 'MPH2KTS', 'KTS2MPH', 'M2FT', 'FT2M']
__all__ += ['IN2CM', 'CM2IN']
__all__ += ['vec2comp', 'comp2vec', 'mag', 'QC']

[docs]def INT2STR(val): ''' Convert a value (float or int) into an integer string by rounding to the nearest integer and returning the string. Used to handle case where value is nan or masked. Parameters ---------- val: float or int Returns ------- Val rounded to the nearest int and converted to a string. ''' if np.isnan(val): return '--' try: return str( int( np.round( val, 0 ) ) ) except: return str(val)
[docs]def FLOAT2STR(val, precision): ''' Convert a value (float or int) into a float string to the decimal place of a specified precision. Used to handle the case where the value is nan or masked. Parameters ---------- val: float or int precision: int used to specify the precision of the resulting rounded value Returns ------- val rounded to the nearest specified decimal place and converted to a string. ''' try: new_val = str( np.round( val, precision ) ) except: new_val = str( val ) if new_val.strip() == 'nan': return '--' else: return new_val
[docs]def MS2KTS(val): ''' Convert meters per second to knots Parameters ---------- val : float, numpy_array Speed (m/s) Returns ------- Val converted to knots (float) ''' return val * 1.94384449
[docs]def KTS2MS(val): ''' Convert knots to meters per second Parameters ---------- val : float, numpy_array Speed (kts) Returns ------- Val converted to meters per second (float) ''' return val * 0.514444
[docs]def MS2MPH(val): ''' Convert meters per second to miles per hour Parameters ---------- val : float, numpy_array Speed (m/s) Returns ------- Val converted to miles per hour (float) ''' return val * 2.23694
[docs]def MPH2MS(val): ''' Convert miles per hour to meters per second Parameters ---------- val : float, numpy_array Speed (mph) Returns ------- Val converted to meters per second (float) ''' return val * 0.44704
[docs]def MPH2KTS(val): ''' Convert miles per hour to knots Parameters ---------- val : float, numpy_array Speed (mph) Returns ------- Val converted to knots (float) ''' return val * 0.868976
[docs]def KTS2MPH(val): ''' Convert knots to miles per hour Parameters ---------- val : float, numpy_array Speed (kts) Returns ------- Val converted to miles per hour (float) ''' return val * 1.15078
[docs]def M2FT(val): ''' Convert meters to feet Parameters ---------- val : float, numpy_array Distance (m) Returns ------- Val converted to feet (float) ''' return val * 3.2808399
[docs]def FT2M(val): ''' Convert feet to meters Parameters ---------- val : float, numpy_array Distance (ft) Returns ------- Val converted to meters (float) ''' return val * 0.3048
[docs]def IN2CM(val): ''' Convert inches to centimeters Parameters ---------- val : float, numpy_array Distance (inches) Returns ------- Val converted to centimeters (float) ''' return val * 2.54
[docs]def CM2IN(val): ''' Convert centimeters to inches Parameters ---------- val : float, numpy_array Distance (centimeters) Returns ------- Val converted to inches (float) ''' return val / 2.54
def _vec2comp(wdir, wspd): ''' Underlying function that converts a vector to its components Parameters ---------- wdir : number, masked_array Angle in meteorological degrees wspd : number, masked_array Magnitudes of wind vector Returns ------- u : number, masked_array (same as input) U-component of the wind v : number, masked_array (same as input) V-component of the wind ''' u = wspd * ma.sin(np.radians(wdir)) * -1 v = wspd * ma.cos(np.radians(wdir)) * -1 return u, v
[docs]def vec2comp(wdir, wspd, missing=MISSING): ''' Convert direction and magnitude into U, V components Parameters ---------- wdir : number, array_like Angle in meteorological degrees wspd : number, array_like Magnitudes of wind vector (input units == output units) missing : number (optional) Optional missing parameter. If not given, assume default missing value from sharppy.sharptab.constants.MISSING Returns ------- u : number, array_like (same as input) U-component of the wind (units are the same as those of input speed) v : number, array_like (same as input) V-component of the wind (units are the same as those of input speed) ''' if not QC(wdir) or not QC(wspd): return ma.masked, ma.masked wdir = ma.asanyarray(wdir).astype(np.float64) wspd = ma.asanyarray(wspd).astype(np.float64) wdir.set_fill_value(missing) wspd.set_fill_value(missing) assert wdir.shape == wspd.shape, 'wdir and wspd have different shapes' if wdir.shape: wdir[wdir == missing] = ma.masked wspd[wspd == missing] = ma.masked wdir[wspd.mask] = ma.masked wspd[wdir.mask] = ma.masked u, v = _vec2comp(wdir, wspd) u[np.fabs(u) < TOL] = 0. v[np.fabs(v) < TOL] = 0. else: if wdir == missing: wdir = ma.masked wspd = ma.masked elif wspd == missing: wdir = ma.masked wspd = ma.masked u, v = _vec2comp(wdir, wspd) if ma.fabs(u) < TOL: u = 0. if ma.fabs(v) < TOL: v = 0. return u, v
[docs]def comp2vec(u, v, missing=MISSING): ''' Convert U, V components into direction and magnitude Parameters ---------- u : number, array_like U-component of the wind v : number, array_like V-component of the wind missing : number (optional) Optional missing parameter. If not given, assume default missing value from sharppy.sharptab.constants.MISSING Returns ------- wdir : number, array_like (same as input) Angle in meteorological degrees wspd : number, array_like (same as input) Magnitudes of wind vector (input units == output units) ''' if not QC(u) or not QC(v): return ma.masked, ma.masked u = ma.asanyarray(u).astype(np.float64) v = ma.asanyarray(v).astype(np.float64) u.set_fill_value(missing) v.set_fill_value(missing) wdir = np.degrees(np.arctan2(-u, -v)) if wdir.shape: u[u == missing] = ma.masked v[v == missing] = ma.masked wdir[u.mask] = ma.masked wdir[v.mask] = ma.masked wdir[wdir < 0] += 360 wdir[np.fabs(wdir) < TOL] = 0. else: if u == missing or v == missing: return ma.masked, ma.masked if wdir < 0: wdir += 360 if np.fabs(wdir) < TOL: wdir = 0. return wdir, mag(u, v)
[docs]def mag(u, v, missing=MISSING): ''' Compute the magnitude of a vector from its components Parameters ---------- u : number, array_like U-component of the wind v : number, array_like V-component of the wind missing : number (optional) Optional missing parameter. If not given, assume default missing value from sharppy.sharptab.constants.MISSING Returns ------- mag : number, array_like The magnitude of the vector (units are the same as input) ''' if not QC(u) or not QC(v): return ma.masked u = np.ma.asanyarray(u).astype(np.float64) v = np.ma.asanyarray(v).astype(np.float64) u.set_fill_value(missing) v.set_fill_value(missing) if u.shape: u[u == missing] = ma.masked v[v == missing] = ma.masked else: if u == missing or v == missing: return ma.masked return ma.sqrt(u**2 + v**2)
[docs]def QC(val): ''' Tests if a value is masked. ''' if type(val) == type(ma.masked): return False return True