Skip to content

Commit f458a02

Browse files
Updating pragmatic loadtimechunk
1 parent c361ae4 commit f458a02

3 files changed

Lines changed: 8 additions & 31 deletions

File tree

parcels/_index_search.py

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -38,35 +38,8 @@ def _search_time_index(field: Field, time: datetime):
3838
Note that we normalize to either the first or the last index
3939
if the sampled value is outside the time value range.
4040
"""
41-
if field.time_interval is None:
42-
return 0, 0
43-
44-
if time not in field.time_interval:
45-
_raise_time_extrapolation_error(time, field=None)
46-
47-
time_index = field.data.time.data <= time
48-
49-
if time_index.all():
50-
# If given time > last known field time, use
51-
# the last field frame without interpolation
52-
ti = len(field.data.time.data) - 1
53-
elif np.logical_not(time_index).all():
54-
# If given time < any time in the field, use
55-
# the first field frame without interpolation
56-
ti = 0
57-
else:
58-
ti = int(time_index.argmin() - 1) if time_index.any() else 0
59-
60-
if len(field.data.time.data) == 1:
61-
tau = 0
62-
elif ti == len(field.data.time.data) - 1:
63-
tau = 1
64-
else:
65-
tau = (
66-
(time - field.data.time.data[ti]) / (field.data.time.data[ti + 1] - field.data.time.data[ti])
67-
if field.data.time.data[ti] != field.data.time.data[ti + 1]
68-
else 0
69-
)
41+
ti = np.argmin(field._time_float <= time) - 1
42+
tau = (time - field._time_float[ti]) / (field._time_float[ti + 1] - field._time_float[ti])
7043
return tau, ti
7144

7245

parcels/application_kernels/advection.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def AdvectionRK4_3D_CROCO(particle, fieldset, time): # pragma: no cover
9797

9898
def AdvectionEE(particle, fieldset, time): # pragma: no cover
9999
"""Advection of particles using Explicit Euler (aka Euler Forward) integration."""
100-
dt = particle.dt / np.timedelta64(1, "s") # noqa TODO improve API for converting dt to seconds
100+
dt = particle.dt
101101
(u1, v1) = fieldset.UV[particle]
102102
particle_dlon += u1 * dt # noqa
103103
particle_dlat += v1 * dt # noqa

parcels/particleset.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,10 +812,14 @@ def execute(
812812
next_output = outputdt if output_file else None
813813

814814
time = start_time
815+
816+
for fld in [self.fieldset.U, self.fieldset.V]: # TODO generalise to all fields and move to better place
817+
fld._time_float = (fld.data_full.time.data - fld.time_interval.left)/ np.timedelta64(1, "s")
818+
815819
while sign_dt * (time - end_time) < 0:
816820

817821
for fld in [self.fieldset.U, self.fieldset.V]: # TODO generalise to all fields
818-
ti = np.argmin(fld.data_full.time.data <= self._data["time_nextloop"][0]) - 1 # TODO also implement dt < 0
822+
ti = np.argmin(fld._time_float <= self._data["time_nextloop"][0]) - 1 # TODO also implement dt < 0
819823
if not hasattr(fld, "data") or fld.data_full.time.data[ti] != fld.data.time.data[0]:
820824
fld.data = fld.data_full.isel({"time": slice(ti, ti + 2)}).load()
821825

0 commit comments

Comments
 (0)