Ejemplo n.º 1
0
    def test_seed_elements(self):
        # Some cases with expected outcome
        lon_vec = np.array([3, 4, 5])
        lat_vec = np.array([63, 64, 65])
        lon0 = 3
        lat0 = 60
        t0 = datetime.now()
        t1 = t0 + timedelta(hours=6)
        t2 = t1 + timedelta(hours=6)
        t_vec = [t0, t1, t2]
        number_config = 222

        cases = [
            {
                'lon': lon0,
                'lat': lat0,
                'time': t0,
                'number': None,
                'expected': number_config
            },
            {
                'lon': lon0,
                'lat': lat0,
                'time': t0,
                'number': 12,
                'expected': 12,
                'maxlat': lat0
            },
            {
                'lon': lon0,
                'lat': lat0,
                'time': t0,
                'radius': 1000,
                'number': 12,
                'expected': 12,
                'maxlat': lat0 + .013
            },
            {
                'lon': lon0,
                'lat': lat0,
                'time': [t0, t1],
                'maxtime': t1,
                'number': 12,
                'expected': 12
            },
            {
                'lon': lon0,
                'lat': lat0,
                'time': t_vec,  # Time series
                'maxtime': t2,
                'number': None,
                'expected': len(t_vec)
            },
            {
                'lon': lon0,
                'lat': lat0,
                'time': t_vec,
                'number': 12,
                'expected': 'error'
            },
            {
                'lon': lon_vec,
                'lat': lat_vec,
                'time': t0,
                'number': None,
                'expected': 3
            },
            {
                'lon': lon_vec,
                'lat': lat_vec,
                'time': t0,
                'wind_drift_factor': .05,
                'number': None,
                'expected': 3
            },
            {
                'lon': lon_vec,
                'lat': lat_vec,
                'time': t0,
                'wind_drift_factor': [.01, .02, .03],
                'number': None,
                'expected': 3
            },
            {
                'lon': lon_vec,
                'lat': lat_vec,
                'time': t0,
                'number': 4,
                'expected': 'error'
            },
            {
                'lon': lon_vec,
                'lat': lat_vec,
                'time': t_vec,
                'number': None,
                'expected': 3,
                'maxtime': t_vec[-1]
            },
        ]

        for case in cases:
            o = OceanDrift(loglevel=50)
            o._set_config_default('seed:number', number_config)
            expected = case['expected']
            del case['expected']
            if 'maxlat' in case:
                maxlat = case['maxlat']
                del case['maxlat']
            else:
                maxlat = None
            if 'maxtime' in case:
                maxtime = case['maxtime']
                del case['maxtime']
            else:
                maxtime = None
            if expected == 'error':
                with self.assertRaises(ValueError):
                    n = o.seed_elements(**case)
            else:
                o.seed_elements(**case)
                self.assertEqual(o.num_elements_total(), expected)
                if maxlat is not None:
                    self.assertAlmostEqual(o.elements_scheduled.lat.max(),
                                           maxlat, 2)
                if maxtime is not None:
                    self.assertEqual(
                        o.elements_scheduled_time.max().replace(microsecond=0),
                        maxtime.replace(microsecond=0))
                if 'wind_drift_factor' in case:
                    self.assertEqual(
                        np.array(case['wind_drift_factor']).max().astype(
                            np.float32),
                        o.elements_scheduled.wind_drift_factor.max())
Ejemplo n.º 2
0
    def test_seed_cone(self):

        # Some cases with expected outcome
        lon0 = 3
        lon1 = 4
        lon2 = 5
        lat0 = 60
        lat1 = 60.2
        lat2 = 60.4
        lon_vec = np.array([lon0, lon1, lon2])
        lat_vec = np.array([lat0, lat1, lat2])
        t0 = datetime.now()
        t1 = t0 + timedelta(hours=6)
        t2 = t1 + timedelta(hours=6)
        t_vec = [t0, t1, t2]
        r0 = 1000
        r1 = 2000
        number_config = 222

        cases = [
            {
                'lon': lon0,
                'lat': lat0,
                'time': t0,
                'number': None,
                'expected': number_config
            },
            {
                'lon': lon0,
                'lat': lat0,
                'time': t0,
                'number': 12,
                'expected': 12,
                'maxlat': lat0
            },
            {
                'lon': lon0,
                'lat': lat0,
                'time': t0,
                'radius': 1000,
                'number': 12,
                'expected': 12,
                'maxlat': lat0 + .013
            },
            {
                'lon': lon0,
                'lat': lat0,
                'time': [t0, t1],
                'maxtime': t1,
                'number': 12,
                'expected': 12
            },
            {
                'lon': lon0,
                'lat': lat0,
                'time': t_vec,
                'number': 12,
                'expected': 'error'
            },
            {
                'lon': lon_vec,
                'lat': lat_vec,
                'time': t0,
                'number': None,
                'expected': 'error'
            },
            {
                'lon': lon0,
                'lat': lat0,
                'time': t0,
                'wind_drift_factor': .05,
                'number': None,
                'expected': number_config
            },
            {
                'lon': [lon0, lon1],
                'lat': [lat0, lat1],
                'time': t0,
                'number': None,
                'expected': number_config
            },
            {
                'lon': [lon0, lon1],
                'lat': [lat0, lat1],
                'time': t0,
                'number': 12,
                'expected': 12
            },
            {
                'lon': [lon0, lon1],
                'lat': [lat0, lat1],
                'time': t0,
                'radius': 0,
                'number': 200,
                'expected': 200,
                'maxlat': lat1
            },
            {
                'lon': [lon0, lon1],
                'lat': [lat0, lat1],
                'time': t0,
                'radius': 2000,
                'number': 200,
                'expected': 200,
                'maxlat': lat1 + .024
            },
            {
                'lon': [lon0, lon1],
                'lat': [lat0, lat1],
                'time': t0,
                'radius': [1000, 2000],
                'number': 200,
                'expected': 200,
                'maxlat': lat1 + .024
            },
            {
                'lon': [lon0, lon1],
                'lat': [lat0, lat1],
                'time': t0,
                'radius': [1000, 2000, 3000],
                'number': 200,
                'expected': 'error'
            },
            #'wind_drift_factor': [.01, .02, .03],
            {
                'lon': [lon0, lon1],
                'lat': [lat0, lat1],
                'time': [t0, t1],
                'number': None,
                'expected': number_config,
                'maxtime': t1
            },
            {
                'lon': [lon0, lon1],
                'lat': [lat0, lat1],
                'time': [t0, t1],
                'radius': [r0, r1],
                'number': None,
                'expected': number_config,
                'maxtime': t1
            },
            {
                'lon': [lon0, lon1],
                'lat': [lat0, lat1],
                'time': [t0, t1],
                'radius': [r0, r0],
                'number': None,
                'expected': number_config,
                'maxtime': t1
            },
        ]

        for case in cases:
            o = OceanDrift(loglevel=50)
            o._set_config_default('seed:number', number_config)
            expected = case['expected']
            del case['expected']
            if 'maxlat' in case:
                maxlat = case['maxlat']
                del case['maxlat']
            else:
                maxlat = None
            if 'maxtime' in case:
                maxtime = case['maxtime']
                del case['maxtime']
            else:
                maxtime = None
            if expected == 'error':
                with self.assertRaises(ValueError):
                    n = o.seed_cone(**case)
            else:
                o.seed_cone(**case)
                self.assertEqual(o.num_elements_total(), expected)
                if maxlat is not None:
                    self.assertAlmostEqual(o.elements_scheduled.lat.max(),
                                           maxlat, 2)
                if maxtime is not None:
                    self.assertEqual(
                        o.elements_scheduled_time.max().replace(microsecond=0),
                        maxtime.replace(microsecond=0))
                if 'wind_drift_factor' in case:
                    self.assertEqual(
                        np.array(case['wind_drift_factor']).max().astype(
                            np.float32),
                        o.elements_scheduled.wind_drift_factor.max())