|
22 | 22 | from parcels._typing import Mesh |
23 | 23 | from parcels.convert import _discover_U_and_V, _ds_rename_using_standard_names, _maybe_rename_coords |
24 | 24 | from parcels.interpolators import ( |
| 25 | + CGrid_Velocity, |
25 | 26 | Ux_Velocity, |
26 | 27 | UxPiecewiseConstantFace, |
27 | 28 | UxPiecewiseLinearNode, |
@@ -365,14 +366,15 @@ def from_sgrid_conventions( |
365 | 366 |
|
366 | 367 | fields = {} |
367 | 368 | if "U" in ds.data_vars and "V" in ds.data_vars: |
| 369 | + vector_interp_method = XLinear_Velocity if _is_agrid(ds) else CGrid_Velocity |
368 | 370 | fields["U"] = Field("U", ds["U"], grid, XLinear) |
369 | 371 | fields["V"] = Field("V", ds["V"], grid, XLinear) |
370 | | - fields["UV"] = VectorField("UV", fields["U"], fields["V"], vector_interp_method=XLinear_Velocity) |
| 372 | + fields["UV"] = VectorField("UV", fields["U"], fields["V"], vector_interp_method=vector_interp_method) |
371 | 373 |
|
372 | 374 | if "W" in ds.data_vars: |
373 | 375 | fields["W"] = Field("W", ds["W"], grid, XLinear) |
374 | 376 | fields["UVW"] = VectorField( |
375 | | - "UVW", fields["U"], fields["V"], fields["W"], vector_interp_method=XLinear_Velocity |
| 377 | + "UVW", fields["U"], fields["V"], fields["W"], vector_interp_method=vector_interp_method |
376 | 378 | ) |
377 | 379 |
|
378 | 380 | for varname in set(ds.data_vars) - set(fields.keys()) - skip_vars: |
@@ -548,6 +550,12 @@ def _get_mesh_type_from_sgrid_dataset(ds_sgrid: xr.Dataset) -> Mesh: |
548 | 550 | return "spherical" if _is_coordinate_in_degrees(ds_sgrid[fpoint_x]) else "flat" |
549 | 551 |
|
550 | 552 |
|
| 553 | +def _is_agrid(ds: xr.Dataset) -> bool: |
| 554 | + # check if U and V are defined on the same dimensions |
| 555 | + # if yes, interpret as A grid |
| 556 | + return set(ds["U"].dims) == set(ds["V"].dims) |
| 557 | + |
| 558 | + |
551 | 559 | def _is_coordinate_in_degrees(da: xr.DataArray) -> bool: |
552 | 560 | match da.attrs.get("units"): |
553 | 561 | case None: |
|
0 commit comments