diff --git a/notebooks/.notebook_shadow_copies/Mesh Tutorial Intro.md b/notebooks/.notebook_shadow_copies/Mesh_Tutorial_Intro.md similarity index 94% rename from notebooks/.notebook_shadow_copies/Mesh Tutorial Intro.md rename to notebooks/.notebook_shadow_copies/Mesh_Tutorial_Intro.md index 60d7739..77ee362 100644 --- a/notebooks/.notebook_shadow_copies/Mesh Tutorial Intro.md +++ b/notebooks/.notebook_shadow_copies/Mesh_Tutorial_Intro.md @@ -14,13 +14,8 @@ jupyter: # LFRic + Iris tutorial : Unstructured meshes - ---- - -Some important initial setup (always do first) .. - -## Important : use + stability of notebooks +## Important Preliminary : use + stability of notebooks A good deal of the content relies on code which is still experimental. We must expect that there are various outstanding problems, and things sometimes crash. @@ -49,6 +44,9 @@ whenever something seems to be taking a long time with no result... * [01 - Load and Examine some LFRic data](./Sec_01_Load_and_Examine.ipynb) * [02 - Mesh concepts and Meshes in Iris](./Sec_02_Meshes.ipynb) * [03 - Plotting and Visualisation](./Sec_03_Plotting.ipynb) + * [04 - Regional Extraction](./Sec_04_RegionExtraction.ipynb) + * [05 - Regridding and UM data comparison](./Sec_05_Regridding.ipynb) + ## Reference : terminology (probably, a separate linked glossary ??) @@ -65,7 +63,7 @@ whenever something seems to be taking a long time with no result... -# **TOPICS LIST?** +# Work To Do : **TOPICS LIST** A draft list of topics for discussion. NOTE : all these basically need re-casting as interactive sections lead by task questions. diff --git a/notebooks/.notebook_shadow_copies/Sec_01_Load_and_Examine.md b/notebooks/.notebook_shadow_copies/Sec_01_Load_and_Examine.md index abf8fc2..0ebadaa 100644 --- a/notebooks/.notebook_shadow_copies/Sec_01_Load_and_Examine.md +++ b/notebooks/.notebook_shadow_copies/Sec_01_Load_and_Examine.md @@ -14,128 +14,109 @@ jupyter: # Section 1 : Loading and Examining some LFRic data -Let's dive right in by taking a look at some output file contents. - -**TODO: data needs to be available somewhere sensible** - -```python tags=[] -from pathlib import Path -datadir = Path('/scratch/sworsley/lfric_data') -datadir.exists() -``` +First run some preliminary Python setup, imports etc ... ```python -%ls -1l {datadir} -``` - -```python -# !ncdump -h /scratch/sworsley/lfric_data/latlon_surface.nc | head -n 100 -``` +# import the top-level Iris package +import iris -```python -!ncdump -h /scratch/sworsley/lfric_data/20210324T0000Z_lf_ugrid.nc | head -n 100 +# import local routines handling access to some test data +from testdata_fetching import lfric_filepth ``` -## Relationship to existing Iris usage - -Much the same ... + +## Iris unstructured loading +Let's dive right in by taking a look at some mesh content. +"Unstructured" data can be loaded from UGRID files (i.e. netCDF files containing a UGRID-style mesh). +This is just like normal Iris loading, except that we must *enable* the interpretion of UGRID content, +roughly like this ... ```python -import iris -iris.FUTURE.datum_support = True # avoids some irritating warnings -``` - -```python -# From these, grab one UM and one LFRic datafile, which roughly correspond +with PARSE_UGRID_ON_LOAD.context(): + cube_list = iris.load(path [, constraints]) + # ..and/or.. + single_cube = iris.load_cube(path [, constraints]) + # ..and/or.. + selected_cubes = iris.load_cubes(path, cube_constraints) -um_filepth = datadir / '20210324T0000Z_um_latlon.nc' -lfric_filepth = datadir / '20210324T0000Z_lf_ugrid.nc' ``` - -## Just for reference : some UM data, and what that looks like in Iris ... +**Exercise : first import the `PARSE_UGRID_ON_LOAD` object from iris.experimental.ugrid.load** ```python -um_cubes = iris.load(um_filepth) +from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD ``` -```python -print("n(UM-cubes) = ", len(um_cubes)) -print("first 10 cubes ...") -um_cubes[:10] -``` + +--- -```python -um_rh = um_cubes.extract_cube('relative_humidity') -um_rh -``` +The variable `lfric_filepath` is already set up, pointing to a suitable test file. - -### NOTE: loading a single cube -You could instead load a single cube directly from the file. -```python -um_rh = iris.load_cube(um_filepth, 'relative_humidity') -``` -This is in fact rather faster, from a file like this with lots of data-variables (i.e. diagnostics). - +**Exercise : Load all data from `lfric_filepath`, with the UGRID loading enabled, and print the first 10 cubes.** +Use the plain 'load' method, as shown above. +NOTE : ***expect this to take a few seconds to complete.*** + +
Sample code solution click to reveal ```python +with PARSE_UGRID_ON_LOAD.context(): + cubes = iris.load(lfric_) +cubes[:10] ``` +
+ -## What's in the LFRic files ? +```python +# ... space for user code ... -Let's start with a quick look at a dump of the file - -- but not actually all of it, as there are ***dozens*** of disagnostic variables ... - +with PARSE_UGRID_ON_LOAD.context(): + cubes = iris.load(lfric_filepth) -```python -!ncdump -h {lfric_filepth} | head -n 120 +cubes[:10] ``` -The mesh metadata alone can be better viewed using the "ugrid checker" program, which knows how to interpret it ... -( NOTE: this is a public utility, also designed here in AVD : see https://github.com/pp-mo/ugrid-checks#readme ) -```python -!ugrid-checker -sqe {lfric_filepth} | head -n 24 -``` +**NOTEs :** + * putting just `cubes` at the end triggers notebook printing output + * this also means you can click on each cube to "expand" it into a detail view -- try it + * the effect of `print(cubes)` is different -- try it ---- + +## Loading a single cube +You can instead load a single cube directly from the file. +This is considerably _faster_ in this case, since the whole file contains ~100 data-variables (i.e. diagnostics). -Let's not bother any more with that : Instead, we can load it into Iris which does a reasonable job of interpreting the mesh-structured data. +**Load just the cube named `relative_humidity_at_screen_level`, from the same file, and show that.** +Hint : it's nicer to use the `load_cube` function +
Sample code solution click to reveal ```python -# Load the LFRic single datafile - -from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD -# Note the use of the special context. This is basically because the Iris mesh functionality is still 'experimental' with PARSE_UGRID_ON_LOAD.context(): - lfric_cubes = iris.load(lfric_filepth) -``` + lfric_rh = iris.load_cube(lfric_filepth, "relative_humidity_at_screen_level") -```python -print("n(LFRic-cubes) = ", len(lfric_cubes)) -print("first 10 cubes ...") -lfric_cubes[:10] +lfric_rh ``` +--- + +**NOTEs :** + * putting just `cubes` at the end triggers notebook printing output + * the effect of `print(cubes)` is different -- try it +
+ ```python -lfric_rh = lfric_cubes.extract_cube('relative_humidity_at_screen_level') +with PARSE_UGRID_ON_LOAD.context(): + lfric_rh = iris.load_cube(lfric_filepth, "relative_humidity_at_screen_level") lfric_rh ``` ---- -Or, just to show a faster selective loading ... - ```python -with PARSE_UGRID_ON_LOAD.context(): - lfric_rh = iris.load_cube(lfric_filepth, 'relative_humidity_at_screen_level') -lfric_rh ``` ## What you initially notice about "mesh cubes" @@ -173,14 +154,14 @@ print("cube.mesh_dim() = ", lfric_rh.mesh_dim())
```python -#------------------------------- -# Utility Function +###------------------------------- +### Utility Function # def is_meshcube(cube): return cube.mesh is not None #------------------------------- -# Testing ... +### Testing ... # from iris.tests.stock import realistic_3d nonmesh_cube = realistic_3d() diff --git a/notebooks/.notebook_shadow_copies/Sec_02_Meshes.md b/notebooks/.notebook_shadow_copies/Sec_02_Meshes.md index f821dcd..8a03582 100644 --- a/notebooks/.notebook_shadow_copies/Sec_02_Meshes.md +++ b/notebooks/.notebook_shadow_copies/Sec_02_Meshes.md @@ -70,33 +70,41 @@ Here is an example of what that looks like :-- This does not happen in current LFRic data : the mesh is a "cubesphere" (see later images), and all cells have four corners. -```python -# Get sample files, as used in Section#01 -from pathlib import Path -datadir = Path('/scratch/sworsley/lfric_data') +--- + +## Fetch some sample unstructured data, as used in Section#01 -import iris -from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD -iris.FUTURE.datum_support = True # avoids some irritating warnings +**Import the data-access routine `lfric_rh_singletime_2d` from `testdata_fetching`, and call it to get a single two-dimensional test cube.** -um_filepth = datadir / '20210324T0000Z_um_latlon.nc' -lfric_filepth = datadir / '20210324T0000Z_lf_ugrid.nc' +```python +## TODO : remove later -- this bit is temporary, for initial testing with C48 data +from testdata_fetching import switch_data +switch_data(use_newer_smaller_c48_data=True) ``` ```python -with PARSE_UGRID_ON_LOAD.context(): - lfric_rh = iris.load_cube(lfric_filepth, 'relative_humidity_at_screen_level') - # Rename this cube, to make it clear wich model this came from. - lfric_rh.rename('LFRic Rh data') +from testdata_fetching import lfric_rh_singletime_2d +lfric_rh = lfric_rh_singletime_2d() ``` +**Print the cube, and its `cube.mesh`** + ```python print(lfric_rh) print('\n----\n') print(lfric_rh.mesh) ``` +```python +# TODO: work this up for user input + +# Simply plot that .. +from pv_conversions import pv_from_lfric_cube +pv = pv_from_lfric_cube(lfric_rh) +pv.plot() #jupyter_backend='static') +``` + ```python ``` @@ -120,7 +128,9 @@ rh_t0 = lfric_rh[0] ```python -rh_t0 = lfric_rh[0] +from testdata_fetching import lfric_rh_singletime_2d + +rh_t0 = lfric_rh_singletime_2d() ``` @@ -180,7 +190,29 @@ pv ( Note: like `Cube`s + `CubeList`s, these `PolyData` objects are provided with a specific visible within the Jupyter notebooks. This is displayed when you just enter the variable in a cell. You can also use "print(x)" to display the standard string representation of the object, but usually the notebook-style output is a bit more useful. ) - + +--- +### Quick 3d plotting + +For a really quick, basic plot, you can display a PolyData as a VTK view with PyVista, by simply calling its `.plot` method. + +**Call the `plot` routine of the PolyData object. An output should appear.** + +```python +pv.plot() +``` + +**NOTES**: + * this plot is interactive -- try dragging to rotate, and the mouse scroll-wheel to zoom + * this obviously causes some clutter and uses up some space (e.g. you can't easily scroll past it) + * To ***remove*** a plot output, use "Clear Output" from the "Edit" menu (or from right-click on the cell) + * alternatively, set the keyword `jupyter_backend='static'` in the command, for output as a plain image + +There are a lot more keywords available to [the `PolyData.plot()` method](https://docs.pyvista.org/api/core/_autosummary/pyvista.PolyData.plot.html), but it is not ideal to overcomplicate these calls. : +Finer control is better achieved in a different ways : See more detail on plotting in [the Plotting section](./Sec_03_Plotting.ipynb). + + + ### Create a plotter, and display 3D visualisation Finally, we will plot the 'PolyData' object via PyVista. @@ -229,20 +261,15 @@ plotter.show() -**NOTES**: - * this operation currently generates a warning message, which however can be ignored - * when translated to a simple Python file + run, these plots (or at least the folowing one) can cause SegmentationFault - * ***TODO: this needs investigating, fix for confidence + useability*** - * it is interactive, so it causes some clutter and uses up some space. - To remove plot outputs, use "Clear Output" from the "Edit" menu (or from right-click on the cell) - ```python plotter.show() ``` **Some odd notes:** * By default, `plotter.show()` opens an interactive window : **you can rotate and zoom it with the mouse**. - * you can instead generate static output (try `interactive=False`) + * you can instead generate static output + * in a notebook, you do this with `jupyter_backend='static'` + * or in a Python session, try `interactive=False` * VTK/PyVista doesn't use plot "types". Instead, you add meshes to a plotter + can subsequently control the presentation. * GeoVista can also produce more familiar 2D plots (see on ...) @@ -250,124 +277,3 @@ plotter.show() ***TODO:*** can suggest some of these as follow-on exercises - - -# Comparing UM and LFRic fields - -```python -um_rh = iris.load_cube(um_filepth, 'relative_humidity') -# Rename so we are clear which model this came from -lfric_rh.rename('UM Rh data') -um_rh -``` - -```python -from pv_conversions import pv_from_um_cube -um_pv = pv_from_um_cube(um_rh[0]) -``` - -## Simple side-by-side plotting : UM vs LFRic data - -```python -my_plotter = GeoPlotter(shape=(1, 2)) - -my_plotter.subplot(0, 0) -my_plotter.add_coastlines() -my_plotter.add_mesh(um_pv, show_edges=True, cmap='magma') - -my_plotter.subplot(0, 1) -my_plotter.add_coastlines() -my_plotter.add_mesh(pv, show_edges=True, cmap='magma') - -my_plotter.link_views() -# Use a preset "Nice" viewpoint showing off the data -viewpoint = [ - (-0.709497461391866, -1.2057617579427944, 1.4232488035268644), - (0.0, 0.0, 0.0), - (-0.48482598598375826, 0.7715244238081727, 0.41193910567260306) -] -my_plotter.camera_position = viewpoint - -``` - -```python -my_plotter.show() -``` - -## A handy hint : how to record + re-use a camera view - -```python -viewpoint = my_plotter.camera_position -viewpoint -``` - -```python -# This pre-loaded position focusses on a cubesphere "corner" in the middle East -viewpoint = [ - (0.9550352379408845, 0.9378277371075855, 0.9637172962958191), - (0.0, 0.0, 0.0), - (-0.3202752464164225, -0.5004192729867466, 0.8043657860428399) -] -``` - -```python -# Plot just the LFRIC data with the same view ... -new_plotter = GeoPlotter() -new_plotter.add_coastlines() -new_plotter.add_mesh(pv, show_edges=True) -new_plotter.camera_position = viewpoint -new_plotter.show() -``` - -```python - -``` - -```python -# WIP : projected 2D plotting -``` - -```python -# GeoVista coastline projection not yet supported. Use a representation of coastlines as Cube data instead. - -# import requests -# r = requests.get("https://github.com/SciTools-incubator/presentations/raw/main/ngms_champions_2022-04-12/coastline_grid.nc") -# open("coastline_grid.nc", "wb").write(r.content) - -# coastline_cube = iris.load_cube("coastline_grid.nc") - -# coastline_polydata = pv_from_structcube(coastline_cube) -# # Remove all NaN's (grid squares that aren't on a coast). -# coastline_polydata = coastline_polydata.threshold() -``` - -```python -def plot_projected(my_polydata, plotter=None): - """Plot polydata on a given plotter""" - if plotter is None: - plotter = GeoPlotter() - # Add the coastline cells 'above' the data itself. - plotter.add_mesh( - coastline_polydata, - color="white", - show_edges=True, - edge_color="white", - radius=1.1, # For globe plots - zlevel=10, # For planar plots - ) - plot_polydata = my_polydata.copy() - plotter.add_mesh(plot_polydata) - # if plotter.crs != WGS84: - # # Projected plot. - # plotter.camera_position = "xy" - # backend = "static" - # else: - # backend = "pythreejs" -# backend = "static" - plotter.show() # jupyter_backend=backend) -``` - -```python -# Plot these side-by-side ... - -``` diff --git a/notebooks/.notebook_shadow_copies/Sec_03_Plotting.md b/notebooks/.notebook_shadow_copies/Sec_03_Plotting.md index db829c5..21a100e 100644 --- a/notebooks/.notebook_shadow_copies/Sec_03_Plotting.md +++ b/notebooks/.notebook_shadow_copies/Sec_03_Plotting.md @@ -19,7 +19,7 @@ Schema : * Explain context of 3D and "traditional" matplotlib-based plotting -# 3D visualisation +## 3D visualisation While LFRic data can be presented in 2D plots with a map projection, it is often more profitable way to explore it with a 3D viewer. @@ -28,18 +28,14 @@ There are a few reasons for this : 2. LFRic data is now tending to be too large for matplotlib-style plotting (~6 million cells) -```python - -``` - ```python tags=[] # Essential setup -%matplotlib inline -import pyvista as pv -pv.rcParams["use_ipyvtk"] = True +# %matplotlib inline +# import pyvista as pv +# pv.rcParams["use_ipyvtk"] = True ``` -### What Geovista is for +## What Geovista is for * **VTK** : highly mature 3D visualisation library (C++) * **PyVista** : VTK for normal humans (in Python) @@ -53,7 +49,6 @@ pv.rcParams["use_ipyvtk"] = True ```python # Import things from Geovista import geovista as gv -import geovista.theme ``` ```python @@ -64,42 +59,24 @@ sample = um_orca2() ``` ```python -# Handy routine - -def trial_display(xx, yy, data, title="") -> None: - # create the mesh from the sample data - mesh = gv.Transform.from_2d(xx, yy, data=data) - - # remove cells from the mesh with nan values - mesh = mesh.threshold() - - # plot the mesh - plotter = gv.GeoPlotter() - sargs = dict(title=f"{sample.name} / {sample.units}", shadow=True) - plotter.add_mesh(mesh, show_edges=True, scalar_bar_args=sargs) - plotter.add_base_layer(texture=gv.natural_earth_1()) - plotter.add_coastlines() - plotter.add_axes() - plotter.add_text( - title, - position="upper_left", - font_size=10, - shadow=True, - ) - plotter.show() +sample.lats.shape ``` -#### Geovista basic demo : an interactive plot of ocean data - ```python -trial_display(sample.data, sample.lats, sample.lons, "ORCA test data") -``` - -sdsadas& +# Handy routine +import display_demo_routines +from importlib import reload +reload(display_demo_routines) +from display_demo_routines import popup_2d_data_xx_yy +``` +## Geovista basic demo : an interactive plot of ocean data +```python +popup_2d_data_xx_yy(sample, "ORCA test data") +``` **NOTE** * Geovista is not Iris-dependent @@ -109,3 +86,281 @@ sdsadas& + + +## Create a plotter, and display 3D visualisation + +The above example shows some interesting features, but it is only a 'potted' demonstration. +Let's grab some actual LFRic data and examine the actual plotting mechanism in a bit more detail. + +The simplest way, as seen in [Sec#02 - Quick 3d plotting](./Sec_02_Meshes.ipynb#Quick-3d-plotting), is just to call `PolyData.plot()`, but that is rather limited in what it can do. + +For more control, we need to deal with the GeoVista/PyVista `Plotter` object. +The full process for this requires a number of several discrete steps ... + +**(1) First load in the same 2D 'relative_humidity' datacube we loaded back in [Section#02 "Fetch some sample data"](./Sec_02_Meshes.ipynb#Fetch-some-sample-unstructured-data,-as-used-in-Section#01)** + +```python +# TODO: remove when switched to fulltime lower-res test data +from testdata_fetching import switch_data +switch_data(use_newer_smaller_c48_data=True) +``` + +```python +from testdata_fetching import lfric_rh_singletime_2d +lfric_rh = lfric_rh_singletime_2d() +``` + +--- + +**(2) convert the Iris cube to a PyVista `PolyData`, as in [Section#02 "Convert a cube to PyVista form"](./Sec_02_Meshes.ipynb#Convert-a-cube-to-PyVista-form-for-plotting)** + +```python +from pv_conversions import pv_from_lfric_cube +pv = pv_from_lfric_cube(lfric_rh) +``` + + +--- + +Now, we need a [PyVista "plotter"](https://docs.pyvista.org/api/plotting/_autosummary/pyvista.Plotter.html#pyvista.Plotter) object to display things in 3D. +Since our data is geo-located, we will use the special subtype `GeoPlotter`, from [GeoVista](https://github.com/bjlittle/geovista#philisophy) for this. + +**Import the class `GeoPlotter` from the `geovista` package, and create one** (with no arguments) +
Sample code solution : click to reveal + +```python +from geovista import GeoPlotter +plotter = GeoPlotter() +``` +
+ + +```python +from geovista import GeoPlotter +plotter = GeoPlotter() +``` + + +Note: various control arguments can be added to `GeoPlotter()`. +But none are required by default. + +--- + +**Now call the plotter `add_mesh` function, passing in our PolyData object with the Rh cube data in it.** +( **N.B.** don't worry about the object which this passes back -- just discard it, for now ). +
Sample code solution : click to reveal + +```python +_ = plotter.add_mesh(pv) +``` +
+ + +```python +_ = plotter.add_mesh(pv) +``` + + +--- + +**Finally, simply plot this, by calling the plotter function "show" (with no args).** +
Sample code solution : click to reveal + +```python +plotter.show() +``` +
+ + +```python +plotter.show() +``` + +**Some odd notes:** + * VTK/PyVista doesn't use plot "types". + Instead, you add meshes to a plotter + can subsequently control the presentation. + * By default, `plotter.show()` opens an interactive window : **you can rotate and zoom it with the mouse**. + * you can instead generate static output + * in a notebook, you do this with `jupyter_backend='static'` + * or in a Python session, try `interactive=False` + * GeoVista can also produce more familiar 2D plots (described in a later section ...) + + + +***TODO:*** can suggest some of these as follow-on exercises + + +## Additional features + +The above hasn't yet added anything to the basic `PolyData.plot()` call. + +However, when you create your own GeoPlotter, you can do a lot more to control the view, and add useful aspects. + +**What can each of the following GeoPlotter methods do ?...** +( N.B. there is no rendered GeoVista API yet, but you can see the code docstrings, e.g. [here] ) + * **`add_coastlines`** + * **`add_axes`** + * **`add_base_layer`** (hint: look in the source of the `demo_display_2d_xx_yy_data` routine) + * **`add_camera_orientation_widget`** + +Note : of these, 'coastlines' and 'base_layer' are GeoVista concepts, while 'axes' and 'camera_orientation_widget' are from PyVista. The `GeoPlotter` is simply a specialised (extended) version of a `PyVista.Plotter`. + +Another very useful resource is the GeoVista runnable examples. +See : https://github.com/bjlittle/geovista/tree/main/src/geovista/examples + +```python +# .. space for user code (E.G. try "add_coastlines") ... +``` + +```python +# .. space for user code (E.G. try "add_base_layer") ... +``` + +```python +# .. space for user code (E.G. try "add_axes") ... +``` + +# Comparing UM and LFRic fields + +```python +from testdata_fetching import um_rh_singletime_2d +#um_rh = iris.load_cube(um_filepth, 'relative_humidity') +um_rh = um_rh_singletime_2d() +# Rename so we are clear which model this came from +um_rh.rename('UM Rh data') +um_rh +``` + +--- + +Just as a reference, let's quickly show that on an old-style Iris matplotlib plot. + +**Display this cube (ordinary, "structured" data) by passing it into the routine `iris.quickplot.pcolormesh`.** + +```python +import iris.quickplot as qplt +qplt.pcolormesh(um_rh) +``` + +--- +Now to plot this in 3d. + +For this, we have another utility routine which allows us to convert "ordinary" structured cubes into PyVista `PolyData`. + +**Convert this UM cube to a PolyData, with the routine `pv_conversions.pv_from_um_cube`, and display it in 3D.** + +```python +from pv_conversions import pv_from_um_cube +um_pv = pv_from_um_cube(um_rh) +um_pv.plot() +``` + +**Note :** +This is still traditional "structured" data on its original UM lat-lon grid. + +You can see this clearly by zooming in on a pole, where the cells get very narrow. + + +## Simple side-by-side plotting : UM vs LFRic data + +Let's compare the matched UM and LFRic data fields by eye, in side-by-side 3D view. + +This is mostly a demonstration of what can be achived, somewhat complicated, +so we have provided another utility routine ... + +**import the function `side_by_side_plotter` from `display_demo_routines`, and apply it to the UM and LFRic data cubes as arguments. +Then display the `Plotter` which this returns.** + +```python +from display_demo_routines import side_by_side_plotter +plt = side_by_side_plotter(pv, um_pv) +plt.show() +``` + +```python + +``` + +## A handy hint : how to record + re-use a camera view + +```python +viewpoint = my_plotter.camera_position +viewpoint +``` + +```python +# This pre-loaded position focusses on a cubesphere "corner" in the middle East +viewpoint = [ + (0.9550352379408845, 0.9378277371075855, 0.9637172962958191), + (0.0, 0.0, 0.0), + (-0.3202752464164225, -0.5004192729867466, 0.8043657860428399) +] +viewpoint = [ + (1.1555926379084704, 1.1347715619001786, 1.1660979285179414), + (0.0, 0.0, 0.0), + (-0.3202752464164226, -0.5004192729867467, 0.80436578604284) +] +``` + +```python +# Plot just the LFRIC data with the same view ... +new_plotter = GeoPlotter() +new_plotter.add_coastlines() +new_plotter.add_mesh(pv, show_edges=True) +new_plotter.camera_position = viewpoint +new_plotter.show(jupyter_backend='static') +``` + +```python +new_plotter.camera_position +``` + +```python +# WIP : projected 2D plotting +``` + +```python +# GeoVista coastline projection not yet supported. Use a representation of coastlines as Cube data instead. + +# import requests +# r = requests.get("https://github.com/SciTools-incubator/presentations/raw/main/ngms_champions_2022-04-12/coastline_grid.nc") +# open("coastline_grid.nc", "wb").write(r.content) + +# coastline_cube = iris.load_cube("coastline_grid.nc") + +# coastline_polydata = pv_from_structcube(coastline_cube) +# # Remove all NaN's (grid squares that aren't on a coast). +# coastline_polydata = coastline_polydata.threshold() +``` + +```python +def plot_projected(my_polydata, plotter=None): + """Plot polydata on a given plotter""" + if plotter is None: + plotter = GeoPlotter() + # Add the coastline cells 'above' the data itself. + plotter.add_mesh( + coastline_polydata, + color="white", + show_edges=True, + edge_color="white", + radius=1.1, # For globe plots + zlevel=10, # For planar plots + ) + plot_polydata = my_polydata.copy() + plotter.add_mesh(plot_polydata) + # if plotter.crs != WGS84: + # # Projected plot. + # plotter.camera_position = "xy" + # backend = "static" + # else: + # backend = "pythreejs" +# backend = "static" + plotter.show() # jupyter_backend=backend) +``` + +```python +# Plot these side-by-side ... + +``` diff --git a/notebooks/.notebook_shadow_copies/Sec04_RegionExtraction.md b/notebooks/.notebook_shadow_copies/Sec_04_RegionExtraction.md similarity index 53% rename from notebooks/.notebook_shadow_copies/Sec04_RegionExtraction.md rename to notebooks/.notebook_shadow_copies/Sec_04_RegionExtraction.md index bea5969..4690108 100644 --- a/notebooks/.notebook_shadow_copies/Sec04_RegionExtraction.md +++ b/notebooks/.notebook_shadow_copies/Sec_04_RegionExtraction.md @@ -12,7 +12,7 @@ jupyter: name: python3 --- -# Section 4 : Extracting a region from a mesh +# Section 4 : Extracting a region from mesh-based data This process is considerably more involved than with "structured" data like UM. @@ -23,7 +23,9 @@ However, the unstructured mesh does not visit locations on the globe in any part ( *TODO: picture of this ?* ) So we must use geographical calculations to extract mesh data within a required region. -Since this is a geographical concept, Geovista provides support for it. +Since this is a geographical concept, Geovista provides support for it. +This is also a good match since, with larger data this can become quite compute-intensive : +Processing via VTK should be performant and scalable, and can benefit from GPU accelaration. Here's an example of how to extract the mesh falling within a defined lat-lon region ... **NOTE: as with the plotting example, there are no Iris utility functions for this, so a fair amount of user code is currently required to mediate between the Iris and Geovista/PyVista worlds.** @@ -80,7 +82,7 @@ bbox = BBox(lons=[0, 70, 70, 0], lats=[-25, -25, 45, 45]) --- **Now "apply" the BBox to the global mesh data, by passing it to the `BBox.enclosed` method.** -And show the resulting object. +And show the resulting object printout. ```python # 'Apply' the region to the PolyData object. @@ -88,43 +90,102 @@ pv_regional_rh = bbox.enclosed(pv_global_rh) pv_regional_rh ``` -You can see that the new (regional) polydata has fewer cells than the original (global) one. +You can see that this new (regional) PolyData has fewer cells than the original (global) one. --- +**Now plot this to see what it looks like.** +Note : in this case, it will be very useful to add coastlines for reference. +Use the techniques from [Sec#2 Plotting - Additional features](./Sec_03_Plotting.ipynb#Additional-features). -**Now index the regional PolyData with `pv["vtkOriginalCellIds"]`, to get an array of cell indexes** +```python +from geovista import GeoPlotter +plotter = GeoPlotter() +plotter.add_mesh(pv_regional_rh) +plotter.add_coastlines() +plotter.show() +``` + +```python +# Temporary : show static plot for notebook review +plotter.show(jupyter_backend='static') +``` + +--- +## Get an Iris cube for an extracted region. + +While GeoVista provides the efficient tools for mesh region extraction, it and Iris know nothing about one another. +So, to calculate a regionally-extracted _Iris cube_, GeoVista can do the hard work of determining the subset of cells required, but you must then "reconstruct" an Iris cube from that information. +For now, at least, there are no ready-made tools for this (either in Iris or Geovista). + +The process requires a few steps, which we can summarise as : + 1. record, on the original global PolyData, the original face indices of each of the cells + 1. perform extraction (by BBox or otherwise) to get a regional PolyData + 1. get the face-indices of the selected cells from the regional PolyData + 1. index the Iris cube with the selected indices, on the mesh dimension, to extract the regional parts + 1. construct and attach a suitable Iris mesh to represent the extracted region + +( Note: the last step itself is not strictly necessary. It may be sufficent to have a regional data cube with a notional "mesh dimension", but which does not possess an actual Iris mesh. ) + +--- +Let's show that operation ... + +**Step 1 : First, add an auxiliary array to the global PolyData, recording the original (face) index of each cell.** +Note : use numpy.arange() to construct a counting sequence, and assign to a named index on the PolyData object. + +```python +import numpy as np +face_inds = np.arange(pv_global_rh.n_cells) +pv_global_rh.cell_data['original_face_indices'] = face_inds +``` + +--- + +**Step 2 : Extract with your Bbox to get a regional PolyData, and show the result.** +This code is exactly the same as the previous time we did this. + +```python +pv_regional_rh = bbox.enclosed(pv_global_rh) +pv_regional_rh +``` + +You can see that the new version of the extracted (regional) data now has an ***extra*** attached data array, derived from the one we added to the global data, and which holds the selected face indices. + +--- + +**Step 3 : Fetch the indices array from the regional PolyData, by indexing with the array name.** and show the result. ```python # Get the remaining face indices, to use for indexing the Cube. -region_indices = pv_regional_rh["vtkOriginalCellIds"] +region_indices = pv_regional_rh["original_face_indices"] region_indices ``` -**Note:** This shows the original cell indices of the cells which fall within the region. +This contains the original face-indices of all the cells which fall within the region, _i.e. which faces those were in the global mesh_. -Now we can use these to select only those cell *from the Iris cube*. +We can now apply these indices, to select only those cells *from the Iris cube*. -**Apply these cells as an index to the 'mesh dimension' of the original Iris lfric-rh cube** -and show that +**Step 4 : Apply these cells as an index to the 'mesh dimension' of the original Iris lfric-rh cube** +.. and print that out. ```python lfric_rh_region = lfric_rh[..., region_indices] lfric_rh_region ``` -This cube contains the mesh data within our selected region. +This new cube contains the mesh data within our selected region. However, there is a catch here : Once indexed, our cube ***no longer has a mesh***. You can see this in the printout, which lists "Auxiliary coordinates" but no "Mesh coordinates". + This problem will probably be fixed in future. See [here in the Iris docs](https://scitools-iris.readthedocs.io/en/latest/further_topics/ugrid/operations.html#region-extraction) for a discussion. For now, what we need to do is to re-create a mesh for the regional cube. -We do that in a few steps ... +We do that in a few further steps ... --- -Step 1 : **Get the X and Y-axis coordinates from the region cube.** +**Step 5a : Get the X and Y-axis coordinates from the region cube.** Use `Cube.coords('longitude')` etc. ```python @@ -132,7 +193,7 @@ x_coord = lfric_rh_region.coord('longitude') y_coord = lfric_rh_region.coord('latitude') ``` -Step 2 : **Create a new `iris.experimental.ugrid.Mesh`-class object, passing the X,Y coords as arguments** +**Step 5b : Create a new `iris.experimental.ugrid.Mesh`-class object, passing the X,Y coords as arguments** ```python from iris.experimental.ugrid.mesh import Mesh @@ -148,7 +209,7 @@ print(mesh) ``` --- -Step 3 : **call `Mesh.to_MeshCoords` to create a pair of `MeshCoord`s containing this mesh** +**Step 5c : Call `Mesh.to_MeshCoords` to create a pair of `MeshCoord`s containing this mesh** Note : you must specify the keyword `location="face"` : This matches the data location of the original data -- i.e. the data cells are faces. ```python @@ -157,10 +218,9 @@ mesh_coords ``` --- -Step 4 : (finally!!) -**Use `Cube.remove_coord` and `Cube.add_aux_coord` to replace each AuxCoord with its corresponding `MeshCoord` from the previous step.** Note : for 'add_aux_coord', you also need to specify the relevant cube dimension(s) : See [`Cube.add_aux_coord` in the Iris docs](https://scitools-iris.readthedocs.io/en/latest/generated/api/iris/cube.html?highlight=add_aux_coord#iris.cube.Cube.add_aux_coord) - -And show the cube .. +**Step 5d : (finally!!) +Use `Cube.remove_coord` and `Cube.add_aux_coord` to replace each AuxCoord with its corresponding `MeshCoord` from the previous step.** Note : for 'add_aux_coord', you also need to specify the relevant cube dimension(s) : See [`Cube.add_aux_coord` in the Iris docs](https://scitools-iris.readthedocs.io/en/latest/generated/api/iris/cube.html?highlight=add_aux_coord#iris.cube.Cube.add_aux_coord) +.. and show the cube .. ```python lfric_rh_region.remove_coord('longitude') @@ -180,18 +240,15 @@ lfric_rh_region.add_aux_coord(yco, 0) lfric_rh_region ``` -Lastly, plot this to see what we get. +--- + +**Lastly, plot this to see what we got.** +Use the techniques as above, converting with `pv_from_lfric_cube` and plotting. -The following steps ... - * create a PolyData from the regional cube with `pv_conversions.pv_from_lfric_cube` - * follow the steps shown in the Plotting section ```python pv = pv_from_lfric_cube(lfric_rh_region) -from geovista import GeoPlotter -plotter = GeoPlotter() -plotter.add_mesh(pv) -plotter.show() +pv.plot() ``` ---- @@ -200,26 +257,15 @@ plotter.show() As a minimum you can use `plotter.add_coastlines()`. -Another useful one is `plotter.add_base_layer()` -**What does that do ?** +Another useful one is `plotter.add_base_layer()` +**Question : what does that actually do ?** ```python plotter.add_coastlines() plotter.add_base_layer() plotter.show() - ``` ----- - -**Investigation:** -If you rotate the above images, you will see they don't behave liekt e - -As a minimum you can use `plotter.add_coastlines()`. - -Another useful one is `plotter.add_base_layer()` -**What does that do ?** - ```python ``` diff --git a/notebooks/Mesh Tutorial Intro.ipynb b/notebooks/Mesh_Tutorial_Intro.ipynb similarity index 95% rename from notebooks/Mesh Tutorial Intro.ipynb rename to notebooks/Mesh_Tutorial_Intro.ipynb index a7ce44c..20db553 100644 --- a/notebooks/Mesh Tutorial Intro.ipynb +++ b/notebooks/Mesh_Tutorial_Intro.ipynb @@ -8,24 +8,12 @@ "# LFRic + Iris tutorial : Unstructured meshes" ] }, - { - "cell_type": "markdown", - "id": "6e160160-e0d5-48bf-842c-a0b0aeaad176", - "metadata": { - "tags": [] - }, - "source": [ - "---\n", - "\n", - "Some important initial setup (always do first) .." - ] - }, { "cell_type": "markdown", "id": "1fb1e41a-1b09-485c-b3a9-21e7b9cee16a", "metadata": {}, "source": [ - "## Important : use + stability of notebooks\n", + "## Important Preliminary : use + stability of notebooks\n", "\n", "A good deal of the content relies on code which is still experimental.\n", "We must expect that there are various outstanding problems, and things sometimes crash.\n", @@ -58,7 +46,10 @@ "## Tutorial sections : --> individual notebooks\n", " * [01 - Load and Examine some LFRic data](./Sec_01_Load_and_Examine.ipynb)\n", " * [02 - Mesh concepts and Meshes in Iris](./Sec_02_Meshes.ipynb)\n", - " * [03 - Plotting and Visualisation](./Sec_03_Plotting.ipynb)" + " * [03 - Plotting and Visualisation](./Sec_03_Plotting.ipynb)\n", + " * [04 - Regional Extraction](./Sec_04_RegionExtraction.ipynb)\n", + " * [05 - Regridding and UM data comparison](./Sec_05_Regridding.ipynb)\n", + " " ] }, { @@ -84,7 +75,7 @@ "id": "2108c1f9-472e-421d-9e31-c4b67306da94", "metadata": {}, "source": [ - "# **TOPICS LIST?**\n", + "# Work To Do : **TOPICS LIST**\n", "\n", "A draft list of topics for discussion. \n", "NOTE : all these basically need re-casting as interactive sections lead by task questions. \n", diff --git a/notebooks/Sec04_RegionExtraction.ipynb b/notebooks/Sec04_RegionExtraction.ipynb deleted file mode 100644 index 92e4ff7..0000000 --- a/notebooks/Sec04_RegionExtraction.ipynb +++ /dev/null @@ -1,1016 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "f3ece436-9fe8-4e3f-9dd1-990c82c3efdd", - "metadata": {}, - "source": [ - "# Section 4 : Extracting a region from a mesh\n", - "\n", - "This process is considerably more involved than with \"structured\" data like UM.\n", - "\n", - "For instance, UM data has data and coordinates with X and Y dimensions, corresponding to cell indices in the model arrays, and longitudes and latitudes of cells on the globe. \n", - "Therefore, we can slice out a rectangular range of X and Y indices, e.g. `my_datacube[..., 10:40, 4:77]` and the result is some contiguous region of the globe within a defined range of latitude+longitude.\n", - "\n", - "However, the unstructured mesh does not visit locations on the globe in any particular, simple regular pattern. So crucially, a slice of data from the (now 1-D) arrays is not a contiguous geographical region. And conversely a contiguous region of the data is generally not contained in a contiguous range of data indices. \n", - "( *TODO: picture of this ?* )\n", - "\n", - "So we must use geographical calculations to extract mesh data within a required region. \n", - "Since this is a geographical concept, Geovista provides support for it.\n", - "\n", - "Here's an example of how to extract the mesh falling within a defined lat-lon region ... \n", - "**NOTE: as with the plotting example, there are no Iris utility functions for this, so a fair amount of user code is currently required to mediate between the Iris and Geovista/PyVista worlds.**" - ] - }, - { - "cell_type": "markdown", - "id": "3a175eb0-8956-4754-ac89-f554250afd7f", - "metadata": {}, - "source": [ - "---\n", - "\n", - "**First, import the utility function `lfric_rh_datacube` from `testdata_fetching`, and call it to get a global LFRic test cube.**" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "0d189559-f75e-4872-a4bb-6509393c4394", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Relative Humidity At Screen Level (1)--
Shape221184
Mesh coordinates
\tlatitudex
\tlongitudex
Mesh
\tnameTopology data of 2D unstructured mesh
\tlocationface
Scalar coordinates
\tforecast_period21600 seconds
\tforecast_reference_time2021-03-24 00:00:00
\ttime2021-03-24 06:00:00
Cell methods
\tpointtime
Attributes
\tConventions'CF-1.7'
\tdescription'Created by xios'
\tinterval_operation'6 h'
\tinterval_write'6 h'
\tonline_operation'instant'
\ttitle'Created by xios'
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from testdata_fetching import lfric_rh_singletime_2d\n", - "lfric_rh = lfric_rh_singletime_2d()\n", - "lfric_rh" - ] - }, - { - "cell_type": "markdown", - "id": "fe96bfb8-1dda-43ef-83bc-8e06c360e6bd", - "metadata": {}, - "source": [ - "**Create a Polydata object from this.** \n", - "Use the routine `pv_from_lfric_cube` from the package `pv_conversions`, which we used in the plotting section." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "db0280ff-3ebd-42c9-a9eb-8f9c8117eeee", - "metadata": {}, - "outputs": [], - "source": [ - "from pv_conversions import pv_from_lfric_cube\n", - "pv_global_rh = pv_from_lfric_cube(lfric_rh)" - ] - }, - { - "cell_type": "markdown", - "id": "d9ee71c7-e3cc-4479-aea9-2972c0424bd5", - "metadata": {}, - "source": [ - "---\n", - "\n", - "Now we will create a tool to extract over a desired region." - ] - }, - { - "cell_type": "markdown", - "id": "9b3b61bc-d827-4faf-93ee-637a020cd496", - "metadata": {}, - "source": [ - "**Import the class `BBox` from `geovista.geodesic`, and make one...** " - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "2e7b1bd1-f126-4900-a8bc-a56e4c98dca6", - "metadata": {}, - "outputs": [], - "source": [ - "from geovista.geodesic import BBox" - ] - }, - { - "cell_type": "markdown", - "id": "01602100-f556-475a-a470-f7459a04371a", - "metadata": {}, - "source": [ - "Note: the name here is short for \"Bounding Box\".\n", - "\n", - "**Use the notebook \"?\" command to display the function signature of its constructor : `?BBox.__init__`**" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "c914e991-5400-4912-9771-db367b9058f8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;31mSignature:\u001b[0m\n", - "\u001b[0mBBox\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mlons\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__array_like\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_SupportsArray\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__nested_sequence\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NestedSequence\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__array_like\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_SupportsArray\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcomplex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbytes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__nested_sequence\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NestedSequence\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcomplex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbytes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mlats\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__array_like\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_SupportsArray\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__nested_sequence\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NestedSequence\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__array_like\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_SupportsArray\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcomplex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbytes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__nested_sequence\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NestedSequence\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcomplex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbytes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mellps\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mOptional\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'WGS84'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mOptional\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m256\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m \u001b[0mtriangulate\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mOptional\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", - "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mDocstring:\u001b[0m\n", - "Create a 3D geodesic bounding-box for extracting an enclosed surface, lines\n", - "or points.\n", - "\n", - "The bounding-box region is specified in terms of its four corners, in\n", - "degrees of longitude and latitude. As the bounding-box is a geodesic, it\n", - "can only ever at most enclose half of an ellipsoid.\n", - "\n", - "The geometry of the bounding-box may be specified as either an open or\n", - "closed longitude/latitude geometry i.e., 4 or 5 longitude/latitude values.\n", - "\n", - "Parameters\n", - "----------\n", - "lons : ArrayLike\n", - " The longitudes (degrees) of the bounding-box, in the half-closed interval\n", - " [-180, 180). Note that, longitudes will be wrapped to this interval.\n", - "lats : ArrayLike\n", - " The latitudes (degrees) of the bounding-box, in the closed interval [-90, 90].\n", - "ellps : str, default=ELLIPSE\n", - " The ellipsoid for geodesic calculations. See :func:`pyproj.get_ellps_map`.\n", - "c : float, default=BBOX_C\n", - " The bounding-box face geometry will contain ``c**2`` cells.\n", - "triangulate : bool, default=False\n", - " Specify whether the bounding-box faces are triangulated.\n", - "\n", - "Notes\n", - "-----\n", - ".. versionadded:: 0.1.0\n", - "\u001b[0;31mFile:\u001b[0m ~/git/geovista/src/geovista/geodesic.py\n", - "\u001b[0;31mType:\u001b[0m function" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "?BBox.__init__" - ] - }, - { - "cell_type": "markdown", - "id": "96e6e603-94c0-48c8-85d2-0f397bca9010", - "metadata": {}, - "source": [ - "---\n", - "\n", - "**Create a BBox to specify a bounding rectangle in lat-lon space.** \n", - "Give it `lons` and `lats` arguments which specify the points of a bounding rectangle,\n", - "in lat-lon space, from 0..70 in longitude and -24..+45 in latitude. \n", - "( *Note:* do ***not*** supply a duplicate 'end' point -- a closed loop is automatically generated. )" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "22f13977-864b-4c49-be0d-5d6e158bbd9e", - "metadata": {}, - "outputs": [], - "source": [ - "bbox = BBox(lons=[0, 70, 70, 0], lats=[-25, -25, 45, 45])" - ] - }, - { - "cell_type": "markdown", - "id": "32c47cdb-477d-4f0c-87e1-2f7c960163b3", - "metadata": {}, - "source": [ - "---\n", - "\n", - "**Now \"apply\" the BBox to the global mesh data, by passing it to the `BBox.enclosed` method.** \n", - "And show the resulting object." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "c1c4cd2d-367d-4ddf-b6dc-ea99e9407139", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
HeaderData Arrays
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
PolyDataInformation
N Cells27029
N Points27380
N Strips0
X Bounds2.370e-01, 1.000e+00
Y Bounds-8.181e-03, 9.415e-01
Z Bounds-5.033e-01, 7.787e-01
N Arrays7
\n", - "\n", - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
NameFieldTypeN CompMinMax
vtkOriginalPointIdsPointsint6411.900e+021.846e+05
SelectedPointsPointsuint810.000e+001.000e+00
relative_humidity_at_screen_levelCellsfloat6412.368e+001.118e+02
vtkOriginalCellIdsCellsint6419.500e+011.842e+05
gvCRSFields1nannan
gvRadiusFieldsfloat6411.000e+001.000e+00
gvNameFields1nannan
\n", - "\n", - "
" - ], - "text/plain": [ - "PolyData (0x7f4284983d00)\n", - " N Cells:\t27029\n", - " N Points:\t27380\n", - " N Strips:\t0\n", - " X Bounds:\t2.370e-01, 1.000e+00\n", - " Y Bounds:\t-8.181e-03, 9.415e-01\n", - " Z Bounds:\t-5.033e-01, 7.787e-01\n", - " N Arrays:\t7" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# 'Apply' the region to the PolyData object.\n", - "pv_regional_rh = bbox.enclosed(pv_global_rh)\n", - "pv_regional_rh" - ] - }, - { - "cell_type": "markdown", - "id": "3c22c3fd-9756-4098-8e48-dc161b868e10", - "metadata": {}, - "source": [ - "You can see that the new (regional) polydata has fewer cells than the original (global) one.\n", - "\n", - "---\n", - "\n", - "**Now index the regional PolyData with `pv[\"vtkOriginalCellIds\"]`, to get an array of cell indexes** \n", - "and show the result." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "0aee31fa-1be4-498d-97cc-20267e1ba3cb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "pyvista_ndarray([ 95, 96, 97, ..., 184179, 184180, 184181])" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Get the remaining face indices, to use for indexing the Cube.\n", - "region_indices = pv_regional_rh[\"vtkOriginalCellIds\"]\n", - "region_indices" - ] - }, - { - "cell_type": "markdown", - "id": "8c3f341f-f33a-4c9e-93f0-bbce49517c00", - "metadata": {}, - "source": [ - "**Note:** This shows the original cell indices of the cells which fall within the region.\n", - "\n", - "Now we can use these to select only those cell *from the Iris cube*.\n", - "\n", - "**Apply these cells as an index to the 'mesh dimension' of the original Iris lfric-rh cube** \n", - "and show that" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "cd812f99-73b3-4247-a975-a59bb49a42aa", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Relative Humidity At Screen Level (1)--
Shape27029
Auxiliary coordinates
\tlatitudex
\tlongitudex
Scalar coordinates
\tforecast_period21600 seconds
\tforecast_reference_time2021-03-24 00:00:00
\ttime2021-03-24 06:00:00
Cell methods
\tpointtime
Attributes
\tConventions'CF-1.7'
\tdescription'Created by xios'
\tinterval_operation'6 h'
\tinterval_write'6 h'
\tonline_operation'instant'
\ttitle'Created by xios'
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "lfric_rh_region = lfric_rh[..., region_indices]\n", - "lfric_rh_region" - ] - }, - { - "cell_type": "markdown", - "id": "6d102893-e661-412d-a7c1-5de9964ce72c", - "metadata": {}, - "source": [ - "This cube contains the mesh data within our selected region.\n", - "\n", - "However, there is a catch here : Once indexed, our cube ***no longer has a mesh***. \n", - "You can see this in the printout, which lists \"Auxiliary coordinates\" but no \"Mesh coordinates\".\n", - "This problem will probably be fixed in future. See [here in the Iris docs](https://scitools-iris.readthedocs.io/en/latest/further_topics/ugrid/operations.html#region-extraction) for a discussion.\n", - "\n", - "For now, what we need to do is to re-create a mesh for the regional cube.\n", - "We do that in a few steps ...\n", - "\n", - "---\n", - "\n", - "Step 1 : **Get the X and Y-axis coordinates from the region cube.**\n", - "Use `Cube.coords('longitude')` etc." - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "2d43b8c0-2a25-4dee-8610-c26438209eef", - "metadata": {}, - "outputs": [], - "source": [ - "x_coord = lfric_rh_region.coord('longitude')\n", - "y_coord = lfric_rh_region.coord('latitude')" - ] - }, - { - "cell_type": "markdown", - "id": "387b22d4-78c9-4c88-a320-9c8d4be8e1fb", - "metadata": {}, - "source": [ - "Step 2 : **Create a new `iris.experimental.ugrid.Mesh`-class object, passing the X,Y coords as arguments**" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "d6b2345b-1cca-4f2e-8cc7-c5ab9fc6aab9", - "metadata": {}, - "outputs": [], - "source": [ - "from iris.experimental.ugrid.mesh import Mesh\n", - "mesh = Mesh.from_coords(x_coord, y_coord)" - ] - }, - { - "cell_type": "markdown", - "id": "be9af3e5-ba74-4ab0-9a52-bf80a50a6334", - "metadata": {}, - "source": [ - "( Step 2a : **`print()` the Mesh object** \n", - "Note : `Mesh` does not provide a notebook display method. \n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "id": "12e8fba7-2f5b-43c9-a95a-0c487364678c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mesh : 'unknown'\n", - " topology_dimension: 2\n", - " node\n", - " node_dimension: 'Mesh2d_node'\n", - " node coordinates\n", - " shape(108116,)>\n", - " shape(108116,)>\n", - " face\n", - " face_dimension: 'Mesh2d_face'\n", - " face_node_connectivity: shape(27029, 4)>\n", - " face coordinates\n", - " shape(27029,)>\n", - " shape(27029,)>\n" - ] - } - ], - "source": [ - "print(mesh)" - ] - }, - { - "cell_type": "markdown", - "id": "767e4c6c-4665-4e58-9bb2-8b1a7ea8749a", - "metadata": {}, - "source": [ - "---\n", - "Step 3 : **call `Mesh.to_MeshCoords` to create a pair of `MeshCoord`s containing this mesh** \n", - "Note : you must specify the keyword `location=\"face\"` : This matches the data location of the original data -- i.e. the data cells are faces." - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "8c84b276-36b7-435f-a4da-7e8fbf104d8d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "() location(face) +bounds shape(27029,)>,\n", - " ) location(face) +bounds shape(27029,)>)" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mesh_coords = mesh.to_MeshCoords(location=\"face\")\n", - "mesh_coords" - ] - }, - { - "cell_type": "markdown", - "id": "365ca473-5e01-4e3d-9731-6309362dd07a", - "metadata": {}, - "source": [ - "---\n", - "Step 4 : (finally!!) \n", - "**Use `Cube.remove_coord` and `Cube.add_aux_coord` to replace each AuxCoord with its corresponding `MeshCoord` from the previous step.** Note : for 'add_aux_coord', you also need to specify the relevant cube dimension(s) : See [`Cube.add_aux_coord` in the Iris docs](https://scitools-iris.readthedocs.io/en/latest/generated/api/iris/cube.html?highlight=add_aux_coord#iris.cube.Cube.add_aux_coord) \n", - "\n", - "And show the cube .." - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "184b796b-9e1e-40d3-8b88-d086c2093c58", - "metadata": {}, - "outputs": [], - "source": [ - "lfric_rh_region.remove_coord('longitude')" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "6ee58d1d-d67d-4241-8113-e260ae07c4bf", - "metadata": {}, - "outputs": [], - "source": [ - "lfric_rh_region.remove_coord('latitude')" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "4b1c7d7f-18b3-44f3-bf89-688e2e60658d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Relative Humidity At Screen Level (1)--
Shape27029
Mesh coordinates
\tlatitudex
\tlongitudex
Mesh
\tnameunknown
\tlocationface
Scalar coordinates
\tforecast_period21600 seconds
\tforecast_reference_time2021-03-24 00:00:00
\ttime2021-03-24 06:00:00
Cell methods
\tpointtime
Attributes
\tConventions'CF-1.7'
\tdescription'Created by xios'
\tinterval_operation'6 h'
\tinterval_write'6 h'
\tonline_operation'instant'
\ttitle'Created by xios'
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "xco, yco = mesh_coords\n", - "\n", - "lfric_rh_region.add_aux_coord(xco, 0)\n", - "lfric_rh_region.add_aux_coord(yco, 0)\n", - "\n", - "# Result : a regional Mesh-Cube with a subset of the original faces.\n", - "lfric_rh_region" - ] - }, - { - "cell_type": "markdown", - "id": "98494731-0cb2-4747-b370-4a54ef3ae273", - "metadata": {}, - "source": [ - "Lastly, plot this to see what we get.\n", - "\n", - "The following steps ...\n", - " * create a PolyData from the regional cube with `pv_conversions.pv_from_lfric_cube`\n", - " * follow the steps shown in the Plotting section" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8fbf4066-7806-4bcb-9f06-d8e0c1a9414d", - "metadata": {}, - "outputs": [], - "source": [ - "pv = pv_from_lfric_cube(lfric_rh_region)\n", - "from geovista import GeoPlotter\n", - "plotter = GeoPlotter()\n", - "plotter.add_mesh(pv)\n", - "plotter.show()" - ] - }, - { - "cell_type": "markdown", - "id": "5b1b5c9b-1835-4fb9-81cd-0217cab7bed4", - "metadata": {}, - "source": [ - "----\n", - "\n", - "**Investigation:** It is useful to add some extra background information to make this more visible.\n", - "\n", - "As a minimum you can use `plotter.add_coastlines()`.\n", - "\n", - "Another useful one is `plotter.add_base_layer()`\n", - "**What does that do ?**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b2c8eccc-c1cb-4af2-97dd-4c362f8f4d35", - "metadata": {}, - "outputs": [], - "source": [ - "plotter.add_coastlines()\n", - "plotter.add_base_layer()\n", - "plotter.show()\n" - ] - }, - { - "cell_type": "markdown", - "id": "d11f66da-232c-4e4b-afab-89bbd4a4cd6a", - "metadata": {}, - "source": [ - "----\n", - "\n", - "**Investigation:** \n", - "If you rotate the above images, you will see they don't behave liekt e\n", - "\n", - "As a minimum you can use `plotter.add_coastlines()`.\n", - "\n", - "Another useful one is `plotter.add_base_layer()`\n", - "**What does that do ?**" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bc933dc1-267f-4705-a6c9-07ca320f2f1d", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.15" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/Sec_01_Load_and_Examine.ipynb b/notebooks/Sec_01_Load_and_Examine.ipynb index f5bfd70..fa272a4 100644 --- a/notebooks/Sec_01_Load_and_Examine.ipynb +++ b/notebooks/Sec_01_Load_and_Examine.ipynb @@ -2,1931 +2,101 @@ "cells": [ { "cell_type": "markdown", - "id": "b575ede6-8433-418a-bb04-949b0ea52abe", + "id": "000fcecd-afb9-4262-b21d-fb6dc07b983c", "metadata": {}, "source": [ "# Section 1 : Loading and Examining some LFRic data\n", "\n", - "Let's dive right in by taking a look at some output file contents.\n", - "\n", - "**TODO: data needs to be available somewhere sensible**" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "252135b3-18a5-494a-b0fc-2ab5f9fd347d", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from pathlib import Path\n", - "datadir = Path('/scratch/sworsley/lfric_data')\n", - "datadir.exists()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "a2dad4ef-f075-4348-a805-b1d6481757b5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "total 218477312\n", - "-rw-r--r--. 1 sworsley users 17328890234 Jan 10 16:17 20210324T0000Z_lf_latlon.nc\n", - "-rw-r--r--. 1 sworsley users 16916479288 Jan 10 16:16 20210324T0000Z_lf_ugrid.nc\n", - "-rw-r--r--. 1 sworsley users 6079812292 Jan 10 16:04 20210324T0000Z_um_latlon.nc\n", - "-rw-r--r--. 1 sworsley users 4395534996 Jan 10 16:05 20210324T0000Z_um_ugrid.nc\n", - "-rw-r--r--. 1 sworsley users 17328890234 Jan 10 16:16 20210407T0000Z_lf_latlon.nc\n", - "-rw-r--r--. 1 sworsley users 16916479288 Jan 10 16:22 20210407T0000Z_lf_ugrid.nc\n", - "-rw-r--r--. 1 sworsley users 6079812292 Jan 10 16:03 20210407T0000Z_um_latlon.nc\n", - "-rw-r--r--. 1 sworsley users 4395535554 Jan 10 16:04 20210407T0000Z_um_ugrid.nc\n", - "-rw-r--r--. 1 sworsley users 17328890234 Jan 10 16:22 20210421T0000Z_lf_latlon.nc\n", - "-rw-r--r--. 1 sworsley users 16916479288 Jan 10 16:23 20210421T0000Z_lf_ugrid.nc\n", - "-rw-r--r--. 1 sworsley users 6079812292 Jan 10 16:06 20210421T0000Z_um_latlon.nc\n", - "-rw-r--r--. 1 sworsley users 4395535688 Jan 10 16:05 20210421T0000Z_um_ugrid.nc\n", - "-rw-r--r--. 1 sworsley users 17328890234 Jan 10 16:27 20210505T0000Z_lf_latlon.nc\n", - "-rw-r--r--. 1 sworsley users 16916479288 Jan 10 16:27 20210505T0000Z_lf_ugrid.nc\n", - "-rw-r--r--. 1 sworsley users 6079812292 Jan 10 16:04 20210505T0000Z_um_latlon.nc\n", - "-rw-r--r--. 1 sworsley users 4395536225 Jan 10 16:06 20210505T0000Z_um_ugrid.nc\n", - "-rw-r--r--. 1 sworsley users 17328890234 Jan 10 16:27 20210519T0000Z_lf_latlon.nc\n", - "-rw-r--r--. 1 sworsley users 16916479288 Jan 10 16:30 20210519T0000Z_lf_ugrid.nc\n", - "-rw-r--r--. 1 sworsley users 6079812292 Jan 10 16:07 20210519T0000Z_um_latlon.nc\n", - "-rw-r--r--. 1 sworsley users 4395536260 Jan 10 16:01 20210519T0000Z_um_ugrid.nc\n", - "-rw-r--r--. 1 sworsley users 59031729 Jan 16 17:14 latlon_surface.nc\n", - "-rw-r--r--. 1 sworsley users 56646919 Jan 16 17:13 ugrid_surface.nc\n" - ] - } - ], - "source": [ - "%ls -1l {datadir}" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "eaf2957d-b4a7-40b7-9580-827c08fe4c8e", - "metadata": {}, - "outputs": [], - "source": [ - "# !ncdump -h /scratch/sworsley/lfric_data/latlon_surface.nc | head -n 100" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "ea7d2511-bc79-42b8-83a7-9e9d4ee28f91", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "netcdf \\20210324T0000Z_lf_ugrid {\n", - "dimensions:\n", - "\tnMesh2d_node = 221186 ;\n", - "\tnMesh2d_edge = 442368 ;\n", - "\tnMesh2d_face = 221184 ;\n", - "\ttime_instant = 24 ;\n", - "\tMesh2d_face_N_nodes = 4 ;\n", - "\tMesh2d_edge_N_nodes = 2 ;\n", - "\ttime_centered = 24 ;\n", - "\tboundary_layer_type = 7 ;\n", - "\tbnds = 2 ;\n", - "\tdim1 = 4 ;\n", - "\tdepth = 4 ;\n", - "\tpressure = 17 ;\n", - "variables:\n", - "\tint Mesh2d ;\n", - "\t\tMesh2d:cf_role = \"mesh_topology\" ;\n", - "\t\tMesh2d:topology_dimension = 2 ;\n", - "\t\tMesh2d:long_name = \"Topology data of 2D unstructured mesh\" ;\n", - "\t\tMesh2d:node_coordinates = \"Mesh2d_node_x Mesh2d_node_y\" ;\n", - "\t\tMesh2d:edge_coordinates = \"Mesh2d_edge_x Mesh2d_edge_y\" ;\n", - "\t\tMesh2d:face_coordinates = \"Mesh2d_face_x Mesh2d_face_y\" ;\n", - "\t\tMesh2d:face_node_connectivity = \"Mesh2d_face_nodes\" ;\n", - "\t\tMesh2d:edge_node_connectivity = \"Mesh2d_edge_nodes\" ;\n", - "\tfloat Mesh2d_node_x(nMesh2d_node) ;\n", - "\t\tMesh2d_node_x:units = \"degrees_east\" ;\n", - "\t\tMesh2d_node_x:standard_name = \"longitude\" ;\n", - "\t\tMesh2d_node_x:long_name = \"Longitude of mesh nodes.\" ;\n", - "\tfloat Mesh2d_node_y(nMesh2d_node) ;\n", - "\t\tMesh2d_node_y:units = \"degrees_north\" ;\n", - "\t\tMesh2d_node_y:standard_name = \"latitude\" ;\n", - "\t\tMesh2d_node_y:long_name = \"Latitude of mesh nodes.\" ;\n", - "\tfloat Mesh2d_edge_x(nMesh2d_edge) ;\n", - "\t\tMesh2d_edge_x:units = \"degrees_east\" ;\n", - "\t\tMesh2d_edge_x:standard_name = \"longitude\" ;\n", - "\t\tMesh2d_edge_x:long_name = \"Characteristic longitude of mesh edges.\" ;\n", - "\tfloat Mesh2d_edge_y(nMesh2d_edge) ;\n", - "\t\tMesh2d_edge_y:units = \"degrees_north\" ;\n", - "\t\tMesh2d_edge_y:standard_name = \"latitude\" ;\n", - "\t\tMesh2d_edge_y:long_name = \"Characteristic latitude of mesh edges.\" ;\n", - "\tfloat Mesh2d_face_x(nMesh2d_face) ;\n", - "\t\tMesh2d_face_x:units = \"degrees_east\" ;\n", - "\t\tMesh2d_face_x:standard_name = \"longitude\" ;\n", - "\t\tMesh2d_face_x:long_name = \"Characteristic longitude of mesh faces.\" ;\n", - "\tfloat Mesh2d_face_y(nMesh2d_face) ;\n", - "\t\tMesh2d_face_y:units = \"degrees_north\" ;\n", - "\t\tMesh2d_face_y:standard_name = \"latitude\" ;\n", - "\t\tMesh2d_face_y:long_name = \"Characteristic latitude of mesh faces.\" ;\n", - "\tint Mesh2d_face_nodes(nMesh2d_face, Mesh2d_face_N_nodes) ;\n", - "\t\tMesh2d_face_nodes:long_name = \"Maps every face to its corner nodes.\" ;\n", - "\t\tMesh2d_face_nodes:cf_role = \"face_node_connectivity\" ;\n", - "\t\tMesh2d_face_nodes:start_index = 0 ;\n", - "\tint Mesh2d_edge_nodes(nMesh2d_edge, Mesh2d_edge_N_nodes) ;\n", - "\t\tMesh2d_edge_nodes:long_name = \"Maps every edge/link to two nodes that it connects.\" ;\n", - "\t\tMesh2d_edge_nodes:cf_role = \"edge_node_connectivity\" ;\n", - "\t\tMesh2d_edge_nodes:start_index = 0 ;\n", - "\tdouble zh(time_instant, nMesh2d_face) ;\n", - "\t\tzh:long_name = \"boundary_layer_depth\" ;\n", - "\t\tzh:units = \"m\" ;\n", - "\t\tzh:interval_operation = \"6 h\" ;\n", - "\t\tzh:online_operation = \"instant\" ;\n", - "\t\tzh:cell_methods = \"time_instant: point\" ;\n", - "\t\tzh:mesh = \"Mesh2d\" ;\n", - "\t\tzh:location = \"face\" ;\n", - "\t\tzh:coordinates = \"forecast_period forecast_reference_time\" ;\n", - "\tdouble time_instant(time_instant) ;\n", - "\t\ttime_instant:axis = \"T\" ;\n", - "\t\ttime_instant:units = \"hours since 2021-03-24 00:00:00\" ;\n", - "\t\ttime_instant:standard_name = \"time\" ;\n", - "\t\ttime_instant:long_name = \"Time axis\" ;\n", - "\t\ttime_instant:calendar = \"gregorian\" ;\n", - "\t\ttime_instant:time_origin = \"2021-03-24 00:00:00\" ;\n", - "\tint64 forecast_period(time_instant) ;\n", - "\t\tforecast_period:units = \"seconds\" ;\n", - "\t\tforecast_period:standard_name = \"forecast_period\" ;\n", - "\tint64 forecast_reference_time ;\n", - "\t\tforecast_reference_time:units = \"hours since 2021-03-24 00:00:00\" ;\n", - "\t\tforecast_reference_time:standard_name = \"forecast_reference_time\" ;\n", - "\t\tforecast_reference_time:calendar = \"gregorian\" ;\n", - "\tdouble bl_type_ind(time_centered, boundary_layer_type, nMesh2d_face) ;\n", - "\t\tbl_type_ind:long_name = \"boundary_layer_type_indicator\" ;\n", - "\t\tbl_type_ind:units = \"1\" ;\n", - "\t\tbl_type_ind:interval_operation = \"720 s\" ;\n", - "\t\tbl_type_ind:online_operation = \"average\" ;\n", - "\t\tbl_type_ind:cell_methods = \"time_centered: mean (interval: 720 s)\" ;\n", - "\t\tbl_type_ind:mesh = \"Mesh2d\" ;\n", - "\t\tbl_type_ind:location = \"face\" ;\n", - "\t\tbl_type_ind:coordinates = \"forecast_period_0 forecast_reference_time\" ;\n", - "\tdouble time_centered(time_centered) ;\n", - "\t\ttime_centered:axis = \"T\" ;\n", - "\t\ttime_centered:bounds = \"time_centered_bnds\" ;\n", - "\t\ttime_centered:units = \"hours since 2021-03-24 00:00:00\" ;\n", - "\t\ttime_centered:standard_name = \"time\" ;\n", - "\t\ttime_centered:long_name = \"Time axis\" ;\n", - "\t\ttime_centered:calendar = \"gregorian\" ;\n", - "\t\ttime_centered:time_origin = \"2021-03-24 00:00:00\" ;\n", - "\tdouble time_centered_bnds(time_centered, bnds) ;\n", - "\tint64 boundary_layer_type(boundary_layer_type) ;\n", - "\t\tboundary_layer_type:units = \"1\" ;\n", - "\t\tboundary_layer_type:long_name = \"boundary_layer_type\" ;\n" - ] - } - ], - "source": [ - "!ncdump -h /scratch/sworsley/lfric_data/20210324T0000Z_lf_ugrid.nc | head -n 100" - ] - }, - { - "cell_type": "markdown", - "id": "c8111877-49ab-4d40-ae3d-d395274085fb", - "metadata": {}, - "source": [ - "## Relationship to existing Iris usage\n", - "\n", - "Much the same ...\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "76a44f91-0e22-4718-bade-99d28b20c05a", - "metadata": {}, - "outputs": [], - "source": [ - "import iris\n", - "iris.FUTURE.datum_support = True # avoids some irritating warnings" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "ae46d2e7-8673-4cb3-9f67-9b161b0c16a4", - "metadata": {}, - "outputs": [], - "source": [ - "# From these, grab one UM and one LFRic datafile, which roughly correspond\n", - "\n", - "um_filepth = datadir / '20210324T0000Z_um_latlon.nc'\n", - "lfric_filepth = datadir / '20210324T0000Z_lf_ugrid.nc'" - ] - }, - { - "cell_type": "markdown", - "id": "f671cdbb-6f27-4780-a97c-1de8dd6a6b8e", - "metadata": { - "tags": [] - }, - "source": [ - "## Just for reference : some UM data, and what that looks like in Iris ..." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "e643ca9b-4347-4458-84ad-daa7992922a4", - "metadata": {}, - "outputs": [], - "source": [ - "um_cubes = iris.load(um_filepth)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "387c1757-de5e-424f-a3b0-115a2f0835a1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "n(UM-cubes) = 62\n", - "first 10 cubes ...\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "\n", - "
\n", - "

\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Heavyside Function On Pressure Levels (1)timepressurelatitudelongitude
Shape2417481640
Dimension coordinates
\ttimex---
\tpressure-x--
\tlatitude--x-
\tlongitude---x
Auxiliary coordinates
\tforecast_periodx---
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:00
Attributes
\tConventions'CF-1.7'
\tSTASHm01s30i301
\tsource'Data from Met Office Unified Model'
\tum_version'12.2'
\n", - "

\n", - "
\n", - " \n", - "\n", - "\n", - "
\n", - "

\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Very Low Type Cloud Area Fraction (1)timelatitudelongitude
Shape24480640
Dimension coordinates
\ttimex--
\tlatitude-x-
\tlongitude--x
Auxiliary coordinates
\tforecast_periodx--
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:00
Attributes
\tConventions'CF-1.7'
\tSTASHm01s09i202
\tsource'Data from Met Office Unified Model'
\tum_version'12.2'
\n", - "

\n", - "
\n", - " \n", - "\n", - "\n", - "
\n", - "

\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Cloud Area Fraction Assuming Maximum Random Overlap (1)timelatitudelongitude
Shape24480640
Dimension coordinates
\ttimex--
\tlatitude-x-
\tlongitude--x
Auxiliary coordinates
\tforecast_periodx--
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:00
Attributes
\tConventions'CF-1.7'
\tSTASHm01s09i233
\tsource'Data from Met Office Unified Model'
\tum_version'12.2'
\n", - "

\n", - "
\n", - " \n", - "\n", - "\n", - "
\n", - "

\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Relative Humidity Wrt Ice (%)timepressurelatitudelongitude
Shape2417480640
Dimension coordinates
\ttimex---
\tpressure-x--
\tlatitude--x-
\tlongitude---x
Auxiliary coordinates
\tforecast_periodx---
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:00
Attributes
\tConventions'CF-1.7'
\tSTASHm01s16i204
\tsource'Data from Met Office Unified Model'
\tum_version'12.2'
\n", - "

\n", - "
\n", - " \n", - "\n", - "\n", - "
\n", - "

\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Cloud Base Altitude Assuming Only Consider Cloud Area Fraction Greater Than 2P5 Oktas (kft)timelatitudelongitude
Shape24480640
Dimension coordinates
\ttimex--
\tlatitude-x-
\tlongitude--x
Auxiliary coordinates
\tforecast_periodx--
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:00
Attributes
\tConventions'CF-1.7'
\tSTASHm01s09i210
\tsource'Data from Met Office Unified Model'
\tum_version'12.2'
\n", - "

\n", - "
\n", - " \n", - "\n", - "\n", - "
\n", - "

\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Atmosphere Downward Eastward Stress (Pa)timelatitudelongitude
Shape24480640
Dimension coordinates
\ttimex--
\tlatitude-x-
\tlongitude--x
Auxiliary coordinates
\tforecast_periodx--
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:00
\tlevel_height20.0 m, bound=(0.0, 36.664) m
\tmodel_level_number1
\tsigma0.9977232, bound=(1.0, 0.99582815)
Cell methods
\tmeantime (1 hour)
Attributes
\tConventions'CF-1.7'
\tSTASHm01s03i219
\tsource'Data from Met Office Unified Model'
\tum_version'12.2'
\n", - "

\n", - "
\n", - " \n", - "\n", - "\n", - "
\n", - "

\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Atmosphere Downward Northward Stress (Pa)timelatitudelongitude
Shape24481640
Dimension coordinates
\ttimex--
\tlatitude-x-
\tlongitude--x
Auxiliary coordinates
\tforecast_periodx--
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:00
\tlevel_height20.0 m, bound=(0.0, 36.664) m
\tmodel_level_number1
\tsigma0.9977232, bound=(1.0, 0.99582815)
Cell methods
\tmeantime (1 hour)
Attributes
\tConventions'CF-1.7'
\tSTASHm01s03i220
\tsource'Data from Met Office Unified Model'
\tum_version'12.2'
\n", - "

\n", - "
\n", - " \n", - "\n", - "\n", - "
\n", - "

\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Cloud Area Fraction Assuming Maximum Random Overlap (1)timelatitudelongitude
Shape24480640
Dimension coordinates
\ttimex--
\tlatitude-x-
\tlongitude--x
Auxiliary coordinates
\tforecast_periodx--
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:00
Attributes
\tConventions'CF-1.7'
\tSTASHm01s09i217
\tsource'Data from Met Office Unified Model'
\tum_version'12.2'
\n", - "

\n", - "
\n", - " \n", - "\n", - "\n", - "
\n", - "

\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Relative Humidity Wrt Water (%)timepressurelatitudelongitude
Shape2417480640
Dimension coordinates
\ttimex---
\tpressure-x--
\tlatitude--x-
\tlongitude---x
Auxiliary coordinates
\tforecast_periodx---
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:00
Attributes
\tConventions'CF-1.7'
\tSTASHm01s16i256
\tsource'Data from Met Office Unified Model'
\tum_version'12.2'
\n", - "

\n", - "
\n", - " \n", - "\n", - "\n", - "
\n", - "

\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Air Pressure At Sea Level (Pa)timelatitudelongitude
Shape24480640
Dimension coordinates
\ttimex--
\tlatitude-x-
\tlongitude--x
Auxiliary coordinates
\tforecast_periodx--
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:00
Attributes
\tConventions'CF-1.7'
\tSTASHm01s16i222
\tsource'Data from Met Office Unified Model'
\tum_version'12.2'
\n", - "

\n", - "
\n", - " \n", - " " - ], - "text/plain": [ - "[,\n", - ",\n", - ",\n", - ",\n", - ",\n", - ",\n", - ",\n", - ",\n", - ",\n", - "]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print(\"n(UM-cubes) = \", len(um_cubes))\n", - "print(\"first 10 cubes ...\")\n", - "um_cubes[:10]" + "First run some preliminary Python setup, imports etc ..." ] }, { "cell_type": "code", - "execution_count": null, - "id": "e21b725b-258f-45e8-9f6b-3a57c19fff12", + "execution_count": 2, + "id": "3d2f09de-d3d3-4bf8-895b-410f5f356e3d", "metadata": {}, "outputs": [], "source": [ - "um_rh = um_cubes.extract_cube('relative_humidity')\n", - "um_rh" + "# import the top-level Iris package\n", + "import iris\n", + "\n", + "# import local routines handling access to some test data\n", + "from testdata_fetching import lfric_filepth" ] }, { "cell_type": "markdown", - "id": "a879a924-b2ad-4928-ba84-d128a3be4c1d", + "id": "3d36dc09-8f5c-40e4-9aee-74c22dcb8c16", "metadata": {}, "source": [ - "### NOTE: loading a single cube\n", - "You could instead load a single cube directly from the file. \n", + "## Iris unstructured loading\n", + "Let's dive right in by taking a look at some mesh content.\n", + "\n", + "\"Unstructured\" data can be loaded from UGRID files (i.e. netCDF files containing a UGRID-style mesh). \n", + "This is just like normal Iris loading, except that we must *enable* the interpretion of UGRID content, \n", + "roughly like this ...\n", + "\n", "```python\n", - "um_rh = iris.load_cube(um_filepth, 'relative_humidity')\n", + "with PARSE_UGRID_ON_LOAD.context():\n", + " cube_list = iris.load(path [, constraints])\n", + " # ..and/or..\n", + " single_cube = iris.load_cube(path [, constraints])\n", + " # ..and/or..\n", + " selected_cubes = iris.load_cubes(path, cube_constraints)\n", + "\n", "```\n", - "This is in fact rather faster, from a file like this with lots of data-variables (i.e. diagnostics)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "53d2dbf8-ae28-47d0-a5ef-ebb9e1cf2fe2", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "fc957199-a772-49e6-bb4e-dbbe2c956826", - "metadata": {}, - "source": [ - "## What's in the LFRic files ?\n", "\n", - "Let's start with a quick look at a dump of the file \n", - " -- but not actually all of it, as there are ***dozens*** of disagnostic variables ...\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5cf3f75f-998d-4910-818a-8664ef22dec8", - "metadata": {}, - "outputs": [], - "source": [ - "!ncdump -h {lfric_filepth} | head -n 120" - ] - }, - { - "cell_type": "markdown", - "id": "f819695e-82e3-4354-9c8d-254d9132f2c9", - "metadata": {}, - "source": [ - "The mesh metadata alone can be better viewed using the \"ugrid checker\" program, which knows how to interpret it ...\n", - "( NOTE: this is a public utility, also designed here in AVD : see https://github.com/pp-mo/ugrid-checks#readme )" + "**Exercise : first import the `PARSE_UGRID_ON_LOAD` object from iris.experimental.ugrid.load**" ] }, { "cell_type": "code", - "execution_count": null, - "id": "6467fcb5-999f-412b-92bd-7227bcbbc792", + "execution_count": 3, + "id": "46d31079-c1db-471a-9f55-bfbde788467e", "metadata": {}, "outputs": [], "source": [ - "!ugrid-checker -sqe {lfric_filepth} | head -n 24" + "from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD" ] }, { "cell_type": "markdown", - "id": "5d009754-44ac-4b09-9e02-c68ca96aa144", + "id": "c8111877-49ab-4d40-ae3d-d395274085fb", "metadata": {}, "source": [ "---\n", "\n", - "Let's not bother any more with that : Instead, we can load it into Iris which does a reasonable job of interpreting the mesh-structured data.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "d2a2c581-f74a-4ada-a7a6-d472ff8b4c38", - "metadata": {}, - "outputs": [], - "source": [ - "# Load the LFRic single datafile \n", + "The variable `lfric_filepath` is already set up, pointing to a suitable test file.\n", "\n", - "from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD\n", - "# Note the use of the special context. This is basically because the Iris mesh functionality is still 'experimental'\n", + "**Exercise : Load all data from `lfric_filepath`, with the UGRID loading enabled, and print the first 10 cubes.** \n", + "Use the plain 'load' method, as shown above. \n", + "NOTE : ***expect this to take a few seconds to complete.***\n", + "\n", + "
Sample code solution click to reveal\n", + "\n", + "```python\n", "with PARSE_UGRID_ON_LOAD.context():\n", - " lfric_cubes = iris.load(lfric_filepth)" + " cubes = iris.load(lfric_)\n", + "\n", + "cubes[:10]\n", + "```\n", + "
" ] }, { "cell_type": "code", - "execution_count": 20, - "id": "ccca09e6-fdd4-438e-a0f6-cff200aa0707", - "metadata": {}, + "execution_count": 4, + "id": "ae46d2e7-8673-4cb3-9f67-9b161b0c16a4", + "metadata": { + "lines_to_next_cell": 2 + }, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "n(LFRic-cubes) = 99\n", - "first 10 cubes ...\n" - ] - }, { "data": { "text/html": [ "\n", "\n", "\n", "\n", - "\n", - "
\n", + "\n", + "
\n", "

\n", "\n", - "\n", + "
\n", " \n", - "\n", + "\n", "\n", "\n", "\n", @@ -2103,7 +273,7 @@ "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", @@ -2120,7 +290,7 @@ "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", @@ -2139,8 +309,8 @@ "\n", " \n", "\n", - "\n", - "
\n", + "\n", + "
\n", "

\n", "\n", - "

Surface Net Longwave Flux Radiative Timestep (W m-2)Surface Net Shortwave Flux (W m-2)time--
\tmeantime (1 h)time (720 s)
Attributes
\tinterval_operation'1 h''720 s'
\tinterval_write
\n", + "
\n", " \n", - "\n", + "\n", "\n", "\n", "\n", @@ -2263,8 +433,8 @@ " \n", "\n", "\n", - " \n", - " \n", + " \n", + " \n", "\n", "\n", " \n", @@ -2281,7 +451,7 @@ "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", @@ -2289,7 +459,7 @@ "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", @@ -2300,8 +470,8 @@ "\n", " \n", "\n", - "\n", - "
\n", + "\n", + "
\n", "

\n", "\n", - "

Surface Upward Longwave Flux Radiative Timestep (W m-2)Cloud Base Altitude Asl Combined Cloud Amount Greater Than 2P5 Okta (kilofeet)time--
\tmeantime (1 h)\tpointtime
Attributes
\tinterval_operation'1 h''6 h'
\tinterval_write
\tonline_operation'average''instant'
\ttitle
\n", + "
\n", " \n", - "\n", + "\n", "\n", "\n", "\n", @@ -2415,6 +585,10 @@ " \n", "\n", "\n", + " \n", + " \n", + "\n", + "\n", " \n", " \n", "\n", @@ -2424,8 +598,8 @@ " \n", "\n", "\n", - " \n", - " \n", + " \n", + " \n", "\n", "\n", " \n", @@ -2442,7 +616,7 @@ "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", @@ -2450,7 +624,7 @@ "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", @@ -2461,8 +635,8 @@ "\n", " \n", "\n", - "\n", - "
\n", + "\n", + "
\n", "

\n", "\n", - "

Maximum Combined Cloud Amount Between 111 And 1949M Asl (1)Decoupled Stratocumulus Over Cumulus Boundary Layer Indicator (1)time--
\tboundary_layer_type5
\tforecast_reference_time2021-03-24 00:00:00
\tpointtime\tmeantime (720 s)
Attributes
\tinterval_operation'6 h''720 s'
\tinterval_write
\tonline_operation'instant''average'
\ttitle
\n", + "
\n", " \n", - "\n", + "\n", "\n", "\n", "\n", @@ -2585,8 +759,8 @@ " \n", "\n", "\n", - " \n", - " \n", + " \n", + " \n", "\n", "\n", " \n", @@ -2603,7 +777,7 @@ "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", @@ -2611,7 +785,7 @@ "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", @@ -2622,8 +796,8 @@ "\n", " \n", "\n", - "\n", - "
\n", + "\n", + "
\n", "

\n", "\n", - "

Grid Surface Temperature (K)Surface Downward Shortwave Flux Radiative Timestep (W m-2)time--
\tpointtime\tmeantime (1 h)
Attributes
\tinterval_operation'6 h''1 h'
\tinterval_write
\tonline_operation'instant''average'
\ttitle
\n", + "
\n", " \n", - "\n", + "\n", "\n", "\n", "\n", @@ -2783,8 +957,8 @@ "\n", " \n", "\n", - "\n", - "
\n", + "\n", + "
\n", "

\n", "\n", - "

Surface Downward Clear Shortwave Flux Radiative Timestep (W m-2)Toa Upward Shortwave Flux Radiative Timestep (W m-2)time--
\n", + "
\n", " \n", - "\n", + "\n", "\n", "\n", "\n", @@ -2944,8 +1118,8 @@ "\n", " \n", "\n", - "\n", - "
\n", + "\n", + "
\n", "

\n", "\n", - "

Surface Downward Longwave Flux Radiative Timestep (W m-2)Toa Upward Longwave Flux Radiative Timestep (W m-2)time--
\n", + "
\n", " \n", - "\n", + "\n", "\n", "\n", "\n", @@ -3069,7 +1243,7 @@ "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", @@ -3086,7 +1260,7 @@ "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", @@ -3105,8 +1279,8 @@ "\n", " \n", "\n", - "\n", - "
\n", + "\n", + "
\n", "

\n", "\n", - "

Toa Upward Shortwave Flux (W m-2)Surface Net Longwave Flux Radiative Timestep (W m-2)time--
\tmeantime (720 s)time (1 h)
Attributes
\tinterval_operation'720 s''1 h'
\tinterval_write
\n", + "
\n", " \n", - "\n", + "\n", "\n", + "\n", "\n", "\n", " \n", "\n", "\n", + "\n", "\n", "\n", " \n", " \n", " \n", " \n", + " \n", "\n", "\n", " \n", " \n", " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", "\n", "\n", " \n", " \n", " \n", + " \n", "\n", "\n", " \n", " \n", + " \n", " \n", "\n", "\n", " \n", " \n", + " \n", " \n", "\n", "\n", " \n", " \n", " \n", + " \n", "\n", "\n", " \n", " \n", " \n", + " \n", "\n", "\n", " \n", " \n", " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", " \n", " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", " \n", " \n", + " \n", "\n", "\n", - " \n", - " \n", + " \n", + " \n", "\n", "\n", " \n", " \n", " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "
Surface Net Longwave Flux (W m-2)Relative Humidity Wrt Water (%)timepressure--
Shape2417221184
Dimension coordinates
\ttimex--
\tpressure-x-
Mesh coordinates
\tlatitude--x
\tlongitude--x
Auxiliary coordinates
\tforecast_periodx--
Mesh
\tnameTopology data of 2D unstructured meshTopology data of 2D unstructured mesh
\tlocationfaceface
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:002021-03-24 00:00:00
Cell methods
\tmeantime (720 s)\tpointtime
Attributes
\tConventions'CF-1.7''CF-1.7'
\tdescription'Created by xios''Created by xios'
\tinterval_operation'720 s''6 h'
\tinterval_write'6 h''6 h'
\tonline_operation'average''instant'
\ttitle'Created by xios''Created by xios'
\n", "

\n", "
\n", " \n", "\n", - "\n", - "
\n", + "\n", + "
\n", "

\n", "\n", - "\n", + "
\n", " \n", - "\n", + "\n", "\n", - "\n", "\n", "\n", " \n", "\n", "\n", - "\n", "\n", "\n", " \n", " \n", " \n", " \n", - " \n", "\n", "\n", " \n", " \n", " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", "\n", "\n", " \n", " \n", " \n", - " \n", "\n", "\n", " \n", " \n", - " \n", " \n", "\n", "\n", " \n", " \n", - " \n", " \n", "\n", "\n", " \n", " \n", " \n", - " \n", "\n", "\n", " \n", " \n", " \n", - " \n", "\n", "\n", " \n", " \n", " \n", - " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", " \n", " \n", - " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", " \n", " \n", - " \n", "\n", "\n", - " \n", - " \n", + " \n", + " \n", "\n", "\n", " \n", " \n", " \n", - " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", - " \n", + " \n", "\n", "
Relative Humidity Wrt Ice (%)Surface Downward Longwave Flux (W m-2)timepressure--
Shape2417221184
Dimension coordinates
\ttimex--
\tpressure-x-
Mesh coordinates
\tlatitude--x
\tlongitude--x
Auxiliary coordinates
\tforecast_periodx--
Mesh
\tnameTopology data of 2D unstructured meshTopology data of 2D unstructured mesh
\tlocationfaceface
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:002021-03-24 00:00:00
Cell methods
\tpointtime\tmeantime (720 s)
Attributes
\tConventions'CF-1.7''CF-1.7'
\tdescription'Created by xios''Created by xios'
\tinterval_operation'6 h''720 s'
\tinterval_write'6 h''6 h'
\tonline_operation'instant''average'
\ttitle'Created by xios''Created by xios'
\n", "

\n", "
\n", " \n", "\n", - "\n", - "
\n", + "\n", + "
\n", "

\n", "\n", - "\n", + "
\n", " \n", - "\n", + "\n", "\n", "\n", "\n", @@ -3571,7 +1745,7 @@ "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", @@ -3588,7 +1762,7 @@ "\n", "\n", " \n", - " \n", + " \n", "\n", "\n", " \n", @@ -3609,33 +1783,75 @@ " " ], "text/plain": [ - "[,\n", - ",\n", - ",\n", - ",\n", - ",\n", - ",\n", - ",\n", - ",\n", - ",\n", - "]" + "[,\n", + ",\n", + ",\n", + ",\n", + ",\n", + ",\n", + ",\n", + ",\n", + ",\n", + "]" ] }, - "execution_count": 20, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "print(\"n(LFRic-cubes) = \", len(lfric_cubes))\n", - "print(\"first 10 cubes ...\")\n", - "lfric_cubes[:10]" + "# ... space for user code ...\n", + "\n", + "with PARSE_UGRID_ON_LOAD.context():\n", + " cubes = iris.load(lfric_filepth)\n", + "\n", + "cubes[:10]" + ] + }, + { + "cell_type": "markdown", + "id": "38e5e2ba-d62e-4d38-849d-432bb1266d22", + "metadata": {}, + "source": [ + "**NOTEs :**\n", + " * putting just `cubes` at the end triggers notebook printing output\n", + " * this also means you can click on each cube to \"expand\" it into a detail view -- try it\n", + " * the effect of `print(cubes)` is different -- try it" + ] + }, + { + "cell_type": "markdown", + "id": "a879a924-b2ad-4928-ba84-d128a3be4c1d", + "metadata": {}, + "source": [ + "## Loading a single cube\n", + "You can instead load a single cube directly from the file. \n", + "This is considerably _faster_ in this case, since the whole file contains ~100 data-variables (i.e. diagnostics).\n", + "\n", + "**Load just the cube named `relative_humidity_at_screen_level`, from the same file, and show that.** \n", + "Hint : it's nicer to use the `load_cube` function\n", + "\n", + "
Sample code solution click to reveal\n", + "\n", + "```python\n", + "with PARSE_UGRID_ON_LOAD.context():\n", + " lfric_rh = iris.load_cube(lfric_filepth, \"relative_humidity_at_screen_level\")\n", + "\n", + "lfric_rh\n", + "```\n", + "---\n", + " \n", + "**NOTEs :**\n", + " * putting just `cubes` at the end triggers notebook printing output\n", + " * the effect of `print(cubes)` is different -- try it\n", + "
" ] }, { "cell_type": "code", - "execution_count": 21, - "id": "76909a45-b78a-4a28-824c-b5bd00b2de3e", + "execution_count": 5, + "id": "beb25d4f-532c-4b4f-a0fc-820ef035e933", "metadata": {}, "outputs": [ { @@ -3689,7 +1905,7 @@ " margin-top: 7px;\n", " }\n", "\n", - "
Surface Downward Shortwave Flux (W m-2)Toa Upward Clear Shortwave Flux Radiative Timestep (W m-2)time--
\tmeantime (720 s)time (1 h)
Attributes
\tinterval_operation'720 s''1 h'
\tinterval_write
\n", + "
\n", " \n", "\n", "\n", @@ -3802,38 +2018,25 @@ "" ] }, - "execution_count": 21, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "lfric_rh = lfric_cubes.extract_cube('relative_humidity_at_screen_level')\n", + "with PARSE_UGRID_ON_LOAD.context():\n", + " lfric_rh = iris.load_cube(lfric_filepth, \"relative_humidity_at_screen_level\")\n", "\n", "lfric_rh" ] }, - { - "cell_type": "markdown", - "id": "956fbb46-ab86-460d-a5da-23368f7d9c49", - "metadata": {}, - "source": [ - "---\n", - "Or, just to show a faster selective loading ..." - ] - }, { "cell_type": "code", "execution_count": null, - "id": "0de1b9de-82ae-4816-bbe6-dcc05d9fd74c", + "id": "caed4b34-9dc1-4b74-a4ca-52014fb52d86", "metadata": {}, "outputs": [], - "source": [ - "with PARSE_UGRID_ON_LOAD.context():\n", - " lfric_rh = iris.load_cube(lfric_filepth, 'relative_humidity_at_screen_level')\n", - "\n", - "lfric_rh" - ] + "source": [] }, { "cell_type": "markdown", @@ -3942,14 +2145,14 @@ "
\n", "\n", "```python\n", - "#-------------------------------\n", - "# Utility Function\n", + "###-------------------------------\n", + "### Utility Function\n", "#\n", "def is_meshcube(cube):\n", " return cube.mesh is not None\n", "\n", "#-------------------------------\n", - "# Testing ...\n", + "### Testing ...\n", "#\n", "from iris.tests.stock import realistic_3d\n", "nonmesh_cube = realistic_3d()\n", diff --git a/notebooks/Sec_02_Meshes.ipynb b/notebooks/Sec_02_Meshes.ipynb index 0452f58..e24a2e7 100644 --- a/notebooks/Sec_02_Meshes.ipynb +++ b/notebooks/Sec_02_Meshes.ipynb @@ -91,71 +91,79 @@ "This does not happen in current LFRic data : the mesh is a \"cubesphere\" (see later images), and all cells have four corners." ] }, + { + "cell_type": "markdown", + "id": "39769832-3d50-43f7-81a8-a4a2ea960888", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Fetch some sample unstructured data, as used in Section#01\n", + "\n", + "**Import the data-access routine `lfric_rh_singletime_2d` from `testdata_fetching`, and call it to get a single two-dimensional test cube.**" + ] + }, { "cell_type": "code", "execution_count": 1, - "id": "ae46d2e7-8673-4cb3-9f67-9b161b0c16a4", + "id": "eff85024-6efb-4195-9dd2-157c254f5125", "metadata": {}, "outputs": [], "source": [ - "# Get sample files, as used in Section#01\n", - "\n", - "from pathlib import Path\n", - "datadir = Path('/scratch/sworsley/lfric_data')\n", - "\n", - "import iris\n", - "from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD\n", - "iris.FUTURE.datum_support = True # avoids some irritating warnings\n", - "\n", - "um_filepth = datadir / '20210324T0000Z_um_latlon.nc'\n", - "lfric_filepth = datadir / '20210324T0000Z_lf_ugrid.nc'" + "## TODO : remove later -- this bit is temporary, for initial testing with C48 data\n", + "from testdata_fetching import switch_data\n", + "switch_data(use_newer_smaller_c48_data=True)" ] }, { "cell_type": "code", "execution_count": 2, - "id": "58096462-eb63-48fe-9975-5eb3ce770228", + "id": "04f149fd-c8b1-46ee-b70f-3e3615d2f089", "metadata": {}, "outputs": [], "source": [ - "with PARSE_UGRID_ON_LOAD.context():\n", - " lfric_rh = iris.load_cube(lfric_filepth, 'relative_humidity_at_screen_level')\n", - " # Rename this cube, to make it clear wich model this came from.\n", - " lfric_rh.rename('LFRic Rh data')" + "from testdata_fetching import lfric_rh_singletime_2d\n", + "lfric_rh = lfric_rh_singletime_2d()" + ] + }, + { + "cell_type": "markdown", + "id": "830162b4-d4a9-443f-bdbc-278e726b0a64", + "metadata": {}, + "source": [ + "**Print the cube, and its `cube.mesh`**" ] }, { "cell_type": "code", "execution_count": 3, - "id": "b11528dd-28ed-4f5d-8ad4-6f1244add851", + "id": "85fb7d09-8e69-4bd9-bfff-13efaa0aa44a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "LFRic Rh data / (1) (time: 24; -- : 221184)\n", - " Dimension coordinates:\n", - " time x -\n", + "relative_humidity_at_screen_level / (1) (-- : 13824)\n", " Mesh coordinates:\n", - " latitude - x\n", - " longitude - x\n", - " Auxiliary coordinates:\n", - " forecast_period x -\n", + " latitude x\n", + " longitude x\n", " Mesh:\n", - " name Topology data of 2D unstructured mesh\n", - " location face\n", + " name Topology data of 2D unstructured mesh\n", + " location face\n", " Scalar coordinates:\n", - " forecast_reference_time 2021-03-24 00:00:00\n", + " forecast_period 21600 seconds\n", + " forecast_reference_time 2021-03-24 00:00:00\n", + " time 2021-03-24 06:00:00\n", " Cell methods:\n", - " point time\n", + " point time\n", " Attributes:\n", - " Conventions 'CF-1.7'\n", - " description 'Created by xios'\n", - " interval_operation '6 h'\n", - " interval_write '6 h'\n", - " online_operation 'instant'\n", - " title 'Created by xios'\n", + " Conventions 'CF-1.7'\n", + " description 'Created by xios'\n", + " interval_operation '6 h'\n", + " interval_write '6 h'\n", + " online_operation 'instant'\n", + " title 'Created by xios'\n", "\n", "----\n", "\n", @@ -164,20 +172,20 @@ " node\n", " node_dimension: 'nMesh2d_node'\n", " node coordinates\n", - " shape(221186,)>\n", - " shape(221186,)>\n", + " shape(13826,)>\n", + " shape(13826,)>\n", " edge\n", " edge_dimension: 'nMesh2d_edge'\n", - " edge_node_connectivity: shape(442368, 2)>\n", + " edge_node_connectivity: shape(27648, 2)>\n", " edge coordinates\n", - " shape(442368,)>\n", - " shape(442368,)>\n", + " shape(27648,)>\n", + " shape(27648,)>\n", " face\n", " face_dimension: 'nMesh2d_face'\n", - " face_node_connectivity: shape(221184, 4)>\n", + " face_node_connectivity: shape(13824, 4)>\n", " face coordinates\n", - " shape(221184,)>\n", - " shape(221184,)>\n", + " shape(13824,)>\n", + " shape(13824,)>\n", " long_name: 'Topology data of 2D unstructured mesh'\n", " var_name: 'Mesh2d'\n" ] @@ -189,10 +197,40 @@ "print(lfric_rh.mesh)" ] }, + { + "cell_type": "code", + "execution_count": 4, + "id": "22d1c6be-dbc2-4873-a1c2-d8f5159532bb", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2d12e203547845bd92d58648d09c473c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ViewInteractiveWidget(height=768, layout=Layout(height='auto', width='100%'), width=1024)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# TODO: work this up for user input\n", + "\n", + "# Simply plot that ..\n", + "from pv_conversions import pv_from_lfric_cube\n", + "pv = pv_from_lfric_cube(lfric_rh)\n", + "pv.plot() #jupyter_backend='static')" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "dc6d9a07-cf28-4ada-b7fe-6dc65a5ed94b", + "id": "32ed8732-64fe-41fa-847d-ee8a9d4b9653", "metadata": {}, "outputs": [], "source": [] @@ -232,12 +270,14 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "52077e4a-ca12-4c50-b5ff-9d9d135958f7", "metadata": {}, "outputs": [], "source": [ - "rh_t0 = lfric_rh[0]" + "from testdata_fetching import lfric_rh_singletime_2d\n", + "\n", + "rh_t0 = lfric_rh_singletime_2d()" ] }, { @@ -265,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "42ac9d45-d716-41c8-a899-c40a3ef56897", "metadata": {}, "outputs": [], @@ -289,7 +329,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "7d6a7e9d-3e6c-424e-a00e-a02794221f71", "metadata": {}, "outputs": [], @@ -316,8 +356,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "id": "93b95c3f-373e-4b4f-b38a-cfcaa4bce0eb", + "execution_count": 8, + "id": "cff3ad67-894c-4d37-8336-4be3058956d1", "metadata": {}, "outputs": [ { @@ -326,8 +366,8 @@ "
Relative Humidity At Screen Level (1)time
HeaderData Arrays
\n", "\n", "\n", - "\n", - "\n", + "\n", + "\n", "\n", "\n", "\n", @@ -338,18 +378,18 @@ "
PolyDataInformation
N Cells221184
N Points221186
N Cells13824
N Points13826
N Strips0
X Bounds-1.000e+00, 1.000e+00
Y Bounds-1.000e+00, 1.000e+00
\n", "\n", "\n", - "\n", + "\n", "\n", "\n", - "\n", + "\n", "
NameFieldTypeN CompMinMax
LFRic Rh dataCellsfloat6411.966e+001.850e+02
relative_humidity_at_screen_levelCellsfloat6413.518e+001.812e+02
gvCRSFields1nannan
gvRadiusFieldsfloat6411.000e+001.000e+00
gvNameFields1nannan
gvNameFields1nannan
\n", "\n", "
" ], "text/plain": [ - "PolyData (0x7f9ff89cef40)\n", - " N Cells:\t221184\n", - " N Points:\t221186\n", + "PolyData (0x7f38dd1d6700)\n", + " N Cells:\t13824\n", + " N Points:\t13826\n", " N Strips:\t0\n", " X Bounds:\t-1.000e+00, 1.000e+00\n", " Y Bounds:\t-1.000e+00, 1.000e+00\n", @@ -357,7 +397,7 @@ " N Arrays:\t4" ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -385,8 +425,63 @@ }, { "cell_type": "markdown", - "id": "df146952-dbef-449f-9cb7-c291471573fa", + "id": "d3d465b3-74f6-4433-9dd0-d210d8a6823a", + "metadata": {}, + "source": [ + "---\n", + "### Quick 3d plotting\n", + "\n", + "For a really quick, basic plot, you can display a PolyData as a VTK view with PyVista, by simply calling its `.plot` method.\n", + "\n", + "**Call the `plot` routine of the PolyData object. An output should appear.**" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "7605c046-e028-48be-b15d-3cd5405cb9f1", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "83cabd3957334cb9a28f982de29f2664", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ViewInteractiveWidget(height=768, layout=Layout(height='auto', width='100%'), width=1024)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pv.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "595dd3a8-e7b2-42a4-a498-16e1d40e734a", "metadata": {}, + "source": [ + "**NOTES**:\n", + " * this plot is interactive -- try dragging to rotate, and the mouse scroll-wheel to zoom\n", + " * this obviously causes some clutter and uses up some space (e.g. you can't easily scroll past it) \n", + " * To ***remove*** a plot output, use \"Clear Output\" from the \"Edit\" menu (or from right-click on the cell)\n", + " * alternatively, set the keyword `jupyter_backend='static'` in the command, for output as a plain image\n", + "\n", + "There are a lot more keywords available to [the `PolyData.plot()` method](https://docs.pyvista.org/api/core/_autosummary/pyvista.PolyData.plot.html), but it is not ideal to overcomplicate these calls. : \n", + "Finer control is better achieved in a different ways : See more detail on plotting in [the Plotting section](./Sec_03_Plotting.ipynb).\n" + ] + }, + { + "cell_type": "markdown", + "id": "df146952-dbef-449f-9cb7-c291471573fa", + "metadata": { + "tags": [] + }, "source": [ "### Create a plotter, and display 3D visualisation\n", "\n", @@ -408,7 +503,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "ed772994-07e2-4e63-a957-96a444c21caa", "metadata": {}, "outputs": [], @@ -434,7 +529,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "ccb731e2-eb0d-4962-addc-c7a7c55aa940", "metadata": {}, "outputs": [], @@ -456,22 +551,9 @@ "" ] }, - { - "cell_type": "markdown", - "id": "595dd3a8-e7b2-42a4-a498-16e1d40e734a", - "metadata": {}, - "source": [ - "**NOTES**:\n", - " * this operation currently generates a warning message, which however can be ignored\n", - " * when translated to a simple Python file + run, these plots (or at least the folowing one) can cause SegmentationFault\n", - " * ***TODO: this needs investigating, fix for confidence + useability***\n", - " * it is interactive, so it causes some clutter and uses up some space. \n", - " To remove plot outputs, use \"Clear Output\" from the \"Edit\" menu (or from right-click on the cell)" - ] - }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "84c55d31-72eb-4e3c-9925-182c42275daa", "metadata": {}, "outputs": [], @@ -486,7 +568,9 @@ "source": [ "**Some odd notes:**\n", " * By default, `plotter.show()` opens an interactive window : **you can rotate and zoom it with the mouse**.\n", - " * you can instead generate static output (try `interactive=False`)\n", + " * you can instead generate static output \n", + " * in a notebook, you do this with `jupyter_backend='static'`\n", + " * or in a Python session, try `interactive=False`\n", " * VTK/PyVista doesn't use plot \"types\". \n", " Instead, you add meshes to a plotter + can subsequently control the presentation.\n", " * GeoVista can also produce more familiar 2D plots (see on ...)\n" @@ -499,373 +583,6 @@ "source": [ "***TODO:*** can suggest some of these as follow-on exercises" ] - }, - { - "cell_type": "markdown", - "id": "0dc9bf0b-fceb-4df1-9f2c-b3b493351164", - "metadata": {}, - "source": [ - "# Comparing UM and LFRic fields" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "075a6e1b-e188-4867-a101-1e7f06661072", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "\n", - " \n", - " \n", - "\n", - "
Relative Humidity (%)timelatitudelongitude
Shape24480640
Dimension coordinates
\ttimex--
\tlatitude-x-
\tlongitude--x
Auxiliary coordinates
\tforecast_periodx--
Scalar coordinates
\tforecast_reference_time2021-03-24 00:00:00
\theight1.5 m
Attributes
\tConventions'CF-1.7'
\tSTASHm01s03i245
\tsource'Data from Met Office Unified Model'
\tum_version'12.2'
\n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "um_rh = iris.load_cube(um_filepth, 'relative_humidity')\n", - "# Rename so we are clear which model this came from\n", - "lfric_rh.rename('UM Rh data')\n", - "um_rh" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "e0caec24-1a80-4803-9a31-f988a66bf479", - "metadata": {}, - "outputs": [], - "source": [ - "from pv_conversions import pv_from_um_cube\n", - "um_pv = pv_from_um_cube(um_rh[0])" - ] - }, - { - "cell_type": "markdown", - "id": "340dc7ef-cb16-451d-bd72-bb818b419605", - "metadata": {}, - "source": [ - "## Simple side-by-side plotting : UM vs LFRic data" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "6307bf61-0840-433b-b581-393570d6a09f", - "metadata": {}, - "outputs": [], - "source": [ - "my_plotter = GeoPlotter(shape=(1, 2))\n", - "\n", - "my_plotter.subplot(0, 0)\n", - "my_plotter.add_coastlines()\n", - "my_plotter.add_mesh(um_pv, show_edges=True, cmap='magma')\n", - "\n", - "my_plotter.subplot(0, 1)\n", - "my_plotter.add_coastlines()\n", - "my_plotter.add_mesh(pv, show_edges=True, cmap='magma')\n", - "\n", - "my_plotter.link_views()\n", - "# Use a preset \"Nice\" viewpoint showing off the data\n", - "viewpoint = [\n", - " (-0.709497461391866, -1.2057617579427944, 1.4232488035268644),\n", - " (0.0, 0.0, 0.0),\n", - " (-0.48482598598375826, 0.7715244238081727, 0.41193910567260306)\n", - "]\n", - "my_plotter.camera_position = viewpoint\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "773ec049-1e91-4a4f-9f5f-129b35e32d0a", - "metadata": {}, - "outputs": [], - "source": [ - "my_plotter.show()" - ] - }, - { - "cell_type": "markdown", - "id": "2ca8a3bf-1a8a-49a3-83b0-79937d7436f6", - "metadata": {}, - "source": [ - "## A handy hint : how to record + re-use a camera view" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "60cb570f-c9c6-46a9-87ca-5c78d46a5cf5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(-0.709497461391866, -1.2057617579427944, 1.4232488035268644),\n", - " (0.0, 0.0, 0.0),\n", - " (-0.48482598598375826, 0.7715244238081727, 0.41193910567260306)]" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "viewpoint = my_plotter.camera_position\n", - "viewpoint" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9fee8dbd-836d-4351-9a28-cea74e6958a1", - "metadata": {}, - "outputs": [], - "source": [ - "# This pre-loaded position focusses on a cubesphere \"corner\" in the middle East\n", - "viewpoint = [\n", - " (0.9550352379408845, 0.9378277371075855, 0.9637172962958191),\n", - " (0.0, 0.0, 0.0),\n", - " (-0.3202752464164225, -0.5004192729867466, 0.8043657860428399)\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "28e3867e-da05-48a8-903e-164a0471c360", - "metadata": {}, - "outputs": [], - "source": [ - "# Plot just the LFRIC data with the same view ...\n", - "new_plotter = GeoPlotter()\n", - "new_plotter.add_coastlines()\n", - "new_plotter.add_mesh(pv, show_edges=True)\n", - "new_plotter.camera_position = viewpoint\n", - "new_plotter.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6c429dec-0df0-4576-823b-686e697f6a77", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "29748973-4438-46ea-8893-d38aa51aeadd", - "metadata": {}, - "outputs": [], - "source": [ - "# WIP : projected 2D plotting" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0ed1f051-821c-4b03-9c4a-8fdc5d824bdb", - "metadata": {}, - "outputs": [], - "source": [ - "# GeoVista coastline projection not yet supported. Use a representation of coastlines as Cube data instead.\n", - "\n", - "# import requests\n", - "# r = requests.get(\"https://github.com/SciTools-incubator/presentations/raw/main/ngms_champions_2022-04-12/coastline_grid.nc\")\n", - "# open(\"coastline_grid.nc\", \"wb\").write(r.content)\n", - "\n", - "# coastline_cube = iris.load_cube(\"coastline_grid.nc\")\n", - "\n", - "# coastline_polydata = pv_from_structcube(coastline_cube)\n", - "# # Remove all NaN's (grid squares that aren't on a coast).\n", - "# coastline_polydata = coastline_polydata.threshold()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "12b77c35-bccf-453a-aecc-8c2d3d477759", - "metadata": {}, - "outputs": [], - "source": [ - "def plot_projected(my_polydata, plotter=None):\n", - " \"\"\"Plot polydata on a given plotter\"\"\"\n", - " if plotter is None:\n", - " plotter = GeoPlotter()\n", - " # Add the coastline cells 'above' the data itself.\n", - " plotter.add_mesh(\n", - " coastline_polydata,\n", - " color=\"white\",\n", - " show_edges=True,\n", - " edge_color=\"white\",\n", - " radius=1.1, # For globe plots\n", - " zlevel=10, # For planar plots\n", - " )\n", - " plot_polydata = my_polydata.copy()\n", - " plotter.add_mesh(plot_polydata)\n", - " # if plotter.crs != WGS84:\n", - " # # Projected plot.\n", - " # plotter.camera_position = \"xy\"\n", - " # backend = \"static\"\n", - " # else:\n", - " # backend = \"pythreejs\"\n", - "# backend = \"static\"\n", - " plotter.show() # jupyter_backend=backend)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "64445361-645f-4c01-8f1d-a0c2317a5c3b", - "metadata": {}, - "outputs": [], - "source": [ - "# Plot these side-by-side ...\n" - ] } ], "metadata": { diff --git a/notebooks/Sec_03_Plotting.ipynb b/notebooks/Sec_03_Plotting.ipynb index 0994d44..5f49303 100644 --- a/notebooks/Sec_03_Plotting.ipynb +++ b/notebooks/Sec_03_Plotting.ipynb @@ -17,7 +17,7 @@ "id": "db2305c4-585a-46eb-9bd5-a68215ea3f63", "metadata": {}, "source": [ - "# 3D visualisation\n", + "## 3D visualisation\n", "\n", "While LFRic data can be presented in 2D plots with a map projection, it is often more profitable way to explore it with a 3D viewer. \n", "\n", @@ -28,15 +28,7 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "fa1f436f-44d5-4190-ae8c-83291535691b", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 14, + "execution_count": 1, "id": "0b5b0263-6a04-468f-9102-97383238e368", "metadata": { "tags": [] @@ -44,9 +36,9 @@ "outputs": [], "source": [ "# Essential setup\n", - "%matplotlib inline\n", - "import pyvista as pv\n", - "pv.rcParams[\"use_ipyvtk\"] = True" + "# %matplotlib inline\n", + "# import pyvista as pv\n", + "# pv.rcParams[\"use_ipyvtk\"] = True" ] }, { @@ -54,7 +46,7 @@ "id": "1b88968a-e91c-470b-8b8e-f4333cae027e", "metadata": {}, "source": [ - "### What Geovista is for\n", + "## What Geovista is for\n", "\n", " * **VTK** : highly mature 3D visualisation library (C++)\n", " * **PyVista** : VTK for normal humans (in Python)\n", @@ -73,14 +65,13 @@ "outputs": [], "source": [ "# Import things from Geovista\n", - "import geovista as gv\n", - "import geovista.theme" + "import geovista as gv" ] }, { "cell_type": "code", "execution_count": 4, - "id": "40bfda98-3795-4ead-aae7-d6b607b39ee3", + "id": "09c1686e-e950-4587-a736-b4ecd1022b97", "metadata": {}, "outputs": [], "source": [ @@ -92,34 +83,38 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, + "id": "90a0ff98-d0d3-41e8-bb79-8943b7210546", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(148, 180, 4)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sample.lats.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 6, "id": "f6941576-760c-4d22-b0b7-4227e384ea1a", "metadata": {}, "outputs": [], "source": [ "# Handy routine\n", + "import display_demo_routines\n", + "from importlib import reload\n", + "reload(display_demo_routines)\n", "\n", - "def trial_display(xx, yy, data, title=\"\") -> None:\n", - " # create the mesh from the sample data\n", - " mesh = gv.Transform.from_2d(xx, yy, data=data)\n", - "\n", - " # remove cells from the mesh with nan values\n", - " mesh = mesh.threshold()\n", - "\n", - " # plot the mesh\n", - " plotter = gv.GeoPlotter()\n", - " sargs = dict(title=f\"{sample.name} / {sample.units}\", shadow=True)\n", - " plotter.add_mesh(mesh, show_edges=True, scalar_bar_args=sargs)\n", - " plotter.add_base_layer(texture=gv.natural_earth_1())\n", - " plotter.add_coastlines()\n", - " plotter.add_axes()\n", - " plotter.add_text(\n", - " title,\n", - " position=\"upper_left\",\n", - " font_size=10,\n", - " shadow=True,\n", - " )\n", - " plotter.show()" + "from display_demo_routines import popup_2d_data_xx_yy\n" ] }, { @@ -127,26 +122,495 @@ "id": "4103669b-bf62-47c3-9392-645477453e74", "metadata": {}, "source": [ - "#### Geovista basic demo : an interactive plot of ocean data" + "## Geovista basic demo : an interactive plot of ocean data" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "id": "bf6d26c5-3363-4cc6-aa3a-c91e4cd48319", "metadata": {}, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[0m\u001b[33m2023-01-17 15:55:21.204 ( 237.745s) [ 2E7C0740] vtkThreshold.cxx:99 WARN| vtkThreshold::ThresholdBetween was deprecated for VTK 9.1 and will be removed in a future version.\u001b[0m\n" - ] + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "15237c3ce1424cbba798e00566afc105", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ViewInteractiveWidget(height=768, layout=Layout(height='auto', width='100%'), width=1024)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "popup_2d_data_xx_yy(sample, \"ORCA test data\")" + ] + }, + { + "cell_type": "markdown", + "id": "13d0d7a8-2784-4873-bac1-31214e91ce86", + "metadata": {}, + "source": [ + "**NOTE**\n", + " * Geovista is not Iris-dependent\n", + " * Iris does not (yet) fully integrate Geovista\n", + " * .. therefore user code is currently needed to bridge the two\n", + " * .. **but** the gap is fairly small, and this makes Geovista more generally useful\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "605153c6-365f-47a7-8ee0-385e7671fa2a", + "metadata": {}, + "source": [ + "## Create a plotter, and display 3D visualisation\n", + "\n", + "The above example shows some interesting features, but it is only a 'potted' demonstration. \n", + "Let's grab some actual LFRic data and examine the actual plotting mechanism in a bit more detail. \n", + "\n", + "The simplest way, as seen in [Sec#02 - Quick 3d plotting](./Sec_02_Meshes.ipynb#Quick-3d-plotting), is just to call `PolyData.plot()`, but that is rather limited in what it can do.\n", + "\n", + "For more control, we need to deal with the GeoVista/PyVista `Plotter` object. \n", + "The full process for this requires a number of several discrete steps ...\n", + "\n", + "**(1) First load in the same 2D 'relative_humidity' datacube we loaded back in [Section#02 \"Fetch some sample data\"](./Sec_02_Meshes.ipynb#Fetch-some-sample-unstructured-data,-as-used-in-Section#01)**" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "f1ba1220-14d3-43e8-88b4-5cf2f7e41723", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: remove when switched to fulltime lower-res test data\n", + "from testdata_fetching import switch_data\n", + "switch_data(use_newer_smaller_c48_data=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "b31e909d-ff33-461a-9689-39bb5c0e9f41", + "metadata": {}, + "outputs": [], + "source": [ + "from testdata_fetching import lfric_rh_singletime_2d\n", + "lfric_rh = lfric_rh_singletime_2d()" + ] + }, + { + "cell_type": "markdown", + "id": "5957460c-1915-4344-82dd-66b92c9af359", + "metadata": {}, + "source": [ + "---\n", + "\n", + "**(2) convert the Iris cube to a PyVista `PolyData`, as in [Section#02 \"Convert a cube to PyVista form\"](./Sec_02_Meshes.ipynb#Convert-a-cube-to-PyVista-form-for-plotting)**" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "fe9923ba-e4b7-46ff-8235-0c1810eb82c7", + "metadata": {}, + "outputs": [], + "source": [ + "from pv_conversions import pv_from_lfric_cube\n", + "pv = pv_from_lfric_cube(lfric_rh)" + ] + }, + { + "cell_type": "markdown", + "id": "f4bc521f-1881-489c-9bde-6105655b8544", + "metadata": {}, + "source": [ + "---\n", + "\n", + "Now, we need a [PyVista \"plotter\"](https://docs.pyvista.org/api/plotting/_autosummary/pyvista.Plotter.html#pyvista.Plotter) object to display things in 3D. \n", + "Since our data is geo-located, we will use the special subtype `GeoPlotter`, from [GeoVista](https://github.com/bjlittle/geovista#philisophy) for this.\n", + "\n", + "**Import the class `GeoPlotter` from the `geovista` package, and create one** (with no arguments)\n", + "
Sample code solution : click to reveal\n", + "\n", + "```python\n", + "from geovista import GeoPlotter\n", + "plotter = GeoPlotter()\n", + "```\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "9cfaa77a-cae2-49f0-9dcb-f0ff0d146867", + "metadata": {}, + "outputs": [], + "source": [ + "from geovista import GeoPlotter\n", + "plotter = GeoPlotter()" + ] + }, + { + "cell_type": "markdown", + "id": "46e337d9-4b1a-468e-82c4-9a7de167232c", + "metadata": {}, + "source": [ + "Note: various control arguments can be added to `GeoPlotter()`. \n", + "But none are required by default.\n", + "\n", + "---\n", + "\n", + "**Now call the plotter `add_mesh` function, passing in our PolyData object with the Rh cube data in it.** \n", + "( **N.B.** don't worry about the object which this passes back -- just discard it, for now ).\n", + "
Sample code solution : click to reveal\n", + "\n", + "```python\n", + "_ = plotter.add_mesh(pv)\n", + "```\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "73305329-3509-4d70-aa7c-b901ef5d667f", + "metadata": {}, + "outputs": [], + "source": [ + "_ = plotter.add_mesh(pv)" + ] + }, + { + "cell_type": "markdown", + "id": "d98b11b4-b2f7-4276-a471-28d8b01e92cf", + "metadata": {}, + "source": [ + "---\n", + "\n", + "**Finally, simply plot this, by calling the plotter function \"show\" (with no args).**\n", + "
Sample code solution : click to reveal\n", + "\n", + "```python\n", + "plotter.show()\n", + "```\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d213f99-faf3-4f3a-a159-a021a9478539", + "metadata": {}, + "outputs": [], + "source": [ + "plotter.show()" + ] + }, + { + "cell_type": "markdown", + "id": "f7353ec4-56a9-4726-a7a3-3d2959410daa", + "metadata": {}, + "source": [ + "**Some odd notes:**\n", + " * VTK/PyVista doesn't use plot \"types\". \n", + " Instead, you add meshes to a plotter + can subsequently control the presentation.\n", + " * By default, `plotter.show()` opens an interactive window : **you can rotate and zoom it with the mouse**.\n", + " * you can instead generate static output \n", + " * in a notebook, you do this with `jupyter_backend='static'`\n", + " * or in a Python session, try `interactive=False`\n", + " * GeoVista can also produce more familiar 2D plots (described in a later section ...)\n" + ] + }, + { + "cell_type": "markdown", + "id": "cde0e7c6-bfdb-4bef-bc19-625bfdf1e898", + "metadata": {}, + "source": [ + "***TODO:*** can suggest some of these as follow-on exercises" + ] + }, + { + "cell_type": "markdown", + "id": "745cd7fd-ba22-4fd6-8afb-15fc47da4d27", + "metadata": {}, + "source": [ + "## Additional features\n", + "\n", + "The above hasn't yet added anything to the basic `PolyData.plot()` call.\n", + "\n", + "However, when you create your own GeoPlotter, you can do a lot more to control the view, and add useful aspects.\n", + "\n", + "**What can each of the following GeoPlotter methods do ?...**\n", + "( N.B. there is no rendered GeoVista API yet, but you can see the code docstrings, e.g. [here] )\n", + " * **`add_coastlines`**\n", + " * **`add_axes`**\n", + " * **`add_base_layer`** (hint: look in the source of the `demo_display_2d_xx_yy_data` routine)\n", + " * **`add_camera_orientation_widget`**\n", + "\n", + "Note : of these, 'coastlines' and 'base_layer' are GeoVista concepts, while 'axes' and 'camera_orientation_widget' are from PyVista. The `GeoPlotter` is simply a specialised (extended) version of a `PyVista.Plotter`.\n", + "\n", + "Another very useful resource is the GeoVista runnable examples. \n", + "See : https://github.com/bjlittle/geovista/tree/main/src/geovista/examples" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "506ab6ac-0402-41d4-a03a-62725edbf5b1", + "metadata": {}, + "outputs": [], + "source": [ + "# .. space for user code (E.G. try \"add_coastlines\") ..." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "a0672533-e726-4117-9527-5247fa1fa269", + "metadata": {}, + "outputs": [], + "source": [ + "# .. space for user code (E.G. try \"add_base_layer\") ..." + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "47b098b4-dc3f-4cff-aa9a-7dcb03c48210", + "metadata": {}, + "outputs": [], + "source": [ + "# .. space for user code (E.G. try \"add_axes\") ..." + ] + }, + { + "cell_type": "markdown", + "id": "2c003d32-4c57-45da-8034-c692c9949ec1", + "metadata": {}, + "source": [ + "# Comparing UM and LFRic fields" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "75fa9c8f-317f-4163-8036-72c4e7c291f7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "
Um Rh Data (%)latitudelongitude
Shape144192
Dimension coordinates
\tlatitudex-
\tlongitude-x
Scalar coordinates
\tforecast_period21600 seconds
\tforecast_reference_time2021-03-24 00:00:00
\theight1.5 m
\ttime2021-03-24 06:00:00
Attributes
\tConventions'CF-1.7'
\tSTASHm01s03i245
\tsource'Data from Met Office Unified Model'
\tum_version'12.2'
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from testdata_fetching import um_rh_singletime_2d\n", + "#um_rh = iris.load_cube(um_filepth, 'relative_humidity')\n", + "um_rh = um_rh_singletime_2d()\n", + "# Rename so we are clear which model this came from\n", + "um_rh.rename('UM Rh data')\n", + "um_rh" + ] + }, + { + "cell_type": "markdown", + "id": "4a57aece-f9b3-467a-b26a-6277517fa744", + "metadata": {}, + "source": [ + "---\n", + "\n", + "Just as a reference, let's quickly show that on an old-style Iris matplotlib plot.\n", + "\n", + "**Display this cube (ordinary, \"structured\" data) by passing it into the routine `iris.quickplot.pcolormesh`.**" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "25d9d1a3-44c0-4f8b-b6fd-d909e94cc54f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" }, + { + "data": { + "image/png": "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l4x0n//85zE4OOj9vfLKK3WqcW247bbbjOs9fPiwF/fzn/8czz77LDZs2ID9+/cjmUzic5/7HIaHh+tY4+vL/v37jfuxc+dOAMCDDz7opRnLbeTSpUuYO3cuNmzYYI2vpk1873vfw0svvYRt27Zh3759uHjxIpYtW4ZC4b9zDXO5ezIyMoKDBw/iySefxMGDB7F9+3b85z//wfLly0Np16xZY7SbjRs31qL614VK7QSo/J40UjsBYNyLwcFBPPfcc3AcB1/60peMdDVpJ4oYnD59WgFQe/fu9cJWr16t7r///vpVqsY89dRTau7cuda4YrGoksmkeuaZZ7ywdDqtOjs71W9+85sa1bD+PPLII2rmzJmqWCwqpRqrjQBQL730kndcTZsYGhpSzc3Natu2bV6a9957T8ViMfWnP/2pZnW/XgTviY1//OMfCoA6fvy4F7Z48WL1yCOPXN/K1QnbPan0nrCdKHX//ferJUuWGGG1aicNryEIcv78eQBAV1eXEb5nzx5MmTIFs2bNwpo1a3D69Ol6VK9mDAwMoKenBzNmzMDKlStx9OhRAEAqlcLJkyexdOlSL21LSwsWL16MV199tV7VrSnZbBa//e1v8bWvfQ2O8MjYaG1EU02bOHDgAHK5nJGmp6cHvb29DdNuzp8/D8dxMGHCBCP8hRdewKRJk3DbbbfhscceG9OaNqD8e9Lo7eTUqVPYsWMHvv71r4fiatFORuW6eKyjlML3v/993HXXXejt7fXC+/r68OCDD2L69OlIpVJ48sknsWTJEhw4cAAtLS11rPH14dOf/jSef/55zJo1C6dOncJPf/pT3Hnnnejv78fJkycBAFOnTjXyTJ06FcePH69HdWvOyy+/jKGhITz88MNeWKO1EUk1beLkyZNIJBKYOHFiKI3OP5ZJp9P4wQ9+gK9+9asYP368F/7QQw9hxowZSCaTeOONN/DDH/4Q//znP70pqbFGpfek0dvJ1q1b0dHRgQceeMAIr1U7oUAgWLduHf71r39h3759RviKFSu83729vbjjjjswffp07NixI/TgxgJ9fX3e7zlz5mDRokWYOXMmtm7d6hkAyZExUBKmgmFjlU2bNqGvrw89PT1eWKO1ERtX0iYaod3kcjmsXLkSxWIRv/rVr4y4j9VU/AAABbZJREFUNWvWeL97e3tx66234o477sDBgwcxb968Wlf1unOl70kjtBMAeO655/DQQw+FvArWqp1wysBl/fr1+OMf/4jdu3dj2rRpZdN2d3dj+vTpGBgYqFHt6kt7ezvmzJmDgYEBb7VBUFo/ffp0aIQ4Fjl+/Dh27dqFb3zjG2XTNVIbqaZNJJNJZLNZnDt3LjLNWCSXy+HLX/4yUqkUdu7caWgHbMybNw/Nzc0N0W6A8HvSqO0EAP72t7/hyJEjFfsW4Pq1k4YXCJRSWLduHbZv346//OUvmDFjRsU8Z86cwTvvvIPu7u4a1LD+ZDIZvPXWW+ju7vbUVlJVlc1msXfvXtx55511rGVt2Lx5M6ZMmYL77ruvbLpGaiPVtIn58+ejubnZSDM4OIg33nhjzLYbLQwMDAxg165duOGGGyrm6e/vRy6Xa4h2A4Tfk0ZsJ5pNmzZh/vz5mDt3bsW0162dXHezxY843/72t1VnZ6fas2ePGhwc9P5GRkaUUkoNDw+rRx99VL366qsqlUqp3bt3q0WLFqkbb7xRXbhwoc61vz48+uijas+ePero0aPqtddeU8uWLVMdHR3q2LFjSimlnnnmGdXZ2am2b9+uDh8+rL7yla+o7u7uMXs/NIVCQd18883qiSeeMMIboY0MDw+rQ4cOqUOHDikA6tlnn1WHDh3yLOaraRPf+ta31LRp09SuXbvUwYMH1ZIlS9TcuXNVPp+v12VdFeXuSS6XU8uXL1fTpk1Tr7/+utG3ZDIZpZRSb7/9tvrxj3+s9u/fr1KplNqxY4eaPXu2uv3228fkPan2PWmkdqI5f/68GjdunPr1r38dyl/LdtLwAgFKGzqH/jZv3qyUUmpkZEQtXbpUTZ48WTU3N6ubb75ZrV69Wp04caK+Fb+OrFixQnV3d6vm5mbV09OjHnjgAdXf3+/FF4tF9dRTT6lkMqlaWlrU3XffrQ4fPlzHGteGP//5zwqAOnLkiBHeCG1k9+7d1vdk9erVSqnq2sTly5fVunXrVFdXl2pra1PLli37r75H5e5JKpWK7Ft2796tlFLqxIkT6u6771ZdXV0qkUiomTNnqu9+97vqzJkz9b2wq6DcPan2PWmkdqLZuHGjamtrU0NDQ6H8tWwn3O2QEEIIIbQhIIQQQggFAkIIIYSAAgEhhBBCQIGAEEIIIaBAQAghhBBQICCEEEIIKBAQQgghBBQICCGEEAIKBIQQQggBBQJCGo4XXngBN910E7q6uvD4448bcceOHcOsWbNw4cKFOtWOEFIv6LqYkAbiww8/xE033YQtW7bglltuwX333YfNmzd7uzf29fVhzZo1ZfemJ4SMTaghIKSBOHr0KDo7O7FixQosWLAAn/3sZ/Hmm28CAH73u98hkUhQGCCkQaFAQEgDceutt2JkZASHDh3C2bNnsX//fnzqU5/C2bNn8aMf/QgbNmyodxUJIXWCAgEhDcTEiROxdetWrFq1CgsXLsSqVatw77334rHHHsP69euRSqVw++23o7e3Fy+++GK9q0sIqSG0ISCkwdmzZw8ef/xx7N27F5/4xCfw+9//HslkEgsXLsTAwACmTJlS7yoSQmoANQSENDCZTAbf+c53sHHjRrz99tvI5/NYvHgxPvnJT2LWrFn4+9//Xu8qEkJqBAUCQhqYn/zkJ+jr68O8efNQKBSQz+e9uFwuh0KhUMfaEUJqSVO9K0AIqQ/9/f34wx/+gNdffx0AMHv2bMRiMWzatAnJZBL//ve/sWDBgvpWkhBSMygQENKAKKXwzW9+E7/85S/R3t4OAGhra8OWLVuwdu1aZDIZbNiwATfeeGOda0oIqRU0KiSEEEIIbQgIIYQQQoGAEEIIIaBAQAghhBBQICCEEEIIKBAQQgghBBQICCGEEAIKBIQQQggBBQJCCCGEgAIBIYQQQkCBgBBCCCGgQEAIIYQQAP8PTMZqPJCtLbIAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import iris.quickplot as qplt\n", + "qplt.pcolormesh(um_rh)" + ] + }, + { + "cell_type": "markdown", + "id": "f369d191-6071-451b-a47d-40b4a1abb90c", + "metadata": {}, + "source": [ + "---\n", + "Now to plot this in 3d. \n", + "\n", + "For this, we have another utility routine which allows us to convert \"ordinary\" structured cubes into PyVista `PolyData`.\n", + "\n", + "**Convert this UM cube to a PolyData, with the routine `pv_conversions.pv_from_um_cube`, and display it in 3D.** " + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "d54b18fb-6fc3-49e9-a293-5820be7da3d9", + "metadata": {}, + "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "3801c9baf3e14163bbedf3db6ceabc52", + "model_id": "770c2c159a3142b3a5082efb6f5fde3c", "version_major": 2, "version_minor": 0 }, @@ -159,31 +623,192 @@ } ], "source": [ - "trial_display(sample.data, sample.lats, sample.lons, \"ORCA test data\")" + "from pv_conversions import pv_from_um_cube\n", + "um_pv = pv_from_um_cube(um_rh)\n", + "um_pv.plot()" ] }, { "cell_type": "markdown", - "id": "9ce4f44d-be41-4f79-9895-f92171d332b7", + "id": "f33d74da-f2f9-43f3-983c-885d79c7d942", "metadata": {}, "source": [ - "sdsadas&\n", + "**Note :** \n", + "This is still traditional \"structured\" data on its original UM lat-lon grid.\n", "\n", - "\n" + "You can see this clearly by zooming in on a pole, where the cells get very narrow." ] }, { "cell_type": "markdown", - "id": "13d0d7a8-2784-4873-bac1-31214e91ce86", + "id": "dedd186f-6d98-43ea-a229-525685a8c79a", "metadata": {}, "source": [ - "**NOTE**\n", - " * Geovista is not Iris-dependent\n", - " * Iris does not (yet) fully integrate Geovista\n", - " * .. therefore user code is currently needed to bridge the two\n", - " * .. **but** the gap is fairly small, and this makes Geovista more generally useful\n", + "## Simple side-by-side plotting : UM vs LFRic data\n", "\n", - "\n" + "Let's compare the matched UM and LFRic data fields by eye, in side-by-side 3D view.\n", + "\n", + "This is mostly a demonstration of what can be achived, somewhat complicated, \n", + "so we have provided another utility routine ...\n", + "\n", + "**import the function `side_by_side_plotter` from `display_demo_routines`, and apply it to the UM and LFRic data cubes as arguments. \n", + "Then display the `Plotter` which this returns.**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8abc8959-3c15-40cc-ba55-378fb34d1427", + "metadata": {}, + "outputs": [], + "source": [ + "from display_demo_routines import side_by_side_plotter\n", + "plt = side_by_side_plotter(pv, um_pv)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ba571cc-0bc9-468e-a81c-98c11f1c1806", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "a0ced5da-ddb9-4ae6-ac1f-dadef35e5b2c", + "metadata": {}, + "source": [ + "## A handy hint : how to record + re-use a camera view" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a40ce0bc-9b0c-4938-b29b-c16e413b1d5c", + "metadata": {}, + "outputs": [], + "source": [ + "viewpoint = my_plotter.camera_position\n", + "viewpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc9484f4-7edc-499a-a0be-39f8db4b90ae", + "metadata": {}, + "outputs": [], + "source": [ + "# This pre-loaded position focusses on a cubesphere \"corner\" in the middle East\n", + "viewpoint = [\n", + " (0.9550352379408845, 0.9378277371075855, 0.9637172962958191),\n", + " (0.0, 0.0, 0.0),\n", + " (-0.3202752464164225, -0.5004192729867466, 0.8043657860428399)\n", + "]\n", + "viewpoint = [\n", + " (1.1555926379084704, 1.1347715619001786, 1.1660979285179414),\n", + " (0.0, 0.0, 0.0),\n", + " (-0.3202752464164226, -0.5004192729867467, 0.80436578604284)\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5eb8be9f-feba-433f-949b-3461ed127049", + "metadata": {}, + "outputs": [], + "source": [ + "# Plot just the LFRIC data with the same view ...\n", + "new_plotter = GeoPlotter()\n", + "new_plotter.add_coastlines()\n", + "new_plotter.add_mesh(pv, show_edges=True)\n", + "new_plotter.camera_position = viewpoint\n", + "new_plotter.show(jupyter_backend='static')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7d252a64-f4ca-481b-a8df-a92387f4479d", + "metadata": {}, + "outputs": [], + "source": [ + "new_plotter.camera_position" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e04f8a10-77cb-4c9d-bc0b-6b7ee3bfc7f2", + "metadata": {}, + "outputs": [], + "source": [ + "# WIP : projected 2D plotting" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e61e2c1-7907-47c4-8517-ad70096c1a08", + "metadata": {}, + "outputs": [], + "source": [ + "# GeoVista coastline projection not yet supported. Use a representation of coastlines as Cube data instead.\n", + "\n", + "# import requests\n", + "# r = requests.get(\"https://github.com/SciTools-incubator/presentations/raw/main/ngms_champions_2022-04-12/coastline_grid.nc\")\n", + "# open(\"coastline_grid.nc\", \"wb\").write(r.content)\n", + "\n", + "# coastline_cube = iris.load_cube(\"coastline_grid.nc\")\n", + "\n", + "# coastline_polydata = pv_from_structcube(coastline_cube)\n", + "# # Remove all NaN's (grid squares that aren't on a coast).\n", + "# coastline_polydata = coastline_polydata.threshold()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2d56c7b-b80e-488d-8a74-fe57e5dbc567", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_projected(my_polydata, plotter=None):\n", + " \"\"\"Plot polydata on a given plotter\"\"\"\n", + " if plotter is None:\n", + " plotter = GeoPlotter()\n", + " # Add the coastline cells 'above' the data itself.\n", + " plotter.add_mesh(\n", + " coastline_polydata,\n", + " color=\"white\",\n", + " show_edges=True,\n", + " edge_color=\"white\",\n", + " radius=1.1, # For globe plots\n", + " zlevel=10, # For planar plots\n", + " )\n", + " plot_polydata = my_polydata.copy()\n", + " plotter.add_mesh(plot_polydata)\n", + " # if plotter.crs != WGS84:\n", + " # # Projected plot.\n", + " # plotter.camera_position = \"xy\"\n", + " # backend = \"static\"\n", + " # else:\n", + " # backend = \"pythreejs\"\n", + "# backend = \"static\"\n", + " plotter.show() # jupyter_backend=backend)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f41a5a31-2e00-4f39-8505-d261a4d9c053", + "metadata": {}, + "outputs": [], + "source": [ + "# Plot these side-by-side ...\n" ] } ], @@ -204,7 +829,8 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.15" - } + }, + "toc-showmarkdowntxt": false }, "nbformat": 4, "nbformat_minor": 5 diff --git a/notebooks/Sec_04_RegionExtraction.ipynb b/notebooks/Sec_04_RegionExtraction.ipynb new file mode 100644 index 0000000..5adb956 --- /dev/null +++ b/notebooks/Sec_04_RegionExtraction.ipynb @@ -0,0 +1,1181 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f3ece436-9fe8-4e3f-9dd1-990c82c3efdd", + "metadata": {}, + "source": [ + "# Section 4 : Extracting a region from mesh-based data\n", + "\n", + "This process is considerably more involved than with \"structured\" data like UM.\n", + "\n", + "For instance, UM data has data and coordinates with X and Y dimensions, corresponding to cell indices in the model arrays, and longitudes and latitudes of cells on the globe. \n", + "Therefore, we can slice out a rectangular range of X and Y indices, e.g. `my_datacube[..., 10:40, 4:77]` and the result is some contiguous region of the globe within a defined range of latitude+longitude.\n", + "\n", + "However, the unstructured mesh does not visit locations on the globe in any particular, simple regular pattern. So crucially, a slice of data from the (now 1-D) arrays is not a contiguous geographical region. And conversely a contiguous region of the data is generally not contained in a contiguous range of data indices. \n", + "( *TODO: picture of this ?* )\n", + "\n", + "So we must use geographical calculations to extract mesh data within a required region. \n", + "Since this is a geographical concept, Geovista provides support for it. \n", + "This is also a good match since, with larger data this can become quite compute-intensive :\n", + "Processing via VTK should be performant and scalable, and can benefit from GPU accelaration.\n", + "\n", + "Here's an example of how to extract the mesh falling within a defined lat-lon region ... \n", + "**NOTE: as with the plotting example, there are no Iris utility functions for this, so a fair amount of user code is currently required to mediate between the Iris and Geovista/PyVista worlds.**" + ] + }, + { + "cell_type": "markdown", + "id": "3a175eb0-8956-4754-ac89-f554250afd7f", + "metadata": {}, + "source": [ + "---\n", + "\n", + "**First, import the utility function `lfric_rh_datacube` from `testdata_fetching`, and call it to get a global LFRic test cube.**" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "0d189559-f75e-4872-a4bb-6509393c4394", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "
Relative Humidity At Screen Level (1)--
Shape221184
Mesh coordinates
\tlatitudex
\tlongitudex
Mesh
\tnameTopology data of 2D unstructured mesh
\tlocationface
Scalar coordinates
\tforecast_period21600 seconds
\tforecast_reference_time2021-03-24 00:00:00
\ttime2021-03-24 06:00:00
Cell methods
\tpointtime
Attributes
\tConventions'CF-1.7'
\tdescription'Created by xios'
\tinterval_operation'6 h'
\tinterval_write'6 h'
\tonline_operation'instant'
\ttitle'Created by xios'
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 102, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from testdata_fetching import lfric_rh_singletime_2d\n", + "lfric_rh = lfric_rh_singletime_2d()\n", + "lfric_rh" + ] + }, + { + "cell_type": "markdown", + "id": "fe96bfb8-1dda-43ef-83bc-8e06c360e6bd", + "metadata": {}, + "source": [ + "**Create a Polydata object from this.** \n", + "Use the routine `pv_from_lfric_cube` from the package `pv_conversions`, which we used in the plotting section." + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "id": "db0280ff-3ebd-42c9-a9eb-8f9c8117eeee", + "metadata": {}, + "outputs": [], + "source": [ + "from pv_conversions import pv_from_lfric_cube\n", + "pv_global_rh = pv_from_lfric_cube(lfric_rh)" + ] + }, + { + "cell_type": "markdown", + "id": "d9ee71c7-e3cc-4479-aea9-2972c0424bd5", + "metadata": {}, + "source": [ + "---\n", + "\n", + "Now we will create a tool to extract over a desired region." + ] + }, + { + "cell_type": "markdown", + "id": "9b3b61bc-d827-4faf-93ee-637a020cd496", + "metadata": {}, + "source": [ + "**Import the class `BBox` from `geovista.geodesic`, and make one...** " + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "2e7b1bd1-f126-4900-a8bc-a56e4c98dca6", + "metadata": {}, + "outputs": [], + "source": [ + "from geovista.geodesic import BBox" + ] + }, + { + "cell_type": "markdown", + "id": "01602100-f556-475a-a470-f7459a04371a", + "metadata": {}, + "source": [ + "Note: the name here is short for \"Bounding Box\".\n", + "\n", + "**Use the notebook \"?\" command to display the function signature of its constructor : `?BBox.__init__`**" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "c914e991-5400-4912-9771-db367b9058f8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[0;31mSignature:\u001b[0m\n", + "\u001b[0mBBox\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mlons\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__array_like\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_SupportsArray\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__nested_sequence\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NestedSequence\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__array_like\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_SupportsArray\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcomplex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbytes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__nested_sequence\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NestedSequence\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcomplex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbytes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mlats\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__array_like\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_SupportsArray\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__nested_sequence\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NestedSequence\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__array_like\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_SupportsArray\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcomplex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbytes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__nested_sequence\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NestedSequence\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcomplex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbytes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mellps\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mOptional\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'WGS84'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mOptional\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m256\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mtriangulate\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mOptional\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mDocstring:\u001b[0m\n", + "Create a 3D geodesic bounding-box for extracting an enclosed surface, lines\n", + "or points.\n", + "\n", + "The bounding-box region is specified in terms of its four corners, in\n", + "degrees of longitude and latitude. As the bounding-box is a geodesic, it\n", + "can only ever at most enclose half of an ellipsoid.\n", + "\n", + "The geometry of the bounding-box may be specified as either an open or\n", + "closed longitude/latitude geometry i.e., 4 or 5 longitude/latitude values.\n", + "\n", + "Parameters\n", + "----------\n", + "lons : ArrayLike\n", + " The longitudes (degrees) of the bounding-box, in the half-closed interval\n", + " [-180, 180). Note that, longitudes will be wrapped to this interval.\n", + "lats : ArrayLike\n", + " The latitudes (degrees) of the bounding-box, in the closed interval [-90, 90].\n", + "ellps : str, default=ELLIPSE\n", + " The ellipsoid for geodesic calculations. See :func:`pyproj.get_ellps_map`.\n", + "c : float, default=BBOX_C\n", + " The bounding-box face geometry will contain ``c**2`` cells.\n", + "triangulate : bool, default=False\n", + " Specify whether the bounding-box faces are triangulated.\n", + "\n", + "Notes\n", + "-----\n", + ".. versionadded:: 0.1.0\n", + "\u001b[0;31mFile:\u001b[0m /net/home/h05/itpp/git/geovista/src/geovista/geodesic.py\n", + "\u001b[0;31mType:\u001b[0m function" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "?BBox.__init__" + ] + }, + { + "cell_type": "markdown", + "id": "96e6e603-94c0-48c8-85d2-0f397bca9010", + "metadata": {}, + "source": [ + "---\n", + "\n", + "**Create a BBox to specify a bounding rectangle in lat-lon space.** \n", + "Give it `lons` and `lats` arguments which specify the points of a bounding rectangle,\n", + "in lat-lon space, from 0..70 in longitude and -24..+45 in latitude. \n", + "( *Note:* do ***not*** supply a duplicate 'end' point -- a closed loop is automatically generated. )" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "22f13977-864b-4c49-be0d-5d6e158bbd9e", + "metadata": {}, + "outputs": [], + "source": [ + "bbox = BBox(lons=[0, 70, 70, 0], lats=[-25, -25, 45, 45])" + ] + }, + { + "cell_type": "markdown", + "id": "32c47cdb-477d-4f0c-87e1-2f7c960163b3", + "metadata": {}, + "source": [ + "---\n", + "\n", + "**Now \"apply\" the BBox to the global mesh data, by passing it to the `BBox.enclosed` method.** \n", + "And show the resulting object printout." + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "f7dfaa88-43d6-4f4e-8f40-ce4ff4a594d4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
HeaderData Arrays
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
PolyDataInformation
N Cells27029
N Points27380
N Strips0
X Bounds2.370e-01, 1.000e+00
Y Bounds-8.181e-03, 9.415e-01
Z Bounds-5.033e-01, 7.787e-01
N Arrays5
\n", + "\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
NameFieldTypeN CompMinMax
SelectedPointsPointsuint810.000e+001.000e+00
relative_humidity_at_screen_levelCellsfloat6412.368e+001.118e+02
gvCRSFields1nannan
gvRadiusFieldsfloat6411.000e+001.000e+00
gvNameFields1nannan
\n", + "\n", + "
" + ], + "text/plain": [ + "PolyData (0x7ffb6c0317c0)\n", + " N Cells:\t27029\n", + " N Points:\t27380\n", + " N Strips:\t0\n", + " X Bounds:\t2.370e-01, 1.000e+00\n", + " Y Bounds:\t-8.181e-03, 9.415e-01\n", + " Z Bounds:\t-5.033e-01, 7.787e-01\n", + " N Arrays:\t5" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 'Apply' the region to the PolyData object.\n", + "pv_regional_rh = bbox.enclosed(pv_global_rh)\n", + "pv_regional_rh" + ] + }, + { + "cell_type": "markdown", + "id": "0ad463e2-f480-44fd-b3f5-9e325e039c1a", + "metadata": {}, + "source": [ + "You can see that this new (regional) PolyData has fewer cells than the original (global) one.\n", + "\n", + "---\n", + "**Now plot this to see what it looks like.** \n", + "Note : in this case, it will be very useful to add coastlines for reference.\n", + "Use the techniques from [Sec#2 Plotting - Additional features](./Sec_03_Plotting.ipynb#Additional-features)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6661ad89-859e-4fc0-a56a-461abef6b4bb", + "metadata": {}, + "outputs": [], + "source": [ + "from geovista import GeoPlotter\n", + "plotter = GeoPlotter()\n", + "plotter.add_mesh(pv_regional_rh)\n", + "plotter.add_coastlines()\n", + "plotter.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "ac098bbe-7773-43cb-916f-e17134775989", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABAAAAAMACAIAAAA12IJaAAEAAElEQVR4nOzdd7xsV1k38N9au0w/9Z52a+5NhfQQCIgUkeZrIihVQgvJDU0IiKAighRB8RVBipCE0BGlG1D0RQTphPSEJDfJ7feeXqfuttb7x9ozZzhl7ultft9PPjB3zp49e/bMOfM8az/rWeLyyy8HERERERE1B7neB0BERERERGuHCQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETYQJARERERNREmAAQERERETURJgBERERERE2ECQARERERURNhAkBERERE1ESYABARERERNREmAERERERETYQJABERERFRE2ECQERERETURJgAEBERERE1ESYARERERERNhAkAEREREVETsdf7AIiIaI3cfPPNq7HbK664YjV2S0REq0Rcfvnl630MRES0XEsL7mfE7o13MjvQX+z2RES0ETABICLauDbUmP2cBzPnrha+JRERrT0mAEREG8gqRfw1KxuFzzja+XY++0VdccUVN998M1MCIqJ1wQSAiGg9nXKw3GxQHzEvPElY4zh7vgOb/XJOuRkREa0eJgBEROtjgaH/km2ceHpF5icQEdFKYQJARLR2lhzTm7H8xT5kac+1NmpXNmbc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gIYQAAAAAAANIQAAAAAAGkIAAAAAADSEAAAAAABoCAEAAAAA0BACAAAAAKAhBAAAAABAQwgAAAAAgIYQAAAAAAANIQAAAAAAGkIAAAAAADSEAAAAAABoCAEAAAAA0BACAAAAAKAhBAAAAABAQwgAAAAAgIYQAAAAAAANIQAAAAAAGkIAAAAAADSEAAAAAABoCAEAAAAA0BACAAAAAKAhBAAAAABAQwgAAAAAgIYQAAAAAAANIQAAAAAAGkIAAAAAADSEAAAAAABoCAEAAAAA0BACAADAjpkzZ86YMcOFFfv165eamtq8efPrr8pl9b9F1xrg4eGRmpo6cOBAu2vZ7sn61LBb/wtqwIOqwY9nND4EAAAAAEBDDA3dAABAI7dx40aTydTQrahXrn1kDe4oAA2CAAAAuLG2bNnS0E2ob659ZA3uKAANggAAAI3ZzJkzjUbjggULhg0b5uPjM2XKFGW5n5/fU089FRIS0qZNm3Pnzu3Zs2fVqlV5eXk1VNWyZcunnnqqXbt2QUFBly9f3r9//7Jly06fPr148eKPP/74559/TkpK6tChg1J48eLFQojly5cvWrTo9ddfNxqNb7311r/+9a/Q0NAXXnhBlmWryj/44IPz589Pnz7d5ebZ8vHxGTFiRFhYmI+PT05Ozq+//pqWlma1Z9566y2rtcaOHdujR49Ro0ZZynzxxRejRo26++67ZVneuXPn559/fvbs2YCAgBEjRnTq1EkIkZOTk56e/uuvv1oqsXxkyxJfX98hQ4aEhIS0bdu2rKxs7969y5YtO3XqlHrTlrXs7smWLVv26NFjxIgRZWVl6rU6d+78zjvvzJw5c/PmzY7sFpf7seZqfX19n3/++S5duly5cmXdunVLliwxGo2Wd729vYcMGRIaGhocHFxaWpqbm5uamrpr1y5Lges8UGstptSflJQ0cuTIjh07+vr65uTkZGdnr1692pGdZlfNG63nox1wCgEAABo5X1/fhISECxcuZGZmKkuioqJefPHFkpKSX375JSMjw9/f/8EHH4yOjp43b15GRobdSiIjI1988cXy8vLs7OwNGza0bNmya9eus2bN+vrrry1lFi9e7O3t3aVLl969e3/yySeXLl06fvy4upK0tLTo6Oh77713586d6uUhISHt2rWznA+50Dxb/v7+ycnJ58+fz8rKunLlSqdOnV544YXOnTvPmjWroqLCwUqEEG3atPn3v/+9devWxYsX+/n59erVa9asWcnJyW+//faZM2fS0tIuXbrUrVu3yZMnL1q0KCUlxW4lPXv2HD9+vLL3MjMzW7Vq1aVLl+Tk5C+++MJuebt70svLKzo6+sEHH1y3bp26cP/+/YuLix389aBO+tGWJElTpky5/fbb09PTfXx8nnrqKaPRuGTJEuXd+++/f8KECSaTafPmzZs2bfL09OzevfuMGTMyMjLmzJljyQkuH6gOFvP391fOvJVDomPHjnFxccoh4cKdV7VutD6PdsBZBAAAaOTatm2bkpKyaNEi5UpkcHDwhAkTMjMz58yZYzkV/uabb5577rnx48cXFRWpr8sqgoKCJk6cuHPnztmzZ5eUlCgLFy1aNGTIkP/7v/+zFNu9e7cQwsvLq3fv3tnZ2ZaSFgcPHjxy5Ej//v2tToliYmJOnTq1Y8cO15pnV0BAwOrVq+fNm6ec2y1fvnzAgAFjxoyJioqyOoGumZ+f39y5c9PT05WXq1at+vjjj9999919+/ZNnz5duRj//fffx8XFxcbGbtq06fTp01Y1BAYGvvzyy8reKy0tVRbqdLpBgwaNHTvW7kar25MnTpzo27evuv1+fn7333//N99848gpbF31o63WrVuHhoZadlTTpk0tvyEEBAS8+uqrv//++4cffmip6ttvvx05cuTgwYNLSkq+/PJLZaFrB6rjB0xAQMCqVas+//xzpf6UlJQ+ffrEx8dv3bp1w4YNtX5GNUc2Wp9HO+AsRgECgEaupKTk66+/ttyHMHr06Pz8/E8++UR9IbyiomLBggUHDx58+umnbWsYPXr02bNn33//ffW5oCzL3377bVZWllONSUtL6969u7+/v2VJixYtHnroofT0dKWFLjTProsXL3722Wfq0+LU1NSjR49GR0c71eALFy6o7xI5e/bszz//LEnSd999p74VZ9WqVQaDITw83LaGMWPGnDt3Ljk52XL2L4QwmUzLly9fu3atU43JyMgICwsLDAy0LOnXr5/JZHLwUnEd9qNdvr6+yh+zZs2y3P40ZsyYkpISq40KIRYtWqRcj9fr9coS1w5Uxw+YkpISS7pQZGRk5Obm9unTx9lP6uBG6+1oB5zFLwAA0Mjl5+dbTi90Ol1oaOiWLVt69OhhW/LYsWN9+/Zt3ry5+lxNkqT27dunpqZevnzZdpWff/65Z8+ejjdm48aNo0aN6tev31dffaUs6du3r8lkUk6FXWhedfLz869evWq18M8//wwNDXW8tUo9VvdwFxQUWP5rUVhYKMuyn5+f1eo17720tLRevXo53ph169aNGDGid+/eCxcuFEIYDIa+fftmZWWdP3++1nXrth+t5Ofnb968ediwYYGBgWlpaXv37lV2miRJHTp0UG6Usl3L6rq7CwfqxYsXHT9gCgoKysvLrcocPXr0nnvucerDOn6U1tvRDjiLAAAAjZz6QrWfn5+7u3tkZGRkZGR15X19fdXnHP7+/h4eHidPnrRbOD8/36nGXL16de3atX379l2yZElFRYVer3/sscc2btyobNGF5lXH7mnu+fPnW7RoYXkpSZJtGcsFacWVK1dsP4LlvxYVFRUmk8lgsP5W9fPzq2Hv1XpvvZULFy78+uuvjzzyyH/+85+KiooHHnjAx8fnxx9/dGTduu1HW0lJSX379n3sscdmzpx58ODBWbNmFRYWKh//xIkTjtTgwoHatGlTxw+Y6g4Jd3d3R5rnbNtKSkrq7WgHnEUAAAANOX36dFlZ2eLFi7///nsHVykuLr5y5Yr6thO1Nm3aONuG1atXP/HEEw888MCmTZt69Ojh5+dnGZzHheZVx3boFYXlpL+kpER9b4aFOiFcvzNnzpSVlVW3l6rbqzVYs2ZNz54977vvvuzs7JiYmMOHDx86dMiRFeu8H60Yjcb09PT09PTw8PCXX345ISFh7NixxcXFZWVlAQEBztbm4JEgSZLjB4zdQ6K64+T626aon6MdcBbPAACAhsiyvH///qioKKvr3Ipx48aNGDHCaqHJZDp06FBkZKSXl5ftKi7cP11QUPDbb7/1799fCBETE3PgwIEjR4643DyXnTlzpnXr1lbX7HU6Xbt27epqE0IIk8l04MCB6vbe448/7myFu3fvLiws7NOnzx133BEWFqYe2LTWltRtP6qFhoZGREQof+/du/ebb75p3br1bbfdJsvyvn37IiMjPT09bdfq1KlTdX3t4JFQnweMs21T/EWOdsAKAQAAtOXTTz8NDAyMj493c3OzLJQk6dlnn+3Xr58yAoztKj4+Pq+88krz5s3VqwwePNhy2ueUtLS0Dh06REdHh4eHW53CutA812RnZ3t5eQ0dOlS9cPjw4XZ/FrgeCxYs8Pb2tt17AwcOfOSRR5ytTZbljIyMrl27jhw5Uhk70vF167wfLe65557Jkydbfl5QfkW5ePGiMH/8V199Vb1RIcSjjz76zjvvhIeHq6cLsGqtI0dCvR0wLrRN8Vc42gEr3AIEANpy4sSJ5OTkl156qXPnzllZWSdPnvTx8YmMjFRGSbd7zpGbm/vRRx/FxcXNnTs3KysrLy/P19e3W7dud91116effjpmzBhn27B9+/bCwsL4+HhlUPbrbJ5r9u7dm56ePmzYsJCQkD179kiS1KVLl5CQkF27dl3//TBqx48fT05Ojo+PnzdvXlZW1rFjx3x9fbt06dKuXbu5c+e++OKLzla4du3ap59+ulu3bsuXL7d90LkGdd6PFuvXrx80aNDrr7++Zs2aFi1aPPHEE5s2bVJuXj958uR77703YcIEy8f39/cPDw9v3759VlbW/Pnzq6vTwSOh3g4YF9qm+Csc7YAVAgAAaE52dvaBAweGDBkSHh7+2GOPnT59+sCBA2+//bbtGPYWmZmZv//++5AhQ9q1a/foo4+Wl5cfOHDg9ddfP378eERExLlz55xqgCzL6enpo0aNWrNmje20XC40zzVz5849dOhQVFTUoEGDLl26dPDgwUmTJnXs2FE9Xmed2Lx58759+wYPHty+ffuHH37YZDIdPHjwjTfeOHLkSGRkZHFxsVO1nT17dufOnV27dnVhFtu67UeL4uLiyZMnP/vss7GxsZcvX16zZo16ZrFt27aNGzdu8ODBYWFhUVFRly9fPnbs2NSpU60GyLfl4JFQbweMaxv9ixztgJoUExPT0G0AAACO0uv1n3/+eU5OTmJiYkO3BcBNiV8AAAA3mdTU1BreHTBgQL21pEH06NGjZcuWs2fPtlp+Q3dLo9/njf4DAmr8AgAAuMkEBQXV8G5eXl69taRBzJw585Zbbhk3bpzVEJY3dLc0+n3e6D8goMYvAACcc8cddwwbNqxDhw5NmjQ5evRoamrqf//73xrKe3l5Pfvss3/729/c3d3379//xRdfqKcc+uCDD+yOupiQkLBt27a6b71m1NpNt99++9NPPx0SEuLt7Z2bm5uZmZmRkVHdmOh/tW5qNGdjY8eOtboMd+LEiXHjxil/V7fbhRALFiyw7ay8vDwvL6+lS5cqL3fs2DFt2rS6amqj2efVqeEDurm5jRw5Upl2LTc3d8mSJTU8ntutW7dp06Y5vvOdLQ+7aj3yay3g7FfbzY4AAMAJ4eHh06ZNy8vLW7FixZkzZzp37jxp0qSVK1cuXLiwulWmTJnSqlWrpUuXlpWVDRgwICkpKS4u7sKFC8q7CxYssBogvH379sOHD+cBuOtRazfde++9b775Zm5u7sqVK0tLS9u3b//CCy/06NEjISHBbgagm26Q4ODgrVu3qoeGVM+GW91uj4+PP3r0qN0Ky8rK3n77bSGE1fCmcJkkSVOmTAkODk5JSTl79mxERMSMGTOmTp26a9cu28LNmjV76aWXHK/c2fKoTq1Hfs0FXPhqu9kRAAA4SpKkuLi4nJycqVOnKoMPbtq06Y8//pgwYcIvv/xy+PBh21Xat2/fqVOnl19+OScnRwixffv2hQsX9urVa8WKFUqBAwcOWK3Sv3//PXv2VHd+g1rV2k0eHh4TJkzYsmXL+++/r5zub9q0aePGjUlJSU888YTdSUnpphukbdu2S5cu/e233+y+68JuNxqNSm19+vTx8PCou5ZqV3h4eNeuXf/1r38p/8RlZWV5enr+85//tBsAxo0bZzQa7b5ll7PlUZ1aj/waCrjw1dYIMBEYAEe1adMmMDBw6dKl6qHH161bV1paes8999hdpUmTJuvWrbPMfHnx4sWioqJbb721uk0EBAR079595cqVddpwbam1mzp37uzn57dw4UL1xf6DBw+uX78+OjrakU3QTXXilltuad68ueO31rDbG0Tbtm0rKiqUSxiKffv22Z0pomfPng899NDs2bOVGdBq5Wx53CAufLU1AgQAAI7S6XTbtm07fvy41fLLly/7+vraXeX333+fPXu25UQzICCgTZs26q9SK08++eSJEye2b99eV23WoFq7qW3btiUlJWfOnLEqkJOTExQUJElSrZugm+pEcHCwECIvL69169ahoaG1XrBntzeIgoICg8HQsWNHy5Lw8HDbH2F8fX3j4uJ+/PHHPXv2OFKts+Vx47jw1dYIcAsQAEcdO3YsISHBauGdd97ZqlWrGs7pFQMGDGjTpk1UVNSOHTs2bNhgt4yPj090dPT8+fOrexQVjqi1m86dO9esWTN3d/crV66oy7Rs2fLMmTO17ny6qa4EBwfLspyQkNC2bVshhCzLW7ZsmTNnjt3ZuNjtDeW3337bs2fP5MmTV6xYUVRUFBER0aFDh5kzZ1oVi4+PLykpWbRokYPVOlseN871fLXdvPgFAIDrPDw8Jk6cmJub+8svv9RcMiAgICgoyMPDo3nz5rfccovdMjExMZcvX87MzKz7hmqbVTft27fPZDI9/vjj6jLNmjXr1auXIxcj6aa6EhwcLEnSrl274uPjhw0bNn369ICAgOTkZKsHfxXs9oYiy/IPP/zg6ek5cuTI1157rWfPnvv377fc1qjo3bt3t27dPvzwQ6tQXR1ny6OeOf7VdvPiFwAALvL09Jw6dWqLFi3eeOMN2/ntrcybN08I4efn99ZbbyUmJo4fP159t6UQwt3d/fHHH//hhx+sluM62XZTQUFBSkrKiBEjmjZtun79+pKSkpCQkOeee87Ly2vZsmU110Y31aFly5Zt2LBh586dyssdO3bk5OTMmTMnNjZ2wYIF6pLs9gYUFRX1yiuvrFix4qeffjp//nxoaOjo0aPffffd11577dKlS0KIVq1ajR49OiUlxfahbbucLY965tRX282LAADAFd7e3gkJCS1atJg8eXJBQYGDaxUXF7/33nvz5s178MEHrW4E6t27t7u7e3p6+g1orHZV101ff/11SUlJbGzs8OHDhRAVFRUGg+Gzzz47depUzRXSTXUoPz9fPSeGEOL8+fMbNmzo1q2bVUl2e0MxGAzPP//8Tz/99OWXXypLdu3aNW3atLlz5/br12/FihWSJE2cOLGwsHDx4sWOVOhsedQz177abkYEAABOa9my5YwZM/R6/aRJk4qKiqorFhgYGBERkZKSYjQaLQvz8/PPnj1rNYaGTqf7+9//vnbtWsv8ALh+NXSTLMsrV6788ccfg4KCysvLX3311fLy8h9++KHmCummOnTnnXfecccd69ats1p++vRpf39/9RJ2ewO69dZbfXx8Nm/erF54+vTpnJwcZY62gQMHhoWFvfLKKw5eKna2POqTg19tjQMBAIBzbrvttsTExEuXLk2ePPl///tfDSVbtGjxzDPPbNmy5dixY5aFBoPB29vb6kpzRETErbfeumrVqhvUZg1ypJsqKir+/PPPwYMHBwUFTZgwodanS+mmOnTbbbdNnDhx7969hYWF6uV33XWX1Qgz7PYGpISupk2bWi339PRUuumhhx4yGAwfffSR7bqpqakDBgywWuhsedQbx7/aGgcCAAAnBAYGJiYmFhYWTp8+3e7Y1W5ublFRUbt37y4qKvrjjz+Ki4tjY2OTkpIsl7sGDRpkMpl2796tXmvQoEFbtmw5efJkfXwGDai1myxat249fPjwb7/91mo0enU/WhbSTXVo+/btp06dGjt2bGJioslkUhaGhYVFRUXNnz9fXbKG3W63m1CHSkpKDh8+PGDAgM2bN1sScufOnYODg5csWSKE+PTTT728vKzWGjp0qJub21dffaW8VHeTI+VR/5z6aqv/5t0IBAAAjgoMDExKSrp69WpKSsrdd9+tfquoqEi5XdLT0/Oll15KTEwsKioyGo3Tp09PTEx85513MjMzS0tLu3fv/vDDD8+bN0/9b2jHjh1DQkImTZpU35+nkXKkmxSSJI0fP/7UqVPfffedVSXqflSW0E116+rVq7NmzZo2bVpycvKaNWsuXLgQFhYWExOzdevW1atXW4rVvNttuwl1bvbs2e+//77STcpDwAMHDszOzlbuCzp48KDtKspcs5YJntXd5Eh51DNnv9oaqJl1jAAAwFEhISHNmzcXQrz55ptWby1fvtzugNZHjx594403nnnmmdjYWEmSjhw58uabb1qNNfnkk08eOnRo//79N67lmuJ4N/Xp0yc8PPy1115z5HZkuqnOHTp0aOLEiUOHDh06dKiXl9fRo0fnz5+/Zs0a9b1Y7PYGl5eXFxcXFxsb+49//MPX1zcvL2/hwoU8kN2YuPDV1ghIMTExDd0GAAAAAPWEicAAAAAADSEAAAAAABpCAAAAAAA0hAAAAAAAaAijAAGob2VpHkIIIUlVlko6IYSk1wshhE4SQkhKAZ35OoXqpfktOzVULtTZ1FO1hsq/repRN0lVQLYqoPxXb1OPEHJlhTaFq39LtmxTJ10rJgk7BdTN0wnrwlVfVq6ls1ND5UulmK5qDTrVW7a1Wb20qc26clV75aqdJevs/23Vhqqbs7sJyaqw/TZUPVJq2Lqo5i25+hqE3fbb+bvqPGu2xSztF6qXVT6FuQbbj2bdTbLVW+YCVWqoslvUq1wrYFuPuXU2BSSpygeUdNcKVNmOzqSuQb2WTifbqafy/1qTVT1CCL2yUJKFzT8GVd+6VqHe/LeyUL0tg84khNBZdr/tW0ptokrzDDrjtbeqttwgKWuZrLZuMC+x95bRtp4mqoV6YarylrJ1IQsh9KralFUsm9Cr2myurbKwukLlLaUeXdUNuanW0gur5lVYbd1SoPItVXmlBjdRpXnqtZrY38S1hVb/vzZR/jFWalD9C9nEfLDoJEkIoVcdO00kvRBCZ65Jp3pr0JgOQjP4BQAAAADQEAIAAAAAoCEEAAAAAEBDCAAAAACAhhAAAAAAAA0hAAAAAAAaQgAAAAAANIQAAAAAAGgIAQAAAADQEAIAAAAAoCEEAAAAAEBDCAAAAACAhhAAAAAAAA0hAAAAAAAaQgAAAAAANIQAAAAAAGgIAQAAAADQEAIAAAAAoCEEAAAAAEBDCAAAAACAhhAAAAAAAA0hAAAAAAAaYmjoBgDQHI/+ZQ3dBJjJqv8KIUwN1hDgpiBXfVneMK2old7mD6AKfgEAAAAANIQAAAAAAGgIAQAAAADQEAIAAAAAoCEEAAAAAEBDCAAAAACAhhAAAAAAAA0hAAAAAAAaQgAAAAAANIQAAAAAAGgIAQAAAADQEAIAAAAAoCEEAAAAAEBDCAAAAACAhhAAAAAAAA0hAAAAAAAaQgAAAAAANIQAAAAAAGgIAQAAAADQEAIAAAAAoCEEAAAAAEBDCAAAAACAhhAAAAAAAA0hAAAAAAAaQgAAAAAANIQAAAAAAGgIAQAAAADQEAIAAAAAoCEEAAAAAEBDCAAAAACAhhAAAAAAAA0hAAAAAAAaQgAAAAAANIQAAAAAAGgIAQAAAADQEAIAAAAAoCEEAAAAAEBDCAAAAACAhvw/4MFy3MPLox0AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Temporary : show static plot for notebook review\n", + "plotter.show(jupyter_backend='static')" + ] + }, + { + "cell_type": "markdown", + "id": "89030e96-2e30-40c7-bb97-ccf0af044d94", + "metadata": {}, + "source": [ + "---\n", + "## Get an Iris cube for an extracted region.\n", + "\n", + "While GeoVista provides the efficient tools for mesh region extraction, it and Iris know nothing about one another. \n", + "So, to calculate a regionally-extracted _Iris cube_, GeoVista can do the hard work of determining the subset of cells required, but you must then \"reconstruct\" an Iris cube from that information. \n", + "For now, at least, there are no ready-made tools for this (either in Iris or Geovista). \n", + "\n", + "The process requires a few steps, which we can summarise as :\n", + " 1. record, on the original global PolyData, the original face indices of each of the cells\n", + " 1. perform extraction (by BBox or otherwise) to get a regional PolyData\n", + " 1. get the face-indices of the selected cells from the regional PolyData \n", + " 1. index the Iris cube with the selected indices, on the mesh dimension, to extract the regional parts\n", + " 1. construct and attach a suitable Iris mesh to represent the extracted region\n", + "\n", + "( Note: the last step itself is not strictly necessary. It may be sufficent to have a regional data cube with a notional \"mesh dimension\", but which does not possess an actual Iris mesh. )\n", + "\n", + "---\n", + "Let's show that operation ...\n", + "\n", + "**Step 1 : First, add an auxiliary array to the global PolyData, recording the original (face) index of each cell.** \n", + "Note : use numpy.arange() to construct a counting sequence, and assign to a named index on the PolyData object." + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "id": "8a82144d-6452-4026-9cd7-96d4b78dbdcd", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "face_inds = np.arange(pv_global_rh.n_cells)\n", + "pv_global_rh.cell_data['original_face_indices'] = face_inds" + ] + }, + { + "cell_type": "markdown", + "id": "a979d8a0-fe1c-4a18-afc7-ea0dd005406d", + "metadata": {}, + "source": [ + "---\n", + "\n", + "**Step 2 : Extract with your Bbox to get a regional PolyData, and show the result.** \n", + "This code is exactly the same as the previous time we did this." + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "id": "2913273e-071b-4226-86a9-1d2713801d01", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
HeaderData Arrays
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
PolyDataInformation
N Cells27029
N Points27380
N Strips0
X Bounds2.370e-01, 1.000e+00
Y Bounds-8.181e-03, 9.415e-01
Z Bounds-5.033e-01, 7.787e-01
N Arrays6
\n", + "\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
NameFieldTypeN CompMinMax
SelectedPointsPointsuint810.000e+001.000e+00
relative_humidity_at_screen_levelCellsfloat6412.368e+001.118e+02
original_face_indicesCellsint6419.500e+011.842e+05
gvCRSFields1nannan
gvRadiusFieldsfloat6411.000e+001.000e+00
gvNameFields1nannan
\n", + "\n", + "
" + ], + "text/plain": [ + "PolyData (0x7ffb645d3820)\n", + " N Cells:\t27029\n", + " N Points:\t27380\n", + " N Strips:\t0\n", + " X Bounds:\t2.370e-01, 1.000e+00\n", + " Y Bounds:\t-8.181e-03, 9.415e-01\n", + " Z Bounds:\t-5.033e-01, 7.787e-01\n", + " N Arrays:\t6" + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pv_regional_rh = bbox.enclosed(pv_global_rh)\n", + "pv_regional_rh" + ] + }, + { + "cell_type": "markdown", + "id": "d81ce1f6-68ba-423b-be95-130658bf3892", + "metadata": {}, + "source": [ + "You can see that the new version of the extracted (regional) data now has an ***extra*** attached data array, derived from the one we added to the global data, and which holds the selected face indices.\n", + "\n", + "---\n", + "\n", + "**Step 3 : Fetch the indices array from the regional PolyData, by indexing with the array name.** \n", + "and show the result." + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "60ef0230-3864-4dbb-8838-42047a680ab0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pyvista_ndarray([ 95, 96, 97, ..., 184179, 184180, 184181])" + ] + }, + "execution_count": 115, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get the remaining face indices, to use for indexing the Cube.\n", + "region_indices = pv_regional_rh[\"original_face_indices\"]\n", + "region_indices" + ] + }, + { + "cell_type": "markdown", + "id": "8c3f341f-f33a-4c9e-93f0-bbce49517c00", + "metadata": {}, + "source": [ + "This contains the original face-indices of all the cells which fall within the region, _i.e. which faces those were in the global mesh_.\n", + "\n", + "We can now apply these indices, to select only those cells *from the Iris cube*.\n", + "\n", + "**Step 4 : Apply these cells as an index to the 'mesh dimension' of the original Iris lfric-rh cube** \n", + ".. and print that out." + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "id": "cd812f99-73b3-4247-a975-a59bb49a42aa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "
Relative Humidity At Screen Level (1)--
Shape27029
Auxiliary coordinates
\tlatitudex
\tlongitudex
Scalar coordinates
\tforecast_period21600 seconds
\tforecast_reference_time2021-03-24 00:00:00
\ttime2021-03-24 06:00:00
Cell methods
\tpointtime
Attributes
\tConventions'CF-1.7'
\tdescription'Created by xios'
\tinterval_operation'6 h'
\tinterval_write'6 h'
\tonline_operation'instant'
\ttitle'Created by xios'
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lfric_rh_region = lfric_rh[..., region_indices]\n", + "lfric_rh_region" + ] + }, + { + "cell_type": "markdown", + "id": "6d102893-e661-412d-a7c1-5de9964ce72c", + "metadata": {}, + "source": [ + "This new cube contains the mesh data within our selected region.\n", + "\n", + "However, there is a catch here : Once indexed, our cube ***no longer has a mesh***. \n", + "You can see this in the printout, which lists \"Auxiliary coordinates\" but no \"Mesh coordinates\".\n", + "\n", + "This problem will probably be fixed in future. See [here in the Iris docs](https://scitools-iris.readthedocs.io/en/latest/further_topics/ugrid/operations.html#region-extraction) for a discussion.\n", + "\n", + "For now, what we need to do is to re-create a mesh for the regional cube.\n", + "We do that in a few further steps ...\n", + "\n", + "---\n", + "\n", + "**Step 5a : Get the X and Y-axis coordinates from the region cube.**\n", + "Use `Cube.coords('longitude')` etc." + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "id": "2d43b8c0-2a25-4dee-8610-c26438209eef", + "metadata": {}, + "outputs": [], + "source": [ + "x_coord = lfric_rh_region.coord('longitude')\n", + "y_coord = lfric_rh_region.coord('latitude')" + ] + }, + { + "cell_type": "markdown", + "id": "387b22d4-78c9-4c88-a320-9c8d4be8e1fb", + "metadata": {}, + "source": [ + "**Step 5b : Create a new `iris.experimental.ugrid.Mesh`-class object, passing the X,Y coords as arguments**" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "d6b2345b-1cca-4f2e-8cc7-c5ab9fc6aab9", + "metadata": {}, + "outputs": [], + "source": [ + "from iris.experimental.ugrid.mesh import Mesh\n", + "mesh = Mesh.from_coords(x_coord, y_coord)" + ] + }, + { + "cell_type": "markdown", + "id": "be9af3e5-ba74-4ab0-9a52-bf80a50a6334", + "metadata": {}, + "source": [ + "( Step 2a : **`print()` the Mesh object** \n", + "Note : `Mesh` does not provide a notebook display method. \n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "id": "12e8fba7-2f5b-43c9-a95a-0c487364678c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mesh : 'unknown'\n", + " topology_dimension: 2\n", + " node\n", + " node_dimension: 'Mesh2d_node'\n", + " node coordinates\n", + " shape(108116,)>\n", + " shape(108116,)>\n", + " face\n", + " face_dimension: 'Mesh2d_face'\n", + " face_node_connectivity: shape(27029, 4)>\n", + " face coordinates\n", + " shape(27029,)>\n", + " shape(27029,)>\n" + ] + } + ], + "source": [ + "print(mesh)" + ] + }, + { + "cell_type": "markdown", + "id": "767e4c6c-4665-4e58-9bb2-8b1a7ea8749a", + "metadata": {}, + "source": [ + "---\n", + "**Step 5c : Call `Mesh.to_MeshCoords` to create a pair of `MeshCoord`s containing this mesh** \n", + "Note : you must specify the keyword `location=\"face\"` : This matches the data location of the original data -- i.e. the data cells are faces." + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "id": "8c84b276-36b7-435f-a4da-7e8fbf104d8d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "() location(face) +bounds shape(27029,)>,\n", + " ) location(face) +bounds shape(27029,)>)" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mesh_coords = mesh.to_MeshCoords(location=\"face\")\n", + "mesh_coords" + ] + }, + { + "cell_type": "markdown", + "id": "365ca473-5e01-4e3d-9731-6309362dd07a", + "metadata": {}, + "source": [ + "---\n", + "**Step 5d : (finally!!) \n", + "Use `Cube.remove_coord` and `Cube.add_aux_coord` to replace each AuxCoord with its corresponding `MeshCoord` from the previous step.** Note : for 'add_aux_coord', you also need to specify the relevant cube dimension(s) : See [`Cube.add_aux_coord` in the Iris docs](https://scitools-iris.readthedocs.io/en/latest/generated/api/iris/cube.html?highlight=add_aux_coord#iris.cube.Cube.add_aux_coord) \n", + ".. and show the cube .." + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "id": "184b796b-9e1e-40d3-8b88-d086c2093c58", + "metadata": {}, + "outputs": [], + "source": [ + "lfric_rh_region.remove_coord('longitude')" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "id": "6ee58d1d-d67d-4241-8113-e260ae07c4bf", + "metadata": {}, + "outputs": [], + "source": [ + "lfric_rh_region.remove_coord('latitude')" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "id": "4b1c7d7f-18b3-44f3-bf89-688e2e60658d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + " \n", + " \n", + "\n", + "
Relative Humidity At Screen Level (1)--
Shape27029
Mesh coordinates
\tlatitudex
\tlongitudex
Mesh
\tnameunknown
\tlocationface
Scalar coordinates
\tforecast_period21600 seconds
\tforecast_reference_time2021-03-24 00:00:00
\ttime2021-03-24 06:00:00
Cell methods
\tpointtime
Attributes
\tConventions'CF-1.7'
\tdescription'Created by xios'
\tinterval_operation'6 h'
\tinterval_write'6 h'
\tonline_operation'instant'
\ttitle'Created by xios'
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xco, yco = mesh_coords\n", + "\n", + "lfric_rh_region.add_aux_coord(xco, 0)\n", + "lfric_rh_region.add_aux_coord(yco, 0)\n", + "\n", + "# Result : a regional Mesh-Cube with a subset of the original faces.\n", + "lfric_rh_region" + ] + }, + { + "cell_type": "markdown", + "id": "98494731-0cb2-4747-b370-4a54ef3ae273", + "metadata": {}, + "source": [ + "---\n", + "\n", + "**Lastly, plot this to see what we got.** \n", + "Use the techniques as above, converting with `pv_from_lfric_cube` and plotting.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "id": "8fbf4066-7806-4bcb-9f06-d8e0c1a9414d", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0c9b8bb79c2a499ebcdab975cf2476f5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ViewInteractiveWidget(height=768, layout=Layout(height='auto', width='100%'), width=1024)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pv = pv_from_lfric_cube(lfric_rh_region)\n", + "pv.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "5b1b5c9b-1835-4fb9-81cd-0217cab7bed4", + "metadata": {}, + "source": [ + "----\n", + "\n", + "**Investigation:** It is useful to add some extra background information to make this more visible.\n", + "\n", + "As a minimum you can use `plotter.add_coastlines()`.\n", + "\n", + "Another useful one is `plotter.add_base_layer()` \n", + "**Question : what does that actually do ?**" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "id": "b2c8eccc-c1cb-4af2-97dd-4c362f8f4d35", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "18d3cadcc40b4b2f8eeae7a4960e5dbd", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ViewInteractiveWidget(height=768, layout=Layout(height='auto', width='100%'), width=1024)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plotter.add_coastlines()\n", + "plotter.add_base_layer()\n", + "plotter.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bc933dc1-267f-4705-a6c9-07ca320f2f1d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/display_demo_routines.py b/notebooks/display_demo_routines.py new file mode 100644 index 0000000..3deb080 --- /dev/null +++ b/notebooks/display_demo_routines.py @@ -0,0 +1,81 @@ +# routines +import geovista as gv + + +# How to suppress warnings about the texture buffer overflow. +# -- these seem to always occur when using software-emulated OpenGL, but can be ignored for now +def suppress_vtk_warnings(): + import vtk + vtk.vtkObject.GlobalWarningDisplayOff() + +# Just for now : call this always +# suppress_vtk_warnings() + + +from geovista import Transform, GeoPlotter + +def popup_2d_data_xx_yy(sample, title=None) -> None: + """Quick display of Geovista sample data.""" + + # create the mesh from the sample data + mesh = gv.Transform.from_2d(sample.lons, sample.lats, data=sample.data) + + # remove cells from the mesh with nan values + mesh = mesh.threshold() + + # plot the mesh, and add extra context elements + plotter = gv.GeoPlotter() + sargs = dict(title=f"{sample.name} / {sample.units}", shadow=True) + plotter.add_mesh(mesh, show_edges=True, scalar_bar_args=sargs) + + # a base layer shows a global image, and stops it being see-through where there is no data + plotter.add_base_layer(texture=gv.natural_earth_1()) + # coastlines are always a handy reference + plotter.add_coastlines() + # axes for orientation + plotter.add_axes() + # title for plot + if title is None: + title = sargs['title'] + plotter.add_text( + title, + position="upper_left", + font_size=10, + shadow=True, + ) + + # display the plot + plotter.show() + + +def side_by_side_plotter(pv_left, pv_right, show_coastlines=True, show_baselayer=False): + """ + Plot two meshes alongside each other with same controls. + + Return a new plotter, ready to display. + + """ + plotter = GeoPlotter(shape=(1, 2)) + + plotter.subplot(0, 0) + if show_coastlines: + plotter.add_coastlines() + if show_baselayer: + plotter.add_base_layer(texture=gv.natural_earth_1()) + plotter.add_mesh(pv_left, show_edges=True, cmap='magma') + + plotter.subplot(0, 1) + if show_coastlines: + plotter.add_coastlines() + if show_baselayer: + plotter.add_base_layer(texture=gv.natural_earth_1()) + plotter.add_mesh(pv_right, show_edges=True, cmap='magma') + + # Make left+right move together + plotter.link_views() + + # Try to rationalise the global view a little. + plotter.view_xz() + + return plotter + \ No newline at end of file diff --git a/notebooks/testdata_fetching.py b/notebooks/testdata_fetching.py index 52b734e..587515a 100644 --- a/notebooks/testdata_fetching.py +++ b/notebooks/testdata_fetching.py @@ -1,7 +1,6 @@ """Routines providing a simple interface to load matching UM and LFRic test data as Iris cubes.""" from pathlib import Path -datadir = Path('/scratch/sworsley/lfric_data') import iris iris.FUTURE.datum_support = True # avoids some irritating warnings @@ -9,9 +8,32 @@ from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD -um_filepth = datadir / '20210324T0000Z_um_latlon.nc' -lfric_filepth = datadir / '20210324T0000Z_lf_ugrid.nc' -lfric_latlon_filepth = datadir / '20210324T0000Z_lf_latlon.nc' +# Useful public variables +data_path = None +um_filepth = None +lfric_filepth = None +lfric_latlon_filepth = None + +# For now : select C192 (?) or C48 source data +def switch_data(use_newer_smaller_c48_data=True): + global data_path, um_filepth, lfric_filepth, lfric_latlon_filepth + + if use_newer_smaller_c48_data: + # newer data + data_path = Path('/home/h03/bfock/scratch/example_data_u-ct674/') + else: + # older data + data_path = Path('/scratch/sworsley/lfric_data') + + um_filepth = data_path / '20210324T0000Z_um_latlon.nc' + lfric_filepth = data_path / '20210324T0000Z_lf_ugrid.nc' + lfric_latlon_filepth = data_path / '20210324T0000Z_lf_latlon.nc' + + +# By default (for now) use LARGER data +# N.B. works dynamically -- fetched results are all affected +switch_data(use_newer_smaller_c48_data=False) + def um_all_datacubes(): return iris.load(um_filepth)