예제 #1
0
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)
예제 #2
0
    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
예제 #3
0
    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
예제 #4
0
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
예제 #5
0
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])
예제 #6
0
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
예제 #7
0
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)
예제 #8
0
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
예제 #9
0
    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
예제 #10
0
    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'.