Skip to content

Commit 05d1e16

Browse files
FEAT: Update FieldSet.describe() to print output and update docs (#2738)
* FEAT: Update FieldSet.describe() to print output * Update docstring * Adding fieldset.describe() calls to tutorials * Don't hide output in tutorial_quickstart * Update fieldset printing in interp-notebook --------- Co-authored-by: Erik van Sebille <erikvansebille@gmail.com>
1 parent 5c9e337 commit 05d1e16

7 files changed

Lines changed: 30 additions & 22 deletions

File tree

docs/getting_started/tutorial_quickstart.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,10 @@ ds_fset = parcels.convert.copernicusmarine_to_sgrid(fields=fields)
5252
fieldset = parcels.FieldSet.from_sgrid_conventions(ds_fset)
5353
```
5454

55-
You can inspect the `fieldset` by simply printing it:
55+
You can inspect the `parcels.FieldSet` object with the `describe` method in order to see which `parcels.Field`s are included, and which grid and interpolation method is used for each field. This also gives information on the type of mesh and the time interval of the `parcels.FieldSet`:
5656

5757
```{code-cell}
58-
:tags: [hide-output]
59-
print(fieldset)
58+
fieldset.describe()
6059
```
6160

6261
The subset contains a region of the Agulhas current along the southeastern coast of Africa:

docs/user_guide/examples/tutorial_fesom.ipynb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,7 @@
148148
"source": [
149149
"fieldset = parcels.FieldSet.from_ugrid_conventions(ds, mesh=\"spherical\")\n",
150150
"\n",
151-
"for name, field in fieldset.fields.items():\n",
152-
" # TODO clean this up when #2683 is implemented\n",
153-
" print(\n",
154-
" f\"{name:>4s} -> {type(field).__name__:<11s} interp={field.interp_method.__class__.__name__}\"\n",
155-
" )"
151+
"fieldset.describe()"
156152
]
157153
},
158154
{

docs/user_guide/examples/tutorial_interpolation.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@
129129
" fieldset.P.interp_method = (\n",
130130
" p_interp # setting the interpolation method for fieldset.P\n",
131131
" )\n",
132+
" fieldset.describe()\n",
132133
"\n",
133-
" print(fieldset.P.interp_method.__class__.__name__)\n",
134134
" xv, yv = np.meshgrid(np.linspace(0, 1, 8), np.linspace(0, 1, 8))\n",
135135
" pset[p_interp.__class__.__name__] = parcels.ParticleSet(\n",
136136
" fieldset, pclass=SampleParticle, x=xv.flatten(), y=yv.flatten()\n",

docs/user_guide/examples/tutorial_schism.ipynb

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,12 +215,7 @@
215215
"source": [
216216
"fieldset = parcels.FieldSet.from_ugrid_conventions(uxds, mesh=\"flat\")\n",
217217
"\n",
218-
"for name, field in fieldset.fields.items():\n",
219-
" # TODO clean this up when #2683 is implemented\n",
220-
" print(\n",
221-
" f\"{name:>4s} -> {type(field).__name__:<11s} interp={field.interp_method.__class__.__name__}\"\n",
222-
" )\n",
223-
"print(\"time interval:\", fieldset.time_interval)"
218+
"fieldset.describe()"
224219
]
225220
},
226221
{

src/parcels/_core/fieldset.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from __future__ import annotations
22

33
import functools
4+
import sys
45
from collections.abc import Iterable
5-
from typing import TYPE_CHECKING
6+
from typing import IO, TYPE_CHECKING
67

78
import cf_xarray # noqa: F401
89
import numpy as np
@@ -285,9 +286,21 @@ def from_sgrid_conventions(
285286
model = StructuredModelData.from_sgrid_conventions(ds, mesh, vector_fields)
286287
return cls([model])
287288

288-
def describe(self):
289-
"""Return a table description of a FieldSet, which fields it has and their interpolation methods."""
290-
return fieldset_describe(self)
289+
def describe(self, buf: IO | None = None) -> None:
290+
"""
291+
Summary of a FieldSet including available Fields, associated
292+
interpolators, and context values.
293+
294+
Parameters
295+
----------
296+
buf : file-like, default: sys.stdout
297+
writable buffer
298+
"""
299+
if buf is None:
300+
buf = sys.stdout
301+
assert buf is not None
302+
303+
buf.write(fieldset_describe(self))
291304

292305

293306
def assert_compatible_fieldsets(left: FieldSet, right: FieldSet) -> None:

src/parcels/_reprs.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,8 @@ def fieldset_describe(fieldset: FieldSet) -> str:
252252
253253
254254
mesh: {fieldset.models[0].grid._mesh}
255-
time interval: {_print_time_interval(fieldset.time_interval)}"""
255+
time interval: {_print_time_interval(fieldset.time_interval)}
256+
"""
256257
)
257258

258259

tests/test_fieldset.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import timedelta
2+
from io import StringIO
23

34
import cf_xarray # noqa: F401
45
import cftime
@@ -395,6 +396,7 @@ def test_fieldset_add_context_values():
395396
)
396397
def test_fieldset_describe(fieldset_two_models: FieldSet):
397398
fieldset = fieldset_two_models
399+
io = StringIO()
398400
expected = """\
399401
| Name | Type | Grid number | Interp method / value |
400402
|:---------------|:------------|:--------------|:------------------------|
@@ -409,6 +411,8 @@ def test_fieldset_describe(fieldset_two_models: FieldSet):
409411
| constant_field | Field | 2 | XConstantField(...) |
410412
411413
mesh: flat
412-
time interval: (np.datetime64('2000-01-01T00:00:00.000000000'), np.datetime64('2001-01-01T00:00:00.000000000'))"""
413-
actual = fieldset.describe()
414+
time interval: (np.datetime64('2000-01-01T00:00:00.000000000'), np.datetime64('2001-01-01T00:00:00.000000000'))
415+
"""
416+
fieldset.describe(io)
417+
actual = io.getvalue()
414418
assert actual == expected

0 commit comments

Comments
 (0)