Example #1
0
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);
          }
        }
      }
}
Example #2
0
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]);
          }
        }


      }

}