diff --git a/src/virtualship/instruments/drifter.py b/src/virtualship/instruments/drifter.py index e962278d..8c531455 100644 --- a/src/virtualship/instruments/drifter.py +++ b/src/virtualship/instruments/drifter.py @@ -8,7 +8,7 @@ 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..251bc35f 100644 --- a/src/virtualship/utils.py +++ b/src/virtualship/utils.py @@ -560,3 +560,9 @@ def _find_files_in_timerange( ) return [fname for _, fname in files_with_dates] + + +def _random_noise(scale: float = 0.01, limit: float = 0.03) -> float: + """Generate a small random noise value for drifter seeding locations.""" + value = np.random.normal(loc=0.0, scale=scale) + return np.clip(value, -limit, limit) # ensure noise is within limits diff --git a/tests/instruments/test_drifter.py b/tests/instruments/test_drifter.py index 9253c1a8..03d04ea8 100644 --- a/tests/instruments/test_drifter.py +++ b/tests/instruments/test_drifter.py @@ -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,