Skip to content

Commit 4cd90d8

Browse files
authored
Merge pull request #1791 from mateuszmatu/seed_from_file
Functionality to seed from OpenDrift result file and keep particle properties.
2 parents c6011b4 + 1997f16 commit 4cd90d8

1 file changed

Lines changed: 67 additions & 1 deletion

File tree

opendrift/models/basemodel/__init__.py

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ def __init__(self,
335335
# Set up logging
336336
logformat = '%(asctime)s %(levelname)-7s %(name)s:%(lineno)d: %(message)s'
337337
datefmt = '%H:%M:%S'
338-
338+
339339
if loglevel < 10: # 0 is NOTSET, giving no output
340340
print('WARNING: from next version (1.14.10), loglevel of 0 will give no logging, please change to 10 for DEBUG')
341341
loglevel = 10
@@ -1667,6 +1667,72 @@ def seed_from_ladim(self, ladimfile, roms):
16671667
elements = self.ElementType(lon=lon, lat=lat, z=-z)
16681668

16691669
self.schedule_elements(elements, time)
1670+
1671+
@require_mode(mode=Mode.Ready)
1672+
def seed_from_dataset(self, ds, trajectory_time_index=-1, time=None, keep_properties=True, **kwargs):
1673+
"""Seed elements from OpenDrift dataset
1674+
1675+
Arguments:
1676+
ds (DataArray) : DataArray from previous OpenDrift run.
1677+
trajectory_time_index (int) : Time index from which to continue OpenDrift run.
1678+
time (datenum or list) : Time to initiate particles. If None, uses time from trajectory_time_index.
1679+
keep_properties (bool) : Keep element properties from DataArray. If False, overrides properties with new ones.
1680+
"""
1681+
ds = ds.isel(time=trajectory_time_index)
1682+
1683+
# get seed time
1684+
if time is None:
1685+
time = pd.to_datetime(ds.time.values)
1686+
1687+
# Dropping trajectories which had not been initiated at selected time, e.g. for continuous release.
1688+
ds = ds.where(ds.age_seconds >= 0, drop=True)
1689+
1690+
logger.info('Using positions from dataset at time %s' % (str(time)))
1691+
1692+
try:
1693+
file_class = ds.opendrift_class
1694+
current_class = self.__class__.__name__
1695+
1696+
# check if model is the same
1697+
if file_class != current_class:
1698+
logger.warning('Current model %s is not equal to model used in provided dataset %s' % (current_class, file_class))
1699+
except:
1700+
logger.warning('Could not find opendrift_class in provided dataset')
1701+
1702+
if keep_properties:
1703+
# Making dictionary with previous properties
1704+
prop_dict = {}
1705+
for key in self.elements.variables.keys():
1706+
#omitting lon and lat since these are provided anyways
1707+
if key == 'lon' or key == 'lat':
1708+
pass
1709+
else:
1710+
if key in ds:
1711+
prop_dict[key] = ds[key].values
1712+
1713+
logger.info('Seeding %i particles from dataset' %(len(ds.lon)))
1714+
logger.info('Using values from dataset for element properties: ')
1715+
logger.info('%s' % (str([key for key in prop_dict.keys()])))
1716+
self.seed_elements(ds.lon, ds.lat, time=time, **prop_dict)
1717+
1718+
else:
1719+
logger.info('Using only lon, lat from provided dataset. Omitting particle properties from previous run')
1720+
self.seed_elements(ds.lon, ds.lat, time=time, **kwargs)
1721+
1722+
1723+
@require_mode(mode=Mode.Ready)
1724+
def seed_from_file(self, filename, trajectory_time_index=-1, time=None, keep_properties=True, **kwargs):
1725+
"""Seed elements from OpenDrift output netCDF file
1726+
1727+
Arguments:
1728+
filename (str) : Name of netCDF file with particle positions.
1729+
trajectory_time_index (int) : Time index from which to continue OpenDrift run.
1730+
time (datenum or list) : Time to initiate particles. If None, uses time from trajectory_time_index.
1731+
keep_properties (bool) : Keep element properties from file. If False, overrides properties with new ones.
1732+
"""
1733+
logger.info('Seeding elements from previous run in %s' %(filename))
1734+
ds = xr.open_dataset(filename)
1735+
self.seed_from_dataset(ds, trajectory_time_index=trajectory_time_index, time=time, keep_properties=keep_properties, **kwargs)
16701736

16711737
def horizontal_diffusion(self):
16721738
"""Move elements with random walk according to given horizontal diffuivity."""

0 commit comments

Comments
 (0)