void evolve(int count,double dt){ int step; int i,j,k,l; double dr, dx[3]; /* * Loop over timesteps. */ for(step = 1;step<=count;step++){ printf("timestep %d\n",step); printf("collisions %d\n",collisions); /* set the viscosity term in the force calculation */ for(i=0;i<Nbody;i++){ visc_force(Ndim,particle[i].f, particle[i].visc, particle[i].vel); /* calculate norm of seperation vector */ particle[i].r = 0.0; add_norm(Ndim,&particle[i].r,particle[i].pos); particle[i].r = sqrt(particle[i].r); /* calculate central force */ for(l=0;l<Ndim;l++){ particle[i].f[l] = particle[i].f[l] - force(G*particle[i].mass*M_central,particle[i].pos[l],particle[i].r); } } /* calculate pairwise separation of particles */ for(i=0;i<Nbody;i++){ for(j=i+1;j<Nbody;j++){ for(l=0;l<Ndim;l++){ dx[l] = particle[i].pos[l] - particle[j].pos[l]; } dr = 0.0; add_norm(Ndim, &dr, dx); dr = sqrt(dr); for(l=0;l<Ndim;l++){ /* flip force if close in */ double force1 = force(G*particle[i].mass*particle[j].mass,dx[l],dr); if( dr >= Size ){ particle[i].f[l] = particle[i].f[l] - force1; particle[j].f[l] = particle[j].f[l] + force1; }else{ particle[i].f[l] = particle[i].f[l] + force1; particle[j].f[l] = particle[j].f[l] - force1; collisions++; } } } } /* update positions */ for(i=0;i<Nbody;i++){ for(j=0;j<Ndim;j++){ particle[i].pos[j] = particle[i].pos[j] + dt * particle[i].vel[j]; /* update velocities */ particle[i].vel[j] = particle[i].vel[j] + dt * (particle[i].f[j]/particle[i].mass); } } } }
void evolve(int count,double dt){ int step; int i,j,k,l; /* * Loop over timesteps. */ for(step = 0;step<count;step++){ printf("timestep %d\n",step); /* set the viscosity term in the force calculation */ for(j=0;j<Ndim;j++){ visc_force(Nbody,f[j],visc,vel[j]); } /* calculate pairwise separation of particles */ k = 0; for(i=0;i<Nbody;i++){ for(j=i+1;j<Nbody;j++){ for(l=0;l<Ndim;l++){ delta_x[l][k] = pos[l][i] - pos[l][j]; } k = k + 1; } } /* calculate norm of seperation vector */ for(k=0;k<Npair;k++){ r[k] = 0.0; } for(i=0;i<Ndim;i++){ add_norm(Npair,r,delta_x[i]); } for(k=0;k<Npair;k++){ r[k] = sqrt(r[k]); } /* * add pairwise forces. */ k = 0; for(i=0;i<Nbody;i++){ for(j=i+1;j<Nbody;j++){ for(l=0;l<Ndim;l++){ /* flip force if close in */ if( r[k] >= Size ){ f[l][i] = f[l][i] - force(G*mass[i]*mass[j],delta_x[l][k],r[k]); f[l][j] = f[l][j] + force(G*mass[i]*mass[j],delta_x[l][k],r[k]); }else{ f[l][i] = f[l][i] + force(G*mass[i]*mass[j],delta_x[l][k],r[k]); f[l][j] = f[l][j] - force(G*mass[i]*mass[j],delta_x[l][k],r[k]); } } k = k + 1; } } /* update positions */ for(i=0;i<Nbody;i++){ for(j=0;j<Ndim;j++){ pos[j][i] = pos[j][i] + dt * vel[j][i]; } } /* update velocities */ for(i=0;i<Nbody;i++){ for(j=0;j<Ndim;j++){ vel[j][i] = vel[j][i] + dt * (f[j][i]/mass[i]); } } } }