// Bonk.cc -- demonstrates a structure called 'particle' // and a function called 'collide', which collides two particles // in D dimensions. #include #include using namespace std; #define D 2 // number of dimensions struct particle { double x[D] ; // (x,y) coordinates double p[D] ; // momentum double im ; // inverse mass double v[D] ; // velocity double T ; // kinetic energy } ; // Note the definition of a structure ends with a semicolon // Here's a different way passing a structure by reference void showVelocityC ( particle & a ) { // the "&" indicates 'this is a pass by // reference. for ( int i = 0 ; i < D ; i++ ) { cout << "v["< 1.01 ) { cerr << "Warning, collision direction not normalized\n" ; if (mag>0.0) { mag = 1.0 / sqrt(mag) ; for ( int i = 0 ; i < D ; i++ ) { d[i] *= mag ; } } else { cerr << "WARNING, collision direction too small for progress\n" ; } } // assume v is right and make sure p is consistent v2p( a ) ; v2p( b ) ; // check energy and momentum before double momentum_before[D], momentum_after[D] , diff[D] ; double energy_before=0.0 , energy_after =0.0; for ( int i = 0 ; i < D ; i++ ) { momentum_before[i] = a.p[i]+b.p[i] ; energy_before += 0.5*a.p[i]*a.v[i] + 0.5*b.p[i]*b.v[i] ; } collide( a , b , d ); for ( int i = 0 ; i < D ; i++ ) { momentum_after[i] = a.p[i]+b.p[i] ; energy_after += 0.5*a.p[i]*a.v[i] + 0.5*b.p[i]*b.v[i] ; } if( fabs(energy_after-energy_before) > 1e-4 ) { cerr << "Warning - energy mismatch?\n" ; } cerr << "\tBefore\tAfter\n" ; cerr << "Energy\t" << energy_before << "\t" << energy_after << endl; int mismatch = 0 ; cerr << "\tBefore\t\tAfter\n" ; for ( int i = 0 ; i < D ; i++ ) { diff[i] = momentum_before[i] - momentum_after[i] ; if (( diff[i]*diff[i] / ( momentum_before[i] + momentum_after[i] + 1e-5 ) / ( momentum_before[i] + momentum_after[i] + 1e-5 ) )>1e-10 ) { mismatch ++ ; } cerr << "Mom["<