int main ( int argc, char *argv[]) { float sigma, rcut, dt, eqtemp, dens, boxlx, boxly, boxlz, sfx, sfy, sfz, sr6, vrcut, dvrcut, dvrc12, freex; int nstep, nequil, iscale, nc, mx, my, mz, iprint, map[MAPSIZ]; float *rx, *ry, *rz, *vx, *vy, *vz, *fx, *fy, *fz; float ace, acv, ack, acp, acesq, acvsq, acksq, acpsq, vg, kg, wg; int *head, *list; int natoms=0; int ierror; int jstart, step, itemp; float potential, virial, kinetic; float tmpx; int i, icell; ierror = input_parameters (&sigma, &rcut, &dt, &eqtemp, &dens, &boxlx, &boxly, &boxlz, &sfx, &sfy, &sfz, &sr6, &vrcut, &dvrcut, &dvrc12, &freex, &nstep, &nequil, &iscale, &nc, &natoms, &mx, &my, &mz, &iprint, map); //printf ("\nReturned from input_parameters, natoms = %d\n", natoms); rx = (float *)malloc(2*natoms*sizeof(float)); ry = (float *)malloc(2*natoms*sizeof(float)); rz = (float *)malloc(2*natoms*sizeof(float)); vx = (float *)malloc(natoms*sizeof(float)); vy = (float *)malloc(natoms*sizeof(float)); vz = (float *)malloc(natoms*sizeof(float)); fx = (float *)malloc(natoms*sizeof(float)); fy = (float *)malloc(natoms*sizeof(float)); fz = (float *)malloc(natoms*sizeof(float)); list = (int *)malloc(2*natoms*sizeof(int)); head = (int *)malloc((mx+2)*(my+2)*(mz+2)*sizeof(int)); initialise_particles (rx, ry, rz, vx, vy, vz, nc); //printf ("\nReturned from initialise_particles\n"); loop_initialise(&ace, &acv, &ack, &acp, &acesq, &acvsq, &acksq, &acpsq, sigma, rcut, dt); //printf ("\nReturned from loop_initialise\n"); output_particles(rx,ry,rz,vx,vy,vz,fx,fy,fz,0); movout (rx, ry, rz, vx, vy, vz, sfx, sfy, sfz, head, list, mx, my, mz, natoms); //printf ("\nReturned from movout\n"); // check_cells(rx, ry, rz, head, list, mx, my, mz, natoms,0,0); force (&potential, &virial, rx, ry, rz, fx, fy, fz, sigma, rcut, vrcut, dvrc12, dvrcut, head, list, map, mx, my, mz, natoms,0); //printf ("\nReturned from force: potential = %f, virial = %f, kinetic = %f\n",potential, virial, kinetic); output_particles(rx,ry,rz,vx,vy,vz,fx,fy,fz,0); for(step=1;step<=nstep;step++){ //printf ("\nStarted step %d\n",step); movea (rx, ry, rz, vx, vy, vz, fx, fy, fz, dt, natoms); // check_cells(rx, ry, rz, head, list, mx, my, mz, natoms,step,step); //printf ("\nReturned from movea\n"); movout (rx, ry, rz, vx, vy, vz, sfx, sfy, sfz, head, list, mx, my, mz, natoms); // printf ("\nReturned from movout\n"); // check_cells(rx, ry, rz, head, list, mx, my, mz, natoms,step,step); force (&potential, &virial, rx, ry, rz, fx, fy, fz, sigma, rcut, vrcut, dvrc12, dvrcut, head, list, map, mx, my, mz, natoms, step); //printf ("\nReturned from force: potential = %f, virial = %f, kinetic = %f\n",potential, virial, kinetic); moveb (&kinetic, vx, vy, vz, fx, fy, fz, dt, natoms); // check_cells(rx, ry, rz, head, list, mx, my, mz, natoms,step,step); // printf ("\nReturned from moveb: potential = %f, virial = %f, kinetic = %f\n",potential, virial, kinetic); sum_energies (potential, kinetic, virial, &vg, &wg, &kg); hloop (kinetic, step, vg, wg, kg, freex, dens, sigma, eqtemp, &tmpx, &ace, &acv, &ack, &acp, &acesq, &acvsq, &acksq, &acpsq, vx, vy, vz, iscale, iprint, nequil, natoms); } tidyup (ace, ack, acv, acp, acesq, acksq, acvsq, acpsq, nstep, nequil); return 0; }
void main_timestep_loop(){ double aexp, aold, amid, t, told, tmid, dt, econs = 0.0; int nstep = 0; // Initialize time variables aexp = aold = sim._aexp = sim._aexp_ini; t = sim._ttofa_spline.f(aexp); // Verbose cout << endl; cout << "=============================================================================" << endl; cout << "Starting time-integration aexp: " << setw(10) << aexp << endl; cout << "=============================================================================" << endl; // Set initial guess for modified gravity solver if(sim._modified_gravity) make_initial_guess(sim._ScalarField, aexp); // Main time-step loop while(aexp < 1.0){ // Update time and translate between scale-factor and code time dt = calc_new_timestep(); if(t+dt > 0.0) dt = -t + 0.001; told = t; aold = sim._aoftt_spline.f(told); tmid = t + dt/2.0; amid = sim._aoftt_spline.f(tmid); t = t + dt; aexp = sim._aoftt_spline.f(t); // Verbose cout << endl; cout << "=============================================================================" << endl; cout << "Timestep nstep : " << setw(10) << nstep << " aexp : " << setw(10) << aexp << endl; cout << " t : " << setw(10) << t << " dt : " << setw(10) << dt << endl; cout << " vrms : " << setw(10) << calc_vrms(aexp); cout << " econs : " << setw(10) << econs << endl; cout << "=============================================================================" << endl; cout << endl; // Update positions of particles - 1/2 time-step leapfrog_drift_particles(dt/2.0); sim._aexp = amid; // Assign density to grid assign_particles_to_grid(sim._Rho, sim._ngrid); // Solve for gravitational force compute_gravitational_acceleration(amid); // Solve for the scalar field and compute fifth-force if(sim._modified_gravity){ solve_phi_with_multigrid(); calculate_fifth_force(); } // Update velocity of particles - 1 time-step leapfrog_kick_particles(dt); // Update positions of particles - 1/2 time-step leapfrog_drift_particles(dt/2.0); sim._aexp = aexp; // Check energy conservation econs = calc_energy_conservation_constant(); // Output when a = 0.1, 0.2, ...., 1.0 if( (int(aexp*100) % 10 == 0) && ( int(aold*100) % 10 != 0) ) output_particles(aexp); ++nstep; } }