2012-01-06 08:55:05 -06:00
|
|
|
##
|
|
|
|
# This software was developed and / or modified by Raytheon Company,
|
|
|
|
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
|
|
|
#
|
|
|
|
# U.S. EXPORT CONTROLLED TECHNICAL DATA
|
|
|
|
# This software product contains export-restricted data whose
|
|
|
|
# export/transfer/disclosure is restricted by U.S. law. Dissemination
|
|
|
|
# to non-U.S. persons whether in the United States or abroad requires
|
|
|
|
# an export license or other authorization.
|
|
|
|
#
|
|
|
|
# Contractor Name: Raytheon Company
|
|
|
|
# Contractor Address: 6825 Pine Street, Suite 340
|
|
|
|
# Mail Stop B8
|
|
|
|
# Omaha, NE 68106
|
|
|
|
# 402.291.0100
|
|
|
|
#
|
|
|
|
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
|
|
|
# further licensing information.
|
|
|
|
##
|
|
|
|
|
|
|
|
from numpy import arctan2
|
|
|
|
from numpy import hypot
|
|
|
|
from numpy import cos
|
|
|
|
from numpy import sin
|
|
|
|
from numpy import degrees
|
|
|
|
from numpy import radians
|
|
|
|
from numpy import abs
|
|
|
|
from numpy import isscalar, empty, float32
|
|
|
|
|
2014-01-14 11:47:50 -06:00
|
|
|
def execute(u, v, magDir=None):
|
2012-01-06 08:55:05 -06:00
|
|
|
""" Make a vector from u,v or mag, dir.
|
|
|
|
|
2014-01-14 11:47:50 -06:00
|
|
|
@param magDir
|
2012-01-06 08:55:05 -06:00
|
|
|
controls how the function operates on the given u and v values.
|
2014-01-14 11:47:50 -06:00
|
|
|
When the magDir is specified and is a constant scalar value
|
2012-01-06 08:55:05 -06:00
|
|
|
the u and v input values are assumed to be speed and direction.
|
|
|
|
|
2014-01-14 11:47:50 -06:00
|
|
|
positive :: assume meteorological direction(direction from)
|
|
|
|
negative :: assume mathematical direction(direction to)
|
2012-01-06 08:55:05 -06:00
|
|
|
|
2014-01-14 11:47:50 -06:00
|
|
|
abs(legacyOption) == 1 :: assume direction in degrees
|
|
|
|
abs(legacyOption) != 1 :: assume direction in radians
|
|
|
|
|
|
|
|
@return: tuple of (u,v)
|
2012-01-06 08:55:05 -06:00
|
|
|
|
|
|
|
"""
|
|
|
|
# If either u or v is a single number, expand it to match an entire Grid
|
|
|
|
if isscalar(u) and not(isscalar(v)):
|
|
|
|
tmp = empty(v.shape, float32)
|
|
|
|
tmp.fill(u)
|
|
|
|
u = tmp
|
|
|
|
|
|
|
|
if isscalar(v) and not(isscalar(u)):
|
|
|
|
tmp = empty(u.shape, float32)
|
|
|
|
tmp.fill(v)
|
|
|
|
v = tmp
|
|
|
|
|
2014-01-14 11:47:50 -06:00
|
|
|
if magDir == None:
|
|
|
|
return componentsTo(u, v)
|
|
|
|
elif magDir == 1:
|
|
|
|
return magDirDegreesFrom(u, v);
|
|
|
|
elif magDir == -1:
|
|
|
|
return magDirDegreesTo(u, v);
|
|
|
|
elif magDir >= 0:
|
|
|
|
return magDirRadiansFrom(u, v);
|
2012-01-06 08:55:05 -06:00
|
|
|
else:
|
2014-01-14 11:47:50 -06:00
|
|
|
return magDirRadiansTo(u, v);
|
2012-01-06 08:55:05 -06:00
|
|
|
|
2014-01-14 11:47:50 -06:00
|
|
|
def componentsTo(u,v):
|
|
|
|
return (u, v)
|
|
|
|
|
|
|
|
def magDirRadiansTo(mag, dir):
|
|
|
|
u = sin(dir) * mag
|
|
|
|
v = cos(dir) * mag
|
|
|
|
return componentsTo(u,v)
|
|
|
|
|
|
|
|
def magDirDegreesTo(mag, dir):
|
|
|
|
return magDirRadiansTo(mag, radians(dir))
|
|
|
|
|
|
|
|
def componentsFrom(u,v):
|
|
|
|
return componentsTo(-u,-v)
|
|
|
|
|
|
|
|
def magDirRadiansFrom(mag, dir):
|
|
|
|
u = sin(dir) * mag
|
|
|
|
v = cos(dir) * mag
|
|
|
|
return componentFrom(u,v)
|
|
|
|
|
|
|
|
def magDirDegreesFrom(mag, dir):
|
|
|
|
return magDirRadiansFrom(mag, radians(dir))
|