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