<Osejs version="3.2">
<Osejs.Description>
<Osejs.Description.Page>
<Type>HTML_EDITOR</Type>
<Name>Intro Page</Name>
<Active>true</Active>
<Visible>true</Visible>
<Content>
<![CDATA[
<html>
  <head>
    
  </head>
  <body>
    The original version of this program was written by Morten Brydensholt in 
    collaboration with J. Hasbun during the <a href="http://www.opensourcephysics.org/talks/osp_workshop/default.html">
OSP Summer 2003 workshop at Davidson College</a>. This version of the program 
    has most recently been modified by <a href="http://www.westga.edu/~jhasbun">
J. Hasbun</a><a href="http://www/westga.edu/~jhasbun">.</a> -Brownian Motion 
    (Robert Brown, 1828) refers to the motion developed by a particle supended 
    in a liquid. The random motion seen is due to random collisions suffered 
    by the suspended particle with the molecules in the liquid. The molecules 
    in the liquid move about in a random way and when they encounter the 
    suspended particle and collide, the suspended particle's momentum is 
    changed. -In this simulation, the suspended particle is colored red. Its 
    mass can be changed to see its effect. Basically, if the particle's mass 
    is large, the motion is less random because of it large momentum. But, as 
    the particle's mass decreases, the motion is susceptible to more random 
    changes than if the particle's mass is large. Such effect might play an 
    important role in nanotechnology issues. -The simulation starts with 
    random positions and velocities of the molecules as well as the particle. 
    The suspended particle is visible at all times, but the liquid's molecules 
    can only be seen if desired. Momentum is conserved by looking at 
    collisions due to particle pairs, such that during a pair collision, v1=( 
    2*m2*v2 + (m1-m2)*v1 )/(m1+m2), and v2=( 2*m1*v1 + (m2-m1)*v2 )/(m1+m1). 
    The motion is modeled by solving the differential equations dVx/dt=Fx/m, 
    and dVy/dt=Fy/m, with Fx, and Fy being the forces due to the walls. We let 
    these forces take a constant value when the particle enters the wall 
    region. For example, Fx=Fo if x &lt;= left wall and Fx=-Fo if x&gt;=right wall; 
    Fy=Fo if y&lt;=bottom wall, and Fy=-Fo if y&gt;= top wall position. Note, there 
    are times when the particles gain too much momentum and looks like they 
    want to get out of the box. In such case, one needs to reset the 
    simulation because the conservation of energy property is not stricktly 
    enforced thus far.
  </body>
</html>

]]>

</Content>
</Osejs.Description.Page>
</Osejs.Description>
<Osejs.Model>
<Osejs.Model.FramesPerSecond>25</Osejs.Model.FramesPerSecond>
<Osejs.Model.Autostart>false</Osejs.Model.Autostart>
<Osejs.Model.Variables>
<Osejs.Model.Variables.Page>
<Type>VARIABLE_EDITOR</Type>
<Name>Var Table</Name>
<Active>true</Active>
<Visible>true</Visible>
<Content>
<Variable>
<Name>n</Name>
<Value><![CDATA[15]]></Value>
<Type>int</Type>
<Dimension></Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>N</Name>
<Value><![CDATA[30]]></Value>
<Type>int</Type>
<Dimension></Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>m</Name>
<Value><![CDATA[1.0]]></Value>
<Type>double</Type>
<Dimension>[N]</Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>M</Name>
<Value><![CDATA[50.0]]></Value>
<Type>double</Type>
<Dimension></Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>d</Name>
<Value><![CDATA[0.5]]></Value>
<Type>double</Type>
<Dimension></Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>x</Name>
<Value><![CDATA[0.0]]></Value>
<Type>double</Type>
<Dimension>[N]</Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>y</Name>
<Value><![CDATA[0.0]]></Value>
<Type>double</Type>
<Dimension>[N]</Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>vy</Name>
<Value><![CDATA[0.0]]></Value>
<Type>double</Type>
<Dimension>[N]</Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>vx</Name>
<Value><![CDATA[0.0]]></Value>
<Type>double</Type>
<Dimension>[N]</Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>color</Name>
<Value><![CDATA[java.awt.Color.blue]]></Value>
<Type>Object</Type>
<Dimension>[N]</Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>t</Name>
<Value><![CDATA[0.0]]></Value>
<Type>double</Type>
<Dimension></Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>Lx</Name>
<Value><![CDATA[10.0]]></Value>
<Type>double</Type>
<Dimension></Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>Ly</Name>
<Value><![CDATA[10.0]]></Value>
<Type>double</Type>
<Dimension></Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>f</Name>
<Value><![CDATA[1000.0]]></Value>
<Type>double</Type>
<Dimension></Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>v0</Name>
<Value><![CDATA[5.0]]></Value>
<Type>double</Type>
<Dimension></Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>visible</Name>
<Value><![CDATA[]]></Value>
<Type>boolean</Type>
<Dimension>[N]</Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>x0</Name>
<Value><![CDATA[0.5*Lx]]></Value>
<Type>double</Type>
<Dimension></Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name>y0</Name>
<Value><![CDATA[0.5*Ly]]></Value>
<Type>double</Type>
<Dimension></Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>
<Variable>
<Name></Name>
<Value><![CDATA[]]></Value>
<Type>double</Type>
<Dimension></Dimension>
<Comment><![CDATA[]]></Comment>
</Variable>

</Content>
</Osejs.Model.Variables.Page>
</Osejs.Model.Variables>
<Osejs.Model.Initialization>
<Osejs.Model.Initialization.Page>
<Type>CODE_EDITOR</Type>
<Name>particles</Name>
<Active>true</Active>
<Visible>true</Visible>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
for (int i=0; i<n; i++){
  x[i]=Math.random()*Lx;
  y[i]=Math.random()*Ly;
  vx[i]=v0*(1.0-2.*Math.random());
  vy[i]=v0*(1.0-2.0*Math.random());
  int r = (int) (255*Math.random());
  int g = (int) (255*Math.random());
  int b = (int) (255*Math.random());
  color[i] = new java.awt.Color(r,g,b,128);
  visible[i]=false;
}
visible[0]=true;
color[0] = java.awt.Color.red;
m[0]=M;
x[0]=x0;
y[0]=y0;
visibleOff();
]]></Code>

</Content>
</Osejs.Model.Initialization.Page>
</Osejs.Model.Initialization>
<Osejs.Model.Evolution>
<Osejs.Model.Evolution.Page>
<Type>ODE_EDITOR</Type>
<Name>Evol Page</Name>
<Active>true</Active>
<Visible>true</Visible>
<Content>
<IndependentVariable>t</IndependentVariable>
<Increment>0.005</Increment>
<Rate state="x[i]">vx[i]</Rate>
<Rate state="y[i]">vy[i]</Rate>
<Rate state="vx[i]">Fx(i,x,y,vx,vy)/m[i]</Rate>
<Rate state="vy[i]">Fy(i,x,y,vx,vy)/m[i]</Rate>
<Rate state=""></Rate>
<Method>RungeKutta</Method>
<Tolerance></Tolerance>
<Comment><![CDATA[]]></Comment>

</Content>
</Osejs.Model.Evolution.Page>
<Osejs.Model.Evolution.Page>
<Type>CODE_EDITOR</Type>
<Name>Collisions</Name>
<Active>true</Active>
<Visible>true</Visible>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
for (int i=0; i<n; i++) {
for (int j=i; j<n; j++) {

if(i==j)continue;

double distance=Math.sqrt( (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]) );

if (distance<=d) { // Collision!
  double rx=(x[i]-x[j])/distance, ry=(y[i]-y[j])/distance; // Unit vector joining centers
  double sx=-ry, sy=rx; // Ortogonal vector to the previous one

  double vr1=(vx[i]*rx+vy[i]*ry), vs1=(vx[i]*sx+vy[i]*sy); // Projections for disk 1
  double vr2=(vx[j]*rx+vy[j]*ry), vs2=(vx[j]*sx+vy[j]*sy); // Projections for disk 2 
 
  double vr1d=( (2*m[j]*vr2) +( (m[i]-m[j])*vr1) )/(m[i]+m[j]); // New velocity for disk 1
  double vr2d=( (2*m[i]*vr1) + ( (m[j]-m[i])*vr2) )/(m[i]+m[j]); // New velocity for disk 2

  // Undo the projections
  vx[i]=vr1d*rx+vs1*sx;
  vy[i]=vr1d*ry+vs1*sy;
  vx[j]=vr2d*rx+vs2*sx;
  vy[j]=vr2d*ry+vs2*sy; 
}
}
}
x0=x[0];//used in the trace
y0=y[0];//used in the trace
m[0]=M;
]]></Code>

</Content>
</Osejs.Model.Evolution.Page>
</Osejs.Model.Evolution>
<Osejs.Model.Constraints>
</Osejs.Model.Constraints>
<Osejs.Model.Library>
<Osejs.Model.Library.Page>
<Type>LIBRARY_EDITOR</Type>
<Name>force</Name>
<Active>true</Active>
<Visible>true</Visible>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
public double Fx(int i, double x[], double y[], double vx[],double vy[]) {
  if (x[i]<=0+d/4 && (y[i]>=0+d/4 || y[i] <= Ly-d/4)) return f;
  if (x[i]>=Lx-d/4 && (y[i]>=0+d/4 || y[i] <= Ly-d/4)) return -f;
  if (y[i]<=0.0+d/4 && (x[i]>=0+d/4 || x[i] <= Lx-d/4)) return 0;
  if (y[i]>=Ly-d/4 && (x[i]>=0+d/4 || x[i] <= Lx-d/4)) return 0;
  return 0.0;
}
public double Fy(int i, double x[], double y[],double vx[],double vy[]) {
  if (x[i]<=0.0+d/4 && (y[i]>=0+d/4 || y[i] <= Ly-d/4)) return 0;
  if (x[i]>=Lx-d/4 && (y[i]>=0+d/4 || y[i] <= Ly-d/4)) return 0;
  if (y[i]<=0.0+d/4 && (x[i]>=0+d/4 || x[i] <= Lx-d/4)) return f;
  if (y[i]>=Ly-d/4 && (x[i]>=0+d/4 || x[i] <= Lx-d/4)) return -f;
  return 0.0;
}
]]></Code>

</Content>
</Osejs.Model.Library.Page>
<Osejs.Model.Library.Page>
<Type>LIBRARY_EDITOR</Type>
<Name>visible</Name>
<Active>true</Active>
<Visible>true</Visible>
<Content>
<Comment><![CDATA[]]></Comment>
<Code><![CDATA[
public void visibleOn () {
  for (int i=0; i<n; i++){
    visible[i]=true;
  }
}

public void visibleOff () {
  for (int i=1; i<n; i++){
    visible[i]=false;
  }
  visible[0]=true;
}
]]></Code>

</Content>
</Osejs.Model.Library.Page>
</Osejs.Model.Library>
</Osejs.Model>
<Osejs.View>
<Osejs.View.Creation>
<Osejs.View.Creation.Element>
<Expanded>true</Expanded>
<Type>Elements.Frame</Type>
<Property name="name">Frame</Property>
<Property name="_ejs_mainWindow">true</Property>
<Property name="title">Frame</Property>
<Property name="layout">border</Property>
<Property name="visible">true</Property>
<Property name="size">340,400</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Expanded>true</Expanded>
<Type>Elements.Panel</Type>
<Property name="name">buttonspanel</Property>
<Property name="parent">Frame</Property>
<Property name="position">south</Property>
<Property name="layout">border:0,0</Property>
<Property name="size">500,70</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Expanded>true</Expanded>
<Type>Elements.Panel</Type>
<Property name="name">Panel1</Property>
<Property name="parent">buttonspanel</Property>
<Property name="position">center</Property>
<Property name="layout">flow:left,0,0</Property>
<Property name="size">200,50</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.Button</Type>
<Property name="name">Play</Property>
<Property name="parent">Panel1</Property>
<Property name="position">center</Property>
<Property name="text">Play</Property>
<Property name="action">_play()</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.Button</Type>
<Property name="name">Pause</Property>
<Property name="parent">Panel1</Property>
<Property name="text">Pause</Property>
<Property name="action">_pause()</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.Button</Type>
<Property name="name">Initialize</Property>
<Property name="parent">Panel1</Property>
<Property name="text">Initialize</Property>
<Property name="action">_initialize()</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.Button</Type>
<Property name="name">reset</Property>
<Property name="parent">Panel1</Property>
<Property name="text">reset</Property>
<Property name="action">_reset()</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.CheckBox</Type>
<Property name="name">visible</Property>
<Property name="parent">Panel1</Property>
<Property name="text">visible</Property>
<Property name="selected">false</Property>
<Property name="actionon">visibleOn()</Property>
<Property name="actionoff">visibleOff()</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Expanded>true</Expanded>
<Type>Elements.Panel</Type>
<Property name="name">Panel2</Property>
<Property name="parent">buttonspanel</Property>
<Property name="position">south</Property>
<Property name="layout">grid:1,3,0,0</Property>
<Property name="size">200,40</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.Slider</Type>
<Property name="name">N</Property>
<Property name="parent">Panel2</Property>
<Property name="variable">n</Property>
<Property name="minimum">1</Property>
<Property name="maximum">N</Property>
<Property name="action">_initialize()</Property>
<Property name="format">n=0</Property>
<Property name="size">100,30</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.Slider</Type>
<Property name="name">v0</Property>
<Property name="parent">Panel2</Property>
<Property name="variable">v0</Property>
<Property name="minimum">0.0</Property>
<Property name="maximum">10.0</Property>
<Property name="action">_initialize()</Property>
<Property name="format">vO=#0.00</Property>
<Property name="size">100,30</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.Slider</Type>
<Property name="name">M</Property>
<Property name="parent">Panel2</Property>
<Property name="variable">M</Property>
<Property name="minimum">1.0</Property>
<Property name="maximum">100.0</Property>
<Property name="format">M=0.00</Property>
<Property name="size">100,30</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Expanded>true</Expanded>
<Type>Elements.Panel</Type>
<Property name="name">drawing</Property>
<Property name="parent">Frame</Property>
<Property name="position">north</Property>
<Property name="layout">border</Property>
<Property name="size">500,500</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Expanded>true</Expanded>
<Type>Elements.DrawingPanel</Type>
<Property name="name">DrawingPanel</Property>
<Property name="parent">drawing</Property>
<Property name="position">north</Property>
<Property name="autoscaleX">false</Property>
<Property name="autoscaleY">false</Property>
<Property name="minimumX">-5.0</Property>
<Property name="maximumX">Lx+5.0</Property>
<Property name="minimumY">-5.0</Property>
<Property name="maximumY">Ly+5.0</Property>
<Property name="size">500,320</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.Arrow</Type>
<Property name="name">wall_left</Property>
<Property name="parent">DrawingPanel</Property>
<Property name="x">0.0-0.5*d</Property>
<Property name="y">0.0-0.5*d</Property>
<Property name="sizex">0</Property>
<Property name="sizey">Ly+d</Property>
<Property name="style">SEGMENT</Property>
<Property name="color">lightGray</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.Arrow</Type>
<Property name="name">wall_top</Property>
<Property name="parent">DrawingPanel</Property>
<Property name="x">0.0-0.5*d</Property>
<Property name="y">Ly+0.5*d</Property>
<Property name="sizex">Lx+d</Property>
<Property name="sizey">0</Property>
<Property name="style">SEGMENT</Property>
<Property name="color">lightGray</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.Arrow</Type>
<Property name="name">wall_right</Property>
<Property name="parent">DrawingPanel</Property>
<Property name="x">Lx+0.5*d</Property>
<Property name="y">0.0-0.5*d</Property>
<Property name="sizex">0</Property>
<Property name="sizey">Ly+d</Property>
<Property name="style">SEGMENT</Property>
<Property name="color">lightGray</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.Arrow</Type>
<Property name="name">wall_bottom</Property>
<Property name="parent">DrawingPanel</Property>
<Property name="x">0.0-0.5*d</Property>
<Property name="y">0.0-0.5*d</Property>
<Property name="sizex">Lx+d</Property>
<Property name="sizey">0</Property>
<Property name="style">SEGMENT</Property>
<Property name="color">lightGray</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.ParticleSet</Type>
<Property name="name">ParticleSet</Property>
<Property name="parent">DrawingPanel</Property>
<Property name="elementnumber">n</Property>
<Property name="x">x</Property>
<Property name="y">y</Property>
<Property name="sizex">d</Property>
<Property name="sizey">d</Property>
<Property name="visible">visible</Property>
<Property name="style">FILLED_CIRCLE</Property>
<Property name="color">color</Property>
</Osejs.View.Creation.Element>
<Osejs.View.Creation.Element>
<Type>Elements.Trace</Type>
<Property name="name">Particle_Trace</Property>
<Property name="parent">DrawingPanel</Property>
<Property name="maxpoints">2000</Property>
<Property name="x">x0</Property>
<Property name="y">y0</Property>
<Property name="connected">true</Property>
<Property name="linecolor">0,64,128</Property>
<Property name="markershape">NO_MARKER</Property>
<Property name="visible">true</Property>
</Osejs.View.Creation.Element>
</Osejs.View.Creation>
</Osejs.View>
</Osejs>
