{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Spherical grids and UnitConversion\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "In most applications, Parcels works with `spherical` meshes, where longitude and latitude are given in degrees, while depth is given in meters. But it is also possible to use `flat` meshes, where longitude and latitude are given in meters (note that the dimensions are then still called `longitude` and `latitude` for consistency reasons).\n", "\n", "In all cases, velocities are given in m/s. So Parcels seamlessly converts between meters and degrees, under the hood. For transparency, this tutorial explain how this works.\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Let's first import the relevant modules, and create dictionaries for the `U`, `V` and `temp` data arrays, with the velocities 1 m/s and the temperature 20C.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "from parcels import Field, FieldSet" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "xdim, ydim = (10, 20)\n", "data = {\n", " \"U\": np.ones((ydim, xdim), dtype=np.float32),\n", " \"V\": np.ones((ydim, xdim), dtype=np.float32),\n", " \"temp\": 20 * np.ones((ydim, xdim), dtype=np.float32),\n", "}\n", "dims = {\n", " \"lon\": np.linspace(-15, 5, xdim, dtype=np.float32),\n", " \"lat\": np.linspace(35, 60, ydim, dtype=np.float32),\n", "}" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We can convert these data and dims to a FieldSet object using `FieldSet.from_data`. We add the argument `mesh='spherical'` (this is the default option) to signal that all longitudes and latitudes are in degrees.\n", "\n", "Plotting the `U` field indeed shows a uniform 1m/s eastward flow.\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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aqrHa4YNG9bo/K1bt2rw4MHq0sX+ZMqffHLgdDq1YMGCgHp/AzG3vkCLVyLmthBo8UqBF3Ogxdve5syZo5dfflmvvPKKdu/erYcfflglJSVKT0+XJGVmZmry5Mnu89PT07V//37NmTNHu3fv1iuvvKJVq1Zp7ty5Xt23wy1lBAAA/7R8+XItXrxYZWVlSk5O1vPPP6/rr79ekjR16lTt27dPubm57vPz8vL08MMPq6ioSPHx8XrsscfcyYRdJAcAAMDiJz+sAAAAvENyAAAALEgOAACABckBAACwCPjk4Omnn1Zqaqq6du2q8847z+M5Doej0XGuV1jW1tbq17/+taKjo9WtWzfddtttOnDgQJvE/OWXX+ree+9VQkKCwsPDNXDgQP3+978/Z7833HBDo9/znnvuaZOYJamkpETjx49Xt27dFB0drdmzZ59zu9HWfM5nys3N9fjvwOFwKD8/v8nrpk6d2uj8oUOH+j0+T/r169fo3o8//niz1xhjlJWVpfj4eIWHh+uGG25QUVFRm8S7b98+TZs2TUlJSQoPD9eFF16oBQsWnPPfQFs/4/Z4/W1LZWdn6+qrr1ZERIT69OmjX/ziF/r666+bvaapf+t///vfWz3erKysRveNjY1t9pr2fL5oWsAnB3V1dbrrrrv0q1/9qtnzVq9erbKyMvcxZcqUZs/PyMjQxo0btW7dOn388cc6duyYbr31VtXX17d6zAUFBerdu7def/11FRUVaf78+crMzNSyZcvO2feMGTMsv+eLL77oc7x2Yq6vr9e4ceN0/Phxffzxx1q3bp3efvttPfLII83225rP+UypqamW51JWVqbp06erX79+Gjx4cLPX3nzzzZbrNm/e7NfYmrNw4ULLvf/93/+92fMXL16sJUuWaNmyZcrPz1dsbKzGjBmjmpqaVo/173//u1wul1588UUVFRXp+eef1wsvvKB58+ad89q2esbt9frblsrLy9ODDz6oTz75RDk5OTp16pTS0tJ0/Pjxc1779ddfW55p//792yBi6dJLL7Xcd+fOnU2e297PF82w/YqmDm716tUmKirK42eSzMaNG233dfToUdOlSxezbt06d9vBgwdNp06dzHvvvedjpP/UXMxnmzlzphk5cmSz54wYMcI89NBDvgfWjKZi3rx5s+nUqZM5ePCgu+3NN980TqfTVFVVeeyrrZ6zJ3V1daZPnz5m4cKFzZ43ZcoUc/vtt7dqLE1JTEw0zz//vO3zXS6XiY2NNc8884y77YcffjBRUVHmhRdeaIUIz23x4sUmKSmp2XPa8hlfc801Jj093dJ2ySWXmMcff9zj+Y8++qi55JJLLG0PPPCAGTp0aKvF2JyKigojyeTl5TV5zocffmgkmSNHjrRdYD9asGCBueKKK2yf39GeL/4p4CsHds2aNUvR0dG6+uqr9cILL8jlcjV5bkFBgU6ePKm0tDR3W3x8vJKTk7V9+/a2CLeRqqoq9ezZ85znrV27VtHR0br00ks1d+7cNvnGKEk7duxQcnKy5c1oN910k2pra1VQUODxmvZ8zps2bVJlZaWmTp16znNzc3PVp08fDRgwQDNmzFBFRUWrxnamZ599Vr169dKVV16pp59+utkSfXFxscrLyy3P0+l0asSIER3+321bPOO6ujoVFBRYno8kpaWlNfl8duzY0ej8m266SZ999plOnjzp9xjPpaqqSpJsPdNBgwYpLi5Oo0eP1ocfftjaobnt2bNH8fHxSkpK0j333KO9e/c2eW5He774pw73VsbW8OSTT2r06NEKDw/X//7v/+qRRx5RZWVlkyXa8vJyhYaGqkePHpb25l6T2Zp27Nih//7v/9Y777zT7HmTJk1SUlKSYmNj9dVXXykzM1Nffvllo322W4On14T26NFDoaGhzb5atL2e86pVq3TTTTcpISGh2fPGjh2ru+66S4mJiSouLtZvf/tbjRo1SgUFBa2+/etDDz2kq666Sj169NDf/vY3ZWZmqri4WC+//LLH8xuemafXte7fv79VY/XkH//4h/74xz/queeea/a8tnrG7fn6W38wxmjOnDm67rrrlJyc3OR5cXFxWrlypVJSUlRbW6v/+q//0ujRo5Wbm+veVa+1DBkyRGvWrNGAAQN06NAhPfXUU0pNTVVRUZHHl/50pOeLs7R36cKTBQsWGEnNHvn5+ZZrvCnR/8d//IeJjIxs8vO1a9ea0NDQRu033nijeeCBB9o05q+++sr07t3bPPnkk+f+xc7y2WefGUmmoKCg1WOeMWOGSUtLa9TepUsX8+abb3q8f0uesz9+h9LSUtOpUyfz1ltv2brHmb777jvTpUsX8/bbb3t9bUvjbfDWW28ZSaaystLj53/961+NJPPdd99Z2qdPn25uuummFsXb0pgPHjxoLrroIjNt2jSv7+frM27KwYMHjSSzfft2S/tTTz1lLr74Yo/X9O/f3yxatMjS9vHHHxtJpqyszK/xncvMmTNNYmKiKS0t9fraW2+91YwfP74VomresWPHTExMjHnuuec8ft6Rni+sOmTlYNasWeecZd+vX78W9z906FBVV1fr0KFDHl97GRsbq7q6Oh05csTyrbaioqLJN2G1Rsy7du3SqFGjNGPGjHNORPPkqquuUpcuXbRnzx5dddVVjT73Z8yxsbH69NNPLW1HjhzRyZMnm321qLfP+Wwt+R1Wr16tXr166bbbbrN1jzPFxcUpMTFRe/bs8fpaybdn3jCD/9tvv/X4LaxhVnh5ebnlG1dzr3e1w9uYv/vuO40cOVLDhg3TypUrvb6fr8+4Ke35+ltf/frXv9amTZv00UcfqW/fvl5fP3ToUL3++uutEFnzunXrpssuu6zJ/y87yvNFYx0yOYiOjlZ0dHSr9V9YWKiwsLAml+SlpKSoS5cuysnJ0d133y1JKisr01dffaXFixd7vMbfMRcVFWnUqFGaMmWKnn766Rb3cfLkySZLc/6MediwYXr66adVVlbmvt/WrVvldDqVkpLi8ZqWPGdffwdjjFavXq3Jkyd79frSBocPH1ZpaWmLy52+PPPCwkJJavLeDUNKOTk5GjRokKTT4+x5eXl69tlnW3RPybuYDx48qJEjRyolJUWrV69Wp07eT2vy9Rk35czX395xxx3u9pycHN1+++0erxk2bJj+8pe/WNpa8vrbljLG6Ne//rU2btyo3NxcJSUltaifwsLCdinR19bWavfu3Ro+fLjHz9v7+aIZ7V268NX+/ftNYWGheeKJJ0z37t1NYWGhKSwsNDU1NcYYYzZt2mRWrlxpdu7cab799lvz0ksvmcjISDN79mx3HwcOHDAXX3yx+fTTT91t6enppm/fvub99983n3/+uRk1apS54oorzKlTp1o95oahhEmTJpmysjL3UVFR0WTM3377rXniiSdMfn6+KS4uNu+884655JJLzKBBg9ok5lOnTpnk5GQzevRo8/nnn5v333/f9O3b18yaNavJmI1p3efsyfvvv28kmV27dnn8/OKLLzYbNmwwxhhTU1NjHnnkEbN9+3ZTXFxsPvzwQzNs2DBz/vnnm+rq6laJr8H27dvNkiVLTGFhodm7d69Zv369iY+PN7fddluT8RpjzDPPPGOioqLMhg0bzM6dO829995r4uLiWj1eY/45lDBq1Chz4MABy7/dpmJu62e8bt0606VLF7Nq1Sqza9cuk5GRYbp162b27dtnjDHm8ccfN/fff7/7/L1795quXbuahx9+2OzatcusWrXKdOnSpUVDUi3xq1/9ykRFRZnc3FzL8/z+++/d55wd8/PPP282btxovvnmG/PVV1+Zxx9/3Ejy+zCNJ4888ojJzc01e/fuNZ988om59dZbTURERId9vmhawCcHU6ZM8TgG+uGHHxpjjHn33XfNlVdeabp37266du1qkpOTzdKlS83JkyfdfRQXF1uuMcaYEydOmFmzZpmePXua8PBwc+utt5qSkpI2ibmpMd7ExMQmYy4pKTHXX3+96dmzpwkNDTUXXnihmT17tjl8+HCbxGzM6QRi3LhxJjw83PTs2dPMmjXL/PDDD03GbEzrPmdP7r33XpOamtrk55LM6tWrjTHGfP/99yYtLc307t3bdOnSxfzsZz8zU6ZMadX4GhQUFJghQ4aYqKgoExYWZi6++GKzYMECc/z48SbjNeb0csYFCxaY2NhY43Q6zfXXX2927tzZ6vEac3o+iqd/I2d/B2nvZ/yf//mfJjEx0YSGhpqrrrrKsixwypQpZsSIEZbzc3NzzaBBg0xoaKjp16+fWbFiRavFdramnueZ/5+fHfOzzz5rLrzwQhMWFmZ69OhhrrvuOvPOO++0SbwTJ040cXFxpkuXLiY+Pt5MmDDBFBUVNRmrMe37fNE0XtkMAAAsgmafAwAAYA/JAQAAsCA5AAAAFiQHAADAguQAAABYkBwAAAALkgMAAGBBcgAAACxIDgAAgAXJAQAAsCA5AAAAFv8PF3CanRm6PA4AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fieldset = FieldSet.from_data(data, dims, mesh=\"spherical\")\n", "plt.pcolormesh(fieldset.U.lon, fieldset.U.lat, fieldset.U.data[0, :, :], vmin=0, vmax=1)\n", "plt.colorbar()\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "However, printing the velocites directly shows something perhaps surprising. Here, we use the square-bracket field-interpolation notation to print the field value at (5W, 40N, 0m depth) at time 0. _Note that sampling a velocity in Parcels is done by calling the `fieldset.UV` VectorField; see the [Field Sampling tutorial](https://docs.oceanparcels.org/en/latest/examples/tutorial_sampling.html#Sampling-velocity-fields) for more information._\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1.1747725785927634e-05, 8.999280057595393e-06)\n", "20.0\n" ] } ], "source": [ "print(fieldset.UV[0, 0, 40, -5])\n", "print(fieldset.temp[0, 0, 40, -5])" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "While the temperature field indeed is 20C, as we defined, these printed velocities are much smaller.\n", "\n", "This is because Parcels converts under the hood from m/s to degrees/s. This conversion is done with a `UnitConverter` object, which is stored in the `.units` attribute of each Field. Below, we print these\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "U: \n", "V: \n", "temp: \n" ] } ], "source": [ "for fld in [fieldset.U, fieldset.V, fieldset.temp]:\n", " print(f\"{fld.name}: {fld.units}\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "So the U field has a `GeographicPolar` UnitConverter object, the V field has a `Geographic` Unitconverter and the `temp` field has a `UnitConverter` object.\n", "\n", "Indeed, if we multiply the value of the V field with 1852 \\* 60 (the number of meters in 1 degree of latitude), we get the expected 1 m/s.\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0000000000000002\n" ] } ], "source": [ "u, v = fieldset.UV[0, 0, 40, -5]\n", "print(v * 1852 * 60)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Note that you can also interpolate the Field without a unit conversion, by using the `eval()` method and setting `applyConversion=False`, as below\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1.0, 1.0)\n" ] } ], "source": [ "print(fieldset.UV.eval(0, 0, 40, -5, applyConversion=False))" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## UnitConverters for `mesh='flat'`\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "If longitudes and latitudes are given in meters, rather than degrees, simply add `mesh='flat'` when creating the FieldSet object.\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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aqrHa4YNG9bo/K1bt2rw4MHq0sX+ZMqffHLgdDq1YMGCgHp/AzG3vkCLVyLmthBo8UqBF3Ogxdve5syZo5dfflmvvPKKdu/erYcfflglJSVKT0+XJGVmZmry5Mnu89PT07V//37NmTNHu3fv1iuvvKJVq1Zp7ty5Xt23wy1lBAAA/7R8+XItXrxYZWVlSk5O1vPPP6/rr79ekjR16lTt27dPubm57vPz8vL08MMPq6ioSPHx8XrsscfcyYRdJAcAAMDiJz+sAAAAvENyAAAALEgOAACABckBAACwCPjk4Omnn1Zqaqq6du2q8847z+M5Doej0XGuV1jW1tbq17/+taKjo9WtWzfddtttOnDgQJvE/OWXX+ree+9VQkKCwsPDNXDgQP3+978/Z7833HBDo9/znnvuaZOYJamkpETjx49Xt27dFB0drdmzZ59zu9HWfM5nys3N9fjvwOFwKD8/v8nrpk6d2uj8oUOH+j0+T/r169fo3o8//niz1xhjlJWVpfj4eIWHh+uGG25QUVFRm8S7b98+TZs2TUlJSQoPD9eFF16oBQsWnPPfQFs/4/Z4/W1LZWdn6+qrr1ZERIT69OmjX/ziF/r666+bvaapf+t///vfWz3erKysRveNjY1t9pr2fL5oWsAnB3V1dbrrrrv0q1/9qtnzVq9erbKyMvcxZcqUZs/PyMjQxo0btW7dOn388cc6duyYbr31VtXX17d6zAUFBerdu7def/11FRUVaf78+crMzNSyZcvO2feMGTMsv+eLL77oc7x2Yq6vr9e4ceN0/Phxffzxx1q3bp3efvttPfLII83225rP+UypqamW51JWVqbp06erX79+Gjx4cLPX3nzzzZbrNm/e7NfYmrNw4ULLvf/93/+92fMXL16sJUuWaNmyZcrPz1dsbKzGjBmjmpqaVo/173//u1wul1588UUVFRXp+eef1wsvvKB58+ad89q2esbt9frblsrLy9ODDz6oTz75RDk5OTp16pTS0tJ0/Pjxc1779ddfW55p//792yBi6dJLL7Xcd+fOnU2e297PF82w/YqmDm716tUmKirK42eSzMaNG233dfToUdOlSxezbt06d9vBgwdNp06dzHvvvedjpP/UXMxnmzlzphk5cmSz54wYMcI89NBDvgfWjKZi3rx5s+nUqZM5ePCgu+3NN980TqfTVFVVeeyrrZ6zJ3V1daZPnz5m4cKFzZ43ZcoUc/vtt7dqLE1JTEw0zz//vO3zXS6XiY2NNc8884y77YcffjBRUVHmhRdeaIUIz23x4sUmKSmp2XPa8hlfc801Jj093dJ2ySWXmMcff9zj+Y8++qi55JJLLG0PPPCAGTp0aKvF2JyKigojyeTl5TV5zocffmgkmSNHjrRdYD9asGCBueKKK2yf39GeL/4p4CsHds2aNUvR0dG6+uqr9cILL8jlcjV5bkFBgU6ePKm0tDR3W3x8vJKTk7V9+/a2CLeRqqoq9ezZ85znrV27VtHR0br00ks1d+7cNvnGKEk7duxQcnKy5c1oN910k2pra1VQUODxmvZ8zps2bVJlZaWmTp16znNzc3PVp08fDRgwQDNmzFBFRUWrxnamZ599Vr169dKVV16pp59+utkSfXFxscrLyy3P0+l0asSIER3+321bPOO6ujoVFBRYno8kpaWlNfl8duzY0ej8m266SZ999plOnjzp9xjPpaqqSpJsPdNBgwYpLi5Oo0eP1ocfftjaobnt2bNH8fHxSkpK0j333KO9e/c2eW5He774pw73VsbW8OSTT2r06NEKDw/X//7v/+qRRx5RZWVlkyXa8vJyhYaGqkePHpb25l6T2Zp27Nih//7v/9Y777zT7HmTJk1SUlKSYmNj9dVXXykzM1Nffvllo322W4On14T26NFDoaGhzb5atL2e86pVq3TTTTcpISGh2fPGjh2ru+66S4mJiSouLtZvf/tbjRo1SgUFBa2+/etDDz2kq666Sj169NDf/vY3ZWZmqri4WC+//LLH8xuemafXte7fv79VY/XkH//4h/74xz/queeea/a8tnrG7fn6W38wxmjOnDm67rrrlJyc3OR5cXFxWrlypVJSUlRbW6v/+q//0ujRo5Wbm+veVa+1DBkyRGvWrNGAAQN06NAhPfXUU0pNTVVRUZHHl/50pOeLs7R36cKTBQsWGEnNHvn5+ZZrvCnR/8d//IeJjIxs8vO1a9ea0NDQRu033nijeeCBB9o05q+++sr07t3bPPnkk+f+xc7y2WefGUmmoKCg1WOeMWOGSUtLa9TepUsX8+abb3q8f0uesz9+h9LSUtOpUyfz1ltv2brHmb777jvTpUsX8/bbb3t9bUvjbfDWW28ZSaaystLj53/961+NJPPdd99Z2qdPn25uuummFsXb0pgPHjxoLrroIjNt2jSv7+frM27KwYMHjSSzfft2S/tTTz1lLr74Yo/X9O/f3yxatMjS9vHHHxtJpqyszK/xncvMmTNNYmKiKS0t9fraW2+91YwfP74VomresWPHTExMjHnuuec8ft6Rni+sOmTlYNasWeecZd+vX78W9z906FBVV1fr0KFDHl97GRsbq7q6Oh05csTyrbaioqLJN2G1Rsy7du3SqFGjNGPGjHNORPPkqquuUpcuXbRnzx5dddVVjT73Z8yxsbH69NNPLW1HjhzRyZMnm321qLfP+Wwt+R1Wr16tXr166bbbbrN1jzPFxcUpMTFRe/bs8fpaybdn3jCD/9tvv/X4LaxhVnh5ebnlG1dzr3e1w9uYv/vuO40cOVLDhg3TypUrvb6fr8+4Ke35+ltf/frXv9amTZv00UcfqW/fvl5fP3ToUL3++uutEFnzunXrpssuu6zJ/y87yvNFYx0yOYiOjlZ0dHSr9V9YWKiwsLAml+SlpKSoS5cuysnJ0d133y1JKisr01dffaXFixd7vMbfMRcVFWnUqFGaMmWKnn766Rb3cfLkySZLc/6MediwYXr66adVVlbmvt/WrVvldDqVkpLi8ZqWPGdffwdjjFavXq3Jkyd79frSBocPH1ZpaWmLy52+PPPCwkJJavLeDUNKOTk5GjRokKTT4+x5eXl69tlnW3RPybuYDx48qJEjRyolJUWrV69Wp07eT2vy9Rk35czX395xxx3u9pycHN1+++0erxk2bJj+8pe/WNpa8vrbljLG6Ne//rU2btyo3NxcJSUltaifwsLCdinR19bWavfu3Ro+fLjHz9v7+aIZ7V268NX+/ftNYWGheeKJJ0z37t1NYWGhKSwsNDU1NcYYYzZt2mRWrlxpdu7cab799lvz0ksvmcjISDN79mx3HwcOHDAXX3yx+fTTT91t6enppm/fvub99983n3/+uRk1apS54oorzKlTp1o95oahhEmTJpmysjL3UVFR0WTM3377rXniiSdMfn6+KS4uNu+884655JJLzKBBg9ok5lOnTpnk5GQzevRo8/nnn5v333/f9O3b18yaNavJmI1p3efsyfvvv28kmV27dnn8/OKLLzYbNmwwxhhTU1NjHnnkEbN9+3ZTXFxsPvzwQzNs2DBz/vnnm+rq6laJr8H27dvNkiVLTGFhodm7d69Zv369iY+PN7fddluT8RpjzDPPPGOioqLMhg0bzM6dO829995r4uLiWj1eY/45lDBq1Chz4MABy7/dpmJu62e8bt0606VLF7Nq1Sqza9cuk5GRYbp162b27dtnjDHm8ccfN/fff7/7/L1795quXbuahx9+2OzatcusWrXKdOnSpUVDUi3xq1/9ykRFRZnc3FzL8/z+++/d55wd8/PPP282btxovvnmG/PVV1+Zxx9/3Ejy+zCNJ4888ojJzc01e/fuNZ988om59dZbTURERId9vmhawCcHU6ZM8TgG+uGHHxpjjHn33XfNlVdeabp37266du1qkpOTzdKlS83JkyfdfRQXF1uuMcaYEydOmFmzZpmePXua8PBwc+utt5qSkpI2ibmpMd7ExMQmYy4pKTHXX3+96dmzpwkNDTUXXnihmT17tjl8+HCbxGzM6QRi3LhxJjw83PTs2dPMmjXL/PDDD03GbEzrPmdP7r33XpOamtrk55LM6tWrjTHGfP/99yYtLc307t3bdOnSxfzsZz8zU6ZMadX4GhQUFJghQ4aYqKgoExYWZi6++GKzYMECc/z48SbjNeb0csYFCxaY2NhY43Q6zfXXX2927tzZ6vEac3o+iqd/I2d/B2nvZ/yf//mfJjEx0YSGhpqrrrrKsixwypQpZsSIEZbzc3NzzaBBg0xoaKjp16+fWbFiRavFdramnueZ/5+fHfOzzz5rLrzwQhMWFmZ69OhhrrvuOvPOO++0SbwTJ040cXFxpkuXLiY+Pt5MmDDBFBUVNRmrMe37fNE0XtkMAAAsgmafAwAAYA/JAQAAsCA5AAAAFiQHAADAguQAAABYkBwAAAALkgMAAGBBcgAAACxIDgAAgAXJAQAAsCA5AAAAFv8PF3CanRm6PA4AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Velocities: (1.0, 1.0)\n", "U: \n", "V: \n", "temp: \n" ] } ], "source": [ "fieldset_flat = FieldSet.from_data(data, dims, mesh=\"flat\")\n", "\n", "plt.pcolormesh(\n", " fieldset_flat.U.lon,\n", " fieldset_flat.U.lat,\n", " fieldset_flat.U.data[0, :, :],\n", " vmin=0,\n", " vmax=1,\n", ")\n", "plt.colorbar()\n", "plt.show()\n", "\n", "print(\"Velocities:\", fieldset_flat.UV[0, 0, 40, -5])\n", "for fld in [fieldset_flat.U, fieldset_flat.V, fieldset_flat.temp]:\n", " print(f\"{fld.name}: {fld.units}\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Indeed, in this case all Fields have the same default `UnitConverter` object.\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## UnitConverters for Diffusion fields\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The units for Brownian diffusion are in $m^2/s$. If (and only if!) the diffusion fields are called `kh_zonal` and `kh_meridional`, Parcels will automatically assign the correct Unitconverter objects to these fields.\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Kh_zonal: 1.380091e-08 \n", "Kh_meridional: 8.098704e-09 \n" ] } ], "source": [ "kh_zonal = 100 # in m^2/s\n", "kh_meridional = 100 # in m^2/s\n", "\n", "fieldset.add_field(\n", " Field(\n", " \"Kh_zonal\",\n", " kh_zonal * np.ones((ydim, xdim), dtype=np.float32),\n", " grid=fieldset.U.grid,\n", " )\n", ")\n", "fieldset.add_field(\n", " Field(\n", " \"Kh_meridional\",\n", " kh_meridional * np.ones((ydim, xdim), dtype=np.float32),\n", " grid=fieldset.U.grid,\n", " )\n", ")\n", "\n", "for fld in [fieldset.Kh_zonal, fieldset.Kh_meridional]:\n", " print(f\"{fld.name}: {fld[0, 0, 40, -5]:e} {fld.units}\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Here, the unitconverters are `GeographicPolarSquare` and `GeographicSquare`, respectively.\n", "\n", "Indeed, multiplying with $(1852\\cdot60)^2$ returns the original value\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "100.0\n" ] } ], "source": [ "deg_to_m = 1852 * 60\n", "print(fieldset.Kh_meridional[0, 0, 40, -5] * deg_to_m**2)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Adding a UnitConverter object to a Field\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "So, to summarise, here is a table with all the conversions\n", "\n", "| Field name | Converter object | Conversion for `mesh='spherical'` | Conversion for `mesh='flat'` |\n", "| ---------------- | ----------------------- | --------------------------------------------------------- | ---------------------------- |\n", "| 'U' | `GeographicPolar` | $1852 \\cdot 60 \\cdot \\cos(lat \\cdot \\frac{\\pi}{180})$ | 1 |\n", "| 'V' | `Geographic` | $1852 \\cdot 60$ | 1 |\n", "| 'Kh_zonal' | `GeographicPolarSquare` | $(1852 \\cdot 60 \\cdot \\cos(lat \\cdot \\frac{\\pi}{180}))^2$ | 1 |\n", "| 'Kh_meridional' | `GeographicSquare` | $(1852 \\cdot 60)^2$ | 1 |\n", "| All other fields | `UnitConverter` | 1 | 1 |\n", "\n", "Only four Field names are recognised and assigned an automatic UnitConverter object. This means that things might go very wrong when e.g. a velocity field is not called `U` or `V`.\n", "\n", "Fortunately, you can always add a UnitConverter later, as explained below:\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0\n" ] } ], "source": [ "fieldset.add_field(\n", " Field(\"Ustokes\", np.ones((ydim, xdim), dtype=np.float32), grid=fieldset.U.grid)\n", ")\n", "print(fieldset.Ustokes[0, 0, 40, -5])" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "This value for `Ustokes` of course is not as expected, since the mesh is spherical and hence this would mean 1 degree/s velocity. Assigning the correct `GeographicPolar` Unitconverter gives\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.1747725785927634e-05\n", "0.9999999999999999\n" ] } ], "source": [ "from parcels.tools.converters import GeographicPolar\n", "\n", "fieldset.Ustokes.units = GeographicPolar()\n", "print(fieldset.Ustokes[0, 0, 40, -5])\n", "print(fieldset.Ustokes[0, 0, 40, -5] * 1852 * 60 * np.cos(40 * np.pi / 180))" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Alternatively, the UnitConverter can be set when the `FieldSet` or `Field` is created by using the `fieldtype` argument (use a dictionary in the case of `FieldSet` construction.\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.1747725785927634e-05\n" ] } ], "source": [ "fieldset.add_field(\n", " Field(\n", " \"Ustokes2\",\n", " np.ones((ydim, xdim), dtype=np.float32),\n", " grid=fieldset.U.grid,\n", " fieldtype=\"U\",\n", " )\n", ")\n", "print(fieldset.Ustokes2[0, 0, 40, -5])" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Using velocities in units other than m/s\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Some OGCM store velocity data in units of e.g. cm/s. For these cases, Field objects have a method `set_scaling_factor()`.\n", "\n", "If your data is in cm/s and if you want to use the built-in Advection kernels, you will therefore have to use `fieldset.U.set_scaling_factor(100)` and `fieldset.V.set_scaling_factor(100)`.\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0\n" ] } ], "source": [ "fieldset.add_field(\n", " Field(\n", " name=\"Ucm\",\n", " data=0.01 * np.ones((ydim, xdim), dtype=np.float32),\n", " grid=fieldset.U.grid,\n", " )\n", ")\n", "fieldset.Ucm.set_scaling_factor(100)\n", "print(fieldset.Ucm[0, 0, 40, -5])" ] } ], "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.11.6" } }, "nbformat": 4, "nbformat_minor": 2 }