示例#1
0
 def test_runge_kutta(self):
     number = 50
     # With Euler
     o = OceanDrift3D(loglevel=20, seed=0)
     norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc')
     o.fallback_values['land_binary_mask'] = 0
     o.add_reader([norkyst])
     z=-40*np.random.rand(number)
     o.seed_elements(5, 62.5, number=number, radius=5000, z=z,
                     time=norkyst.start_time)
     o.run(steps=4*3, time_step=timedelta(minutes=15))
     # With Runge-Kutta
     o2 = OceanDrift3D(loglevel=20, seed=0)
     o2.fallback_values['land_binary_mask'] = 0
     o2.add_reader([norkyst])
     z=-40*np.random.rand(number)
     o2.seed_elements(5, 62.5, number=number, radius=5000, z=z,
                     time=norkyst.start_time)
     o2.set_config('drift:scheme', 'runge-kutta')
     o2.run(steps=4*3, time_step=timedelta(minutes=15))
     # And finally repeating the initial run to check that indetical
     o3 = OceanDrift3D(loglevel=20, seed=0)
     norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc')
     o3.fallback_values['land_binary_mask'] = 0
     o3.add_reader([norkyst])
     z=-40*np.random.rand(number)
     o3.seed_elements(5, 62.5, number=number, radius=5000, z=z,
                     time=norkyst.start_time)
     o3.run(steps=4*3, time_step=timedelta(minutes=15))
     # Check that we get some difference with Runge-Kutta:
     self.assertAlmostEqual((o2.elements.lon-o.elements.lon).max(),
                             0.0015, 3)
     # Check that runs with Euler are identical
     self.assertEqual((o3.elements.lon-o.elements.lon).max(), 0)
示例#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_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])
示例#4
0
    def test_lift_above_seafloor(self):
        # See an element at some depth, and progapate towards coast
        # (shallower water) and check that it is not penetrating seafloor
        o = OceanDrift3D(loglevel=30, proj4='+proj=merc')
        o.max_speed = 100
        reader_norkyst = reader_netCDF_CF_generic.Reader(
            o.test_data_folder() +
            '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc')
        reader_norkyst.buffer = 200
        o.add_reader([reader_norkyst],
                     variables='sea_floor_depth_below_sea_level')
        o.fallback_values['x_sea_water_velocity'] = 100  # Pure eastward motion
        o.fallback_values['y_sea_water_velocity'] = 0
        o.fallback_values['land_binary_mask'] = 0
        o.seed_elements(3.0, 62.0, z=-200, time=reader_norkyst.start_time)
        o.set_config('processes:turbulentmixing', False)
        o.run(steps=26, time_step=30)
        seafloor_depth, status = o.get_property(
            'sea_floor_depth_below_sea_level')
        z, status = o.get_property('z')

        # Uncomment to plot
        #import matplotlib.pyplot as plt
        #plt.plot(-seafloor_depth, label='Seafloor depth')
        #plt.plot(z, label='Element depth')
        #plt.legend(loc='best')
        #plt.show()

        # Check that element has not penetrated seafloor
        self.assertFalse(
            o.elements.z < -o.environment.sea_floor_depth_below_sea_level)
        self.assertAlmostEqual(o.elements.z, -160.06, 1)
示例#5
0
 def test_lazy(self):
     o = OceanDrift3D()
     w = 'http://thredds.met.no/thredds/dodsC/meps25files/meps_det_pp_2_5km_20191128T06Z.nc'
     o.add_readers_from_list([w], lazy=True)  # Works if lazy=False
     o.fallback_values['x_sea_water_velocity'] = .3
     o.fallback_values['y_sea_water_velocity'] = .3
     o.seed_elements(lon=4.6, lat=60, radius=1000, number=1000,
                     time=datetime(2019, 11, 28, 12))
     print(o)
     o.run(steps=1, outfile='test.nc')  # Fails for Python3
     assert os.path.exists('test.nc')
示例#6
0
            itime = []
            dt = time[0]
            while dt < time[-1]:
                itime.append(dt)
                dt += timedelta(hours=1)
            ilon = np.interp([calendar.timegm(t.timetuple()) for t in itime],
                             [calendar.timegm(t.timetuple()) for t in time],
                             lon)
            ilat = np.interp([calendar.timegm(t.timetuple()) for t in itime],
                             [calendar.timegm(t.timetuple()) for t in time],
                             lat)
            lon = ilon
            lat = ilat
            time = itime

            o = OceanDrift3D()
            o.set_config('drift:stokes_drift', with_stokes)
            o.max_speed = 5  # Due to future seeding!

            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)
示例#7
0
#!/usr/bin/env python

from opendrift.readers import reader_netCDF_CF_generic
from opendrift.models.oceandrift3D import OceanDrift3D

o = OceanDrift3D(loglevel=0)  # Set loglevel to 0 for debug information

# Arome
reader_arome = reader_netCDF_CF_generic.Reader(
    'http://thredds.met.no/thredds/dodsC/meps25files/meps_det_extracted_2_5km_latest.nc'
)

# Norkyst
reader_norkyst = reader_netCDF_CF_generic.Reader(
    'http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be')

o.add_reader([reader_norkyst, reader_arome])

# Seeding some particles
lon = 4.8
lat = 60.0
# Outside Bergen

time = None
time = reader_arome.start_time

# Seed elements at defined position and time
import numpy as np
z = -np.random.rand(1000) * 50  # Giving elements a random depth
o.seed_elements(lon, lat, z=z, radius=0, number=1000, time=time)