From 7dab9d42fee50663d761cb9640371fc2c7f47592 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 31 Jul 2026 16:07:44 +0200 Subject: [PATCH 1/2] new method for setting initial conditions for sampling variables --- src/virtualship/instruments/base.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/virtualship/instruments/base.py b/src/virtualship/instruments/base.py index ce0f8324..e4e737c5 100644 --- a/src/virtualship/instruments/base.py +++ b/src/virtualship/instruments/base.py @@ -155,6 +155,26 @@ def execute(self, measurements: list, out_path: str | Path) -> None: self.simulate(measurements, out_path) print("\n") + def _sample_initial( + self, + pset: parcels.ParticleSet, + fieldset: parcels.FieldSet, + sensors_config: object, + ) -> None: + """Perform initial Field sampling with ParticleSet.""" + for sensor in sensors_config: + if not (sensor.enabled and sensor.sensor_type in self.sensor_kernels): + raise ValueError( + f"Attempted to initialise sensor '{sensor.sensor_type}' but it is not enabled or not in sensor_kernels." + ) + + fs_key = sensor.meta.fs_key + field = getattr(fieldset, fs_key) + particle_vars = [pv.name for pv in sensor.meta.particle_vars] + + for var in particle_vars: + setattr(pset, var, field[pset.t, pset.z, pset.y, pset.x]) + def _get_copernicus_ds( self, time_buffer: float | None, From 1529b4afdd7f95ec23295022ad164cdf5c9f971b Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 31 Jul 2026 16:08:04 +0200 Subject: [PATCH 2/2] add initial sampling step to all (non-underway) instruments --- src/virtualship/instruments/argo_float.py | 5 +++++ src/virtualship/instruments/ctd.py | 3 +++ src/virtualship/instruments/drifter.py | 3 +++ src/virtualship/instruments/xbt.py | 3 +++ 4 files changed, 14 insertions(+) diff --git a/src/virtualship/instruments/argo_float.py b/src/virtualship/instruments/argo_float.py index 96b8e4f0..029a0aec 100644 --- a/src/virtualship/instruments/argo_float.py +++ b/src/virtualship/instruments/argo_float.py @@ -324,6 +324,11 @@ def simulate(self, measurements, out_path) -> None: drift_days=[argo.drift_days for argo in measurements], ) + # add initial conditions to sampling variables + self._sample_initial( + argo_float_particleset, fieldset, argo_float_config.sensors + ) + # define output file for the simulation out_file = ParticleFile( path=out_path, diff --git a/src/virtualship/instruments/ctd.py b/src/virtualship/instruments/ctd.py index 5b8cba61..1291890d 100644 --- a/src/virtualship/instruments/ctd.py +++ b/src/virtualship/instruments/ctd.py @@ -209,6 +209,9 @@ def simulate(self, measurements, out_path) -> None: winch_speed=[WINCH_SPEED for _ in measurements], ) + # add initial conditions to sampling variables + self._sample_initial(ctd_particleset, fieldset, ctd_config.sensors) + # define output file for the simulation out_file = ParticleFile(path=out_path, outputdt=OUTPUT_DT) diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 3b52dc71..fe8b3738 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -154,6 +154,9 @@ def simulate(self, measurements, out_path) -> None: ], ) + # add initial conditions to sampling variables + self._sample_initial(drifter_particleset, fieldset, drifter_config.sensors) + # define output file for the simulation out_file = ParticleFile( path=out_path, diff --git a/src/virtualship/instruments/xbt.py b/src/virtualship/instruments/xbt.py index 9de23092..c59e6996 100644 --- a/src/virtualship/instruments/xbt.py +++ b/src/virtualship/instruments/xbt.py @@ -164,6 +164,9 @@ def simulate(self, measurements, out_path) -> None: fall_speed=[xbt.fall_speed for xbt in measurements], ) + # add initial conditions to sampling variables + self._sample_initial(xbt_particleset, fieldset, xbt_config.sensors) + out_file = ParticleFile(path=out_path, outputdt=OUTPUT_DT) # build kernel list from active sensors only