示例#1
0
    def test_clip_domain(self):
        o = OceanDrift(loglevel=50)
        r1 = reader_ROMS_native.Reader(
            o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc'
        )
        r1.clip_boundary_pixels(20)
        r2 = reader_ROMS_native.Reader(
            o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc'
        )
        self.assertEqual(r2.shape, (151, 81))
        self.assertEqual(r1.shape, (111, 41))
        self.assertEqual(r1.xmin, 20)

        o1 = OceanDrift(loglevel=50)
        del o1.fallback_values['x_sea_water_velocity']
        o1.add_reader(r1)
        o1.seed_elements(lon=15, lat=70.1, time=r1.start_time)
        o1.fallback_values['land_binary_mask'] = 0
        o1.run(time_step=3600 * 3, duration=timedelta(hours=48))
        o2 = OceanDrift(loglevel=50)
        del o2.fallback_values['x_sea_water_velocity']
        o2.add_reader(r2)
        o2.seed_elements(lon=15, lat=70.1, time=r1.start_time)
        o2.fallback_values['land_binary_mask'] = 0
        o2.run(time_step=3600 * 3, duration=timedelta(hours=48))
        # Compare
        lat1 = o1.get_property('lat')[0]
        lat2 = o2.get_property('lat')[0]
        self.assertEqual(len(lat1), 14)
        self.assertEqual(len(lat2), 17)
        self.assertIsNone(np.testing.assert_allclose(lat1[0:13], lat2[0:13]))
        # Test reader netCDF_CF_generic
        r = reader_netCDF_CF_generic.Reader(
            o.test_data_folder() +
            '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc')
        self.assertEqual(r.shape, (301, 201))
        o3 = OceanDrift(loglevel=50)
        del o3.fallback_values['x_sea_water_velocity']
        o3.fallback_values['land_binary_mask'] = 0
        o3.add_reader(r)
        o3.seed_elements(lon=4.36, lat=61.7, time=r.start_time)
        o3.run(steps=24)
        r.clip_boundary_pixels(10)
        self.assertEqual(r.shape, (281, 181))
        o4 = OceanDrift(loglevel=50)
        del o4.fallback_values['x_sea_water_velocity']
        o4.fallback_values['land_binary_mask'] = 0
        o4.add_reader(r)
        o4.seed_elements(lon=4.36, lat=61.7, time=r.start_time)
        o4.run(steps=24)
        # Compare
        lat3 = o3.get_property('lat')[0]
        lat4 = o4.get_property('lat')[0]
        self.assertEqual(len(lat3), 25)
        self.assertEqual(len(lat4), 13)
        self.assertIsNone(np.testing.assert_allclose(lat3[0:12], lat4[0:12]))
示例#2
0
    def test_MFDataset(self):

        reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=13.5,
                                                        llcrnrlat=67.1,
                                                        urcrnrlon=14.6,
                                                        urcrnrlat=67.7,
                                                        resolution='i',
                                                        projection='merc')

        o = OceanDrift3D(loglevel=0)
        o.set_config('general:basemap_resolution', 'i')
        nordicMF = reader_ROMS_native.Reader(
            o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic_subset_day*.nc')
        nordicMF_all = reader_ROMS_native.Reader(
            o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/Nordic_subset.nc')
        lon = 14.0
        lat = 67.3
        #nordic3d = reader_ROMS_native.Reader(o.test_data_folder() +
        #    '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')
        #o.add_reader(nordic3d)  # Slightly different results
        # Subset is made with ncks, and should give identical result
        # e0=0, e1=20, x0=40, x1=70
        # ncks -d eta_rho,0,$e1 -d eta_psi,0,$e1 -d eta_v,0,$e1 -d eta_u,0,$e1 -d xi_rho,$x0,$x1 -d xi_psi,$x0,$x1 -d xi_v,$x0,$x1 -d xi_u,$x0,$x1 Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc Nordic_subset.nc -O --fl_fmt=netcdf4_classic
        # ncks -O -d ocean_time,0 Nordic_subset.nc Nordic_subset_day1.nc
        o.add_reader([reader_basemap, nordicMF_all])
        o.seed_elements(lon,
                        lat,
                        number=100,
                        radius=5000,
                        time=nordicMF_all.start_time)
        o.run(steps=48, time_step=3600)

        # Same run, with multi-file dataset
        o2 = OceanDrift3D(loglevel=30)
        o2.set_config('general:basemap_resolution', 'i')
        o2.add_reader([reader_basemap, nordicMF])
        o2.seed_elements(lon,
                         lat,
                         number=100,
                         radius=5000,
                         time=nordicMF_all.start_time)
        o2.run(steps=48, time_step=3600)

        #o.plot(filename='o1.png', background='sea_floor_depth_below_sea_level')
        #o2.plot(filename='o2.png', background='sea_floor_depth_below_sea_level')

        self.assertEqual(o.num_elements_active(), 67)
        self.assertEqual(o2.num_elements_active(), 67)
        self.assertEqual(o.num_elements_deactivated(), 33)
        self.assertEqual(o2.num_elements_deactivated(), 33)
        self.assertEqual(o.elements.lon[0], o2.elements.lon[0])
示例#3
0
    def test_adding_readers(self):
        o = OceanDrift()
        basemap = reader_basemap_landmask.Reader(llcrnrlon=-1.5,
                                                 llcrnrlat=59,
                                                 urcrnrlon=7,
                                                 urcrnrlat=64,
                                                 resolution='c')
        r = reader_ROMS_native.Reader(
            o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc'
        )
        o.add_reader([r, basemap])
        self.assertEqual(o.priority_list['land_binary_mask'],
                         ['roms native', 'basemap_landmask'])
        self.assertEqual(o.priority_list['x_sea_water_velocity'],
                         ['roms native'])
        # Switch order
        o = OceanDrift()
        o.add_reader([basemap, r])
        self.assertEqual(o.priority_list['land_binary_mask'],
                         ['basemap_landmask', 'roms native'])
        self.assertEqual(o.priority_list['x_sea_water_velocity'],
                         ['roms native'])

        # Test add_readers_from_list
        o = OceanDrift()
        o.add_readers_from_list(reader_list, lazy=False)
        self.assertEqual(o.priority_list['x_sea_water_velocity'],
                         ['roms native'])
        self.assertEqual(o.priority_list['x_wind'], [
            o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/AROME_MetCoOp_00_DEF.nc_20160202_subset'
        ])
示例#4
0
 def test_vertical_interpolation_sigma(self):
     nordic3d = reader_ROMS_native.Reader(
         o.test_data_folder() +
         '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc'
     )
     lon = np.array([12.46, 12.46, 12.46])
     lat = np.array([68.21, 69.31, 69.31])
     z = np.array([-33, 0, -2500])
     x, y = nordic3d.lonlat2xy(lon, lat)
     variables = [
         'x_sea_water_velocity', 'y_sea_water_velocity',
         'sea_water_temperature'
     ]
     # Call get_variables_interpolated which interpolates both in
     data = nordic3d.get_variables(variables,
                                   time=nordic3d.start_time +
                                   timedelta(seconds=900),
                                   x=x,
                                   y=y,
                                   z=z,
                                   block=True)
     self.assertAlmostEqual(data['sea_water_temperature'][0, 60, 60], 3.447,
                            2)
     #3.59, 2)
     self.assertAlmostEqual(data['sea_water_temperature'][-1, 60, 60],
                            -0.783, 2)
示例#5
0
 def test_stranding_roms(self):
     o = PelagicEggDrift(loglevel=0)
     reader_arctic = reader_netCDF_CF_generic.Reader(
         o.test_data_folder() +
         '2Feb2016_Nordic_sigma_3d/Arctic20_1to5Feb_2016.nc')
     reader_nordic = reader_ROMS_native.Reader(
         o.test_data_folder() +
         '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc'
     )
     o.add_reader(reader_arctic)
     o.add_reader(reader_nordic)
     o.fallback_values['x_sea_water_velocity'] = 1
     o.seed_elements(
         lon=13.0,
         lat=68.0,
         radius=20000,
         number=100,
         time=[reader_arctic.start_time, reader_nordic.end_time],
         z=-30)
     o.set_config('general:coastline_action', 'previous')
     o.set_config('processes:turbulentmixing', False)
     o.max_speed = 1
     o.run(end_time=reader_nordic.end_time, time_step=3600 * 36)
     self.assertEqual(o.num_elements_scheduled(), 0)
     self.assertEqual(o.num_elements_active(), 100)
     self.assertEqual(o.num_elements_activated(), 100)
     self.assertEqual(o.num_elements_deactivated(), 0)
     self.assertEqual(o.num_elements_total(), 100)
示例#6
0
    def test_adding_readers(self):
        o = OceanDrift()
        landmask = reader_global_landmask.Reader(
            extent=[-1.5, 7, 59, 64])
        r = reader_ROMS_native.Reader(o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')
        o.add_reader([r, landmask])
        self.assertEqual(o.priority_list['land_binary_mask'],
                         ['roms native', 'global_landmask'])
        self.assertEqual(o.priority_list['x_sea_water_velocity'],
                         ['roms native'])
        # Switch order
        o = OceanDrift()
        o.add_reader([landmask, r])
        self.assertEqual(o.priority_list['land_binary_mask'],
                         ['global_landmask', 'roms native'])
        self.assertEqual(o.priority_list['x_sea_water_velocity'],
                         ['roms native'])

        # Test add_readers_from_list
        o = OceanDrift()
        o.add_readers_from_list(reader_list, lazy=False)
        self.assertEqual(o.priority_list['x_sea_water_velocity'],
                         ['roms native'])
        self.assertEqual(o.priority_list['x_wind'],
                         [o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/AROME_MetCoOp_00_DEF.nc_20160202_subset'])
示例#7
0
    def test_reader_boundary(self):
        o = PelagicEggDrift(loglevel=0)
        reader_nordic = reader_ROMS_native.Reader(
            o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc'
        )
        reader_arctic = reader_netCDF_CF_generic.Reader(
            o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Arctic20_1to5Feb_2016.nc')
        ######################################################
        # Vertical interpolation is another issue to be fixed:
        reader_nordic.zlevels = reader_arctic.z
        ######################################################
        o.add_reader([reader_nordic, reader_arctic])
        o.fallback_values['land_binary_mask'] = 0
        o.fallback_values['x_wind'] = 10  # Some wind for mixing
        # Seed close to Nordic boundary
        o.seed_elements(lon=14.9,
                        lat=71.1,
                        radius=2000,
                        number=100,
                        time=reader_nordic.start_time,
                        z=0)
        o.set_config('turbulentmixing:timestep', 20)

        o.set_config('drift:scheme', 'runge-kutta')
        o.run(steps=5, time_step=3600, time_step_output=3600)
        self.assertEqual(o.num_elements_active(), 100)
        self.assertEqual(o.num_elements_deactivated(), 0)
        self.assertAlmostEqual(o.elements.lat[0], 71.16, 1)
        #self.assertAlmostEqual(o.elements.z.min(), -41.92, 1)  # With past ROMS-masking
        self.assertAlmostEqual(o.elements.z.min(), -40.1, 1)
        self.assertAlmostEqual(o.elements.z.max(), -0.01, 1)
        #self.assertAlmostEqual(o.elements.lon.max(), 14.949, 2)
        self.assertAlmostEqual(o.elements.lon.max(), 14.87, 2)
示例#8
0
    def test_interpolation_missing(self):
        """Test interpolation."""
        reader = reader_ROMS_native.Reader(o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')
        num_points = 50
        np.random.seed(0)  # To get the same random numbers each time
        lons = np.random.uniform(10, 11, num_points)
        lats = np.random.uniform(66, 67.0, num_points)
        z = np.random.uniform(-200, 0, num_points)
        x, y = reader.lonlat2xy(lons, lats)

        variables = ['x_sea_water_velocity', 'y_sea_water_velocity',
                     'sea_water_temperature']
        # Read a block of data covering the points
        data = reader.get_variables(variables, time=reader.start_time,
                                    x=x, y=y, z=z, block=True)

        # Introduce missing values
        data['x_sea_water_velocity'] = np.ma.masked_where(
            data['x_sea_water_velocity']>.08,
            data['x_sea_water_velocity'])

        b = ReaderBlock(data, interpolation_horizontal='linearND')

        env, prof = b.interpolate(x, y, z, variables,
                                  profiles=['x_sea_water_velocity'],
                                  profiles_depth=[-30, 0])
        self.assertAlmostEqual(env['x_sea_water_velocity'][10],
                               0.074, 2)
        self.assertAlmostEqual(prof['x_sea_water_velocity'][5,48],
                               -0.090, 2)
示例#9
0
def import_from_ladim(ladimfile, romsfile):
    """Import Ladim output file as OpenDrift simulation obejct"""

    from models.oceandrift3D import OceanDrift3D
    o = OceanDrift3D()
    from netCDF4 import Dataset, date2num, num2date
    if isinstance(romsfile, basestring):
        from opendrift.readers import reader_ROMS_native
        romsfile = reader_ROMS_native.Reader(romsfile)
    l = Dataset(ladimfile, 'r')
    pid = l.variables['pid'][:]
    particle_count = l.variables['particle_count'][:]
    end_index = np.cumsum(particle_count)
    start_index = np.concatenate(([0], end_index[:-1]))
    x = l.variables['X'][:]
    y = l.variables['Y'][:]
    lon, lat = romsfile.xy2lonlat(x, y)
    time = num2date(l.variables['time'][:], l.variables['time'].units)

    history_dtype_fields = [(name, o.ElementType.variables[name]['dtype'])
                            for name in o.ElementType.variables]
    # Add environment variables
    o.history_metadata = o.ElementType.variables.copy()
    history_dtype = np.dtype(history_dtype_fields)

    num_timesteps = len(time)
    num_elements = len(l.dimensions['particle'])
    o.history = np.ma.array(np.zeros([num_elements, num_timesteps]),
                            dtype=history_dtype,
                            mask=[True])

    for n in range(num_timesteps):
        start = start_index[n]
        active = pid[start:start + particle_count[n]]
        o.history['lon'][active, n] = \
            lon[start:start+particle_count[n]]
        o.history['lat'][active, n] = \
            lat[start:start+particle_count[n]]
        o.history['status'][active, n] = 0

    o.status_categories = ['active', 'missing_data']
    firstlast = np.ma.notmasked_edges(o.history['status'], axis=1)
    index_of_last = firstlast[1][1]
    o.history['status'][np.arange(len(index_of_last)), index_of_last] = 1
    kwargs = {}
    for var in ['lon', 'lat', 'status']:
        kwargs[var] = o.history[var][np.arange(len(index_of_last)),
                                     index_of_last]
    kwargs['ID'] = range(num_elements)
    o.elements = o.ElementType(**kwargs)
    o.elements_deactivated = o.ElementType()
    o.remove_deactivated_elements()
    # Import time steps from metadata
    o.time_step = time[1] - time[0]
    o.time_step_output = o.time_step
    o.start_time = time[0]
    o.time = time[-1]
    o.steps_output = num_timesteps

    return o
 def test_expand_array(self):
     reader = reader_ROMS_native.Reader(
         o.test_data_folder() +
         '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc'
     )
     reader.buffer = 1
     num_points = 50
     np.random.seed(0)  # To get the same random numbers each time
     lons = np.random.uniform(14, 15, num_points)
     lats = np.random.uniform(68, 68.4, num_points)
     x, y = reader.lonlat2xy(lons, lats)
     variables = ['x_sea_water_velocity']
     # Read a block of data covering the points
     data = reader.get_variables(variables,
                                 time=reader.start_time,
                                 x=x,
                                 y=y,
                                 z=0)
     data = np.ma.filled(data['x_sea_water_velocity'], fill_value=np.nan)
     self.assertTrue(np.isnan(data.max()))
     self.assertEqual(sum(~np.isfinite(data.ravel())), 80)
     expand_numpy_array(data)
     self.assertEqual(sum(~np.isfinite(data.ravel())), 40)
     expand_numpy_array(data)
     self.assertEqual(sum(~np.isfinite(data.ravel())), 9)
     expand_numpy_array(data)
     self.assertEqual(sum(~np.isfinite(data.ravel())), 0)
     self.assertFalse(np.isnan(data.max()))
示例#11
0
    def test_stranding_3d(self):
        o = PelagicEggDrift(loglevel=30)
        reader_nordic = reader_ROMS_native.Reader(
            o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc'
        )
        o.add_reader(reader_nordic)
        o.set_config('environment:fallback:y_wind', 10)  # Some wind for mixing
        o.seed_elements(
            lon=14.0,
            lat=68.15,
            radius=2000,
            number=100,
            time=[reader_nordic.start_time, reader_nordic.end_time],
            z=0)
        o.set_config('general:coastline_action', 'stranding')
        o.set_config('vertical_mixing:timestep', 120)

        o.max_speed = .1
        o.run(end_time=reader_nordic.end_time, time_step=3600 * 6)
        self.assertEqual(o.status_categories[1], 'stranded')
        self.assertEqual(o.elements_deactivated.status.min(), 1)
        self.assertEqual(o.elements_deactivated.status.max(), 1)
        self.assertEqual(o.num_elements_scheduled(), 0)
        self.assertEqual(o.num_elements_active(), 81)
        self.assertEqual(o.num_elements_activated(), 100)
        self.assertEqual(o.num_elements_deactivated(), 19)
        self.assertEqual(o.num_elements_total(), 100)

        # Check calculated trajectory lengths and speeds
        total_length, distances, speeds = o.get_trajectory_lengths()
        self.assertAlmostEqual(total_length.max(), 14978.3, 1)
        self.assertAlmostEqual(total_length.min(), 1225.2, 1)
        self.assertAlmostEqual(speeds.max(), 0.127, 1)
        self.assertAlmostEqual(distances.max(), 2859.0, 1)
示例#12
0
 def test_reader_boundary(self):
     # Check that the element outside reader coverage is
     # not deactivated if fallback value exist
     o = OceanDrift()
     nordic3d = reader_ROMS_native.Reader(
         o.test_data_folder() +
         '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc'
     )
     lon = [12.0, 12.0]
     lat = [70.0, 70.5]
     o.add_reader(nordic3d)
     o.fallback_values['land_binary_mask'] = 0
     o.seed_elements(lon, lat, number=2, radius=0, time=nordic3d.start_time)
     o.run(steps=2, time_step=3600)
     self.assertEqual(o.num_elements_active(), 2)
     self.assertEqual(o.num_elements_deactivated(), 0)
     # Check that the outside element is deactivated,
     # if no fallback value exists
     o = OceanDrift()
     del o.fallback_values['x_sea_water_velocity']
     o.add_reader(nordic3d)
     o.fallback_values['land_binary_mask'] = 0
     o.seed_elements(lon, lat, number=2, radius=0, time=nordic3d.start_time)
     o.run(steps=2, time_step=3600)
     self.assertEqual(o.num_elements_active(), 1)
     self.assertEqual(o.num_elements_deactivated(), 1)
示例#13
0
    def test_stranding_3d(self):
        o = PelagicEggDrift(loglevel=30)
        reader_nordic = reader_ROMS_native.Reader(
            o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc'
        )
        o.add_reader(reader_nordic)
        o.fallback_values['y_wind'] = 10  # Some wind for mixing
        o.seed_elements(
            lon=14.0,
            lat=68.15,
            radius=2000,
            number=100,
            time=[reader_nordic.start_time, reader_nordic.end_time],
            z=0)
        o.set_config('general:coastline_action', 'stranding')
        o.set_config('turbulentmixing:timestep', 120)

        o.max_speed = .1
        o.run(end_time=reader_nordic.end_time, time_step=3600 * 6)
        self.assertEqual(o.status_categories[1], 'stranded')
        self.assertEqual(o.elements_deactivated.status.min(), 1)
        self.assertEqual(o.elements_deactivated.status.max(), 1)
        self.assertEqual(o.num_elements_scheduled(), 0)
        self.assertEqual(o.num_elements_active(), 79)
        self.assertEqual(o.num_elements_activated(), 100)
        self.assertEqual(o.num_elements_deactivated(), 21)
        self.assertEqual(o.num_elements_total(), 100)
示例#14
0
    def test_lazy_reader(self):
        o = OceanDrift(loglevel=20)
        lr = reader_lazy.Reader(o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')
        self.assertFalse(lr.initialised)
        self.assertEqual(len(lr.covers_positions([15], [69])[0]), 1)
        self.assertEqual(len(lr.covers_positions([0], [0])[0]), 0)
        self.assertTrue(lr.initialised)

        # Make a corresponding, unlazy reader
        rr = reader_ROMS_native.Reader(o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')
        self.assertEqual(len(rr.covers_positions([15], [69])[0]), 1)
        self.assertEqual(len(rr.covers_positions([0], [0])[0]), 0)

        # Check that both readers provide the same attributes
        for att in rr.__dict__:
            self.assertEqual(type(lr.__getattr__(att)),
                             type(getattr(rr, att)))
            if type(getattr(rr, att)) in [float, int, dict, str, list,
                                          datetime, timedelta, bool,
                                          np.float64]:
                self.assertEqual(lr.__getattr__(att),
                                 getattr(rr, att))
            elif type(getattr(rr, att)) in [np.ndarray]:
                self.assertIsNone(np.testing.assert_array_equal(
                                  lr.__getattr__(att),
                                  getattr(rr, att)))
            else:
                print('Skipping: ' + att + ' ' +
                      str(type(getattr(rr, att))))
示例#15
0
    def test_MFDataset(self):
        reader_landmask = reader_global_landmask.Reader(
            extent=[13.5, 14.6, 67.1, 67.7])

        o = OceanDrift(loglevel=30)
        nordicMF = reader_ROMS_native.Reader(
            o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic_subset_day*.nc')
        nordicMF_all = reader_ROMS_native.Reader(
            o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/Nordic_subset.nc')
        lon = 14.0
        lat = 67.3
        #nordic3d = reader_ROMS_native.Reader(o.test_data_folder() +
        #    '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')
        #o.add_reader(nordic3d)  # Slightly different results
        # Subset is made with ncks, and should give identical result
        # e0=0, e1=20, x0=40, x1=70
        # ncks -d eta_rho,0,$e1 -d eta_psi,0,$e1 -d eta_v,0,$e1 -d eta_u,0,$e1 -d xi_rho,$x0,$x1 -d xi_psi,$x0,$x1 -d xi_v,$x0,$x1 -d xi_u,$x0,$x1 Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc Nordic_subset.nc -O --fl_fmt=netcdf4_classic
        # ncks -O -d ocean_time,0 Nordic_subset.nc Nordic_subset_day1.nc
        o.add_reader([reader_landmask, nordicMF_all])
        o.seed_elements(lon,
                        lat,
                        number=100,
                        radius=5000,
                        time=nordicMF_all.start_time)
        o.run(steps=48, time_step=3600)

        print('=' * 99)
        # Same run, with multi-file dataset
        o2 = OceanDrift(loglevel=30)
        o2.add_reader([reader_landmask, nordicMF])
        o2.seed_elements(lon,
                         lat,
                         number=100,
                         radius=5000,
                         time=nordicMF_all.start_time)
        o2.run(steps=48, time_step=3600)

        #o.plot(filename='o1.png', background='sea_floor_depth_below_sea_level')
        #o2.plot(filename='o2.png', background='sea_floor_depth_below_sea_level')

        assert o.num_elements_active() == 33
        assert o2.num_elements_active() == 33
        assert o.num_elements_deactivated() == 67
        assert o2.num_elements_deactivated() == 67
        self.assertAlmostEqual(o.elements.lon[0], o2.elements.lon[0], 5)
示例#16
0
    def test_linearNDFast(self):
        """Test interpolation."""
        reader = reader_ROMS_native.Reader(
            o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc'
        )
        reader.buffer = 3
        num_points = 50
        np.random.seed(0)  # To get the same random numbers each time
        lons = np.random.uniform(14, 15, num_points)
        lats = np.random.uniform(68, 68.4, num_points)
        z = np.random.uniform(-20, 0, num_points)
        x, y = reader.lonlat2xy(lons, lats)
        #z=None

        variables = ['x_sea_water_velocity']
        # Read a block of data covering the points
        data = reader.get_variables(variables,
                                    time=reader.start_time,
                                    x=x,
                                    y=y,
                                    z=z,
                                    block=True)

        b = ReaderBlock(data.copy(), interpolation_horizontal='linearNDFast')
        x2 = np.random.uniform(x.min(), x.max(), num_points)
        y2 = np.random.uniform(y.min(), y.max(), num_points)
        z2 = np.random.uniform(-20, 0, num_points)
        self.assertTrue(b.covers_positions(x, y, z))
        self.assertTrue(b.covers_positions(x2, y2, z2))
        # Check that there are holes in the arrays of the ReaderBlock
        self.assertEqual(
            np.sum(~np.isfinite(b.data_dict['x_sea_water_velocity'])), 1001)
        # Check that LinearNDFast interpolation gives a real value
        env, prof = b.interpolate(x2,
                                  y2,
                                  z2,
                                  variables,
                                  profiles=variables,
                                  profiles_depth=[-30, 0])
        self.assertEqual(np.sum(~np.isfinite(env['x_sea_water_velocity'])), 0)
        # Check that the arrays of the ReaderBlock have been filled in
        self.assertEqual(
            np.sum(~np.isfinite(b.data_dict['x_sea_water_velocity'])), 0)

        # Check that nearest interpolation contains some NaN values
        b2 = ReaderBlock(data.copy(), interpolation_horizontal='nearest')
        env, prof = b2.interpolate(x2,
                                   y2,
                                   z2,
                                   variables,
                                   profiles=variables,
                                   profiles_depth=[-30, 0])
        self.assertEqual(np.sum(~np.isfinite(env['x_sea_water_velocity'])), 31)
示例#17
0
def test_basemap_global_matches(test_data):
    reader_global = reader_global_landmask.Reader()
    reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=4,
                                                    llcrnrlat=59,
                                                    urcrnrlon=18,
                                                    urcrnrlat=68.1,
                                                    resolution='i',
                                                    projection='merc')

    reader_nordic = reader_ROMS_native.Reader(
        test_data +
        '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')

    land = (np.array([15.]), np.array([65.6]))
    ocean = (np.array([5.]), np.array([65.6]))

    # basemap
    ob = OceanDrift(loglevel=00)
    ob.add_reader([reader_nordic, reader_basemap])

    en, en_prof, missing = ob.get_environment(['land_binary_mask'],
                                              reader_nordic.start_time,
                                              land[0], land[1], np.array([0]),
                                              None)

    assert en.land_binary_mask == np.array([True])

    en, en_prof, missing = ob.get_environment(['land_binary_mask'],
                                              reader_nordic.start_time,
                                              ocean[0], ocean[1],
                                              np.array([0]), None)

    assert en.land_binary_mask == np.array([False])
    assert len(ob.readers) == 2

    # global landmask
    oc = OceanDrift(loglevel=00)
    oc.add_reader([reader_nordic, reader_global])
    en, en_prof, missing = oc.get_environment(['land_binary_mask'],
                                              reader_nordic.start_time,
                                              land[0], land[1], np.array([0]),
                                              None)

    assert en.land_binary_mask == np.array([True])

    en, en_prof, missing = oc.get_environment(['land_binary_mask'],
                                              reader_nordic.start_time,
                                              ocean[0], ocean[1],
                                              np.array([0]), None)

    assert en.land_binary_mask == np.array([False])
    assert len(
        oc.readers) == 2  # make sure opendrift doesn't add default basemap
示例#18
0
def test_lonlat2xy_sequential(test_data, benchmark):
    reader = reader_ROMS_native.Reader(test_data + '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')
    assert not reader.projected
    reader.__disable_parallel__ = True

    lon = np.arange(10., 15., .01)
    lat = np.arange(67.8, 69.8, .01)

    lon, lat = np.meshgrid(lon, lat)
    lon, lat = lon.ravel(), lat.ravel()
    print("coords: %d" % len(lon))

    _, _ = benchmark(reader.lonlat2xy, lon, lat)
    assert reader.__lonlat2xy_parallel__ == False
示例#19
0
def test_lonlat2xy_sequential_big(test_data, benchmark):
    reader = reader_ROMS_native.Reader('https://thredds.met.no/thredds/dodsC/nansen-legacy-ocean/SVIM/2020/ocean_avg_20200601.nc4')
    assert not reader.projected
    reader.__disable_parallel__ = True

    lon = np.arange(-10., 15., .01)
    lat = np.arange(56., 69.8, .01)

    lon, lat = np.meshgrid(lon, lat)
    lon, lat = lon.ravel(), lat.ravel()
    print("coords: %d" % len(lon))

    _, _ = benchmark(reader.lonlat2xy, lon, lat)
    assert reader.__lonlat2xy_parallel__ == False
示例#20
0
 def test_ROMS_native_stranding(self):
     o = OceanDrift(loglevel=0)
     r = reader_ROMS_native.Reader(o.test_data_folder() +
         '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')
     o.add_reader(r)
     o.set_config('general:use_auto_landmask', False)
     o.set_config('drift:vertical_mixing', False)
     o.set_config('environment:fallback:x_wind', 0)
     o.set_config('environment:fallback:y_wind', 10)
     o.seed_elements(lon=15.2, lat=68.3, time=r.start_time,
                     wind_drift_factor=.02,
                     number=10, radius=1000)
     o.run(steps=8)
     self.assertEqual(o.num_elements_deactivated(), 4)
示例#21
0
    def test_truncate_ocean_model(self):
        o = OceanDrift3D(loglevel=30)
        reader_nordic = reader_ROMS_native.Reader(o.test_data_folder() + \
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')
        o.add_reader(reader_nordic)
        o.seed_elements(lon=15.0,
                        lat=71.1,
                        radius=0,
                        number=10,
                        z=np.linspace(-90, 0, 10),
                        time=reader_nordic.start_time)
        o.set_config('general:use_basemap_landmask', False)
        o.run(steps=5)

        o2 = OceanDrift3D(loglevel=30)
        o2.add_reader(reader_nordic)
        o2.set_config('drift:truncate_ocean_model_below_m', 50)
        o2.seed_elements(lon=15.0,
                         lat=71.1,
                         radius=0,
                         number=10,
                         z=np.linspace(-90, 0, 10),
                         time=reader_nordic.start_time)
        o2.set_config('general:use_basemap_landmask', False)
        o2.run(steps=5)

        o3 = OceanDrift3D(loglevel=30)
        o3.add_reader(reader_nordic)
        o3.set_config('drift:truncate_ocean_model_below_m', 50)
        o3.seed_elements(lon=15.0,
                         lat=71.1,
                         radius=0,
                         number=10,
                         z=np.linspace(-90, 0, 10),
                         time=reader_nordic.start_time)
        o3.set_config('general:use_basemap_landmask', False)
        o3.run(steps=5)

        # Final depths should not be affected
        self.assertIsNone(
            np.testing.assert_array_almost_equal(o.elements.z, o3.elements.z))
        # Surface elements should not be affected
        self.assertEqual(o.elements.lat[-1], o3.elements.lat[-1])
        # Elements at 90m depth should be somewht affected
        self.assertNotEqual(o.elements.lat[0], o3.elements.lat[0])
        # For second run, only elements below 50m should be equal
        self.assertEqual(o2.elements.lat[1], o2.elements.lat[2])
        self.assertNotEqual(o2.elements.lat[8], o2.elements.lat[9])
示例#22
0
    def test_reader_netcdf(self):
        """Check reader functionality."""

        reader1 = reader_netCDF_CF_generic.Reader(
            o.test_data_folder() +
            '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc')
        reader2 = reader_ROMS_native.Reader(
            o.test_data_folder() +
            '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc'
        )
        readers = [reader1, reader2]

        for r in readers:
            print(r)
            # Make four points:
            #  1) outside lower left, 2) lower left,  3) center of domain
            #  4) outside upper right
            # and assure that only 2) and 3) are marked as covered
            # Upper right is skipped, as lonlat2xy may lie slightly outside
            x = np.array([
                r.xmin - r.delta_x, r.xmin, (r.xmin + r.xmax) / 2,
                r.xmax + r.delta_x
            ])
            y = np.array([
                r.ymin - r.delta_y, r.ymin, (r.ymin + r.ymax) / 2,
                r.ymax + r.delta_y
            ])
            lons, lats = r.xy2lonlat(x, y)
            covered = r.covers_positions(lons, lats, 0)[0]
            if len(covered) != 1:
                self.assertEqual(covered.tolist(), [1, 2])
            else:
                if covered == [2]:
                    print('#' * 60)
                    print('#' * 60)
                    print('WARNING: A point on the boundary is considered ' \
                          'outside after conversion x,y -> lon,lat -> x,y. ' \
                          'This is different from "standard", but is due to ' \
                          'rounding differences and not considered to be an ' \
                          'error. Numpy version is %s' % (np.__version__))
                    print('#' * 60)
                    print('#' * 60)
                else:
                    self.assertTrue(False)  # Should never happen!

            self.assertTrue(r.covers_time(r.start_time))
            self.assertFalse(r.covers_time(r.start_time - r.time_step))
            self.assertFalse(r.proj.crs.is_geographic)
示例#23
0
 def test_adding_readers(self):
     o = OceanDrift()
     r = reader_ROMS_native.Reader(o.test_data_folder() +
         '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')
     o.add_reader([r, basemap])
     self.assertEqual(o.priority_list['land_binary_mask'],
                      ['roms native', 'basemap_landmask'])
     self.assertEqual(o.priority_list['x_sea_water_velocity'],
                      ['roms native'])
     # Switch order
     o = OceanDrift()
     o.add_reader([basemap, r])
     self.assertEqual(o.priority_list['land_binary_mask'],
                      ['basemap_landmask', 'roms native'])
     self.assertEqual(o.priority_list['x_sea_water_velocity'],
                      ['roms native'])
示例#24
0
def test_global_array(test_data):
    reader_global = reader_global_landmask.Reader()

    reader_nordic = reader_ROMS_native.Reader(test_data +
        '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')

    lon = np.array([15., 5.])
    lat = np.array([65.6, 65.6])

    # global
    oc = OceanDrift(loglevel = 00)
    oc.add_reader ([reader_nordic, reader_global])
    en, en_prof, missing = oc.get_environment (['land_binary_mask'],
            reader_nordic.start_time,
            lon, lat, np.array([0, 0]), None)

    np.testing.assert_array_equal(en.land_binary_mask, np.array([True, False]))
    assert len(oc.readers) == 2 # make sure opendrift doesn't add default basemap
示例#25
0
def test_lonlat2xy_parallel(test_data, benchmark):
    reader = reader_ROMS_native.Reader(test_data + '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')
    assert not reader.projected

    lon = np.arange(10., 15., .01)
    lat = np.arange(67.8, 69.8, .01)

    lon, lat = np.meshgrid(lon, lat)
    lon, lat = lon.ravel(), lat.ravel()

    reader.__disable_parallel__ = True
    xs, ys = reader.lonlat2xy(lon, lat)
    assert reader.__lonlat2xy_parallel__ == False

    reader.__disable_parallel__ = False
    x, y = benchmark(reader.lonlat2xy, lon, lat)
    assert reader.__lonlat2xy_parallel__ == True

    np.testing.assert_equal(x, xs)
    np.testing.assert_equal(y, ys)
示例#26
0
def test_global_array(test_data):
    shpfilename = shpreader.natural_earth(resolution='110m',
                                        category='cultural',
                                        name='admin_0_countries')
    reader_landmask = reader_shape.Reader.from_shpfiles(shpfilename)

    reader_nordic = reader_ROMS_native.Reader(test_data +
        '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')

    lon = np.array([15., 5.])
    lat = np.array([65.6, 65.6])

    # global
    oc = OceanDrift(loglevel = 00)
    oc.add_reader ([reader_nordic, reader_landmask])
    en, en_prof, missing = oc.get_environment (['land_binary_mask'],
            reader_nordic.start_time,
            lon, lat, np.array([0, 0]), None)

    np.testing.assert_array_equal(en.land_binary_mask, np.array([True, False]))
    assert len(oc.readers) == 2 # make sure opendrift doesn't add default basemap
示例#27
0
def test_lonlat2xy_parallel_big(test_data, benchmark):
    reader = reader_ROMS_native.Reader('https://thredds.met.no/thredds/dodsC/nansen-legacy-ocean/SVIM/2020/ocean_avg_20200601.nc4')
    assert not reader.projected

    lon = np.arange(-10., 15., .01)
    lat = np.arange(56., 69.8, .01)

    lon, lat = np.meshgrid(lon, lat)
    lon, lat = lon.ravel(), lat.ravel()

    reader.__disable_parallel__ = True
    xs, ys = reader.lonlat2xy(lon, lat)
    assert reader.__lonlat2xy_parallel__ == False

    print(xs, ys)
    reader.__disable_parallel__ = False
    x, y = benchmark(reader.lonlat2xy, lon, lat)
    assert reader.__lonlat2xy_parallel__ == True

    np.testing.assert_equal(x, xs)
    np.testing.assert_equal(y, ys)
示例#28
0
    def test_get_environment(self):
        o = PelagicEggDrift(loglevel=0)
        reader_nordic = reader_ROMS_native.Reader(o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc', name='Nordic')
        reader_arctic = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '2Feb2016_Nordic_sigma_3d/Arctic20_1to5Feb_2016.nc', name='Arctic')
        ######################################################
        # Vertical interpolation is another issue to be fixed:
        reader_nordic.zlevels = reader_arctic.z
        ######################################################
        o.add_reader([reader_nordic, reader_arctic])
        # One point covered only by Nordic, two points coverd
        # by both readers, and two points covered by none of the readers
        testlon = np.array((14.0, 20.0, 20.1, 4, 5))
        testlat = np.array((70.1, 76.0, 76.1, 60, 60))
        testz = np.random.uniform(0, 0, len(testlon))
        self.assertItemsEqual([0], reader_nordic.covers_positions(
                                    testlon, testlat, testz))
        self.assertItemsEqual([0, 1, 2], reader_arctic.covers_positions(
                                    testlon, testlat, testz))
        o.seed_elements(testlon, testlat, testz, time=reader_nordic.start_time)
        o.fallback_values['land_binary_mask'] = 0
        env, env_profiles, missing = \
            o.get_environment(o.required_variables,
                              reader_nordic.start_time,
                              testlon, testlat, testz,
                              o.required_profiles)
        self.assertAlmostEqual(env['sea_water_temperature'][0], 4.338, 2)
        self.assertAlmostEqual(env['sea_water_temperature'][1], 0.6282, 3)
        self.assertAlmostEqual(env['sea_water_temperature'][4], 10.0)
        self.assertItemsEqual(missing, [False,False,False,False,False])
        self.assertAlmostEqual(env_profiles['sea_water_temperature'][0,0],
                               4.338, 2)
        self.assertAlmostEqual(env_profiles['sea_water_temperature'][0,4], 10)
        self.assertAlmostEqual(env_profiles['sea_water_temperature'][8,2], 10)
        self.assertAlmostEqual(env_profiles['sea_water_temperature'][7,2],
                               2.252265, 3)
        # Get separate data
        env2, env_profiles2, missing2 = \
            o.get_environment(['x_sea_water_velocity', 'y_sea_water_velocity',
                               'sea_water_temperature'],
                              reader_nordic.start_time,
                              testlon, testlat, testz,
                              ['sea_water_temperature'])
        self.assertTrue(env_profiles2 is not None)
        self.assertEqual(env_profiles2.keys(), ['z', 'sea_water_temperature'])
        # Get separate data, without profile
        env3, env_profiles3, missing3 = \
            o.get_environment(['x_sea_water_velocity', 'y_sea_water_velocity',
                               'sea_water_temperature'],
                              reader_nordic.start_time,
                              testlon, testlat, testz,
                              profiles=None)
        self.assertTrue(env_profiles3 is None)
        # Get separate data
        env4, env_profiles4, missing4 = \
            o.get_environment(['x_sea_water_velocity', 'y_sea_water_velocity',
                               'sea_water_temperature'],
                              reader_nordic.start_time,
                              testlon, testlat, testz,
                              ['sea_water_temperature'])

        self.assertItemsEqual(env['x_sea_water_velocity'],
                              env2['x_sea_water_velocity'])
        #print env_profiles['sea_water_temperature'], '1'*50
        #print env_profiles2['sea_water_temperature'], '2'*50
        #print env_profiles4['sea_water_temperature'], '4'*50
        # Test below should also pass, To be fixed
        #self.assertItemsEqual(env_profiles['sea_water_temperature'].ravel(),
        #                      env_profiles2['sea_water_temperature'].ravel())
        self.assertItemsEqual(env_profiles2['sea_water_temperature'].ravel(),
                              env_profiles4['sea_water_temperature'].ravel())
示例#29
0
            del o.fallback_values['x_sea_water_velocity']
            del o.fallback_values['y_sea_water_velocity']
            del o.fallback_values['x_wind']
            del o.fallback_values['y_wind']

            # Forcing data

            if forcing == 'norshelf':
                # NB: waves only for 5 months of 2011
                #waves = '/lustre/storeA/project/fou/om/retrospect/retrospect_data/waves/ECwave_%Y.nc'
                current = 'http://thredds.met.no/thredds/dodsC/retrospect/qck/control_qck_%Y%m.ncml'
                readerURL = time[0].strftime(current)
                readerURLnext = (time[0] +
                                 timedelta(days=30)).strftime(current)
                reader = reader_ROMS_native.Reader(readerURL)
                readerNext = reader_ROMS_native.Reader(readerURLnext)
                readers = [readerNext, reader]
                o.add_reader(readers)
            elif forcing == 'globcur':
                current = 'http://tds0.ifremer.fr/thredds/dodsC/CLS-L4-CUREUL_HS-ALT_SUM-V02.0_FULL_TIME_SERIE'
                o.add_readers_from_list([current])
            else:
                unknown_current
            #elif forcing == 'globcur-total15m':
            #    current = 'http://tds0.ifremer.fr/thredds/dodsC/CLS-L4-CUREUL_15M-ALT_SUM-V02.0_FULL_TIME_SERIE'

            # Adding readers
            if with_stokes is True:
                stokes = time[0].strftime('stokes_year/stokes_%Y.nc')
                o.add_readers_from_list([stokes])
示例#30
0
Comparing two simulation runs, with and without wind
"""
#!/usr/bin/env python

# Comparing two simulation runs, with and without wind

from datetime import timedelta

from opendrift.readers import reader_ROMS_native
from opendrift.models.oceandrift import OceanDrift

lon = 14.75; lat = 68.1

o = OceanDrift(loglevel=0)

reader_nordic = reader_ROMS_native.Reader(o.test_data_folder() +
    '2Feb2016_Nordic_sigma_3d/Nordic-4km_SLEVELS_avg_00_subset2Feb2016.nc')

# First run, with landmask
o.add_reader([reader_nordic])
time = reader_nordic.start_time
o.seed_elements(lon, lat, radius=3000, number=1000, time=time)
o.set_config('general:use_auto_landmask', True)
o.run(end_time=reader_nordic.end_time, time_step=1800)

# Second run, with landmask from ocean model
o2 = OceanDrift(loglevel=0)
o2.add_reader([reader_nordic])
lon = 14.75; lat = 68.1
o2.seed_elements(lon, lat, radius=3000, number=1000, time=time)
o2.set_config('general:use_auto_landmask', False)
o2.run(end_time=reader_nordic.end_time, time_step=1800)