@@ -275,6 +275,31 @@ def SampleP(particles, fieldset): # pragma: no cover
275275 assert fieldset .U .grid .lat [yi ] <= lat < fieldset .U .grid .lat [yi + 1 ]
276276
277277
278+ @pytest .mark .parametrize ("outputdt" , [np .timedelta64 (1 , "s" ), np .timedelta64 (2 , "s" ), np .timedelta64 (3 , "s" )])
279+ def test_time_is_age (fieldset , tmp_zarrfile , outputdt ):
280+ # Test that particle age is same as time - initial_time
281+ npart = 10
282+
283+ AgeParticle = get_default_particle (np .float64 ).add_variable (Variable ("age" , initial = 0.0 ))
284+
285+ def IncreaseAge (particles , fieldset ): # pragma: no cover
286+ particles .age += particles .dt / np .timedelta64 (1 , "s" )
287+
288+ time = fieldset .time_interval .left + np .arange (npart ) * np .timedelta64 (1 , "s" )
289+ pset = ParticleSet (fieldset , pclass = AgeParticle , lon = npart * [0 ], lat = npart * [0 ], time = time )
290+ ofile = ParticleFile (tmp_zarrfile , outputdt = outputdt )
291+
292+ pset .execute (IncreaseAge , runtime = np .timedelta64 (npart * 2 , "s" ), dt = np .timedelta64 (1 , "s" ), output_file = ofile )
293+
294+ # TODO v4: Fix metadata and re-enable decode_cf
295+ ds = xr .open_zarr (tmp_zarrfile , decode_cf = False )
296+ age = ds ["age" ][:].values
297+ ds_time = np .zeros_like (age )
298+ for i in range (npart ):
299+ ds_time [i , :] = ds .time .values [i , :] - (time [i ] - fieldset .time_interval .left ) / np .timedelta64 (1 , "s" )
300+ assert np .allclose (age [~ np .isnan (age )], ds_time [~ np .isnan (age )])
301+
302+
278303def test_reset_dt (fieldset , tmp_zarrfile ):
279304 # Assert that p.dt gets reset when a write_time is not a multiple of dt
280305 # for p.dt=0.02 to reach outputdt=0.05 and endtime=0.1, the steps should be [0.2, 0.2, 0.1, 0.2, 0.2, 0.1], resulting in 6 kernel executions
0 commit comments