tracmass.time_dependent_streaming#
- tracmass.time_dependent_streaming(state, grid, fluxes, fluxes_fn=None, *, iter_sub=1, max_iter=100_000, n_windows=None, max_sub_iter_per_window=10_000, timax_seconds=_UNSET, traj_max_time=_UNSET, recorder=_UNSET, monitor=_UNSET, no_wflux=_UNSET, pace_factor=5, n_particle_batches=_UNSET, rampup_windows=_UNSET, rampup_substeps=_UNSET, seed_freq=_UNSET)[source]#
Multi-window integration using per-particle flux stencil extraction.
At each sub-cycle, only the flux values needed for each particle’s current cell are loaded via vectorised xarray point indexing — no rectangular patch is pre-allocated. This makes the approach viable for widely scattered particles and very long runs where a bounding-box patch would cover most of the global grid.
The JAX
while_loopused bytime_dependent()andtime_dependent_patched()is replaced by a Pythonfor-loop, with one Dask compute and one JAX JIT call per sub-cycle. The total number of Python iterations isn_windows × (subcycles per window), typically on the order ofn_windows × 10–20for monthly GLORYS windows.The GCM window duration is taken from
grid.timestep; it does not need to be supplied separately.- Parameters:
state (
ParticleState) – Initial particle state.grid (
gcm.GridFields) – Static grid geometry.grid.timestepsets the window duration.fluxes (
gcm.LazyFluxFields) – Lazy flux data for the first two time slots.fluxes_fn (
callableorNone) – Called asfluxes_fn(dtm)to load the next window. IfNone, inferred fromfluxes.fluxes_fn(set automatically bynew_flux()).iter_sub (
int) – Sub-cycles per GCM step; sets minimum sub-cycle durationgrid.timestep / iter_sub.max_iter (
int) – Maximum number of sub-cycles over the entire run.n_windows (
intorNone, optional) – Number of GCM time windows to integrate over. DefaultNone— derived from the flux buffer asfluxes.n_windows, i.e. enough windows to reach the dtm_end given totracmass.gcm.new_flux();1if no dtm_end was given.max_sub_iter_per_window (
int) – Safety cap on sub-cycles within each window. Default 10 000.timax_seconds (
float, optional) – Maximum trajectory lifetime in seconds, counted from each particle’s release (tt - t0). Pass this or traj_max_time, not both.traj_max_time (
strorNone, optional) – The same lifetime as apd.Timedeltastring ("30D","12h") or in calendar units ("1M","6M","1Q","1Y", measured from the run’s start,fluxes.dtm). Particles past it stop with reasontime. When neither is passed, from thetraj_max_timesetting (default: no limit). Seetracmass.runsetup.traj_max_seconds().recorder (
ParticleRecorderorstrorNone, optional) – Where to stream active-particle snapshots (each window boundary) and deactivation events, all to one Parquet file (event_typecolumn). Pass aParticleRecorderto manage the file yourself, or a path string to have one built and closed for you.Nonedisables recording. When omitted, a recorder is built from settings (output_name/auto_record/base_output_dir); if neitheroutput_namenorauto_recordis set, nothing is written. Seetracmass.runsetup.monitor (
RunMonitororstrorNone, optional) – Controls progress output. Pass aRunMonitorinstance, or a backend name ("print","log","rich") to have one built for you.Nonesuppresses all output. When omitted, the backend is taken from therunmonitor_backendsetting (default"print"). A monitor / recorder built here is entered and exited automatically, so nowithblock is needed.no_wflux (
bool, optional) – WhenTrue, vertical (w) fluxes are ignored and particles are confined to their initial depth layer. When not passed, resolved from themove_verticallysetting asno_wflux = not move_vertically(defaultmove_vertically=True, i.e.no_wflux=False). Seetracmass.config.move_vertically().n_particle_batches (
int, optional) – Accepted for API compatibility with the full-grid integrators (steady_state()/time_dependent()) — resolved from then_particle_batchessetting when omitted — but has no effect here. The streaming variant already processes all particles in a single Python loop without a JAXwhile_loop, so there is no per-call GPU scratch allocation to reduce. Default1.rampup_windows (
int, optional) – Not supported here: a ramp-up (from the arguments or therampup_windowssetting) raisesNotImplementedError; usetime_dependent()ortime_dependent_patched().rampup_substeps (
int, optional) – Not supported here: a ramp-up (from the arguments or therampup_windowssetting) raisesNotImplementedError; usetime_dependent()ortime_dependent_patched().seed_freq (
strorNone, optional) – Release a copy of state again every seed_freq (pandas frequency, e.g."30D"or"MS"), as intime_dependent(). When omitted, fromseed_freqin the[env.seed]settings table.pace_factor (int)
- Returns:
ParticleState– Final particle state in global grid coordinates.- Return type: