Ejemplo n.º 1
0
class TestLeeway(unittest.TestCase):
    """Tests for Leeway module."""

    def test_leewayprop(self):
        """Check that Leeway properties are properly read."""
        self.objectType = 85  # MED-WASTE-7
        self.lee = Leeway(loglevel=20)
        objectType = self.objectType
        self.assertEqual(self.lee.leewayprop[objectType]
                         ['Description'],
                         '>>Medical waste, syringes, small')
        self.assertEqual(self.lee.leewayprop[objectType]['DWSLOPE'], 1.79)

    def test_leewayrun(self):
        """Test the expected Leeway left/right split."""
        self.lee = Leeway(loglevel=30)
        self.objectType = 50  # FISHING-VESSEL-1
        self.reader_basemap = reader_basemap_landmask.Reader(
            llcrnrlon=3, llcrnrlat=59.8, projection='merc',
            urcrnrlon=6, urcrnrlat=60.5, resolution='i')
        self.lee.add_reader([self.reader_basemap])
        self.lee.seed_elements(lon=4.5, lat=60, number=100,
                               objectType=self.objectType,
                               time=datetime(2015, 1, 1))
        self.lee.fallback_values['x_wind'] = 0
        self.lee.fallback_values['y_wind'] = 10
        self.lee.fallback_values['x_sea_water_velocity'] = 0
        self.lee.fallback_values['y_sea_water_velocity'] = 0
        # Check that 7 out of 100 elements strand towards coast
        self.lee.run(steps=24, time_step=3600)
        self.assertEqual(self.lee.num_elements_scheduled(), 0)
        self.assertEqual(self.lee.num_elements_active(), 97)
        self.assertEqual(self.lee.num_elements_deactivated(), 3)  # stranded
        self.lee.export_ascii('leeway_ascii.txt')
        os.remove('leeway_ascii.txt')
Ejemplo n.º 2
0
    def test_constant_and_lazy_reader_leeway(self):
        cw = reader_constant.Reader({'x_wind':5, 'y_wind': 6})
        cc = reader_constant.Reader({'x_sea_water_velocity':0,
                                     'y_sea_water_velocity': .2})

        o = Leeway(loglevel=20)
        o.add_reader([cw, cc])
        o.add_readers_from_list(reader_list)
        o.set_config('environment:fallback:x_sea_water_velocity', 0.0)
        o.set_config('environment:fallback:y_sea_water_velocity', 0.1)
        time = datetime(2016,2,2,12)
        o.seed_elements(lat=67.85, lon=14, time=time)
        o.run(steps=2)
        self.assertAlmostEqual(o.elements.lat[0], 67.8548, 3)
Ejemplo n.º 3
0
class TestLeeway(unittest.TestCase):
    """Tests for Leeway module."""
    def test_leewayprop(self):
        """Check that Leeway properties are properly read."""
        self.objectType = 85  # MED-WASTE-7
        self.lee = Leeway(loglevel=20)
        objectType = self.objectType
        self.assertEqual(self.lee.leewayprop[objectType]['Description'],
                         '>>Medical waste, syringes, small')
        self.assertEqual(self.lee.leewayprop[objectType]['DWSLOPE'], 1.79)

    def test_leeway_config_object(self):
        """Check that correct object type is fetched from config"""
        l = Leeway(loglevel=20)
        l.set_config('seed:object_type', 'Surf board with person')
        l.seed_elements(lon=4.5, lat=60, number=100, time=datetime(2015, 1, 1))
        objType = l.elements_scheduled.objectType
        self.assertEqual(l.leewayprop[objType]['Description'],
                         'Surf board with person')
        self.assertEqual(l.leewayprop[objType]['OBJKEY'],
                         'PERSON-POWERED-VESSEL-2')

    def test_leewayrun(self):
        """Test the expected Leeway left/right split."""
        self.lee = Leeway(loglevel=30)
        self.objectType = 50  # FISHING-VESSEL-1
        self.reader_landmask = reader_global_landmask.Reader(llcrnrlon=3,
                                                             llcrnrlat=59.8,
                                                             urcrnrlon=6,
                                                             urcrnrlat=60.5)
        self.lee.add_reader([self.reader_landmask])
        self.lee.seed_elements(lon=4.5,
                               lat=60,
                               number=100,
                               objectType=self.objectType,
                               time=datetime(2015, 1, 1))
        self.lee.fallback_values['x_wind'] = 0
        self.lee.fallback_values['y_wind'] = 10
        self.lee.fallback_values['x_sea_water_velocity'] = 0
        self.lee.fallback_values['y_sea_water_velocity'] = 0
        # Check that 7 out of 100 elements strand towards coast
        self.lee.run(steps=24, time_step=3600)
        self.assertEqual(self.lee.num_elements_scheduled(), 0)
        self.assertEqual(self.lee.num_elements_active(), 96)
        self.assertEqual(self.lee.num_elements_deactivated(), 4)  # stranded
        self.lee.export_ascii('leeway_ascii.txt')
        os.remove('leeway_ascii.txt')
Ejemplo n.º 4
0
    def test_constant_and_lazy_reader_leeway(self):
        cw = reader_constant.Reader({'x_wind': 5, 'y_wind': 6})
        cc = reader_constant.Reader({
            'x_sea_water_velocity': 0,
            'y_sea_water_velocity': .2
        })

        o = Leeway(loglevel=20)
        o.set_config('general:basemap_resolution', 'c')
        o.add_reader([cw, cc])
        o.add_readers_from_list(reader_list)
        o.fallback_values['x_sea_water_velocity'] = 0.0
        o.fallback_values['y_sea_water_velocity'] = 0.1
        time = datetime(2016, 2, 2, 12)
        o.seed_elements(lat=67.85, lon=14, time=time)
        o.run(steps=2)
        self.assertAlmostEqual(o.elements.lat[0], 67.8548, 3)
Ejemplo n.º 5
0
def test_leewayrun(tmpdir):
    """Test the expected Leeway left/right split."""
    lee = Leeway(loglevel=30)
    objectType = 50  # FISHING-VESSEL-1
    reader_landmask = reader_global_landmask.Reader(extent=[ 3, 59.8, 6, 60.5 ])
    lee.add_reader([reader_landmask])
    lee.seed_elements(lon=4.5, lat=60, number=100,
                            objectType=objectType,
                            time=datetime(2015, 1, 1))
    lee.fallback_values['x_wind'] = 0
    lee.fallback_values['y_wind'] = 10
    lee.fallback_values['x_sea_water_velocity'] = 0
    lee.fallback_values['y_sea_water_velocity'] = 0
    # Check that 7 out of 100 elements strand towards coast
    lee.run(steps=24, time_step=3600)
    assert lee.num_elements_scheduled() == 0
    assert lee.num_elements_active() == 96
    assert lee.num_elements_deactivated() == 4  # stranded
    lee.export_ascii(tmpdir + '/leeway_ascii.txt')
Ejemplo n.º 6
0
    def get(self):

        parser = reqparse.RequestParser()
        parser.add_argument('latitude', type=float, help='Latitude of the object')
        parser.add_argument('longitude', type=float, help='Longitude of object')
        args = parser.parse_args(strict=True)
        if args['latitude'] is not None and args['longitude'] is not None:
            if abs(args['latitude']) > 90 :
                abort(404, message="latitude is out of range of -90 <= latitude <= 90")
            
            if abs(args['longitude']) > 180:
                abort(404, message='longitude is out of range of -180 <= longitude <= 180')
            
            latitude = args['latitude']
            longitude = args['longitude']
            lw = Leeway()  # Set loglevel to 0 for debug information

            # Arome
            #reader_arome = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/arome25/arome_metcoop_default2_5km_latest.nc')
            reader_arome = reader_netCDF_CF_generic.Reader(lw.test_data_folder() + 
                '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc')

            reader_norkyst = reader_netCDF_CF_generic.Reader('http://tds.hycom.org/thredds/dodsC/GLBu0.08/expt_91.2/uv3z')

            # Landmask (Basemap)
            reader_basemap = reader_basemap_landmask.Reader(
                                llcrnrlon=longitude-2, llcrnrlat=latitude-2,
                                urcrnrlon=longitude+2, urcrnrlat=latitude+2, resolution='h',
                                projection='merc')
            
            #lw.add_reader([reader_norkyst, reader_arome, reader_basemap])
            # Adding readers succesively, and specifying which variables they 
            # shall provide. This way, order of adding readers does not matter,
            # except for small rounding differences due to different projection
            lw.add_reader(reader_norkyst,
                        variables=['x_sea_water_velocity', 'y_sea_water_velocity'])
            lw.add_reader(reader_arome,
                        variables=['x_wind', 'y_wind'])
            lw.add_reader(reader_basemap,
                        variables=['land_binary_mask'])

            # Seed leeway elements at defined position and time
            objType = 26  # 26 = Life-raft, no ballast
            lw.seed_elements(longitude, latitude, radius=100, number=30,
                            time=reader_arome.start_time, objectType=objType)

            lw.set_projection('+proj=merc')

            lw.run(steps=60*4, time_step=900)
            
            lp = lw.plot(show=False)
            img = StringIO.StringIO()
            lp[1].savefig(img,format='png')
            img.seek(0)
            response=make_response(img.buf)
            response.headers['Content-Type'] = 'image/png'
            return response
        else:
            abort(404, message="Requires latitude and longitude but none were given.")
Ejemplo n.º 7
0
class TestArray(unittest.TestCase):
    """Tests for Leeway module."""
    def setUp(self):
        self.objectType = 50  # FISHING-VESSEL-1
        self.lee = Leeway(loglevel=20)
        #print self.lee.leewayprop.values()[0]

        #self.lee = WindBlow(loglevel=0)
        self.reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=3,
                                                             llcrnrlat=59,
                                                             projection='merc',
                                                             urcrnrlon=6,
                                                             urcrnrlat=61,
                                                             resolution='i')
        self.lee.add_reader([self.reader_basemap])
        self.lee.fallback_values['x_wind'] = 0
        self.lee.fallback_values['y_wind'] = 10
        self.lee.fallback_values['x_sea_water_velocity'] = 0
        self.lee.fallback_values['y_sea_water_velocity'] = 0

    def test_leewayprop(self):
        """Check that Leeway properties are properly read."""
        objectType = self.objectType
        self.assertEqual(self.lee.leewayprop[objectType]['Description'],
                         ' Fishing vessel, general (mean values)\n')
        self.assertEqual(self.lee.leewayprop[objectType]['DWSLOPE'], 2.47)

    def test_leewayrun(self):
        """Test the expected Leeway left/right split."""
        self.lee.seed_elements(lon=4.5,
                               lat=60,
                               number=100,
                               objectType=self.objectType,
                               time=datetime(2015, 1, 1))
        # Check that 7 out of 100 elements strand towards coast
        self.lee.run(steps=24, time_step=3600)
        self.assertEqual(self.lee.num_elements_scheduled(), 0)
        self.assertEqual(self.lee.num_elements_active(), 97)
        self.assertEqual(self.lee.num_elements_deactivated(), 3)  # stranded
Ejemplo n.º 8
0
def test_leewayrun(tmpdir, test_data):
    """Test the expected Leeway left/right split."""
    lee = Leeway(loglevel=20)
    object_type = 50  # FISHING-VESSEL-1
    reader_landmask = reader_global_landmask.Reader(extent=[ 3, 59.8, 6, 60.5 ])
    lee.add_reader([reader_landmask])
    lee.seed_cone(lon=[4.5, 4.7], lat=[60.1, 60], number=100,
                  object_type=object_type,
                  time=[datetime(2015, 1, 1, 0), datetime(2015, 1, 1, 6)])
    lee.set_config('environment:fallback:x_wind', 0)
    lee.set_config('environment:fallback:y_wind', 10)
    lee.set_config('environment:fallback:x_sea_water_velocity', 0)
    lee.set_config('environment:fallback:y_sea_water_velocity', 0)
    # Check that 10 out of 100 elements strand towards coast
    lee.run(steps=24, time_step=3600)
    assert lee.num_elements_scheduled() == 0
    assert lee.num_elements_active() == 88
    assert lee.num_elements_deactivated() == 12  # stranded

    asciif = tmpdir + '/leeway_ascii.txt'
    lee.export_ascii(asciif)
    asciitarget = test_data + "/generated/test_leewayrun_export_ascii.txt"
    import filecmp
    assert filecmp.cmp(asciif, asciitarget)
Ejemplo n.º 9
0
class TestArray(unittest.TestCase):
    """Tests for Leeway module."""

    def setUp(self):
        self.objectType = 50  # FISHING-VESSEL-1
        self.lee = Leeway(loglevel=20)
        #print self.lee.leewayprop.values()[0]

        #self.lee = WindBlow(loglevel=0)
        self.reader_basemap = reader_basemap_landmask.Reader(
            llcrnrlon=3, llcrnrlat=59, projection='merc',
            urcrnrlon=6, urcrnrlat=61, resolution='i')
        self.lee.add_reader([self.reader_basemap])
        self.lee.fallback_values['x_wind'] = 0
        self.lee.fallback_values['y_wind'] = 10
        self.lee.fallback_values['x_sea_water_velocity'] = 0
        self.lee.fallback_values['y_sea_water_velocity'] = 0

    def test_leewayprop(self):
        """Check that Leeway properties are properly read."""
        objectType = self.objectType
        self.assertEqual(self.lee.leewayprop[objectType]
                         ['Description'],
                         ' Fishing vessel, general (mean values)\n')
        self.assertEqual(self.lee.leewayprop[objectType]['DWSLOPE'], 2.47)

    def test_leewayrun(self):
        """Test the expected Leeway left/right split."""
        self.lee.seed_elements(lon=4.5, lat=60, number=100,
                               objectType=self.objectType,
                               time=datetime(2015, 1, 1))
        # Check that 7 out of 100 elements strand towards coast
        self.lee.run(steps=24, time_step=3600)
        self.assertEqual(self.lee.num_elements_scheduled(), 0)
        self.assertEqual(self.lee.num_elements_active(), 97)
        self.assertEqual(self.lee.num_elements_deactivated(), 3)  # stranded
Ejemplo n.º 10
0
# Norkyst
#reader_norkyst = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be')
reader_norkyst = reader_netCDF_CF_generic.Reader(lw.test_data_folder() + 
    '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc')

# Landmask (Basemap)
reader_basemap = reader_basemap_landmask.Reader(
                    llcrnrlon=3.3, llcrnrlat=59.5,
                    urcrnrlon=5.5, urcrnrlat=62.5, resolution='h',
                    projection='merc')

#lw.add_reader([reader_norkyst, reader_arome, reader_basemap])
# Adding readers succesively, and specifying which variables they 
# shall provide. This way, order of adding readers does not matter,
# except for small rounding differences due to different projection
lw.add_reader(reader_norkyst,
              variables=['x_sea_water_velocity', 'y_sea_water_velocity'])
lw.add_reader(reader_arome,
              variables=['x_wind', 'y_wind'])
lw.add_reader(reader_basemap,
              variables=['land_binary_mask'])
lw.fallback_values['x_sea_water_velocity'] = 0
lw.fallback_values['y_sea_water_velocity'] = 0

# Seeding some particles
lon = 4.5; lat = 60.0; # Outside Bergen

# Seed leeway elements at defined position and time
objType = 26  # 26 = Life-raft, no ballast
lw.seed_elements(lon, lat, radius=1000, number=3000,
                 time=reader_arome.start_time, objectType=objType)
Ejemplo n.º 11
0
    '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc')

# Norkyst
reader_norkyst = reader_netCDF_CF_generic.Reader(
    o.test_data_folder() +
    '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc')

# Making customised, full resolution landmask (Basemap)
reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=5.5,
                                                llcrnrlat=61.05,
                                                urcrnrlon=6.65,
                                                urcrnrlat=61.21,
                                                resolution='f',
                                                projection='merc')

o.add_reader([reader_basemap, reader_norkyst, reader_arome])

# Seed elements
lat = 61.117594
lon = 6.55
#time = [reader_arome.start_time,
#        reader_arome.start_time + timedelta(hours=5)]
time = reader_arome.start_time
objType = 1  # 1: Person-in-water (PIW), unknown state (mean values)
o.seed_elements(lon,
                lat,
                radius=50,
                number=5000,
                time=time,
                objectType=objType)
Ejemplo n.º 12
0
from opendrift.readers import reader_netCDF_CF_generic
from opendrift.models.leeway import Leeway

lw = Leeway(loglevel=0)  # Set loglevel to 0 for debug information

# Arome
reader_arome = reader_netCDF_CF_generic.Reader(
    lw.test_data_folder() +
    '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc')
# Norkyst
reader_norkyst = reader_netCDF_CF_generic.Reader(
    lw.test_data_folder() +
    '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc')

lw.add_reader([reader_norkyst, reader_arome])
lw.fallback_values['x_sea_water_velocity'] = 0
lw.fallback_values['y_sea_water_velocity'] = 0
lw.fallback_values['x_wind'] = 0
lw.fallback_values['y_wind'] = 0

# Seed elements along cone, e.g. ship track with
# increasing uncertainty in position
lon = [3.6, 5.1]
lat = [61., 59.6]
time = [reader_arome.start_time, reader_arome.start_time + timedelta(hours=30)]

objType = 26  # 26 = Life-raft, no ballast
lw.seed_elements(lon,
                 lat,
                 radius=[1000, 10000],
Ejemplo n.º 13
0
lw = Leeway(loglevel=20)  # Set loglevel to 0 for debug information

# Atmospheric model for wind
#reader_arome = reader_netCDF_CF_generic.Reader('https://thredds.met.no/thredds/dodsC/mepslatest/meps_lagged_6_h_latest_2_5km_latest.nc')
reader_arome = reader_netCDF_CF_generic.Reader(lw.test_data_folder() +
    '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc')

# Ocean model for current
#reader_norkyst = reader_netCDF_CF_generic.Reader('https://thredds.met.no/thredds/dodsC/mepslatest/meps_lagged_6_h_latest_2_5km_latest.nc')
reader_norkyst = reader_netCDF_CF_generic.Reader(lw.test_data_folder() +
    '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc')

#%%
# Adding readers successively, and specifying which variables they
# shall provide. This way, order of adding readers does not matter
lw.add_reader(reader_norkyst,
              variables=['x_sea_water_velocity', 'y_sea_water_velocity'])
lw.add_reader(reader_arome, variables=['x_wind', 'y_wind'])
lw.set_config('environment:fallback:x_sea_water_velocity', 0)
lw.set_config('environment:fallback:y_sea_water_velocity', 0)

#%%
# Seed leeway elements at defined position and time
object_type = 26  # 26 = Life-raft, no ballast
lw.seed_elements(lon=4.5, lat=59.6, radius=100, number=1000,
                 time=reader_arome.start_time, object_type=object_type)

#%%
# Running model
lw.run(duration=timedelta(hours=48), time_step=900, time_step_output=3600)

#%%
Ejemplo n.º 14
0
    def run_opendrift(self):
        sys.stdout.write('running OpenDrift')
        month = np.int(self.months.index(self.monthvar.get()) + 1)
        start_time = datetime(np.int(self.yearvar.get()), month,
                              np.int(self.datevar.get()),
                              np.int(self.hourvar.get()),
                              np.int(self.minutevar.get()))
        if start_time > self.current.end_time:
            sys.stdout.write('Start time after end of current data!')
            start_time = self.current.start_time
        emonth = np.int(self.months.index(self.emonthvar.get()) + 1)
        end_time = datetime(np.int(self.eyearvar.get()), emonth,
                            np.int(self.edatevar.get()),
                            np.int(self.ehourvar.get()),
                            np.int(self.eminutevar.get()))
        sys.stdout.flush()
        lon = np.float(self.lon.get())
        lat = np.float(self.lat.get())
        radius = np.float(self.radius.get())
        elon = np.float(self.elon.get())
        elat = np.float(self.elat.get())
        eradius = np.float(self.eradius.get())
        if lon != elon or lat != elat or start_time != end_time:
            lon = [lon, elon]
            lat = [lat, elat]
            radius = [radius, eradius]
            start_time = [start_time, end_time]
            cone = True
        else:
            cone = False
        if self.model.get() == 'Leeway':
            o = Leeway(loglevel=20)
            for ln, lc in enumerate(self.leewaycategories):
                if self.oljetype.get() == lc.strip().replace('>', ''):
                    print 'Leeway object category: ' + lc
                    break
            o.seed_elements(lon=lon,
                            lat=lat,
                            number=2000,
                            radius=radius,
                            time=start_time,
                            objectType=ln + 1)
        if self.model.get() == 'OpenOil':
            o = OpenOil(loglevel=20)
            o.seed_elements(lon=lon,
                            lat=lat,
                            number=2000,
                            radius=radius,
                            time=start_time,
                            cone=cone,
                            oiltype=self.oljetype.get())

        print 'Making Basemap...'
        lons = o.elements_scheduled.lon
        lats = o.elements_scheduled.lat
        bufferlat = 2
        basemap = reader_basemap_landmask.Reader(
            llcrnrlon=lons.min() - bufferlat,
            llcrnrlat=lats.min() - bufferlat,
            urcrnrlon=lons.max() + bufferlat,
            urcrnrlat=lats.max() + bufferlat,
            resolution='h',
            projection='merc',
            minimise_whitespace=True)
        o.add_reader([basemap, self.current, self.wind])

        time_step = 1800  # Half hour
        duration = int(self.durationhours.get()) * 3600 / time_step
        if self.directionvar.get() == 'backwards':
            time_step = -time_step
        o.run(steps=duration, time_step=time_step)
        print o

        tk.Button(self.master, text='Animation',
                  command=o.animation).grid(row=7,
                                            column=2,
                                            sticky=tk.W,
                                            pady=4)
        if self.model.get() == 'OpenOil':
            tk.Button(self.master,
                      text='Oil Budget',
                      command=o.plot_oil_budget).grid(row=7,
                                                      column=3,
                                                      sticky=tk.W,
                                                      pady=4)

        o.plot()
Ejemplo n.º 15
0
o = Leeway(loglevel=0)  # Set loglevel to 0 for debug information

# Arome
reader_arome = reader_netCDF_CF_generic.Reader(o.test_data_folder() +
    '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc')

# Norkyst
reader_norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() +
    '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc')

# Making customised, full resolution landmask
reader_landmask = reader_global_landmask.Reader(
                    llcrnrlon=5.5, llcrnrlat=61.05,
                    urcrnrlon=6.65, urcrnrlat=61.21)

o.add_reader([reader_landmask, reader_norkyst, reader_arome])

# Seed elements
lat = 61.117594; lon = 6.55
#time = [reader_arome.start_time,
#        reader_arome.start_time + timedelta(hours=5)]
time = reader_arome.start_time
objType = 1  # 1: Person-in-water (PIW), unknown state (mean values)
o.seed_elements(lon, lat, radius=50, number=5000, time=time, objectType=objType)

# Running model for 66 hours
o.run(steps=66*12, time_step=300)

# Print and plot results
print(o)
o.plot()
Ejemplo n.º 16
0
# Arome
#reader_arome = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/arome25/arome_metcoop_default2_5km_latest.nc')
reader_arome = reader_netCDF_CF_generic.Reader(lw.test_data_folder() + 
    '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc')

# Norkyst
#reader_norkyst = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be')
reader_norkyst = reader_netCDF_CF_generic.Reader(lw.test_data_folder() + 
    '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc')

# Landmask (Basemap)
reader_basemap = reader_basemap_landmask.Reader(llcrnrlon=2.5, llcrnrlat=59.3,
                    urcrnrlon=5.8, urcrnrlat=62.5, resolution='i')

lw.add_reader([reader_norkyst, reader_arome, reader_basemap])

# Seed elements along cone, e.g. ship track with
# increasing uncertainty in position
lon = [3.6, 5.1]; lat = [61., 59.6];
time = [reader_arome.start_time, reader_arome.start_time + timedelta(hours=30)]
#time = reader_arome.start_time

objType = 26  # 26 = Life-raft, no ballast
lw.seed_elements(lon, lat, radius=[1000, 10000], number=5000,
                 time=time, objectType=objType)

# Running model (until end of driver data)
lw.run(steps=66*4, time_step=900)

# Print and plot results
Ejemplo n.º 17
0
    '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc')

# Norkyst
#reader_norkyst = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be')
reader_norkyst = reader_netCDF_CF_generic.Reader(o.test_data_folder() + 
    '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc')

# Landmask (Basemap)
reader_basemap = reader_basemap_landmask.Reader(
                    llcrnrlon=5.5, llcrnrlat=61.05,
                    urcrnrlon=6.65, urcrnrlat=61.21, resolution='f',
                    projection='merc')

reader_norkyst.interpolation = 'linearND'  # Slower, but extrapolates to coast
reader_arome.interpolation = 'linearND'
o.add_reader([reader_basemap, reader_norkyst, reader_arome])

# Seed elements at defined position and time
lat = 61.117594; lon = 6.55
time = None
#time = [reader_arome.start_time,
#        reader_arome.start_time + timedelta(hours=5)]
time = reader_arome.start_time
objType = 1  # 1: Person-in-water (PIW), unknown state (mean values)
o.seed_elements(lon, lat, radius=50, number=5000, time=time, objectType=objType)

print o

# Running model (until end of driver data)
o.run(steps=66*12, time_step=300)
#stop
Ejemplo n.º 18
0
    def run_opendrift(self):
        sys.stdout.write('running OpenDrift')
        month = np.int(self.months.index(self.monthvar.get()) + 1)
        start_time = datetime(np.int(self.yearvar.get()), month,
                              np.int(self.datevar.get()),
                              np.int(self.hourvar.get()),
                              np.int(self.minutevar.get()))
        if start_time > self.current.end_time:
            sys.stdout.write('Start time after end of current data!')
            start_time = self.current.start_time
        emonth = np.int(self.months.index(self.emonthvar.get()) + 1)
        end_time = datetime(np.int(self.eyearvar.get()), emonth,
                            np.int(self.edatevar.get()),
                            np.int(self.ehourvar.get()),
                            np.int(self.eminutevar.get()))
        sys.stdout.flush()
        lon = np.float(self.lon.get())
        lat = np.float(self.lat.get())
        radius = np.float(self.radius.get())
        elon = np.float(self.elon.get())
        elat = np.float(self.elat.get())
        eradius = np.float(self.eradius.get())
        if lon != elon or lat != elat or start_time != end_time:
            lon = [lon, elon]
            lat = [lat, elat]
            radius = [radius, eradius]
            start_time = [start_time, end_time]
            cone = True
        else:
            cone = False
        if self.model.get() == 'Leeway':
            o = Leeway(loglevel=0)
            for ln, lc in enumerate(self.leewaycategories):
                if self.oljetype.get() == lc.strip().replace('>', ''):
                    print 'Leeway object category: ' + lc
                    break
            o.seed_elements(lon=lon,
                            lat=lat,
                            number=5000,
                            radius=radius,
                            time=start_time,
                            objectType=ln + 1)
        if self.model.get() == 'OpenOil':
            o = OpenOil3D(weathering_model='noaa', loglevel=0)
            o.seed_elements(lon=lon,
                            lat=lat,
                            number=5000,
                            radius=radius,
                            time=start_time,
                            cone=cone,
                            oiltype=self.oljetype.get())

        o.add_reader([self.current, self.wind, self.waves])
        o.set_config('general:basemap_resolution', 'h')

        time_step = 1800  # Half hour
        duration = int(self.durationhours.get()) * 3600 / time_step
        if self.directionvar.get() == 'backwards':
            time_step = -time_step
        o.run(steps=duration, time_step=time_step)
        print o

        if self.has_diana is True:
            diana_filename = self.dianadir + '/opendrift_' + \
                self.model.get() + o.start_time.strftime(
                                '_%Y%m%d_%H%M.nc')
            tk.Button(self.master,
                      text='Save to Diana',
                      command=o.write_netcdf_density_map(diana_filename)).grid(
                          row=7, column=2, sticky=tk.W, pady=4)
        tk.Button(self.master, text='Animation',
                  command=o.animation).grid(row=7,
                                            column=3,
                                            sticky=tk.W,
                                            pady=4)
        if self.model.get() == 'OpenOil':
            tk.Button(self.master,
                      text='Oil Budget',
                      command=o.plot_oil_budget).grid(row=7,
                                                      column=4,
                                                      sticky=tk.W,
                                                      pady=4)
Ejemplo n.º 19
0
# Norkyst
#reader_norkyst = reader_netCDF_CF_generic.Reader('http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be')
reader_norkyst = reader_netCDF_CF_generic.Reader(lw.test_data_folder() + 
    '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc')

# Landmask (Basemap)
reader_basemap = reader_basemap_landmask.Reader(
                    llcrnrlon=3.3, llcrnrlat=59.5,
                    urcrnrlon=5.5, urcrnrlat=62.5, resolution='h',
                    projection='merc')

#lw.add_reader([reader_norkyst, reader_arome, reader_basemap])
# Adding readers succesively, and specifying which variables they 
# shall provide. This way, order of adding readers does not matter,
# except for small rounding differences due to different projection
lw.add_reader(reader_norkyst,
              variables=['x_sea_water_velocity', 'y_sea_water_velocity'])
lw.add_reader(reader_arome,
              variables=['x_wind', 'y_wind'])
lw.add_reader(reader_basemap,
              variables=['land_binary_mask'])

# Seeding some particles
lon = 4.5; lat = 60.0; # Outside Bergen

# Seed leeway elements at defined position and time
objType = 26  # 26 = Life-raft, no ballast
lw.seed_elements(lon, lat, radius=1000, number=3000,
                 time=reader_arome.start_time, objectType=objType)

lw.set_projection('+proj=merc')
Ejemplo n.º 20
0
time = datetime.now()
duration = timedelta(days=3)
bufferlat = duration.total_seconds()/111000 
bufferlon = bufferlat*np.cos(lat*np.pi/180)

# Fetching current data from CMEMS
cmems_file = 'opendrift_cmems_download.nc'
if os.path.exists(cmems_file):
    # Reuising downloaded file, if existing. Delete it to force update.
    cmems = reader_netCDF_CF_generic.Reader(cmems_file)
else:
    cmems = reader_cmems.Reader(username=username, password=password,
                                motu=motu_client,
                                lon_min = lon - bufferlon,
                                lon_max = lon + bufferlon,
                                lat_min = lat - bufferlat,
                                lat_max = lat + bufferlat,
                                time_start = time,
                                time_end = time + duration)

# Fetching wind data from NCEP
reader_ncep = reader_netCDF_CF_generic.Reader('http://oos.soest.hawaii.edu/thredds/dodsC/hioos/model/atm/ncep_global/NCEP_Global_Atmospheric_Model_best.ncd')

o = Leeway()
o.add_reader([cmems, reader_ncep])
o.seed_elements(lon=lon, lat=lat, number=5000, time=time)
o.run(duration=duration, outfile='cmems.nc',
      time_step=600, time_step_output=3600)
o.animation()
Ejemplo n.º 21
0
from datetime import timedelta

from opendrift.readers import reader_netCDF_CF_generic
from opendrift.models.leeway import Leeway

lw = Leeway(loglevel=0)  # Set loglevel to 0 for debug information

# Arome
reader_arome = reader_netCDF_CF_generic.Reader(lw.test_data_folder() + 
    '16Nov2015_NorKyst_z_surface/arome_subset_16Nov2015.nc')
# Norkyst
reader_norkyst = reader_netCDF_CF_generic.Reader(lw.test_data_folder() + 
    '16Nov2015_NorKyst_z_surface/norkyst800_subset_16Nov2015.nc')

lw.add_reader([reader_norkyst, reader_arome])

# Intermediate map resolution is sufficient for large scale
lw.set_config('general:basemap_resolution', 'i')

# Seed elements along cone, e.g. ship track with
# increasing uncertainty in position
lon = [3.6, 5.1]; lat = [61., 59.6];
time = [reader_arome.start_time,
        reader_arome.start_time + timedelta(hours=30)]

objType = 26  # 26 = Life-raft, no ballast
lw.seed_elements(lon, lat, radius=[1000, 10000], number=5000,
                 time=time, objectType=objType)

# Running model
Ejemplo n.º 22
0
    def run_opendrift(self):
        sys.stdout.write('running OpenDrift')
        month = np.int(self.months.index(self.monthvar.get()) + 1)
        start_time = datetime(np.int(self.yearvar.get()), month,
                              np.int(self.datevar.get()),
                              np.int(self.hourvar.get()),
                              np.int(self.minutevar.get()))
        if start_time > self.current.end_time:
            sys.stdout.write('Start time after end of current data!')
            start_time = self.current.start_time
        emonth = np.int(self.months.index(self.emonthvar.get()) + 1)
        end_time = datetime(np.int(self.eyearvar.get()), emonth,
                            np.int(self.edatevar.get()),
                            np.int(self.ehourvar.get()),
                            np.int(self.eminutevar.get()))
        sys.stdout.flush()
        lon = np.float(self.lon.get())
        lat = np.float(self.lat.get())
        radius = np.float(self.radius.get())
        elon = np.float(self.elon.get())
        elat = np.float(self.elat.get())
        eradius = np.float(self.eradius.get())
        if lon != elon or lat != elat or start_time != end_time:
            lon = [lon, elon]
            lat = [lat, elat]
            radius = [radius, eradius]
            start_time = [start_time, end_time]
            cone = True
        else:
            cone = False
        if self.model.get() == 'Leeway':
            o = Leeway(loglevel=20)
            for ln, lc in enumerate(self.leewaycategories):
                if self.oljetype.get() == lc.strip().replace('>', ''):
                    print 'Leeway object category: ' + lc
                    break
            o.seed_elements(lon=lon, lat=lat, number=2000,
                            radius=radius, time=start_time,
                            objectType=ln + 1)
        if self.model.get() == 'OpenOil':
            o = OpenOil(loglevel=20)
            o.seed_elements(lon=lon, lat=lat, number=2000, radius=radius,
                            time=start_time, cone=cone,
                            oiltype=self.oljetype.get())

        print 'Making Basemap...'
        lons = o.elements_scheduled.lon
        lats = o.elements_scheduled.lat
        bufferlat = 2
        basemap = reader_basemap_landmask.Reader(
            llcrnrlon=lons.min() - bufferlat,
            llcrnrlat=lats.min() - bufferlat,
            urcrnrlon=lons.max() + bufferlat,
            urcrnrlat=lats.max() + bufferlat,
            resolution='h', projection='merc',
            minimise_whitespace=True)
        o.add_reader([basemap, self.current, self.wind])

        time_step = 1800  # Half hour
        duration = int(self.durationhours.get())*3600/time_step
        if self.directionvar.get() == 'backwards':
            time_step = -time_step
        o.run(steps=duration, time_step=time_step)
        print o

        tk.Button(self.master, text='Animation',
                  command=o.animation).grid(row=7, column=2,
                                            sticky=tk.W, pady=4)
        if self.model.get() == 'OpenOil':
            tk.Button(self.master, text='Oil Budget',
                      command=o.plot_oil_budget).grid(row=7, column=3,
                                                      sticky=tk.W, pady=4)

        o.plot()