Skip to content

Instantly share code, notes, and snippets.

@darothen
Last active June 14, 2018 14:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save darothen/d4de1d27e309a0f4ad33b6de31f5e21d to your computer and use it in GitHub Desktop.
Save darothen/d4de1d27e309a0f4ad33b6de31f5e21d to your computer and use it in GitHub Desktop.
Numba-powered 2D Laplacian on data wrapped in xarray
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A bit of an arbitrary example - but using Numba to calculate the laplacian on some arbitrary data contained in an xarray data structure. For convenience, I've adapted the [laplace2d sample code](https://github.com/ContinuumIO/numbapro-examples/tree/master/laplace2d), which just implements a simple iterative technique."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import xarray as xr\n",
"from numba import jit\n",
"import tqdm\n",
"\n",
"%matplotlib inline\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Set up a simple boundary condition problem"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x315cc6a90>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"n, m = 10000, 200\n",
"xs = np.linspace(-5*np.pi, 5*np.pi, n)\n",
"ys = np.linspace(-1, 1, m)\n",
"\n",
"yy, xx = np.meshgrid(ys, xs)\n",
"zs = np.zeros_like(xx)\n",
"\n",
"# Sinusoidal boundary forcing\n",
"zs[:, 0] = 10*np.cos(xs/2/np.pi)\n",
"zs[:, -1] = 10*np.sin(xs/2/np.pi)\n",
"\n",
"# Top-hat\n",
"# zs[n//4:3*n//4, m//4:3*m//4] = 100\n",
"\n",
"ds = xr.Dataset(\n",
" {'z': (('x', 'y'), zs)},\n",
" {'x': xs, 'y': ys}\n",
")\n",
"\n",
"ds.z.plot.imshow('x', 'y')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here's the implementation of the Jacobi iterations to solve the Laplacian equations (borrowed from [here](https://github.com/ContinuumIO/numbapro-examples/tree/master/laplace2d))."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"@jit\n",
"def jacobi_relax_core(A, Anew):\n",
" error = 0.0\n",
" n = A.shape[0]\n",
" m = A.shape[1]\n",
" for j in range(1, n - 1):\n",
" for i in range(1, m - 1):\n",
" Anew[j, i] = 0.25 * ( A[j, i + 1] + A[j, i - 1] \\\n",
" + A[j - 1, i] + A[j + 1, i])\n",
" error = max(error, abs(Anew[j, i] - A[j, i]))\n",
" return error\n",
"\n",
"def jacobi(data, tol=1e-6, iter_max=1000):\n",
" \n",
" data_new = np.zeros_like(data)\n",
" err = 1e4\n",
" \n",
" it = 0 \n",
" pbar = tqdm.tqdm(\n",
" desc=\"Jacobi iterations...\", ascii=True,\n",
" unit='iters', leave=True\n",
" )\n",
" with pbar:\n",
" while err > tol and it < iter_max:\n",
" err = jacobi_relax_core(data, data_new)\n",
" \n",
" # Swap the old / new arrays\n",
" tmp = data\n",
" data = data_new\n",
" data_new = tmp\n",
" \n",
" pbar.update(1)\n",
" pbar.set_postfix(err=\"{:.3g}\".format(err), refresh=True)\n",
" it += 1\n",
" \n",
" return data_new"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`Numba` isn't able to work directly with xarray data structures, but because these are just wrappers around NumPy arrays, we can apply them to those arrays directly:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Jacobi iterations...: 500iters [00:03, 142.56iters/s, err=1.82]\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.collections.QuadMesh at 0x32a1aeb00>"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"result = jacobi(ds.z.values, tol=1e-1, iter_max=500)\n",
"type(result)\n",
"plt.pcolormesh(result, cmap='RdBu_r')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"However, there's also some machinery inside xarray to help out with this application, specifically the [`apply_ufunc`](http://xarray.pydata.org/en/stable/generated/xarray.apply_ufunc.html#xarray.apply_ufunc) method (see [here](http://xarray.pydata.org/en/stable/computation.html) for some more discussion). When we have ufuncs that run on full arrays, we don't really have to use any of the auxiliary functioniality that helps figure out how to map your function to your data. The example in the documentation shows how to apply these functions over single domains; here, we actually can just run it striaght on our data:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Jacobi iterations...: 500iters [00:03, 158.89iters/s, err=1.82]\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x32a1826a0>"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"result = xr.apply_ufunc(jacobi, ds, kwargs=dict(tol=1e-1, iter_max=500))\n",
"type(result)\n",
"result.z.plot.imshow()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment