Skip to content

Instantly share code, notes, and snippets.

@LouisJenkinsCS
Last active August 31, 2021 20:35
Show Gist options
  • Select an option

  • Save LouisJenkinsCS/0e104f46a3dd3b3df3c4f21ee4714e5d to your computer and use it in GitHub Desktop.

Select an option

Save LouisJenkinsCS/0e104f46a3dd3b3df3c4f21ee4714e5d to your computer and use it in GitHub Desktop.
Scientific Computing Examples
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "3fdf98b3",
"metadata": {},
"source": [
"### 2D Jacobi Iteration as Stencil\n",
"\n",
"Index set `I` contains the possible indices for both dimensions\n",
"\n",
"Set of States `S` contains the possible values for cells in the array\n",
"\n",
"Initial State `S0` defines the initial state for each cell of the array (boundary conditions)\n",
"\n",
"Stencil `s` defines the neighbor for each point as offsets from the current cell\n",
"\n",
"Transition `T` defines, for each neighbor, the new state of the current cell\n",
"\n",
"Output - `Jacobi-Heat-Distribution.gif`"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "be18e9e0",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"I = range(0,100)\n",
"S = float\n",
"S0 = lambda x,y: ((0,1)[x>=len(I)],1)[x<0] # 0 if 0 <= x <= 100; 1 otherwise\n",
"s = [(1,0), (0,1), (-1,0), (0,-1)]\n",
"T = lambda t: sum(t) * 0.25\n",
"\n",
"import numpy as np\n",
"A = np.zeros((100,100))\n",
"B = np.zeros((100,100))\n",
"curr = A\n",
"other = B\n",
"\n",
"def getValue(idx):\n",
" x,y = idx\n",
" # In-Bounds - Return the value in the array\n",
" # Out-of-Bounds - Return boundary condition defined in S0\n",
" if x < len(I) and y < len(I) and x >= 0 and y >= 0:\n",
" return other[idx]\n",
" else:\n",
" return S0(*idx)\n",
" \n",
"for i in I:\n",
" for j in I:\n",
" A[i,j] = S0(i,j)\n",
" B[i,j] = A[i,j]\n",
" \n",
"import matplotlib.pyplot as plt\n",
"import imageio\n",
"import tempfile\n",
"\n",
"# Create an animated gif...\n",
"files = []\n",
"\n",
"with tempfile.TemporaryDirectory() as tmpdir: \n",
" for iterations in range(0,100):\n",
" for i in I:\n",
" for j in I:\n",
" n = [(x + i, y + j) for x,y in s]\n",
" other[i,j] = T(map(getValue, n))\n",
" \n",
" plt.imshow(curr, cmap='hot', interpolation='none')\n",
" tmpfile = tmpdir + '/' + str(iterations) + '.png'\n",
" plt.title(\"Iteration: \" + str(iterations + 1))\n",
" plt.savefig(tmpfile)\n",
" files.append(tmpfile)\n",
" \n",
" # Show every 25\n",
" if iterations == 0 or (iterations+1) % 25 == 0:\n",
" plt.show()\n",
" tmp = curr\n",
" curr = other\n",
" other = tmp\n",
" \n",
" with imageio.get_writer('Jacobi-Heat-Distribution.gif', mode='I') as writer:\n",
" for filename in files:\n",
" image = imageio.imread(filename)\n",
" writer.append_data(image)\n",
" \n",
" # If this is the last file, append it multiple times to simulate having a pause\n",
" if filename == files[-1]:\n",
" for i in range(0,10):\n",
" writer.append_data(image)\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.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
@LouisJenkinsCS
Copy link
Author

Note: Stencils are a no-go for persistent memory adoption. Only way it would be used is in Memory Mode (DRAM Cache, NVRAM memory), not App Direct Mode (allocate NVRAM as byte-addressable memory).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment