Files Classes Functions Hierarchy
#include <integration.h>
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 |
| particle * | pi |
| uint * | pu |
| framerate | fr |
| bool | run |
Definition at line 21 of file integration.h.
| 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 }
| 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 }
| 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 }
| 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 }
| 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 }
| 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 }
| void integration< D, F >::step | ( | ) | [inline] |
Definition at line 76 of file integration.h.
References integration< D, F >::bruteforce(), integration< D, F >::sampler, integration< D, F >::samplerstate, integration< D, F >::stepcount, integration< D, F >::uniform, and integration< D, F >::uniformgridtest().
Referenced by animate(), keyboard(), and integration< D, F >::steplarge().
00077 { 00078 if (!uniform) 00079 bruteforce(); 00080 else 00081 uniformgridtest(); 00082 00083 ++stepcount; 00084 00085 if (samplerstate) 00086 ++sampler; 00087 }
| void integration< D, F >::steplarge | ( | ) | [inline] |
Definition at line 227 of file integration.h.
References integration< D, F >::step().
Referenced by keyboard().
| void integration< D, F >::togglestartstop | ( | ) | [inline] |
Definition at line 235 of file integration.h.
References integration< D, F >::run.
Referenced by keyboard().
| 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 }
| bool integration< D, F >::displayEk |
Definition at line 37 of file integration.h.
Referenced by integration< D, F >::draw(), integration< D, F >::integration(), and integration< D, F >::reset().
| framerate integration< D, F >::fr |
Definition at line 57 of file integration.h.
Referenced by animate(), and integration< D, F >::draw().
| float integration< D, F >::h |
Definition at line 35 of file integration.h.
Referenced by integration< D, F >::bruteforce(), integration< D, F >::integration(), integration< D, F >::reset(), and integration< D, F >::uniformgridtest().
| double integration< D, F >::histhigh |
| double integration< D, F >::histlow |
| uint integration< D, F >::histn |
| 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().
| double integration< D, F >::LJpsi |
Definition at line 41 of file integration.h.
Referenced by integration< D, F >::integration(), integration< D, F >::LJcalc(), and integration< D, F >::reset().
| double integration< D, F >::LJsigma |
Definition at line 42 of file integration.h.
Referenced by integration< D, F >::integration(), integration< D, F >::LJcalc(), and integration< D, F >::reset().
| uint integration< D, F >::numParticles |
Definition at line 32 of file integration.h.
Referenced by integration< D, F >::bruteforce(), integration< D, F >::draw(), integration< D, F >::integration(), integration< D, F >::LJcalc(), integration< D, F >::reset(), test02(), and integration< D, F >::uniformgridtest().
| particle* integration< D, F >::pi |
Definition at line 53 of file integration.h.
Referenced by integration< D, F >::bruteforce(), integration< D, F >::draw(), integration< D, F >::integration(), integration< D, F >::LJcalc(), integration< D, F >::reset(), and integration< D, F >::uniformgridtest().
| bool integration< D, F >::printstate |
Definition at line 34 of file integration.h.
Referenced by integration< D, F >::integration(), integration< D, F >::reset(), and integration< D, F >::uniformgridtest().
| uint* integration< D, F >::pu |
Definition at line 55 of file integration.h.
Referenced by integration< D, F >::reset(), and integration< D, F >::uniformgridtest().
| bool integration< D, F >::run |
Definition at line 73 of file integration.h.
Referenced by animate(), integration< D, F >::integration(), and integration< D, F >::togglestartstop().
| particlesampler integration< D, F >::sampler |
Definition at line 50 of file integration.h.
Referenced by integration< D, F >::reset(), and integration< D, F >::step().
| uint integration< D, F >::samplerstate |
Definition at line 51 of file integration.h.
Referenced by integration< D, F >::reset(), and integration< D, F >::step().
| long integration< D, F >::stepcount |
Definition at line 29 of file integration.h.
Referenced by animate(), and integration< D, F >::step().
| gltextmsg integration< D, F >::stepcountmsg |
Definition at line 30 of file integration.h.
Referenced by animate(), and integration< D, F >::draw().
| bool integration< D, F >::uniform |
Definition at line 33 of file integration.h.
Referenced by integration< D, F >::integration(), integration< D, F >::reset(), integration< D, F >::step(), and test02().
1.5.8