Skip to content

Instantly share code, notes, and snippets.

@navidcy
Created October 1, 2025 21:23
Show Gist options
  • Select an option

  • Save navidcy/8bf9525ffbe5746441a78072a77660bd to your computer and use it in GitHub Desktop.

Select an option

Save navidcy/8bf9525ffbe5746441a78072a77660bd to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "ed6fcf50-9e24-4396-a83c-f4ce2ff02978",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import xesmf as xe\n",
"import xarray as xr\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "cc39740e-dc94-4cba-bd75-74768f11d602",
"metadata": {},
"outputs": [],
"source": [
"# 2-degree lat-lon grid\n",
"ds_in = xe.util.grid_global(2, 2, lon1=360)\n",
"\n",
"# 1-degree lat-lon grid\n",
"ds_out = xe.util.grid_global(1, 1, lon1=360)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "75b0dc72-7e4d-4abe-a8a5-4c7065252ff7",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
"<defs>\n",
"<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
"<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"</symbol>\n",
"<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
"<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"</symbol>\n",
"</defs>\n",
"</svg>\n",
"<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
" *\n",
" */\n",
"\n",
":root {\n",
" --xr-font-color0: var(\n",
" --jp-content-font-color0,\n",
" var(--pst-color-text-base rgba(0, 0, 0, 1))\n",
" );\n",
" --xr-font-color2: var(\n",
" --jp-content-font-color2,\n",
" var(--pst-color-text-base, rgba(0, 0, 0, 0.54))\n",
" );\n",
" --xr-font-color3: var(\n",
" --jp-content-font-color3,\n",
" var(--pst-color-text-base, rgba(0, 0, 0, 0.38))\n",
" );\n",
" --xr-border-color: var(\n",
" --jp-border-color2,\n",
" hsl(from var(--pst-color-on-background, white) h s calc(l - 10))\n",
" );\n",
" --xr-disabled-color: var(\n",
" --jp-layout-color3,\n",
" hsl(from var(--pst-color-on-background, white) h s calc(l - 40))\n",
" );\n",
" --xr-background-color: var(\n",
" --jp-layout-color0,\n",
" var(--pst-color-on-background, white)\n",
" );\n",
" --xr-background-color-row-even: var(\n",
" --jp-layout-color1,\n",
" hsl(from var(--pst-color-on-background, white) h s calc(l - 5))\n",
" );\n",
" --xr-background-color-row-odd: var(\n",
" --jp-layout-color2,\n",
" hsl(from var(--pst-color-on-background, white) h s calc(l - 15))\n",
" );\n",
"}\n",
"\n",
"html[theme=\"dark\"],\n",
"html[data-theme=\"dark\"],\n",
"body[data-theme=\"dark\"],\n",
"body.vscode-dark {\n",
" --xr-font-color0: var(\n",
" --jp-content-font-color0,\n",
" var(--pst-color-text-base, rgba(255, 255, 255, 1))\n",
" );\n",
" --xr-font-color2: var(\n",
" --jp-content-font-color2,\n",
" var(--pst-color-text-base, rgba(255, 255, 255, 0.54))\n",
" );\n",
" --xr-font-color3: var(\n",
" --jp-content-font-color3,\n",
" var(--pst-color-text-base, rgba(255, 255, 255, 0.38))\n",
" );\n",
" --xr-border-color: var(\n",
" --jp-border-color2,\n",
" hsl(from var(--pst-color-on-background, #111111) h s calc(l + 10))\n",
" );\n",
" --xr-disabled-color: var(\n",
" --jp-layout-color3,\n",
" hsl(from var(--pst-color-on-background, #111111) h s calc(l + 40))\n",
" );\n",
" --xr-background-color: var(\n",
" --jp-layout-color0,\n",
" var(--pst-color-on-background, #111111)\n",
" );\n",
" --xr-background-color-row-even: var(\n",
" --jp-layout-color1,\n",
" hsl(from var(--pst-color-on-background, #111111) h s calc(l + 5))\n",
" );\n",
" --xr-background-color-row-odd: var(\n",
" --jp-layout-color2,\n",
" hsl(from var(--pst-color-on-background, #111111) h s calc(l + 15))\n",
" );\n",
"}\n",
"\n",
".xr-wrap {\n",
" display: block !important;\n",
" min-width: 300px;\n",
" max-width: 700px;\n",
"}\n",
"\n",
".xr-text-repr-fallback {\n",
" /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
" display: none;\n",
"}\n",
"\n",
".xr-header {\n",
" padding-top: 6px;\n",
" padding-bottom: 6px;\n",
" margin-bottom: 4px;\n",
" border-bottom: solid 1px var(--xr-border-color);\n",
"}\n",
"\n",
".xr-header > div,\n",
".xr-header > ul {\n",
" display: inline;\n",
" margin-top: 0;\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-obj-type,\n",
".xr-array-name {\n",
" margin-left: 2px;\n",
" margin-right: 10px;\n",
"}\n",
"\n",
".xr-obj-type {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-sections {\n",
" padding-left: 0 !important;\n",
" display: grid;\n",
" grid-template-columns: 150px auto auto 1fr 0 20px 0 20px;\n",
"}\n",
"\n",
".xr-section-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-section-item input {\n",
" display: inline-block;\n",
" opacity: 0;\n",
" height: 0;\n",
"}\n",
"\n",
".xr-section-item input + label {\n",
" color: var(--xr-disabled-color);\n",
" border: 2px solid transparent !important;\n",
"}\n",
"\n",
".xr-section-item input:enabled + label {\n",
" cursor: pointer;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-item input:focus + label {\n",
" border: 2px solid var(--xr-font-color0) !important;\n",
"}\n",
"\n",
".xr-section-item input:enabled + label:hover {\n",
" color: var(--xr-font-color0);\n",
"}\n",
"\n",
".xr-section-summary {\n",
" grid-column: 1;\n",
" color: var(--xr-font-color2);\n",
" font-weight: 500;\n",
"}\n",
"\n",
".xr-section-summary > span {\n",
" display: inline-block;\n",
" padding-left: 0.5em;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-summary-in + label:before {\n",
" display: inline-block;\n",
" content: \"►\";\n",
" font-size: 11px;\n",
" width: 15px;\n",
" text-align: center;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label:before {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label:before {\n",
" content: \"▼\";\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label > span {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-summary,\n",
".xr-section-inline-details {\n",
" padding-top: 4px;\n",
" padding-bottom: 4px;\n",
"}\n",
"\n",
".xr-section-inline-details {\n",
" grid-column: 2 / -1;\n",
"}\n",
"\n",
".xr-section-details {\n",
" display: none;\n",
" grid-column: 1 / -1;\n",
" margin-bottom: 5px;\n",
"}\n",
"\n",
".xr-section-summary-in:checked ~ .xr-section-details {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-array-wrap {\n",
" grid-column: 1 / -1;\n",
" display: grid;\n",
" grid-template-columns: 20px auto;\n",
"}\n",
"\n",
".xr-array-wrap > label {\n",
" grid-column: 1;\n",
" vertical-align: top;\n",
"}\n",
"\n",
".xr-preview {\n",
" color: var(--xr-font-color3);\n",
"}\n",
"\n",
".xr-array-preview,\n",
".xr-array-data {\n",
" padding: 0 5px !important;\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-array-data,\n",
".xr-array-in:checked ~ .xr-array-preview {\n",
" display: none;\n",
"}\n",
"\n",
".xr-array-in:checked ~ .xr-array-data,\n",
".xr-array-preview {\n",
" display: inline-block;\n",
"}\n",
"\n",
".xr-dim-list {\n",
" display: inline-block !important;\n",
" list-style: none;\n",
" padding: 0 !important;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list li {\n",
" display: inline-block;\n",
" padding: 0;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list:before {\n",
" content: \"(\";\n",
"}\n",
"\n",
".xr-dim-list:after {\n",
" content: \")\";\n",
"}\n",
"\n",
".xr-dim-list li:not(:last-child):after {\n",
" content: \",\";\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-has-index {\n",
" font-weight: bold;\n",
"}\n",
"\n",
".xr-var-list,\n",
".xr-var-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-var-item > div,\n",
".xr-var-item label,\n",
".xr-var-item > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-even);\n",
" border-color: var(--xr-background-color-row-odd);\n",
" margin-bottom: 0;\n",
" padding-top: 2px;\n",
"}\n",
"\n",
".xr-var-item > .xr-var-name:hover span {\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-var-list > li:nth-child(odd) > div,\n",
".xr-var-list > li:nth-child(odd) > label,\n",
".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-odd);\n",
" border-color: var(--xr-background-color-row-even);\n",
"}\n",
"\n",
".xr-var-name {\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-var-dims {\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-var-dtype {\n",
" grid-column: 3;\n",
" text-align: right;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-var-preview {\n",
" grid-column: 4;\n",
"}\n",
"\n",
".xr-index-preview {\n",
" grid-column: 2 / 5;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-var-name,\n",
".xr-var-dims,\n",
".xr-var-dtype,\n",
".xr-preview,\n",
".xr-attrs dt {\n",
" white-space: nowrap;\n",
" overflow: hidden;\n",
" text-overflow: ellipsis;\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-var-name:hover,\n",
".xr-var-dims:hover,\n",
".xr-var-dtype:hover,\n",
".xr-attrs dt:hover {\n",
" overflow: visible;\n",
" width: auto;\n",
" z-index: 1;\n",
"}\n",
"\n",
".xr-var-attrs,\n",
".xr-var-data,\n",
".xr-index-data {\n",
" display: none;\n",
" border-top: 2px dotted var(--xr-background-color);\n",
" padding-bottom: 20px !important;\n",
" padding-top: 10px !important;\n",
"}\n",
"\n",
".xr-var-attrs-in + label,\n",
".xr-var-data-in + label,\n",
".xr-index-data-in + label {\n",
" padding: 0 1px;\n",
"}\n",
"\n",
".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
".xr-var-data-in:checked ~ .xr-var-data,\n",
".xr-index-data-in:checked ~ .xr-index-data {\n",
" display: block;\n",
"}\n",
"\n",
".xr-var-data > table {\n",
" float: right;\n",
"}\n",
"\n",
".xr-var-data > pre,\n",
".xr-index-data > pre,\n",
".xr-var-data > table > tbody > tr {\n",
" background-color: transparent !important;\n",
"}\n",
"\n",
".xr-var-name span,\n",
".xr-var-data,\n",
".xr-index-name div,\n",
".xr-index-data,\n",
".xr-attrs {\n",
" padding-left: 25px !important;\n",
"}\n",
"\n",
".xr-attrs,\n",
".xr-var-attrs,\n",
".xr-var-data,\n",
".xr-index-data {\n",
" grid-column: 1 / -1;\n",
"}\n",
"\n",
"dl.xr-attrs {\n",
" padding: 0;\n",
" margin: 0;\n",
" display: grid;\n",
" grid-template-columns: 125px auto;\n",
"}\n",
"\n",
".xr-attrs dt,\n",
".xr-attrs dd {\n",
" padding: 0;\n",
" margin: 0;\n",
" float: left;\n",
" padding-right: 10px;\n",
" width: auto;\n",
"}\n",
"\n",
".xr-attrs dt {\n",
" font-weight: normal;\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-attrs dt:hover span {\n",
" display: inline-block;\n",
" background: var(--xr-background-color);\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-attrs dd {\n",
" grid-column: 2;\n",
" white-space: pre-wrap;\n",
" word-break: break-all;\n",
"}\n",
"\n",
".xr-icon-database,\n",
".xr-icon-file-text2,\n",
".xr-no-icon {\n",
" display: inline-block;\n",
" vertical-align: middle;\n",
" width: 1em;\n",
" height: 1.5em !important;\n",
" stroke-width: 0;\n",
" stroke: currentColor;\n",
" fill: currentColor;\n",
"}\n",
"\n",
".xr-var-attrs-in:checked + label > .xr-icon-file-text2,\n",
".xr-var-data-in:checked + label > .xr-icon-database,\n",
".xr-index-data-in:checked + label > .xr-icon-database {\n",
" color: var(--xr-font-color0);\n",
" filter: drop-shadow(1px 1px 5px var(--xr-font-color2));\n",
" stroke-width: 0.8px;\n",
"}\n",
"</style><pre class='xr-text-repr-fallback'>&lt;xarray.DataArray &#x27;gaussian_field&#x27; (y: 90, x: 180)&gt; Size: 130kB\n",
"array([[1.46996071e-55, 1.14821221e-54, 8.72318053e-54, ...,\n",
" 1.87658780e-85, 1.07350512e-86, 5.97276761e-88],\n",
" [7.56948141e-55, 5.91265531e-54, 4.49195360e-53, ...,\n",
" 9.66338514e-85, 5.52795528e-86, 3.07564367e-87],\n",
" [3.79107863e-54, 2.96127832e-53, 2.24973791e-52, ...,\n",
" 4.83978372e-84, 2.76860620e-85, 1.54039707e-86],\n",
" ...,\n",
" [9.12064795e-39, 7.12429883e-38, 5.41246159e-37, ...,\n",
" 1.16436423e-68, 6.66076463e-70, 3.70591611e-71],\n",
" [4.19026120e-39, 3.27308686e-38, 2.48662462e-37, ...,\n",
" 5.34938996e-69, 3.06012728e-70, 1.70259356e-71],\n",
" [1.87237470e-39, 1.46254487e-38, 1.11112239e-37, ...,\n",
" 2.39031934e-69, 1.36738609e-70, 7.60786249e-72]], shape=(90, 180))\n",
"Coordinates:\n",
" lon (y, x) float64 130kB 1.0 3.0 5.0 7.0 ... 353.0 355.0 357.0 359.0\n",
" lat (y, x) float64 130kB -89.0 -89.0 -89.0 -89.0 ... 89.0 89.0 89.0\n",
"Dimensions without coordinates: y, x</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.DataArray</div><div class='xr-array-name'>'gaussian_field'</div><ul class='xr-dim-list'><li><span>y</span>: 90</li><li><span>x</span>: 180</li></ul></div><ul class='xr-sections'><li class='xr-section-item'><div class='xr-array-wrap'><input id='section-6145d4c4-bb76-4d97-a120-4a626d6af265' class='xr-array-in' type='checkbox' checked><label for='section-6145d4c4-bb76-4d97-a120-4a626d6af265' title='Show/hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-array-preview xr-preview'><span>1.47e-55 1.148e-54 8.723e-54 ... 2.39e-69 1.367e-70 7.608e-72</span></div><div class='xr-array-data'><pre>array([[1.46996071e-55, 1.14821221e-54, 8.72318053e-54, ...,\n",
" 1.87658780e-85, 1.07350512e-86, 5.97276761e-88],\n",
" [7.56948141e-55, 5.91265531e-54, 4.49195360e-53, ...,\n",
" 9.66338514e-85, 5.52795528e-86, 3.07564367e-87],\n",
" [3.79107863e-54, 2.96127832e-53, 2.24973791e-52, ...,\n",
" 4.83978372e-84, 2.76860620e-85, 1.54039707e-86],\n",
" ...,\n",
" [9.12064795e-39, 7.12429883e-38, 5.41246159e-37, ...,\n",
" 1.16436423e-68, 6.66076463e-70, 3.70591611e-71],\n",
" [4.19026120e-39, 3.27308686e-38, 2.48662462e-37, ...,\n",
" 5.34938996e-69, 3.06012728e-70, 1.70259356e-71],\n",
" [1.87237470e-39, 1.46254487e-38, 1.11112239e-37, ...,\n",
" 2.39031934e-69, 1.36738609e-70, 7.60786249e-72]], shape=(90, 180))</pre></div></div></li><li class='xr-section-item'><input id='section-94572878-b30e-4cd5-84d9-dd8fc0cdc64c' class='xr-section-summary-in' type='checkbox' checked><label for='section-94572878-b30e-4cd5-84d9-dd8fc0cdc64c' class='xr-section-summary' >Coordinates: <span>(2)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>lon</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>1.0 3.0 5.0 ... 355.0 357.0 359.0</div><input id='attrs-2549c0c1-fb89-4bd7-b1b6-4ae212872250' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-2549c0c1-fb89-4bd7-b1b6-4ae212872250' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-ee180021-3806-4eee-8c2a-7898d136a789' class='xr-var-data-in' type='checkbox'><label for='data-ee180021-3806-4eee-8c2a-7898d136a789' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>longitude</dd></dl></div><div class='xr-var-data'><pre>array([[ 1., 3., 5., ..., 355., 357., 359.],\n",
" [ 1., 3., 5., ..., 355., 357., 359.],\n",
" [ 1., 3., 5., ..., 355., 357., 359.],\n",
" ...,\n",
" [ 1., 3., 5., ..., 355., 357., 359.],\n",
" [ 1., 3., 5., ..., 355., 357., 359.],\n",
" [ 1., 3., 5., ..., 355., 357., 359.]], shape=(90, 180))</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>lat</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>-89.0 -89.0 -89.0 ... 89.0 89.0</div><input id='attrs-529cbcea-5e9f-4bdd-ac7e-23c3a18c8585' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-529cbcea-5e9f-4bdd-ac7e-23c3a18c8585' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-3a219d3b-1238-43fe-a68f-b1cd547eba1c' class='xr-var-data-in' type='checkbox'><label for='data-3a219d3b-1238-43fe-a68f-b1cd547eba1c' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>latitude</dd></dl></div><div class='xr-var-data'><pre>array([[-89., -89., -89., ..., -89., -89., -89.],\n",
" [-87., -87., -87., ..., -87., -87., -87.],\n",
" [-85., -85., -85., ..., -85., -85., -85.],\n",
" ...,\n",
" [ 85., 85., 85., ..., 85., 85., 85.],\n",
" [ 87., 87., 87., ..., 87., 87., 87.],\n",
" [ 89., 89., 89., ..., 89., 89., 89.]], shape=(90, 180))</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-9a8334fa-b9af-4866-b397-82fddc2d0aec' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-9a8334fa-b9af-4866-b397-82fddc2d0aec' class='xr-section-summary' title='Expand/collapse section'>Indexes: <span>(0)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'></ul></div></li><li class='xr-section-item'><input id='section-20092440-123d-42ae-85d8-9225b438b48c' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-20092440-123d-42ae-85d8-9225b438b48c' class='xr-section-summary' title='Expand/collapse section'>Attributes: <span>(0)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'></dl></div></li></ul></div></div>"
],
"text/plain": [
"<xarray.DataArray 'gaussian_field' (y: 90, x: 180)> Size: 130kB\n",
"array([[1.46996071e-55, 1.14821221e-54, 8.72318053e-54, ...,\n",
" 1.87658780e-85, 1.07350512e-86, 5.97276761e-88],\n",
" [7.56948141e-55, 5.91265531e-54, 4.49195360e-53, ...,\n",
" 9.66338514e-85, 5.52795528e-86, 3.07564367e-87],\n",
" [3.79107863e-54, 2.96127832e-53, 2.24973791e-52, ...,\n",
" 4.83978372e-84, 2.76860620e-85, 1.54039707e-86],\n",
" ...,\n",
" [9.12064795e-39, 7.12429883e-38, 5.41246159e-37, ...,\n",
" 1.16436423e-68, 6.66076463e-70, 3.70591611e-71],\n",
" [4.19026120e-39, 3.27308686e-38, 2.48662462e-37, ...,\n",
" 5.34938996e-69, 3.06012728e-70, 1.70259356e-71],\n",
" [1.87237470e-39, 1.46254487e-38, 1.11112239e-37, ...,\n",
" 2.39031934e-69, 1.36738609e-70, 7.60786249e-72]], shape=(90, 180))\n",
"Coordinates:\n",
" lon (y, x) float64 130kB 1.0 3.0 5.0 7.0 ... 353.0 355.0 357.0 359.0\n",
" lat (y, x) float64 130kB -89.0 -89.0 -89.0 -89.0 ... 89.0 89.0 89.0\n",
"Dimensions without coordinates: y, x"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# pick a center and width\n",
"λ0, φ0 = 150, 30 # center\n",
"width = 12 # degrees\n",
"\n",
"# 2D lon/lat\n",
"lon2d = ds_in['lon']\n",
"lat2d = ds_in['lat']\n",
"\n",
"# Gaussian field\n",
"data_in = xr.DataArray(\n",
" np.exp(-((lon2d - λ0)**2 + (lat2d - φ0)**2) / (2 * width**2)),\n",
" dims=('y', 'x'),\n",
" coords={'lon': lon2d, 'lat': lat2d},\n",
" name=\"gaussian_field\"\n",
")\n",
"\n",
"data_in"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "1aab428f-baf2-49a5-abb6-89ddd87c3c41",
"metadata": {},
"outputs": [],
"source": [
"regridder = xe.Regridder(ds_in, ds_out, \"conservative\", periodic=True)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "a707eb6a-3f6b-488c-a5d8-2c85abf33cc4",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
"<defs>\n",
"<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
"<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"</symbol>\n",
"<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
"<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"</symbol>\n",
"</defs>\n",
"</svg>\n",
"<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
" *\n",
" */\n",
"\n",
":root {\n",
" --xr-font-color0: var(\n",
" --jp-content-font-color0,\n",
" var(--pst-color-text-base rgba(0, 0, 0, 1))\n",
" );\n",
" --xr-font-color2: var(\n",
" --jp-content-font-color2,\n",
" var(--pst-color-text-base, rgba(0, 0, 0, 0.54))\n",
" );\n",
" --xr-font-color3: var(\n",
" --jp-content-font-color3,\n",
" var(--pst-color-text-base, rgba(0, 0, 0, 0.38))\n",
" );\n",
" --xr-border-color: var(\n",
" --jp-border-color2,\n",
" hsl(from var(--pst-color-on-background, white) h s calc(l - 10))\n",
" );\n",
" --xr-disabled-color: var(\n",
" --jp-layout-color3,\n",
" hsl(from var(--pst-color-on-background, white) h s calc(l - 40))\n",
" );\n",
" --xr-background-color: var(\n",
" --jp-layout-color0,\n",
" var(--pst-color-on-background, white)\n",
" );\n",
" --xr-background-color-row-even: var(\n",
" --jp-layout-color1,\n",
" hsl(from var(--pst-color-on-background, white) h s calc(l - 5))\n",
" );\n",
" --xr-background-color-row-odd: var(\n",
" --jp-layout-color2,\n",
" hsl(from var(--pst-color-on-background, white) h s calc(l - 15))\n",
" );\n",
"}\n",
"\n",
"html[theme=\"dark\"],\n",
"html[data-theme=\"dark\"],\n",
"body[data-theme=\"dark\"],\n",
"body.vscode-dark {\n",
" --xr-font-color0: var(\n",
" --jp-content-font-color0,\n",
" var(--pst-color-text-base, rgba(255, 255, 255, 1))\n",
" );\n",
" --xr-font-color2: var(\n",
" --jp-content-font-color2,\n",
" var(--pst-color-text-base, rgba(255, 255, 255, 0.54))\n",
" );\n",
" --xr-font-color3: var(\n",
" --jp-content-font-color3,\n",
" var(--pst-color-text-base, rgba(255, 255, 255, 0.38))\n",
" );\n",
" --xr-border-color: var(\n",
" --jp-border-color2,\n",
" hsl(from var(--pst-color-on-background, #111111) h s calc(l + 10))\n",
" );\n",
" --xr-disabled-color: var(\n",
" --jp-layout-color3,\n",
" hsl(from var(--pst-color-on-background, #111111) h s calc(l + 40))\n",
" );\n",
" --xr-background-color: var(\n",
" --jp-layout-color0,\n",
" var(--pst-color-on-background, #111111)\n",
" );\n",
" --xr-background-color-row-even: var(\n",
" --jp-layout-color1,\n",
" hsl(from var(--pst-color-on-background, #111111) h s calc(l + 5))\n",
" );\n",
" --xr-background-color-row-odd: var(\n",
" --jp-layout-color2,\n",
" hsl(from var(--pst-color-on-background, #111111) h s calc(l + 15))\n",
" );\n",
"}\n",
"\n",
".xr-wrap {\n",
" display: block !important;\n",
" min-width: 300px;\n",
" max-width: 700px;\n",
"}\n",
"\n",
".xr-text-repr-fallback {\n",
" /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
" display: none;\n",
"}\n",
"\n",
".xr-header {\n",
" padding-top: 6px;\n",
" padding-bottom: 6px;\n",
" margin-bottom: 4px;\n",
" border-bottom: solid 1px var(--xr-border-color);\n",
"}\n",
"\n",
".xr-header > div,\n",
".xr-header > ul {\n",
" display: inline;\n",
" margin-top: 0;\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-obj-type,\n",
".xr-array-name {\n",
" margin-left: 2px;\n",
" margin-right: 10px;\n",
"}\n",
"\n",
".xr-obj-type {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-sections {\n",
" padding-left: 0 !important;\n",
" display: grid;\n",
" grid-template-columns: 150px auto auto 1fr 0 20px 0 20px;\n",
"}\n",
"\n",
".xr-section-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-section-item input {\n",
" display: inline-block;\n",
" opacity: 0;\n",
" height: 0;\n",
"}\n",
"\n",
".xr-section-item input + label {\n",
" color: var(--xr-disabled-color);\n",
" border: 2px solid transparent !important;\n",
"}\n",
"\n",
".xr-section-item input:enabled + label {\n",
" cursor: pointer;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-item input:focus + label {\n",
" border: 2px solid var(--xr-font-color0) !important;\n",
"}\n",
"\n",
".xr-section-item input:enabled + label:hover {\n",
" color: var(--xr-font-color0);\n",
"}\n",
"\n",
".xr-section-summary {\n",
" grid-column: 1;\n",
" color: var(--xr-font-color2);\n",
" font-weight: 500;\n",
"}\n",
"\n",
".xr-section-summary > span {\n",
" display: inline-block;\n",
" padding-left: 0.5em;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-summary-in + label:before {\n",
" display: inline-block;\n",
" content: \"►\";\n",
" font-size: 11px;\n",
" width: 15px;\n",
" text-align: center;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label:before {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label:before {\n",
" content: \"▼\";\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label > span {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-summary,\n",
".xr-section-inline-details {\n",
" padding-top: 4px;\n",
" padding-bottom: 4px;\n",
"}\n",
"\n",
".xr-section-inline-details {\n",
" grid-column: 2 / -1;\n",
"}\n",
"\n",
".xr-section-details {\n",
" display: none;\n",
" grid-column: 1 / -1;\n",
" margin-bottom: 5px;\n",
"}\n",
"\n",
".xr-section-summary-in:checked ~ .xr-section-details {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-array-wrap {\n",
" grid-column: 1 / -1;\n",
" display: grid;\n",
" grid-template-columns: 20px auto;\n",
"}\n",
"\n",
".xr-array-wrap > label {\n",
" grid-column: 1;\n",
" vertical-align: top;\n",
"}\n",
"\n",
".xr-preview {\n",
" color: var(--xr-font-color3);\n",
"}\n",
"\n",
".xr-array-preview,\n",
".xr-array-data {\n",
" padding: 0 5px !important;\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-array-data,\n",
".xr-array-in:checked ~ .xr-array-preview {\n",
" display: none;\n",
"}\n",
"\n",
".xr-array-in:checked ~ .xr-array-data,\n",
".xr-array-preview {\n",
" display: inline-block;\n",
"}\n",
"\n",
".xr-dim-list {\n",
" display: inline-block !important;\n",
" list-style: none;\n",
" padding: 0 !important;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list li {\n",
" display: inline-block;\n",
" padding: 0;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list:before {\n",
" content: \"(\";\n",
"}\n",
"\n",
".xr-dim-list:after {\n",
" content: \")\";\n",
"}\n",
"\n",
".xr-dim-list li:not(:last-child):after {\n",
" content: \",\";\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-has-index {\n",
" font-weight: bold;\n",
"}\n",
"\n",
".xr-var-list,\n",
".xr-var-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-var-item > div,\n",
".xr-var-item label,\n",
".xr-var-item > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-even);\n",
" border-color: var(--xr-background-color-row-odd);\n",
" margin-bottom: 0;\n",
" padding-top: 2px;\n",
"}\n",
"\n",
".xr-var-item > .xr-var-name:hover span {\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-var-list > li:nth-child(odd) > div,\n",
".xr-var-list > li:nth-child(odd) > label,\n",
".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-odd);\n",
" border-color: var(--xr-background-color-row-even);\n",
"}\n",
"\n",
".xr-var-name {\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-var-dims {\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-var-dtype {\n",
" grid-column: 3;\n",
" text-align: right;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-var-preview {\n",
" grid-column: 4;\n",
"}\n",
"\n",
".xr-index-preview {\n",
" grid-column: 2 / 5;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-var-name,\n",
".xr-var-dims,\n",
".xr-var-dtype,\n",
".xr-preview,\n",
".xr-attrs dt {\n",
" white-space: nowrap;\n",
" overflow: hidden;\n",
" text-overflow: ellipsis;\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-var-name:hover,\n",
".xr-var-dims:hover,\n",
".xr-var-dtype:hover,\n",
".xr-attrs dt:hover {\n",
" overflow: visible;\n",
" width: auto;\n",
" z-index: 1;\n",
"}\n",
"\n",
".xr-var-attrs,\n",
".xr-var-data,\n",
".xr-index-data {\n",
" display: none;\n",
" border-top: 2px dotted var(--xr-background-color);\n",
" padding-bottom: 20px !important;\n",
" padding-top: 10px !important;\n",
"}\n",
"\n",
".xr-var-attrs-in + label,\n",
".xr-var-data-in + label,\n",
".xr-index-data-in + label {\n",
" padding: 0 1px;\n",
"}\n",
"\n",
".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
".xr-var-data-in:checked ~ .xr-var-data,\n",
".xr-index-data-in:checked ~ .xr-index-data {\n",
" display: block;\n",
"}\n",
"\n",
".xr-var-data > table {\n",
" float: right;\n",
"}\n",
"\n",
".xr-var-data > pre,\n",
".xr-index-data > pre,\n",
".xr-var-data > table > tbody > tr {\n",
" background-color: transparent !important;\n",
"}\n",
"\n",
".xr-var-name span,\n",
".xr-var-data,\n",
".xr-index-name div,\n",
".xr-index-data,\n",
".xr-attrs {\n",
" padding-left: 25px !important;\n",
"}\n",
"\n",
".xr-attrs,\n",
".xr-var-attrs,\n",
".xr-var-data,\n",
".xr-index-data {\n",
" grid-column: 1 / -1;\n",
"}\n",
"\n",
"dl.xr-attrs {\n",
" padding: 0;\n",
" margin: 0;\n",
" display: grid;\n",
" grid-template-columns: 125px auto;\n",
"}\n",
"\n",
".xr-attrs dt,\n",
".xr-attrs dd {\n",
" padding: 0;\n",
" margin: 0;\n",
" float: left;\n",
" padding-right: 10px;\n",
" width: auto;\n",
"}\n",
"\n",
".xr-attrs dt {\n",
" font-weight: normal;\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-attrs dt:hover span {\n",
" display: inline-block;\n",
" background: var(--xr-background-color);\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-attrs dd {\n",
" grid-column: 2;\n",
" white-space: pre-wrap;\n",
" word-break: break-all;\n",
"}\n",
"\n",
".xr-icon-database,\n",
".xr-icon-file-text2,\n",
".xr-no-icon {\n",
" display: inline-block;\n",
" vertical-align: middle;\n",
" width: 1em;\n",
" height: 1.5em !important;\n",
" stroke-width: 0;\n",
" stroke: currentColor;\n",
" fill: currentColor;\n",
"}\n",
"\n",
".xr-var-attrs-in:checked + label > .xr-icon-file-text2,\n",
".xr-var-data-in:checked + label > .xr-icon-database,\n",
".xr-index-data-in:checked + label > .xr-icon-database {\n",
" color: var(--xr-font-color0);\n",
" filter: drop-shadow(1px 1px 5px var(--xr-font-color2));\n",
" stroke-width: 0.8px;\n",
"}\n",
"</style><pre class='xr-text-repr-fallback'>&lt;xarray.DataArray (y: 180, x: 360)&gt; Size: 518kB\n",
"array([[1.46996071e-55, 1.46996071e-55, 1.14821221e-54, ...,\n",
" 1.07350512e-86, 5.97276761e-88, 5.97276761e-88],\n",
" [1.47119826e-55, 1.47119826e-55, 1.14917888e-54, ...,\n",
" 1.07440890e-86, 5.97779603e-88, 5.97779603e-88],\n",
" [7.56948141e-55, 7.56948141e-55, 5.91265531e-54, ...,\n",
" 5.52795528e-86, 3.07564367e-87, 3.07564367e-87],\n",
" ...,\n",
" [4.19026120e-39, 4.19026120e-39, 3.27308686e-38, ...,\n",
" 3.06012728e-70, 1.70259356e-71, 1.70259356e-71],\n",
" [1.87284498e-39, 1.87284498e-39, 1.46291221e-38, ...,\n",
" 1.36772954e-70, 7.60977335e-72, 7.60977335e-72],\n",
" [1.87237470e-39, 1.87237470e-39, 1.46254487e-38, ...,\n",
" 1.36738609e-70, 7.60786249e-72, 7.60786249e-72]], shape=(180, 360))\n",
"Coordinates:\n",
" lon (y, x) float64 518kB 0.5 1.5 2.5 3.5 ... 356.5 357.5 358.5 359.5\n",
" lat (y, x) float64 518kB -89.5 -89.5 -89.5 -89.5 ... 89.5 89.5 89.5\n",
"Dimensions without coordinates: y, x\n",
"Attributes:\n",
" regrid_method: conservative</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.DataArray</div><div class='xr-array-name'></div><ul class='xr-dim-list'><li><span>y</span>: 180</li><li><span>x</span>: 360</li></ul></div><ul class='xr-sections'><li class='xr-section-item'><div class='xr-array-wrap'><input id='section-b8fd38ac-a81d-4b97-b2e7-5989c039c72d' class='xr-array-in' type='checkbox' checked><label for='section-b8fd38ac-a81d-4b97-b2e7-5989c039c72d' title='Show/hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-array-preview xr-preview'><span>1.47e-55 1.47e-55 1.148e-54 ... 1.367e-70 7.608e-72 7.608e-72</span></div><div class='xr-array-data'><pre>array([[1.46996071e-55, 1.46996071e-55, 1.14821221e-54, ...,\n",
" 1.07350512e-86, 5.97276761e-88, 5.97276761e-88],\n",
" [1.47119826e-55, 1.47119826e-55, 1.14917888e-54, ...,\n",
" 1.07440890e-86, 5.97779603e-88, 5.97779603e-88],\n",
" [7.56948141e-55, 7.56948141e-55, 5.91265531e-54, ...,\n",
" 5.52795528e-86, 3.07564367e-87, 3.07564367e-87],\n",
" ...,\n",
" [4.19026120e-39, 4.19026120e-39, 3.27308686e-38, ...,\n",
" 3.06012728e-70, 1.70259356e-71, 1.70259356e-71],\n",
" [1.87284498e-39, 1.87284498e-39, 1.46291221e-38, ...,\n",
" 1.36772954e-70, 7.60977335e-72, 7.60977335e-72],\n",
" [1.87237470e-39, 1.87237470e-39, 1.46254487e-38, ...,\n",
" 1.36738609e-70, 7.60786249e-72, 7.60786249e-72]], shape=(180, 360))</pre></div></div></li><li class='xr-section-item'><input id='section-8a959787-ce98-44de-9ddb-00173fa7fad4' class='xr-section-summary-in' type='checkbox' checked><label for='section-8a959787-ce98-44de-9ddb-00173fa7fad4' class='xr-section-summary' >Coordinates: <span>(2)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>lon</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>0.5 1.5 2.5 ... 357.5 358.5 359.5</div><input id='attrs-397c1b41-b79c-45df-889f-bcdaaaaa9af2' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-397c1b41-b79c-45df-889f-bcdaaaaa9af2' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-58361174-03a2-4457-b211-3004849ec6d9' class='xr-var-data-in' type='checkbox'><label for='data-58361174-03a2-4457-b211-3004849ec6d9' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>longitude</dd></dl></div><div class='xr-var-data'><pre>array([[ 0.5, 1.5, 2.5, ..., 357.5, 358.5, 359.5],\n",
" [ 0.5, 1.5, 2.5, ..., 357.5, 358.5, 359.5],\n",
" [ 0.5, 1.5, 2.5, ..., 357.5, 358.5, 359.5],\n",
" ...,\n",
" [ 0.5, 1.5, 2.5, ..., 357.5, 358.5, 359.5],\n",
" [ 0.5, 1.5, 2.5, ..., 357.5, 358.5, 359.5],\n",
" [ 0.5, 1.5, 2.5, ..., 357.5, 358.5, 359.5]], shape=(180, 360))</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span>lat</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>-89.5 -89.5 -89.5 ... 89.5 89.5</div><input id='attrs-cd467c74-8a07-431d-9c76-ac6945e2d6c1' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-cd467c74-8a07-431d-9c76-ac6945e2d6c1' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-3fec117b-c5c2-4741-b076-abc15bc19551' class='xr-var-data-in' type='checkbox'><label for='data-3fec117b-c5c2-4741-b076-abc15bc19551' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>latitude</dd></dl></div><div class='xr-var-data'><pre>array([[-89.5, -89.5, -89.5, ..., -89.5, -89.5, -89.5],\n",
" [-88.5, -88.5, -88.5, ..., -88.5, -88.5, -88.5],\n",
" [-87.5, -87.5, -87.5, ..., -87.5, -87.5, -87.5],\n",
" ...,\n",
" [ 87.5, 87.5, 87.5, ..., 87.5, 87.5, 87.5],\n",
" [ 88.5, 88.5, 88.5, ..., 88.5, 88.5, 88.5],\n",
" [ 89.5, 89.5, 89.5, ..., 89.5, 89.5, 89.5]], shape=(180, 360))</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-46407b80-8d75-4c2a-9749-06a75c15c6c2' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-46407b80-8d75-4c2a-9749-06a75c15c6c2' class='xr-section-summary' title='Expand/collapse section'>Indexes: <span>(0)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'></ul></div></li><li class='xr-section-item'><input id='section-8c74d3b9-75dd-467e-a957-ec58eea376f3' class='xr-section-summary-in' type='checkbox' checked><label for='section-8c74d3b9-75dd-467e-a957-ec58eea376f3' class='xr-section-summary' >Attributes: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>regrid_method :</span></dt><dd>conservative</dd></dl></div></li></ul></div></div>"
],
"text/plain": [
"<xarray.DataArray (y: 180, x: 360)> Size: 518kB\n",
"array([[1.46996071e-55, 1.46996071e-55, 1.14821221e-54, ...,\n",
" 1.07350512e-86, 5.97276761e-88, 5.97276761e-88],\n",
" [1.47119826e-55, 1.47119826e-55, 1.14917888e-54, ...,\n",
" 1.07440890e-86, 5.97779603e-88, 5.97779603e-88],\n",
" [7.56948141e-55, 7.56948141e-55, 5.91265531e-54, ...,\n",
" 5.52795528e-86, 3.07564367e-87, 3.07564367e-87],\n",
" ...,\n",
" [4.19026120e-39, 4.19026120e-39, 3.27308686e-38, ...,\n",
" 3.06012728e-70, 1.70259356e-71, 1.70259356e-71],\n",
" [1.87284498e-39, 1.87284498e-39, 1.46291221e-38, ...,\n",
" 1.36772954e-70, 7.60977335e-72, 7.60977335e-72],\n",
" [1.87237470e-39, 1.87237470e-39, 1.46254487e-38, ...,\n",
" 1.36738609e-70, 7.60786249e-72, 7.60786249e-72]], shape=(180, 360))\n",
"Coordinates:\n",
" lon (y, x) float64 518kB 0.5 1.5 2.5 3.5 ... 356.5 357.5 358.5 359.5\n",
" lat (y, x) float64 518kB -89.5 -89.5 -89.5 -89.5 ... 89.5 89.5 89.5\n",
"Dimensions without coordinates: y, x\n",
"Attributes:\n",
" regrid_method: conservative"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_out = regridder(data_in)\n",
"data_out"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "34c39ae3-33d2-4d39-99ee-180756ddcace",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 640x480 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA84AAAGGCAYAAACqgdhwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbqZJREFUeJzt3Xl8VNX9//H3ZJsQSCKLJEQCRAQRAkhBEVwAkSCbKLWoWAVBf/gFl4iKIlWDX0sELcaCgLQKVEX4uoC2dSFUQCm1smkVrUuJgJgYsZCELcvM+f0xC0wSQiYks9y8no/HfQxz77l3PnMJfHLOPYvNGGMEAAAAAACqFRHsAAAAAAAACGVUnAEAAAAAqAEVZwAAAAAAakDFGQAAAACAGlBxBgAAAACgBlScAQAAAACoARVnAAAAAABqQMUZAAAAAIAaUHEGAAAAAKAGVJyBepKVlSWbzVav1xw4cKAGDhxYr9cEACAQGiIvNoQffvhBWVlZ+uSTT4Idil++++472Ww2LVu27JRl/fm7sNlsysrKOr3gTrBhwwbZbDZt2LCh3q4JBENUsAMAcHILFy4MdggAAFjaDz/8oFmzZqlDhw46//zzgx1OrbVp00b/+Mc/1LFjx2CHAjQKVJyBENa1a9dghwAAAE7h6NGjio2NDcgTdofDoYqKCtntdl100UUN/nkAXOiqDdTBX//6V51//vmy2+1KS0vTU089VaXMq6++qr59+yoxMVFxcXE6++yzNXHiRL8+p3JXbU+3rKeeekrz5s1TWlqamjVrpn79+umjjz463a8FAECd1CYvSvWTG51Op+bOnasuXbrIbrerdevWuvnmm/X999/7lOvQoYMmTJhQ5fwTc+uGDRt0wQUXSJJuueUW2Wy2U3ZVXrZsmWw2m9auXauJEyfqzDPPVFxcnEpLSyVJq1atUr9+/dS0aVM1a9ZMQ4cO1Y4dO6pc5w9/+IM6d+4su92url27asWKFZowYYI6dOjgLePJ+3PnztXjjz+utLQ02e12rV+//qRdtWv7d1FcXKzbbrtNLVu2VLNmzXTllVfq66+/rrbsN998o3Hjxql169ay2+0677zz9Oyzz1Yp9+9//1tXXnml4uLi1KpVK91+++0qKSk56b0EwglPnAE//e1vf9Po0aPVr18/rVy5Ug6HQ3PnztWPP/7oLfOPf/xD1113na677jplZWUpNjZWu3fv1vvvv18vMTz77LPq0qWLcnJyJEkPP/ywhg8frry8PCUmJtbLZwAAUBu1yYtS/eXG//mf/9GSJUt0xx13aOTIkfruu+/08MMPa8OGDdq+fbtatWpV62v94he/0NKlS3XLLbfoN7/5jUaMGCFJatu27SnPnThxokaMGKEXX3xRhw8fVnR0tGbPnq3f/OY33uuVlZXpySef1KWXXqqPP/7Y25NsyZIlmjx5sn75y1/q6aefVlFRkWbNmuWtfFf2+9//Xp07d9ZTTz2lhIQEderUqdpytf27MMbo6quv1ubNm/XII4/oggsu0N///ncNGzasyjW/+OIL9e/fX+3atdPvfvc7JScn67333tNdd92l/fv369FHH5Uk/fjjjxowYICio6O1cOFCJSUl6eWXX9Ydd9xxynsJhAUDwC99+/Y1KSkp5ujRo959xcXFpkWLFsbzT+qpp54ykszBgwdP67MGDBhgBgwY4H2fl5dnJJnu3bubiooK7/6PP/7YSDKvvPLKaX0eAAD+qk1eNKZ+cuOXX35pJJkpU6b47P/nP/9pJJmHHnrIu699+/Zm/PjxVa5RObdu2bLFSDJLly6tVQxLly41kszNN9/ss3/Pnj0mKirK3HnnnT77S0pKTHJyshk7dqwxxhiHw2GSk5NN3759fcrt3r3bREdHm/bt23v3efJ+x44dTVlZmU95z7ET467t38U777xjJJlnnnnG55q//e1vjSTz6KOPevcNHTrUtG3b1hQVFfmUveOOO0xsbKz573//a4wx5oEHHjA2m8188sknPuWGDBliJJn169cbIJzRVRvww+HDh7VlyxaNGTNGsbGx3v3x8fEaNWqU972n29fYsWP1f//3f9q3b1+9xjFixAhFRkZ63/fo0UOStHv37nr9HAAAalLbvCjVT25cv369JFXpgn3hhRfqvPPO09/+9je/r1lXv/zlL33ev/fee6qoqNDNN9+siooK7xYbG6sBAwZ4Z5X+6quvVFBQoLFjx/qc365dO1188cXVftZVV12l6OjoGuPx5+/Ccx9vvPFGn/3jxo3zeX/s2DH97W9/0zXXXKO4uDif7zV8+HAdO3bMO1Rs/fr16tatm3r27FnjNYFwRcUZ8MOBAwfkdDqVnJxc5diJ+y677DKtWbPGm0Dbtm2r9PR0vfLKK/USR8uWLX3e2+12Sa7JSQAACJTa5kWpfnLjzz//LMk1o3RlKSkp3uOBUDkGT3foCy64QNHR0T7bqlWrtH//fknHv0NSUlKVa1a3r7rPqo4/fxc///yzoqKiqvw+UV25iooKzZ8/v8p3Gj58uCT5fK/afDYQrhjjDPihefPmstlsKigoqHKs8r7Ro0dr9OjRKi0t1UcffaTs7GyNGzdOHTp0UL9+/QIVMgAADcafvCidfm70VPTy8/OrjEP+4YcffMY3x8bGVjtmeP/+/X6Ngz6ZyjNoe6752muvqX379ic9z/MdKo87lqq/Z9V9VnX8+bto2bKlKioq9PPPP/tUniuXa968uSIjI3XTTTdp6tSp1X5uWlqa95q1/TkAwhFPnAE/NG3aVBdeeKHeeOMNHTt2zLu/pKREf/7zn6s9x263a8CAAZozZ44kVTuzJgAA4agueVGqe268/PLLJUkvvfSSz/4tW7boyy+/1ODBg737OnTooH/9618+5b7++mt99dVXVWKRTr/X1tChQxUVFaX//Oc/6tOnT7WbJJ177rlKTk7W//3f//mcv2fPHm3evLnOn+/P38WgQYMkSS+//LLP/hUrVvi8j4uL06BBg7Rjxw716NGj2u/kqXgPGjRIO3fu1KefflrjNYFwxRNnwE//+7//qyuvvFJDhgzRvffeK4fDoTlz5qhp06b673//K0l65JFH9P3332vw4MFq27atDh48qGeeeUbR0dEaMGBAkL8BAAD1pzZ5Uaqf3Hjuuefq//2//6f58+crIiJCw4YN886qnZqaqnvuucdb9qabbtKvf/1rTZkyRb/85S+1e/duzZ07V2eeeabPNTt27KgmTZro5Zdf1nnnnadmzZopJSVFKSkpft2HDh066LHHHtPMmTO1a9cuXXnllWrevLl+/PFHffzxx2ratKlmzZqliIgIzZo1S5MnT9a1116riRMn6uDBg5o1a5batGmjiIi6P9eq7d9FRkaGLrvsMk2fPl2HDx9Wnz599Pe//10vvvhilWs+88wzuuSSS3TppZfqf/7nf9ShQweVlJTo22+/1Z///GfvrOiZmZl64YUXNGLECD3++OPeWbX//e9/1/n7ACEl2LOTAeHorbfeMj169DAxMTGmXbt25oknnjCPPvqod8bKv/zlL2bYsGHmrLPOMjExMaZ169Zm+PDh5sMPP/Trc042q/aTTz5Zpawq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d79rZ3V3BAi4ClOuDXpTRUVFPmOOTofn/+M7Nl0jezP//j8uPVSuBZesrtd4cPpsNptWr16tq6++2mf/vn371LdvX7333nsaMWKEMjMzlZmZKUkqKirSmWeeqRdffFHXXXedJOmHH35Qamqq3n77bQ0dOrRWn01+D0PkdyDoyO91FzKzaq9Zs0YHDx7UhAkTJMk74NufqcYlV/ev4uJinw0AEDocxlanDeHB6XTqpptu0v33369u3bpVOb5t2zaVl5f7rMGZkpKi9PT0k67BCQAIfVbP7yEzq/bzzz+vYcOGVenS5c9U45Jr1rRZs2Y1SIwAgNMXqK5cCI45c+YoKipKd911V7XHCwoKFBMTo+bNm/vsr03DeGlpqfc9DeMAEFqsnt9DouK8e/durVu3Tm+88YZ3X3JysiRXgj1xivCaphqXXIPBp02b5n1fXFys1NTUBoga9a5yF67KM1LaIo534XJ33fJ24Yp1z7zn7splmrhenU1c3UUcTaLliHWd64h1fY4j2nV9p7tHian0eTanUYS7h1ZkuavbVeQxp/vVda3Io64Cnpn6bDab5L6O7Zj7uu4uW56re95LDu/39O7z3AO6dAEIQ9u2bdMzzzyj7du319jIXR0axi2M/E5+BywgJLpqL126VK1bt9aIESO8+9LS0pScnOwz1XhZWZk2btx40qnGJdeaX5WnMwcAhA5jIuT0czMmJNIVTuHDDz9UYWGh2rVrp6ioKEVFRWn37t2699571aFDB0muhvGysjIdOHDA59zaNIwXFRV5t7179zbkVwEA+Mnq+T3oT5ydTqeWLl2q8ePHKyrqeDg2m02ZmZmaPXu2OnXqpE6dOmn27NmKi4vTuHHjghgxAOB0OGSTQ/49jfS3PILjpptu0hVXXOGzb+jQobrpppt0yy23SJJ69+6t6Oho5ebmauzYsZJcM6B+/vnnmjt37kmvbbfbT7quJwAg+Kye34NecV63bp327NmjiRMnVjk2ffp0HT16VFOmTNGBAwfUt29frV27VvHx8UGIFABQH5zG/zFNzpBY/wGSdOjQIX377bfe93l5efrkk0/UokULtWvXTi1btvQpHx0dreTkZJ177rmSpMTERE2aNEn33nuvWrZsqRYtWui+++5T9+7dq1S6AQDhw+r5PegV54yMDJ1sRSybzaasrCxlZWUFNigElXfsk3s8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1Qml+201lq04x8TEqHfv3lW6F+bm5qp///5Biqp6xhjdcccdeuONN/T+++8rLS3tlOf8/PPP2rt3r9q0aROACGuntLRUX375pdq0aePt6nni/S8rK9PGjRtD6v4vXbpUrVu31ogRI2osF4r3uzb3uHfv3oqOjvYpk5+fr88//zzofw+eSvM333yjdevWqWXLlqc8Z+fOnSovLw+pvwep6s9HKN93ydXLonfv3urZs+cpy4bqPUfjFU75/UThmCOl8M81JwqV/6tP9XtfKN/z+vidNZR+XowxKi0tDel7XlPc1Qnl+x32AjcPWeCtXLnSREdHm+eff9588cUXJjMz0zRt2tR89913wQ7Nx//8z/+YxMREs2HDBpOfn+/djhw5YowxpqSkxNx7771m8+bNJi8vz6xfv97069fPnHXWWaa4uDhocd97771mw4YNZteuXeajjz4yI0eONPHx8d77+8QTT5jExETzxhtvmM8++8zccMMNpk2bNkGN+UQOh8O0a9fOPPDAAz77Q+l+l5SUmB07dpgdO3YYSWbevHlmx44d3pmna3OPb7/9dtO2bVuzbt06s337dnP55Zebnj17moqKiqDFXl5ebq666irTtm1b88knn/j83JeWlhpjjPn222/NrFmzzJYtW0xeXp7561//arp06WJ69eoV1Nhr+/MRjPt+qp8XY4wpKioycXFxZtGiRVXOD+Y9B/wRDvk9nHJkuOaacP2/+lS/9xkTuve8vn5nDUbsM2bMMB988IHJy8sz//rXv8xDDz1kIiIizNq1a40xoXvPa4o7lO+3FVm64myMMc8++6xp3769iYmJMb/4xS98pssPFZKq3ZYuXWqMMebIkSMmIyPDnHnmmSY6Otq0a9fOjB8/3uzZsyeocV933XWmTZs2Jjo62qSkpJgxY8aYnTt3eo87nU7z6KOPmuTkZGO3281ll11mPvvssyBG7Ou9994zksxXX33lsz+U7vf69eur/dkYP368MaZ29/jo0aPmjjvuMC1atDBNmjQxI0eODMh3qSn2vLy8k/7cr1+/3hhjzJ49e8xll11mWrRoYWJiYkzHjh3NXXfdZX7++eegxl7bn49g3PdT/bwYY8xzzz1nmjRpYg4ePFjl/GDec8BfoZ7fwylHhmuuCdf/q0/1e58xoXvP6+t31mDEPnHiRO//GWeeeaYZPHiwt9JsTOje85riDuX7bUU2Y4ypl0fXAAAAAABYkGXHOAMAAAAAUB+oOAMAAAAAUAMqzgAAAAAA1ICKMwAAAAAANaDiDAAAAABADag4AwAAAABQAyrOAAAAAADUgIozAAAAAAA1oOIMAAAAAEANqDgDAAAAAFADKs4AAAAAANSAijMQYD/99JOSk5M1e/Zs775//vOfiomJ0dq1a4MYGQAAqCvyO2BtNmOMCXYQQGPz9ttv6+qrr9bmzZvVpUsX9erVSyNGjFBOTk6wQwMAAHVEfgesi4ozECRTp07VunXrdMEFF+jTTz/Vli1bFBsbG+ywAADAaSC/A9ZExRkIkqNHjyo9PV179+7V1q1b1aNHj2CHBAAAThP5HbAmxjgDQbJr1y798MMPcjqd2r17d7DDAQAA9YD8DlgTT5yBICgrK9OFF16o888/X126dNG8efP02WefKSkpKdihAQCAOiK/A9ZFxRkIgvvvv1+vvfaaPv30UzVr1kyDBg1SfHy8/vKXvwQ7NAAAUEfkd8C66KoNBNiGDRuUk5OjF198UQkJCYqIiNCLL76oTZs2adGiRcEODwAA1AH5HbA2njgDAAAAAFADnjgDAAAAAFADKs4AAAAAANSAijMAAAAAADWg4gwAAAAAQA2oOAMAAAAAUAMqzgAAAAAA1ICKMwAAAAAANaDiDAAAAABADag4AwAAAABQAyrOAAAAAADUgIozAAAAAAA1oOIMAAAAAEAN/j9/yziQOSUcnQAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1000x400 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure()\n",
"\n",
"fig, axes = plt.subplots(1, 2, figsize=(10, 4))\n",
"\n",
"data_in.plot(ax = axes[0])\n",
"axes[0].set_title(\"ds_in\")\n",
"\n",
"data_out.plot(ax = axes[1])\n",
"axes[1].set_title(\"ds_out regridded\")\n",
"\n",
"plt.tight_layout();"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "585f9690-e5fb-4383-97f4-a0d37ac2fddb",
"metadata": {},
"outputs": [],
"source": [
"R_earth = 6371000\n",
"\n",
"def compute_integral(data, ds):\n",
" lon_b = np.deg2rad(ds['lon_b'].values)\n",
" lat_b = np.deg2rad(ds['lat_b'].values)\n",
" area = np.zeros((ds.sizes['y'], ds.sizes['x']))\n",
" for j in range(ds.sizes['y']):\n",
" for i in range(ds.sizes['x']):\n",
" dlon = lon_b[j, i+1] - lon_b[j, i]\n",
" dlat = np.sin(lat_b[j+1, i]) - np.sin(lat_b[j, i])\n",
" area[j, i] = R_earth**2 * dlon * dlat\n",
"\n",
" return np.sum(data.values * area)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "6424fb9b-b096-427e-86e2-d828bbec001d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0\n",
"0.0\n"
]
}
],
"source": [
"# test that compute_integral works;\n",
"# gives ones as input and check if it gives the area of Earth\n",
"\n",
"print(compute_integral(xr.ones_like(data_in, dtype=float), ds_in) - 4*np.pi*R_earth**2)\n",
"print(compute_integral(xr.ones_like(data_out, dtype=float), ds_out) - 4*np.pi*R_earth**2)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e0646389-3fdf-4716-b814-e749880a4e16",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 9,
"id": "48d62d37-4ee1-4bfd-9a56-879dec07b09b",
"metadata": {},
"outputs": [],
"source": [
"integral_in = compute_integral(data_in, ds_in)\n",
"integral_out = compute_integral(data_out, ds_out)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "81ab1c27-ffca-47c7-854b-ff81445e92c5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"integral ds_in : 9477542713545.94\n",
"integral ds_out: 9477723141655.86\n",
"abs error: 180428109.91992188\n",
"rel error: 1.9037435691220038e-05\n"
]
}
],
"source": [
"print(\"integral ds_in : \", integral_in)\n",
"print(\"integral ds_out: \", integral_out)\n",
"\n",
"print(\"abs error: \", np.abs(integral_in - integral_out))\n",
"print(\"rel error: \", np.abs(integral_in - integral_out) / np.abs(integral_in))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7db2178d-d0a1-4c9e-8b6a-d8d22ac8e2cd",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment