Skip to content

Commit 9c6cfa2

Browse files
Merge branch 'v4-dev' into interpolation_tutorial_v4
2 parents de62134 + 57bb71c commit 9c6cfa2

File tree

3 files changed

+32
-7
lines changed

3 files changed

+32
-7
lines changed

src/parcels/_core/particlefile.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,10 @@ def write(self, pset: ParticleSet, time, indices=None):
158158
pclass = pset._ptype
159159
time_interval = pset.fieldset.time_interval
160160
particle_data = pset._data
161-
time = timedelta_to_float(time - time_interval.left)
161+
if time_interval is None:
162+
time = timedelta_to_float(time)
163+
else:
164+
time = timedelta_to_float(time - time_interval.left)
162165
particle_data = _convert_particle_data_time_to_float_seconds(particle_data, time_interval)
163166

164167
self._write_particle_data(
@@ -309,7 +312,12 @@ def _convert_particle_data_time_to_float_seconds(particle_data, time_interval):
309312
#! Important that this is a shallow copy, so that updates to this propogate back to the original data
310313
particle_data = particle_data.copy()
311314

312-
particle_data["time"] = ((particle_data["time"] - time_interval.left) / np.timedelta64(1, "s")).astype(np.float64)
315+
if time_interval is None:
316+
particle_data["time"] = (particle_data["time"] / np.timedelta64(1, "s")).astype(np.float64)
317+
else:
318+
particle_data["time"] = ((particle_data["time"] - time_interval.left) / np.timedelta64(1, "s")).astype(
319+
np.float64
320+
)
313321
particle_data["dt"] = (particle_data["dt"] / np.timedelta64(1, "s")).astype(np.float64)
314322
return particle_data
315323

@@ -326,10 +334,11 @@ def _maybe_convert_time_dtype(dtype: np.dtype | _SAME_AS_FIELDSET_TIME_INTERVAL)
326334
def _get_calendar_and_units(time_interval: TimeInterval) -> dict[str, str]:
327335
calendar = None
328336
units = "seconds"
329-
if isinstance(time_interval.left, (np.datetime64, datetime)):
330-
calendar = "standard"
331-
elif isinstance(time_interval.left, cftime.datetime):
332-
calendar = time_interval.left.calendar
337+
if time_interval:
338+
if isinstance(time_interval.left, (np.datetime64, datetime)):
339+
calendar = "standard"
340+
elif isinstance(time_interval.left, cftime.datetime):
341+
calendar = time_interval.left.calendar
333342

334343
if calendar is not None:
335344
units += f" since {time_interval.left}"

src/parcels/_core/particleset.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ def execute(
548548

549549
self._kernel.execute(self, endtime=next_time, dt=dt)
550550

551-
if next_output:
551+
if next_output is not None:
552552
if np.abs(next_time - next_output) < np.timedelta64(1000, "ns"):
553553
if output_file:
554554
output_file.write(self, next_output)

tests/test_particlefile.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
)
2222
from parcels._core.particle import Particle, create_particle_data, get_default_particle
2323
from parcels._core.utils.time import TimeInterval
24+
from parcels._datasets.structured.generated import peninsula_dataset
2425
from parcels._datasets.structured.generic import datasets
2526
from parcels.interpolators import XLinear
2627
from parcels.kernels import AdvectionRK4
@@ -69,6 +70,21 @@ def test_pfile_array_write_zarr_memorystore(fieldset):
6970
assert ds.sizes["trajectory"] == npart
7071

7172

73+
def test_write_fieldset_without_time(tmp_zarrfile):
74+
ds = peninsula_dataset() # DataSet without time
75+
assert "time" not in ds.dims
76+
grid = XGrid.from_dataset(ds)
77+
fieldset = FieldSet([Field("U", ds["U"], grid, XLinear)])
78+
79+
pset = ParticleSet(fieldset, pclass=Particle, lon=0, lat=0)
80+
81+
ofile = ParticleFile(tmp_zarrfile, outputdt=np.timedelta64(1, "s"))
82+
pset.execute(DoNothing, runtime=np.timedelta64(1, "s"), dt=np.timedelta64(1, "s"), output_file=ofile)
83+
84+
ds = xr.open_zarr(tmp_zarrfile)
85+
assert ds.time.values[0, 1] == np.timedelta64(1, "s")
86+
87+
7288
def test_pfile_array_remove_particles(fieldset, tmp_zarrfile):
7389
npart = 10
7490
pset = ParticleSet(

0 commit comments

Comments
 (0)