{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Save time by reusing regridder\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is an important reason why the regridding is broken into two steps (making\n", "the regridder and perform regridding). For high-resolution grids, making the\n", "regridder (i.e. \"computing regridding weights\", explained later) is quite\n", "computationally expensive, but performing regridding on data (\"applying\n", "regridding weights\") is still pretty fast.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import xarray as xr\n", "import xesmf as xe" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prepare data\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The grids in previous examples were all quite small and the regridding was\n", "almost instantaneous. Let's try a large-ish grid here.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "Show/Hide data repr\n", "\n", "\n", "\n", "\n", "\n", "Show/Hide attributes\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
xarray.Dataset
" ], "text/plain": [ "\n", "Dimensions: (x: 600, x_b: 601, y: 400, y_b: 401)\n", "Coordinates:\n", " lon (y, x) float64 -119.8 -119.4 -119.0 -118.6 ... 119.0 119.4 119.8\n", " lat (y, x) float64 -59.85 -59.85 -59.85 -59.85 ... 59.85 59.85 59.85\n", " lon_b (y_b, x_b) float64 -120.0 -119.6 -119.2 ... 119.2 119.6 120.0\n", " lat_b (y_b, x_b) float64 -60.0 -60.0 -60.0 -60.0 ... 60.0 60.0 60.0 60.0\n", "Dimensions without coordinates: x, x_b, y, y_b\n", "Data variables:\n", " *empty*" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds_in = xe.util.grid_2d(\n", " -120, 120, 0.4, -60, 60, 0.3 # longitude range and resolution\n", ") # latitude range and resolution\n", "ds_in" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "Show/Hide data repr\n", "\n", "\n", "\n", "\n", "\n", "Show/Hide attributes\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
xarray.Dataset
    • x: 400
    • x_b: 401
    • y: 300
    • y_b: 301
    • lon
      (y, x)
      float64
      -119.7 -119.1 ... 119.1 119.7
      array([[-119.7, -119.1, -118.5, ...,  118.5,  119.1,  119.7],\n",
             "       [-119.7, -119.1, -118.5, ...,  118.5,  119.1,  119.7],\n",
             "       [-119.7, -119.1, -118.5, ...,  118.5,  119.1,  119.7],\n",
             "       ...,\n",
             "       [-119.7, -119.1, -118.5, ...,  118.5,  119.1,  119.7],\n",
             "       [-119.7, -119.1, -118.5, ...,  118.5,  119.1,  119.7],\n",
             "       [-119.7, -119.1, -118.5, ...,  118.5,  119.1,  119.7]])
    • lat
      (y, x)
      float64
      -59.8 -59.8 -59.8 ... 59.8 59.8
      array([[-59.8, -59.8, -59.8, ..., -59.8, -59.8, -59.8],\n",
             "       [-59.4, -59.4, -59.4, ..., -59.4, -59.4, -59.4],\n",
             "       [-59. , -59. , -59. , ..., -59. , -59. , -59. ],\n",
             "       ...,\n",
             "       [ 59. ,  59. ,  59. , ...,  59. ,  59. ,  59. ],\n",
             "       [ 59.4,  59.4,  59.4, ...,  59.4,  59.4,  59.4],\n",
             "       [ 59.8,  59.8,  59.8, ...,  59.8,  59.8,  59.8]])
    • lon_b
      (y_b, x_b)
      float64
      -120.0 -119.4 ... 119.4 120.0
      array([[-120. , -119.4, -118.8, ...,  118.8,  119.4,  120. ],\n",
             "       [-120. , -119.4, -118.8, ...,  118.8,  119.4,  120. ],\n",
             "       [-120. , -119.4, -118.8, ...,  118.8,  119.4,  120. ],\n",
             "       ...,\n",
             "       [-120. , -119.4, -118.8, ...,  118.8,  119.4,  120. ],\n",
             "       [-120. , -119.4, -118.8, ...,  118.8,  119.4,  120. ],\n",
             "       [-120. , -119.4, -118.8, ...,  118.8,  119.4,  120. ]])
    • lat_b
      (y_b, x_b)
      float64
      -60.0 -60.0 -60.0 ... 60.0 60.0
      array([[-60. , -60. , -60. , ..., -60. , -60. , -60. ],\n",
             "       [-59.6, -59.6, -59.6, ..., -59.6, -59.6, -59.6],\n",
             "       [-59.2, -59.2, -59.2, ..., -59.2, -59.2, -59.2],\n",
             "       ...,\n",
             "       [ 59.2,  59.2,  59.2, ...,  59.2,  59.2,  59.2],\n",
             "       [ 59.6,  59.6,  59.6, ...,  59.6,  59.6,  59.6],\n",
             "       [ 60. ,  60. ,  60. , ...,  60. ,  60. ,  60. ]])
    " ], "text/plain": [ "\n", "Dimensions: (x: 400, x_b: 401, y: 300, y_b: 301)\n", "Coordinates:\n", " lon (y, x) float64 -119.7 -119.1 -118.5 -117.9 ... 118.5 119.1 119.7\n", " lat (y, x) float64 -59.8 -59.8 -59.8 -59.8 ... 59.8 59.8 59.8 59.8\n", " lon_b (y_b, x_b) float64 -120.0 -119.4 -118.8 ... 118.8 119.4 120.0\n", " lat_b (y_b, x_b) float64 -60.0 -60.0 -60.0 -60.0 ... 60.0 60.0 60.0 60.0\n", "Dimensions without coordinates: x, x_b, y, y_b\n", "Data variables:\n", " *empty*" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds_out = xe.util.grid_2d(-120, 120, 0.6, -60, 60, 0.4)\n", "ds_out" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Also make a large-ish 4D data, with multiple time frames and vertical levels.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
    \n", "\n", "\n", "Show/Hide data repr\n", "\n", "\n", "\n", "\n", "\n", "Show/Hide attributes\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
    xarray.Dataset
      • lev: 50
      • time: 10
      • x: 600
      • x_b: 601
      • y: 400
      • y_b: 401
      • lon
        (y, x)
        float64
        -119.8 -119.4 ... 119.4 119.8
        array([[-119.8, -119.4, -119. , ...,  119. ,  119.4,  119.8],\n",
               "       [-119.8, -119.4, -119. , ...,  119. ,  119.4,  119.8],\n",
               "       [-119.8, -119.4, -119. , ...,  119. ,  119.4,  119.8],\n",
               "       ...,\n",
               "       [-119.8, -119.4, -119. , ...,  119. ,  119.4,  119.8],\n",
               "       [-119.8, -119.4, -119. , ...,  119. ,  119.4,  119.8],\n",
               "       [-119.8, -119.4, -119. , ...,  119. ,  119.4,  119.8]])
      • lat
        (y, x)
        float64
        -59.85 -59.85 ... 59.85 59.85
        array([[-59.85, -59.85, -59.85, ..., -59.85, -59.85, -59.85],\n",
               "       [-59.55, -59.55, -59.55, ..., -59.55, -59.55, -59.55],\n",
               "       [-59.25, -59.25, -59.25, ..., -59.25, -59.25, -59.25],\n",
               "       ...,\n",
               "       [ 59.25,  59.25,  59.25, ...,  59.25,  59.25,  59.25],\n",
               "       [ 59.55,  59.55,  59.55, ...,  59.55,  59.55,  59.55],\n",
               "       [ 59.85,  59.85,  59.85, ...,  59.85,  59.85,  59.85]])
      • lon_b
        (y_b, x_b)
        float64
        -120.0 -119.6 ... 119.6 120.0
        array([[-120. , -119.6, -119.2, ...,  119.2,  119.6,  120. ],\n",
               "       [-120. , -119.6, -119.2, ...,  119.2,  119.6,  120. ],\n",
               "       [-120. , -119.6, -119.2, ...,  119.2,  119.6,  120. ],\n",
               "       ...,\n",
               "       [-120. , -119.6, -119.2, ...,  119.2,  119.6,  120. ],\n",
               "       [-120. , -119.6, -119.2, ...,  119.2,  119.6,  120. ],\n",
               "       [-120. , -119.6, -119.2, ...,  119.2,  119.6,  120. ]])
      • lat_b
        (y_b, x_b)
        float64
        -60.0 -60.0 -60.0 ... 60.0 60.0
        array([[-60. , -60. , -60. , ..., -60. , -60. , -60. ],\n",
               "       [-59.7, -59.7, -59.7, ..., -59.7, -59.7, -59.7],\n",
               "       [-59.4, -59.4, -59.4, ..., -59.4, -59.4, -59.4],\n",
               "       ...,\n",
               "       [ 59.4,  59.4,  59.4, ...,  59.4,  59.4,  59.4],\n",
               "       [ 59.7,  59.7,  59.7, ...,  59.7,  59.7,  59.7],\n",
               "       [ 60. ,  60. ,  60. , ...,  60. ,  60. ,  60. ]])
      • time
        (time)
        int64
        1 2 3 4 5 6 7 8 9 10
        array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
      • lev
        (lev)
        int64
        1 2 3 4 5 6 7 ... 45 46 47 48 49 50
        array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18,\n",
               "       19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,\n",
               "       37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50])
      • data2D
        (y, x)
        float64
        1.872 1.869 1.866 ... 1.869 1.872
        array([[1.87234253, 1.86931698, 1.86631691, ..., 1.86631691, 1.86931698,\n",
               "        1.87234253],\n",
               "       [1.87003418, 1.86695393, 1.86389961, ..., 1.86389961, 1.86695393,\n",
               "        1.87003418],\n",
               "       [1.86771234, 1.86457706, 1.86146818, ..., 1.86146818, 1.86457706,\n",
               "        1.86771234],\n",
               "       ...,\n",
               "       [1.86771234, 1.86457706, 1.86146818, ..., 1.86146818, 1.86457706,\n",
               "        1.86771234],\n",
               "       [1.87003418, 1.86695393, 1.86389961, ..., 1.86389961, 1.86695393,\n",
               "        1.87003418],\n",
               "       [1.87234253, 1.86931698, 1.86631691, ..., 1.86631691, 1.86931698,\n",
               "        1.87234253]])
      • data4D
        (time, lev, y, x)
        float64
        1.872 1.869 1.866 ... 934.7 936.2
        array([[[[  1.87234253,   1.86931698,   1.86631691, ...,   1.86631691,\n",
               "            1.86931698,   1.87234253],\n",
               "         [  1.87003418,   1.86695393,   1.86389961, ...,   1.86389961,\n",
               "            1.86695393,   1.87003418],\n",
               "         [  1.86771234,   1.86457706,   1.86146818, ...,   1.86146818,\n",
               "            1.86457706,   1.86771234],\n",
               "         ...,\n",
               "         [  1.86771234,   1.86457706,   1.86146818, ...,   1.86146818,\n",
               "            1.86457706,   1.86771234],\n",
               "         [  1.87003418,   1.86695393,   1.86389961, ...,   1.86389961,\n",
               "            1.86695393,   1.87003418],\n",
               "         [  1.87234253,   1.86931698,   1.86631691, ...,   1.86631691,\n",
               "            1.86931698,   1.87234253]],\n",
               "\n",
               "        [[  3.74468505,   3.73863396,   3.73263383, ...,   3.73263383,\n",
               "            3.73863396,   3.74468505],\n",
               "         [  3.74006836,   3.73390785,   3.72779922, ...,   3.72779922,\n",
               "            3.73390785,   3.74006836],\n",
               "         [  3.73542468,   3.72915412,   3.72293635, ...,   3.72293635,\n",
               "            3.72915412,   3.73542468],\n",
               "         ...,\n",
               "         [  3.73542468,   3.72915412,   3.72293635, ...,   3.72293635,\n",
               "            3.72915412,   3.73542468],\n",
               "         [  3.74006836,   3.73390785,   3.72779922, ...,   3.72779922,\n",
               "            3.73390785,   3.74006836],\n",
               "         [  3.74468505,   3.73863396,   3.73263383, ...,   3.73263383,\n",
               "            3.73863396,   3.74468505]],\n",
               "\n",
               "        [[  5.61702758,   5.60795094,   5.59895074, ...,   5.59895074,\n",
               "            5.60795094,   5.61702758],\n",
               "         [  5.61010254,   5.60086178,   5.59169883, ...,   5.59169883,\n",
               "            5.60086178,   5.61010254],\n",
               "         [  5.60313702,   5.59373117,   5.58440453, ...,   5.58440453,\n",
               "            5.59373117,   5.60313702],\n",
               "         ...,\n",
               "         [  5.60313702,   5.59373117,   5.58440453, ...,   5.58440453,\n",
               "            5.59373117,   5.60313702],\n",
               "         [  5.61010254,   5.60086178,   5.59169883, ...,   5.59169883,\n",
               "            5.60086178,   5.61010254],\n",
               "         [  5.61702758,   5.60795094,   5.59895074, ...,   5.59895074,\n",
               "            5.60795094,   5.61702758]],\n",
               "\n",
               "        ...,\n",
               "\n",
               "        [[ 89.87244122,  89.72721511,  89.58321189, ...,  89.58321189,\n",
               "           89.72721511,  89.87244122],\n",
               "         [ 89.76164062,  89.61378848,  89.46718135, ...,  89.46718135,\n",
               "           89.61378848,  89.76164062],\n",
               "         [ 89.65019231,  89.49969879,  89.35047252, ...,  89.35047252,\n",
               "           89.49969879,  89.65019231],\n",
               "         ...,\n",
               "         [ 89.65019231,  89.49969879,  89.35047252, ...,  89.35047252,\n",
               "           89.49969879,  89.65019231],\n",
               "         [ 89.76164062,  89.61378848,  89.46718135, ...,  89.46718135,\n",
               "           89.61378848,  89.76164062],\n",
               "         [ 89.87244122,  89.72721511,  89.58321189, ...,  89.58321189,\n",
               "           89.72721511,  89.87244122]],\n",
               "\n",
               "        [[ 91.74478375,  91.59653209,  91.44952881, ...,  91.44952881,\n",
               "           91.59653209,  91.74478375],\n",
               "         [ 91.6316748 ,  91.48074241,  91.33108096, ...,  91.33108096,\n",
               "           91.48074241,  91.6316748 ],\n",
               "         [ 91.51790465,  91.36427585,  91.2119407 , ...,  91.2119407 ,\n",
               "           91.36427585,  91.51790465],\n",
               "         ...,\n",
               "         [ 91.51790465,  91.36427585,  91.2119407 , ...,  91.2119407 ,\n",
               "           91.36427585,  91.51790465],\n",
               "         [ 91.6316748 ,  91.48074241,  91.33108096, ...,  91.33108096,\n",
               "           91.48074241,  91.6316748 ],\n",
               "         [ 91.74478375,  91.59653209,  91.44952881, ...,  91.44952881,\n",
               "           91.59653209,  91.74478375]],\n",
               "\n",
               "        [[ 93.61712627,  93.46584907,  93.31584572, ...,  93.31584572,\n",
               "           93.46584907,  93.61712627],\n",
               "         [ 93.50170898,  93.34769633,  93.19498057, ...,  93.19498057,\n",
               "           93.34769633,  93.50170898],\n",
               "         [ 93.38561699,  93.22885291,  93.07340887, ...,  93.07340887,\n",
               "           93.22885291,  93.38561699],\n",
               "         ...,\n",
               "         [ 93.38561699,  93.22885291,  93.07340887, ...,  93.07340887,\n",
               "           93.22885291,  93.38561699],\n",
               "         [ 93.50170898,  93.34769633,  93.19498057, ...,  93.19498057,\n",
               "           93.34769633,  93.50170898],\n",
               "         [ 93.61712627,  93.46584907,  93.31584572, ...,  93.31584572,\n",
               "           93.46584907,  93.61712627]]],\n",
               "\n",
               "\n",
               "       [[[  3.74468505,   3.73863396,   3.73263383, ...,   3.73263383,\n",
               "            3.73863396,   3.74468505],\n",
               "         [  3.74006836,   3.73390785,   3.72779922, ...,   3.72779922,\n",
               "            3.73390785,   3.74006836],\n",
               "         [  3.73542468,   3.72915412,   3.72293635, ...,   3.72293635,\n",
               "            3.72915412,   3.73542468],\n",
               "         ...,\n",
               "         [  3.73542468,   3.72915412,   3.72293635, ...,   3.72293635,\n",
               "            3.72915412,   3.73542468],\n",
               "         [  3.74006836,   3.73390785,   3.72779922, ...,   3.72779922,\n",
               "            3.73390785,   3.74006836],\n",
               "         [  3.74468505,   3.73863396,   3.73263383, ...,   3.73263383,\n",
               "            3.73863396,   3.74468505]],\n",
               "\n",
               "        [[  7.4893701 ,   7.47726793,   7.46526766, ...,   7.46526766,\n",
               "            7.47726793,   7.4893701 ],\n",
               "         [  7.48013672,   7.46781571,   7.45559845, ...,   7.45559845,\n",
               "            7.46781571,   7.48013672],\n",
               "         [  7.47084936,   7.45830823,   7.44587271, ...,   7.44587271,\n",
               "            7.45830823,   7.47084936],\n",
               "         ...,\n",
               "         [  7.47084936,   7.45830823,   7.44587271, ...,   7.44587271,\n",
               "            7.45830823,   7.47084936],\n",
               "         [  7.48013672,   7.46781571,   7.45559845, ...,   7.45559845,\n",
               "            7.46781571,   7.48013672],\n",
               "         [  7.4893701 ,   7.47726793,   7.46526766, ...,   7.46526766,\n",
               "            7.47726793,   7.4893701 ]],\n",
               "\n",
               "        [[ 11.23405515,  11.21590189,  11.19790149, ...,  11.19790149,\n",
               "           11.21590189,  11.23405515],\n",
               "         [ 11.22020508,  11.20172356,  11.18339767, ...,  11.18339767,\n",
               "           11.20172356,  11.22020508],\n",
               "         [ 11.20627404,  11.18746235,  11.16880906, ...,  11.16880906,\n",
               "           11.18746235,  11.20627404],\n",
               "         ...,\n",
               "         [ 11.20627404,  11.18746235,  11.16880906, ...,  11.16880906,\n",
               "           11.18746235,  11.20627404],\n",
               "         [ 11.22020508,  11.20172356,  11.18339767, ...,  11.18339767,\n",
               "           11.20172356,  11.22020508],\n",
               "         [ 11.23405515,  11.21590189,  11.19790149, ...,  11.19790149,\n",
               "           11.21590189,  11.23405515]],\n",
               "\n",
               "        ...,\n",
               "\n",
               "        [[179.74488244, 179.45443022, 179.16642378, ..., 179.16642378,\n",
               "          179.45443022, 179.74488244],\n",
               "         [179.52328123, 179.22757696, 178.93436269, ..., 178.93436269,\n",
               "          179.22757696, 179.52328123],\n",
               "         [179.30038461, 178.99939758, 178.70094504, ..., 178.70094504,\n",
               "          178.99939758, 179.30038461],\n",
               "         ...,\n",
               "         [179.30038461, 178.99939758, 178.70094504, ..., 178.70094504,\n",
               "          178.99939758, 179.30038461],\n",
               "         [179.52328123, 179.22757696, 178.93436269, ..., 178.93436269,\n",
               "          179.22757696, 179.52328123],\n",
               "         [179.74488244, 179.45443022, 179.16642378, ..., 179.16642378,\n",
               "          179.45443022, 179.74488244]],\n",
               "\n",
               "        [[183.48956749, 183.19306418, 182.89905761, ..., 182.89905761,\n",
               "          183.19306418, 183.48956749],\n",
               "         [183.26334959, 182.96148481, 182.66216191, ..., 182.66216191,\n",
               "          182.96148481, 183.26334959],\n",
               "         [183.03580929, 182.72855169, 182.42388139, ..., 182.42388139,\n",
               "          182.72855169, 183.03580929],\n",
               "         ...,\n",
               "         [183.03580929, 182.72855169, 182.42388139, ..., 182.42388139,\n",
               "          182.72855169, 183.03580929],\n",
               "         [183.26334959, 182.96148481, 182.66216191, ..., 182.66216191,\n",
               "          182.96148481, 183.26334959],\n",
               "         [183.48956749, 183.19306418, 182.89905761, ..., 182.89905761,\n",
               "          183.19306418, 183.48956749]],\n",
               "\n",
               "        [[187.23425254, 186.93169815, 186.63169144, ..., 186.63169144,\n",
               "          186.93169815, 187.23425254],\n",
               "         [187.00341795, 186.69539266, 186.38996114, ..., 186.38996114,\n",
               "          186.69539267, 187.00341795],\n",
               "         [186.77123397, 186.45770581, 186.14681775, ..., 186.14681775,\n",
               "          186.45770581, 186.77123397],\n",
               "         ...,\n",
               "         [186.77123397, 186.45770581, 186.14681775, ..., 186.14681775,\n",
               "          186.45770581, 186.77123397],\n",
               "         [187.00341795, 186.69539266, 186.38996114, ..., 186.38996114,\n",
               "          186.69539267, 187.00341795],\n",
               "         [187.23425254, 186.93169815, 186.63169144, ..., 186.63169144,\n",
               "          186.93169815, 187.23425254]]],\n",
               "\n",
               "\n",
               "       [[[  5.61702758,   5.60795094,   5.59895074, ...,   5.59895074,\n",
               "            5.60795094,   5.61702758],\n",
               "         [  5.61010254,   5.60086178,   5.59169883, ...,   5.59169883,\n",
               "            5.60086178,   5.61010254],\n",
               "         [  5.60313702,   5.59373117,   5.58440453, ...,   5.58440453,\n",
               "            5.59373117,   5.60313702],\n",
               "         ...,\n",
               "         [  5.60313702,   5.59373117,   5.58440453, ...,   5.58440453,\n",
               "            5.59373117,   5.60313702],\n",
               "         [  5.61010254,   5.60086178,   5.59169883, ...,   5.59169883,\n",
               "            5.60086178,   5.61010254],\n",
               "         [  5.61702758,   5.60795094,   5.59895074, ...,   5.59895074,\n",
               "            5.60795094,   5.61702758]],\n",
               "\n",
               "        [[ 11.23405515,  11.21590189,  11.19790149, ...,  11.19790149,\n",
               "           11.21590189,  11.23405515],\n",
               "         [ 11.22020508,  11.20172356,  11.18339767, ...,  11.18339767,\n",
               "           11.20172356,  11.22020508],\n",
               "         [ 11.20627404,  11.18746235,  11.16880906, ...,  11.16880906,\n",
               "           11.18746235,  11.20627404],\n",
               "         ...,\n",
               "         [ 11.20627404,  11.18746235,  11.16880906, ...,  11.16880906,\n",
               "           11.18746235,  11.20627404],\n",
               "         [ 11.22020508,  11.20172356,  11.18339767, ...,  11.18339767,\n",
               "           11.20172356,  11.22020508],\n",
               "         [ 11.23405515,  11.21590189,  11.19790149, ...,  11.19790149,\n",
               "           11.21590189,  11.23405515]],\n",
               "\n",
               "        [[ 16.85108273,  16.82385283,  16.79685223, ...,  16.79685223,\n",
               "           16.82385283,  16.85108273],\n",
               "         [ 16.83030762,  16.80258534,  16.7750965 , ...,  16.7750965 ,\n",
               "           16.80258534,  16.83030762],\n",
               "         [ 16.80941106,  16.78119352,  16.7532136 , ...,  16.7532136 ,\n",
               "           16.78119352,  16.80941106],\n",
               "         ...,\n",
               "         [ 16.80941106,  16.78119352,  16.7532136 , ...,  16.7532136 ,\n",
               "           16.78119352,  16.80941106],\n",
               "         [ 16.83030762,  16.80258534,  16.7750965 , ...,  16.7750965 ,\n",
               "           16.80258534,  16.83030762],\n",
               "         [ 16.85108273,  16.82385283,  16.79685223, ...,  16.79685223,\n",
               "           16.82385283,  16.85108273]],\n",
               "\n",
               "        ...,\n",
               "\n",
               "        [[269.61732366, 269.18164533, 268.74963567, ..., 268.74963567,\n",
               "          269.18164533, 269.61732366],\n",
               "         [269.28492185, 268.84136544, 268.40154404, ..., 268.40154404,\n",
               "          268.84136544, 269.28492185],\n",
               "         [268.95057692, 268.49909637, 268.05141755, ..., 268.05141755,\n",
               "          268.49909637, 268.95057692],\n",
               "         ...,\n",
               "         [268.95057692, 268.49909637, 268.05141755, ..., 268.05141755,\n",
               "          268.49909637, 268.95057692],\n",
               "         [269.28492185, 268.84136544, 268.40154404, ..., 268.40154404,\n",
               "          268.84136544, 269.28492185],\n",
               "         [269.61732366, 269.18164533, 268.74963567, ..., 268.74963567,\n",
               "          269.18164533, 269.61732366]],\n",
               "\n",
               "        [[275.23435124, 274.78959627, 274.34858642, ..., 274.34858642,\n",
               "          274.78959627, 275.23435124],\n",
               "         [274.89502439, 274.44222722, 273.99324287, ..., 273.99324287,\n",
               "          274.44222722, 274.89502439],\n",
               "         [274.55371394, 274.09282754, 273.63582209, ..., 273.63582209,\n",
               "          274.09282754, 274.55371394],\n",
               "         ...,\n",
               "         [274.55371394, 274.09282754, 273.63582209, ..., 273.63582209,\n",
               "          274.09282754, 274.55371394],\n",
               "         [274.89502439, 274.44222722, 273.99324287, ..., 273.99324287,\n",
               "          274.44222722, 274.89502439],\n",
               "         [275.23435124, 274.78959627, 274.34858642, ..., 274.34858642,\n",
               "          274.78959627, 275.23435124]],\n",
               "\n",
               "        [[280.85137881, 280.39754722, 279.94753716, ..., 279.94753716,\n",
               "          280.39754722, 280.85137881],\n",
               "         [280.50512693, 280.043089  , 279.5849417 , ..., 279.5849417 ,\n",
               "          280.043089  , 280.50512693],\n",
               "         [280.15685096, 279.68655872, 279.22022662, ..., 279.22022662,\n",
               "          279.68655872, 280.15685096],\n",
               "         ...,\n",
               "         [280.15685096, 279.68655872, 279.22022662, ..., 279.22022662,\n",
               "          279.68655872, 280.15685096],\n",
               "         [280.50512693, 280.043089  , 279.5849417 , ..., 279.5849417 ,\n",
               "          280.043089  , 280.50512693],\n",
               "         [280.85137881, 280.39754722, 279.94753716, ..., 279.94753716,\n",
               "          280.39754722, 280.85137881]]],\n",
               "\n",
               "\n",
               "       ...,\n",
               "\n",
               "\n",
               "       [[[ 14.9787402 ,  14.95453585,  14.93053532, ...,  14.93053532,\n",
               "           14.95453585,  14.9787402 ],\n",
               "         [ 14.96027344,  14.93563141,  14.91119689, ...,  14.91119689,\n",
               "           14.93563141,  14.96027344],\n",
               "         [ 14.94169872,  14.91661646,  14.89174542, ...,  14.89174542,\n",
               "           14.91661646,  14.94169872],\n",
               "         ...,\n",
               "         [ 14.94169872,  14.91661646,  14.89174542, ...,  14.89174542,\n",
               "           14.91661646,  14.94169872],\n",
               "         [ 14.96027344,  14.93563141,  14.91119689, ...,  14.91119689,\n",
               "           14.93563141,  14.96027344],\n",
               "         [ 14.9787402 ,  14.95453585,  14.93053532, ...,  14.93053532,\n",
               "           14.95453585,  14.9787402 ]],\n",
               "\n",
               "        [[ 29.95748041,  29.9090717 ,  29.86107063, ...,  29.86107063,\n",
               "           29.9090717 ,  29.95748041],\n",
               "         [ 29.92054687,  29.87126283,  29.82239378, ...,  29.82239378,\n",
               "           29.87126283,  29.92054687],\n",
               "         [ 29.88339744,  29.83323293,  29.78349084, ...,  29.78349084,\n",
               "           29.83323293,  29.88339744],\n",
               "         ...,\n",
               "         [ 29.88339744,  29.83323293,  29.78349084, ...,  29.78349084,\n",
               "           29.83323293,  29.88339744],\n",
               "         [ 29.92054687,  29.87126283,  29.82239378, ...,  29.82239378,\n",
               "           29.87126283,  29.92054687],\n",
               "         [ 29.95748041,  29.9090717 ,  29.86107063, ...,  29.86107063,\n",
               "           29.9090717 ,  29.95748041]],\n",
               "\n",
               "        [[ 44.93622061,  44.86360755,  44.79160595, ...,  44.79160595,\n",
               "           44.86360755,  44.93622061],\n",
               "         [ 44.88082031,  44.80689424,  44.73359067, ...,  44.73359067,\n",
               "           44.80689424,  44.88082031],\n",
               "         [ 44.82509615,  44.74984939,  44.67523626, ...,  44.67523626,\n",
               "           44.74984939,  44.82509615],\n",
               "         ...,\n",
               "         [ 44.82509615,  44.74984939,  44.67523626, ...,  44.67523626,\n",
               "           44.74984939,  44.82509615],\n",
               "         [ 44.88082031,  44.80689424,  44.73359067, ...,  44.73359067,\n",
               "           44.80689424,  44.88082031],\n",
               "         [ 44.93622061,  44.86360755,  44.79160595, ...,  44.79160595,\n",
               "           44.86360755,  44.93622061]],\n",
               "\n",
               "        ...,\n",
               "\n",
               "        [[718.97952976, 717.81772088, 716.66569513, ..., 716.66569513,\n",
               "          717.81772088, 718.97952976],\n",
               "         [718.09312494, 716.91030783, 715.73745076, ..., 715.73745076,\n",
               "          716.91030783, 718.09312494],\n",
               "         [717.20153845, 715.99759031, 714.80378015, ..., 714.80378015,\n",
               "          715.99759031, 717.20153845],\n",
               "         ...,\n",
               "         [717.20153845, 715.99759031, 714.80378015, ..., 714.80378015,\n",
               "          715.99759031, 717.20153845],\n",
               "         [718.09312494, 716.91030783, 715.73745076, ..., 715.73745076,\n",
               "          716.91030783, 718.09312494],\n",
               "         [718.97952976, 717.81772088, 716.66569513, ..., 716.66569513,\n",
               "          717.81772088, 718.97952976]],\n",
               "\n",
               "        [[733.95826996, 732.77225673, 731.59623044, ..., 731.59623044,\n",
               "          732.77225673, 733.95826996],\n",
               "         [733.05339838, 731.84593925, 730.64864766, ..., 730.64864766,\n",
               "          731.84593925, 733.05339838],\n",
               "         [732.14323717, 730.91420678, 729.69552557, ..., 729.69552557,\n",
               "          730.91420678, 732.14323717],\n",
               "         ...,\n",
               "         [732.14323717, 730.91420678, 729.69552557, ..., 729.69552557,\n",
               "          730.91420678, 732.14323717],\n",
               "         [733.05339838, 731.84593925, 730.64864766, ..., 730.64864766,\n",
               "          731.84593925, 733.05339838],\n",
               "         [733.95826996, 732.77225673, 731.59623044, ..., 731.59623044,\n",
               "          732.77225673, 733.95826996]],\n",
               "\n",
               "        [[748.93701017, 747.72679258, 746.52676576, ..., 746.52676576,\n",
               "          747.72679258, 748.93701017],\n",
               "         [748.01367181, 746.78157066, 745.55984455, ..., 745.55984455,\n",
               "          746.78157066, 748.01367181],\n",
               "         [747.08493588, 745.83082324, 744.58727099, ..., 744.58727099,\n",
               "          745.83082324, 747.08493588],\n",
               "         ...,\n",
               "         [747.08493588, 745.83082324, 744.58727099, ..., 744.58727099,\n",
               "          745.83082324, 747.08493588],\n",
               "         [748.01367181, 746.78157066, 745.55984455, ..., 745.55984455,\n",
               "          746.78157066, 748.01367181],\n",
               "         [748.93701017, 747.72679258, 746.52676576, ..., 746.52676576,\n",
               "          747.72679258, 748.93701017]]],\n",
               "\n",
               "\n",
               "       [[[ 16.85108273,  16.82385283,  16.79685223, ...,  16.79685223,\n",
               "           16.82385283,  16.85108273],\n",
               "         [ 16.83030762,  16.80258534,  16.7750965 , ...,  16.7750965 ,\n",
               "           16.80258534,  16.83030762],\n",
               "         [ 16.80941106,  16.78119352,  16.7532136 , ...,  16.7532136 ,\n",
               "           16.78119352,  16.80941106],\n",
               "         ...,\n",
               "         [ 16.80941106,  16.78119352,  16.7532136 , ...,  16.7532136 ,\n",
               "           16.78119352,  16.80941106],\n",
               "         [ 16.83030762,  16.80258534,  16.7750965 , ...,  16.7750965 ,\n",
               "           16.80258534,  16.83030762],\n",
               "         [ 16.85108273,  16.82385283,  16.79685223, ...,  16.79685223,\n",
               "           16.82385283,  16.85108273]],\n",
               "\n",
               "        [[ 33.70216546,  33.64770567,  33.59370446, ...,  33.59370446,\n",
               "           33.64770567,  33.70216546],\n",
               "         [ 33.66061523,  33.60517068,  33.550193  , ...,  33.550193  ,\n",
               "           33.60517068,  33.66061523],\n",
               "         [ 33.61882211,  33.56238705,  33.50642719, ...,  33.50642719,\n",
               "           33.56238705,  33.61882211],\n",
               "         ...,\n",
               "         [ 33.61882211,  33.56238705,  33.50642719, ...,  33.50642719,\n",
               "           33.56238705,  33.61882211],\n",
               "         [ 33.66061523,  33.60517068,  33.550193  , ...,  33.550193  ,\n",
               "           33.60517068,  33.66061523],\n",
               "         [ 33.70216546,  33.64770567,  33.59370446, ...,  33.59370446,\n",
               "           33.64770567,  33.70216546]],\n",
               "\n",
               "        [[ 50.55324819,  50.4715585 ,  50.39055669, ...,  50.39055669,\n",
               "           50.4715585 ,  50.55324819],\n",
               "         [ 50.49092285,  50.40775602,  50.32528951, ...,  50.32528951,\n",
               "           50.40775602,  50.49092285],\n",
               "         [ 50.42823317,  50.34358057,  50.25964079, ...,  50.25964079,\n",
               "           50.34358057,  50.42823317],\n",
               "         ...,\n",
               "         [ 50.42823317,  50.34358057,  50.25964079, ...,  50.25964079,\n",
               "           50.34358057,  50.42823317],\n",
               "         [ 50.49092285,  50.40775602,  50.32528951, ...,  50.32528951,\n",
               "           50.40775602,  50.49092285],\n",
               "         [ 50.55324819,  50.4715585 ,  50.39055669, ...,  50.39055669,\n",
               "           50.4715585 ,  50.55324819]],\n",
               "\n",
               "        ...,\n",
               "\n",
               "        [[808.85197098, 807.54493599, 806.24890702, ..., 806.24890702,\n",
               "          807.54493599, 808.85197098],\n",
               "         [807.85476556, 806.52409631, 805.20463211, ..., 805.20463211,\n",
               "          806.52409631, 807.85476556],\n",
               "         [806.85173075, 805.4972891 , 804.15425266, ..., 804.15425266,\n",
               "          805.4972891 , 806.85173075],\n",
               "         ...,\n",
               "         [806.85173075, 805.4972891 , 804.15425266, ..., 804.15425266,\n",
               "          805.4972891 , 806.85173075],\n",
               "         [807.85476556, 806.52409631, 805.20463211, ..., 805.20463211,\n",
               "          806.52409631, 807.85476556],\n",
               "         [808.85197098, 807.54493599, 806.24890702, ..., 806.24890702,\n",
               "          807.54493599, 808.85197098]],\n",
               "\n",
               "        [[825.70305371, 824.36878882, 823.04575925, ..., 823.04575925,\n",
               "          824.36878882, 825.70305371],\n",
               "         [824.68507317, 823.32668165, 821.97972861, ..., 821.97972861,\n",
               "          823.32668165, 824.68507317],\n",
               "         [823.66114181, 822.27848262, 820.90746626, ..., 820.90746626,\n",
               "          822.27848262, 823.66114181],\n",
               "         ...,\n",
               "         [823.66114181, 822.27848262, 820.90746626, ..., 820.90746626,\n",
               "          822.27848262, 823.66114181],\n",
               "         [824.68507317, 823.32668165, 821.97972861, ..., 821.97972861,\n",
               "          823.32668165, 824.68507317],\n",
               "         [825.70305371, 824.36878882, 823.04575925, ..., 823.04575925,\n",
               "          824.36878882, 825.70305371]],\n",
               "\n",
               "        [[842.55413644, 841.19264165, 839.84261148, ..., 839.84261148,\n",
               "          841.19264165, 842.55413644],\n",
               "         [841.51538079, 840.12926699, 838.75482511, ..., 838.75482511,\n",
               "          840.12926699, 841.51538079],\n",
               "         [840.47055287, 839.05967615, 837.66067986, ..., 837.66067986,\n",
               "          839.05967615, 840.47055287],\n",
               "         ...,\n",
               "         [840.47055287, 839.05967615, 837.66067986, ..., 837.66067986,\n",
               "          839.05967615, 840.47055287],\n",
               "         [841.51538079, 840.12926699, 838.75482511, ..., 838.75482511,\n",
               "          840.12926699, 841.51538079],\n",
               "         [842.55413644, 841.19264165, 839.84261148, ..., 839.84261148,\n",
               "          841.19264165, 842.55413644]]],\n",
               "\n",
               "\n",
               "       [[[ 18.72342525,  18.69316981,  18.66316914, ...,  18.66316914,\n",
               "           18.69316981,  18.72342525],\n",
               "         [ 18.7003418 ,  18.66953927,  18.63899611, ...,  18.63899611,\n",
               "           18.66953927,  18.7003418 ],\n",
               "         [ 18.6771234 ,  18.64577058,  18.61468177, ...,  18.61468177,\n",
               "           18.64577058,  18.6771234 ],\n",
               "         ...,\n",
               "         [ 18.6771234 ,  18.64577058,  18.61468177, ...,  18.61468177,\n",
               "           18.64577058,  18.6771234 ],\n",
               "         [ 18.7003418 ,  18.66953927,  18.63899611, ...,  18.63899611,\n",
               "           18.66953927,  18.7003418 ],\n",
               "         [ 18.72342525,  18.69316981,  18.66316914, ...,  18.66316914,\n",
               "           18.69316981,  18.72342525]],\n",
               "\n",
               "        [[ 37.44685051,  37.38633963,  37.32633829, ...,  37.32633829,\n",
               "           37.38633963,  37.44685051],\n",
               "         [ 37.40068359,  37.33907853,  37.27799223, ...,  37.27799223,\n",
               "           37.33907853,  37.40068359],\n",
               "         [ 37.35424679,  37.29154116,  37.22936355, ...,  37.22936355,\n",
               "           37.29154116,  37.35424679],\n",
               "         ...,\n",
               "         [ 37.35424679,  37.29154116,  37.22936355, ...,  37.22936355,\n",
               "           37.29154116,  37.35424679],\n",
               "         [ 37.40068359,  37.33907853,  37.27799223, ...,  37.27799223,\n",
               "           37.33907853,  37.40068359],\n",
               "         [ 37.44685051,  37.38633963,  37.32633829, ...,  37.32633829,\n",
               "           37.38633963,  37.44685051]],\n",
               "\n",
               "        [[ 56.17027576,  56.07950944,  55.98950743, ...,  55.98950743,\n",
               "           56.07950944,  56.17027576],\n",
               "         [ 56.10102539,  56.0086178 ,  55.91698834, ...,  55.91698834,\n",
               "           56.0086178 ,  56.10102539],\n",
               "         [ 56.03137019,  55.93731174,  55.84404532, ...,  55.84404532,\n",
               "           55.93731174,  56.03137019],\n",
               "         ...,\n",
               "         [ 56.03137019,  55.93731174,  55.84404532, ...,  55.84404532,\n",
               "           55.93731174,  56.03137019],\n",
               "         [ 56.10102539,  56.0086178 ,  55.91698834, ...,  55.91698834,\n",
               "           56.0086178 ,  56.10102539],\n",
               "         [ 56.17027576,  56.07950944,  55.98950743, ...,  55.98950743,\n",
               "           56.07950944,  56.17027576]],\n",
               "\n",
               "        ...,\n",
               "\n",
               "        [[898.7244122 , 897.2721511 , 895.83211891, ..., 895.83211891,\n",
               "          897.2721511 , 898.7244122 ],\n",
               "         [897.61640617, 896.13788479, 894.67181346, ..., 894.67181346,\n",
               "          896.13788479, 897.61640617],\n",
               "         [896.50192306, 894.99698789, 893.50472518, ..., 893.50472518,\n",
               "          894.99698789, 896.50192306],\n",
               "         ...,\n",
               "         [896.50192306, 894.99698789, 893.50472518, ..., 893.50472518,\n",
               "          894.99698789, 896.50192306],\n",
               "         [897.61640617, 896.13788479, 894.67181346, ..., 894.67181346,\n",
               "          896.13788479, 897.61640617],\n",
               "         [898.7244122 , 897.2721511 , 895.83211891, ..., 895.83211891,\n",
               "          897.2721511 , 898.7244122 ]],\n",
               "\n",
               "        [[917.44783745, 915.96532091, 914.49528806, ..., 914.49528806,\n",
               "          915.96532091, 917.44783745],\n",
               "         [916.31674797, 914.80742406, 913.31080957, ..., 913.31080957,\n",
               "          914.80742406, 916.31674797],\n",
               "         [915.17904646, 913.64275847, 912.11940696, ..., 912.11940696,\n",
               "          913.64275847, 915.17904646],\n",
               "         ...,\n",
               "         [915.17904646, 913.64275847, 912.11940696, ..., 912.11940696,\n",
               "          913.64275847, 915.17904646],\n",
               "         [916.31674797, 914.80742406, 913.31080957, ..., 913.31080957,\n",
               "          914.80742406, 916.31674797],\n",
               "         [917.44783745, 915.96532091, 914.49528806, ..., 914.49528806,\n",
               "          915.96532091, 917.44783745]],\n",
               "\n",
               "        [[936.17126271, 934.65849073, 933.1584572 , ..., 933.1584572 ,\n",
               "          934.65849073, 936.17126271],\n",
               "         [935.01708976, 933.47696332, 931.94980568, ..., 931.94980568,\n",
               "          933.47696333, 935.01708976],\n",
               "         [933.85616985, 932.28852905, 930.73408873, ..., 930.73408873,\n",
               "          932.28852905, 933.85616985],\n",
               "         ...,\n",
               "         [933.85616985, 932.28852905, 930.73408873, ..., 930.73408873,\n",
               "          932.28852905, 933.85616985],\n",
               "         [935.01708976, 933.47696332, 931.94980568, ..., 931.94980568,\n",
               "          933.47696333, 935.01708976],\n",
               "         [936.17126271, 934.65849073, 933.1584572 , ..., 933.1584572 ,\n",
               "          934.65849073, 936.17126271]]]])
    " ], "text/plain": [ "\n", "Dimensions: (lev: 50, time: 10, x: 600, x_b: 601, y: 400, y_b: 401)\n", "Coordinates:\n", " lon (y, x) float64 -119.8 -119.4 -119.0 -118.6 ... 119.0 119.4 119.8\n", " lat (y, x) float64 -59.85 -59.85 -59.85 -59.85 ... 59.85 59.85 59.85\n", " lon_b (y_b, x_b) float64 -120.0 -119.6 -119.2 ... 119.2 119.6 120.0\n", " lat_b (y_b, x_b) float64 -60.0 -60.0 -60.0 -60.0 ... 60.0 60.0 60.0 60.0\n", " * time (time) int64 1 2 3 4 5 6 7 8 9 10\n", " * lev (lev) int64 1 2 3 4 5 6 7 8 9 10 ... 41 42 43 44 45 46 47 48 49 50\n", "Dimensions without coordinates: x, x_b, y, y_b\n", "Data variables:\n", " data2D (y, x) float64 1.872 1.869 1.866 1.863 ... 1.863 1.866 1.869 1.872\n", " data4D (time, lev, y, x) float64 1.872 1.869 1.866 ... 933.2 934.7 936.2" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds_in.coords[\"time\"] = np.arange(1, 11)\n", "ds_in.coords[\"lev\"] = np.arange(1, 51)\n", "ds_in[\"data2D\"] = xe.data.wave_smooth(ds_in[\"lon\"], ds_in[\"lat\"])\n", "ds_in[\"data4D\"] = ds_in[\"time\"] * ds_in[\"lev\"] * ds_in[\"data2D\"]\n", "ds_in" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is almost 1GB!\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.96" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ds_in[\"data4D\"].nbytes / 1e9 # Byte -> GB" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data itself is not too interesting... We only focus on performance here.\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'extra dimensions to test broadcasting')" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
    " ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=[12, 3])\n", "\n", "plt.subplot(121)\n", "ds_in[\"data4D\"].isel(time=0, lev=0).plot()\n", "plt.title(\"2D field\")\n", "\n", "plt.subplot(122)\n", "ds_in[\"data4D\"].mean(dim=[\"x\", \"y\"]).plot()\n", "plt.title(\"extra dimensions to test broadcasting\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Build Regridder\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Making a bilinear regridder takes ~7s on my Mac! (`'conservative'` would take\n", "even longer. Try it yourself.)\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 4.19 s, sys: 228 ms, total: 4.41 s\n", "Wall time: 4.43 s\n" ] } ], "source": [ "%%time\n", "regridder = xe.Regridder(ds_in, ds_out, 'bilinear')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "xESMF Regridder \n", "Regridding algorithm: bilinear \n", "Input grid shape: (400, 600) \n", "Output grid shape: (300, 400) \n", "Output grid dimension name: ('y', 'x') \n", "Periodic in longitude? False" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regridder" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Apply regridding\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, applying the regridder to 1GB of data only takes ~0.5s\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 408 ms, sys: 205 ms, total: 613 ms\n", "Wall time: 612 ms\n" ] } ], "source": [ "%%time\n", "dr_out = regridder(ds_in['data4D'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Why applying regridding is so fast?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Most regridding algorithms (including all 5 algorithms in ESMF) are linear, i.e.\n", "the output data field is linearly dependent on the input data field. Any linear\n", "transform can be viewed as a matrix-vector multiplication $y = Ax$, where $A$ is\n", "a matrix containing **regridding weights**, and $x$, $y$ are input and output\n", "data fields flatten to 1D.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Computing the **weight matrix** $A$ is expensive, but $A$ **only depends on\n", "input and output grids**, not on input data. That means we can use the same $A$\n", "on different input fields $x$, as long as the grid structure is not changed.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An xESMF regridder has an attribute `weights`, i.e. the weight matrix.\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<120000x240000 sparse matrix of type ''\n", "\twith 480000 stored elements in COOrdinate format>" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regridder.weights" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is typically very sparse, because a single destination point will only\n", "receive contribution from a small number of source points.\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'output grid indices')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
    " ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.spy(regridder.weights)\n", "plt.xlabel(\"input grid indices\")\n", "plt.ylabel(\"output grid indices\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Retrieve regridder\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To avoid recomputing the same weights later, you can write the weights to disk\n", "and reload them later. First write the weights using the `to_netcdf` method. A\n", "default file name will be chosen if none is given.\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "bilinear_400x600_300x400.nc\n" ] } ], "source": [ "fn = regridder.to_netcdf()\n", "print(fn)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7.4M\tbilinear_400x600_300x400.nc\n" ] } ], "source": [ "%%bash\n", "du -sh bilinear_400x600_300x400.nc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When you open the notebook next time, simply set the `weights` argument to the\n", "path to the netCDF file. The weight file is typically pretty small (due to\n", "sparsity), so reading it is almost instantaneous.\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 33.7 ms, sys: 2.3 ms, total: 36 ms\n", "Wall time: 33.1 ms\n" ] } ], "source": [ "%%time\n", "regridder2 = xe.Regridder(ds_in, ds_out, 'bilinear', weights=fn)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The second-step, applying those weights to data, is just a matrix multiplication\n", "$y=Ax$. With highly-optimized sparse matrix multiplication library, it is\n", "blazingly fast.\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 739 ms, sys: 191 ms, total: 929 ms\n", "Wall time: 926 ms\n" ] } ], "source": [ "%%time\n", "dr_out2 = regridder2(ds_in['data4D'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The retrieved regridder gives the same result as the first regridder.\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "xr.testing.assert_identical(dr_out, dr_out2) # they are equal" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For even larger grids, you might spend several minutes computing the weights.\n", "But once they are computed, you don't have to do it again.\n" ] } ], "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.8.2" }, "toc": { "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "toc_cell": false, "toc_position": {}, "toc_section_display": "block", "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 2 }