Skip to content

Commit 1ac1dab

Browse files
Setting particleset.time to NaT on init when not provided
Since we don't know on particleset initialisation whether the execute will be forward or backward in time, we can't yet decide whether the time should be time_interval.left or time_interval.right. Hence, setting to "NaT" until we know the sign of dt
1 parent 26abb3a commit 1ac1dab

3 files changed

Lines changed: 19 additions & 5 deletions

File tree

parcels/particleset.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def __init__(
110110
assert lon.size == lat.size and lon.size == depth.size, "lon, lat, depth don't all have the same lenghts"
111111

112112
if time is None or len(time) == 0:
113-
time = fieldset.U.time.values[0] # TODO set this to NaT if no time is given
113+
time = np.datetime64("NaT", "ns") # do not set a time yet (because sign_dt not known)
114114
elif type(time[0]) in [np.datetime64, np.timedelta64]:
115115
pass # already in the right format
116116
else:
@@ -753,7 +753,16 @@ def execute(
753753
raise TypeError("The runtime must be a np.timedelta64 object")
754754

755755
else:
756-
start_time = self._data["time_nextloop"].min().values
756+
if not np.isnat(self._data["time_nextloop"]).any():
757+
if sign_dt > 0:
758+
start_time = self._data["time_nextloop"].min().values
759+
else:
760+
start_time = self._data["time_nextloop"].max().values
761+
else:
762+
if sign_dt > 0:
763+
start_time = self.fieldset.time_interval.left
764+
else:
765+
start_time = self.fieldset.time_interval.right
757766

758767
if runtime is None:
759768
if endtime is None:
@@ -777,6 +786,11 @@ def execute(
777786
else:
778787
end_time = start_time + runtime * sign_dt
779788

789+
# Set the time of the particles if it hadn't been set on initialisation
790+
if np.isnat(self._data["time"]).any():
791+
self._data["time"][:] = start_time
792+
self._data["time_nextloop"][:] = start_time
793+
780794
outputdt = output_file.outputdt if output_file else None
781795

782796
# Set up pbar

tests/v4/test_particleset.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def test_particleset_dt_type(fieldset, dt, expectation):
138138

139139
def test_pset_starttime_not_multiple_dt(fieldset):
140140
times = [0, 1, 2]
141-
datetimes = [fieldset.U.time[0].values + np.timedelta64(t, "s") for t in times]
141+
datetimes = [fieldset.time_interval.left + np.timedelta64(t, "s") for t in times]
142142
pset = ParticleSet(fieldset, lon=[0] * len(times), lat=[0] * len(times), pclass=Particle, time=datetimes)
143143

144144
def Addlon(particle, fieldset, time): # pragma: no cover

tests/v4/test_particleset_execute.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ def test_pset_stop_simulation(fieldset):
4343
pset = ParticleSet(fieldset, lon=0, lat=0, pclass=Particle)
4444

4545
def Delete(particle, fieldset, time): # pragma: no cover
46-
if time >= fieldset.U.time[0].values + np.timedelta64(4, "s"):
46+
if time >= fieldset.time_interval.left + np.timedelta64(4, "s"):
4747
return StatusCode.StopExecution
4848

4949
pset.execute(Delete, dt=np.timedelta64(1, "s"), runtime=np.timedelta64(21, "s"))
50-
assert pset[0].time == fieldset.U.time[0].values + np.timedelta64(4, "s")
50+
assert pset[0].time == fieldset.time_interval.left + np.timedelta64(4, "s")
5151

5252

5353
@pytest.mark.parametrize("with_delete", [True, False])

0 commit comments

Comments
 (0)