137 lines
3.1 KiB
C
137 lines
3.1 KiB
C
#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 <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
// 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 */
|