#ifndef TEST_H #define TEST_H #include "../config.h" #include "config.h" #if BLAS_UNDERSCORE #define BLAS(routine) routine ## _ #else #define BLAS(routine) routine #endif #if LAPACK_UNDERSCORE #define LAPACK(routine) routine ## _ #else #define LAPACK(routine) routine #endif #include "../inc/relapack.h" #include "lapack.h" #include "util.h" #include #include #include // some name mangling macros #define CAT(A, B) A ## B #define XCAT(A, B) CAT(A, B) #define XLAPACK(X) LAPACK(X) #define XRELAPACK(X) XCAT(RELAPACK_, X) #define STR(X) #X #define XSTR(X) STR(X) // default setup and error computation names: pre() and post() #define PRE pre #define POST post // TEST macro: // run setup (pre()), ReLAPACK routine (i = 0), LAPACK routine (i = 1), compute // error (post()), check error bound, and print setup and error #define TEST(...) \ PRE(); \ i = 0; \ XRELAPACK(ROUTINE)(__VA_ARGS__); \ i = 1; \ XLAPACK(ROUTINE)(__VA_ARGS__); \ POST(); \ fail |= error > ERR_BOUND; \ printf("%s(%s)\t%g\n", XSTR(ROUTINE), #__VA_ARGS__, error); // generalized datatype treatment: DT_PREFIX determines the type s, d, c, or z #define XPREF(A) XCAT(DT_PREFIX, A) // matrix generation and error computation routines #define x2matgen XPREF(2matgen) #define x2vecerr XPREF(2vecerr) // error bounds #define ERR_BOUND XPREF(ERR_BOUND_) #define sERR_BOUND_ SINGLE_ERR_BOUND #define dERR_BOUND_ DOUBLE_ERR_BOUND #define cERR_BOUND_ SINGLE_ERR_BOUND #define zERR_BOUND_ DOUBLE_ERR_BOUND // C datatypes #define datatype XPREF(datatype_) #define sdatatype_ float #define ddatatype_ double #define cdatatype_ float #define zdatatype_ double // number of C datatype elements per element #define x1 XPREF(DT_MULT) #define sDT_MULT 1 #define dDT_MULT 1 #define cDT_MULT 2 #define zDT_MULT 2 // typed allocations #define xmalloc XPREF(malloc) #define imalloc(S) malloc((S) * sizeof(int)) #define smalloc(S) malloc((S) * sizeof(float)) #define dmalloc(S) malloc((S) * sizeof(double)) #define cmalloc(S) malloc((S) * 2 * sizeof(float)) #define zmalloc(S) malloc((S) * 2 * sizeof(double)) // transpositions #define xCTRANS XPREF(CTRANS) #define sCTRANS "T" #define dCTRANS "T" #define cCTRANS "C" #define zCTRANS "C" // some constants #define MONE XPREF(MONE) const float sMONE[] = { -1. }; const double dMONE[] = { -1. }; const float cMONE[] = { -1., 0. }; const double zMONE[] = { -1., 0. }; #define ZERO XPREF(ZERO) const float sZERO[] = { 0. }; const double dZERO[] = { 0. }; const float cZERO[] = { 0., 0. }; const double zZERO[] = { 0., 0. }; #define ONE XPREF(ONE) const float sONE[] = { 1. }; const double dONE[] = { 1. }; const float cONE[] = { 1., 0. }; const double zONE[] = { 1., 0. }; const int iMONE[] = { -1 }; const int iZERO[] = { 0 }; const int iONE[] = { 1 }; const int iTWO[] = { 2 }; const int iTHREE[] = { 3 }; const int iFOUR[] = { 4 }; void tests(); // global variables (used in tests(), pre(), and post()) int i, n, n2, fail; double error; int main(int argc, char* argv[]) { n = TEST_SIZE; n2 = (3 * n) / 4; fail = 0; tests(); return fail; } #endif /* TEST_H */