diff --git a/examples/Makefile.am b/examples/Makefile.am index 5c78937fe684e8864c92f147e46375f261dc92e8..4b83d0d56a4ed809dc051dd935f3e18e4a229b99 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -25,7 +25,7 @@ AM_CFLAGS = -g -Wall -Werror -I../src $(OPENMP_CFLAGS) -DCPU_TPS=2.67e9 AM_LDFLAGS = # Set-up the library -bin_PROGRAMS = test test_fixed +bin_PROGRAMS = test test_fixed test_single # Sources for test test_SOURCES = test.c @@ -37,3 +37,8 @@ test_fixed_SOURCES = test.c test_fixed_CFLAGS = -DCOUNTER -DTIMER $(AM_CFLAGS) -DENGINE_POLICY="engine_policy_fixdt | engine_policy_keep" test_fixed_LDADD = ../src/.libs/libswiftsim.a $(HDF5_LDFLAGS) +# Sources for test_single +test_single_SOURCES = test_single.c +test_single_CFLAGS = -DCOUNTER -DTIMER $(AM_CFLAGS) +test_single_LDADD = ../src/.libs/libswiftsim.a $(HDF5_LDFLAGS) + diff --git a/examples/test_single.c b/examples/test_single.c new file mode 100644 index 0000000000000000000000000000000000000000..895fd4cf31cfde621f9bc688ae7c91f808649918 --- /dev/null +++ b/examples/test_single.c @@ -0,0 +1,109 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Coypright (c) 2012 Pedro Gonnet (pedro.gonnet@durham.ac.uk), + * 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/>. + * + ******************************************************************************/ + +/* Config parameters. */ +#include "../config.h" + +/* Some standard headers. */ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <pthread.h> +#include <math.h> +#include <float.h> +#include <limits.h> +#include <fenv.h> +#include <omp.h> + +/* Conditional headers. */ +#ifdef HAVE_LIBZ + #include <zlib.h> +#endif + +/* Local headers. */ +#include "swift.h" + +/* Ticks per second on this machine. */ +#ifndef CPU_TPS + #define CPU_TPS 2.67e9 +#endif + +/* Engine policy flags. */ +#ifndef ENGINE_POLICY + #define ENGINE_POLICY engine_policy_none +#endif + +/* Error macro. */ +#define error(s) { printf( "%s:%s:%i: %s\n" , __FILE__ , __FUNCTION__ , __LINE__ , s ); abort(); } + + +/** + * @brief Main routine that loads a few particles and generates some output. + * + */ + +int main ( int argc , char *argv[] ) { + + int k, N = 100; + struct part p1, p2; + float r2, dx[3] = { 0.0f , 0.0f , 0.0f }; + + /* Init the particles. */ + for ( k = 0 ; k < 3 ; k++ ) { + p1.a[k] = 0.0f; p1.v[k] = 0.0f; p1.x[k] = 0.0; + p2.a[k] = 0.0f; p2.v[k] = 0.0f; p2.x[k] = 0.0; + } + p1.rho = 1.0f; p1.mass = 9.7059e-4; p1.h = 0.222871287; + p2.rho = 1.0f; p2.mass = 9.7059e-4; p2.h = 0.222871287; + p1.force.c = 0.0f; p1.force.balsara = 0.0f; + p2.force.c = 0.0f; p2.force.balsara = 0.0f; + p1.u = 1.e-5 / ((const_gamma - 1.)*p1.rho); + p2.u = 1.e-5 / ((const_gamma - 1.)*p2.rho) + 100.0f / ( 33 * p2.mass ); + p1.force.POrho2 = p1.u * ( const_gamma - 1.0f ) / p1.rho; + p2.force.POrho2 = p2.u * ( const_gamma - 1.0f ) / p2.rho; + + /* Dump a header. */ + printf( "# r a_1 udt_1 a_2 udt_2\n" ); + + /* Loop over the different radii. */ + for ( k = 1 ; k <= N ; k++ ) { + + /* Set the distance/radius. */ + dx[0] = -((float)k)/N * fmaxf( p1.h , p2.h ); + r2 = dx[0]*dx[0]; + + /* Clear the particle fields. */ + p1.a[0] = 0.0f; p1.force.u_dt = 0.0f; + p2.a[0] = 0.0f; p2.force.u_dt = 0.0f; + + /* Interact the particles. */ + runner_iact_force( r2 , dx , p1.h , p2.h , &p1 , &p2 ); + + /* Output the results. */ + printf( "%.3e %.3e %.3e %.3e %.3e\n" , + -dx[0] , p1.a[0] , p1.force.u_dt , p2.a[0] , p2.force.u_dt ); + + } /* loop over radii. */ + + /* All is calm, all is bright. */ + return 0; + + }