void test_smooth_r4<float_type>::test() { // place particles along the x-axis within one half of the box, // put every second particle at the origin unsigned int npart = particle->nparticle(); vector_type dx(0); dx[0] = box->edges()(0, 0) / npart / 2; std::vector<vector_type> r_list(particle->nparticle()); std::vector<unsigned int> species(particle->nparticle()); for (unsigned int k = 0; k < r_list.size(); ++k) { r_list[k] = (k % 2) ? k * dx : vector_type(0); species[k] = (k < npart_list[0]) ? 0U : 1U; // set particle type for a binary mixture } BOOST_CHECK( set_position(*particle, r_list.begin()) == r_list.end() ); BOOST_CHECK( set_species(*particle, species.begin()) == species.end() ); // read forces and other stuff from device std::vector<float> en_pot(particle->nparticle()); BOOST_CHECK( get_potential_energy(*particle, en_pot.begin()) == en_pot.end() ); std::vector<vector_type> f_list(particle->nparticle()); BOOST_CHECK( get_force(*particle, f_list.begin()) == f_list.end() ); float const eps = std::numeric_limits<float>::epsilon(); for (unsigned int i = 0; i < npart; ++i) { unsigned int type1 = species[i]; unsigned int type2 = species[(i + 1) % npart]; vector_type r = r_list[i] - r_list[(i + 1) % npart]; vector_type f = f_list[i]; // reference values from host module host_float_type fval, en_pot_; host_float_type rr = inner_prod(r, r); std::tie(fval, en_pot_) = (*host_potential)(rr, type1, type2); if (rr < host_potential->rr_cut(type1, type2)) { double rcut = host_potential->r_cut(type1, type2); // the GPU force module stores only a fraction of these values en_pot_ /= 2; // the first term is from the smoothing, the second from the potential // (see lennard_jones.cpp from unit tests) float const tolerance = 8 * eps * (1 + rcut/(rcut - std::sqrt(rr))) + 10 * eps; BOOST_CHECK_SMALL(norm_inf(fval * r - f), std::max(norm_inf(fval * r), 1.f) * tolerance * 2); BOOST_CHECK_CLOSE_FRACTION(en_pot_, en_pot[i], 2 * tolerance); } else { // when the distance is greater than the cutoff // set the force and the pair potential to zero fval = en_pot_ = 0; BOOST_CHECK_SMALL(norm_inf(f), eps); BOOST_CHECK_SMALL(en_pot[i], eps); } } }
Float HybridMonteCarlo::get_total_energy() const { return get_kinetic_energy()+get_potential_energy(); }
static void time_integration_loop_hubble(Forceinfo *fi, Nbodyinfo *nb) { double zval; /* red shift at T=0 */ double tmpzz; double t, t0, dt1, tpresent; double W, K, E0, E, Q; double cm[3], cmv[3]; int step = 0; double tsnapout, timageout; t = 0.0; tpresent = 16.0; /* present time must be 16.0 */ zval = 24.0; tmpzz = pow(1.0/(zval+1), 3.0/2.0); t0 = tmpzz/(1.0-tmpzz)*tpresent; fi->eps = (zval+1)*pow(t0/(tpresent+t0), 2.0/3.0)*eps0; dt1 = dt0; tsnapout = dtsnapout; timageout = dtimageout; PR(t0, f); PR(dt0, f); PRL(dt1, f); PR(tstart,f); PR(tpresent,f); PR(dt,f); PRL(dtsnapout,f); PRL(dtimageout,f); if (cputime_flag) { vtc_turnon_cputime(); } vtc_init_cputime(); vtc_print_cputime("initial vtc_get_force start at"); #if DIRECT /* direct sum */ if (grape_flag) { vtc_set_scale(512.0, nb->m[0]); fi->calculator = GRAPE_FORCEONLY; vtc_get_force_direct(fi, nb); #if CALCPOTENTIAL fi->calculator = GRAPE_POTENTIALONLY; vtc_get_force_direct(fi, nb); fi->calculator = GRAPE_FORCEONLY; #endif } else { vtc_get_force_direct(fi, nb); } #else /* tree */ if (grape_flag) { fi->calculator = GRAPE_FORCEONLY; vtc_get_force_tree(fi, nb); #if CALCPOTENTIAL fi->calculator = GRAPE_POTENTIALONLY; vtc_get_force_tree(fi, nb); fi->calculator = GRAPE_FORCEONLY; #endif } else { vtc_get_force_tree(fi, nb); } #endif /* direct/tree */ vtc_print_cputime("initial vtc_get_force end at"); fprintf(stderr, "ninteraction: %e list_len_avg: %6.5f nwalk: %d\n", fi->ninteraction, (double)fi->ninteraction/nb->n, fi->nwalk); K = get_kinetic_energy(nb); #if CALCPOTENTIAL W = get_potential_energy(nb); E = E0 = W+K; PR(E0, f); PR(W, f); #endif PRL(K, f); plot_nbody(t, nb); /* calculate force at T=0 and quit */ if (snapout_flag && dtsnapout == 0.0) { static int nout = 0; char fn[255]; snapout_acc_flag = 1; sprintf(fn, snapoutfile, nout); PRL(fn, s); if (ionemo_flag) { write_binary(fn, t, nb); } else if (usepob_flag) { write_pob(fn, t, nb); } else { write_ascii(fn, t, nb); } vtc_print_cputime("exit at"); return; } while (t < tend) { if (fi->eps < eps) { double eps1; eps1 = (zval+1)*pow((t+t0)/(tpresent+t0), 2.0/3.0)*eps0; fi->eps = (eps1 < eps ? eps1 : eps); } else { fi->eps = eps; } if (dt1 < dt) { dt1 = dt0*(t+t0)/t0; } else { dt1 = dt; } if (step%outlogstep == outlogstep - 1 && cputime_flag) { vtc_turnon_cputime(); } else { vtc_turnoff_cputime(); } push_velocity(0.5*dt1, nb); push_position(dt1, nb); vtc_init_cputime(); #if DIRECT /* direct sum */ vtc_get_force_direct(fi, nb); #else /* tree */ vtc_get_force_tree(fi, nb); #endif /* direct/tree */ vtc_print_cputime("vtc_get_force end at"); push_velocity(0.5*dt1, nb); vtc_print_cputime("integration end at"); plot_nbody(t, nb); if (step%outlogstep == outlogstep - 1) { fprintf(stderr, "ninteraction: %e list_len_avg: %6.5f nwalk: %d\n", fi->ninteraction, fi->ninteraction/nb->n, fi->nwalk); K = get_kinetic_energy(nb); #if CALCPOTENTIAL if (grape_flag) { fi->calculator = GRAPE_POTENTIALONLY; #if DIRECT /* direct sum */ vtc_get_force_direct(fi, nb); #else /* tree */ vtc_get_force_tree(fi, nb); #endif /* direct/tree */ fi->calculator = GRAPE_FORCEONLY; } W = get_potential_energy(nb); E = W+K; Q = K/(K-E); fprintf(stderr, "\nT= %f K= %f Q= %f E= %f Eerr= %f Eabserr= %f\n", t, K, Q, E, (E0-E)/E0, E0-E); #else fprintf(stderr, "\nT= %f K= %f\n", t, K); #endif fprintf(stderr, "step: %d\n", step); fprintf(stderr, "T: %f current eps: %f dt: %f\n", t, fi->eps, dt1); get_cmterms(nb, cm, cmv); fprintf(stderr, "CM %15.13e %15.13e %15.13e\n", cm[0], cm[1], cm[2]); fprintf(stderr, "CMV %15.13e %15.13e %15.13e\n", cmv[0], cmv[1], cmv[2]); } if (tsnapout < t && snapout_flag) { static int nout = 0; char fn[255]; char cmd[255]; sprintf(fn, snapoutfile, nout); PRL(fn, s); if (ionemo_flag) { write_binary(fn, t, nb); } else if (usepob_flag) { write_pob(fn, t, nb); } else { write_ascii(fn, t, nb); } if (command_exec_flag) { sprintf(cmd, "%s %s %03d", command_name, fn, nout); fprintf(stderr, "execute %s\n", cmd); system(cmd); } nout++; PR(t, f); PRL(fn, s); tsnapout += dtsnapout; } if (timageout < t && imageout_flag) { static int nout = 0; char fn[255]; char cmd[255]; sprintf(fn, snapoutfile, nout); strcat(fn, ".gif"); PRL(fn, s); vtc_plotstar(nb->x, nb->n, t, image_scale, fn); nout++; PR(t, f); PRL(fn, s); timageout += dtimageout; } t += dt1; step++; vtc_print_cputime("exit at"); } /* main loop */ }
static void time_integration_loop(Forceinfo *fi, Nbodyinfo *nb) { int i, nstep; int outsnapstep, outimagestep; double W, K, E0, E, Q; double cm[3], cmv[3]; double t = tstart; nstep = (int)((tend-tstart)/dt+0.1); dt = (tend-tstart)/nstep; outsnapstep = (int) (dtsnapout/dt+0.1); outimagestep = (int) (dtimageout/dt+0.1); PR(tstart,f); PR(tend,f); PR(dt,f); PRL(dtsnapout,f); PRL(dtimageout,f); if (cputime_flag) { vtc_turnon_cputime(); } vtc_init_cputime(); vtc_print_cputime("initial vtc_get_force start at"); #if DIRECT /* direct sum */ if (grape_flag) { vtc_set_scale(512.0, nb->m[0]); #if MDGRAPE2 fi->calculator = GRAPE_FORCEONLY; #else fi->calculator = GRAPE; #endif /* MDGRAPE2 */ vtc_get_force_direct(fi, nb); #if CALCPOTENTIAL && MDGRAPE2 fi->calculator = GRAPE_POTENTIALONLY; vtc_get_force_direct(fi, nb); fi->calculator = GRAPE_FORCEONLY; #endif /* CALCPOTENTIAL && MDGRAPE2 */ } else { #if CALCPOTENTIAL fi->calculator = HOST; #endif /* CALCPOTENTIAL */ vtc_get_force_direct(fi, nb); } #else /* tree */ if (grape_flag) { #if NOFORCE fi->calculator = NOCALCULATOR; #elif MDGRAPE2 fi->calculator = GRAPE_FORCEONLY; #else fi->calculator = GRAPE; #endif /* NOFORCE */ vtc_get_force_tree(fi, nb); #if CALCPOTENTIAL && MDGRAPE2 fi->calculator = GRAPE_POTENTIALONLY; vtc_get_force_tree(fi, nb); fi->calculator = GRAPE_FORCEONLY; #endif /* CALCPOTENTIAL && MDGRAPE2 */ } else { #if CALCPOTENTIAL fi->calculator = HOST; #endif /* CALCPOTENTIAL */ vtc_get_force_tree(fi, nb); } #endif vtc_print_cputime("initial vtc_get_force end at"); fprintf(stderr, "ninteraction: %e list_len_avg: %6.5f nwalk: %d\n", fi->ninteraction, (double)fi->ninteraction/nb->n, fi->nwalk); K = get_kinetic_energy(nb); #if CALCPOTENTIAL W = get_potential_energy(nb); E = E0 = W+K; PR(E0, 20.17f); PR(W, 20.17f); #endif PRL(K, f); plot_nbody(t, nb); /* calculate force at T=0 and quit */ if (snapout_flag && dtsnapout == 0.0) { static int nout = 0; char fn[255]; snapout_acc_flag = 1; sprintf(fn, snapoutfile, nout); PRL(fn, s); if (ionemo_flag) { write_binary(fn, t, nb); } else if (usepob_flag) { write_pob(fn, t, nb); } else { write_ascii(fn, t, nb); } vtc_print_cputime("exit at"); #if USE_GM_API fprintf(stderr, "will m2_gm_finalize...\n"); m2_gm_finalize(); fprintf(stderr, "done m2_gm_finalize.\n"); #endif /* USE_GM_API */ } for (i = 0; i < nstep; i++) { if (i%outlogstep == outlogstep - 1 && cputime_flag) { vtc_turnon_cputime(); } else { vtc_turnoff_cputime(); } fprintf(stderr, "step %d\n", i); push_velocity(0.5*dt, nb); push_position(dt, nb); t = tstart+(i+1)*dt; vtc_init_cputime(); #if DIRECT /* direct sum */ vtc_get_force_direct(fi, nb); #else /* tree */ vtc_get_force_tree(fi, nb); #endif vtc_print_cputime("vtc_get_force end at"); push_velocity(0.5*dt, nb); vtc_print_cputime("integration end at"); plot_nbody(t, nb); if (i%outlogstep == outlogstep - 1) { fprintf(stderr, "ninteraction: %e list_len_avg: %6.5f nwalk: %d\n", fi->ninteraction, fi->ninteraction/nb->n, fi->nwalk); K = get_kinetic_energy(nb); #if CALCPOTENTIAL #if MDGRAPE2 if (grape_flag) { fi->calculator = GRAPE_POTENTIALONLY; #if DIRECT /* direct sum */ vtc_get_force_direct(fi, nb); #else /* tree */ vtc_get_force_tree(fi, nb); #endif /* direct/tree */ fi->calculator = GRAPE_FORCEONLY; } #endif /* MDGRAPE2 */ W = get_potential_energy(nb); E = W+K; Q = K/(K-E); fprintf(stderr, "\nT= %f K= %20.17f Q= %20.17f E= %20.17f Eerr= %20.17f Eabserr= %20.17f\n", t, K, Q, E, (E0-E)/E0, E0-E); #else /* CALCPOTENTIAL */ fprintf(stderr, "\nT= %f K= %20.17f\n", t, K); #endif /* CALCPOTENTIAL */ fprintf(stderr, "step: %d\n", i); get_cmterms(nb, cm, cmv); fprintf(stderr, "CM %15.13e %15.13e %15.13e\n", cm[0], cm[1], cm[2]); fprintf(stderr, "CMV %15.13e %15.13e %15.13e\n", cmv[0], cmv[1], cmv[2]); } if (i%outsnapstep == outsnapstep - 1 && snapout_flag) { static int nout = 0; char fn[255]; char cmd[255]; sprintf(fn, snapoutfile, nout); PRL(fn, s); if (ionemo_flag) { write_binary(fn, t, nb); } else if (usepob_flag) { write_pob(fn, t, nb); } else { write_ascii(fn, t, nb); } if (command_exec_flag) { sprintf(cmd, "%s %s %03d", command_name, fn, nout); fprintf(stderr, "execute %s\n", cmd); system(cmd); } nout++; PR(t, f); PRL(fn, s); } if (i%outimagestep == outimagestep - 1 && imageout_flag) { static int nout = 0; char fn[255]; char cmd[255]; char msg[255]; double center[2]; sprintf(fn, snapoutfile, nout); strcat(fn, ".gif"); PRL(fn, s); sprintf(msg, "t: %5.3f", t); center[0] = 0.0; center[1] = 0.0; // vtc_plotstar(fn, nb, msg, image_scale, center, 1e10, NULL, NULL); // vtc_plotstar(nb->x, nb->m, nb->n, t, image_scale, fn); nout++; PR(t, f); PRL(fn, s); } vtc_print_cputime("exit at"); } /* i loop */ }