aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsvn_bwardell <svn_bwardell@105869f7-3296-0410-a4ea-f4349344b45a>2011-08-07 12:40:58 +0000
committersvn_bwardell <svn_bwardell@105869f7-3296-0410-a4ea-f4349344b45a>2011-08-07 12:40:58 +0000
commit05a54ba38745d7130141e2d606ca5068b18d90fd (patch)
treecc439d8b48c6d6d915ac8fddea7b7192526938fc
parent80a618b99cf4ad7e0c4ac06645486ac9c0e71c4f (diff)
Add code to test vectorisation macros.
This is conditionally run dependent on the "tests" parameter which can take the values "report", "abort" or "skip". The default is "skip" which causes the tests not to run. git-svn-id: https://svn.cct.lsu.edu/repos/numrel/LSUThorns/Vectors/trunk@18 105869f7-3296-0410-a4ea-f4349344b45a
-rw-r--r--param.ccl7
-rw-r--r--schedule.ccl8
-rw-r--r--src/make.code.defn2
-rw-r--r--src/test.c84
4 files changed, 100 insertions, 1 deletions
diff --git a/param.ccl b/param.ccl
index dc5d37e..f785af9 100644
--- a/param.ccl
+++ b/param.ccl
@@ -1 +1,8 @@
# Parameter definitions for thorn Vectors
+
+KEYWORD tests "Whether to run correctness tests on startup."
+{
+ "report" :: "Run tests and report any which fail."
+ "abort" :: "Run tests and abort if any fail."
+ "skip" :: "Don't run tests."
+} "skip" \ No newline at end of file
diff --git a/schedule.ccl b/schedule.ccl
index 7da984f..d6c06a9 100644
--- a/schedule.ccl
+++ b/schedule.ccl
@@ -4,3 +4,11 @@ schedule Vectors_Startup at CCTK_STARTUP
{
LANG: C
} "Print startup message"
+
+if (CCTK_EQUALS(tests, "report") || CCTK_EQUALS(tests, "abort"))
+{
+ schedule Vectors_Test at CCTK_PARAMCHECK
+ {
+ LANG: C
+ } "Run correctness tests."
+}
diff --git a/src/make.code.defn b/src/make.code.defn
index 15ba9a9..dea6494 100644
--- a/src/make.code.defn
+++ b/src/make.code.defn
@@ -1,7 +1,7 @@
# Main make.code.defn file for thorn Vectors
# Source files in this directory
-SRCS = vectors.c
+SRCS = vectors.c test.c
# Subdirectories containing source files
SUBDIRS =
diff --git a/src/test.c b/src/test.c
new file mode 100644
index 0000000..6b95516
--- /dev/null
+++ b/src/test.c
@@ -0,0 +1,84 @@
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+#include "vectors.h"
+#include <math.h>
+
+#define VECTEST(testname, vecexpr, scalarexpr) \
+{ \
+ CCTK_REAL_VEC rv = vecexpr; \
+ for(int i=0; i<CCTK_REAL_VEC_SIZE; i++) { \
+ CCTK_REAL res = scalarexpr; \
+ CCTK_REAL vecres = vec_elt(rv,i); \
+ if(vecres == res) \
+ passed++; \
+ else \
+ CCTK_VWarn(warnlevel, __LINE__, __FILE__, \
+ CCTK_THORNSTRING, "Failed test %s", testname); \
+ numtests++; \
+ } \
+}
+
+void Vectors_Test(CCTK_ARGUMENTS)
+{
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ int warnlevel;
+ if (CCTK_EQUALS(tests, "abort"))
+ warnlevel = CCTK_WARN_ABORT;
+ else
+ warnlevel = CCTK_WARN_ALERT;
+
+ CCTK_INT passed = 0, numtests=0;
+
+ CCTK_REAL a[CCTK_REAL_VEC_SIZE];
+ CCTK_REAL b[CCTK_REAL_VEC_SIZE];
+ CCTK_REAL c[CCTK_REAL_VEC_SIZE];
+
+ for(int i=0; i<CCTK_REAL_VEC_SIZE; i++) {
+ a[i] = (i+1)*1.23456789;
+ b[i] = -(i+1)*9.87654321;
+ c[i] = (i+1)*1.01010101;
+ }
+
+ CCTK_REAL_VEC av = vec_loadu(a[0]);
+ CCTK_REAL_VEC bv = vec_loadu(b[0]);
+ CCTK_REAL_VEC cv = vec_loadu(c[0]);
+ CCTK_REAL_VEC rv = vec_loadu(c[0]);
+
+ /* TODO: Add individual tests for vec_set1, vec_set, vec_elt0, vec_elt
+ vec_load, vec_loadu, vec_loadu_maybe, vec_loadu_maybe3
+ vec_store, vec_store_nta, vec_store_nta_partial_lo,
+ vec_store_nta_partial_hi, vec_store_nta_partial_mid */
+
+ VECTEST("kpos", kpos(av), +a[i] );
+ VECTEST("kneg", kneg(av), -a[i] );
+
+ VECTEST("kadd", kadd(av, bv), a[i] + b[i] );
+ VECTEST("ksub", ksub(av, bv), a[i] - b[i] );
+ VECTEST("kmul", kmul(av, bv), a[i] * b[i] );
+ VECTEST("kdiv", kdiv(av, bv), a[i] / b[i] );
+
+ VECTEST("kmadd", kmadd(av, bv, cv), a[i] * b[i] + c[i] );
+ VECTEST("kmsub", kmsub(av, bv, cv), a[i] * b[i] - c[i] );
+ VECTEST("knmadd", knmadd(av, bv, cv), -a[i] * b[i] - c[i] );
+ VECTEST("knmsub", knmsub(av, bv, cv), -a[i] * b[i] + c[i] );
+
+ VECTEST("kexp", kexp(av), exp(a[i]) );
+ VECTEST("kfabs", kfabs(av), fabs(a[i]) );
+ VECTEST("kfmax", kfmax(av, bv), fmax(a[i], b[i]) );
+ VECTEST("kfmin", kfmin(av, bv), fmin(a[i], b[i]) );
+ VECTEST("kfnabs", kfnabs(av), -fabs(a[i]) );
+ VECTEST("klog", klog(av), log(a[i]) );
+ VECTEST("kpow", kpow(av, 3.14159), pow(a[i], 3.14159) );
+ VECTEST("ksqrt", ksqrt(av), sqrt(a[i]) );
+
+ VECTEST("kifthen positive", kifthen(av, bv, cv), signbit(a[i]) ? c[i] : b[i]);
+ VECTEST("kifthen negative", kifthen(bv, bv, cv), signbit(b[i]) ? c[i] : b[i]);
+ VECTEST("kifthen 0", kifthen(ToReal(0.),bv,cv), signbit(0.)?c[i]:b[i]);
+ VECTEST("kifthen -0", kifthen(ToReal(-0.),bv,cv), signbit(-0.)?c[i]:b[i]);
+
+ CCTK_VInfo(CCTK_THORNSTRING, "%d/%d tests passed ", passed, numtests);
+ return;
+}