From d762721a762f1c2aeb74a64ed84f07de2d0efaa9 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 28 Nov 2025 08:47:03 +0100 Subject: [PATCH 1/5] add small random noise to drifter release locations --- src/virtualship/instruments/drifter.py | 15 +++++++++++---- src/virtualship/utils.py | 7 ++++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index e962278d..59352e3b 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -3,12 +3,12 @@ from typing import ClassVar import numpy as np -from parcels import AdvectionRK4, JITParticle, ParticleSet, Variable +from parcels import AdvectionRK4, JITParticle, ParticleSet, Variable from virtualship.instruments.base import Instrument from virtualship.instruments.types import InstrumentType from virtualship.models.spacetime import Spacetime -from virtualship.utils import register_instrument +from virtualship.utils import _random_noise, register_instrument # ===================================================== # SECTION: Dataclass @@ -102,11 +102,18 @@ def simulate(self, measurements, out_path) -> None: fieldset = self.load_input_data() # define parcel particles + lat_release = [ + drifter.spacetime.location.lat + _random_noise() for drifter in measurements + ] # with small random noise to get different trajectories for multiple drifters released at same waypoint + lon_release = [ + drifter.spacetime.location.lon + _random_noise() for drifter in measurements + ] + drifter_particleset = ParticleSet( fieldset=fieldset, pclass=_DrifterParticle, - lat=[drifter.spacetime.location.lat for drifter in measurements], - lon=[drifter.spacetime.location.lon for drifter in measurements], + lat=lat_release, + lon=lon_release, depth=[drifter.depth for drifter in measurements], time=[drifter.spacetime.time for drifter in measurements], has_lifetime=[ diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 7e37617b..107d6eef 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -13,8 +13,8 @@ import copernicusmarine import numpy as np import xarray as xr -from parcels import FieldSet +from parcels import FieldSet from virtualship.errors import CopernicusCatalogueError if TYPE_CHECKING: @@ -560,3 +560,8 @@ def _find_files_in_timerange( ) return [fname for _, fname in files_with_dates] + + +def _random_noise(scale: float = 0.01) -> float: + """Generate a small random noise value for drifter seeding locations.""" + return np.random.normal(loc=0.0, scale=scale) From 5775836964796a771ec9ae994d445580819aa645 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 09:10:21 +0000 Subject: [PATCH 2/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/virtualship/instruments/drifter.py | 2 +- src/virtualship/utils.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index 59352e3b..8c531455 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -3,8 +3,8 @@ from typing import ClassVar import numpy as np - from parcels import AdvectionRK4, JITParticle, ParticleSet, Variable + from virtualship.instruments.base import Instrument from virtualship.instruments.types import InstrumentType from virtualship.models.spacetime import Spacetime diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 107d6eef..334ba8fd 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -13,8 +13,8 @@ import copernicusmarine import numpy as np import xarray as xr - from parcels import FieldSet + from virtualship.errors import CopernicusCatalogueError if TYPE_CHECKING: From ea3e69ea345d8fd7790e819fca6a2741d0f70355 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 28 Nov 2025 10:18:16 +0100 Subject: [PATCH 3/5] add limit to offset which can be added --- src/virtualship/utils.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/virtualship/utils.py b/src/virtualship/utils.py index 107d6eef..14579e35 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -562,6 +562,7 @@ def _find_files_in_timerange( return [fname for _, fname in files_with_dates] -def _random_noise(scale: float = 0.01) -> float: +def _random_noise(scale: float = 0.01, limit: float = 0.03) -> float: """Generate a small random noise value for drifter seeding locations.""" - return np.random.normal(loc=0.0, scale=scale) + value = np.random.normal(loc=0.0, scale=scale) + return np.clip(value, -limit, limit) # ensure noise is within limits From ecad4b18cd8af8334b3a1eb6c8ea46dd1563fbd2 Mon Sep 17 00:00:00 2001 From: j-atkins <106238905+j-atkins@users.noreply.github.com> Date: Fri, 28 Nov 2025 10:18:32 +0100 Subject: [PATCH 4/5] update test to account for x,y offsets --- tests/instruments/test_drifter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/instruments/test_drifter.py b/tests/instruments/test_drifter.py index 9253c1a8..43d5519a 100644 --- a/tests/instruments/test_drifter.py +++ b/tests/instruments/test_drifter.py @@ -4,8 +4,8 @@ import numpy as np import xarray as xr -from parcels import FieldSet +from parcels import FieldSet from virtualship.instruments.drifter import Drifter, DrifterInstrument from virtualship.models import Location, Spacetime @@ -36,7 +36,7 @@ def test_simulate_drifters(tmpdir) -> None: drifters = [ Drifter( spacetime=Spacetime( - location=Location(latitude=0, longitude=0), + location=Location(latitude=0.05, longitude=0.05), time=base_time + datetime.timedelta(days=0), ), depth=0.0, From 7d8ff9eb79357a1aa08d74cfcd824dc9193d0aa1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 09:20:23 +0000 Subject: [PATCH 5/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/instruments/test_drifter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/instruments/test_drifter.py b/tests/instruments/test_drifter.py index 43d5519a..03d04ea8 100644 --- a/tests/instruments/test_drifter.py +++ b/tests/instruments/test_drifter.py @@ -4,8 +4,8 @@ import numpy as np import xarray as xr - from parcels import FieldSet + from virtualship.instruments.drifter import Drifter, DrifterInstrument from virtualship.models import Location, Spacetime