Skip to content

Commit 1c12b73

Browse files
committed
Update unstructured code to work with custom vectorfields
1 parent 2a1e743 commit 1c12b73

2 files changed

Lines changed: 44 additions & 14 deletions

File tree

src/parcels/_core/model.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -239,21 +239,17 @@ def construct_fields(self) -> list[Field | VectorField]:
239239
single_fields: dict[str, Field] = {}
240240
vector_fields: dict[str, VectorField] = {}
241241
scalar_field_names = self.scalar_field_names
242-
if "U" in scalar_field_names and "V" in scalar_field_names:
243-
single_fields["U"] = Field("U", self)
244-
single_fields["V"] = Field("V", self)
245-
vector_fields["UV"] = VectorField("UV", single_fields["U"], single_fields["V"], interp_method=Ux_Velocity())
246-
247-
if "W" in scalar_field_names:
248-
single_fields["W"] = Field("W", self)
249-
vector_fields["UVW"] = VectorField(
250-
"UVW", single_fields["U"], single_fields["V"], single_fields["W"], interp_method=Ux_Velocity()
251-
)
252242

253-
fields: dict[str, Field | VectorField] = {**single_fields, **vector_fields}
254-
for varname in set(scalar_field_names) - set(single_fields.keys()):
255-
fields[varname] = Field(str(varname), self)
243+
for varname in set(scalar_field_names):
244+
single_fields[varname] = Field(str(varname), self)
245+
246+
for vfield_name, components in self.vector_field_components.items():
247+
interp_method = Ux_Velocity()
248+
249+
component_fields = [single_fields[name] for name in components]
250+
vector_fields[vfield_name] = VectorField(vfield_name, *component_fields, interp_method=interp_method)
256251

252+
fields: dict[str, Field | VectorField] = {**single_fields, **vector_fields}
257253
return list(fields.values())
258254

259255
def assert_valid_field_data(self, field_data: ux.UxDataArray) -> None:
@@ -276,7 +272,11 @@ def from_ugrid_conventions(
276272

277273
grid = UxGrid(ds.uxgrid, z=ds.coords["zf"], mesh=mesh)
278274
ds = _discover_ux_U_and_V(ds)
279-
model = cls(ds, grid)
275+
276+
vector_fields = resolve_vector_fields(ds, vector_fields)
277+
assert_vector_field_components_in_dataset(ds, vector_fields)
278+
279+
model = cls(ds, grid, vector_fields)
280280
model._fields = model.construct_fields()
281281
for f in model._fields:
282282
if isinstance(f, Field):

tests/test_fieldset.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,36 @@ def test_fieldset_structured_vectorfield_none():
128128
assert "UV" not in fset.fields
129129

130130

131+
def test_fieldset_unstructured_vectorfield_default():
132+
ds = datasets_unstructured["stommel_gyre_delaunay"]
133+
fset = FieldSet.from_ugrid_conventions(ds, mesh="spherical")
134+
135+
assert "U" in fset.fields
136+
assert "V" in fset.fields
137+
assert "UV" in fset.fields
138+
139+
140+
def test_fieldset_unstructured_vectorfield_custom():
141+
ds = datasets_unstructured["stommel_gyre_delaunay"]
142+
ds = ds.rename({"U": "U_wind", "V": "V_wind"})
143+
144+
fset = FieldSet.from_ugrid_conventions(ds, mesh="spherical", vector_fields={"UV_wind": ("U_wind", "V_wind")})
145+
146+
assert "U_wind" in fset.fields
147+
assert "V_wind" in fset.fields
148+
assert "UV_wind" in fset.fields
149+
150+
151+
def test_fieldset_unstructured_vectorfield_none():
152+
ds = datasets_unstructured["stommel_gyre_delaunay"]
153+
154+
fset = FieldSet.from_ugrid_conventions(ds, mesh="spherical", vector_fields=None)
155+
156+
assert "U" in fset.fields
157+
assert "V" in fset.fields
158+
assert "UV" not in fset.fields
159+
160+
131161
@pytest.mark.parametrize(
132162
"data_vars,expected",
133163
[

0 commit comments

Comments
 (0)