proj home

Files   Classes   Functions   Hierarchy  

integration< D, F > Class Template Reference

#include <integration.h>

Collaboration diagram for integration< D, F >:

List of all members.

Public Member Functions

void LJcalc ()
 integration ()
void reset (int argc, char **argv)
void draw ()
void bruteforce ()
void bruteforce (uintc *p, uintc sz)
void togglestartstop ()
void step ()
void steplarge ()
void uniformgridtest ()

Public Attributes

long stepcount
gltextmsg stepcountmsg
uint numParticles
bool uniform
bool printstate
float h
bool displayEk
bool LJ
 Lennard-Jones potential is enabled with brute force only.
double LJpsi
double LJsigma
double histlow
double histhigh
uint histn
particlesampler sampler
uint samplerstate
particlepi
uintpu
framerate fr
bool run


Detailed Description

template<typename D, typename F>
class integration< D, F >

Definition at line 21 of file integration.h.


Constructor & Destructor Documentation

template<typename D , typename F >
integration< D, F >::integration (  )  [inline]

Definition at line 489 of file integration.h.

References integration< D, F >::displayEk, integration< D, F >::h, integration< D, F >::LJ, integration< D, F >::LJpsi, integration< D, F >::LJsigma, integration< D, F >::numParticles, integration< D, F >::pi, integration< D, F >::printstate, integration< D, F >::run, and integration< D, F >::uniform.

00490   : pd(gluNewQuadric(),10,3),
00491   distribution 
00492   (
00493     0.02,  //radius
00494     5.0,  //vmax
00495     boxcollision(0.0,10.0,0.0,10.0)  //box dimensions
00496   ),
00497   fn
00498   (
00499     distribution.box
00500   ),
00501   stepcount(0),
00502   stepcountmsg("0",0.5,-0.8,0.0,0.0,1.0),
00503   histlow(0.0),
00504   histhigh(7.0),
00505   histn(81),
00506   sampler
00507   (
00508     (uintc &)samplerstate,
00509     (uintc)20,     // Sample every x steps all particle speeds
00510     (uintc)5,      // Inner loop: sample every x2 steps
00511     histogram<double>
00512     (
00513       histlow,   // Lowest speed
00514       histhigh, // Highest speed
00515       histn      // Intervals
00516     ),
00517     string("data.txt"),
00518     (particle const * &)pi,
00519     (uintc & )numParticles
00520   )
00521 /*
00522   (
00523     samplerstate,
00524     (uintc)20,     // Sample every x steps all particle speeds
00525     (uintc)5,      // Inner loop: sample every x2 steps
00526     histogram<double>
00527     (
00528       histlow,   // Lowest speed
00529       histhigh, // Highest speed
00530       histn      // Intervals
00531     ),
00532     string("data.txt"),
00533     (particle const *)pi,
00534     numParticles
00535   )
00536 */
00537 {
00538   uniform=false;
00539   printstate=false;
00540   pi=0;
00541   numParticles=10;
00542   h=0.01;
00543   //zpr=true;
00544   run=false;
00545   displayEk=false;
00546   LJ=false;
00547   LJsigma=1.0;
00548   LJpsi=1.0;
00549 }


Member Function Documentation

template<typename D , typename F >
void integration< D, F >::bruteforce ( uintc p,
uintc  sz 
) [inline]

Definition at line 308 of file integration.h.

References boxcollision::walls().

00312 {
00313   boxcollision const & box(distribution.box);
00314 
00315 //cout << SHOW(sz) "  ";
00316 //print(p,p+sz);
00317 
00318 
00319   uint a;
00320   uint b;
00321   for (uint i=0; i+1<sz; ++i)
00322   {
00323     for (uint k=i+1; k<sz; ++k)
00324     {
00325       a = x[i];
00326       b = x[k];
00327 
00328       if (pi[a].isIntersecting(pi[b]))
00329       {
00330         pi[a].step(-h);
00331         pi[b].step(-h);
00332 
00333         pi[a].collisionDynamics(pi[b]);
00334 
00335         pi[a].step(h);
00336         pi[b].step(h);
00337 
00338         box.walls(pi[a],h);
00339         box.walls(pi[b],h);
00340       }
00341     }
00342   }
00343 }

template<typename D , typename F >
void integration< D, F >::bruteforce (  )  [inline]

Definition at line 347 of file integration.h.

References particle::collisionDynamics(), integration< D, F >::h, integration< D, F >::LJ, integration< D, F >::LJcalc(), integration< D, F >::numParticles, integration< D, F >::pi, particle::step(), and boxcollision::walls().

Referenced by integration< D, F >::step(), test02(), and integration< D, F >::uniformgridtest().

00348 {
00349   boxcollision const & box(distribution.box);
00350   for (uint i=0; i<numParticles; ++i)
00351   {
00352     pi[i].step(h);
00353     box.walls(pi[i],h);
00354   }
00355 
00356   if (LJ)
00357     LJcalc();
00358   
00359   for (uint i=0; i+1<numParticles; ++i)
00360   {
00361     for (uint k=i+1; k<numParticles; ++k)
00362     {
00363 
00364       if (pi[i].isIntersecting(pi[k]))
00365       {
00366         pi[i].step(-h);
00367         pi[k].step(-h);
00368 
00369         pi[i].collisionDynamics(pi[k]);
00370 
00371         pi[i].step(h);
00372         pi[k].step(h);
00373 
00374 if (!LJ)
00375 {
00376         box.walls(pi[i],h);
00377         box.walls(pi[k],h);
00378 }
00379       }
00380     }
00381   }
00382 
00383     
00384 
00385 #ifdef DEBUG_PART
00386 if (false)
00387 {
00388 cout << endl;
00389 for (uint i=0; i<numParticles; ++i)
00390   cout << pi[i] << endl;
00391 }
00392 #endif
00393 
00394 }

template<typename D , typename F >
void integration< D, F >::draw (  )  [inline]

Definition at line 398 of file integration.h.

References gltextmsg::display(), framerate< period >::display(), integration< D, F >::displayEk, particledisp::draw(), integration< D, F >::fr, integration< D, F >::numParticles, integration< D, F >::pi, integration< D, F >::stepcountmsg, and particle::vel.

Referenced by display().

00399 {
00400   // Display the particles
00401 
00402   glPushAttrib(GL_CURRENT_BIT);
00403   glPushAttrib(GL_LIGHTING_BIT);
00404   glColor3f(1.0,0.0,0.0);
00405   pd.draw(pi[0]);
00406   glPopAttrib();
00407   glPopAttrib();
00408 
00409   for (uint i=1; i+1<numParticles; ++i)
00410   {
00411     if ((i%10)!=0)
00412       pd.draw(pi[i]);
00413     else
00414     {
00415       glPushAttrib(GL_CURRENT_BIT);
00416       glPushAttrib(GL_LIGHTING_BIT);
00417       glColor3f(0.1,0.2,1.0);
00418       pd.draw(pi[i]);
00419       glPopAttrib();
00420       glPopAttrib();
00421     }
00422   }
00423 
00424   glPushAttrib(GL_CURRENT_BIT);
00425   glPushAttrib(GL_LIGHTING_BIT);
00426   glColor3f(0.0,1.0,0.0);
00427   pd.draw(pi[numParticles-1]);
00428   glPopAttrib();
00429   glPopAttrib();
00430 
00431 
00432   // Verify energy in system.
00433   if (displayEk)
00434   {
00435 
00436     static int ekcounter;
00437     ++ekcounter;
00438     if ((ekcounter%10)==0)
00439     {
00440 
00441       double sum(0.0);
00442       double energy;
00443       for (uint i=0; i<numParticles; ++i)
00444       {
00445         particle const & p(pi[i]);
00446         energy = p.vel[0] * p.vel[0] + p.vel[1] * p.vel[1];
00447      
00448         sum += energy;
00449       }
00450       cout << "Ek*2/m=" << sum << endl;
00451     }
00452   }
00453 
00454   // Draw Box
00455   glPushAttrib(GL_CURRENT_BIT);
00456   glPushAttrib(GL_LIGHTING_BIT);
00457   glDisable(GL_LIGHTING);
00458   glColor3f(.6,.03,.03);
00459   glBegin(GL_LINES);
00460 
00461   doublec x0 = distribution.box.x0;
00462   doublec x1 = distribution.box.x1;
00463   doublec y0 = distribution.box.y0;
00464   doublec y1 = distribution.box.y1;
00465 
00466   glVertex3f(x0,y0,0.0);
00467   glVertex3f(x1,y0,0.0);
00468   glVertex3f(x1,y0,0.0);
00469   glVertex3f(x1,y1,0.0);
00470   glVertex3f(x1,y1,0.0);
00471   glVertex3f(x0,y1,0.0);
00472   glVertex3f(x0,y1,0.0);
00473   glVertex3f(x0,y0,0.0);
00474 
00475   glEnd();
00476   glPopAttrib();
00477   glPopAttrib();
00478 
00479   // Update Counters
00480 
00481   fr.display();
00482   stepcountmsg.display();
00483 }

template<typename D , typename F >
void integration< D, F >::LJcalc (  )  [inline]

Definition at line 244 of file integration.h.

References particle::acc, integration< D, F >::LJpsi, integration< D, F >::LJsigma, integration< D, F >::numParticles, integration< D, F >::pi, particle::pos, r, and SHOW.

Referenced by integration< D, F >::bruteforce().

00245 {
00246   double rx;
00247   double ry;
00248 
00249   double r;
00250   double z;
00251   double f;
00252   double fx;
00253   double fy;
00254 
00255   for (uint i=0; i<numParticles; ++i)
00256     pi[i].acczero();
00257 
00258 //cout << "Before" << endl;
00259 //  for (uint i=0; i<numParticles; ++i)
00260 //    cout << SHOW(pi[i]) << endl;
00261 //cout << endl;
00262 
00263   for (uint i=0; i+1<numParticles; ++i)
00264   {
00265     for (uint k=i+1; k<numParticles; ++k)
00266     {
00267       rx = pi[i].pos[0] - pi[k].pos[0];
00268       ry = pi[i].pos[1] - pi[k].pos[1];
00269     
00270       r = sqrt(rx*rx+ry*ry);
00271 //cout << SHOW(r) << " ";
00272       z = LJsigma/r;
00273 //cout << SHOW(z) << " ";
00274       z *= z;
00275       z *= z*z;
00276 
00277       // Force divided by r.
00278       f = LJpsi*24.0/(r*r)*z*(2.0*z-1.0);
00279 
00280 if (abs(f)>10)
00281 cout << SHOW(f) << endl;
00282 
00283 //cout << SHOW(f) << " ";
00284 
00285       fx = f*rx/r;
00286       fy = f*ry/r;
00287 
00288 //cout << SHOW(fx) << " ";
00289 //cout << SHOW(fy) << " ";
00290 //cout << endl;
00291 
00292       pi[i].acc[0] -= fx;
00293       pi[i].acc[1] -= fy;
00294 
00295       pi[k].acc[0] += fx;
00296       pi[k].acc[1] += fy;
00297     }
00298 
00299   }
00300 
00301 //  for (uint i=0; i<numParticles; ++i)
00302 //    cout << SHOW(pi[i]) << endl;
00303 
00304 }

template<typename D , typename F >
void integration< D, F >::reset ( int  argc,
char **  argv 
) [inline]

Definition at line 553 of file integration.h.

References integration< D, F >::displayEk, commandline::enablehelp(), integration< D, F >::h, integration< D, F >::histhigh, integration< D, F >::histlow, integration< D, F >::histn, integration< D, F >::LJ, integration< D, F >::LJpsi, integration< D, F >::LJsigma, commandline::mapvar(), integration< D, F >::numParticles, integration< D, F >::pi, integration< D, F >::printstate, integration< D, F >::pu, cell::reset(), integration< D, F >::sampler, integration< D, F >::samplerstate, particlesampler::set(), and integration< D, F >::uniform.

Referenced by test01(), and test02().

00554 {
00555   commandline c(argc,argv);
00556   c.mapvar(numParticles,"numParticles");
00557   if(pi!=0)
00558     delete[] pi;
00559   fn.pi = pi = new particle[numParticles];
00560 
00561   C.reset(numParticles);
00562 
00563 
00564 // Test Code
00565 pu = new uint [numParticles];
00566 for (uint i=0; i<numParticles; ++i)
00567   pu[i]=i;
00568 
00569   c.mapvar(uniform,"uniform");
00570   c.mapvar(distribution.vmax,"vmax");
00571   c.mapvar(distribution.radius,"radius");
00572   c.mapvar(h,"h");
00573   c.mapvar(printstate,"printstate");
00574 
00575 // <TODO> put this option back in.
00576 //  c.mapvar(zpr,"zpr");
00577 //  if (zpr)
00578 //    zprInit();
00579 
00580   c.mapvar(distribution.box.x0,"x0");
00581   c.mapvar(distribution.box.x1,"x1");
00582   c.mapvar(distribution.box.y0,"y0");
00583   c.mapvar(distribution.box.y1,"y1");
00584 
00585   c.mapvar(displayEk,"displayEk");
00586 
00587   c.mapvar(samplerstate,"samplerstate");
00588 
00589   c.mapvar(LJpsi,"LJpsi");
00590   c.mapvar(LJsigma,"LJsigma");
00591   c.mapvar(LJ,"LJ");
00592   if (LJ)
00593     uniform=false;
00594 
00595   c.mapvar(histlow,"histlow");
00596   c.mapvar(histhigh,"histhigh");
00597   c.mapvar(histn,"histn");
00598   
00599   sampler.set(histogram<double>(histlow,histhigh,histn));
00600 
00601   c.enablehelp(cout);
00602 
00603   fn.reset();
00604 
00605   // Initial conditions: no intersecting particles.
00606   for (uint i=0; i<numParticles; ++i)
00607   {
00608     distribution.eval(pi[i]);
00609     bool flagnoint(true);
00610     for (uint k=0; (k<i)&&flagnoint; ++k)
00611     {
00612       if( pi[i].isIntersecting( pi[k] ) )
00613       {
00614         flagnoint=false;
00615         --i;
00616       }
00617     }
00618   } 
00619 
00620 }

template<typename D, typename F>
void integration< D, F >::step (  )  [inline]

template<typename D , typename F >
void integration< D, F >::steplarge (  )  [inline]

Definition at line 227 of file integration.h.

References integration< D, F >::step().

Referenced by keyboard().

00228 {
00229   for (uint i=0; i<100; ++i)
00230     step();
00231 }

template<typename D , typename F >
void integration< D, F >::togglestartstop (  )  [inline]

Definition at line 235 of file integration.h.

References integration< D, F >::run.

Referenced by keyboard().

00236 {
00237   if (run)
00238     run=false;
00239   else
00240     run=true;
00241 }

template<typename D , typename F >
void integration< D, F >::uniformgridtest (  )  [inline]

Definition at line 124 of file integration.h.

References integration< D, F >::bruteforce(), cell::eval(), cell::getsurroundingparticles(), integration< D, F >::h, integration< D, F >::numParticles, integration< D, F >::pi, integration< D, F >::printstate, integration< D, F >::pu, particle::step(), and boxcollision::walls().

Referenced by integration< D, F >::step(), and test02().

00125 {
00126   boxcollision const & box(distribution.box);
00127   for (uint i=0; i<numParticles; ++i)
00128   {
00129     pi[i].step(h);
00130     box.walls(pi[i],h);
00131   }
00132 
00133   C.eval(fn);
00134 
00135 if (true&&printstate)
00136 {
00137 uint W(fn.W);
00138 uint count;
00139 int idx=0;
00140 cout << endl;
00141 for (uint i=0; i<W; ++i)
00142 {
00143   for (uint j=0; j<W; ++j)
00144   {
00145    
00146     count=0;
00147     for (uint k=0; k<numParticles; ++k)
00148     {
00149       if (idx==fn.index(k))
00150       {
00151         cout << k << ',';
00152         ++count;
00153       }
00154     }
00155     if (count==0)
00156       cout << "*";
00157     cout << " ";
00158     ++idx;
00159   }
00160   cout << endl;
00161 }
00162 }
00163 
00164   uint sz;
00165   for (uint i=0; i<numParticles; ++i)
00166   {
00167     C.getsurroundingparticles(pu,sz,fn,i);
00168 
00169 //cout << SHOW(i) << "   " << SHOW(sz) << "  ";
00170 //print(pu,pu+sz);
00171 
00172     bruteforce(pu,sz);
00173   }
00174 
00175 
00176 if (true&&printstate)
00177 {
00178 cout << endl;
00179 for (uint i=0; i<numParticles; ++i)
00180 {
00181   cout << fn.index(i) << " pi[" << i << "] ";
00182   C.getsurroundingparticles(pu,sz,fn,i);
00183   cout << "  ";
00184   for (uint k=0; k<sz; ++k)
00185     cout << pu[k] << " ";
00186   cout << "        ";
00187   cout << pi[i];
00188 cout << endl;
00189 }
00190 }
00191 
00192 
00193 if (true&&printstate)
00194 {
00195 uint W(fn.W);
00196 uint count;
00197 int idx=0;
00198 cout << endl;
00199 for (uint i=0; i<W; ++i)
00200 {
00201   for (uint j=0; j<W; ++j)
00202   {
00203    
00204     count=0;
00205     for (uint k=0; k<numParticles; ++k)
00206     {
00207       if (idx==fn.index(k))
00208       {
00209         cout << k << ',';
00210         ++count;
00211       }
00212     }
00213     if (count==0)
00214       cout << "*";
00215     cout << " ";
00216     ++idx;
00217   }
00218   cout << endl;
00219 }
00220 }
00221 
00222 
00223 }


Member Data Documentation

template<typename D, typename F>
bool integration< D, F >::displayEk

template<typename D, typename F>
framerate integration< D, F >::fr

Definition at line 57 of file integration.h.

Referenced by animate(), and integration< D, F >::draw().

template<typename D, typename F>
float integration< D, F >::h

template<typename D, typename F>
double integration< D, F >::histhigh

Definition at line 47 of file integration.h.

Referenced by integration< D, F >::reset().

template<typename D, typename F>
double integration< D, F >::histlow

Definition at line 46 of file integration.h.

Referenced by integration< D, F >::reset().

template<typename D, typename F>
uint integration< D, F >::histn

Definition at line 48 of file integration.h.

Referenced by integration< D, F >::reset().

template<typename D, typename F>
bool integration< D, F >::LJ

Lennard-Jones potential is enabled with brute force only.

Definition at line 40 of file integration.h.

Referenced by integration< D, F >::bruteforce(), integration< D, F >::integration(), and integration< D, F >::reset().

template<typename D, typename F>
double integration< D, F >::LJpsi

template<typename D, typename F>
double integration< D, F >::LJsigma

template<typename D, typename F>
uint integration< D, F >::numParticles

template<typename D, typename F>
particle* integration< D, F >::pi

template<typename D, typename F>
bool integration< D, F >::printstate

template<typename D, typename F>
uint* integration< D, F >::pu

template<typename D, typename F>
bool integration< D, F >::run

template<typename D, typename F>
particlesampler integration< D, F >::sampler

Definition at line 50 of file integration.h.

Referenced by integration< D, F >::reset(), and integration< D, F >::step().

template<typename D, typename F>
uint integration< D, F >::samplerstate

Definition at line 51 of file integration.h.

Referenced by integration< D, F >::reset(), and integration< D, F >::step().

template<typename D, typename F>
long integration< D, F >::stepcount

Definition at line 29 of file integration.h.

Referenced by animate(), and integration< D, F >::step().

template<typename D, typename F>
gltextmsg integration< D, F >::stepcountmsg

Definition at line 30 of file integration.h.

Referenced by animate(), and integration< D, F >::draw().

template<typename D, typename F>
bool integration< D, F >::uniform


The documentation for this class was generated from the following file:

Generated on Fri Mar 4 00:50:03 2011 for Chelton Evans Source by  doxygen 1.5.8