/* IMPORTANT! This code is partially taken from GSL, so everything must be GPL'd * or this has to be rewritten (or removed; the only reason to use this are problems * with OpenBLAS) when distributed. */ #include "qpmsblas.h" #include #include #include void cblas_xerbla (int p, const char *rout, const char *form, ...) { va_list ap; va_start (ap, form); if (p) { fprintf (stderr, "Parameter %d to routine %s was incorrect\n", p, rout); } vfprintf (stderr, form, ap); va_end (ap); abort (); } #define BASE double #define INDEX QPMS_BLAS_INDEX_T #define OFFSET(N, incX) ((incX) > 0 ? 0 : ((N) - 1) * (-(incX))) #define BLAS_ERROR(x) cblas_xerbla(0, __FILE__, x); #define MAX(x,y) (((x) < (y)) ? (y) : (x)) #define CONJUGATE(x) ((x) == CblasConjTrans) #define TRANSPOSE(x) ((x) == CblasTrans || (x) == CblasConjTrans) #define UPPER(x) ((x) == CblasUpper) #define LOWER(x) ((x) == CblasLower) /* Handling of packed complex types... */ #define REAL(a,i) (((BASE *) a)[2*(i)]) #define IMAG(a,i) (((BASE *) a)[2*(i)+1]) #define REAL0(a) (((BASE *)a)[0]) #define IMAG0(a) (((BASE *)a)[1]) #define CONST_REAL(a,i) (((const BASE *) a)[2*(i)]) #define CONST_IMAG(a,i) (((const BASE *) a)[2*(i)+1]) #define CONST_REAL0(a) (((const BASE *)a)[0]) #define CONST_IMAG0(a) (((const BASE *)a)[1]) #define GB(KU,KL,lda,i,j) ((KU+1+(i-j))*lda + j) #define TRCOUNT(N,i) ((((i)+1)*(2*(N)-(i)))/2) /* #define TBUP(N,i,j) */ /* #define TBLO(N,i,j) */ #define TPUP(N,i,j) (TRCOUNT(N,(i)-1)+(j)-(i)) #define TPLO(N,i,j) (((i)*((i)+1))/2 + (j)) /* check if CBLAS_ORDER is correct */ #define CHECK_ORDER(pos,posIfError,order) \ if(((order)!=CblasRowMajor)&&((order)!=CblasColMajor)) \ pos = posIfError; /* check if CBLAS_TRANSPOSE is correct */ #define CHECK_TRANSPOSE(pos,posIfError,Trans) \ if(((Trans)!=CblasNoTrans)&&((Trans)!=CblasTrans)&&((Trans)!=CblasConjTrans)) \ pos = posIfError; /* check if a dimension argument is correct */ #define CHECK_DIM(pos,posIfError,dim) \ if((dim)<0) \ pos = posIfError; /* cblas_xgemm() */ #define CBLAS_ERROR_GEMM(pos,Order,TransA,TransB,M,N,K,alpha,A,lda,B,ldb,beta,C,ldc) \ { \ CBLAS_TRANSPOSE __transF=CblasNoTrans,__transG=CblasNoTrans; \ if((Order)==CblasRowMajor) { \ __transF = ((TransA)!=CblasConjTrans) ? (TransA) : CblasTrans; \ __transG = ((TransB)!=CblasConjTrans) ? (TransB) : CblasTrans; \ } else { \ __transF = ((TransB)!=CblasConjTrans) ? (TransB) : CblasTrans; \ __transG = ((TransA)!=CblasConjTrans) ? (TransA) : CblasTrans; \ } \ CHECK_ORDER(pos,1,Order); \ CHECK_TRANSPOSE(pos,2,TransA); \ CHECK_TRANSPOSE(pos,3,TransB); \ CHECK_DIM(pos,4,M); \ CHECK_DIM(pos,5,N); \ CHECK_DIM(pos,6,K); \ if((Order)==CblasRowMajor) { \ if(__transF==CblasNoTrans) { \ if((lda)