def test_r_theta_to_uv_wind(rq_wind): uv_out = r_theta_to_uv_wind(rq_wind['rq']) print 'actual (u,v): ' print uv_out print 'computed (u,v): ' print rq_wind['uv'] assert np.allclose(uv_out, rq_wind['uv'], atol, rtol)
def _expected_move(self): """ Put the expected move logic in separate (fixture) if it gets used multiple times """ uv = r_theta_to_uv_wind(self.time_val['value']) exp = np.zeros((self.sc.num_released, 3)) exp[:, 0] = self.sc['windages'] * uv[0, 0] * self.time_step exp[:, 1] = self.sc['windages'] * uv[0, 1] * self.time_step xform = FlatEarthProjection.meters_to_lonlat(exp, self.sc['positions']) return xform
def _expected_move(self): """ Put the expected move logic in separate (fixture) if it gets used multiple times """ uv = r_theta_to_uv_wind(self.time_val['value']) exp = np.zeros((self.sc.num_released, 3)) exp[:, 0] = self.sc['windages'] * uv[0, 0] * self.time_step exp[:, 1] = self.sc['windages'] * uv[0, 1] * self.time_step xform = FlatEarthProjection.meters_to_lonlat(exp, self.sc['positions']) return xform
def to_time_value_pair(datetime_value, in_ts_format=None): """ converts a numpy array containing basic_types.datetime_value_2d in user specified basic_types.ts_format into a time_value_pair array or it takes a basic_types.datetime_value_1d array and converts it to a time_value_pair array -- for 1d data, assume the ['value'] contains the 'u' component and set the 'v' component to 0.0 :param datetime_value: numpy array of type basic_types.datetime_value_2d or basic_types.datetime_value_1d :param in_ts_format=None: format of the datetime_value_2d array - not required when converting from datetime_value_1d. Can be defined by a string 'r-theta', 'uv' or by an integer defined by one of the options given in basic_types.ts_format. """ if(datetime_value.dtype != basic_types.datetime_value_2d and datetime_value.dtype != basic_types.datetime_value_1d): raise ValueError('Method expects a numpy array containing ' 'basic_types.datetime_value_2d or basic_types.datetime_value_1d') # convert datetime_value_2d to time_value_pair time_value_pair = np.zeros((len(datetime_value), ), dtype=basic_types.time_value_pair) time_value_pair['time'] = \ time_utils.date_to_sec(datetime_value['time']) if datetime_value.dtype == basic_types.datetime_value_1d: time_value_pair['value']['u'] = datetime_value['value'][:, 0] else: if in_ts_format is None: raise ValueError("for datetime_value_2d data conversion, the " "format defined by 'in_ts_format', cannot be None ") if isinstance(in_ts_format, basestring): in_ts_format = tsformat(in_ts_format) if in_ts_format == basic_types.ts_format.magnitude_direction: uv = transforms.r_theta_to_uv_wind(datetime_value['value']) time_value_pair['value']['u'] = uv[:, 0] time_value_pair['value']['v'] = uv[:, 1] elif in_ts_format == basic_types.ts_format.uv: time_value_pair['value']['u'] = datetime_value['value'][:, 0] time_value_pair['value']['v'] = datetime_value['value'][:, 1] else: raise ValueError('in_ts_format is not one of the two supported ' 'types: basic_types.ts_format.magnitude_direction, ' 'basic_types.ts_format.uv') return time_value_pair
def test_exceptions(invalid_rq): with pytest.raises(ValueError): r_theta_to_uv_wind(invalid_rq['rq'][0]) with pytest.raises(ValueError): r_theta_to_uv_wind(invalid_rq['rq'][1]) with pytest.raises(ValueError): r_theta_to_uv_wind(invalid_rq['rq'][2])
def to_time_value_pair(datetime_value, in_ts_format=None): """ converts a numpy array containing basic_types.datetime_value_2d in user specified basic_types.ts_format into a time_value_pair array or it takes a basic_types.datetime_value_1d array and converts it to a time_value_pair array -- for 1d data, assume the ['value'] contains the 'u' component and set the 'v' component to 0.0 :param datetime_value: numpy array of type basic_types.datetime_value_2d or basic_types.datetime_value_1d :param in_ts_format=None: format of the datetime_value_2d array - not required when converting from datetime_value_1d. Can be defined by a string 'r-theta', 'uv' or by an integer defined by one of the options given in basic_types.ts_format. """ if (datetime_value.dtype not in (basic_types.datetime_value_2d, basic_types.datetime_value_1d)): raise ValueError('Method expects a numpy array containing ' 'basic_types.datetime_value_2d or ' 'basic_types.datetime_value_1d') # convert datetime_value_2d to time_value_pair time_value_pair = np.zeros((len(datetime_value), ), dtype=basic_types.time_value_pair) time_value_pair['time'] = time_utils.date_to_sec(datetime_value['time']) if datetime_value.dtype == basic_types.datetime_value_1d: time_value_pair['value']['u'] = datetime_value['value'][:] else: if in_ts_format is None: raise ValueError("for datetime_value_2d data conversion, " "the format defined by 'in_ts_format' " "cannot be None ") if isinstance(in_ts_format, basestring): in_ts_format = tsformat(in_ts_format) if in_ts_format == basic_types.ts_format.magnitude_direction: uv = transforms.r_theta_to_uv_wind(datetime_value['value']) time_value_pair['value']['u'] = uv[:, 0] time_value_pair['value']['v'] = uv[:, 1] elif in_ts_format == basic_types.ts_format.uv: time_value_pair['value']['u'] = datetime_value['value'][:, 0] time_value_pair['value']['v'] = datetime_value['value'][:, 1] else: raise ValueError('in_ts_format is not one of the two supported ' 'types: ' 'basic_types.ts_format.magnitude_direction, ' 'basic_types.ts_format.uv') return time_value_pair
def test_wind_inverse(rq_rand): """ randomly generates an (r,theta) and applies the transform to convert to (u,v), then back to (r,theta). It checks the result is accurate to within 10-10 absolute tolerance """ rq_out = uv_to_r_theta_wind(r_theta_to_uv_wind(rq_rand['rq'])) print 'actual (r,theta): ' print rq_rand['rq'] print 'computed (r,theta): ' print rq_out assert np.allclose(rq_out, rq_rand['rq'], inv_atol, rtol)
def to_time_value_pair(datetime_value_2d, in_ts_format): """ converts a numpy array containing basic_types.datetime_value_2d in user specified basic_types.ts_format into a time_value_pair array :param datetime_value_2d: numpy array of type basic_types.datetime_value_2d :param in_ts_format: format of the array. Can be defined by a string 'r-theta', 'uv' or by an integer defined by one of the options given in basic_types.ts_format """ # print (datetime_value_2d.dtype, basic_types.datetime_value_2d) if datetime_value_2d.dtype != basic_types.datetime_value_2d: raise ValueError("Method expects a numpy array containing basic_types.datetime_value_2d") # convert datetime_value_2d to time_value_pair time_value_pair = np.zeros((len(datetime_value_2d),), dtype=basic_types.time_value_pair) if type(in_ts_format) is str: in_ts_format = tsformat(in_ts_format) if in_ts_format == basic_types.ts_format.magnitude_direction: time_value_pair["time"] = time_utils.date_to_sec(datetime_value_2d["time"]) uv = transforms.r_theta_to_uv_wind(datetime_value_2d["value"]) time_value_pair["value"]["u"] = uv[:, 0] time_value_pair["value"]["v"] = uv[:, 1] elif in_ts_format == basic_types.ts_format.uv: time_value_pair["time"] = time_utils.date_to_sec(datetime_value_2d["time"]) time_value_pair["value"]["u"] = datetime_value_2d["value"][:, 0] time_value_pair["value"]["v"] = datetime_value_2d["value"][:, 1] else: raise ValueError( "in_ts_format is not one of the two supported types: basic_types.ts_format.magnitude_direction, basic_types.ts_format.uv" ) return time_value_pair
Since 'rq_rand' randomly generates (r,theta), the corresponing (u,v) are calculated from gnome.utilities.transforms.r_theta_to_uv_wind(...). Assumes this method works correctly. """ from gnome.utilities import transforms dtv_rq = np.zeros((len(rq_rand['rq']), ), dtype=datetime_value_2d).view(dtype=np.recarray) dtv_rq.time = [datetime(2012, 11, 06, 20, 10 + i, 30) for i in range(len(dtv_rq))] dtv_rq.value = rq_rand['rq'] dtv_uv = np.zeros((len(dtv_rq), ), dtype=datetime_value_2d).view(dtype=np.recarray) dtv_uv.time = dtv_rq.time dtv_uv.value = transforms.r_theta_to_uv_wind(rq_rand['rq']) wm = Wind(timeseries=dtv_rq, format='r-theta', units='meter per second') return {'wind': wm, 'rq': dtv_rq, 'uv': dtv_uv} # @pytest.fixture(scope="module",params=['wind_circ','wind_rand']) @pytest.fixture(scope='module', params=['wind_circ']) def all_winds(request): """ NOTE: Since random test setup (wind_rand) occasionally makes test_get_wind_data_by_time_scalar fail, omit this test case for now. It is being investigated. Create Wind object using the time series given by the test fixture
Assumes this method works correctly. """ from gnome.utilities import transforms dtv_rq = np.zeros((len(rq_rand['rq']), ), dtype=datetime_value_2d).view(dtype=np.recarray) dtv_rq.time = [ datetime(2012, 11, 06, 20, 10 + i, 30) for i in range(len(dtv_rq)) ] dtv_rq.value = rq_rand['rq'] dtv_uv = np.zeros((len(dtv_rq), ), dtype=datetime_value_2d).view(dtype=np.recarray) dtv_uv.time = dtv_rq.time dtv_uv.value = transforms.r_theta_to_uv_wind(rq_rand['rq']) wm = Wind(timeseries=dtv_rq, coord_sys='r-theta', units='meter per second') return {'wind': wm, 'rq': dtv_rq, 'uv': dtv_uv} @pytest.fixture(scope='module', params=['wind_circ']) def all_winds(request): """ NOTE: Since random test setup (wind_rand) occasionally makes test_get_wind_data_by_time_scalar fail, omit this test case for now. It is being investigated. Create Wind object using the time series given by the test fixture 'wind_circ', 'wind_rand'.