{ "cells": [ { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "## Molecular dynamics \n", "\n", "* *simple visualization* of live MD simulation visualisation \n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from IPython.display import clear_output" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "from MD_utils import lennardjones,simple_molecule_vis\n", "from scipy.constants import N_A\n", "epsilon=0.9959\n", "sigma=0.3405\n", "k_B = 0.008311\n", "M = 39.948" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### initial condition" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "plt = simple_molecule_vis(bs=1)\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "no plot object\n", "512\n" ] } ], "source": [ "import numpy as np\n", "# bs jest rozmiarem kostki w której znajdują się cząstki. \n", "nx = 8\n", "dx = sigma *1.2\n", "bs = dx*nx \n", "box = np.array([bs,bs,bs])\n", "try:\n", " plt.update_box(bs=bs)\n", " print \"no plot object\"\n", "except:\n", " pass\n", "\n", "Nparticles = nx**3\n", "print Nparticles\n", "\n", "U = np.zeros((3,Nparticles))\n", "l = 0\n", "for i in range(nx):\n", " for j in range(nx):\n", " for k in range(nx):\n", " U[:,l] = (dx*i-dx*(nx/2-0.50),dx*j-dx*(nx/2-0.5),dx*k-dx*(nx/2-0.5))\n", " l+=1\n", "V = np.zeros_like(U)\n", "plt.pkts.points_colors = 0xff0000*np.ones(Nparticles)\n", "plt.pkts.points_positions = U.T.copy()\n", "plt.pkts.point_size = 3\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 4.55 ms, sys: 112 µs, total: 4.67 ms\n", "Wall time: 4.58 ms\n" ] } ], "source": [ "box = np.array([bs,bs,bs])\n", "%time Epot, F, Vir = lennardjones(U, box,sigma = 0.3405, epsilon=0.9959)\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "V = 0.1*(np.random.randn(3,Nparticles)-0.5)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "plt.plot.display()\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1510 -2352.57522965 585.612548004 -1766.96268165 T= 92.1076403198 P= -199.355972869\n", "Vir: -22064.7173548\n", "bs: 3.2688\n", "CPU times: user 6.55 s, sys: 270 ms, total: 6.82 s\n", "Wall time: 6.65 s\n" ] } ], "source": [ "%%time\n", "# Start simulation\n", "\n", "import time \n", "n_steps = 1520\n", "dt = 0.005\n", "N = Nparticles\n", "\n", "box = np.array([bs,bs,bs])\n", "plt.update_box(bs=bs)\n", "\n", "(epot,F,Vir) = lennardjones(U,box,sigma = 0.3405, epsilon=0.9959)\n", "traj = []\n", "for i in range(n_steps):\n", " U += V * dt + 0.5 * F/M * dt * dt\n", " F0 = F[:]\n", "\n", " (epot, F, Vir) = lennardjones(U, box,sigma = 0.3405, epsilon=0.9959)\n", " \n", " V += 0.5 * (F + F0)/M * dt\n", " U -= bs*np.rint(U/bs)\n", " \n", " traj.append(U[:,233].copy())\n", " \n", " if i%10==0:\n", " #time.sleep(0.1)\n", " T = M*np.sum(V**2)/(k_B*(3*N-6)) \n", " P = 1/bs**3*( N*k_B*T + 1/3.*Vir )\n", " Ek = 0.5*M*np.sum(V**2)\n", " plt.pkts.points_positions = U.T.copy()\n", " plt.pkts.points_colors = (np.sum((V**2),axis=0)/10.0* 0xffffff).astype(np.int64)\n", " plt.update_box(bs=bs)\n", " clear_output(wait=True)\n", " \n", " print i,epot,Ek,epot+Ek,\"T=\",T,\"P=\",P\n", " print \"Vir:\",Vir\n", " print \"bs:\",bs\n", " \n", "traj = np.array(traj)\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The trajectory of a single atom " ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from k3d import K3D" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [], "source": [ "plt_traj = K3D.points(traj.copy(),color=0xff0000, point_size=1.2)\n", "plt.plot += plt_traj" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "plt_traj.point_size = 3\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.11" } }, "nbformat": 4, "nbformat_minor": 0 }