Actual source code: petscblaslapack.h

  1: /* $Id: petscblaslapack.h,v 1.42 2001/03/27 22:21:08 balay Exp $ */
  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.

  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.

 11: */
 12: #if !defined(_BLASLAPACK_H)
 13: #define _BLASLAPACK_H

 15: #include "petsc.h"


 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

 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

 39: #if !defined(PETSC_USE_COMPLEX)

 41: /*
 42:     These are real case with no character string arguments
 43: */

 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

 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

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

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

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

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

295: #endif

297: EXTERN_C_BEGIN

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*);

313: #if defined(PETSC_USES_CPTOFCD)

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

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*);

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

376: EXTERN_C_END

378: #endif