示例#1
0
 def test_config_constant_fallback(self):
     o = OceanDrift(loglevel=0)
     reader_arome = reader_netCDF_CF_generic.Reader(
         o.test_data_folder() +
         '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc')
     reader_norkyst = reader_netCDF_CF_generic.Reader(
         o.test_data_folder() +
         '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc')
     print(reader_norkyst, reader_arome)
     o.add_reader([reader_norkyst, reader_arome])
     o.seed_elements(lon=4,
                     lat=60,
                     time=reader_arome.end_time - timedelta(hours=3),
                     number=1)
     o.set_config('environment:fallback:land_binary_mask', 0)
     o.set_config('environment:fallback:x_sea_water_velocity', 1)
     o.set_config('environment:fallback:y_sea_water_velocity', 0)
     o.set_config('environment:constant:x_wind', 0)
     o.set_config('environment:constant:y_wind', 5)
     o.run(duration=timedelta(hours=6))
     y_wind = np.array(o.get_property('y_wind')[0][:, 0])
     x_current = np.array(o.get_property('x_sea_water_velocity')[0][:, 0])
     # Check that constant wind is used for whole simulation
     self.assertAlmostEqual(y_wind[0], 5, 2)
     self.assertAlmostEqual(y_wind[-1], 5, 2)
     # Check that fallback current is used only after end of reader
     self.assertAlmostEqual(x_current[0], 0.155, 2)
     self.assertAlmostEqual(x_current[-1], 1, 2)
示例#2
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 = OceanDrift(loglevel=50)
        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.set_config('environment:fallback:x_sea_water_velocity',
                     10)  # Pure eastward motion
        o.set_config('environment:fallback:y_sea_water_velocity', 0)
        o.set_config('environment:fallback:land_binary_mask', 0)
        o.seed_elements(3.9, 62.0, z=-200, time=reader_norkyst.start_time)
        o.set_config('drift:vertical_mixing', False)
        o.run(steps=12, time_step=300)
        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.assertIsNone(
            np.testing.assert_array_almost_equal(o.elements.z, -134.5, 1))
示例#3
0
    def test_repeated_run(self):
        # NOTE: this test fails if outfile is not None
        #outfile = 'leeway_test.nc'
        outfile = None
        o = OceanDrift(loglevel=50)
        o.set_config('drift:vertical_mixing', False)
        o.add_readers_from_list(reader_list)
        o.seed_elements(lon=14, lat=67.85,
                        time=datetime(2016, 2, 2, 12))
        o.run(steps=5, outfile=outfile)
        lon1 = o.get_property('lon')[0]
        # Repeated run with same object
        o.seed_elements(lon=14, lat=67.85,
                        time=datetime(2016, 2, 2, 12))
        o.run(steps=5, outfile=outfile)
        lon2 = o.get_property('lon')[0]
        # Third run, with different config
        o.seed_elements(lon=14, lat=67.85,
                        time=datetime(2016, 2, 2, 12),
                        wind_drift_factor=.1)
        o.run(steps=5)
        lon3 = o.get_property('lon')[0]
        # Fourth run, with different time
        o.reset()  # Reset is needed due to new start_time
        o.seed_elements(lon=14, lat=67.85,
                        time=datetime(2016, 2, 2, 13),
                        wind_drift_factor=.1)
        o.run(steps=5, outfile=outfile)
        lon4 = o.get_property('lon')[0]

        # Check results
        self.assertEqual(lon1[-1][0], lon2[-1][0])
        self.assertNotEqual(lon3[-1][0], lon2[-1][0])
示例#4
0
    def test_repeated_run(self):
        o = OceanDrift(loglevel=50)
        o.add_readers_from_list(reader_list)
        o.seed_elements(lon=14, lat=67.85, time=datetime(2016, 2, 2, 12))
        o.run(steps=5)
        lon1 = o.get_property('lon')[0]
        # Repeated run with same object
        o.seed_elements(lon=14, lat=67.85, time=datetime(2016, 2, 2, 12))
        o.run(steps=5)
        lon2 = o.get_property('lon')[0]
        # Third run, with different config
        o.seed_elements(lon=14,
                        lat=67.85,
                        time=datetime(2016, 2, 2, 12),
                        wind_drift_factor=.1)
        o.run(steps=5)
        lon3 = o.get_property('lon')[0]
        # Fourth run, with different time
        o.reset()  # Reset is needed due to new start_time
        o.seed_elements(lon=14,
                        lat=67.85,
                        time=datetime(2016, 2, 2, 13),
                        wind_drift_factor=.1)
        o.run(steps=5)
        lon4 = o.get_property('lon')[0]

        # Check results
        self.assertEqual(lon1[-1][0], lon2[-1][0])
        self.assertNotEqual(lon3[-1][0], lon2[-1][0])
示例#5
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]))
示例#6
0
 def test_seed_ocean_only(self):
     o = OceanDrift(loglevel=50)
     o.set_config('seed:ocean_only', True)
     o.seed_elements(lon=[4.8, 5.15], lat=[60, 60], time=datetime.now())
     o.run(steps=1)
     lat, s = o.get_property('lat')[0]
     # Check that the second point over land has been moved to ocean
     self.assertAlmostEqual(lat[0], 60, 5)
     self.assertNotAlmostEqual(lat[1], 60, 5)
示例#7
0
    def test_valid_minmax_nanvalues(self):
        from opendrift.readers.basereader import variables
        # Reducing max current speed to test masking
        maxval = variables.standard_names['x_sea_water_velocity']['valid_max']
        variables.standard_names['x_sea_water_velocity']['valid_max'] = .1
        o = OceanDrift()
        o.set_config('environment:fallback:land_binary_mask', 0)
        norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + '14Jan2016_NorKyst_z_3d/NorKyst-800m_ZDEPTHS_his_00_3Dsubset.nc')
        o.add_reader(norkyst)

        o.seed_elements(lon=4.95, lat=62, number=100, time=norkyst.start_time)
        o.run(steps=2)
        variables.standard_names['x_sea_water_velocity']['valid_max'] = maxval  # reset
        u = o.get_property('x_sea_water_velocity')[0]
        self.assertAlmostEqual(u.max(), .1, 2)  # Some numerical error allowed
示例#8
0
 def test_valid_minmax(self):
     """Check that invalid values are replaced with fallback."""
     o = OceanDrift()
     from opendrift.readers.basereader import variables
     minval = variables.standard_names['x_wind']['valid_min']
     # Setting valid_min to -5, to check that replacement works
     variables.standard_names['x_wind']['valid_min'] = -5
     reader_wind = reader_netCDF_CF_generic.Reader(o.test_data_folder() +
                 '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc')
     o.add_reader(reader_wind)
     o.set_config('environment:fallback:x_sea_water_velocity', 0)
     o.set_config('environment:fallback:x_wind', 2.0)
     o.set_config('environment:fallback:y_sea_water_velocity', 0)
     o.set_config('environment:fallback:land_binary_mask', 0)
     o.seed_elements(lon=4, lat=60, time=reader_wind.start_time)
     o.run(steps=1)
     variables.standard_names['x_wind']['valid_min'] = minval  # reset
     w = o.get_property('x_wind')[0][0]
     self.assertAlmostEqual(w, 2.0, 1)