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