1 /* $Id: petscblaslapack.h,v 1.40 2001/03/26 19:23:43 balay Exp balay $ */ 2 /* 3 This file provides some name space protection from LAPACK and BLAS and 4 allows the appropriate single or double precision version to be used. 5 This file also deals with different Fortran 77 naming conventions on machines. 6 7 Another problem is charactor strings are represented differently on 8 on some machines in C and Fortran 77. This problem comes up on the 9 Cray T3D/T3E. 10 11 */ 12 #if !defined(_BLASLAPACK_H) 13 #define _BLASLAPACK_H 14 15 #include "petsc.h" 16 17 18 #if defined(PETSC_HAVE_MKL) 19 #define PETSC_MISSING_LAPACK_GESVD 20 #define PETSC_MISSING_LAPACK_GEEV 21 #else defined(PETSC_HAVE_CRAYBLAS) 22 #define PETSC_MISSING_LAPACK_GESVD 23 #endif 24 25 /* 26 This include file on the Cray T3D/T3E defines the interface between 27 Fortran and C representations of charactor strings. 28 */ 29 #if defined(PETSC_USES_CPTOFCD) 30 #include <fortran.h> 31 #endif 32 33 #if !defined(PETSC_USE_COMPLEX) 34 35 /* 36 These are real case with no character string arguments 37 */ 38 39 #if defined(PETSC_USES_FORTRAN_SINGLE) 40 /* 41 For these machines we must call the single precision Fortran version 42 */ 43 #define DGEQRF SGEQRF 44 #define DGETRF SGETRF 45 #define DDOT SDOT 46 #define DNRM2 SNRM2 47 #define DSCAL SSCAL 48 #define DCOPY SCOPY 49 #define DSWAP SSWAP 50 #define DAXPY SAXPY 51 #define DASUM SASUM 52 #define DSORMQR SORMQR 53 #define DTRTRS STRTRS 54 #define DPOTRF SPOTRF 55 #define DPOTRS SPOTRS 56 #define DGEMV SGEMV 57 #define DGETRS SGETRS 58 #define DGETRS SGETRS 59 #define DGEMM SGEMM 60 #define DGESVD SGESVD 61 #define DGEEV SGEEV 62 #define DTRMV STRMV 63 #define DTRSL STRSL 64 #endif 65 66 #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE) || defined(PETSC_HAVE_CBLASLAPACK) 67 #define LAgeqrf_ dgeqrf_ 68 #define LAgetrf_ dgetrf_ 69 #define LAgetf2_ dgetf2_ 70 #define BLdot_ ddot_ 71 #define BLnrm2_ dnrm2_ 72 #define BLscal_ dscal_ 73 #define BLcopy_ dcopy_ 74 #define BLswap_ dswap_ 75 #define BLaxpy_ daxpy_ 76 #define BLasum_ dasum_ 77 #elif defined(PETSC_HAVE_FORTRAN_CAPS) 78 #define LAgeqrf_ DGEQRF 79 #define LAgetrf_ DGETRF 80 #define LAgetf2_ DGETF2 81 #define BLdot_ DDOT 82 #define BLnrm2_ DNRM2 83 #define BLscal_ DSCAL 84 #define BLcopy_ DCOPY 85 #define BLswap_ DSWAP 86 #define BLaxpy_ DAXPY 87 #define BLasum_ DASUM 88 #else 89 #define LAgeqrf_ dgeqrf 90 #define LAgetrf_ dgetrf 91 #define LAgetf2_ dgetf2 92 #define BLdot_ ddot 93 #define BLnrm2_ dnrm2 94 #define BLscal_ dscal 95 #define BLcopy_ dcopy 96 #define BLswap_ dswap 97 #define BLaxpy_ daxpy 98 #define BLasum_ dasum 99 #endif 100 101 /* 102 Real with character string arguments. 103 */ 104 #if defined(PETSC_USES_CPTOFCD) 105 /* 106 Note that this assumes that machines which use cptofcd() use 107 the PETSC_HAVE_FORTRAN_CAPS option. This is true on the Cray T3D/T3E. 108 */ 109 #define LAormqr_(a,b,c,d,e,f,g,h,i,j,k,l,m) DORMQR(_cptofcd((a),1),\ 110 _cptofcd((b),1),(c),(d),(e),(f),(g),(h),(i),(j),(k),(l),(m)) 111 #define LAtrtrs_(a,b,c,d,e,f,g,h,i,j) DTRTRS(_cptofcd((a),1),_cptofcd((b),1),\ 112 _cptofcd((c),1),(d),(e),(f),(g),(h),(i),(j)) 113 #define LApotrf_(a,b,c,d,e) DPOTRF(_cptofcd((a),1),(b),(c),(d),(e)) 114 #define LApotrs_(a,b,c,d,e,f,g,h) DPOTRS(_cptofcd((a),1),(b),(c),(d),(e),\ 115 (f),(g),(h)) 116 #define LAgemv_(a,b,c,d,e,f,g,h,i,j,k) DGEMV(_cptofcd((a),1),(b),(c),(d),(e),\ 117 (f),(g),(h),(i),(j),(k)) 118 #define LAgetrs_(a,b,c,d,e,f,g,h,i) DGETRS(_cptofcd((a),1),(b),(c),(d),(e),\ 119 (f),(g),(h),(i)) 120 #define LAgetrs_(a,b,c,d,e,f,g,h,i) DGETRS(_cptofcd((a),1),(b),(c),(d),(e),\ 121 (f),(g),(h),(i)) 122 #define BLgemm_(a,b,c,d,e,f,g,h,i,j,k,l,m) DGEMM(_cptofcd((a),1), \ 123 _cptofcd((a),1),(c),(d),(e),\ 124 (f),(g),(h),(i),(j),(k),(l),(m)) 125 #define LAgesvd_(a,b,c,d,e,f,g,h,i,j,k,l,m,n) DGESVD(_cptofcd((a),1), \ 126 _cptofcd((a),1),(c),(d),(e),\ 127 (f),(g),(h),(i),(j),(k),(l),(m),(n)) 128 #define LAgeev_(a,b,c,d,e,f,g,h,i,j,k,l,m,n) DGEEV(_cptofcd((a),1), \ 129 _cptofcd((a),1),(c),(d),(e),\ 130 (f),(g),(h),(i),(j),(k),(l),(m),(n)) 131 #define LAtrmv_ DTRMV 132 #define LAtrsl_ DTRSL 133 #define LAgetrf_ DGETRF 134 #elif defined(PETSC_HAVE_FORTRAN_UNDERSCORE) || defined(PETSC_HAVE_CBLASLAPACK) 135 #define LAormqr_ dormqr_ 136 #define LAtrtrs_ dtrtrs_ 137 #define LApotrf_ dpotrf_ 138 #define LApotrs_ dpotrs_ 139 #define LAgemv_ dgemv_ 140 #define LAgetrs_ dgetrs_ 141 #define LAtrmv_ dtrmv_ 142 #define LAtrsl_ dtrsl_ 143 #define BLgemm_ dgemm_ 144 #define LAgesvd_ dgesvd_ 145 #define LAgeev_ dgeev_ 146 #elif defined(PETSC_HAVE_FORTRAN_CAPS) 147 #define LAormqr_ DORMQR 148 #define LAtrtrs_ DTRTRS 149 #define LApotrf_ DPOTRF 150 #define LApotrs_ DPOTRS 151 #define LAgemv_ DGEMV 152 #define LAgetrs_ DGETRS 153 #define LAtrmv_ DTRMV 154 #define LAtrsl_ DTRSL 155 #define LAgesvd_ DGESVD 156 #define LAgeev_ DGEEV 157 #define BLgemm_ DGEMM 158 #else 159 #define LAormqr_ dormqr 160 #define LAtrtrs_ dtrtrs 161 #define LApotrf_ dpotrf 162 #define LApotrs_ dpotrs 163 #define LAgemv_ dgemv 164 #define LAgetrs_ dgetrs 165 #define LAtrmv_ dtrmv 166 #define LAtrsl_ dtrsl 167 #define BLgemm_ dgemm 168 #define LAgesvd_ dgesvd 169 #define LAgeev_ dgeev 170 #endif 171 172 #else 173 /* 174 Complex with no character string arguments 175 */ 176 #if defined(PETSC_USES_FORTRAN_SINGLE) 177 #define ZGEQRF CGEQRF 178 #define ZDOTC CDOTC 179 #define DZNRM2 SCNRM2 180 #define ZSCAL CSCAL 181 #define ZCOPY CCOPY 182 #define ZSWAP CSWAP 183 #define ZAXPY CAXPY 184 #define DZASUM SCASUM 185 #define ZGETRF CGETRF 186 #define ZTRTRS CTRTRS 187 #define ZPOTRF CPOTRF 188 #define ZPOTRS CPOTRS 189 #define ZGEMV CGEMV 190 #define ZGETRS CGETRS 191 #define ZGEMM SGEMM 192 #define ZTRMV CTRMV 193 #define ZTRSL CTRSL 194 #define ZGEEV CGEEV 195 #endif 196 197 #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE) || defined(PETSC_HAVE_CBLASLAPACK) 198 #define LAgeqrf_ zgeqrf_ 199 #define LAgetrf_ zgetrf_ 200 #define LAgetf2_ zgetf2_ 201 #define BLdot_ zdotc_ 202 #define BLnrm2_ dznrm2_ 203 #define BLscal_ zscal_ 204 #define BLcopy_ zcopy_ 205 #define BLswap_ zswap_ 206 #define BLaxpy_ zaxpy_ 207 #define BLasum_ dzasum_ 208 #elif defined(PETSC_HAVE_FORTRAN_CAPS) 209 #define LAgeqrf_ ZGEQRF 210 #define BLdot_ ZDOTC 211 #define BLnrm2_ DZNRM2 212 #define BLscal_ ZSCAL 213 #define BLcopy_ ZCOPY 214 #define BLswap_ ZSWAP 215 #define BLaxpy_ ZAXPY 216 #define BLasum_ DZASUM 217 #define LAgetrf_ ZGETRF 218 #else 219 #define LAgeqrf_ zgeqrf 220 #define LAgetrf_ zgetrf 221 #define LAgetf2_ zgetf2 222 #define BLdot_ zdotc 223 #define BLnrm2_ dznrm2 224 #define BLscal_ zscal 225 #define BLcopy_ zcopy 226 #define BLswap_ zswap 227 #define BLaxpy_ zaxpy 228 #define BLasum_ dzasum 229 #endif 230 231 #if defined(PETSC_USES_CPTOFCD) 232 #define LAtrtrs_(a,b,c,d,e,f,g,h,i,j) ZTRTRS(_cptofcd((a),1),_cptofcd((b),1),\ 233 _cptofcd((c),1),(d),(e),(f),(g),(h),(i),(j)) 234 #define LApotrf_(a,b,c,d,e) ZPOTRF(_cptofcd((a),1),(b),(c),(d),(e)) 235 #define LApotrs_(a,b,c,d,e,f,g,h) ZPOTRS(_cptofcd((a),1),(b),(c),(d),(e),\ 236 (f),(g),(h)) 237 #define LAgemv_(a,b,c,d,e,f,g,h,i,j,k) ZGEMV(_cptofcd((a),1),(b),(c),(d),(e),\ 238 (f),(g),(h),(i),(j),(k)) 239 #define LAgetrs_(a,b,c,d,e,f,g,h,i) ZGETRS(_cptofcd((a),1),(b),(c),(d),(e),\ 240 (f),(g),(h),(i)) 241 #define BLgemm_(a,b,c,d,e,f,g,h,i,j,k,l,m) ZGEMM(_cptofcd((a),1), \ 242 _cptofcd((a),1),(c),(d),(e),\ 243 (f),(g),(h),(i),(j),(k),(l),(m)) 244 #define LAgesvd_(a,b,c,d,e,f,g,h,i,j,k,l,m,n,p) ZGESVD(_cptofcd((a),1), \ 245 _cptofcd((a),1),(c),(d),(e),\ 246 (f),(g),(h),(i),(j),(k),(l),(m),(n),(p)) 247 #define LAgeev_(a,b,c,d,e,f,g,h,i,j,k,l,m,n) ZGEEV(_cptofcd((a),1), \ 248 _cptofcd((a),1),(c),(d),(e),\ 249 (f),(g),(h),(i),(j),(k),(l),(m),(n)) 250 #define LAtrmv_ ZTRMV 251 #define LAtrsl_ ZTRSL 252 #elif defined(PETSC_HAVE_FORTRAN_UNDERSCORE) || defined(PETSC_HAVE_CBLASLAPACK) 253 #define LAtrtrs_ ztrtrs_ 254 #define LApotrf_ zpotrf_ 255 #define LApotrs_ zpotrs_ 256 #define LAgemv_ zgemv_ 257 #define LAgetrs_ zgetrs_ 258 #define LAtrmv_ ztrmv_ 259 #define LAtrsl_ ztrsl_ 260 #define BLgemm_ zgemm_ 261 #define LAgesvd_ zgesvd_ 262 #define LAgeev_ zgeev_ 263 #elif defined(PETSC_HAVE_FORTRAN_CAPS) 264 #define LAtrtrs_ ZTRTRS 265 #define LApotrf_ ZPOTRF 266 #define LApotrs_ ZPOTRS 267 #define LAgemv_ ZGEMV 268 #define LAgetrf_ ZGETRF 269 #define LAgetf2_ ZGETF2 270 #define LAgetrs_ ZGETRS 271 #define LAtrmv_ ZTRMV 272 #define LAtrsl_ ZTRSL 273 #define BLgemm_ ZGEMM 274 #define LAgesvd_ ZGESVD 275 #define LAgeev_ ZGEEV 276 #else 277 #define LAtrtrs_ ztrtrs 278 #define LApotrf_ zpotrf 279 #define LApotrs_ zpotrs 280 #define LAgemv_ zgemv 281 #define LAgetrs_ zgetrs 282 #define LAtrmv_ ztrmv 283 #define LAtrsl_ ztrsl 284 #define BLgemm_ zgemm 285 #define LAgesvd_ zgesvd 286 #define LAgeev_ zgeev 287 #endif 288 289 #endif 290 291 EXTERN_C_BEGIN 292 293 /* 294 BLdot cannot be used with COMPLEX because it cannot 295 handle returing a double complex to C++. 296 */ 297 EXTERN double BLdot_(int*,Scalar*,int*,Scalar*,int*); 298 EXTERN double BLnrm2_(int*,Scalar*,int*),BLasum_(int*,Scalar*,int*); 299 EXTERN void BLscal_(int*,Scalar*,Scalar*,int*); 300 EXTERN void BLcopy_(int*,Scalar*,int*,Scalar*,int*); 301 EXTERN void BLswap_(int*,Scalar*,int*,Scalar*,int*); 302 EXTERN void BLaxpy_(int*,Scalar*,Scalar*,int*,Scalar*,int*); 303 EXTERN void LAgetrf_(int*,int*,Scalar*,int*,int*,int*); 304 EXTERN void LAgetf2_(int*,int*,Scalar*,int*,int*,int*); 305 EXTERN void LAgeqrf_(int*,int*,Scalar*,int*,Scalar*,Scalar*,int*,int*); 306 307 #if defined(PETSC_USES_CPTOFCD) 308 309 #if defined(PETSC_USE_COMPLEX) 310 EXTERN void ZPOTRF(_fcd,int*,Scalar*,int*,int*); 311 EXTERN void ZGEMV(_fcd,int*,int*,Scalar*,Scalar*,int*,Scalar *,int*, 312 Scalar*,Scalar*,int*); 313 EXTERN void ZPOTRS(_fcd,int*,int*,Scalar*,int*,Scalar*,int*,int*); 314 EXTERN void ZGETRS(_fcd,int*,int*,Scalar*,int*,int*,Scalar*,int*,int*); 315 EXTERN void ZGEMM(_fcd,_fcd,int*,int*,int*,Scalar*,Scalar*,int*, 316 Scalar*,int*,Scalar*,Scalar*,int*); 317 EXTERN void ZGESVD(_fcd,_fcd,int *,int*,Scalar *,int*,double*,Scalar*, 318 int*,Scalar*,int*,Scalar*,int*,double*,int*); 319 EXTERN void ZGEEV(_fcd,_fcd,int *,Scalar *,int*,Scalar*,Scalar*, 320 int*,Scalar*,int*,Scalar*,int*,double*,int*); 321 #else 322 EXTERN void DPOTRF(_fcd,int*,Scalar*,int*,int*); 323 EXTERN void DGEMV(_fcd,int*,int*,Scalar*,Scalar*,int*,Scalar *,int*, 324 Scalar*,Scalar*,int*); 325 EXTERN void DPOTRS(_fcd,int*,int*,Scalar*,int*,Scalar*,int*,int*); 326 EXTERN void DGETRS(_fcd,int*,int*,Scalar*,int*,int*,Scalar*,int*,int*); 327 EXTERN void DGEMM(_fcd,_fcd,int*,int*,int*,Scalar*,Scalar*,int*, 328 Scalar*,int*,Scalar*,Scalar*,int*); 329 EXTERN void DGESVD(_fcd,_fcd,int *,int*,Scalar *,int*,Scalar*,Scalar*, 330 int*,Scalar*,int*,Scalar*,int*,int*); 331 EXTERN void DGEEV(_fcd,_fcd,int *,Scalar *,int*,Scalar*,Scalar*,Scalar*, 332 int*,Scalar*,int*,Scalar*,int*,int*); 333 #endif 334 335 #else 336 EXTERN void LAormqr_(char*,char*,int*,int*,int*,Scalar*,int*,Scalar*,Scalar*, 337 int*,Scalar*,int*,int*); 338 EXTERN void LAtrtrs_(char*,char*,char*,int*,int*,Scalar*,int*,Scalar*,int*, 339 int*); 340 EXTERN void LApotrf_(char*,int*,Scalar*,int*,int*); 341 EXTERN void LAgemv_(char*,int*,int*,Scalar*,Scalar*,int*,Scalar *,int*, 342 Scalar*,Scalar*,int*); 343 EXTERN void LApotrs_(char*,int*,int*,Scalar*,int*,Scalar*,int*,int*); 344 EXTERN void LAgetrs_(char*,int*,int*,Scalar*,int*,int*,Scalar*,int*,int*); 345 EXTERN void BLgemm_(char *,char*,int*,int*,int*,Scalar*,Scalar*,int*, 346 Scalar*,int*,Scalar*,Scalar*,int*); 347 348 /* ESSL uses a different calling sequence for dgeev(), zgeev() than LAPACK; */ 349 #if defined(PETSC_HAVE_ESSL) && defined(PETSC_USE_COMPLEX) 350 EXTERN void LAgeev_(int*,Scalar*,int*,Scalar*,Scalar*,int*,int*,int*,double*,int*); 351 EXTERN void LAgesvd_(char *,char *,int *,int*,Scalar *,int*,double*,Scalar*, 352 int*,Scalar*,int*,Scalar*,int*,double*,int*); 353 #elif defined(PETSC_HAVE_ESSL) 354 EXTERN void LAgeev_(int*,Scalar*,int*,Scalar*,Scalar*,int*,int*,int*,double*,int*); 355 EXTERN void LAgesvd_(char *,char *,int *,int*,Scalar *,int*,double*,Scalar*, 356 int*,Scalar*,int*,Scalar*,int*,int*); 357 #elif !defined(PETSC_USE_COMPLEX) 358 EXTERN void LAgeev_(char *,char *,int *,Scalar *,int*,double*,double*,Scalar*, 359 int*,Scalar*,int*,Scalar*,int*,int*); 360 EXTERN void LAgesvd_(char *,char *,int *,int*,Scalar *,int*,double*,Scalar*, 361 int*,Scalar*,int*,Scalar*,int*,int*); 362 #else 363 EXTERN void LAgeev_(char *,char *,int *,Scalar *,int*,Scalar*,Scalar*, 364 int*,Scalar*,int*,Scalar*,int*,double*,int*); 365 EXTERN void LAgesvd_(char *,char *,int *,int*,Scalar *,int*,double*,Scalar*, 366 int*,Scalar*,int*,Scalar*,int*,double*,int*); 367 #endif 368 #endif 369 370 EXTERN_C_END 371 372 #endif 373 374 375 376