Skip to content

Commit e9479e6

Browse files
committed
fix vertical mixing when 2D
if do3D==False, vertical_mixing is now also turned to False. Otherwise it is easy to get into 2D with vertical mixing on situation.
1 parent 1b35b80 commit e9479e6

2 files changed

Lines changed: 80 additions & 61 deletions

File tree

particle_tracking_manager/models/opendrift/config_opendrift.py

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -188,17 +188,6 @@ def check_interpolator_filename(self) -> Self:
188188
# raise ValueError("z needs to be None if seed_seafloor is True.")
189189
# return self
190190

191-
# this is not true! For example, OpenOil has by default no vertical advection but yes vertical mixing
192-
# @model_validator(mode="after")
193-
# def check_config_do3D(self) -> Self:
194-
# """Check if do3D is set correctly."""
195-
# if hasattr(self, "vertical_mixing"):
196-
# if not self.do3D and self.vertical_mixing:
197-
# raise ValueError(
198-
# "If do3D is False, vertical_mixing must also be False."
199-
# )
200-
# return self
201-
202191
@model_validator(mode="after")
203192
def setup_interpolator(self) -> Self:
204193
"""Setup interpolator."""
@@ -497,7 +486,7 @@ class OceanDriftModelConfig(OpenDriftConfig):
497486
)
498487

499488
vertical_mixing_at_surface: bool = Field(
500-
default=True,
489+
default=False,
501490
description="If vertical mixing is activated, surface elements (z=0) can only be mixed (downwards) if this setting it True.",
502491
title="Vertical Mixing At Surface",
503492
json_schema_extra={
@@ -507,7 +496,7 @@ class OceanDriftModelConfig(OpenDriftConfig):
507496
)
508497

509498
vertical_advection_at_surface: bool = Field(
510-
default=True,
499+
default=False,
511500
description="If vertical advection is activated, surface elements (z=0) can only be advected (downwards) if this setting it True.",
512501
title="Vertical Advection At Surface",
513502
json_schema_extra={
@@ -524,6 +513,14 @@ def check_wind_drift(self) -> Self:
524513
logger.debug("Setting wind_drift_factor to 0 because wind_drift is False.")
525514
return self
526515

516+
@model_validator(mode="after")
517+
def check_config_do3D(self) -> Self:
518+
"""If do3D is False, set vertical_mixing to False."""
519+
if not self.do3D:
520+
self.vertical_mixing = False
521+
logger.debug("Setting vertical_mixing to False because do3D is False.")
522+
return self
523+
527524

528525
class OpenOilModelConfig(OceanDriftModelConfig):
529526
"""OpenOil model configuration for OpenDrift."""
@@ -688,7 +685,7 @@ class OpenOilModelConfig(OceanDriftModelConfig):
688685
OceanDriftModelConfig.model_fields["wind_drift_factor"], Field(default=0.03)
689686
)
690687
vertical_mixing: bool = FieldInfo.merge_field_infos(
691-
OceanDriftModelConfig.model_fields["vertical_mixing"], Field(default=True)
688+
OceanDriftModelConfig.model_fields["vertical_mixing"], Field(default=False)
692689
)
693690
vertical_mixing_at_surface: bool = FieldInfo.merge_field_infos(
694691
OceanDriftModelConfig.model_fields["vertical_mixing_at_surface"],
@@ -928,15 +925,15 @@ def check_do3D(self) -> Self:
928925

929926
return self
930927

931-
@model_validator(mode="after")
932-
def check_vertical_mixing(self) -> Self:
933-
"""Check if vertical_mixing is set to True for LarvalFish model."""
934-
if not self.vertical_mixing:
935-
raise ValueError(
936-
"vertical_mixing must be True with the LarvalFish drift model."
937-
)
928+
# @model_validator(mode="after")
929+
# def check_vertical_mixing(self) -> Self:
930+
# """Check if vertical_mixing is set to True for LarvalFish model."""
931+
# if not self.vertical_mixing:
932+
# raise ValueError(
933+
# "vertical_mixing must be True with the LarvalFish drift model."
934+
# )
938935

939-
return self
936+
# return self
940937

941938
# @model_validator(mode="after")
942939
# def check_hatched_and_stage_fraction(self) -> Self:
@@ -1077,21 +1074,21 @@ class PhytoplanktonModelConfig(OceanDriftModelConfig):
10771074
OceanDriftModelConfig.model_fields["wind_drift_factor"], Field(default=0.0)
10781075
)
10791076

1080-
@model_validator(mode="after")
1081-
def check_do3D(self) -> Self:
1082-
"""Check if do3D is set to True for Phytoplankton model."""
1083-
if not self.do3D:
1084-
raise ValueError("do3D must be True with the Phytoplankton drift model.")
1085-
return self
1077+
# # @model_validator(mode="after")
1078+
# # def check_do3D(self) -> Self:
1079+
# # """Check if do3D is set to True for Phytoplankton model."""
1080+
# # if not self.do3D:
1081+
# # raise ValueError("do3D must be True with the Phytoplankton drift model.")
1082+
# # return self
10861083

1087-
@model_validator(mode="after")
1088-
def check_vertical_mixing(self) -> Self:
1089-
"""Check if vertical_mixing is set to True for Phytoplankton model."""
1090-
if not self.vertical_mixing:
1091-
raise ValueError(
1092-
"vertical_mixing must be True with the Phytoplankton drift model."
1093-
)
1094-
return self
1084+
# @model_validator(mode="after")
1085+
# def check_vertical_mixing(self) -> Self:
1086+
# """Check if vertical_mixing is set to True for Phytoplankton model."""
1087+
# if not self.vertical_mixing:
1088+
# raise ValueError(
1089+
# "vertical_mixing must be True with the Phytoplankton drift model."
1090+
# )
1091+
# return self
10951092

10961093
@model_validator(mode="after")
10971094
def check_vertical_behavior_parameters(self) -> Self:

tests/test_config_opendrift.py

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -59,19 +59,19 @@ def test_LarvalFish_parameters():
5959
assert hasattr(m, param)
6060

6161

62-
def test_LarvalFish_disallowed_settings():
63-
"""LarvalFish is incompatible with some settings.
62+
# def test_LarvalFish_disallowed_settings():
63+
# """LarvalFish is incompatible with some settings.
6464

65-
LarvalFish has to always be 3D with vertical_mixing on.
66-
"""
65+
# LarvalFish has to always be 3D with vertical_mixing on.
66+
# """
6767

68-
with pytest.raises(ValidationError):
69-
m = LarvalFishModelConfig(
70-
drift_model="LarvalFish", vertical_mixing=False, steps=1
71-
)
68+
# with pytest.raises(ValidationError):
69+
# m = LarvalFishModelConfig(
70+
# drift_model="LarvalFish", vertical_mixing=False, steps=1
71+
# )
7272

73-
with pytest.raises(ValidationError):
74-
m = LarvalFishModelConfig(drift_model="LarvalFish", do3D=False, steps=1)
73+
# with pytest.raises(ValidationError):
74+
# m = LarvalFishModelConfig(drift_model="LarvalFish", do3D=False, steps=1)
7575

7676

7777
def test_LarvalFish_hatched_stage_fraction():
@@ -165,6 +165,28 @@ def test_OceanDrift_wind_drift():
165165
assert m.wind_drift_factor == 0.02
166166

167167

168+
def test_do3D_vertical_mixing_False():
169+
"""If do3D is False, vertical_mixing should be set to False."""
170+
171+
# OceanDrift
172+
m = OceanDriftModelConfig(
173+
steps=1, do3D=False, start_time="2022-01-01", vertical_mixing=True
174+
)
175+
assert m.vertical_mixing == False
176+
177+
# OpenOil
178+
m = OpenOilModelConfig(
179+
steps=1, do3D=False, start_time="2022-01-01", vertical_mixing=True
180+
)
181+
assert m.vertical_mixing == False
182+
183+
# Phytoplankton
184+
m = PhytoplanktonModelConfig(
185+
steps=1, do3D=False, start_time="2022-01-01", vertical_mixing=True
186+
)
187+
assert m.vertical_mixing == False
188+
189+
168190
def test_OceanDrift_parameters():
169191
"""Make sure OceanDrift-specific parameters are present."""
170192
m = OceanDriftModelConfig(drift_model="OceanDrift", steps=1)
@@ -310,21 +332,21 @@ def test_Phytoplankton_dvm_mode():
310332
assert m.z_night == -5.0
311333

312334

313-
def test_Phytoplankton_disallowed_settings():
314-
"""Phytoplankton requires 3D with vertical_mixing."""
315-
with pytest.raises(ValidationError):
316-
m = PhytoplanktonModelConfig(
317-
drift_model="Phytoplankton",
318-
vertical_mixing=False,
319-
steps=1,
320-
)
321-
322-
with pytest.raises(ValidationError):
323-
m = PhytoplanktonModelConfig(
324-
drift_model="Phytoplankton",
325-
do3D=False,
326-
steps=1,
327-
)
335+
# def test_Phytoplankton_disallowed_settings():
336+
# """Phytoplankton requires 3D with vertical_mixing."""
337+
# with pytest.raises(ValidationError):
338+
# m = PhytoplanktonModelConfig(
339+
# drift_model="Phytoplankton",
340+
# vertical_mixing=False,
341+
# steps=1,
342+
# )
343+
344+
# with pytest.raises(ValidationError):
345+
# m = PhytoplanktonModelConfig(
346+
# drift_model="Phytoplankton",
347+
# do3D=False,
348+
# steps=1,
349+
# )
328350

329351

330352
## Enums ##

0 commit comments

Comments
 (0)