{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Explore MODHID hdf5 Files\n",
    "\n",
    "This notebook is an initial exploration of hdf5 output files produced by MOHID.\n",
    "\n",
    "MOHID output file types explored:\n",
    "\n",
    "* Lagrangian oil particle tracks\n",
    "\n",
    "Python libraries explored:\n",
    "\n",
    "* [PyNIO](https://www.pyngl.ucar.edu/Nio.shtml)\n",
    "* [h5netcdf](https://github.com/shoyer/h5netcdf)\n",
    "* [h5py](http://docs.h5py.org/en/stable/index.html)\n",
    "* [PyTables](https://www.pytables.org/index.html)\n",
    "\n",
    "Summary:\n",
    "\n",
    "* PyNIO fails to open the files\n",
    "* h5netcdf successfully opens the files but can't handle groups that contain variables\n",
    "that don't have associated dimension scales\n",
    "* h5py successfully opens the files and allows access to all of their contents,\n",
    "but the interface is a really low level, nested-dict one\n",
    "* PyTables successfully opens the files and allows access to al of their contents\n",
    "via an object interface.\n",
    "The PyTables tutorial also brought the `h5ls` tool to my attention.\n",
    "* The results are organized as Eulerian snapshots,\n",
    "in general both by 2D and 3D slabs of the hydrodynamics model (NEMO or FVCOM) grid,\n",
    "and by particle.\n",
    "\n",
    "Next step:\n",
    "\n",
    "* Write code to transform PyTables `tables.File` objects into `xarray.Dataset` objects."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-r--r-- 1 doug doug 200M Oct 11 07:42 ../../SalishSeaShihan/results/Lagrangian_7_nested_5.hdf5\n",
      "-rw-r--r-- 1 doug doug 355M Oct 11 07:47 ../../SalishSeaShihan/results/Lagrangian_7_st_georgia_nested.hdf5\n"
     ]
    }
   ],
   "source": [
    "!ls -lh ../../SalishSeaShihan/results/Lagrangian*.hdf5"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## PyNIO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import Nio"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "h5file = Nio.open_file('../../SalishSeaShihan/results/Lagrangian_7_st_georgia_nested.hdf5', format='hdf5')\n",
    "h5file"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "...crashed the kernel :-("
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "h5file = Nio.open_file('../../SalishSeaShihan/results/Lagrangian_7_nested_5.hdf5')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "...never finished :-("
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## h5netcdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import h5netcdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<h5netcdf.File 'Lagrangian_7_nested_5.hdf5' (mode r+)>\n",
       "Dimensions:\n",
       "Groups:\n",
       "    Grid\n",
       "    Results\n",
       "    Time\n",
       "Variables:\n",
       "Attributes:"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file = h5netcdf.File('../../SalishSeaShihan/results/Lagrangian_7_nested_5.hdf5')\n",
    "h5file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "variable '/Grid/Bathymetry' has no dimension scale associated with axis 0",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/IPython/core/formatters.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m    700\u001b[0m                 \u001b[0mtype_pprinters\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype_printers\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    701\u001b[0m                 deferred_pprinters=self.deferred_printers)\n\u001b[0;32m--> 702\u001b[0;31m             \u001b[0mprinter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpretty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    703\u001b[0m             \u001b[0mprinter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mflush\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    704\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mstream\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetvalue\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/IPython/lib/pretty.py\u001b[0m in \u001b[0;36mpretty\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m    400\u001b[0m                         \u001b[0;32mif\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    401\u001b[0m                                 \u001b[0;32mand\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__dict__\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'__repr__'\u001b[0m\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;32m--> 402\u001b[0;31m                             \u001b[0;32mreturn\u001b[0m \u001b[0m_repr_pprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcycle\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    403\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    404\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0m_default_pprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcycle\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/IPython/lib/pretty.py\u001b[0m in \u001b[0;36m_repr_pprint\u001b[0;34m(obj, p, cycle)\u001b[0m\n\u001b[1;32m    695\u001b[0m     \u001b[0;34m\"\"\"A pprint that just redirects to the normal repr function.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    696\u001b[0m     \u001b[0;31m# Find newlines and replace them with p.break_()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 697\u001b[0;31m     \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrepr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    698\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0moutput_line\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutput\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplitlines\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\u001b[0m\n\u001b[1;32m    699\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/h5netcdf/core.py\u001b[0m in \u001b[0;36m__repr__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    544\u001b[0m         header = ('<%s %r (%s members)>'\n\u001b[1;32m    545\u001b[0m                   % (self._cls_name, self.name, len(self)))\n\u001b[0;32m--> 546\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0;34m'\\n'\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mheader\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_repr_body\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    547\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    548\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mresize_dimension\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdimension\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/h5netcdf/core.py\u001b[0m in \u001b[0;36m_repr_body\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    536\u001b[0m             ['    %s: %r %s' % (k, v.dimensions, v.dtype)\n\u001b[1;32m    537\u001b[0m              for k, v in self.variables.items()] +\n\u001b[0;32m--> 538\u001b[0;31m             \u001b[0;34m[\u001b[0m\u001b[0;34m'Attributes:'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    539\u001b[0m             ['    %s: %r' % (k, v) for k, v in self.attrs.items()])\n\u001b[1;32m    540\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/h5netcdf/core.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m    535\u001b[0m             \u001b[0;34m[\u001b[0m\u001b[0;34m'Variables:'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    536\u001b[0m             ['    %s: %r %s' % (k, v.dimensions, v.dtype)\n\u001b[0;32m--> 537\u001b[0;31m              for k, v in self.variables.items()] +\n\u001b[0m\u001b[1;32m    538\u001b[0m             \u001b[0;34m[\u001b[0m\u001b[0;34m'Attributes:'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    539\u001b[0m             ['    %s: %r' % (k, v) for k, v in self.attrs.items()])\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/h5netcdf/core.py\u001b[0m in \u001b[0;36mdimensions\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    110\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mdimensions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    111\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dimensions\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 112\u001b[0;31m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dimensions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_lookup_dimensions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    113\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dimensions\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    114\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/h5netcdf/core.py\u001b[0m in \u001b[0;36m_lookup_dimensions\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    102\u001b[0m                 raise ValueError('variable %r has no dimension scale '\n\u001b[1;32m    103\u001b[0m                                  \u001b[0;34m'associated with axis %s'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 104\u001b[0;31m                                  % (self.name, axis))\n\u001b[0m\u001b[1;32m    105\u001b[0m             \u001b[0mname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_name_from_dimension\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdim\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    106\u001b[0m             \u001b[0mdims\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: variable '/Grid/Bathymetry' has no dimension scale associated with axis 0"
     ]
    }
   ],
   "source": [
    "oil['Grid']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Dimeions scales](https://www.unidata.ucar.edu/software/netcdf/docs/interoperability_hdf5.html)\n",
    "seem to be optional for HDF5, but required for netCDF4.\n",
    "The h5py docs provide [some additional clues](http://docs.h5py.org/en/stable/high/dims.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<h5netcdf.Group '/Results' (3 members)>\n",
       "Dimensions:\n",
       "Groups:\n",
       "    Number\n",
       "    OilSpill\n",
       "    Percentage Contaminated\n",
       "Variables:\n",
       "Attributes:\n",
       "    Minimum: 9900000000000000.0\n",
       "    Maximum: -9900000000000000.0"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file['Results']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "variable '/Time/Time_00001' has no dimension scale associated with axis 0",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/IPython/core/formatters.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m    700\u001b[0m                 \u001b[0mtype_pprinters\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype_printers\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    701\u001b[0m                 deferred_pprinters=self.deferred_printers)\n\u001b[0;32m--> 702\u001b[0;31m             \u001b[0mprinter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpretty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    703\u001b[0m             \u001b[0mprinter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mflush\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    704\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mstream\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetvalue\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/IPython/lib/pretty.py\u001b[0m in \u001b[0;36mpretty\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m    400\u001b[0m                         \u001b[0;32mif\u001b[0m \u001b[0mcls\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    401\u001b[0m                                 \u001b[0;32mand\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__dict__\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'__repr__'\u001b[0m\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;32m--> 402\u001b[0;31m                             \u001b[0;32mreturn\u001b[0m \u001b[0m_repr_pprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcycle\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    403\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    404\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0m_default_pprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcycle\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/IPython/lib/pretty.py\u001b[0m in \u001b[0;36m_repr_pprint\u001b[0;34m(obj, p, cycle)\u001b[0m\n\u001b[1;32m    695\u001b[0m     \u001b[0;34m\"\"\"A pprint that just redirects to the normal repr function.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    696\u001b[0m     \u001b[0;31m# Find newlines and replace them with p.break_()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 697\u001b[0;31m     \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrepr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    698\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0moutput_line\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutput\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplitlines\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\u001b[0m\n\u001b[1;32m    699\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0midx\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/h5netcdf/core.py\u001b[0m in \u001b[0;36m__repr__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    544\u001b[0m         header = ('<%s %r (%s members)>'\n\u001b[1;32m    545\u001b[0m                   % (self._cls_name, self.name, len(self)))\n\u001b[0;32m--> 546\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0;34m'\\n'\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mheader\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_repr_body\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    547\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    548\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mresize_dimension\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdimension\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/h5netcdf/core.py\u001b[0m in \u001b[0;36m_repr_body\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    536\u001b[0m             ['    %s: %r %s' % (k, v.dimensions, v.dtype)\n\u001b[1;32m    537\u001b[0m              for k, v in self.variables.items()] +\n\u001b[0;32m--> 538\u001b[0;31m             \u001b[0;34m[\u001b[0m\u001b[0;34m'Attributes:'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    539\u001b[0m             ['    %s: %r' % (k, v) for k, v in self.attrs.items()])\n\u001b[1;32m    540\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/h5netcdf/core.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m    535\u001b[0m             \u001b[0;34m[\u001b[0m\u001b[0;34m'Variables:'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    536\u001b[0m             ['    %s: %r %s' % (k, v.dimensions, v.dtype)\n\u001b[0;32m--> 537\u001b[0;31m              for k, v in self.variables.items()] +\n\u001b[0m\u001b[1;32m    538\u001b[0m             \u001b[0;34m[\u001b[0m\u001b[0;34m'Attributes:'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    539\u001b[0m             ['    %s: %r' % (k, v) for k, v in self.attrs.items()])\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/h5netcdf/core.py\u001b[0m in \u001b[0;36mdimensions\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    110\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mdimensions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    111\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dimensions\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 112\u001b[0;31m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dimensions\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_lookup_dimensions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    113\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dimensions\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    114\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/media/doug/warehouse/conda_envs/mohid-analysis/lib/python3.6/site-packages/h5netcdf/core.py\u001b[0m in \u001b[0;36m_lookup_dimensions\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    102\u001b[0m                 raise ValueError('variable %r has no dimension scale '\n\u001b[1;32m    103\u001b[0m                                  \u001b[0;34m'associated with axis %s'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 104\u001b[0;31m                                  % (self.name, axis))\n\u001b[0m\u001b[1;32m    105\u001b[0m             \u001b[0mname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_name_from_dimension\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdim\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    106\u001b[0m             \u001b[0mdims\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: variable '/Time/Time_00001' has no dimension scale associated with axis 0"
     ]
    }
   ],
   "source": [
    "h5file['Time']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## h5py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import h5py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<HDF5 file \"Lagrangian_7_nested_5.hdf5\" (mode r+)>"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file = h5py.File('../../SalishSeaShihan/results/Lagrangian_7_nested_5.hdf5', mode='r')\n",
    "h5file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Grid\n",
      "Results\n",
      "Time\n"
     ]
    }
   ],
   "source": [
    "for k in h5file: print(k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<HDF5 group \"/Grid\" (9 members)>"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file['Grid']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Bathymetry\n",
      "ConnectionX\n",
      "ConnectionY\n",
      "Define Cells\n",
      "Latitude\n",
      "Longitude\n",
      "OpenPoints\n",
      "VerticalZ\n",
      "WaterPoints3D\n"
     ]
    }
   ],
   "source": [
    "for k in h5file['Grid']: print(k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<HDF5 group \"/Results\" (3 members)>"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file['Results']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number\n",
      "OilSpill\n",
      "Percentage Contaminated\n"
     ]
    }
   ],
   "source": [
    "for k in h5file['Results']: print(k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<HDF5 group \"/Time\" (167 members)>"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file['Time']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Time_00001\n",
      "Time_00002\n",
      "Time_00003\n",
      "Time_00004\n",
      "Time_00005\n",
      "Time_00006\n",
      "Time_00007\n",
      "Time_00008\n",
      "Time_00009\n",
      "Time_00010\n",
      "Time_00011\n",
      "Time_00012\n",
      "Time_00013\n",
      "Time_00014\n",
      "Time_00015\n",
      "Time_00016\n",
      "Time_00017\n",
      "Time_00018\n",
      "Time_00019\n",
      "Time_00020\n",
      "Time_00021\n",
      "Time_00022\n",
      "Time_00023\n",
      "Time_00024\n",
      "Time_00025\n",
      "Time_00026\n",
      "Time_00027\n",
      "Time_00028\n",
      "Time_00029\n",
      "Time_00030\n",
      "Time_00031\n",
      "Time_00032\n",
      "Time_00033\n",
      "Time_00034\n",
      "Time_00035\n",
      "Time_00036\n",
      "Time_00037\n",
      "Time_00038\n",
      "Time_00039\n",
      "Time_00040\n",
      "Time_00041\n",
      "Time_00042\n",
      "Time_00043\n",
      "Time_00044\n",
      "Time_00045\n",
      "Time_00046\n",
      "Time_00047\n",
      "Time_00048\n",
      "Time_00049\n",
      "Time_00050\n",
      "Time_00051\n",
      "Time_00052\n",
      "Time_00053\n",
      "Time_00054\n",
      "Time_00055\n",
      "Time_00056\n",
      "Time_00057\n",
      "Time_00058\n",
      "Time_00059\n",
      "Time_00060\n",
      "Time_00061\n",
      "Time_00062\n",
      "Time_00063\n",
      "Time_00064\n",
      "Time_00065\n",
      "Time_00066\n",
      "Time_00067\n",
      "Time_00068\n",
      "Time_00069\n",
      "Time_00070\n",
      "Time_00071\n",
      "Time_00072\n",
      "Time_00073\n",
      "Time_00074\n",
      "Time_00075\n",
      "Time_00076\n",
      "Time_00077\n",
      "Time_00078\n",
      "Time_00079\n",
      "Time_00080\n",
      "Time_00081\n",
      "Time_00082\n",
      "Time_00083\n",
      "Time_00084\n",
      "Time_00085\n",
      "Time_00086\n",
      "Time_00087\n",
      "Time_00088\n",
      "Time_00089\n",
      "Time_00090\n",
      "Time_00091\n",
      "Time_00092\n",
      "Time_00093\n",
      "Time_00094\n",
      "Time_00095\n",
      "Time_00096\n",
      "Time_00097\n",
      "Time_00098\n",
      "Time_00099\n",
      "Time_00100\n",
      "Time_00101\n",
      "Time_00102\n",
      "Time_00103\n",
      "Time_00104\n",
      "Time_00105\n",
      "Time_00106\n",
      "Time_00107\n",
      "Time_00108\n",
      "Time_00109\n",
      "Time_00110\n",
      "Time_00111\n",
      "Time_00112\n",
      "Time_00113\n",
      "Time_00114\n",
      "Time_00115\n",
      "Time_00116\n",
      "Time_00117\n",
      "Time_00118\n",
      "Time_00119\n",
      "Time_00120\n",
      "Time_00121\n",
      "Time_00122\n",
      "Time_00123\n",
      "Time_00124\n",
      "Time_00125\n",
      "Time_00126\n",
      "Time_00127\n",
      "Time_00128\n",
      "Time_00129\n",
      "Time_00130\n",
      "Time_00131\n",
      "Time_00132\n",
      "Time_00133\n",
      "Time_00134\n",
      "Time_00135\n",
      "Time_00136\n",
      "Time_00137\n",
      "Time_00138\n",
      "Time_00139\n",
      "Time_00140\n",
      "Time_00141\n",
      "Time_00142\n",
      "Time_00143\n",
      "Time_00144\n",
      "Time_00145\n",
      "Time_00146\n",
      "Time_00147\n",
      "Time_00148\n",
      "Time_00149\n",
      "Time_00150\n",
      "Time_00151\n",
      "Time_00152\n",
      "Time_00153\n",
      "Time_00154\n",
      "Time_00155\n",
      "Time_00156\n",
      "Time_00157\n",
      "Time_00158\n",
      "Time_00159\n",
      "Time_00160\n",
      "Time_00161\n",
      "Time_00162\n",
      "Time_00163\n",
      "Time_00164\n",
      "Time_00165\n",
      "Time_00166\n",
      "Time_00167\n"
     ]
    }
   ],
   "source": [
    "for k in h5file['Time']: print(k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<HDF5 dataset \"Time_00001\": shape (6,), type \"<f4\">"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file['Time']['Time_00001']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2015.,    4.,    8.,    0.,   30.,    0.], dtype=float32)"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file['Time']['Time_00001'][:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "i.e. the date/time `2015-04-08 00:30:00` stored at 4 32-bit floats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<HDF5 group \"/Results/Number\" (167 members)>"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file['Results']['Number']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Attributes of HDF5 object at 139899974438056>"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file.attrs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [],
   "source": [
    "for attr in h5file.attrs: print(attr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum -9900000000000000.0\n",
      "Maximum -9900000000000000.0\n"
     ]
    }
   ],
   "source": [
    "for attr, value in h5file['Grid'].attrs.items(): print(attr, value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum -9900000000000000.0\n",
      "Maximum -9900000000000000.0\n",
      "Units b'm'\n"
     ]
    }
   ],
   "source": [
    "for attr, value in h5file['Grid']['Bathymetry'].attrs.items(): print(attr, value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum -9900000000000000.0\n",
      "Maximum -9900000000000000.0\n"
     ]
    }
   ],
   "source": [
    "for attr, value in h5file['Results']['Number'].attrs.items(): print(attr, value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<HDF5 group \"/Results/Number\" (167 members)>"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "oil['Results']['Number']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number_00001\n",
      "Number_00002\n",
      "Number_00003\n",
      "Number_00004\n",
      "Number_00005\n",
      "Number_00006\n",
      "Number_00007\n",
      "Number_00008\n",
      "Number_00009\n",
      "Number_00010\n",
      "Number_00011\n",
      "Number_00012\n",
      "Number_00013\n",
      "Number_00014\n",
      "Number_00015\n",
      "Number_00016\n",
      "Number_00017\n",
      "Number_00018\n",
      "Number_00019\n",
      "Number_00020\n",
      "Number_00021\n",
      "Number_00022\n",
      "Number_00023\n",
      "Number_00024\n",
      "Number_00025\n",
      "Number_00026\n",
      "Number_00027\n",
      "Number_00028\n",
      "Number_00029\n",
      "Number_00030\n",
      "Number_00031\n",
      "Number_00032\n",
      "Number_00033\n",
      "Number_00034\n",
      "Number_00035\n",
      "Number_00036\n",
      "Number_00037\n",
      "Number_00038\n",
      "Number_00039\n",
      "Number_00040\n",
      "Number_00041\n",
      "Number_00042\n",
      "Number_00043\n",
      "Number_00044\n",
      "Number_00045\n",
      "Number_00046\n",
      "Number_00047\n",
      "Number_00048\n",
      "Number_00049\n",
      "Number_00050\n",
      "Number_00051\n",
      "Number_00052\n",
      "Number_00053\n",
      "Number_00054\n",
      "Number_00055\n",
      "Number_00056\n",
      "Number_00057\n",
      "Number_00058\n",
      "Number_00059\n",
      "Number_00060\n",
      "Number_00061\n",
      "Number_00062\n",
      "Number_00063\n",
      "Number_00064\n",
      "Number_00065\n",
      "Number_00066\n",
      "Number_00067\n",
      "Number_00068\n",
      "Number_00069\n",
      "Number_00070\n",
      "Number_00071\n",
      "Number_00072\n",
      "Number_00073\n",
      "Number_00074\n",
      "Number_00075\n",
      "Number_00076\n",
      "Number_00077\n",
      "Number_00078\n",
      "Number_00079\n",
      "Number_00080\n",
      "Number_00081\n",
      "Number_00082\n",
      "Number_00083\n",
      "Number_00084\n",
      "Number_00085\n",
      "Number_00086\n",
      "Number_00087\n",
      "Number_00088\n",
      "Number_00089\n",
      "Number_00090\n",
      "Number_00091\n",
      "Number_00092\n",
      "Number_00093\n",
      "Number_00094\n",
      "Number_00095\n",
      "Number_00096\n",
      "Number_00097\n",
      "Number_00098\n",
      "Number_00099\n",
      "Number_00100\n",
      "Number_00101\n",
      "Number_00102\n",
      "Number_00103\n",
      "Number_00104\n",
      "Number_00105\n",
      "Number_00106\n",
      "Number_00107\n",
      "Number_00108\n",
      "Number_00109\n",
      "Number_00110\n",
      "Number_00111\n",
      "Number_00112\n",
      "Number_00113\n",
      "Number_00114\n",
      "Number_00115\n",
      "Number_00116\n",
      "Number_00117\n",
      "Number_00118\n",
      "Number_00119\n",
      "Number_00120\n",
      "Number_00121\n",
      "Number_00122\n",
      "Number_00123\n",
      "Number_00124\n",
      "Number_00125\n",
      "Number_00126\n",
      "Number_00127\n",
      "Number_00128\n",
      "Number_00129\n",
      "Number_00130\n",
      "Number_00131\n",
      "Number_00132\n",
      "Number_00133\n",
      "Number_00134\n",
      "Number_00135\n",
      "Number_00136\n",
      "Number_00137\n",
      "Number_00138\n",
      "Number_00139\n",
      "Number_00140\n",
      "Number_00141\n",
      "Number_00142\n",
      "Number_00143\n",
      "Number_00144\n",
      "Number_00145\n",
      "Number_00146\n",
      "Number_00147\n",
      "Number_00148\n",
      "Number_00149\n",
      "Number_00150\n",
      "Number_00151\n",
      "Number_00152\n",
      "Number_00153\n",
      "Number_00154\n",
      "Number_00155\n",
      "Number_00156\n",
      "Number_00157\n",
      "Number_00158\n",
      "Number_00159\n",
      "Number_00160\n",
      "Number_00161\n",
      "Number_00162\n",
      "Number_00163\n",
      "Number_00164\n",
      "Number_00165\n",
      "Number_00166\n",
      "Number_00167\n"
     ]
    }
   ],
   "source": [
    "for n in h5file['Results']['Number']: print(n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<HDF5 dataset \"Number_00001\": shape (20, 380, 210), type \"<f4\">"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file['Results']['Number']['Number_00001']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum\n",
      "Maximum\n"
     ]
    }
   ],
   "source": [
    "for attr in h5file['Results']['OilSpill'].attrs: print(attr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data_2D\n",
      "Data_3D\n"
     ]
    }
   ],
   "source": [
    "for foo in h5file['Results']['OilSpill']: print(foo)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum 9900000000000000.0\n",
      "Maximum -9900000000000000.0\n"
     ]
    }
   ],
   "source": [
    "for attr, value in h5file['Results']['OilSpill']['Data_2D'].attrs.items(): print(attr, value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Beaching Time\n",
      "Oil Arrival Time\n",
      "OilConcentration_2D\n",
      "Thickness_2D\n"
     ]
    }
   ],
   "source": [
    "for foo in h5file['Results']['OilSpill']['Data_2D']: print(foo)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<HDF5 group \"/Results/OilSpill/Data_2D/OilConcentration_2D\" (167 members)>"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file['Results']['OilSpill']['Data_2D']['OilConcentration_2D']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<HDF5 dataset \"OilConcentration_2D_00001\": shape (380, 210), type \"<f4\">"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file['Results']['OilSpill']['Data_2D']['OilConcentration_2D']['OilConcentration_2D_00001']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum -9900000000000000.0\n",
      "Maximum -9900000000000000.0\n",
      "Units b'ppm'\n"
     ]
    }
   ],
   "source": [
    "for attr, value in h5file['Results']['OilSpill']['Data_2D']['OilConcentration_2D']['OilConcentration_2D_00001'].attrs.items(): print (attr, value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum 9900000000000000.0\n",
      "Maximum -9900000000000000.0\n"
     ]
    }
   ],
   "source": [
    "for attr, value in h5file['Results']['OilSpill']['Data_3D'].attrs.items(): print(attr, value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dissolution_3D\n",
      "OilConcentration_3D\n"
     ]
    }
   ],
   "source": [
    "for foo in h5file['Results']['OilSpill']['Data_3D']: print(foo)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## PyTables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/ (RootGroup) ''\n",
      "/Grid (Group) ''\n",
      "/Results (Group) ''\n",
      "/Time (Group) ''\n",
      "/Results/Number (Group) ''\n",
      "/Results/OilSpill (Group) ''\n",
      "/Results/Percentage Contaminated (Group) ''\n",
      "/Results/OilSpill/Data_2D (Group) ''\n",
      "/Results/OilSpill/Data_3D (Group) ''\n",
      "/Results/OilSpill/Data_3D/Dissolution_3D (Group) ''\n",
      "/Results/OilSpill/Data_3D/OilConcentration_3D (Group) ''\n",
      "/Results/OilSpill/Data_2D/Beaching Time (Group) ''\n",
      "/Results/OilSpill/Data_2D/Oil Arrival Time (Group) ''\n",
      "/Results/OilSpill/Data_2D/OilConcentration_2D (Group) ''\n",
      "/Results/OilSpill/Data_2D/Thickness_2D (Group) ''\n",
      "/Grid/OpenPoints (Group) ''\n",
      "/Grid/VerticalZ (Group) ''\n"
     ]
    }
   ],
   "source": [
    "h5file = tables.open_file('../../SalishSeaShihan/results/Lagrangian_7_nested_5.hdf5', mode='r')\n",
    "for group in h5file.walk_groups(): print(group)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/Results/Number (Group) ''\n",
      "/Results/Number/Number_00001 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00002 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00003 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00004 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00005 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00006 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00007 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00008 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00009 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00010 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00011 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00012 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00013 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00014 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00015 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00016 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00017 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00018 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00019 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00020 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00021 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00022 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00023 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00024 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00025 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00026 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00027 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00028 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00029 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00030 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00031 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00032 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00033 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00034 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00035 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00036 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00037 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00038 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00039 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00040 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00041 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00042 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00043 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00044 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00045 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00046 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00047 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00048 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00049 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00050 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00051 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00052 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00053 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00054 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00055 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00056 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00057 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00058 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00059 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00060 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00061 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00062 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00063 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00064 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00065 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00066 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00067 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00068 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00069 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00070 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00071 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00072 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00073 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00074 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00075 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00076 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00077 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00078 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00079 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00080 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00081 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00082 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00083 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00084 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00085 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00086 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00087 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00088 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00089 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00090 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00091 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00092 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00093 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00094 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00095 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00096 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00097 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00098 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00099 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00100 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00101 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00102 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00103 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00104 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00105 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00106 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00107 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00108 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00109 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00110 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00111 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00112 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00113 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00114 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00115 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00116 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00117 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00118 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00119 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00120 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00121 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00122 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00123 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00124 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00125 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00126 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00127 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00128 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00129 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00130 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00131 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00132 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00133 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00134 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00135 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00136 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00137 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00138 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00139 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00140 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00141 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00142 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00143 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00144 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00145 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00146 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00147 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00148 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00149 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00150 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00151 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00152 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00153 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00154 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00155 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00156 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00157 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00158 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00159 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00160 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00161 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00162 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00163 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00164 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00165 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00166 (CArray(20, 380, 210), zlib(6)) ''\n",
      "/Results/Number/Number_00167 (CArray(20, 380, 210), zlib(6)) ''\n"
     ]
    }
   ],
   "source": [
    "for node in h5file.walk_nodes('/Results/Number'): print(node)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "/Results/Number/Number_00001._v_attrs (AttributeSet), 3 attributes:\n",
       "   [Maximum := -9900000000000000.0,\n",
       "    Minimum := -9900000000000000.0,\n",
       "    Units := b'a']"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file.root.Results.Number.Number_00001.attrs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "/Results/OilSpill/Data_3D/OilConcentration_3D/OilConcentration_3D_00001._v_attrs (AttributeSet), 3 attributes:\n",
       "   [Maximum := -9900000000000000.0,\n",
       "    Minimum := -9900000000000000.0,\n",
       "    Units := b'Kg/m3']"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file.root.Results.OilSpill.Data_3D.OilConcentration_3D.OilConcentration_3D_00001.attrs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "/Results/OilSpill/Data_3D/OilConcentration_3D/OilConcentration_3D_00001 (CArray(20, 380, 210), zlib(6)) ''\n",
       "  atom := Float32Atom(shape=(), dflt=0.0)\n",
       "  maindim := 0\n",
       "  flavor := 'numpy'\n",
       "  byteorder := 'little'\n",
       "  chunkshape := (20, 380, 210)"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "h5file.root.Results.OilSpill.Data_3D.OilConcentration_3D.OilConcentration_3D_00001"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}