{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "$$ \\textbf{Coupled Points} \\\\ $$" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "require.undef(\"nbextensions/jquery-ui.custom.min\");" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "require.undef(\"nbextensions/glow.2.1.min\");" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "require.undef(\"nbextensions/glowcomm\");" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "require.undef(\"nbextensions/pako.min\");" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "require.undef(\"nbextensions/pako_deflate.min\");" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "require.undef(\"nbextensions/pako_inflate.min\");" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "require([\"nbextensions/glowcomm\"], function(){console.log(\"glowcomm loaded\");})" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from math import sqrt\n", "from vpython import *\n", "from matplotlib import pyplot\n", "from __future__ import division, print_function\n", "from ipywidgets import widgets\n", "from IPython.display import display\n", "from IPython.html import widgets\n", "\n", "def sub(e1,e2):\n", " return [e1[0]-e2[0],e1[1]-e2[1],e1[2]-e2[2]]\n", "def add(e1,e2):\n", " return [e1[0]+e2[0],e1[1]+e2[1],e1[2]+e2[2]]\n", "def sMul(a,e1):\n", " return ([a*e1[0],a*e1[1],a*e1[2]])\n", "def norm(e1):\n", " return sqrt(e1[0]**2+e1[1]**2+e1[2]**2)\n", "def unit(e1):\n", " try:\n", " return sMul(1.0/norm(e1),e1)\n", " except ZeroDivisionError:\n", " return [0,0,0]\n", "def fl(string,m=0):\n", " try:\n", " return float(string)\n", " except ValueError:\n", " if(m):\n", " return 1.0\n", " else:\n", " return 0.0\n", "def i(string): #prevent incorrect limits? on integers for fixed toggle and spring indexing\n", " try:\n", " return int(string)\n", " except ValueError:\n", " return 0\n", "def conVec(e1):\n", " vec=vector(0.0,0.0,0.0)\n", " vec.x=e1[0]\n", " vec.y=e1[1]\n", " vec.z=e1[2]\n", " return vec\n", "\n", "points=[]\n", "springs=[]\n", "DELTAt=0.001\n", "tMAX=100.0\n", "GRAVITY=0\n", "g=-9.81\n", "HELICES=1\n", "flag=0 #start 1, end -1, or 0 if not attached to spring" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ERROR! Session/line number was not unique in database. History logging moved to new session 100\n" ] } ], "source": [ "class point:\n", " def __init__(self,r0,v0=[0.0,0.0,0.0],m0=1.0,fixed=0):\n", " self.r=r0\n", " self.v=v0\n", " if m0==0.0:\n", " self.m=0.0001\n", " else:\n", " self.m=m0\n", " self.F=[0.0,0.0,0.0]\n", " self.FIXED=fixed\n", " if(self.FIXED):\n", " self.v=[0.0,0.0,0.0]\n", " def vUpdate(self):\n", " self.v=add(self.v,sMul(DELTAt/self.m,self.F))\n", " def rUpdate(self):\n", " self.r = add(self.r,add(sMul(DELTAt,self.v),sMul(0.5*(DELTAt**2)/self.m,self.F)))" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class spring: \n", " def length(self):\n", " return norm(sub(points[self.start].r,points[self.end].r))\n", " def force(self):\n", " return self.k*(self.L-self.L0)\n", " def __init__(self,point1,point2,l0,K):\n", " self.start=point1\n", " self.end=point2\n", " self.L0=l0\n", " self.L=self.length()\n", " self.k=K\n", " self.F=self.force()\n", " self.rs=unit(sub(points[self.end].r,points[self.start].r))\n", " self.re=unit(sub(points[self.start].r,points[self.end].r))\n", " def update(self):\n", " self.L=self.length()\n", " self.F=self.force()\n", " self.rs=unit(sub(points[self.end].r,points[self.start].r))\n", " self.re=unit(sub(points[self.start].r,points[self.end].r))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def updatePoints():\n", " for i in range(0,len(points)):\n", " points[i].F=[0.0,0.0,0.0]\n", " for j in range(0,len(springs)):\n", " if(springs[j].start==i):\n", " flag=1\n", " elif(springs[j].end==i):\n", " flag=-1\n", " else:\n", " flag=0\n", " if(points[i].FIXED):\n", " points[i].F=[0.0,0.0,0.0]\n", " else:\n", " if(flag==1):\n", " points[i].F=add(points[i].F,sMul(springs[j].F,springs[j].rs))\n", " elif(flag==-1):\n", " points[i].F=add(points[i].F,sMul(springs[j].F,springs[j].re))\n", " else:\n", " pass\n", " if (GRAVITY and (not points[i].FIXED)):\n", " points[i].F=add(points[i].F,sMul(g*points[i].m,[0,1,0]))\n", " points[i].vUpdate()\n", " points[i].rUpdate()\n", " \n", " for i in range(0,len(springs)):\n", " springs[i].update()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class vis3D:\n", " def __init__(self):\n", " self.BALL=[]\n", " self.scene = canvas()\n", " for i in range(0,len(points)):\n", " self.BALL.append(sphere(pos=conVec(points[i].r), radius=0.4, color=color.red))\n", " if HELICES:\n", " self.HELIX=[]\n", " for i in range(0,len(springs)):\n", " self.HELIX.append(helix(pos=conVec(points[springs[i].start].r),axis=conVec(sMul(springs[i].L,springs[i].rs)), radius=0.4, color=color.blue))\n", " def update(self):\n", " updatePoints()\n", " for i in range(0,len(points)):\n", " self.BALL[i].pos=conVec(points[i].r)\n", " if HELICES:\n", " for i in range(0,len(springs)):\n", " self.HELIX[i].pos=conVec(points[springs[i].start].r)\n", " self.HELIX[i].axis=conVec(sMul(springs[i].L,springs[i].rs))\n", " def run(self):\n", " t=0.0\n", " self.scene.background=color.white\n", " display(self.scene)\n", " while t" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "window.__context = { glowscript_container: $(\"#glowscript\").removeAttr(\"id\")}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "GUI=gui()\n", "GUI.display()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "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.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }