#include "cctk.h" #include "cctk_Arguments.h" #include "cctk_Parameters.h" #include "vectors.h" #include #include inline int my_signbit (CCTK_REAL const x) { using namespace std; return signbit(x); } #define SCALARTEST(testname, vecexpr, scalarexpr) \ do { \ if (verbose) \ CCTK_VInfo (CCTK_THORNSTRING, "Test %s...", testname); \ CCTK_REAL res = (scalarexpr); \ CCTK_REAL vecres = (vecexpr); \ if(vecres == res) \ passed++; \ else \ CCTK_VParamWarn(CCTK_THORNSTRING, \ "Failed test %s: expected %.17g, received %.17g", \ testname, (double)res, (double)vecres); \ numtests++; \ } while(0) #define VECTEST(testname, vecexpr, scalarexpr) \ do { \ if (verbose) \ CCTK_VInfo (CCTK_THORNSTRING, "Test %s...", testname); \ CCTK_REAL_VEC rv = (vecexpr); \ for(int i=0; i=ilo and i=CCTK_REAL_VEC_SIZE-d ? b[i] : a[i]); } for (int dlo=1; dlo=CCTK_REAL_VEC_SIZE-dhi ? b[i] : 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("kcos", kcos(av), cos(a[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("ksin", ksin(av), sin(a[i]) ); VECTEST("ksqrt", ksqrt(av), sqrt(a[i]) ); VECTEST("ktan", ktan(av), tan(a[i]) ); VECTEST("kifpos positive", kifpos(av, bv, cv), my_signbit(a[i]) ? c[i] : b[i]); VECTEST("kifpos negative", kifpos(bv, bv, cv), my_signbit(b[i]) ? c[i] : b[i]); VECTEST("kifpos 0", kifpos(vec_set1(0.),bv,cv), b[i]); VECTEST("kifpos -0", kifpos(vec_set1(-0.),bv,cv), c[i]); VECTEST("kifneg positive", kifneg(av, bv, cv), my_signbit(a[i]) ? b[i] : c[i]); VECTEST("kifneg negative", kifneg(bv, bv, cv), my_signbit(b[i]) ? b[i] : c[i]); VECTEST("kifneg 0", kifneg(vec_set1(0.),bv,cv), c[i]); VECTEST("kifneg -0", kifneg(vec_set1(-0.),bv,cv), b[i]); if (passed != numtests) CCTK_VWarn(CCTK_WARN_ALERT, __LINE__, __FILE__, CCTK_THORNSTRING, "Failed %d correctness tests", numtests - passed); else CCTK_VInfo(CCTK_THORNSTRING, "%d/%d tests passed ", passed, numtests); return; }