Hi,
Attached I send the second version (partial, only for level 2 routines with
standard 4 prefixes (S, D, C, Z)). I have used submacros as we discussed in
recent mails. I think that we must pass to submacros the variable 'pos' for
"return" the result and the position 'posIfError' as the "returned" value if
an error occurs.
But we need some trick for check with macros the parameter 'lda', because
the check is different depending on 'order' parameter and involves other
arguments like 'M' and 'N'. Probably, this check must be done explicitly.
--
*****************************************
José Luis García Pallero
[email protected]
(o<
/ / \
V_/_
Use Debian GNU/Linux and enjoy!
*****************************************
/* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef _ERROR_CBLAS_V2_H_
#define _ERROR_CBLAS_V2_H_
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_MAX(a,b) ((a)>(b) ? (a) : (b))
////////////////////////////////////////////////////////////////////////////////
#define CHECK_INT_LONGITUDE(pos,posIfError,data) \
if((data)>MAX_INT) \
(pos) = (posIfError);
////////////////////////////////////////////////////////////////////////////////
#define CHECK_ORDER(pos,posIfError,order) \
if(((order)!=CblasRowMajor)&&((order)!=CblasColMajor)) \
(pos) = (posIfError);
////////////////////////////////////////////////////////////////////////////////
#define CHECK_TRANSPOSE(pos,posIfError,Trans) \
if(((Trans)!=CblasNoTrans)&&((Trans)!=CblasTrans)&&((Trans)!=CblasConjTrans)) \
(pos) = (posIfError);
////////////////////////////////////////////////////////////////////////////////
#define CHECK_UPLO(pos,posIfError,Uplo) \
if(((Uplo)!=CblasUpper)&&((Uplo)!=CblasLower)) \
(pos) = (posIfError);
////////////////////////////////////////////////////////////////////////////////
#define CHECK_DIAG(pos,posIfError,Diag) \
if(((Diag)!=CblasNonUnit)&&((Diag)!=CblasUnit)) \
(pos) = (posIfError);
////////////////////////////////////////////////////////////////////////////////
#define CHECK_SIDE(pos,posIfError,Side) \
if(((Side)!=CblasLeft)&&((Side)!=CblasRight)) \
(pos) = (posIfError);
////////////////////////////////////////////////////////////////////////////////
#define CHECK_DIM(pos,posIfError,dim) \
if((dim)<0) \
(pos) = (posIfError);
////////////////////////////////////////////////////////////////////////////////
#define CHECK_STRIDE(pos,posIfError,stride) \
if((stride)==0) \
(pos) = (posIfError);
////////////////////////////////////////////////////////////////////////////////
/*
* =============================================================================
* Prototypes for level 2 BLAS
* =============================================================================
*/
/*
* Routines with standard 4 prefixes (S, D, C, Z)
*/
#define CBLAS_ERROR_GEMV(pos,order,TransA,M,N,alpha,A,lda,X,incX,beta,Y,incY) \
CHECK_ORDER(pos,1,order); \
CHECK_TRANSPOSE(pos,2,TransA); \
CHECK_DIM(pos,3,M); \
CHECK_DIM(pos,4,N); \
if((order)==CblasRowMajor) { \
if((lda)<CBLAS_MAX(1,(N))) { \
(pos) = 7; \
} \
} else if((order)==CblasColMajor) { \
if((lda)<CBLAS_MAX(1,(M))) { \
(pos) = 7; \
} \
} \
CHECK_STRIDE(pos,9,incX); \
CHECK_STRIDE(pos,12,incY);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_GBMV(pos,order,TransA,M,N,KL,KU,alpha,A,lda,X,incX,beta,Y,incY) \
CHECK_ORDER(pos,1,order); \
CHECK_TRANSPOSE(pos,2,TransA); \
CHECK_DIM(pos,3,M); \
CHECK_DIM(pos,4,N); \
CHECK_DIM(pos,5,KL); \
CHECK_DIM(pos,6,KU); \
if((order)==CblasRowMajor) { \
if((lda)<CBLAS_MAX(1,(N))) { \
(pos) = 9; \
} \
} else if((order)==CblasColMajor) { \
if((lda)<CBLAS_MAX(1,((KL)+(KU)+1))) { \
(pos) = 9; \
} \
} \
CHECK_STRIDE(pos,11,incX); \
CHECK_STRIDE(pos,14,incY);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TRMV(pos,order,Uplo,TransA,Diag,N,A,lda,X,incX) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_TRANSPOSE(pos,3,TransA); \
CHECK_DIAG(pos,4,Diag); \
CHECK_DIM(pos,5,N); \
if((lda)<CBLAS_MAX(1,(N))) \
(pos) = 7; \
CHECK_STRIDE(pos,9,incX);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TBMV(pos,order,Uplo,TransA,Diag,N,K,A,lda,X,incX) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_TRANSPOSE(pos,3,TransA); \
CHECK_DIAG(pos,4,Diag); \
CHECK_DIM(pos,5,N); \
CHECK_DIM(pos,6,K); \
if((order)==CblasRowMajor) { \
if((lda)<CBLAS_MAX(1,(N))) { \
(pos) = 8; \
} \
} else if((order)==CblasColMajor) { \
if((lda)<CBLAS_MAX(1,((K)+1))) { \
(pos) = 8; \
} \
} \
CHECK_STRIDE(pos,10,incX);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TPMV(pos,order,Uplo,TransA,Diag,N,Ap,X,incX) \
CHECK_ORDER(pos,1,order); \
CHECK_UPLO(pos,2,Uplo); \
CHECK_TRANSPOSE(pos,3,TransA); \
CHECK_DIAG(pos,4,Diag); \
CHECK_DIM(pos,5,N); \
CHECK_STRIDE(pos,8,incX);
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TRSV(pos,order,Uplo,TransA,Diag,N,A,lda,X,incX) \
CBLAS_ERROR_TRMV((pos),(order),(Uplo),(TransA),(Diag),(N),(A),(lda),(X),(incX))
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TBSV(pos,order,Uplo,TransA,Diag,N,K,A,lda,X,incX) \
CBLAS_ERROR_TBMV((pos),(order),(Uplo),(TransA),(Diag),(N),(K),(A),(lda),(X),(incX))
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_TPSV(pos,order,Uplo,TransA,Diag,N,Ap,X,incX) \
CBLAS_ERROR_TPMV((pos),(order),(Uplo),(TransA),(Diag),(N),(Ap),(X),(incX))
////////////////////////////////////////////////////////////////////////////////
/*
* Routines with S and D prefixes only
*/
#define CBLAS_ERROR_SD_SYMV(pos,order,Uplo,N,lda,incX,incY) \
(pos) = 0; \
if(((order)!=CblasRowMajor)&&((order)!=CblasColMajor)) { \
(pos) = 1; \
} else if(((Uplo)!=CblasUpper)&&((Uplo)!=CblasLower)) { \
(pos) = 2; \
} else if((N)<0) { \
(pos) = 3; \
} else if((lda)<CBLAS_MAX(1,(N))) { \
(pos) = 6; \
} else if((incX)==0) { \
(pos) = 8; \
} else if((incY)==0) { \
(pos) = 11; \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_SBMV(pos,order,Uplo,N,K,lda,incX,incY) \
(pos) = 0; \
if(((order)!=CblasRowMajor)&&((order)!=CblasColMajor)) { \
(pos) = 1; \
} else if(((Uplo)!=CblasUpper)&&((Uplo)!=CblasLower)) { \
(pos) = 2; \
} else if((N)<0) { \
(pos) = 3; \
} else if((K)<0) { \
(pos) = 4; \
} else if((order)==CblasRowMajor) { \
if((lda)<CBLAS_MAX(1,(N))) { \
(pos) = 7; \
} \
} else if((order)==CblasColMajor) { \
if((lda)<CBLAS_MAX(1,(K+1))) { \
(pos) = 7; \
} \
} else if((incX)==0) { \
(pos) = 9; \
} else if((incY)==0) { \
(pos) = 12; \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_SPMV(pos,order,Uplo,N,incX,incY) \
(pos) = 0; \
if(((order)!=CblasRowMajor)&&((order)!=CblasColMajor)) { \
(pos) = 1; \
} else if(((Uplo)!=CblasUpper)&&((Uplo)!=CblasLower)) { \
(pos) = 2; \
} else if((N)<0) { \
(pos) = 3; \
} else if((incX)==0) { \
(pos) = 7; \
} else if((incY)==0) { \
(pos) = 10; \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_GER(pos,order,M,N,incX,incY,lda) \
(pos) = 0; \
if(((order)!=CblasRowMajor)&&((order)!=CblasColMajor)) { \
(pos) = 1; \
} else if((M)<0) { \
(pos) = 2; \
} else if((N)<0) { \
(pos) = 3; \
} else if((incX)==0) { \
(pos) = 6; \
} else if((incY)==0) { \
(pos) = 8; \
} else if((order)==CblasRowMajor) { \
if((lda)<CBLAS_MAX(1,(N))) { \
(pos) = 10; \
} \
} else if((order)==CblasColMajor) { \
if((lda)<CBLAS_MAX(1,(M))) { \
(pos) = 10; \
} \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_SYR(pos,order,Uplo,N,incX,lda) \
(pos) = 0; \
if(((order)!=CblasRowMajor)&&((order)!=CblasColMajor)) { \
(pos) = 1; \
} else if(((Uplo)!=CblasUpper)&&((Uplo)!=CblasLower)) { \
(pos) = 2; \
} else if((N)<0) { \
(pos) = 3; \
} else if((incX)==0) { \
(pos) = 6; \
} else if((lda)<CBLAS_MAX(1,(N))) { \
(pos) = 8; \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_SPR(pos,order,Uplo,N,incX) \
(pos) = 0; \
if(((order)!=CblasRowMajor)&&((order)!=CblasColMajor)) { \
(pos) = 1; \
} else if(((Uplo)!=CblasUpper)&&((Uplo)!=CblasLower)) { \
(pos) = 2; \
} else if((N)<0) { \
(pos) = 3; \
} else if((incX)==0) { \
(pos) = 6; \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_SYR2(pos,order,Uplo,N,incX,incY,lda) \
(pos) = 0; \
if(((order)!=CblasRowMajor)&&((order)!=CblasColMajor)) { \
(pos) = 1; \
} else if(((Uplo)!=CblasUpper)&&((Uplo)!=CblasLower)) { \
(pos) = 2; \
} else if((N)<0) { \
(pos) = 3; \
} else if((incX)==0) { \
(pos) = 6; \
} else if((incY)==0) { \
(pos) = 8; \
} else if((lda)<CBLAS_MAX(1,(N))) { \
(pos) = 10; \
}
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_SD_SPR2(pos,order,Uplo,N,incX,incY) \
(pos) = 0; \
if(((order)!=CblasRowMajor)&&((order)!=CblasColMajor)) { \
(pos) = 1; \
} else if(((Uplo)!=CblasUpper)&&((Uplo)!=CblasLower)) { \
(pos) = 2; \
} else if((N)<0) { \
(pos) = 3; \
} else if((incX)==0) { \
(pos) = 6; \
} else if((incY)==0) { \
(pos) = 8; \
}
////////////////////////////////////////////////////////////////////////////////
/*
* Routines with C and Z prefixes only
*/
#define CBLAS_ERROR_CZ_HEMV(pos,order,Uplo,N,lda,incX,incY) \
CBLAS_ERROR_SD_SYMV((pos),(order),(Uplo),(N),(lda),(incX),(incY))
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_HBMV(pos,order,Uplo,N,K,lda,incX,incY) \
CBLAS_ERROR_SD_SBMV((pos),(order),(Uplo),(N),(K),(lda),(incX),(incY))
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_HPMV(pos,order,Uplo,N,incX,incY) \
CBLAS_ERROR_SD_SPMV((pos),(order),(Uplo),(N),(incX),(incY))
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_GERU(pos,order,M,N,incX,incY,lda) \
CBLAS_ERROR_SD_GER((pos),(order),(M),(N),(incX),(incY),(lda))
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_GERC(pos,order,M,N,incX,incY,lda) \
CBLAS_ERROR_SD_GER((pos),(order),(M),(N),(incX),(incY),(lda))
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_CHER(pos,order,Uplo,N,incX,lda) \
CBLAS_ERROR_SD_SYR((pos),(order),(Uplo),(N),(incX),(lda))
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_HPR(pos,order,Uplo,N,incX) \
CBLAS_ERROR_SD_SPR((pos),(order),(Uplo),(N),(incX))
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_HER2(pos,order,Uplo,N,incX,incY,lda) \
CBLAS_ERROR_SD_SYR2((pos),(order),(Uplo),(N),(incX),(incY),(lda))
////////////////////////////////////////////////////////////////////////////////
#define CBLAS_ERROR_CZ_HPR2(pos,order,Uplo,N,incX,incY) \
CBLAS_ERROR_SD_SPR2((pos),(order),(Uplo),(N),(incX),(incY))
////////////////////////////////////////////////////////////////////////////////
#endif
_______________________________________________
Help-gsl mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/help-gsl