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)
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])
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])
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)
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')
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)
#!/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)