diff --git a/FrevaZarrStreaming/LoadData.ipynb b/FrevaZarrStreaming/LoadData.ipynb
new file mode 100644
index 0000000..33f69c8
--- /dev/null
+++ b/FrevaZarrStreaming/LoadData.ipynb
@@ -0,0 +1,1115 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "1d9f2de7-6f15-4680-b81e-6b8942ad96d1",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": "slide"
+ },
+ "tags": []
+ },
+ "source": [
+ "## Loading Data via Zarr Endpoints\n",
+ "\n",
+ "* Zarr Format Benefits:\n",
+ "\n",
+ " * Scalable, flexible\n",
+ " * Easy to access via HTTP/HTTPS in cloud storage\n",
+ "\n",
+ "* But:\n",
+ "\n",
+ " * Majority of datasets in HDF5 (netCDF4)\n",
+ " * HDF5/netCDF4 hard to access via HTTP/HTTPS in cloud storage\n",
+ "\n",
+ "* Freva Solution:\n",
+ "\n",
+ " * REST API streams any file format as Zarr\n",
+ " * Zarr protocol endpoints accessible via any Zarr library"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2ce5bf92-7e9f-4367-9a90-074be43a9076",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": "slide"
+ },
+ "tags": []
+ },
+ "source": [
+ "### Workflow\n",
+ "* Search netCDF4 datasets using Freva-REST API\n",
+ "* Access data through Zarr endpoints"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "46d025b3-1b9d-4dbe-bdeb-64007d1be311",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": "fragment"
+ },
+ "tags": []
+ },
+ "source": [
+ "Let's define the search parameters for the Freva-REST API and import what we need"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "de5c74e7-c522-4e1d-87c0-71dbca2f5be5",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "search_params = {\"file\": \"/home/*\", \"project\": \"cmip6\"} # Define our search parameters\n",
+ "url = \"http://localhost:7777\" # URL of our test server.\n",
+ "from getpass import getpass\n",
+ "import requests\n",
+ "import xarray as xr"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b790579c-a16b-4dfe-8b05-0e911a22c34b",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": "slide"
+ },
+ "tags": []
+ },
+ "source": [
+ "If we normally search for data we will get the locations of the netCDF files on the hard-drive:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "8ae9d0dc-5a4c-4a48-9f4d-063bf6911ad2",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['/home/wilfred/workspace/databrowser/freva-rest/src/databrowser_api/tests/mock/data/model/global/cmip6/CMIP6/CMIP/MPI-M/MPI-ESM1-2-LR/amip/r2i1p1f1/Amon/ua/gn/v20190815/ua_mon_MPI-ESM1-2-LR_amip_r2i1p1f1_gn_197901-199812.nc',\n",
+ " '/home/wilfred/workspace/databrowser/freva-rest/src/databrowser_api/tests/mock/data/model/global/cmip6/CMIP6/CMIP/CSIRO-ARCCSS/ACCESS-CM2/amip/r1i1p1f1/Amon/ua/gn/v20201108/ua_Amon_ACCESS-CM2_amip_r1i1p1f1_gn_197901-201412.nc']"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "list(requests.get(\n",
+ " f\"{url}/api/databrowser/data_search/freva/file\", \n",
+ " params=search_params, \n",
+ " stream=True\n",
+ ").iter_lines(decode_unicode=True))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e8b3b970-8e41-47a1-8ddc-b62d1bb25edb",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": "slide"
+ },
+ "tags": []
+ },
+ "source": [
+ "What if the data location is not directly accessible, because it's stored somewhere else, like on tape? \n",
+ " * We can use the `load` endpoint to stream stream the data as Zarr data.\n",
+ "\n",
+ "Caveat: Because the data can be accessed from anywhere once it is made available via zarr we need to create an *access token*:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "722d3bec-4cf2-44b2-9f3e-4f8bd81b9287",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdin",
+ "output_type": "stream",
+ "text": [
+ "Password: ········\n"
+ ]
+ }
+ ],
+ "source": [
+ "auth = requests.post(\n",
+ " f\"{url}/api/auth/v2/token\",\n",
+ " data={\"username\": \"janedoe\", \"password\":getpass(\"Password:\")}\n",
+ ").json()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "97bf7e88-a370-4e62-ae44-a2cb4ff7f40a",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": "slide"
+ },
+ "tags": []
+ },
+ "source": [
+ "With this access token we can generate zarr enpoints to stream the data from anywhere, to do so we simply search for the datasets again:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "b2fe0507-014a-4f0a-ac6f-5881d16af761",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "res = requests.get(\n",
+ " f\"{url}/api/databrowser/load/freva\", \n",
+ " params=search_params, \n",
+ " headers={\n",
+ " \"Authorization\": f\"Bearer {auth['access_token']\n",
+ " }\"},\n",
+ " stream=True\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d4f612b3-8f3e-4584-87ce-70d8b64ba1da",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "This will search for data and for every found entry create a zarr endpoint that can be loaded:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "d10716a7-a784-4418-82b3-469070a4d5b6",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['http://localhost:7777/api/freva-data-portal/zarr/16ac2b17-6a0d-551e-9b1c-abcbfc41f4dd.zarr',\n",
+ " 'http://localhost:7777/api/freva-data-portal/zarr/e39716b7-abde-56f7-8cde-4e9d9f2e4ea8.zarr']"
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "zarr_files = list(res.iter_lines(decode_unicode=True))\n",
+ "zarr_files"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4e93bf73-ff4d-4723-9674-e41295b00e65",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": "slide"
+ },
+ "tags": []
+ },
+ "source": [
+ "Let's load the data with xarray and zarr:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "a2273537-3666-4abf-880a-ab5fd9594bed",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "
<xarray.Dataset>\n",
+ "Dimensions: (lat: 27, bnds: 2, lon: 43, plev: 19, time: 11)\n",
+ "Coordinates:\n",
+ " * lat (lat) float64 0.9326 2.798 4.663 6.528 ... 43.83 45.7 47.56 49.43\n",
+ " * lon (lon) float64 101.2 103.1 105.0 106.9 ... 174.4 176.2 178.1 180.0\n",
+ " * plev (plev) float64 1e+05 9.25e+04 8.5e+04 7e+04 ... 1e+03 500.0 100.0\n",
+ " * time (time) datetime64[ns] 1979-01-16T12:00:00 ... 1979-11-16\n",
+ "Dimensions without coordinates: bnds\n",
+ "Data variables:\n",
+ " lat_bnds (lat, bnds) float64 dask.array<chunksize=(27, 2), meta=np.ndarray>\n",
+ " lon_bnds (lon, bnds) float64 dask.array<chunksize=(43, 2), meta=np.ndarray>\n",
+ " time_bnds (time, bnds) datetime64[ns] dask.array<chunksize=(11, 2), meta=np.ndarray>\n",
+ " ua (time, plev, lat, lon) float32 dask.array<chunksize=(11, 19, 27, 43), meta=np.ndarray>\n",
+ "Attributes: (12/47)\n",
+ " CDI: Climate Data Interface version 2.0.6 (https://mpim...\n",
+ " source: MPI-ESM1.2-LR (2017): \\naerosol: none, prescribed ...\n",
+ " institution: Max Planck Institute for Meteorology, Hamburg 2014...\n",
+ " Conventions: CF-1.7 CMIP-6.2\n",
+ " activity_id: CMIP\n",
+ " branch_method: no parent\n",
+ " ... ...\n",
+ " variable_id: ua\n",
+ " variant_label: r2i1p1f1\n",
+ " license: CMIP6 model data produced by MPI-M is licensed und...\n",
+ " cmor_version: 3.5.0\n",
+ " tracking_id: hdl:21.14100/0898c2ad-5382-4d0c-8adb-2ca96387fb54\n",
+ " CDO: Climate Data Operators version 2.0.6 (https://mpim... Dimensions: lat : 27bnds : 2lon : 43plev : 19time : 11
Coordinates: (4)
lat
(lat)
float64
0.9326 2.798 4.663 ... 47.56 49.43
standard_name : latitude long_name : Latitude units : degrees_north axis : Y bounds : lat_bnds array([ 0.93263 , 2.79789 , 4.66315 , 6.528409, 8.393669, 10.258928,\n",
+ " 12.124187, 13.989446, 15.854704, 17.719962, 19.585219, 21.450475,\n",
+ " 23.315731, 25.180986, 27.046239, 28.911492, 30.776744, 32.641994,\n",
+ " 34.507243, 36.372491, 38.237736, 40.102979, 41.96822 , 43.833459,\n",
+ " 45.698694, 47.563926, 49.429154]) lon
(lon)
float64
101.2 103.1 105.0 ... 178.1 180.0
standard_name : longitude long_name : Longitude units : degrees_east axis : X bounds : lon_bnds array([101.25 , 103.125, 105. , 106.875, 108.75 , 110.625, 112.5 , 114.375,\n",
+ " 116.25 , 118.125, 120. , 121.875, 123.75 , 125.625, 127.5 , 129.375,\n",
+ " 131.25 , 133.125, 135. , 136.875, 138.75 , 140.625, 142.5 , 144.375,\n",
+ " 146.25 , 148.125, 150. , 151.875, 153.75 , 155.625, 157.5 , 159.375,\n",
+ " 161.25 , 163.125, 165. , 166.875, 168.75 , 170.625, 172.5 , 174.375,\n",
+ " 176.25 , 178.125, 180. ]) plev
(plev)
float64
1e+05 9.25e+04 ... 500.0 100.0
standard_name : air_pressure long_name : pressure units : Pa positive : down axis : Z array([100000., 92500., 85000., 70000., 60000., 50000., 40000., 30000.,\n",
+ " 25000., 20000., 15000., 10000., 7000., 5000., 3000., 2000.,\n",
+ " 1000., 500., 100.]) time
(time)
datetime64[ns]
1979-01-16T12:00:00 ... 1979-11-16
standard_name : time long_name : time bounds : time_bnds axis : T array(['1979-01-16T12:00:00.000000000', '1979-02-15T00:00:00.000000000',\n",
+ " '1979-03-16T12:00:00.000000000', '1979-04-16T00:00:00.000000000',\n",
+ " '1979-05-16T12:00:00.000000000', '1979-06-16T00:00:00.000000000',\n",
+ " '1979-07-16T12:00:00.000000000', '1979-08-16T12:00:00.000000000',\n",
+ " '1979-09-16T00:00:00.000000000', '1979-10-16T12:00:00.000000000',\n",
+ " '1979-11-16T00:00:00.000000000'], dtype='datetime64[ns]') Data variables: (4)
lat_bnds
(lat, bnds)
float64
dask.array<chunksize=(27, 2), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Array \n",
+ " Chunk \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes \n",
+ " 432 B \n",
+ " 432 B \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape \n",
+ " (27, 2) \n",
+ " (27, 2) \n",
+ " \n",
+ " \n",
+ " Dask graph \n",
+ " 1 chunks in 2 graph layers \n",
+ " \n",
+ " \n",
+ " Data type \n",
+ " float64 numpy.ndarray \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " 2 \n",
+ " 27 \n",
+ " \n",
+ " \n",
+ " \n",
+ "
lon_bnds
(lon, bnds)
float64
dask.array<chunksize=(43, 2), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Array \n",
+ " Chunk \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes \n",
+ " 688 B \n",
+ " 688 B \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape \n",
+ " (43, 2) \n",
+ " (43, 2) \n",
+ " \n",
+ " \n",
+ " Dask graph \n",
+ " 1 chunks in 2 graph layers \n",
+ " \n",
+ " \n",
+ " Data type \n",
+ " float64 numpy.ndarray \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " 2 \n",
+ " 43 \n",
+ " \n",
+ " \n",
+ " \n",
+ "
time_bnds
(time, bnds)
datetime64[ns]
dask.array<chunksize=(11, 2), meta=np.ndarray>
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Array \n",
+ " Chunk \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes \n",
+ " 176 B \n",
+ " 176 B \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape \n",
+ " (11, 2) \n",
+ " (11, 2) \n",
+ " \n",
+ " \n",
+ " Dask graph \n",
+ " 1 chunks in 2 graph layers \n",
+ " \n",
+ " \n",
+ " Data type \n",
+ " datetime64[ns] numpy.ndarray \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " 2 \n",
+ " 11 \n",
+ " \n",
+ " \n",
+ " \n",
+ "
ua
(time, plev, lat, lon)
float32
dask.array<chunksize=(11, 19, 27, 43), meta=np.ndarray>
standard_name : eastward_wind long_name : Eastward Wind units : m s-1 CDI_grid_type : gaussian CDI_grid_num_LPE : 48 comment : Zonal wind (positive in a eastward direction). cell_methods : time: mean cell_measures : area: areacella history : 2020-06-05T18:27:23Z altered by CMOR: Reordered dimensions, original order: time lat lon plev. 2020-06-05T18:27:23Z altered by CMOR: replaced missing value flag (-9e+33) and corresponding data with standard missing value (1e+20). 2020-06-05T18:27:23Z altered by CMOR: Inverted axis: lat. \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Array \n",
+ " Chunk \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " Bytes \n",
+ " 0.93 MiB \n",
+ " 0.93 MiB \n",
+ " \n",
+ " \n",
+ " \n",
+ " Shape \n",
+ " (11, 19, 27, 43) \n",
+ " (11, 19, 27, 43) \n",
+ " \n",
+ " \n",
+ " Dask graph \n",
+ " 1 chunks in 2 graph layers \n",
+ " \n",
+ " \n",
+ " Data type \n",
+ " float32 numpy.ndarray \n",
+ " \n",
+ " \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " 11 \n",
+ " 1 \n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ " \n",
+ " 43 \n",
+ " 27 \n",
+ " 19 \n",
+ " \n",
+ " \n",
+ " \n",
+ "
Indexes: (4)
PandasIndex
PandasIndex(Index([ 0.932629967837991, 2.797889876956741, 4.663149706177884,\n",
+ " 6.5284094014799905, 8.393668907692383, 10.258928168006376,\n",
+ " 12.124187123455766, 13.989445712356673, 15.854703869694873,\n",
+ " 17.719961526447428, 19.58521860882233, 21.450475037398185,\n",
+ " 23.31573072614093, 25.180985581270594, 27.04623949994481,\n",
+ " 28.91149236871774, 30.77674406172325, 32.64199443851768,\n",
+ " 34.50724334150103, 36.37249059281224, 38.23773599056483,\n",
+ " 40.1029793042494, 41.96822026907538, 43.83345857895126,\n",
+ " 45.698693877701785, 47.56392574797867, 49.42915369712305],\n",
+ " dtype='float64', name='lat')) PandasIndex
PandasIndex(Index([ 101.25, 103.125, 105.0, 106.875, 108.75, 110.625, 112.5, 114.375,\n",
+ " 116.25, 118.125, 120.0, 121.875, 123.75, 125.625, 127.5, 129.375,\n",
+ " 131.25, 133.125, 135.0, 136.875, 138.75, 140.625, 142.5, 144.375,\n",
+ " 146.25, 148.125, 150.0, 151.875, 153.75, 155.625, 157.5, 159.375,\n",
+ " 161.25, 163.125, 165.0, 166.875, 168.75, 170.625, 172.5, 174.375,\n",
+ " 176.25, 178.125, 180.0],\n",
+ " dtype='float64', name='lon')) PandasIndex
PandasIndex(Index([100000.0, 92500.0, 85000.0, 70000.0, 60000.0, 50000.0, 40000.0,\n",
+ " 30000.0, 25000.0, 20000.0, 15000.0, 10000.0, 7000.0, 5000.0,\n",
+ " 3000.0, 2000.0, 1000.0, 500.0, 100.0],\n",
+ " dtype='float64', name='plev')) PandasIndex
PandasIndex(DatetimeIndex(['1979-01-16 12:00:00', '1979-02-15 00:00:00',\n",
+ " '1979-03-16 12:00:00', '1979-04-16 00:00:00',\n",
+ " '1979-05-16 12:00:00', '1979-06-16 00:00:00',\n",
+ " '1979-07-16 12:00:00', '1979-08-16 12:00:00',\n",
+ " '1979-09-16 00:00:00', '1979-10-16 12:00:00',\n",
+ " '1979-11-16 00:00:00'],\n",
+ " dtype='datetime64[ns]', name='time', freq=None)) Attributes: (47)
CDI : Climate Data Interface version 2.0.6 (https://mpimet.mpg.de/cdi) source : MPI-ESM1.2-LR (2017): \n",
+ "aerosol: none, prescribed MACv2-SP\n",
+ "atmos: ECHAM6.3 (spectral T63; 192 x 96 longitude/latitude; 47 levels; top level 0.01 hPa)\n",
+ "atmosChem: none\n",
+ "land: JSBACH3.20\n",
+ "landIce: none/prescribed\n",
+ "ocean: MPIOM1.63 (bipolar GR1.5, approximately 1.5deg; 256 x 220 longitude/latitude; 40 levels; top grid cell 0-12 m)\n",
+ "ocnBgchem: HAMOCC6\n",
+ "seaIce: unnamed (thermodynamic (Semtner zero-layer) dynamic (Hibler 79) sea ice model) institution : Max Planck Institute for Meteorology, Hamburg 20146, Germany Conventions : CF-1.7 CMIP-6.2 activity_id : CMIP branch_method : no parent contact : cmip6-mpi-esm@dkrz.de creation_date : 2020-06-05T18:27:23Z data_specs_version : 01.00.30 experiment : AMIP experiment_id : amip external_variables : areacella forcing_index : 1 frequency : mon further_info_url : https://furtherinfo.es-doc.org/CMIP6.MPI-M.MPI-ESM1-2-LR.amip.none.r2i1p1f1 grid : gn grid_label : gn history : Thu Sep 29 13:40:53 2022: cdo sellonlatbox,100,180,0,50 ua_mon_MPI-ESM1-2-LR_amip_r2i1p1f1_gn_197901-199812.nc tmp.nc\n",
+ "2020-06-05T18:27:23Z ; CMOR rewrote data to be consistent with CMIP6, CF-1.7 CMIP-6.2 and CF standards. initialization_index : 1 institution_id : MPI-M mip_era : CMIP6 nominal_resolution : 250 km parent_activity_id : no parent parent_experiment_id : no parent parent_mip_era : no parent parent_source_id : no parent parent_time_units : no parent parent_variant_label : no parent physics_index : 1 product : model-output project_id : CMIP6 realization_index : 2 realm : atmos references : MPI-ESM: Mauritsen, T. et al. (2019), Developments in the MPI‐M Earth System Model version 1.2 (MPI‐ESM1.2) and Its Response to Increasing CO2, J. Adv. Model. Earth Syst.,11, 998-1038, doi:10.1029/2018MS001400,\n",
+ "Mueller, W.A. et al. (2018): A high‐resolution version of the Max Planck Institute Earth System Model MPI‐ESM1.2‐HR. J. Adv. Model. EarthSyst.,10,1383–1413, doi:10.1029/2017MS001217 source_id : MPI-ESM1-2-LR source_type : AGCM sub_experiment : none sub_experiment_id : none table_id : Amon table_info : Creation Date:(09 May 2019) MD5:dff4d5e7b285678699ef52ab1a3cca43 title : MPI-ESM1-2-LR output prepared for CMIP6 variable_id : ua variant_label : r2i1p1f1 license : CMIP6 model data produced by MPI-M is licensed under a Creative Commons Attribution ShareAlike 4.0 International License (https://creativecommons.org/licenses). Consult https://pcmdi.llnl.gov/CMIP6/TermsOfUse for terms of use governing CMIP6 output, including citation requirements and proper acknowledgment. Further information about this data, including some limitations, can be found via the further_info_url (recorded as a global attribute in this file) and. The data producers and data providers make no warranty, either express or implied, including, but not limited to, warranties of merchantability and fitness for a particular purpose. All liabilities arising from the supply of the information (including any liability arising in negligence) are excluded to the fullest extent permitted by law. cmor_version : 3.5.0 tracking_id : hdl:21.14100/0898c2ad-5382-4d0c-8adb-2ca96387fb54 CDO : Climate Data Operators version 2.0.6 (https://mpimet.mpg.de/cdo) "
+ ],
+ "text/plain": [
+ "\n",
+ "Dimensions: (lat: 27, bnds: 2, lon: 43, plev: 19, time: 11)\n",
+ "Coordinates:\n",
+ " * lat (lat) float64 0.9326 2.798 4.663 6.528 ... 43.83 45.7 47.56 49.43\n",
+ " * lon (lon) float64 101.2 103.1 105.0 106.9 ... 174.4 176.2 178.1 180.0\n",
+ " * plev (plev) float64 1e+05 9.25e+04 8.5e+04 7e+04 ... 1e+03 500.0 100.0\n",
+ " * time (time) datetime64[ns] 1979-01-16T12:00:00 ... 1979-11-16\n",
+ "Dimensions without coordinates: bnds\n",
+ "Data variables:\n",
+ " lat_bnds (lat, bnds) float64 dask.array\n",
+ " lon_bnds (lon, bnds) float64 dask.array\n",
+ " time_bnds (time, bnds) datetime64[ns] dask.array\n",
+ " ua (time, plev, lat, lon) float32 dask.array\n",
+ "Attributes: (12/47)\n",
+ " CDI: Climate Data Interface version 2.0.6 (https://mpim...\n",
+ " source: MPI-ESM1.2-LR (2017): \\naerosol: none, prescribed ...\n",
+ " institution: Max Planck Institute for Meteorology, Hamburg 2014...\n",
+ " Conventions: CF-1.7 CMIP-6.2\n",
+ " activity_id: CMIP\n",
+ " branch_method: no parent\n",
+ " ... ...\n",
+ " variable_id: ua\n",
+ " variant_label: r2i1p1f1\n",
+ " license: CMIP6 model data produced by MPI-M is licensed und...\n",
+ " cmor_version: 3.5.0\n",
+ " tracking_id: hdl:21.14100/0898c2ad-5382-4d0c-8adb-2ca96387fb54\n",
+ " CDO: Climate Data Operators version 2.0.6 (https://mpim..."
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "dset = xr.open_dataset(\n",
+ " zarr_files[0],\n",
+ " engine=\"zarr\",\n",
+ " chunks=\"auto\", \n",
+ " storage_options={\"headers\": {\"Authorization\": f\"Bearer {auth['access_token']}\"}}\n",
+ ")\n",
+ "dset"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bbb5b7d1-a330-43dc-877c-639a420de085",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": "slide"
+ },
+ "tags": []
+ },
+ "source": [
+ "We do have a xarray dataset, meaning we can just proceed with our analysis:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "d30bf8f0-f368-4acc-98d1-5ae9a07bf446",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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unTB22+/jeDgYCxdulSld3ljL7/8Mr766iu899570Ol0WLlyJWbOnImgoCB88MEHDTqmxQPfO3XqhL/97W/Yu3cvwsPD4eXlpdielJTUoECIiIjIThp54HtVVRWys7Px6quvKtbHxMRg79691sXRQF988QU++OAD9O3bF2PGjMH999+PTp06oW3bttiwYQNGjhxp8TEtTrJWrlyJZs2aITs7G9nZ2YptkiQxySIiInJidccv6XQ66HQ6xbrffvsNRqMRgYGBivWBgYEoLCxUPcb6XLx4Ee3btwcA+Pr64uLFiwCA++67D3/+858bdEyLk6y8vLwGnYiIiIgc07XJSK27O7B2/+DgYMX6GTNmICUlpd596k5iLoSw28TmHTp0wKlTp9C2bVuEhobi448/xr333osvvvgCzZo1a9AxLU6yiIiI6NYixLXF2mMAQH5+Pnx9feX1datYAODv7w+tVmtWtSoqKjKrbjWWZ555BocPH0afPn0wbdo0DB48GIsXL0ZNTQ0WLlzYoGNanGSNGTPmhttXr17doECIiIio6fP19VUkWfVxc3NDeHg4du7ciUcffVRev3PnTjzyyCNqh1ivl156Sf53v3798MMPP+Dbb79Fx44dcddddzXomBYnWcXFxYrX1dXVyM3NxaVLl/Dggw82KAgiIiKyH5MQMFlZyrJ0/0mTJiE+Ph4RERGIiorC8uXLcebMGbzwwgtWxdFQs2bNqnd9bm4u/vGPf+D111+3+JgWJ1n1zZNlMpmQmJiIDh06WBwAERER2Zf472LtMSzx5JNP4sKFC5g1axYKCgoQFhaG7du3o23btlZG0jB185vq6mrk5eXBxcUFHTt2bJwkqz4ajQYvvfQS+vbti6lTp9rikERERHSLS0xMRGJior3DAAAcOnTIbF1paSkSEhIUXZqWsNnTHH/++WfU1NTY6nBERETUSEzCNsutxtfXF7NmzcJrr73WoP0trmRNmjRJ8VoIgYKCAmzbtg2jR49uUBBERERkP0IICCvHZFm7v6O6dOkSSkpKGrSvxUlW3XKaRqNBy5YtsWDBgj+885CIiIjIEb377ruK17VFpPXr12PQoEENOqbFSdbXX3/doBMRERGRY7JFd19T7y5ctGiR4nVtEWn06NGYNm1ag45pcZJVUVEBIQQ8PT0BAKdPn8aWLVsQGhqKmJiYBgVBRERE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a49nee655xAQEABfX188+OCDOHz4sHyMlJQU3H333Vi2bBmCg4Ph6emJJ554osFVpPHjx8PNzQ0ZGRno06cP2rRpg4ceegj/+te/8Ouvv2L69OkAgMrKSkydOhXBwcHQ6XTo3LkzVq1ahVOnTqFfv34AAD8/P6uru9HR0TAYDEhNTf3dNps3b8add94JnU6Hdu3aYcGCBfK2adOmoWfPnmb7dOvWDTNmzLA4ntrv5ttuuw09evTAX/7yF/zjH//Ajh075M/UH/3MAODzzz9HREQE3N3d4e/vj+HDh1scC6mLSZaT+ec//4mnn34aSUlJOHbsGJYtW4a1a9dizpw5inavvfaa/Nfx008/jT/96U84fvy4xed75plnsGbNGvn16tWrMWbMGEWbsrIyTJo0CQcPHsSuXbug0Wjw6KOPmlWHXnnlFSQlJeH48eMYOHCgxbHU2rRpE0JCQhASEoKnn34aa9asMXvK/csvv4z58+fj4MGDCAgIwNChQxXVs/LycqSmpmLlypU4evQoAgICLI7DFtfm2WefxcaNG1FZWSnvs2HDBgQFBcm/pBrLzJkzMWLECHz//fd4+OGHMXLkSLtVUtRyM5+dG9mwYQPmzJmDefPmITs7G23atMHSpUutisnb2xve3t7YunWr4nNQSwiBwYMHo7CwENu3b0d2djZ69OiB/v37K34+J0+exMcff4wvvvgC6enpyMnJwfjx4y2O5+LFi/jnP/+JxMREeHh4KLYZDAaMHDkSmzZtghACo0aNQlpaGt59910cP34c77//Pry9vREcHIzNmzcDAE6cOIGCggK88847FsdSS6vVYu7cuVi8eDF++eUXs+3Z2dkYMWIEnnrqKRw5cgQpKSl47bXX5IRn5MiR2L9/v+IPnKNHj+LIkSMYOXJkg+O63oMPPoi77roLn3322U39zLZt24bhw4dj8ODBOHToEHbt2oWIiAibxEI2JOiWNHr0aKHVaoWXl5e8PP744+L+++8Xc+fOVbRdv369aNWqlfwagHjhhRcUbSIjI8Wf//xni87/yCOPiPPnzwudTify8vLEqVOnhLu7uzh//rx45JFHxOjRo+vdt6ioSAAQR44cEUIIkZeXJwCIt99++6bPfyO9evWSj1VdXS38/f3Fzp07hRBCfP311wKASEtLk9tfuHBBeHh4iE2bNgkhhFizZo0AIHJy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u3dDkiRcunTJ3qEQ3bRvvvkGQ4YMQVBQECRJwtatWxXbz507h4SEBAQFBcHT0xODBg3CTz/9JG8/deoUJEmqd/nkk0/kdt999x0GDBiAZs2aoUWLFnjuuedw5cqVxnqbpDImWURkU3379kVycrL8ulevXigoKDB75h+RIysrK8Ndd91V79MFhBAYNmwY/vOf/+Af//gHDh06hLZt2yI6OhplZWUAgODgYBQUFCiWmTNnwsvLCw899BAA4OzZs4iOjkanTp2wf/9+pKen4+jRo0hISGjMt0oq4mSkRKQqNze3Bj1kmMieHnroITkZquunn35CVlYWcnNzceeddwIA3nvvPQQEBOCjjz7Cs88+C61Wa/a537JlC5588kn5QddffvklXF1d8fe//x0azbWax9///nd0794dJ0+eRKdOnVR8h9QYWMkiIptJSEjAnj178M4778hdI2vXrlV0F65duxbNmjXDl19+iZCQEHh6euLxxx9HWVkZ1q1bh3bt2sHPzw8TJ06E0WiUj11VVYWpU6fitttug5eXFyIjI7F79277vFFyapWVlQAAd3d3eZ1Wq4WbmxsyMzPr3Sc7Oxs5OTkYO3as4jhubm5yggUAHh4eAPC7x6GmhUkWEdnMO++8g6ioKIwbN07uIgkODjZrV15ejnfffRdpaWlIT0/H7t27MXz4cGzfvh3bt2/H+vXrsXz5csWjgp555hn8+9//RlpaGr7//ns88cQTZuNgiBrDHXfcgbZt22LatGkoLi5GVVUV3njjDRQWFqKgoKDefVatWoUuXbqgV69e8roHH3wQhYWFeOutt1BVVYXi4mL85S9/AYDfPQ41LUyyiMhm9Ho93Nzc4OnpCYPBAIPBAK1Wa9auuroaS5cuRffu3fHAAw/g8ccfR2ZmJlatWoXQ0FDExsaiX79++PrrrwEAP//8Mz766CN88sknuP/++9GxY0dMmTIF9913H9asWdPYb5OcnKurKzZv3owff/wRzZs3h6enJ3bv3o2HHnqo3s97RUUFNm7cqKhiAcCdd96JdevWYcGCBfL/mQ4dOiAwMLDe41DTwzFZRNToPD090bFjR/l1YGAg2rVrJ49VqV1XVFQE4NodWEII3H777YrjVFZWokWLFo0TNNF1wsPDkZOTg5KSElRVVaFly5aIjIxERESEWdtPP/0U5eXlGDVqlNm2uLg4xMXF4dy5c/Dy8oIkSVi4cCHat2/fGG+DVMYki4ganaurq+K1JEn1rjOZTAAAk8kErVaL7Oxss7/wr0/MiBpb7V2zP/30E7799lv87W9/M2uzatUqDB06FC1btvzd4wQGBgIAVq9eDXd3dwwYMECdgKlRMckiIptyc3NTDFi3he7du8NoNKKoqAj333+/TY9NVJ8rV67g5MmT8uu8vDzk5OSgefPmaNOmDT755BO0bNkSbdq0wZEjR/Diiy9i2LBhiImJURzn5MmT+Oabb7B9+/Z6z7NkyRL06tUL3t7e2LlzJ15++WW88cYbaNasmZpvjxoJkywisql27dph//79OHXqFLy9veVqlDVuv/12jBw5EqNGjcKCBQvQvXt3/Pbbb/jqq6/QtWtXPPzwwzaInOh/vv32W/Tr109+PWnSJADA6NGjsXbtWhQUFGDSpEk4d+4cWrVqhVGjRuG1114zO87q1atx2223mSVftQ4cOIAZM2bgypUruOOOO7Bs2TLEx8er86ao0THJIiKbmjJlCkaPHo3Q0FBUVFTYbGD6mjVrMHv2bEyePBm//vorWrRogaioKCZYpIq+fftCCPG725OSkpCUlPSHx5k7dy7mzp37u9s/+OCDBsVHTYMkbvQpIiIiIqIG4RQORERERCpgkkVERESkAiZZRERERCpgkkVERESkAiZZRERERCpgkkVERESkAiZZRERERCpgkkVERESkAiZZRERERCpgkkVERESkAiZZRERERCpgkkVERESkgv8HhKGb44WFurEAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "dset[\"ua\"].mean(dim=(\"lon\", \"lat\")).plot(x=\"time\", yincrease=False)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "43e6475e-e1ad-4aff-a3e9-4d165bc47bfb",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": "slide"
+ },
+ "tags": []
+ },
+ "source": [
+ "## What's next?\n",
+ "- Add json payload to `load` endpoint that allows the users to pre-precess data. For example select a region by uploading a geojson shape file.\n",
+ "- Implement a backend handle to open tape archives"
+ ]
+ }
+ ],
+ "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.11.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/FrevaZarrStreaming/index.slides.html b/FrevaZarrStreaming/index.slides.html
new file mode 100644
index 0000000..7c098e2
--- /dev/null
+++ b/FrevaZarrStreaming/index.slides.html
@@ -0,0 +1,8481 @@
+
+
+
+
+
+
+
+LoadData slides
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[22]:
+
+
['/home/wilfred/workspace/databrowser/freva-rest/src/databrowser_api/tests/mock/data/model/global/cmip6/CMIP6/CMIP/MPI-M/MPI-ESM1-2-LR/amip/r2i1p1f1/Amon/ua/gn/v20190815/ua_mon_MPI-ESM1-2-LR_amip_r2i1p1f1_gn_197901-199812.nc',
+ '/home/wilfred/workspace/databrowser/freva-rest/src/databrowser_api/tests/mock/data/model/global/cmip6/CMIP6/CMIP/CSIRO-ARCCSS/ACCESS-CM2/amip/r1i1p1f1/Amon/ua/gn/v20201108/ua_Amon_ACCESS-CM2_amip_r1i1p1f1_gn_197901-201412.nc']
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[30]:
+
+
['http://localhost:7777/api/freva-data-portal/zarr/16ac2b17-6a0d-551e-9b1c-abcbfc41f4dd.zarr',
+ 'http://localhost:7777/api/freva-data-portal/zarr/e39716b7-abde-56f7-8cde-4e9d9f2e4ea8.zarr']
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[32]:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
<xarray.Dataset>
+Dimensions: (lat: 27, bnds: 2, lon: 43, plev: 19, time: 11)
+Coordinates:
+ * lat (lat) float64 0.9326 2.798 4.663 6.528 ... 43.83 45.7 47.56 49.43
+ * lon (lon) float64 101.2 103.1 105.0 106.9 ... 174.4 176.2 178.1 180.0
+ * plev (plev) float64 1e+05 9.25e+04 8.5e+04 7e+04 ... 1e+03 500.0 100.0
+ * time (time) datetime64[ns] 1979-01-16T12:00:00 ... 1979-11-16
+Dimensions without coordinates: bnds
+Data variables:
+ lat_bnds (lat, bnds) float64 dask.array<chunksize=(27, 2), meta=np.ndarray>
+ lon_bnds (lon, bnds) float64 dask.array<chunksize=(43, 2), meta=np.ndarray>
+ time_bnds (time, bnds) datetime64[ns] dask.array<chunksize=(11, 2), meta=np.ndarray>
+ ua (time, plev, lat, lon) float32 dask.array<chunksize=(11, 19, 27, 43), meta=np.ndarray>
+Attributes: (12/47)
+ CDI: Climate Data Interface version 2.0.6 (https://mpim...
+ source: MPI-ESM1.2-LR (2017): \naerosol: none, prescribed ...
+ institution: Max Planck Institute for Meteorology, Hamburg 2014...
+ Conventions: CF-1.7 CMIP-6.2
+ activity_id: CMIP
+ branch_method: no parent
+ ... ...
+ variable_id: ua
+ variant_label: r2i1p1f1
+ license: CMIP6 model data produced by MPI-M is licensed und...
+ cmor_version: 3.5.0
+ tracking_id: hdl:21.14100/0898c2ad-5382-4d0c-8adb-2ca96387fb54
+ CDO: Climate Data Operators version 2.0.6 (https://mpim... Dimensions: lat : 27bnds : 2lon : 43plev : 19time : 11
Coordinates: (4)
lat
(lat)
float64
0.9326 2.798 4.663 ... 47.56 49.43
standard_name : latitude long_name : Latitude units : degrees_north axis : Y bounds : lat_bnds array([ 0.93263 , 2.79789 , 4.66315 , 6.528409, 8.393669, 10.258928,
+ 12.124187, 13.989446, 15.854704, 17.719962, 19.585219, 21.450475,
+ 23.315731, 25.180986, 27.046239, 28.911492, 30.776744, 32.641994,
+ 34.507243, 36.372491, 38.237736, 40.102979, 41.96822 , 43.833459,
+ 45.698694, 47.563926, 49.429154]) lon
(lon)
float64
101.2 103.1 105.0 ... 178.1 180.0
standard_name : longitude long_name : Longitude units : degrees_east axis : X bounds : lon_bnds array([101.25 , 103.125, 105. , 106.875, 108.75 , 110.625, 112.5 , 114.375,
+ 116.25 , 118.125, 120. , 121.875, 123.75 , 125.625, 127.5 , 129.375,
+ 131.25 , 133.125, 135. , 136.875, 138.75 , 140.625, 142.5 , 144.375,
+ 146.25 , 148.125, 150. , 151.875, 153.75 , 155.625, 157.5 , 159.375,
+ 161.25 , 163.125, 165. , 166.875, 168.75 , 170.625, 172.5 , 174.375,
+ 176.25 , 178.125, 180. ]) plev
(plev)
float64
1e+05 9.25e+04 ... 500.0 100.0
standard_name : air_pressure long_name : pressure units : Pa positive : down axis : Z array([100000., 92500., 85000., 70000., 60000., 50000., 40000., 30000.,
+ 25000., 20000., 15000., 10000., 7000., 5000., 3000., 2000.,
+ 1000., 500., 100.]) time
(time)
datetime64[ns]
1979-01-16T12:00:00 ... 1979-11-16
standard_name : time long_name : time bounds : time_bnds axis : T array(['1979-01-16T12:00:00.000000000', '1979-02-15T00:00:00.000000000',
+ '1979-03-16T12:00:00.000000000', '1979-04-16T00:00:00.000000000',
+ '1979-05-16T12:00:00.000000000', '1979-06-16T00:00:00.000000000',
+ '1979-07-16T12:00:00.000000000', '1979-08-16T12:00:00.000000000',
+ '1979-09-16T00:00:00.000000000', '1979-10-16T12:00:00.000000000',
+ '1979-11-16T00:00:00.000000000'], dtype='datetime64[ns]') Data variables: (4)
lat_bnds
(lat, bnds)
float64
dask.array<chunksize=(27, 2), meta=np.ndarray>
+
+
+
+
+
+
+ Array
+ Chunk
+
+
+
+
+ Bytes
+ 432 B
+ 432 B
+
+
+ Shape
+ (27, 2)
+ (27, 2)
+
+
+ Dask graph
+ 1 chunks in 2 graph layers
+
+
+ Data type
+ float64 numpy.ndarray
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2
+27
+
+
+
+
lon_bnds
(lon, bnds)
float64
dask.array<chunksize=(43, 2), meta=np.ndarray>
+
+
+
+
+
+
+ Array
+ Chunk
+
+
+
+
+ Bytes
+ 688 B
+ 688 B
+
+
+ Shape
+ (43, 2)
+ (43, 2)
+
+
+ Dask graph
+ 1 chunks in 2 graph layers
+
+
+ Data type
+ float64 numpy.ndarray
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2
+43
+
+
+
+
time_bnds
(time, bnds)
datetime64[ns]
dask.array<chunksize=(11, 2), meta=np.ndarray>
+
+
+
+
+
+
+ Array
+ Chunk
+
+
+
+
+ Bytes
+ 176 B
+ 176 B
+
+
+ Shape
+ (11, 2)
+ (11, 2)
+
+
+ Dask graph
+ 1 chunks in 2 graph layers
+
+
+ Data type
+ datetime64[ns] numpy.ndarray
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+2
+11
+
+
+
+
ua
(time, plev, lat, lon)
float32
dask.array<chunksize=(11, 19, 27, 43), meta=np.ndarray>
standard_name : eastward_wind long_name : Eastward Wind units : m s-1 CDI_grid_type : gaussian CDI_grid_num_LPE : 48 comment : Zonal wind (positive in a eastward direction). cell_methods : time: mean cell_measures : area: areacella history : 2020-06-05T18:27:23Z altered by CMOR: Reordered dimensions, original order: time lat lon plev. 2020-06-05T18:27:23Z altered by CMOR: replaced missing value flag (-9e+33) and corresponding data with standard missing value (1e+20). 2020-06-05T18:27:23Z altered by CMOR: Inverted axis: lat.
+
+
+
+
+
+
+ Array
+ Chunk
+
+
+
+
+ Bytes
+ 0.93 MiB
+ 0.93 MiB
+
+
+ Shape
+ (11, 19, 27, 43)
+ (11, 19, 27, 43)
+
+
+ Dask graph
+ 1 chunks in 2 graph layers
+
+
+ Data type
+ float32 numpy.ndarray
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+11
+1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+43
+27
+19
+
+
+
+
Indexes: (4)
PandasIndex
PandasIndex(Index([ 0.932629967837991, 2.797889876956741, 4.663149706177884,
+ 6.5284094014799905, 8.393668907692383, 10.258928168006376,
+ 12.124187123455766, 13.989445712356673, 15.854703869694873,
+ 17.719961526447428, 19.58521860882233, 21.450475037398185,
+ 23.31573072614093, 25.180985581270594, 27.04623949994481,
+ 28.91149236871774, 30.77674406172325, 32.64199443851768,
+ 34.50724334150103, 36.37249059281224, 38.23773599056483,
+ 40.1029793042494, 41.96822026907538, 43.83345857895126,
+ 45.698693877701785, 47.56392574797867, 49.42915369712305],
+ dtype='float64', name='lat')) PandasIndex
PandasIndex(Index([ 101.25, 103.125, 105.0, 106.875, 108.75, 110.625, 112.5, 114.375,
+ 116.25, 118.125, 120.0, 121.875, 123.75, 125.625, 127.5, 129.375,
+ 131.25, 133.125, 135.0, 136.875, 138.75, 140.625, 142.5, 144.375,
+ 146.25, 148.125, 150.0, 151.875, 153.75, 155.625, 157.5, 159.375,
+ 161.25, 163.125, 165.0, 166.875, 168.75, 170.625, 172.5, 174.375,
+ 176.25, 178.125, 180.0],
+ dtype='float64', name='lon')) PandasIndex
PandasIndex(Index([100000.0, 92500.0, 85000.0, 70000.0, 60000.0, 50000.0, 40000.0,
+ 30000.0, 25000.0, 20000.0, 15000.0, 10000.0, 7000.0, 5000.0,
+ 3000.0, 2000.0, 1000.0, 500.0, 100.0],
+ dtype='float64', name='plev')) PandasIndex
PandasIndex(DatetimeIndex(['1979-01-16 12:00:00', '1979-02-15 00:00:00',
+ '1979-03-16 12:00:00', '1979-04-16 00:00:00',
+ '1979-05-16 12:00:00', '1979-06-16 00:00:00',
+ '1979-07-16 12:00:00', '1979-08-16 12:00:00',
+ '1979-09-16 00:00:00', '1979-10-16 12:00:00',
+ '1979-11-16 00:00:00'],
+ dtype='datetime64[ns]', name='time', freq=None)) Attributes: (47)
CDI : Climate Data Interface version 2.0.6 (https://mpimet.mpg.de/cdi) source : MPI-ESM1.2-LR (2017):
+aerosol: none, prescribed MACv2-SP
+atmos: ECHAM6.3 (spectral T63; 192 x 96 longitude/latitude; 47 levels; top level 0.01 hPa)
+atmosChem: none
+land: JSBACH3.20
+landIce: none/prescribed
+ocean: MPIOM1.63 (bipolar GR1.5, approximately 1.5deg; 256 x 220 longitude/latitude; 40 levels; top grid cell 0-12 m)
+ocnBgchem: HAMOCC6
+seaIce: unnamed (thermodynamic (Semtner zero-layer) dynamic (Hibler 79) sea ice model) institution : Max Planck Institute for Meteorology, Hamburg 20146, Germany Conventions : CF-1.7 CMIP-6.2 activity_id : CMIP branch_method : no parent contact : cmip6-mpi-esm@dkrz.de creation_date : 2020-06-05T18:27:23Z data_specs_version : 01.00.30 experiment : AMIP experiment_id : amip external_variables : areacella forcing_index : 1 frequency : mon further_info_url : https://furtherinfo.es-doc.org/CMIP6.MPI-M.MPI-ESM1-2-LR.amip.none.r2i1p1f1 grid : gn grid_label : gn history : Thu Sep 29 13:40:53 2022: cdo sellonlatbox,100,180,0,50 ua_mon_MPI-ESM1-2-LR_amip_r2i1p1f1_gn_197901-199812.nc tmp.nc
+2020-06-05T18:27:23Z ; CMOR rewrote data to be consistent with CMIP6, CF-1.7 CMIP-6.2 and CF standards. initialization_index : 1 institution_id : MPI-M mip_era : CMIP6 nominal_resolution : 250 km parent_activity_id : no parent parent_experiment_id : no parent parent_mip_era : no parent parent_source_id : no parent parent_time_units : no parent parent_variant_label : no parent physics_index : 1 product : model-output project_id : CMIP6 realization_index : 2 realm : atmos references : MPI-ESM: Mauritsen, T. et al. (2019), Developments in the MPI‐M Earth System Model version 1.2 (MPI‐ESM1.2) and Its Response to Increasing CO2, J. Adv. Model. Earth Syst.,11, 998-1038, doi:10.1029/2018MS001400,
+Mueller, W.A. et al. (2018): A high‐resolution version of the Max Planck Institute Earth System Model MPI‐ESM1.2‐HR. J. Adv. Model. EarthSyst.,10,1383–1413, doi:10.1029/2017MS001217 source_id : MPI-ESM1-2-LR source_type : AGCM sub_experiment : none sub_experiment_id : none table_id : Amon table_info : Creation Date:(09 May 2019) MD5:dff4d5e7b285678699ef52ab1a3cca43 title : MPI-ESM1-2-LR output prepared for CMIP6 variable_id : ua variant_label : r2i1p1f1 license : CMIP6 model data produced by MPI-M is licensed under a Creative Commons Attribution ShareAlike 4.0 International License (https://creativecommons.org/licenses). Consult https://pcmdi.llnl.gov/CMIP6/TermsOfUse for terms of use governing CMIP6 output, including citation requirements and proper acknowledgment. Further information about this data, including some limitations, can be found via the further_info_url (recorded as a global attribute in this file) and. The data producers and data providers make no warranty, either express or implied, including, but not limited to, warranties of merchantability and fitness for a particular purpose. All liabilities arising from the supply of the information (including any liability arising in negligence) are excluded to the fullest extent permitted by law. cmor_version : 3.5.0 tracking_id : hdl:21.14100/0898c2ad-5382-4d0c-8adb-2ca96387fb54 CDO : Climate Data Operators version 2.0.6 (https://mpimet.mpg.de/cdo)
+
+
+
+
+
+
+
+
+
+
+
+
+
Out[33]:
+
+
<matplotlib.collections.QuadMesh at 0x7f6ea1d8c390>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/index.html b/index.html
index 040f0a6..cebb818 100644
--- a/index.html
+++ b/index.html
@@ -12,10 +12,11 @@
Select a presentation: