#include "vectors.h" #include #include #include #include #include #include #include #include using namespace std; inline CCTK_REAL my_sgn(CCTK_REAL const x) { return x == (CCTK_REAL)0.0 ? (CCTK_REAL)0.0 : copysign((CCTK_REAL)1.0, x); } #define SCALARTEST(testname, vecexpr, scalarexpr) \ do { \ if (verbose) { \ CCTK_VInfo(CCTK_THORNSTRING, "Test %s...", testname); \ fflush(stdout); \ } \ CCTK_REAL const res = (scalarexpr); \ CCTK_REAL const vecres = (vecexpr); \ CCTK_REAL const eps = numeric_limits::epsilon(); \ if ((fabs(vecres - res) <= 10*eps) or \ (isnan(vecres) and isnan(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); \ fflush(stdout); \ } \ CCTK_REAL_VEC rv = (vecexpr); \ for (int i=0; i::epsilon(); \ if ((fabs(vecres - res) <= 10*eps) or \ (isnan(vecres) and isnan(res))) \ { \ passed++; \ } else { \ CCTK_VParamWarn(CCTK_THORNSTRING, \ "Failed test %s: " \ "for element %d, expected %.17g, received %.17g", \ testname, i, (double)res, (double)vecres); \ } \ numtests++; \ } \ } while(0) #define VECBITTEST(testname, vecexpr, scalarexpr) \ do { \ if (verbose) { \ CCTK_VInfo(CCTK_THORNSTRING, "Test %s...", testname); \ fflush(stdout); \ } \ CCTK_BOOLEAN_VEC rv = (vecexpr); \ for (int i=0; i=1 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("kacos", kacos(xv), acos(x[i]) ); VECTEST("kacosh", kacosh(zv), acosh(z[i]) ); VECTEST("kasin", kasin(xv), asin(x[i]) ); VECTEST("kasinh", kasinh(xv), asinh(x[i]) ); VECTEST("katan", katan(xv), atan(x[i]) ); VECTEST("katan2", katan2(xv, yv), atan2(x[i], y[i]) ); VECTEST("katanh", katanh(xv), atanh(x[i]) ); VECTEST("kcopysign", kcopysign(xv, yv), copysign(x[i], y[i])); VECTEST("kcos", kcos(xv), cos(x[i]) ); VECTEST("kcosh", kcosh(xv), cosh(x[i]) ); VECTEST("kexp", kexp(xv), exp(x[i]) ); VECTEST("kfabs", kfabs(xv), fabs(x[i]) ); VECTEST("kfmax", kfmax(xv, yv), fmax(x[i], y[i]) ); VECTEST("kfmin", kfmin(xv, yv), fmin(x[i], y[i]) ); VECTEST("kfnabs", kfnabs(xv), -fabs(x[i]) ); VECTEST("klog", klog(yv), log(y[i]) ); VECTEST("kpow", kpow(yv, x[0]), pow(y[i], x[0]) ); VECTEST("ksin", ksin(xv), sin(x[i]) ); VECTEST("ksinh", ksinh(xv), sinh(x[i]) ); VECTEST("ksgn", ksgn(xv), my_sgn(x[i]) ); VECTEST("ksqrt", ksqrt(yv), sqrt(y[i]) ); VECTEST("ktan", ktan(xv), tan(x[i]) ); VECTEST("ktanh", ktanh(xv), tanh(x[i]) ); #if 0 VECTEST("kifpos positive", kifpos(av, bv, cv), CCTK_SIGNBIT(a[i]) ? c[i] : b[i]); VECTEST("kifpos negative", kifpos(bv, bv, cv), CCTK_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), CCTK_SIGNBIT(a[i]) ? b[i] : c[i]); VECTEST("kifneg negative", kifneg(bv, bv, cv), CCTK_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]); #endif CCTK_BOOLEAN klfalse1 = vec_eltb(klfalse, 0); CCTK_BOOLEAN kltrue1 = vec_eltb(kltrue , 0); VECBITTEST("constant F", klfalse, klfalse1); VECBITTEST("constant T", kltrue , kltrue1 ); VECBITTEST("klnot F", klnot(klfalse), kltrue1 ); VECBITTEST("klnot T", klnot(kltrue ), klfalse1); VECBITTEST("kland FF", kland(klfalse,klfalse), klfalse1); VECBITTEST("kland FT", kland(klfalse,kltrue ), klfalse1); VECBITTEST("kland TF", kland(kltrue ,klfalse), klfalse1); VECBITTEST("kland TT", kland(kltrue ,kltrue ), kltrue1 ); VECBITTEST("klor FF", klor(klfalse,klfalse), klfalse1); VECBITTEST("klor FT", klor(klfalse,kltrue ), kltrue1 ); VECBITTEST("klor TF", klor(kltrue ,klfalse), kltrue1 ); VECBITTEST("klor TT", klor(kltrue ,kltrue ), kltrue1 ); VECBITTEST("klxor FF", klxor(klfalse,klfalse), klfalse1); VECBITTEST("klxor FT", klxor(klfalse,kltrue ), kltrue1 ); VECBITTEST("klxor TF", klxor(kltrue ,klfalse), kltrue1 ); VECBITTEST("klxor TT", klxor(kltrue ,kltrue ), klfalse1); VECTEST("kifthen F", kifthen(klfalse,av,bv), b[i]); VECTEST("kifthen T", kifthen(kltrue ,av,bv), a[i]); VECBITTEST("kcmpeq", kcmpeq(av,bv), a[i]==b[i]?kltrue1:klfalse1); VECBITTEST("kcmpne", kcmpne(av,bv), a[i]!=b[i]?kltrue1:klfalse1); VECBITTEST("kcmpgt", kcmpgt(av,bv), a[i]> b[i]?kltrue1:klfalse1); VECBITTEST("kcmpge", kcmpge(av,bv), a[i]>=b[i]?kltrue1:klfalse1); VECBITTEST("kcmplt", kcmplt(av,bv), a[i]< b[i]?kltrue1:klfalse1); VECBITTEST("kcmple", kcmple(av,bv), a[i]<=b[i]?kltrue1:klfalse1); CCTK_VInfo(CCTK_THORNSTRING, "%d/%d tests passed ", passed, numtests); if (passed != numtests) { CCTK_VWarn(CCTK_WARN_ALERT, __LINE__, __FILE__, CCTK_THORNSTRING, "Failed %d correctness tests", numtests - passed); } }