{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Documentation on dimensions and indexing in Parcels" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Parcels supports Fields on any curvilinear Grid. For velocity Fields (U, V and W), there are some additional restrictions if the Grid is discretized as an Arakawa B- or Arakawa C-grid. That is because under the hood, Parcels uses a specific interpolation scheme for each of these grid types. This is described in [Section 2 of Delandmeter and Van Sebille (2019)](https://www.geosci-model-dev.net/12/3571/2019/gmd-12-3571-2019.html) and summarized below.\n", "\n", "The summary is: **for Arakawa B-and C-grids, Parcels requires the locations of the _corner_ points ($f$-points) of the grid cells for the dimensions dictionary of velocity Fields.** In other words, on an Arakawa C-grid, the [k, j, i] node of U will _not_ be located at position [k, j, i] of U.grid.\n", "\n", "### Barycentric coordinates and indexing in Parcels\n", "\n", "#### arakawa C-grids\n", "\n", "In a regular grid (also called an Arakawa A-grid), the velocities (U, V and W) and tracers (e.g. temperature) are all located in the center of each cell. But hydrodynamic model data is often supplied on staggered grids (e.g. for NEMO, POP and MITgcm), where U, V and W are shifted with respect to the cell centers. \n", "\n", "To keep it simple, let's take the case of a 2D Arakawa C-grid. Zonal (U) velocities are located at the east and west faces of each cell and meridional (V) velocities at the north and south. The following diagram shows a comparison of 4x4 A- and C-grids.\n", "\n", "![Arakawa Grid layouts](https://oceanparcels.org/images/grid_comparison.png)\n", "\n", "Note that different models use different indices to relate the location of the staggered velocities to the cell centers. The default C-grid indexing notation in Parcels is the same as for **NEMO** (middle panel): U[j, i] is located between the cell corners [j-1, i] and [j, i], and V[j, i] is located between cell corners [j, i-1] and [j, i]. \n", "\n", "Now, as you've noticed on the grid illustrated on the figure, there are 4x4 cells. The grid providing the cell corners is a 5x5 grid, but there are only 4x5 U nodes and 5x4 V nodes, since the grids are staggered. This implies that the first row of U data and the first column of V data is never used (and do not physically exist), but the U and V fields are correctly provided on a 5x5 table. If your original data are provided on a 4x5 U grid and a 5x4 V grid, you need to regrid your table to follow Parcels notation before creating a FieldSet! \n", "\n", "**MITgcm** uses a different indexing: U[j, i] is located between the cell corners [j, i] and [j+1, i], and V[j, i] is located between cell corners [j, i] and [j, i+1]. If you use [xmitgcm](https://xmitgcm.readthedocs.io/en/latest/) to write your data to a NetCDF file, U and V will have the same dimensions as your grid (in the above case 4x4 rather than 5x5 as in NEMO), meaning that the last column of U and the last row of V are omitted. In MITgcm, these either correspond to a solid boundary, or in the case of a periodic domain, to the first column and row respectively. In the latter case, and assuming your model domain is periodic, you can use the FieldSet.add_periodic_halo method to make sure particles can be correctly interpolated in the last zonal/meridional cells.\n", "\n", "Parcels can take care of loading C-grid data for you, through the general FieldSet.from_c_grid_dataset method (which takes a gridindexingtype argument), and the model-specific methods FieldSet.from_nemo and FieldSet.from_mitgcm.\n", "\n", "The only information that Parcels needs is the location of the 4 corners of the cell, which are called the $f$-node. Those are the ones provided by U.grid (and are equal to the ones in V.grid). Parcels does not need the exact location of the U and V nodes, because in C-grids, U and V nodes are always located in the same position relative to the $f$-node.\n", "\n", "Importantly, the interpolation of velocities on Arakawa C-grids is done in barycentric coordinates: $\\xi$, $\\eta$ and $\\zeta$ instead of longitude, latitude and depth. These coordinates are always between 0 and 1, measured from the corner of the grid cell. This is more accurate than simple linear interpolation on curvilinear grids.\n", "\n", "When calling FieldSet.from_c_grid_dataset() or a method that is based on it like FieldSet.from_nemo(), Parcels automatically sets the interpolation method for the U, V and W Fields to cgrid_velocity. With this interpolation method, the velocity interpolation follows the description in [Section 2.1.2 of Delandmeter and Van Sebille (2019)](https://www.geosci-model-dev.net/12/3571/2019/gmd-12-3571-2019.html).\n", "\n", "##### NEMO Example" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from parcels import FieldSet\n", "from glob import glob\n", "import numpy as np\n", "from os import path\n", "from datetime import timedelta as delta" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see how this works. We'll use the NemoNorthSeaORCA025-N006_data data, which is on an arakawa C-grid. If we create the FieldSet using the coordinates in the U, V and W files, we get an Error as seen below:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "On a C-grid, the dimensions of velocities should be the corners (f-points) of the cells, so the same for U and V. See also https://nbviewer.jupyter.org/github/OceanParcels/parcels/blob/master/parcels/examples/documentation_indexing.ipynb", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 10\u001b[0m 'W': {'lon': 'nav_lon', 'lat': 'nav_lat', 'depth': 'depthw', 'time': 'time_counter'}}\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mfieldset\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mFieldSet\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_nemo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilenames\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvariables\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdimensions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/Codes/PARCELScode/parcels/fieldset.py\u001b[0m in \u001b[0;36mfrom_nemo\u001b[0;34m(cls, filenames, variables, dimensions, indices, mesh, allow_time_extrapolation, time_periodic, tracer_interp_method, field_chunksize, **kwargs)\u001b[0m\n\u001b[1;32m 463\u001b[0m fieldset = cls.from_c_grid_dataset(filenames, variables, dimensions, mesh=mesh, indices=indices, time_periodic=time_periodic,\n\u001b[1;32m 464\u001b[0m \u001b[0mallow_time_extrapolation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mallow_time_extrapolation\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtracer_interp_method\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtracer_interp_method\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 465\u001b[0;31m field_chunksize=field_chunksize, **kwargs)\n\u001b[0m\u001b[1;32m 466\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfieldset\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'W'\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 467\u001b[0m \u001b[0mfieldset\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mW\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_scaling_factor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1.\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/Codes/PARCELScode/parcels/fieldset.py\u001b[0m in \u001b[0;36mfrom_c_grid_dataset\u001b[0;34m(cls, filenames, variables, dimensions, indices, mesh, allow_time_extrapolation, time_periodic, tracer_interp_method, field_chunksize, **kwargs)\u001b[0m\n\u001b[1;32m 524\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 525\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'U'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdimensions\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;34m'V'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdimensions\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mdimensions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'U'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mdimensions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'V'\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--> 526\u001b[0;31m raise ValueError(\"On a C-grid, the dimensions of velocities should be the corners (f-points) of the cells, so the same for U and V. \"\n\u001b[0m\u001b[1;32m 527\u001b[0m \"See also https://nbviewer.jupyter.org/github/OceanParcels/parcels/blob/master/parcels/examples/documentation_indexing.ipynb\")\n\u001b[1;32m 528\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'U'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdimensions\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;34m'W'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdimensions\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mdimensions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'U'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mdimensions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'W'\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;31mValueError\u001b[0m: On a C-grid, the dimensions of velocities should be the corners (f-points) of the cells, so the same for U and V. See also https://nbviewer.jupyter.org/github/OceanParcels/parcels/blob/master/parcels/examples/documentation_indexing.ipynb" ] } ], "source": [ "data_path = 'NemoNorthSeaORCA025-N006_data/'\n", "ufiles = sorted(glob(data_path+'ORCA*U.nc'))\n", "vfiles = sorted(glob(data_path+'ORCA*V.nc'))\n", "wfiles = sorted(glob(data_path+'ORCA*W.nc'))\n", "\n", "filenames = {'U': ufiles, 'V': vfiles, 'W': wfiles}\n", "variables = {'U': 'uo', 'V': 'vo', 'W': 'wo'}\n", "dimensions = {'U': {'lon': 'nav_lon', 'lat': 'nav_lat', 'depth': 'depthu', 'time': 'time_counter'},\n", " 'V': {'lon': 'nav_lon', 'lat': 'nav_lat', 'depth': 'depthv', 'time': 'time_counter'},\n", " 'W': {'lon': 'nav_lon', 'lat': 'nav_lat', 'depth': 'depthw', 'time': 'time_counter'}}\n", "\n", "fieldset = FieldSet.from_nemo(filenames, variables, dimensions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can still load the data this way, if we use the FieldSet.from_netcdf() method. But because this method assumes the data is on an Arakawa-A grid, **this will mean wrong interpolation**." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "fieldsetA = FieldSet.from_netcdf(filenames, variables, dimensions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead, we need to provide the coordinates of the $f$-points. In NEMO, these are called glamf, gphif and depthw (in MITgcm, these would be called XG, YG and Zl). The first two are in the coordinates.nc file, the last one is in the W file. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING: File NemoNorthSeaORCA025-N006_data/coordinates.nc could not be decoded properly by xarray (version 0.15.1).\n", " It will be opened with no decoding. Filling values might be wrongly parsed.\n", "WARNING: Casting lon data to np.float32\n", "WARNING: Casting lat data to np.float32\n", "WARNING: Trying to initialize a shared grid with different chunking sizes - action prohibited. Replacing requested field_chunksize with grid's master chunksize.\n" ] } ], "source": [ "mesh_mask = data_path + 'coordinates.nc'\n", "\n", "filenames = {'U': {'lon': mesh_mask, 'lat': mesh_mask, 'depth': wfiles[0], 'data': ufiles},\n", " 'V': {'lon': mesh_mask, 'lat': mesh_mask, 'depth': wfiles[0], 'data': vfiles},\n", " 'W': {'lon': mesh_mask, 'lat': mesh_mask, 'depth': wfiles[0], 'data': wfiles}}\n", "\n", "dimensions = {'U': {'lon': 'glamf', 'lat': 'gphif', 'depth': 'depthw', 'time': 'time_counter'},\n", " 'V': {'lon': 'glamf', 'lat': 'gphif', 'depth': 'depthw', 'time': 'time_counter'},\n", " 'W': {'lon': 'glamf', 'lat': 'gphif', 'depth': 'depthw', 'time': 'time_counter'}}\n", "\n", "fieldsetC = FieldSet.from_nemo(filenames, variables, dimensions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can plot the different grid points to see that indeed, the longitude and latitude of fieldsetA.U and fieldsetA.V are different." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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SqU1vG/nzp1lqampJ7WqqTXGjh0bn5WVVfHrX//6ut7MAk1FRYWuS5curpqaGvzXf/1Xv6lTp56cMmXK2Zulv4Z27twZmZqaGu9pHXfHEBER+Zh58+ZFm81mi8lkSurdu/elSZMmeRUY2rq/luLuGCIi0ty6devKtK7Bl6xYseKHm7m/luJMCBEREWmCIYSIiIg0wRBCREREmmAIISIiIk0whBARUbtIT09PWLdu3RUn63rmmWe6T5o0yePF1lrjl7/85S1bt2696hTkDa1ataprc21uNo888kj0Rx995NXp8hv65ptvQkRkcONxuF533XVXP0+nl3/sscein3rqqR6t7Y8hhIiI2sX48eNPrVmz5oort65bty5i0qRJp73te+3atQcHDx58zTOnfvTRR1137doV4u1j3UhLly49cu+993p1uvyGVq1a1e22226reuedd5q8gm5LuFwuOJ1OfPnll/sjIyObPZFZSzGEEBHRZRs3ouOCBei5cSM6etvX5MmTz+Tn53e5cOGCAO6zeJ44cSJoxIgRV5y2vaSkxNinT5+k++67L95kMllGjhx5a/0VbtevX98pMTHRYjKZLOPHj4+v7ys9PT3hq6++CgWA0NDQQb/97W9jEhISLKmpqeZDhw4ZNmzY0HHjxo1df//738eazWbLnj17ghctWtS9b9++SSaTyZKVlXVr43pLSkqMgwcPTrBYLIkWiyVxw4YNHQHg4MGDQWlpaQlms9nSv3//pM8++yystrYWY8eOje/fv3+SyWSy/PGPf+zeuK6jR48aYmJiUgAgNze3W2ZmZt/hw4f3i4mJSfnTn/4U9Yc//KFHYmKiJTU11Xz8+HE94D5p25tvvhkOADExMSmPPvpotMViSTSZTJbt27d3AIAjR44Yhg4d2t9isSRmZ2ffEh0dnXL06NGrTrnhcrmQl5cX/te//rVs06ZNnc+fP+/xyoFN9VdSUmK89dZbkyZNmtQ7KSnJcuDAAWNMTMzlx3r88cd7xsfHJw8dOtS0b9++4Nb/C2EIISKiOhs3omNWFkwvvICYrCyYvA0iPXv2dKampp5bt25dF8B9QbXRo0ef0emufuspKyvrMHPmzPLS0tKiTp06uZYsWRJ1/vx5mTFjRp+1a9ceKC0tLaqtrcWSJUuuumT8hQsXdFartaqkpKTIarVWLVu2LOrnP//5uczMzLOLFi36obi4uCgpKelSbm5uz8LCwqLS0tKilStXHmzcT3R0dO2mTZtKi4qK9q5du/Zfjz76aG8AeOONNyIyMjIqiouLi/bu3btnyJAh5x0OR+jRo0eD9u3bt6e0tLTooYceavYqsqWlpSHr1q3713fffbc3JycnJjQ01LV3796itLS0c6+99prHa69ERkbWFhUV7Z02bVr5c8891wMAnnjiiei77rqrsqioaO9999135ujRo0ZP227YsCEsLi7uUlJS0qUhQ4ZUvvfee108tbtWf2VlZR1+/etfn9q7d2+RyWSqrr9/06ZNoR9++GHE7t27i/Ly8vbv3Lnzuv6tMIQQEREAID8fnWpqoHO5gNpa6PLz4fWxCffff//ptWvXhgPABx98EDF58mSPu2J69uxZPWLEiHMAMHny5FObN28O27lzZ4fY2NhLAwYMuAQAU6dOPfX1119fVVNQUJCaMGFCBQAMHjz43MGDBz2+KSckJFwYM2ZMn+XLl0cEBQVddc2S6upqyc7Ojq+bdel74MCBDgBw++23n1uzZk3kY489Fr1ly5aQ8PBwl9lsvnTo0KHgBx54IO7999/vHB4e3uwuiqFDh1aGh4e7oqOja8PCwpzjx48/CwApKSnny8rKPM4kZGdnnwGA9PT084cOHQoGgC1btoQ98MADpwFg3LhxP3bu3NnjY7/99tsR48aNOw0AEyZMOP3uu+963CVzrf569epVnZGRcdW1hL744ouwe+6552ynTp1cERERrhEjRlzXGVYZQoiICACQkYHKoCC49HrAYIArIwNeH5swceLEs998803nr7/+OvTixYu6YcOGebygm4hc9XtLr21mMBhU/eyKwWBAbW2tx90OX3zxxb6HHnqofOvWrR1TU1MtNTU1V6xfvHhxj+7du9fs3bu3aPfu3UU1NTU6ALj77rurvvrqq5KYmJjqqVOn9nnllVe6RUVFOQsLC4t+9rOfVS5fvrz7hAkT4utrcTrd7+GNd38YjcbLT0in06FDhw6q/uemaq5vYzAYVH2blrwutbW1+PTTT8OXLFkSHRMTkzJv3rzeX375ZZczZ87ocnJyosxms8VsNlvKysqCrtVfaGioq6l1jcfserQ4hIiIXkS2i0he3e8rReR7EdlRdxvYxHbOBm0+9rpiIiJqF5mZOJeXh9J583A4Lw+lmZnw+mq6Xbp0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\n", "text/plain": [ "