diff --git a/tests/testNonSymInt.c b/tests/testNonSymInt.c deleted file mode 100644 index eb79f2c9313142b6930a100cb958cbaed606c4bf..0000000000000000000000000000000000000000 --- a/tests/testNonSymInt.c +++ /dev/null @@ -1,306 +0,0 @@ -/******************************************************************************* - * This file is part of SWIFT. - * Copyright (C) 2015 Matthieu Schaller (matthieu.schaller@durham.ac.uk). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - ******************************************************************************/ - -#include <fenv.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include "swift.h" - -/* Typdef function pointers for serial and vectorised versions of the interaction functions. */ -typedef void (*serial_interaction)(float, float *, float, float, struct part *, struct part *); -typedef void (*vec_interaction)(float *, float *, float *, float *, struct part **, struct part **); - -/** - * @brief Constructs an array of particles in a valid state prior to - * a IACT_NONSYM and IACT_NONSYM_VEC call. - * - * @param count No. of particles to create - * @param offset The position of the particle offset from (0,0,0). - * @param spacing Particle spacing. - * @param h The smoothing length of the particles in units of the inter-particle - *separation. - * @param partId The running counter of IDs. - */ -struct part *make_particles(int count, double *offset, double spacing, double h, - long long *partId) { - - struct part *particles; - if (posix_memalign((void **)&particles, part_align, - count * sizeof(struct part)) != 0) { - error("couldn't allocate particles, no. of particles: %d", (int)count); - } - - /* Construct the particles */ - struct part *p; - for (size_t i = 0; i < VEC_SIZE + 1; ++i) { - p = &particles[i]; - p->x[0] = offset[0] + spacing * i; - p->x[1] = offset[1] + spacing * i; - p->x[2] = offset[2] + spacing * i; - - /* Randomise velocities. */ - p->v[0] = random_uniform(-0.05, 0.05); - p->v[1] = random_uniform(-0.05, 0.05); - p->v[2] = random_uniform(-0.05, 0.05); - - p->h = h; - p->id = ++(*partId); - p->mass = 1.0f; - } - return particles; -} - -/** - * @brief Populates particle properties needed for the force calculation. - */ -void prepare_force(struct part *parts) { - - struct part *p; - for (size_t i = 0; i < VEC_SIZE + 1; ++i) { - p = &parts[i]; - p->rho = i + 1; - p->force.balsara = i + 1; - p->force.P_over_rho2 = i + 1; - } -} - -/** - * @brief Dumps all particle information to a file - */ -void dump_indv_particle_fields(char *fileName, struct part *p) { - - FILE *file = fopen(fileName, "a"); - - fprintf( - file, - "%6llu %10f %10f %10f %10f %10f %10f %10f %10f %10f %13e %13e %13e %13e %13e %13e %13e " - "%13e %13e %13e %10f\n", - p->id, p->x[0], p->x[1], - p->x[2], p->v[0], p->v[1], - p->v[2], p->a_hydro[0], p->a_hydro[1], - p->a_hydro[2], p->rho, p->rho_dh, - p->density.wcount, p->density.wcount_dh, p->h_dt, p->force.v_sig, -#if defined(GADGET2_SPH) - p->density.div_v, p->density.rot_v[0], - p->density.rot_v[1], p->density.rot_v[2], p->force.entropy_dt -#elif defined(DEFAULT_SPH) - p->density.div_v, p->density.rot_v[0], - p->density.rot_v[1], p->density.rot_v[2], 0. -#else - 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. -#endif - ); - fclose(file); -} - -/** - * @brief Creates a header for the output file - */ -void write_header(char *fileName) { - - FILE *file = fopen(fileName, "w"); - /* Write header */ - fprintf(file, - "# %4s %10s %10s %10s %10s %10s %10s %10s %10s %10s %13s %13s %13s %13s %13s %13s %13s" - "%13s %13s %13s %13s\n", - "ID", "pos_x", "pos_y", "pos_z", "v_x", "v_y", "v_z", "a_x", "a_y", "a_z", "rho", "rho_dh", - "wcount", "wcount_dh", "dh/dt", "v_sig", "div_v", "curl_vx", "curl_vy", "curl_vz", "dS/dt"); - fprintf(file,"\nPARTICLES BEFORE INTERACTION:\n"); - fclose(file); -} - -/* - * @brief Calls the serial and vectorised version of the non-symmetrical density interaction. - * - * @param parts Particle array to be interacted - * @param count No. of particles to be interacted - * - */ -void test_interactions(struct part *parts, int count, serial_interaction serial_inter_func, vec_interaction vec_inter_func, char *filePrefix) { - - /* Use the first particle in the array as the one that gets updated. */ - struct part pi = parts[0]; - - FILE *file; - char serial_filename[200] = ""; - char vec_filename[200] = ""; - - strcpy(serial_filename,filePrefix); - strcpy(vec_filename,filePrefix); - sprintf(serial_filename + strlen(serial_filename), "_serial.dat"); - sprintf(vec_filename + strlen(vec_filename), "_vec.dat"); - - write_header(serial_filename); - write_header(vec_filename); - - /* Dump state of particles before serial interaction. */ - dump_indv_particle_fields(serial_filename,&pi); - for(size_t i = 1; i < count; i++) - dump_indv_particle_fields(serial_filename,&parts[i]); - - /* Make copy of pi to be used in vectorised version. */ - struct part pi_vec = pi; - struct part pj_vec[VEC_SIZE]; - for(int i=0; i<VEC_SIZE; i++) - pj_vec[i] = parts[i + 1]; - - float r2q[VEC_SIZE] __attribute__((aligned(sizeof(float) * VEC_SIZE))); - float hiq[VEC_SIZE] __attribute__((aligned(sizeof(float) * VEC_SIZE))); - float hjq[VEC_SIZE] __attribute__((aligned(sizeof(float) * VEC_SIZE))); - float dxq[3 * VEC_SIZE] __attribute__((aligned(sizeof(float) * VEC_SIZE))); - struct part *piq[VEC_SIZE], *pjq[VEC_SIZE]; - - /* Perform serial interaction */ - for(int i=1; i<count; i++) { - /* Compute the pairwise distance. */ - float r2 = 0.0f; - float dx[3]; - for (int k = 0; k < 3; k++) { - dx[k] = pi.x[k] - parts[i].x[k]; - r2 += dx[k] * dx[k]; - } - - serial_inter_func(r2, dx, pi.h, parts[i].h, &pi, &parts[i]); - } - - file = fopen(serial_filename, "a"); - fprintf(file,"\nPARTICLES AFTER INTERACTION:\n"); - fclose(file); - - /* Dump result of serial interaction. */ - dump_indv_particle_fields(serial_filename,&pi); - for(size_t i = 1; i < count; i++) - dump_indv_particle_fields(serial_filename,&parts[i]); - - /* Setup arrays for vector interaction. */ - for(int i=0; i<VEC_SIZE; i++) { - /* Compute the pairwise distance. */ - float r2 = 0.0f; - float dx[3]; - for (int k = 0; k < 3; k++) { - dx[k] = pi_vec.x[k] - pj_vec[i].x[k]; - r2 += dx[k] * dx[k]; - } - r2q[i] = r2; - dxq[3 * i + 0] = dx[0]; - dxq[3 * i + 1] = dx[1]; - dxq[3 * i + 2] = dx[2]; - hiq[i] = pi_vec.h; - hjq[i] = pj_vec[i].h; - piq[i] = &pi_vec; - pjq[i] = &pj_vec[i]; - } - - /* Dump state of particles before vector interaction. */ - dump_indv_particle_fields(vec_filename,piq[0]); - for(size_t i = 0; i < VEC_SIZE; i++) - dump_indv_particle_fields(vec_filename,pjq[i]); - - /* Perform vector interaction. */ - vec_inter_func(r2q, dxq, hiq, hjq, piq, pjq); - - file = fopen(vec_filename, "a"); - fprintf(file,"\nPARTICLES AFTER INTERACTION:\n"); - fclose(file); - - /* Dump result of serial interaction. */ - dump_indv_particle_fields(vec_filename,piq[0]); - for(size_t i = 0; i < VEC_SIZE; i++) - dump_indv_particle_fields(vec_filename,pjq[i]); -} - -/* And go... */ -int main(int argc, char *argv[]) { - double h = 1.2348, spacing = 0.5; - double offset[3] = {0.0,0.0,0.0}; - int count = VEC_SIZE + 1; - - /* Get some randomness going */ - srand(0); - - char c; - while ((c = getopt(argc, argv, "s:h:")) != -1) { - switch (c) { - case 'h': - sscanf(optarg, "%lf", &h); - break; - case 's': - sscanf(optarg, "%lf", &spacing); - break; - case '?': - error("Unknown option."); - break; - } - } - - if (h < 0 || spacing < 0) { - printf( - "\nUsage: %s [OPTIONS...]\n" - "\nGenerates a particle array with equal particle separation." - "\nThese are then interacted using runner_iact_density and runner_iact_vec_density." - "\n\nOptions:" - "\n-h DISTANCE=1.2348 - Smoothing length in units of <x>" - "\n-s spacing - Spacing between particles", - argv[0]); - exit(1); - } - - /* Build the infrastructure */ - static long long partId = 0; - struct part *density_particles = make_particles(count,offset,spacing,h,&partId); - struct part *force_particles = make_particles(count,offset,spacing,h,&partId); - prepare_force(force_particles); - - /* Define which interactions to call */ - serial_interaction serial_inter_func = &runner_iact_nonsym_density; - vec_interaction vec_inter_func = &runner_iact_nonsym_vec_density; - - /* Call the non-sym density test. */ - test_interactions(density_particles,count,serial_inter_func,vec_inter_func,"test_nonsym_density"); - - density_particles = make_particles(count,offset,spacing,h,&partId); - - /* Re-assign function pointers. */ - serial_inter_func = &runner_iact_density; - vec_inter_func = &runner_iact_vec_density; - - /* Call the symmetrical density test. */ - test_interactions(density_particles,count,serial_inter_func,vec_inter_func,"test_sym_density"); - - /* Re-assign function pointers. */ - serial_inter_func = &runner_iact_nonsym_force; - vec_inter_func = &runner_iact_nonsym_vec_force; - - /* Call the test non-sym force test. */ - test_interactions(force_particles,count,serial_inter_func,vec_inter_func,"test_nonsym_force"); - - force_particles = make_particles(count,offset,spacing,h,&partId); - prepare_force(force_particles); - - /* Re-assign function pointers. */ - serial_inter_func = &runner_iact_force; - vec_inter_func = &runner_iact_vec_force; - - /* Call the test symmetrical force test. */ - test_interactions(force_particles,count,serial_inter_func,vec_inter_func,"test_sym_force"); - - return 0; -}