diff --git a/DocumentedExamples/Spatial_selection.ipynb b/DocumentedExamples/Spatial_selection.ipynb deleted file mode 100644 index dd49d196..00000000 --- a/DocumentedExamples/Spatial_selection.ipynb +++ /dev/null @@ -1,1808 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Spatial selection with tripolar ACCESS-OM2 grid\n", - "\n", - "The ACCESS-OM2 model collection utilises a tripolar grid north of 65N to avoid a point of convergence over the ocean at the north pole.\n", - "\n", - "This means any plotting or analysis in this region needs to use 2D curvilinear latitude and longitude coordinates.\n", - "\n", - "This notebook will cover how to use the curvilinear coordinates to select data within latitude and longitude limits, and how to plot data in the tripole region correctly. There is also a [full tutorial on plotting with projections](https://cosima-recipes.readthedocs.io/en/latest/tutorials/Making_Maps_with_Cartopy.html#gallery-tutorials-making-maps-with-cartopy-ipynb).\n", - "\n", - "Below the tripole area it is sufficient to use 1D latitude and longitude coordinates, which are much more convenient to use as they can use the [`xarray`](http://xarray.pydata.org/en/stable/index.html) [`sel`](http://xarray.pydata.org/en/stable/generated/xarray.DataArray.sel.html) method with `slice` notation.\n", - "\n", - "This notebook will also demonstrate how to do this.\n", - "\n", - "The data output from the CICE model component do not have a convenient to use 1D latitude and longitude coordinates. As the ice and ocean models share a grid the coordinates from each model can be used interchangeably with the other. A method to add 1D latitude and longitude coordinates to an ice [`xarray.DataArray`](http://xarray.pydata.org/en/stable/generated/xarray.DataArray.html) is also demonstrated.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "\n", - "import cosima_cookbook as cc\n", - "import matplotlib.pyplot as plt\n", - "import xarray as xr\n", - "import cartopy.crs as ccrs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Load data\n", - "\n", - "Open a database session" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "session = cc.database.create_session(db='/g/data/ik11/databases/cosima_master.db')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The specific experiment does not matter a great deal. This is the main IAF control run with JRA55 v1.4 forcing" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "expt='01deg_jra55v140_iaf'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Load the 1D latitude/longitude variables from the ocean data to use them with ice data. The dimensions are renamed to match the required dimension in the ice data" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "yt_ocean = cc.querying.getvar(expt, 'yt_ocean', session, 'ocean-2d-geolat_t.nc', n=1).rename({'yt_ocean': 'latitude'})\n", - "xt_ocean = cc.querying.getvar(expt, 'xt_ocean', session, 'ocean-2d-geolat_t.nc', n=1).rename({'xt_ocean': 'longitude'})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Both the ocean and the ice output variables have masked curvilinear coordinates, which means there are missing values for the coordinates over land. These variables are not suitable for plotting with [cartopy](https://scitools.org.uk/cartopy/docs/latest/). A full curvilinear grid is available from the CICE model input grid:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "ice_grid = xr.open_dataset('/g/data/ik11/inputs/access-om2/input_eee21b65/cice_01deg/grid.nc')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Extract the full curvilinear coordinates, from the ice grid. Note that these are in radians and so neeed to converted to degrees, and again the dimensions are renamed to match the dataset to which they will be added:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "geolon_t = xr.ufuncs.degrees(ice_grid.tlon.rename({'nx': 'longitude', 'ny': 'latitude'}))\n", - "geolat_t = xr.ufuncs.degrees(ice_grid.tlat.rename({'nx': 'longitude', 'ny': 'latitude'}))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Load an ice variable to use as an example dataset. In this case only the first 12 months for purposes of illustration." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "aice_m = cc.querying.getvar(expt,'aice_m', session, n=12)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Printing the variable shows it has non-informative dimension names and no CF coordinate variables. As a result when the first time slice is plotted there is no useful units automatically added to the plot. " - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "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", - "
array([cftime.DatetimeGregorian(1958, 2, 1, 0, 0, 0, 0, 5, 32),\n", - " cftime.DatetimeGregorian(1958, 3, 1, 0, 0, 0, 0, 5, 60),\n", - " cftime.DatetimeGregorian(1958, 4, 1, 0, 0, 0, 0, 1, 91),\n", - " cftime.DatetimeGregorian(1958, 5, 1, 0, 0, 0, 0, 3, 121),\n", - " cftime.DatetimeGregorian(1958, 6, 1, 0, 0, 0, 0, 6, 152),\n", - " cftime.DatetimeGregorian(1958, 7, 1, 0, 0, 0, 0, 1, 182),\n", - " cftime.DatetimeGregorian(1958, 8, 1, 0, 0, 0, 0, 4, 213),\n", - " cftime.DatetimeGregorian(1958, 9, 1, 0, 0, 0, 0, 0, 244),\n", - " cftime.DatetimeGregorian(1958, 10, 1, 0, 0, 0, 0, 2, 274),\n", - " cftime.DatetimeGregorian(1958, 11, 1, 0, 0, 0, 0, 5, 305),\n", - " cftime.DatetimeGregorian(1958, 12, 1, 0, 0, 0, 0, 0, 335),\n", - " cftime.DatetimeGregorian(1959, 1, 1, 0, 0, 0, 0, 3, 1)], dtype=object)
\n",
- "
| \n",
- "\n", - "\n", - " | \n", - "
\n",
- "
| \n",
- "\n", - "\n", - " | \n", - "
\n",
- "
| \n",
- "\n", - "\n", - " | \n", - "
\n",
- "
| \n",
- "\n", - "\n", - " | \n", - "
\n",
- "
| \n",
- "\n", - "\n", - " | \n", - "
array([cftime.DatetimeGregorian(1958, 2, 1, 0, 0, 0, 0, 5, 32),\n", - " cftime.DatetimeGregorian(1958, 3, 1, 0, 0, 0, 0, 5, 60),\n", - " cftime.DatetimeGregorian(1958, 4, 1, 0, 0, 0, 0, 1, 91),\n", - " cftime.DatetimeGregorian(1958, 5, 1, 0, 0, 0, 0, 3, 121),\n", - " cftime.DatetimeGregorian(1958, 6, 1, 0, 0, 0, 0, 6, 152),\n", - " cftime.DatetimeGregorian(1958, 7, 1, 0, 0, 0, 0, 1, 182),\n", - " cftime.DatetimeGregorian(1958, 8, 1, 0, 0, 0, 0, 4, 213),\n", - " cftime.DatetimeGregorian(1958, 9, 1, 0, 0, 0, 0, 0, 244),\n", - " cftime.DatetimeGregorian(1958, 10, 1, 0, 0, 0, 0, 2, 274),\n", - " cftime.DatetimeGregorian(1958, 11, 1, 0, 0, 0, 0, 5, 305),\n", - " cftime.DatetimeGregorian(1958, 12, 1, 0, 0, 0, 0, 0, 335),\n", - " cftime.DatetimeGregorian(1959, 1, 1, 0, 0, 0, 0, 3, 1)], dtype=object)
array([-81.108632, -81.066392, -81.024153, ..., 89.894417, 89.936657,\n", - " 89.978896])
array([-279.95, -279.85, -279.75, ..., 79.75, 79.85, 79.95])
array([[-81.10863168, -81.10863168, -81.10863168, ..., -81.10863168,\n", - " -81.10863168, -81.10863168],\n", - " [-81.06639232, -81.06639232, -81.06639232, ..., -81.06639232,\n", - " -81.06639232, -81.06639232],\n", - " [-81.02415297, -81.02415297, -81.02415297, ..., -81.02415297,\n", - " -81.02415297, -81.02415297],\n", - " ...,\n", - " [ 65.01542854, 65.05763118, 65.09976728, ..., 65.09976728,\n", - " 65.05763118, 65.01542854],\n", - " [ 65.01542901, 65.05763258, 65.0997696 , ..., 65.0997696 ,\n", - " 65.05763258, 65.01542901],\n", - " [ 65.01542924, 65.05763328, 65.09977077, ..., 65.09977077,\n", - " 65.05763328, 65.01542924]])
array([[-279.95 , -279.85 , -279.75 , ..., 79.75 ,\n", - " 79.85 , 79.95 ],\n", - " [-279.95 , -279.85 , -279.75 , ..., 79.75 ,\n", - " 79.85 , 79.95 ],\n", - " [-279.95 , -279.85 , -279.75 , ..., 79.75 ,\n", - " 79.85 , 79.95 ],\n", - " ...,\n", - " [-279.9995845 , -279.99875349, -279.99792247, ..., 79.99792247,\n", - " 79.99875349, 79.9995845 ],\n", - " [-279.99975072, -279.99925216, -279.99875359, ..., 79.99875359,\n", - " 79.99925216, 79.99975072],\n", - " [-279.99991695, -279.99975084, -279.99958474, ..., 79.99958474,\n", - " 79.99975084, 79.99991695]])
<xarray.DataArray 'aice_m' (time: 12, nj: 2700, ni: 3600)>\n", + "dask.array<concatenate, shape=(12, 2700, 3600), dtype=float32, chunksize=(1, 675, 900), chunktype=numpy.ndarray>\n", + "Coordinates:\n", + " * time (time) datetime64[ns] 1958-02-01 1958-03-01 ... 1959-01-01\n", + " TLON (nj, ni) float32 dask.array<chunksize=(675, 900), meta=np.ndarray>\n", + " TLAT (nj, ni) float32 dask.array<chunksize=(675, 900), meta=np.ndarray>\n", + " ULON (nj, ni) float32 dask.array<chunksize=(675, 900), meta=np.ndarray>\n", + " ULAT (nj, ni) float32 dask.array<chunksize=(675, 900), meta=np.ndarray>\n", + "Dimensions without coordinates: nj, ni\n", + "Attributes:\n", + " units: 1\n", + " long_name: ice area (aggregate)\n", + " cell_measures: area: tarea\n", + " cell_methods: time: mean\n", + " time_rep: averaged\n", + " ncfiles: ['/g/data/cj50/access-om2/raw-output/access-om2-01/01deg_...\n", + " contact: Andrew Kiss\n", + " email: andrew.kiss@anu.edu.au\n", + " created: 2020-06-09\n", + " description: 0.1 degree ACCESS-OM2 global model configuration under in...\n", + " notes: Source code: https://github.com/COSIMA/access-om2 License...
<xarray.DataArray 'aice_m' (time: 12, latitude: 2700, longitude: 3600)>\n", + "dask.array<concatenate, shape=(12, 2700, 3600), dtype=float32, chunksize=(1, 675, 900), chunktype=numpy.ndarray>\n", + "Coordinates:\n", + " * time (time) datetime64[ns] 1958-02-01 1958-03-01 ... 1959-01-01\n", + " TLON (latitude, longitude) float32 dask.array<chunksize=(675, 900), meta=np.ndarray>\n", + " TLAT (latitude, longitude) float32 dask.array<chunksize=(675, 900), meta=np.ndarray>\n", + " ULON (latitude, longitude) float32 dask.array<chunksize=(675, 900), meta=np.ndarray>\n", + " ULAT (latitude, longitude) float32 dask.array<chunksize=(675, 900), meta=np.ndarray>\n", + " * latitude (latitude) float64 -81.11 -81.07 -81.02 ... 89.89 89.94 89.98\n", + " * longitude (longitude) float64 -279.9 -279.8 -279.7 ... 79.75 79.85 79.95\n", + " geolat_t (latitude, longitude) float64 -81.11 -81.11 ... 65.06 65.02\n", + " geolon_t (latitude, longitude) float64 -279.9 -279.8 -279.7 ... 80.0 80.0\n", + "Attributes:\n", + " units: 1\n", + " long_name: ice area (aggregate)\n", + " cell_measures: area: tarea\n", + " cell_methods: time: mean\n", + " time_rep: averaged\n", + " ncfiles: ['/g/data/cj50/access-om2/raw-output/access-om2-01/01deg_...\n", + " contact: Andrew Kiss\n", + " email: andrew.kiss@anu.edu.au\n", + " created: 2020-06-09\n", + " description: 0.1 degree ACCESS-OM2 global model configuration under in...\n", + " notes: Source code: https://github.com/COSIMA/access-om2 License...