diff --git a/tests/testActivePair.c b/tests/testActivePair.c index 6d1db09fb7e8c578b5da818163ae45c1ac3292e5..7b29995cc1b23f77678655eead8d13f377b6436a 100644 --- a/tests/testActivePair.c +++ b/tests/testActivePair.c @@ -29,6 +29,9 @@ /* Local headers. */ #include "swift.h" +/* Typdef function pointer for interaction function. */ +typedef void (*interaction_func)(struct runner *, struct cell *, struct cell *); + /** * @brief Constructs a cell and all of its particle in a valid state prior to * a DOPAIR or DOSELF calcuation. @@ -108,6 +111,12 @@ struct cell *make_cell(size_t n, double *offset, double size, double h, else part->time_bin = num_time_bins + 1; + part->rho = 1.f; + part->force.f = 1.f; + part->force.P_over_rho2 = 1.f; + part->force.balsara = 1.f; + part->force.soundspeed = 1.f; + #ifdef SWIFT_DEBUG_CHECKS part->ti_drift = 8; part->ti_kick = 8; @@ -156,6 +165,11 @@ void clean_up(struct cell *ci) { void zero_particle_fields(struct cell *c) { for (int pid = 0; pid < c->count; pid++) { hydro_init_part(&c->parts[pid], NULL); + c->parts[pid].rho = 1.f; + c->parts[pid].force.f = 1.f; + c->parts[pid].force.P_over_rho2 = 1.f; + c->parts[pid].force.balsara = 1.f; + c->parts[pid].force.soundspeed = 1.f; } } @@ -179,20 +193,22 @@ void dump_particle_fields(char *fileName, struct cell *ci, struct cell *cj) { FILE *file = fopen(fileName, "a"); /* Write header */ - fprintf(file, "# %4s %13s\n", "ID", "wcount"); + fprintf(file, "# %4s %13s %13s\n", "ID", "wcount", "h_dt"); fprintf(file, "# ci --------------------------------------------\n"); for (int pid = 0; pid < ci->count; pid++) { - fprintf(file, "%6llu %13e\n", ci->parts[pid].id, - ci->parts[pid].density.wcount); + fprintf(file, "%6llu %13e %13e\n", ci->parts[pid].id, + ci->parts[pid].density.wcount, + ci->parts[pid].force.h_dt); } fprintf(file, "# cj --------------------------------------------\n"); for (int pjd = 0; pjd < cj->count; pjd++) { - fprintf(file, "%6llu %13e\n", cj->parts[pjd].id, - cj->parts[pjd].density.wcount); + fprintf(file, "%6llu %13e %13e\n", cj->parts[pjd].id, + cj->parts[pjd].density.wcount, + cj->parts[pjd].force.h_dt); } fclose(file); @@ -200,6 +216,7 @@ void dump_particle_fields(char *fileName, struct cell *ci, struct cell *cj) { /* Just a forward declaration... */ void runner_dopair1_density(struct runner *r, struct cell *ci, struct cell *cj); +void runner_dopair2_force_vec(struct runner *r, struct cell *ci, struct cell *cj); void runner_doself1_density_vec(struct runner *r, struct cell *ci); void runner_dopair1_branch_density(struct runner *r, struct cell *ci, struct cell *cj); @@ -210,7 +227,7 @@ void runner_dopair1_branch_density(struct runner *r, struct cell *ci, */ void test_pair_interactions(struct runner *runner, struct cell **ci, struct cell **cj, char *swiftOutputFileName, - char *bruteForceOutputFileName) { + char *bruteForceOutputFileName, interaction_func serial_interaction, interaction_func vec_interaction) { runner_do_sort(runner, *ci, 0x1FFF, 0, 0); runner_do_sort(runner, *cj, 0x1FFF, 0, 0); @@ -220,7 +237,7 @@ void test_pair_interactions(struct runner *runner, struct cell **ci, zero_particle_fields(*cj); /* Run the test */ - runner_dopair1_branch_density(runner, *ci, *cj); + vec_interaction(runner, *ci, *cj); /* Let's get physical ! */ end_calculation(*ci); @@ -236,7 +253,7 @@ void test_pair_interactions(struct runner *runner, struct cell **ci, zero_particle_fields(*cj); /* Run the brute-force test */ - pairs_all_density(runner, *ci, *cj); + serial_interaction(runner, *ci, *cj); /* Let's get physical ! */ end_calculation(*ci); @@ -253,7 +270,7 @@ void test_all_pair_interactions(struct runner *runner, double *offset2, double rho, long long *partId, double perturbation, double h_pert, char *swiftOutputFileName, - char *bruteForceOutputFileName) { + char *bruteForceOutputFileName, interaction_func serial_interaction, interaction_func vec_interaction) { double offset1[3] = {0, 0, 0}; struct cell *ci, *cj; @@ -265,7 +282,7 @@ void test_all_pair_interactions(struct runner *runner, double *offset2, 1.); test_pair_interactions(runner, &ci, &cj, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_interaction, vec_interaction); clean_up(ci); clean_up(cj); @@ -277,7 +294,7 @@ void test_all_pair_interactions(struct runner *runner, double *offset2, 1.); test_pair_interactions(runner, &ci, &cj, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_interaction, vec_interaction); clean_up(ci); clean_up(cj); @@ -289,7 +306,7 @@ void test_all_pair_interactions(struct runner *runner, double *offset2, 0.5); test_pair_interactions(runner, &ci, &cj, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_interaction, vec_interaction); clean_up(ci); clean_up(cj); @@ -301,7 +318,7 @@ void test_all_pair_interactions(struct runner *runner, double *offset2, 0.); test_pair_interactions(runner, &ci, &cj, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_interaction, vec_interaction); clean_up(ci); clean_up(cj); @@ -313,7 +330,7 @@ void test_all_pair_interactions(struct runner *runner, double *offset2, 0.1); test_pair_interactions(runner, &ci, &cj, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_interaction, vec_interaction); clean_up(ci); clean_up(cj); @@ -325,7 +342,7 @@ void test_all_pair_interactions(struct runner *runner, double *offset2, 0.); test_pair_interactions(runner, &ci, &cj, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_interaction, vec_interaction); clean_up(ci); clean_up(cj); @@ -337,7 +354,7 @@ void test_all_pair_interactions(struct runner *runner, double *offset2, 1.0); test_pair_interactions(runner, &ci, &cj, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_interaction, vec_interaction); clean_up(ci); clean_up(cj); @@ -347,7 +364,7 @@ void test_all_pair_interactions(struct runner *runner, double *offset2, cj = make_cell(2, offset2, size, h, rho, partId, perturbation, h_pert, 1.0); test_pair_interactions(runner, &ci, &cj, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_interaction, vec_interaction); clean_up(ci); clean_up(cj); @@ -357,7 +374,7 @@ void test_all_pair_interactions(struct runner *runner, double *offset2, cj = make_cell(3, offset2, size, h, rho, partId, perturbation, h_pert, 0.75); test_pair_interactions(runner, &ci, &cj, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_interaction, vec_interaction); clean_up(ci); clean_up(cj); @@ -369,7 +386,7 @@ void test_all_pair_interactions(struct runner *runner, double *offset2, 0.); test_pair_interactions(runner, &ci, &cj, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_interaction, vec_interaction); clean_up(ci); clean_up(cj); @@ -381,7 +398,7 @@ void test_all_pair_interactions(struct runner *runner, double *offset2, 0.5); test_pair_interactions(runner, &ci, &cj, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_interaction, vec_interaction); /* Clean things to make the sanitizer happy ... */ clean_up(ci); @@ -406,7 +423,7 @@ int main(int argc, char *argv[]) { clocks_set_cpufreq(cpufreq); /* Choke on FP-exceptions */ - feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW); + //feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW); /* Generate a RNG seed from time. */ unsigned int seed = time(NULL); @@ -482,7 +499,7 @@ int main(int argc, char *argv[]) { /* Create output file names. */ sprintf(swiftOutputFileName, "swift_dopair_%s.dat", outputFileNameExtension); - sprintf(bruteForceOutputFileName, "brute_force_%s.dat", + sprintf(bruteForceOutputFileName, "brute_force_pair_%s.dat", outputFileNameExtension); /* Delete files if they already exist. */ @@ -498,10 +515,48 @@ int main(int argc, char *argv[]) { double offset[3] = {1., 0., 0.}; + /* Define which interactions to call */ + interaction_func serial_inter_func = &pairs_all_density; + interaction_func vec_inter_func = &runner_dopair1_branch_density; + + /* Test a pair of cells face-on. */ + test_all_pair_interactions(runner, offset, particles, size, h, rho, &partId, + perturbation, h_pert, swiftOutputFileName, + bruteForceOutputFileName, serial_inter_func, vec_inter_func); + + /* Test a pair of cells edge-on. */ + offset[0] = 1.; + offset[1] = 1.; + offset[2] = 0.; + test_all_pair_interactions(runner, offset, particles, size, h, rho, &partId, + perturbation, h_pert, swiftOutputFileName, + bruteForceOutputFileName, serial_inter_func, vec_inter_func); + + /* Test a pair of cells corner-on. */ + offset[0] = 1.; + offset[1] = 1.; + offset[2] = 1.; + test_all_pair_interactions(runner, offset, particles, size, h, rho, &partId, + perturbation, h_pert, swiftOutputFileName, + bruteForceOutputFileName, serial_inter_func, vec_inter_func); + + /* Re-assign function pointers. */ + serial_inter_func = &pairs_all_force; + vec_inter_func = &runner_dopair2_force_vec; + + /* Create new output file names. */ + sprintf(swiftOutputFileName, "swift_dopair2_force_%s.dat", outputFileNameExtension); + sprintf(bruteForceOutputFileName, "brute_force_dopair2_%s.dat", + outputFileNameExtension); + + /* Delete files if they already exist. */ + remove(swiftOutputFileName); + remove(bruteForceOutputFileName); + /* Test a pair of cells face-on. */ test_all_pair_interactions(runner, offset, particles, size, h, rho, &partId, perturbation, h_pert, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_inter_func, vec_inter_func); /* Test a pair of cells edge-on. */ offset[0] = 1.; @@ -509,7 +564,7 @@ int main(int argc, char *argv[]) { offset[2] = 0.; test_all_pair_interactions(runner, offset, particles, size, h, rho, &partId, perturbation, h_pert, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_inter_func, vec_inter_func); /* Test a pair of cells corner-on. */ offset[0] = 1.; @@ -517,6 +572,6 @@ int main(int argc, char *argv[]) { offset[2] = 1.; test_all_pair_interactions(runner, offset, particles, size, h, rho, &partId, perturbation, h_pert, swiftOutputFileName, - bruteForceOutputFileName); + bruteForceOutputFileName, serial_inter_func, vec_inter_func); return 0; }