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