示例#1
0
    def test_construction(self):

        u = None
        v = None
        with pytest.raises(ValueError):
            # mismatched data and dates length
            dates = []
            u = TimeSeriesProp(
                'u', 'm/s', [datetime.datetime.now(),
                             datetime.datetime.now()], [
                                 5,
                             ])

        u = TimeSeriesProp('u', 'm/s', [datetime.datetime.now()], [
            5,
        ])

        assert u is not None
        assert u.name == 'u'
        assert u.units == 'm/s'

        v = None
        with pytest.raises(ValueError):
            v = TimeSeriesProp('v', 'nm/hr', [datetime.datetime.now()], [
                5,
            ])

        assert v is None

        constant = TimeSeriesProp.constant('const', 'm/s', 5)
        assert constant.data[0] == 5
        assert all(constant.at(np.array((0, 0)), datetime.datetime.now()) == 5)
示例#2
0
    def __init__(self,
                 temperature=300.,
                 salinity=35.0,
                 sediment=.005,
                 fetch=0,
                 name='WaterConditions',
                 **kwargs):
        '''
        Assume units are SI for all properties. 'units' attribute assumes SI
        by default. This can be changed, but initialization takes SI.
        '''
        if isinstance(temperature, (Number)):
            self.temperature = TemperatureTS.constant(data=temperature)
        elif isinstance(temperature, (EnvProp)):
            self.temperature = temperature
        else:
            raise TypeError('Temperature is not an environment object or number')
        if isinstance(salinity, (Number)):
            self.salinity = TimeSeriesProp.constant(name='Salinity', units='psu', data=salinity)
        elif isinstance(salinity, (EnvProp)):
            self.salinity = salinity
        else:
            raise TypeError('Salinity is not an environment object or number')
        if isinstance(sediment, (Number)):
            self.sediment = TimeSeriesProp.constant(name='Sediment', units='kg/m^3', data=sediment)
        elif isinstance(sediment, (EnvProp)):
            self.sediment = sediment
        else:
            raise TypeError('Sediment is not an environment object or number')
#         self.wave_height = wave_height
        self.fetch = fetch
        self.kinematic_viscosity = 0.000001
        self.name = 'WaterConditions'
示例#3
0
    def test_at(self):

        dates2 = np.array([
            dt.datetime(2000, 1, 1, 0),
            dt.datetime(2000, 1, 1, 2),
            dt.datetime(2000, 1, 1, 4),
            dt.datetime(2000, 1, 1, 6),
            dt.datetime(2000, 1, 1, 8),
        ])
        u_data = np.array([2., 4., 6., 8., 10.])
        u = TimeSeriesProp(name='u', units='m/s', time=dates2, data=u_data)

        corners = np.array(((1, 1), (2, 2)))
        t1 = dt.datetime(1999, 12, 31, 23)
        t2 = dt.datetime(2000, 1, 1, 0)
        t3 = dt.datetime(2000, 1, 1, 1)
        t4 = dt.datetime(2000, 1, 1, 8)
        t5 = dt.datetime(2000, 1, 1, 9)

        # No extrapolation. out of bounds time should fail
        with pytest.raises(ValueError):
            u.at(corners, t1)
        assert (u.at(corners, t2) == np.array([2])).all()
        assert (u.at(corners, t3) == np.array([3])).all()
        assert (u.at(corners, t4) == np.array([10])).all()
        with pytest.raises(ValueError):
            u.at(corners, t5)

        # turn extrapolation on
        assert (u.at(corners, t1, extrapolate=True) == np.array([2])).all()
        assert (u.at(corners, t5, extrapolate=True) == np.array([10])).all()
示例#4
0
    def __init__(self,
                 name=None,
                 units='K',
                 time=None,
                 data=None,
                 **kwargs):
        if 'timeseries' in kwargs:
            ts = kwargs['timeseries']

            time = map(lambda e: e[0], ts)
            data = np.array(map(lambda e: e[1], ts))
        TimeSeriesProp.__init__(self, name, units, time, data=data)
示例#5
0
    def __init__(self,
                 name=None,
                 units='K',
                 time=None,
                 data=None,
                 **kwargs):
        if 'timeseries' in kwargs:
            ts = kwargs['timeseries']

            time = map(lambda e: e[0], ts)
            data = np.array(map(lambda e: e[1], ts))
        TimeSeriesProp.__init__(self, name, units, time, data=data)
示例#6
0
 def __init__(self,
              name=None,
              units='kg/m^3',
              temperature=None,
              salinity=None):
     if temperature is None or salinity is None or not isinstance(temperature, TemperatureTS) or not isinstance(salinity, SalinityTS):
         raise ValueError('Must provide temperature and salinity time series Environment objects')
     density_times = temperature.time if len(temperature.time.time) > len(salinity.time.time) else salinity.time
     dummy_pt = np.array([[0, 0], ])
     import gsw
     from gnome import constants
     data = [gsw.rho(salinity.at(dummy_pt, t), temperature.at(dummy_pt, t, units='C'), constants.atmos_pressure * 0.0001) for t in density_times.time]
     TimeSeriesProp.__init__(self, name, units, time=density_times, data=data)
示例#7
0
    def test_unit_conversion(self):
        u = TimeSeriesProp('u', 'm/s', [datetime.datetime.now()], [
            5,
        ])

        t = u.in_units('km/hr')

        assert t.data is not u.data
        assert round(t.data[0], 2) == 18.0

        with pytest.raises(unit_conversion.NotSupportedUnitError):
            # mismatched data and dates length
            t = u.in_units('nm/hr')
示例#8
0
 def __init__(self,
              name=None,
              units='kg/m^3',
              temperature=None,
              salinity=None):
     if temperature is None or salinity is None or not isinstance(temperature, TemperatureTS) or not isinstance(salinity, SalinityTS):
         raise ValueError('Must provide temperature and salinity time series Environment objects')
     density_times = temperature.time if len(temperature.time.time) > len(salinity.time.time) else salinity.time
     dummy_pt = np.array([[0, 0], ])
     import gsw
     from gnome import constants
     data = [gsw.rho(salinity.at(dummy_pt, t), temperature.at(dummy_pt, t, units='C'), constants.atmos_pressure * 0.0001) for t in density_times.time]
     TimeSeriesProp.__init__(self, name, units, time=density_times, data=data)
示例#9
0
 def new_from_dict(cls, dict_):
     varnames = dict_['varnames']
     vs = []
     for i, varname in enumerate(varnames):
         vs.append(
             TimeSeriesProp(name=varname,
                            units=dict_['units'],
                            time=dict_['time'],
                            data=dict_['data'][i]))
     dict_.pop('data')
     dict_['variables'] = vs
     return super(VelocityTS, cls).new_from_dict(dict_)
示例#10
0
    def test_construction(self):

        u = None
        v = None
        with pytest.raises(ValueError):
            # mismatched data and dates length
            u = TimeSeriesProp('u', 'm/s', dates, u_data)

        assert u is None

        u = TimeSeriesProp('u', 'm/s', dates2, u_data)

        assert u is not None
        assert u.name == 'u'
        assert u.units == 'm/s'
        print u.time == Time(dates2)
        assert u.time == Time(dates2)
        assert (u.data == u_data).all()

        v = None
        with pytest.raises(ValueError):
            v = TimeSeriesProp('v', 'nm/hr', dates2, v_data)

        assert v is None
示例#11
0
    def constant(cls,
                 name='',
                 speed=0,
                 direction=0,
                 units='m/s'):
        """
        utility to create a constant wind "timeseries"

        :param speed: speed of wind
        :param direction: direction -- degrees True, direction wind is from
                          (degrees True)
        :param units='m/s': units for speed, as a string, i.e. "knots", "m/s",
                           "cm/s", etc.

        .. note:: 
            The time for a constant wind timeseries is irrelevant. This
            function simply sets it to datetime.now() accurate to hours.
        """
        direction = direction * -1 - 90
        u = speed * np.cos(direction * np.pi / 180)
        v = speed * np.sin(direction * np.pi / 180)
        u = TimeSeriesProp.constant('u', units, u)
        v = TimeSeriesProp.constant('v', units, v)
        return super(VelocityTS, cls).constant(name, units, variables=[u, v])
示例#12
0
 def __init__(self, angle=None, **kwargs):
     """
     :param angle: scalar field of cell rotation angles (for rotated/distorted grids)
     """
     if 'variables' in kwargs:
         variables = kwargs['variables']
         if len(variables) == 2:
             variables.append(TimeSeriesProp(name='constant w', data=[0.0], time=Time.constant_time(), units='m/s'))
         kwargs['variables'] = variables
     if angle is None:
         df = None
         if kwargs.get('dataset', None) is not None:
             df = kwargs['dataset']
         elif kwargs.get('grid_file', None) is not None:
             df = _get_dataset(kwargs['grid_file'])
         if df is not None and 'angle' in df.variables.keys():
             # Unrotated ROMS Grid!
             self.angle = GriddedProp(name='angle', units='radians', time=None, grid=kwargs['grid'], data=df['angle'])
         else:
             self.angle = None
     else:
         self.angle = angle
     super(VelocityGrid, self).__init__(**kwargs)
示例#13
0
            )  # scale winds from 100-0% depending on ice coverage
            return vels
        else:
            return self.wind_var.at(points, time, units, extrapolate)


if __name__ == "__main__":
    import datetime as dt
    dates = np.array([
        dt.datetime(2000, 1, 1, 0),
        dt.datetime(2000, 1, 1, 2),
        dt.datetime(2000, 1, 1, 4)
    ])
    u_data = np.array([3, 4, 5])
    v_data = np.array([4, 3, 12])
    u = TimeSeriesProp('u', 'm/s', dates, u_data)
    v = TimeSeriesProp('v', 'm/s', dates, v_data)

    print u.at(np.array([(1, 1), (1, 2)]), dt.datetime(2000, 1, 1, 1))

    vprop = TSVectorProp('velocity', 'm/s', variables=[u, v])
    print vprop.at(np.array([(1, 1), (1, 2)]), dt.datetime(2000, 1, 1, 3))

    vel = VelocityTS('test_vel', variables=[u, v])
    print vel.at(np.array([(1, 1), (1, 2)]), dt.datetime(2000, 1, 1, 3))

    import pprint
    pp = pprint.PrettyPrinter(indent=4)
    pp.pprint(vel.serialize())
    pp.pprint(VelocityTS.deserialize(vel.serialize()))
示例#14
0
def v():
    return TimeSeriesProp(name='v', units='m/s', time=dates2, data=v_data)
示例#15
0
def u():
    return TimeSeriesProp(name='u', units='m/s', time=dates2, data=u_data)