@@ -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