Skip to content

Instantly share code, notes, and snippets.

@jobovy
Created July 29, 2020 05:12
Show Gist options
  • Save jobovy/d79f9c46b6c0526ad840e09897419cb3 to your computer and use it in GitHub Desktop.
Save jobovy/d79f9c46b6c0526ad840e09897419cb3 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,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"source": [
"import numpy\n",
"%pylab inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# A very simple example of a direct $N$-body code\n",
"\n",
"This notebook holds a *very simple* direct $N$-body code written in Python/numpy."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Direct summation $N$-body forces\n",
"\n",
"Direct summation is straightforward to implement using ``numpy`` (see http://astro.utoronto.ca/~bovy/AST1420/notes-2019/chapters/09.-N-body-Modeling.html#Direct-summation), for example, the potential:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def pot_directsum(pos):\n",
" \"\"\"\n",
" NAME: pot_directsum\n",
" PURPOSE: compute the gravitational potential for a set\n",
" of particles using direct summation\n",
" (assumes Gm=1 for all particles)\n",
" INPUT: pos - positions of the particles [N,2]\n",
" OUTPUT: potential at the location of each particle (array)\"\"\"\n",
" invdist= 1./numpy.sqrt(numpy.sum((pos[:,:,None]-pos[:,:,None].T)**2.,\n",
" axis=1))\n",
" numpy.fill_diagonal(invdist,0.)\n",
" return -numpy.sum(invdist,axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"An example:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"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"
}
],
"source": [
"def sample_yx3(npos):\n",
" numpy.random.seed(1) # Make sure we get a reproducible set\n",
" pos= numpy.random.random((npos,2))*2.-1.\n",
" pos[:,1]*= 0.2\n",
" pos[:,1]+= pos[:,0]**3\n",
" return pos\n",
"npos= 60\n",
"pindx= 10 # index of point to focus on\n",
"pos= sample_yx3(npos)\n",
"figsize(6,4)\n",
"plot(pos[:,0],pos[:,1],'o',ms=5.,zorder=2)\n",
"plot(pos[pindx,0],pos[pindx,1],'d',ms=8.,zorder=2)\n",
"xlabel(r'$x$'); ylabel(r'$y$');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The potential at a point:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/bovy/miniconda3/envs/py37/lib/python3.7/site-packages/ipykernel_launcher.py:10: RuntimeWarning: divide by zero encountered in true_divide\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
},
{
"data": {
"text/plain": [
"-106.9207717541258"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pot_directsum(pos)[pindx]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"An example with more points:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"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"
}
],
"source": [
"npos= 5000\n",
"pos= sample_yx3(npos)\n",
"plot(pos[:,0],pos[:,1],'o',ms=5.,zorder=2)\n",
"plot(pos[pindx,0],pos[pindx,1],'d',ms=8.,zorder=2)\n",
"xlabel(r'$x$'); ylabel(r'$y$');"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/bovy/miniconda3/envs/py37/lib/python3.7/site-packages/ipykernel_launcher.py:10: RuntimeWarning: divide by zero encountered in true_divide\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.54 s ± 73 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"pot_directsum(pos)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The force is"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def force_directsum(pos):\n",
" \"\"\"\n",
" NAME: force_directsum\n",
" PURPOSE: compute the gravitational force for a set\n",
" of particles using direct summation\n",
" (assumes Gm=1 for all particles)\n",
" INPUT: pos - positions of the particles [N,dim]\n",
" OUTPUT: force at the location of each particle (array)\"\"\"\n",
" delta= pos[:,:,None]-pos[:,:,None].T\n",
" invdist= 1./numpy.sqrt(numpy.sum(delta**2.,axis=1))\n",
" numpy.fill_diagonal(invdist,0.)\n",
" return -numpy.sum(delta.swapaxes(1,2)*invdist[:,:,None]**3.,axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Example:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"npos= 60\n",
"pindx= 10 # index of point to focus on\n",
"pos= sample_yx3(npos)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/bovy/miniconda3/envs/py37/lib/python3.7/site-packages/ipykernel_launcher.py:10: RuntimeWarning: divide by zero encountered in true_divide\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
},
{
"data": {
"text/plain": [
"array([ 51.45465181, -49.09864714])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"force_directsum(pos)[pindx]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Quick check that the force points where it should point:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/bovy/miniconda3/envs/py37/lib/python3.7/site-packages/ipykernel_launcher.py:10: RuntimeWarning: divide by zero encountered in true_divide\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
},
{
"data": {
"text/plain": [
"array([[ 0.35355339, 0.35355339],\n",
" [-0.35355339, -0.35355339]])"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"force_directsum(numpy.array([[1,1],[2,2]]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Leapfrog ODE solver\n",
"\n",
"Next, we implement a simple leapfrog ODE solver, so we can solve the equations of motion:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def leapfrog(force,qo,po,t):\n",
" \"\"\"\n",
" NAME: leapfrog\n",
" PURPOSE: solve a force ODE using leapfrog!\n",
" INPUT: \n",
" force - function that gives the force as a function of position q\n",
" qo - initial position [nparticles,dim]\n",
" po - initial momentum [nparticles,dim]\n",
" t - tuple with (to,tend,ntimes)\n",
" OUTPUT: orbits as [ntimes,hstack of q(t),p(t)]\n",
" \"\"\"\n",
" to,tend,nt= t\n",
" dt= (tend-to)/(nt-1)\n",
" out= numpy.zeros((nt,len(qo)*2))\n",
" out[0,:]= numpy.hstack((qo,po))\n",
" for ii in range(1,nt):\n",
" qo+= dt/2.*po\n",
" po+= dt*force(qo)\n",
" qo+= dt/2.*po\n",
" out[ii,:len(qo)]= qo\n",
" out[ii,len(qo):]= po\n",
" return out"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2-body problem\n",
"\n",
"Let's check that our code solves the two-body problem correctly."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### A circular orbit\n",
"\n",
"This should give a circular orbit, we integrate for half a period to show this:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"qo, po= numpy.array([[0.25,0],[-0.25,0.]]), numpy.array([[0.,1.],[0.,-1.]])"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/bovy/miniconda3/envs/py37/lib/python3.7/site-packages/ipykernel_launcher.py:10: RuntimeWarning: divide by zero encountered in true_divide\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
}
],
"source": [
"orbit= leapfrog(lambda q: force_directsum(q.reshape((2,2))).flatten(),\n",
" qo.flatten(),po.flatten(),(0.,numpy.pi/4.,1001))"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"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"
}
],
"source": [
"plot(orbit[:,0],orbit[:,1])\n",
"plot(orbit[:,2],orbit[:,3])\n",
"gca().set_aspect('equal')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### A circular orbit starting somewhere else on the circle (just checking!)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"qo, po= numpy.array([[0.25*numpy.cos(numpy.pi/6.),0.25*numpy.sin(numpy.pi/6.)],\n",
" [0.25*numpy.cos(7.*numpy.pi/6.),0.25*numpy.sin(7.*numpy.pi/6.)]]), \\\n",
" numpy.array([[1.*numpy.sin(numpy.pi/6.),-1.*numpy.cos(numpy.pi/6.)],\n",
" [-1.*numpy.sin(numpy.pi/6.),1.*numpy.cos(numpy.pi/6.)]])"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/bovy/miniconda3/envs/py37/lib/python3.7/site-packages/ipykernel_launcher.py:10: RuntimeWarning: divide by zero encountered in true_divide\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
}
],
"source": [
"orbit= leapfrog(lambda q: force_directsum(q.reshape((2,2))).flatten(),\n",
" qo.flatten(),po.flatten(),(0.,numpy.pi/4.,1001))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"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"
}
],
"source": [
"plot(orbit[:,0],orbit[:,1])\n",
"plot(orbit[:,2],orbit[:,3])\n",
"gca().set_aspect('equal')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### An eccentric orbit"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"qo, po= numpy.array([[0.5,0],[-0.5,0.]]), numpy.array([[0.,0.25],[0.,-0.25]])"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/bovy/miniconda3/envs/py37/lib/python3.7/site-packages/ipykernel_launcher.py:10: RuntimeWarning: divide by zero encountered in true_divide\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
}
],
"source": [
"orbit= leapfrog(lambda q: force_directsum(q.reshape((2,2))).flatten(),\n",
" qo.flatten(),po.flatten(),(0.,2.*numpy.pi,1001))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"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"
}
],
"source": [
"plot(orbit[:,0],orbit[:,1])\n",
"plot(orbit[:,2],orbit[:,3])\n",
"gca().set_aspect('equal')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Oops, this must be wrong, because we know the orbits should be closed ellipses! Must be the timestep, so use more timesteps"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/bovy/miniconda3/envs/py37/lib/python3.7/site-packages/ipykernel_launcher.py:10: RuntimeWarning: divide by zero encountered in true_divide\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
}
],
"source": [
"orbit= leapfrog(lambda q: force_directsum(q.reshape((2,2))).flatten(),\n",
" qo.flatten(),po.flatten(),(0.,2.*numpy.pi,10001))"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"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"
}
],
"source": [
"plot(orbit[:,0],orbit[:,1])\n",
"plot(orbit[:,2],orbit[:,3])\n",
"gca().set_aspect('equal')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"All good!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### An eccentric orbit with non-zero momentum"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"qo, po= numpy.array([[0.5,0],[-0.5,0.]]), numpy.array([[0.,0.],[0.,0.5]])"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/bovy/miniconda3/envs/py37/lib/python3.7/site-packages/ipykernel_launcher.py:10: RuntimeWarning: divide by zero encountered in true_divide\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
}
],
"source": [
"orbit= leapfrog(lambda q: force_directsum(q.reshape((2,2))).flatten(),\n",
" qo.flatten(),po.flatten(),(0.,2.*numpy.pi,10001))"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7ff4a947e6a0>]"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 288x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"figsize(4,10)\n",
"plot(orbit[:,0],orbit[:,1])\n",
"plot(orbit[:,2],orbit[:,3])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Orbit drifts up as expected, we can subtract the motion of the center of mass"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"figsize(6,6)\n",
"plot(orbit[:,0],orbit[:,1]-0.25*numpy.linspace(0.,2.*numpy.pi,10001))\n",
"plot(orbit[:,2],orbit[:,3]-0.25*numpy.linspace(0.,2.*numpy.pi,10001))\n",
"gca().set_aspect('equal')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Back to closed orbits!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### A circular orbit, but in 3D"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"qo, po= numpy.array([[0.25,0,0],[-0.25,0.,0]]), numpy.array([[0.,1.,0],[0.,-1.,0]])"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/bovy/miniconda3/envs/py37/lib/python3.7/site-packages/ipykernel_launcher.py:10: RuntimeWarning: divide by zero encountered in true_divide\n",
" # Remove the CWD from sys.path while we load stuff.\n"
]
}
],
"source": [
"orbit= leapfrog(lambda q: force_directsum(q.reshape((2,3))).flatten(),\n",
" qo.flatten(),po.flatten(),(0.,numpy.pi/4.,1001))"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plot(orbit[:,0],orbit[:,1])\n",
"plot(orbit[:,3],orbit[:,4])\n",
"gca().set_aspect('equal')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Glad that works!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.7.3"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment