예제 #1
0
 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')
예제 #2
0
 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)
예제 #3
0
 def test_leeway_global_today(self):
     o = Leeway(loglevel=0)
     o.add_readers_from_file(o.test_data_folder() +
         '../../opendrift/scripts/data_sources.txt')
     o.seed_elements(lon=50, lat=29, number=100, radius=1000,
                     time=datetime.now())
     o.run(steps=15)
     print (o)
     self.assertEqual(o.steps_calculation, 15)
예제 #4
0
def test_leewayprop():
    """Check that Leeway properties are properly read."""
    object_type = 85  # MED-WASTE-7
    lee = Leeway(loglevel=20)
    object_type = object_type
    assert lee.leewayprop[object_type]['Description'] == '>>Medical waste, syringes, small'
    assert lee.leewayprop[object_type]['DWSLOPE'] == 1.79
예제 #5
0
    def set_model(self, model):
        if model == 'OpenOil':
            self.categoryLabel['text'] = 'Oil type'
            self.oljetype.set('')
            self.categorydrop['menu'].delete(0, 'end')
            self.o = OpenOil()
            for cat in self.o.oiltypes:
                self.categorydrop['menu'].add_command(label=cat,
                                                      command=tk._setit(
                                                          self.oljetype, cat))
            self.oljetype.set(self.o.oiltypes[0])

        if model == 'Leeway':
            self.categoryLabel['text'] = 'Object type'
            self.oljetype.set('')
            self.categorydrop['menu'].delete(0, 'end')
            self.o = Leeway()
            self.leewaycategories = [
                self.o.leewayprop[c]['Description'].strip().replace('>', '')
                for c in self.o.leewayprop
            ]
            for cat in self.leewaycategories:
                self.categorydrop['menu'].add_command(label=cat,
                                                      command=tk._setit(
                                                          self.oljetype, cat))
            self.oljetype.set(self.leewaycategories[0])
예제 #6
0
    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
예제 #7
0
    def set_model(self, model):
        if model == 'OpenOil':
            self.categoryLabel['text'] = 'Oil type'
            self.oljetype.set('')
            self.o = OpenOil3D(weathering_model='noaa', location='NORWAY')
            self.categorydrop['values'] = self.o.oiltypes
            self.oljetype.set(self.o.oiltypes[0])

        if model == 'Leeway':
            self.categoryLabel['text'] = 'Object type'
            self.oljetype.set('')
            self.o = Leeway()
            self.leewaycategories = [
                self.o.leewayprop[c]['Description'].strip().replace('>', '')
                for c in self.o.leewayprop
            ]
            self.categorydrop['values'] = self.leewaycategories
            self.oljetype.set(self.leewaycategories[0])
예제 #8
0
 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)
예제 #9
0
    def set_model(self, model):
        if model == 'OpenOil':
            self.o = OpenOil3D(weathering_model='noaa', location='NORWAY')
        elif model == 'Leeway':
            self.o = Leeway()
        elif model == 'ShipDrift':
            self.o = ShipDrift()

        for con in self.config.winfo_children():
            con.destroy()
        self.con = tk.Label(self.config, text="\n\nConfiguration\n\n")
        self.con.grid(row=0, column=1, rowspan=1)
        for i, cs in enumerate(self.o._config_hashstrings()):
            tk.Label(self.config, text=cs).grid(row=i, column=1, rowspan=1)
        try:
            self.results.destroy()
        except:
            pass

        print('Setting model: ' + model)
        print(self.o.list_configspec())
        sc = self.o.get_seed_config()
        print(sc)
        self.seed_input = {}
        self.seed_input_var = {}
        self.seed_input_label = {}
        self.seed_frame = tk.Frame(self.seed,
                                   bd=2,
                                   relief=tk.FLAT,
                                   padx=5,
                                   pady=0)
        self.seed_frame.grid(row=6, columnspan=8, sticky='nsew')
        # FIND
        for num, i in enumerate(sc):
            if i in ['ocean_only', 'jibeProbability']:
                continue  # workaround, should be avoided in future
            self.seed_input_label[i] = tk.Label(self.seed_frame, text=i + '\t')
            self.seed_input_label[i].grid(row=num, column=0)
            self.seed_input_var[i] = tk.StringVar()
            if type(sc[i]['options']) is list:
                self.seed_input[i] = ttk.Combobox(
                    self.seed_frame,
                    width=50,
                    textvariable=self.seed_input_var[i],
                    values=sc[i]['options'])
                self.seed_input_var[i].set(sc[i]['default'])
            else:
                self.seed_input[i] = tk.Entry(
                    self.seed_frame,
                    textvariable=self.seed_input_var[i],
                    width=6,
                    justify=tk.RIGHT)
                self.seed_input[i].insert(0, sc[i]['default'])
            self.seed_input[i].grid(row=num, column=1)
    def check_seeding(self):
        print('#' * 50)
        print('Hang on, plot is comming in a few seconds...')
        print('#' * 50)
        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()))
        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

        so = Leeway(loglevel=50)
        so.seed_elements(lon=lon, lat=lat, radius=radius, time=start_time)
        so.plot(buffer=.5, fast=True)
        del so
예제 #11
0
def test_leeway_config_object():
    """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
    assert l.leewayprop[objType]['Description'] == 'Surf board with person'
    assert l.leewayprop[objType]['OBJKEY'] == 'PERSON-POWERED-VESSEL-2'
예제 #12
0
def test_simulation_back_extent():
    # backward
    leeb = Leeway()

    objectType = 50  # FISHING-VESSEL-1
    leeb.seed_elements(lon=4,
                       lat=60,
                       number=100,
                       objectType=objectType,
                       time=datetime(2015, 1, 1))

    leeb.fallback_values['x_wind'] = 1.5
    leeb.fallback_values['y_wind'] = 10
    leeb.fallback_values[
        'x_sea_water_velocity'] = 1.5  # maximum speed in automatic landmask
    leeb.fallback_values['y_sea_water_velocity'] = 0

    with pytest.raises(ValueError) as ex:
        leeb.run(duration=timedelta(days=-1),
                 time_step=3600,
                 time_step_output=10 * 3600)
    assert 'Time step must be negative if duration is negative.' in str(
        ex.value)
예제 #13
0
    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
예제 #14
0
    def check_seeding(self):
        print('#' * 50)
        print('Hang on, plot is comming in a few seconds...')
        mapres = self.mapresvar.get()[0]
        if mapres == 'f':
            print(
                '...actually more like 30 seconds for full resolution coastline....'
            )
            if self.has_diana is True:
                print('Du far ta deg ein liten trall mens du ventar.')
        print('#' * 50)
        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()))
        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

        so = Leeway(loglevel=50)
        so.seed_elements(lon=lon,
                         lat=lat,
                         number=5000,
                         radius=radius,
                         time=start_time)
        so.set_config('general:basemap_resolution', mapres)
        so.plot(buffer=.5)
        del so
예제 #15
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
예제 #16
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
예제 #17
0
    def check_seeding(self):
        print('#'*50)
        print('Hang on, plot is comming in a few seconds...')
        print('#'*50)
        month = int(self.months.index(self.monthvar.get()) + 1)
        start_time = datetime(int(self.yearvar.get()), month,
                              int(self.datevar.get()),
                              int(self.hourvar.get()),
                              int(self.minutevar.get()))
        emonth = int(self.months.index(self.emonthvar.get()) + 1)
        end_time = datetime(int(self.eyearvar.get()), emonth,
                            int(self.edatevar.get()),
                            int(self.ehourvar.get()),
                            int(self.eminutevar.get()))
        sys.stdout.flush()
        lon = float(self.lon.get())
        lat = float(self.lat.get())
        radius = float(self.radius.get())
        elon = float(self.elon.get())
        elat = float(self.elat.get())
        eradius = 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

        so = Leeway(loglevel=50)
        for k,v in self.GUI_config.items():
            try:
                so.set_config(k, v)
            except:
                pass
        so.seed_cone(lon=lon, lat=lat, radius=radius, time=start_time)
        so.plot(buffer=.5, fast=True)
        del so
예제 #18
0
 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')
예제 #19
0
    def check_seeding(self):
        print '#'*50
        print 'Hang on, plot is comming in a few seconds...'
        mapres = self.mapresvar.get()[0]
        if mapres == 'f':
            print '...actually more like 30 seconds for full resolution coastline....'
            if self.has_diana is True:
                print 'Du far ta deg ein liten trall mens du ventar.'
        print '#'*50
        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()))
        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

        so = Leeway(loglevel=50)
        so.seed_elements(lon=lon, lat=lat, number=5000,
                         radius=radius, time=start_time)
        so.set_config('general:basemap_resolution', mapres)         
        so.plot(buffer=.5)
        del so
예제 #20
0
#!/usr/bin/env python

from datetime import timedelta

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

o = Leeway(loglevel=0)  # 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(o.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(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
예제 #21
0
#!/usr/bin/env python
"""
Vietnam
==================================
"""

from datetime import datetime, timedelta
from opendrift.models.leeway import Leeway

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

# Adding readers for global Thredds datasets:
# - Ocean forecast from global Hycom
# - Weather forecast from NOAA/NCEP
o.add_readers_from_list([
    'https://tds.hycom.org/thredds/dodsC/GLBy0.08/latest',
    'https://pae-paha.pacioos.hawaii.edu/thredds/dodsC/ncep_global/NCEP_Global_Atmospheric_Model_best.ncd'])

# Seed some particles
objType = 26  # 26 = Life-raft, no ballast
o.seed_elements(lon=107.8, lat=10.0, radius=1000, number=1000,
                objectType=objType, time=datetime.now())

# Run model
o.run(duration=timedelta(days=3),
      time_step=timedelta(hours=1),
      time_step_output=timedelta(hours=3))

# Print and plot results
print(o)
o.plot(fast=True)
예제 #22
0
#!/usr/bin/env python

from datetime import timedelta

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

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 (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
예제 #23
0
    def set_model(self, model):
        if model == 'OpenOil':
            self.o = OpenOil(weathering_model='noaa', location='NORWAY')
        elif model == 'Leeway':
            self.o = Leeway()
        elif model == 'ShipDrift':
            self.o = ShipDrift()
        elif model == 'OpenBerg':
            self.o = OpenBerg()

        for con in self.config.winfo_children():
            con.destroy()
        self.con = tk.Label(self.config, text="\n\nConfiguration\n\n")
        self.con.grid(row=0, column=1, rowspan=1)
        for i, cs in enumerate(self.o._config_hashstrings()):
            tk.Label(self.config, text=cs).grid(row=i, column=1, rowspan=1)
        try:
            self.results.destroy()
        except:
            pass
        try:
            # Removing depth input boxes
            self.depthlabel.destroy()
            self.depth.destroy()
            self.seafloor.destroy()
            self.amount.destroy()
            self.amountlabel.destroy()
        except:
            pass

        print('Setting model: ' + model)
        print(self.o.list_configspec())
        sc = self.o.get_seed_config()
        print(sc)
        self.seed_input = {}
        self.seed_input_var = {}
        self.seed_input_label = {}
        self.seed_frame = tk.Frame(self.seed, bd=2,
                                   relief=tk.FLAT, padx=5, pady=0)
        self.seed_frame.grid(row=60, columnspan=8, sticky='nsew')
        # FIND
        for num, i in enumerate(sc):
            if i in ['ocean_only', 'jibeProbability']:
                continue  # workaround, should be avoided in future
            self.seed_input_label[i] = tk.Label(self.seed_frame,
                                                text=i + '\t')
            self.seed_input_label[i].grid(row=num, column=0)
            self.seed_input_var[i] = tk.StringVar()
            if type(sc[i]['options']) is list:
                self.seed_input[i] = ttk.Combobox(
                    self.seed_frame, width=50,
                    textvariable=self.seed_input_var[i],
                    values=sc[i]['options'])
                self.seed_input_var[i].set(sc[i]['default'])
            else:
                self.seed_input[i] = tk.Entry(
                    self.seed_frame, textvariable=self.seed_input_var[i],
                    width=6, justify=tk.RIGHT)
                self.seed_input[i].insert(0, sc[i]['default'])
            self.seed_input[i].grid(row=num, column=1)

        if model == 'OpenOil':  # User may be able to chose release depth
            self.depthlabel = tk.Label(self.duration, text='Spill depth [m]')
            self.depthlabel.grid(row=60, column=0)
            self.depthvar = tk.StringVar()
            self.depth = tk.Entry(self.duration, textvariable=self.depthvar,
                                  width=6, justify=tk.RIGHT)
            self.depth.grid(row=60, column=2)
            self.depth.insert(0, '0')
            self.seafloorvar = tk.IntVar()
            self.seafloor = tk.Checkbutton(self.duration, variable=self.seafloorvar,
                                           text='seafloor',
                                           command=self.seafloorbutton)
            self.seafloor.grid(row=60, column=3)

            self.amountvar = tk.StringVar()
            self.amount = tk.Entry(self.duration, textvariable=self.amountvar,
                                  width=6, justify=tk.RIGHT)
            self.amount.grid(row=60, column=4)
            self.amount.insert(0, '100')
            self.amountlabel = tk.Label(self.duration, text='m3 (per hour)')
            self.amountlabel.grid(row=60, column=5)
예제 #24
0
 def test_leeway_today(self):
     o = Leeway(loglevel=0)
     o.add_readers_from_file(o.test_data_folder() +
                             '../../opendrift/scripts/data_sources.txt')
     o.set_config('general:basemap_resolution', 'i')
     o.seed_elements(lon=14,
                     lat=67.85,
                     number=100,
                     radius=1000,
                     time=datetime.now())
     o.run(steps=15)
     print o
     self.assertEqual(o.steps_calculation, 15)
예제 #25
0
#!/usr/bin/env python

from opendrift.readers import reader_basemap_landmask
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('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=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,
예제 #26
0
    def run_opendrift(self):
        sys.stdout.write('running OpenDrift')
        try:
            self.budgetbutton.destroy()
        except Exception as e:
            print e
            pass
        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()))
        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_readers_from_file(o.test_data_folder() +
            '../../opendrift/scripts/data_sources.txt')
        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
        if self.has_diana is True:
            extra_args = {'outfile': self.outputdir + '/opendrift_' +                          self.model.get() + o.start_time.strftime(
                                '_%Y%m%d_%H%M.nc')}
        else:
            extra_args = {}

        mapres = self.mapresvar.get()[0]
        o.set_config('general:basemap_resolution', mapres)         

        o.run(steps=duration, time_step=time_step,
              time_step_output=time_step, **extra_args)
        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')
            o.write_netcdf_density_map(diana_filename)
            tk.Button(self.master, text='Show in Diana',
                      command=lambda: os.system('diana &')
                      ).grid(row=8, column=2, sticky=tk.W, pady=4)
        tk.Button(self.master, text='Animation',
                  command=o.animation).grid(row=8, column=3,
                                            sticky=tk.W, pady=4)
        if self.model.get() == 'OpenOil':
            self.budgetbutton = tk.Button(self.master,
                text='Oil Budget', command=o.plot_oil_budget)
            self.budgetbutton.grid(row=8, column=4, sticky=tk.W, pady=4)
예제 #27
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()
예제 #28
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()
예제 #29
0
    def run_opendrift(self):
        sys.stdout.write('running OpenDrift')
        try:
            self.budgetbutton.destroy()
        except Exception as e:
            print e
            pass
        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()))
        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())

        readers = [  # Note that order (priority) is important!
            '/lustre/storeA/project/copernicus/sea/romsnorkyst/zdepths1h/*fc*.nc',
            'http://thredds.met.no/thredds/dodsC/sea/norkyst800m/1h/aggregate_be',
            '/lustre/storeA/project/copernicus/sea/romsnordic/zdepths1h/roms_nordic4_ZDEPTHS_hr.fc.*.nc',
            'http://thredds.met.no/thredds/dodsC/sea/nordic4km/zdepths1h/aggregate_be',
            '/lustre/storeA/project/metproduction/products/meps/symlinks/thredds/meps_det_pp_2_5km_latest.nc',
            'http://thredds.met.no/thredds/dodsC/meps25files/meps_det_pp_2_5km_latest.nc',
            '/lustre/storeA/project/metproduction/products/arome2_5_arctic/thredds/arome_arctic_pp_2_5km_latest.nc',
            'http://thredds.met.no/thredds/dodsC/aromearcticlatest/arome_arctic_pp_2_5km_latest.nc',
            '/lustre/storeA/project/copernicus/sea/mywavewam4/*fc*.nc',
            'http://thredds.met.no/thredds/dodsC/sea/mywavewam4/mywavewam4_be',
            'http://tds.hycom.org/thredds/dodsC/GLBu0.08/expt_91.2/uv3z',
            'http://oos.soest.hawaii.edu/thredds/dodsC/hioos/model/atm/ncep_global/NCEP_Global_Atmospheric_Model_best.ncd']
        o.add_readers_from_list(readers)
        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
        if self.has_diana is True:
            extra_args = {'outfile': self.outputdir + '/opendrift_' +                          self.model.get() + o.start_time.strftime(
                                '_%Y%m%d_%H%M.nc')}
        else:
            extra_args = {}

        mapres = self.mapresvar.get()[0]
        o.set_config('general:basemap_resolution', mapres)         

        o.run(steps=duration, time_step=time_step,
              time_step_output=time_step, **extra_args)
        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')
            o.write_netcdf_density_map(diana_filename)
            tk.Button(self.master, text='Show in Diana',
                      command=lambda: os.system('diana &')
                      ).grid(row=8, column=2, sticky=tk.W, pady=4)
        tk.Button(self.master, text='Animation',
                  command=o.animation).grid(row=8, column=3,
                                            sticky=tk.W, pady=4)
        if self.model.get() == 'OpenOil':
            self.budgetbutton = tk.Button(self.master,
                text='Oil Budget', command=o.plot_oil_budget)
            self.budgetbutton.grid(row=8, column=4, sticky=tk.W, pady=4)
예제 #30
0
#!/usr/bin/env python

from datetime import timedelta

from opendrift.readers import reader_basemap_landmask
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('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
예제 #31
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')
#!/usr/bin/env python
"""
Leeway
==================================
"""

from datetime import timedelta
import cmocean
from opendrift.readers import reader_netCDF_CF_generic
from opendrift.models.leeway import Leeway

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)
예제 #33
0
#    'http://thredds.met.no/example_of_nonexisting_url.nc',
#    'example_of_nonexisting_file',
#    ]

for case in ['oil', 'leeway']:  # test two models
    for timestep in [900, -900]:  # forwards and backwards
        for z in [0, -200]:  # seeding at sea surface and at 200 m depth
            if case == 'oil':
                o = OpenOil3D(weathering_model='noaa')
                args = {'oiltype': 'HEIDRUN, STATOIL',
                #args = {'oiltype': 'WISTING',
                        'z': z}
            else:
                if z < 0:
                    continue  # Only surface seeding for Leeway
                o = Leeway()
                args = {'objectType': 32}

            #o.add_readers_from_list(readers, timeout=5)
            o.add_halo_readers()
            print o

            #lons=[-0.8, 0.4]; lats=[59.9, 59.95] # NorKyst border
            #lons=[4.8, 5.1]; lats=[59.9, 59.95] # Western Norway coast
            #lons=[13.11, 13.13]; lats=[67.81, 67.80] # Lofoten
            #lons=[19.37, 19.33]; lats=[70.32, 70.34] # Troms
            lons=[3.8, 3.82]; lats=[59.6, 59.61] # North Sea

            o.seed_elements(lon=lons, lat=lats,
                            time=[datetime.now() - timedelta(hours=3),
                                  datetime.now()],
예제 #34
0
    def test_lazy_reader_leeway_compare(self):

        o1 = Leeway(loglevel=0)
        #o1.set_config('environment:fallback:land_binary_mask', 0)
        o1.required_variables = [r for r in o1.required_variables
                                 if r != 'land_binary_mask']
        o1.add_readers_from_list(reader_list, lazy=False)
        time = o1.readers['roms native'].start_time
        o1.seed_elements(lat=67.85, lon=14, time=time)
        o1.run(steps=5)

        o2 = Leeway(loglevel=20)
        #o2.set_config('environment:fallback:land_binary_mask', 0)
        o2.required_variables = [r for r in o1.required_variables
                                 if r != 'land_binary_mask']
        o2.add_readers_from_list(reader_list, lazy=True)
        o2.seed_elements(lat=67.85, lon=14, time=time)
        o2.run(steps=5)

        # Some differences in wind and current components
        # due to different coordinate system
        for var in o1.history.dtype.names:
            if var in ['x_wind', 'y_wind', 'x_sea_water_velocity',
                       'y_sea_water_velocity']:
                tolerance = 1
            else:
                tolerance = 5
            self.assertIsNone(np.testing.assert_array_almost_equal(
                o1.history[var], o2.history[var], tolerance))
예제 #35
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.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 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() == 92
    assert lee.num_elements_deactivated() == 8  # stranded
    lee.export_ascii(tmpdir + '/leeway_ascii.txt')
예제 #36
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)
예제 #37
0
 def test_leeway_global_one_month_ago(self):
     o = Leeway(loglevel=0)
     o.add_readers_from_file(o.test_data_folder() +
                             '../../opendrift/scripts/data_sources.txt')
     o.set_config('general:basemap_resolution', 'i')
     o.seed_elements(lon=50,
                     lat=29,
                     number=100,
                     radius=1000,
                     time=datetime.now() - timedelta(days=30))
     o.run(steps=15)
     o.export_ascii('leeway_ascii.txt')
     os.remove('leeway_ascii.txt')
     print o
     self.assertEqual(o.steps_calculation, 15)
예제 #38
0
    def run_opendrift(self):
        sys.stdout.write('running OpenDrift')
        try:
            self.budgetbutton.destroy()
        except Exception as e:
            print(e)
            pass
        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()))
        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_readers_from_file(o.test_data_folder() +
                                '../../opendrift/scripts/data_sources.txt')
        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
        if self.has_diana is True:
            extra_args = {
                'outfile':
                self.outputdir + '/opendrift_' + self.model.get() +
                o.start_time.strftime('_%Y%m%d_%H%M.nc')
            }
        else:
            extra_args = {}

        mapres = self.mapresvar.get()[0]
        o.set_config('general:basemap_resolution', mapres)

        o.run(steps=duration,
              time_step=time_step,
              time_step_output=time_step,
              **extra_args)
        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')
            o.write_netcdf_density_map(diana_filename)
            tk.Button(self.master,
                      text='Show in Diana',
                      command=lambda: os.system('diana &')).grid(row=8,
                                                                 column=2,
                                                                 sticky=tk.W,
                                                                 pady=4)
        tk.Button(self.master, text='Animation',
                  command=o.animation).grid(row=8,
                                            column=3,
                                            sticky=tk.W,
                                            pady=4)
        if self.model.get() == 'OpenOil':
            self.budgetbutton = tk.Button(self.master,
                                          text='Oil Budget',
                                          command=o.plot_oil_budget)
            self.budgetbutton.grid(row=8, column=4, sticky=tk.W, pady=4)
예제 #39
0
    def run_opendrift(self):
        sys.stdout.write('running OpenDrift')
        try:
            self.budgetbutton.destroy()
        except Exception as e:
            print(e)
            pass
        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()))
        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':
            self.o = Leeway(loglevel=0)
            #for ln, lc in enumerate(self.leewaycategories):
            #    if self.oljetype.get() == lc.strip().replace('>', ''):
            #        print('Leeway object category: ' + lc)
            #        break
            #extra_seed_args = {'objectType': ln + 1}
        elif self.model.get() == 'OpenOil':
            self.o = OpenOil(weathering_model='noaa', loglevel=0)
            #extra_seed_args = {'oiltype': self.oljetype.get()}
        elif self.model.get() == 'ShipDrift':
            self.o = ShipDrift(loglevel=0)

        extra_seed_args = {}
        for se in self.seed_input:
            if se == 'ocean_only':
                continue  # To be fixed/removed
            val = self.seed_input[se].get()
            try:
                extra_seed_args[se] = np.float(val)
            except:
                extra_seed_args[se] = val
            self.o.set_config('seed:' + se, val)
        if 'object_type' in extra_seed_args:
            extra_seed_args['objectType'] = extra_seed_args['object_type']
            del extra_seed_args['object_type']

        self.o.add_readers_from_file(self.o.test_data_folder() +
            '../../opendrift/scripts/data_sources.txt')

        extra_seed_args = {}
        if self.model.get() == 'OpenOil':
            if self.seafloorvar.get() == 1:
                z = 'seafloor'
            else:
                z = -np.abs(np.float(self.depthvar.get()))  # ensure negative z
            extra_seed_args['z'] = z
            extra_seed_args['m3_per_hour'] = np.float(self.amountvar.get())
        self.o.seed_elements(lon=lon, lat=lat, number=5000, radius=radius,
                        time=start_time, cone=cone,
                        **extra_seed_args)

        #time_step = o.get_config('general:time_step_minutes')*60
        time_step = 900  # 15 minutes
        time_step_output = timedelta(minutes=30)
        duration = int(self.durationhours.get())*3600/time_step
        if self.directionvar.get() == 'backwards':
            time_step = -time_step
        if self.has_diana is True:
            extra_args = {'outfile': self.outputdir + '/opendrift_' +
                self.model.get() + self.o.start_time.strftime('_%Y%m%d_%H%M.nc')}
        else:
            extra_args = {}

        #mapres = self.mapresvar.get()[0]
        self.simulationname = 'opendrift_' + self.model.get() + \
            self.o.start_time.strftime('_%Y%m%d_%H%M')

        # Starting simulation run
        self.o.run(steps=duration, time_step=time_step,
              time_step_output=time_step_output, **extra_args)
        print(self.o)

        self.results.destroy()
        self.results = tk.Frame(self.seed, bd=2,
                               relief=tk.FLAT, padx=5, pady=0)
        self.results.grid(row=70, column=3, columnspan=1, sticky='ew')
        tk.Button(self.results, text='Show animation',
                  command=lambda: self.handle_result(
                    'showanimation')).grid(row=10, column=1)
        tk.Button(self.results, text='Save animation',
                  command=lambda: self.handle_result(
                    'saveanimation')).grid(row=20, column=1)
        tk.Button(self.results, text='Show plot',
                  command=lambda: self.handle_result(
                    'showplot')).grid(row=30, column=1)
        tk.Button(self.results, text='Save plot',
                  command=lambda: self.handle_result(
                    'saveplot')).grid(row=40, column=1)
        if self.model.get() == 'OpenOil':
            tk.Button(self.results, text='Save oil budget',
                      command=lambda: self.handle_result(
                        'saveoilbudget')).grid(row=50, column=1)
            tk.Button(self.results, text='Show oil budget',
                      command=lambda: self.handle_result(
                        'showoilbudget')).grid(row=60, column=1)

        if self.has_diana is True:
            diana_filename = self.dianadir + self.simulationname + '.nc'
            self.o.write_netcdf_density_map(diana_filename)
            tk.Button(self.results, text='Show in Diana',
                      command=lambda: os.system('diana &')
                      ).grid(row=80, column=1)
예제 #40
0
]

for case in ['oil', 'leeway']:  # test two models
    for timestep in [900, -900]:  # forwards and backwards
        for z in [0, -200]:  # seeding at sea surface and at 200 m depth
            if case == 'oil':
                o = OpenOil(weathering_model='noaa')
                args = {
                    'oiltype': 'IVAR AASEN 2012',
                    #args = {'oiltype': 'WISTING',
                    'z': z
                }
            else:
                if z < 0:
                    continue  # Only surface seeding for Leeway
                o = Leeway()
                args = {'object_type': 32}

            o.add_readers_from_list(readers, timeout=5)
            print(o)

            #lons=[-0.8, 0.4]; lats=[59.9, 59.95] # NorKyst border
            #lons=[4.8, 5.1]; lats=[59.9, 59.95] # Western Norway coast
            #lons=[13.11, 13.13]; lats=[67.81, 67.80] # Lofoten
            #lons=[19.37, 19.33]; lats=[70.32, 70.34] # Troms
            lons = [3.8, 3.82]
            lats = [59.6, 59.61]  # North Sea

            o.seed_elements(
                lon=lons,
                lat=lats,
예제 #41
0
 def test_config_suggestion(self):
     o = Leeway(loglevel=20)
     try:
         o.set_config('seed:object_type', 'person')
     except Exception as e:
         self.assertTrue('Did you mean' in str(e))
예제 #42
0
#!/usr/bin/env python

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])
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
예제 #43
0
#!/usr/bin/env python

from opendrift.readers import reader_basemap_landmask
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('http://thredds.met.no/thredds/dodsC/meps25files/meps_det_extracted_2_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=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,
예제 #44
0
    'https://thredds.met.no/thredds/dodsC/sea/mywavewam4/mywavewam4_be',
    'https://thredds.met.no/example_of_nonexisting_url.nc',
    'example_of_nonexisting_file']

for case in ['oil', 'leeway']:  # test two models
    for timestep in [900, -900]:  # forwards and backwards
        for z in [0, -200]:  # seeding at sea surface and at 200 m depth
            if case == 'oil':
                o = OpenOil3D(weathering_model='noaa')
                args = {'oiltype': 'IVAR AASEN 2012',
                #args = {'oiltype': 'WISTING',
                        'z': z}
            else:
                if z < 0:
                    continue  # Only surface seeding for Leeway
                o = Leeway()
                args = {'objectType': 32}

            o.add_readers_from_list(readers, timeout=5)
            print(o)

            #lons=[-0.8, 0.4]; lats=[59.9, 59.95] # NorKyst border
            #lons=[4.8, 5.1]; lats=[59.9, 59.95] # Western Norway coast
            #lons=[13.11, 13.13]; lats=[67.81, 67.80] # Lofoten
            #lons=[19.37, 19.33]; lats=[70.32, 70.34] # Troms
            lons=[3.8, 3.82]; lats=[59.6, 59.61] # North Sea

            o.seed_elements(lon=lons, lat=lats,
                            time=[datetime.now() - timedelta(hours=3),
                                  datetime.now()],
                            number=1000, radius = [0, 1000],