xref: /petsc/include/petscblaslapack.h (revision 31ebf83b143a7d902b0dcf36a56ecde1995f6b58)
1 /* $Id: petscblaslapack.h,v 1.49 2001/08/07 14:56:33 bsmith Exp bsmith $ */
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_USE_SINGLE)
80 
81 #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE) || defined(PETSC_BLASLAPACK_F2C)
82 #define LAgeqrf_ sgeqrf_
83 #define LAgetrf_ sgetrf_
84 #define LAgetf2_ sgetf2_
85 #define BLdot_   sdot_
86 #define BLnrm2_  snrm2_
87 #define BLscal_  sscal_
88 #define BLcopy_  scopy_
89 #define BLswap_  sswap_
90 #define BLaxpy_  saxpy_
91 #define BLasum_  sasum_
92 #elif defined(PETSC_HAVE_FORTRAN_CAPS)
93 #define LAgeqrf_ SGEQRF
94 #define LAgetrf_ SGETRF
95 #define LAgetf2_ SGETF2
96 #define BLdot_   SDOT
97 #define BLnrm2_  SNRM2
98 #define BLscal_  SSCAL
99 #define BLcopy_  SCOPY
100 #define BLswap_  SSWAP
101 #define BLaxpy_  SAXPY
102 #define BLasum_  SASUM
103 #else
104 #define LAgeqrf_ sgeqrf
105 #define LAgetrf_ sgetrf
106 #define LAgetf2_ sgetf2
107 #define BLdot_   sdot
108 #define BLnrm2_  snrm2
109 #define BLscal_  sscal
110 #define BLcopy_  scopy
111 #define BLswap_  sswap
112 #define BLaxpy_  saxpy
113 #define BLasum_  sasum
114 #endif
115 
116 #else
117 
118 #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE) || defined(PETSC_BLASLAPACK_F2C)
119 #define LAgeqrf_ dgeqrf_
120 #define LAgetrf_ dgetrf_
121 #define LAgetf2_ dgetf2_
122 #define BLdot_   ddot_
123 #define BLnrm2_  dnrm2_
124 #define BLscal_  dscal_
125 #define BLcopy_  dcopy_
126 #define BLswap_  dswap_
127 #define BLaxpy_  daxpy_
128 #define BLasum_  dasum_
129 #elif defined(PETSC_HAVE_FORTRAN_CAPS)
130 #define LAgeqrf_ DGEQRF
131 #define LAgetrf_ DGETRF
132 #define LAgetf2_ DGETF2
133 #define BLdot_   DDOT
134 #define BLnrm2_  DNRM2
135 #define BLscal_  DSCAL
136 #define BLcopy_  DCOPY
137 #define BLswap_  DSWAP
138 #define BLaxpy_  DAXPY
139 #define BLasum_  DASUM
140 #else
141 #define LAgeqrf_ dgeqrf
142 #define LAgetrf_ dgetrf
143 #define LAgetf2_ dgetf2
144 #define BLdot_   ddot
145 #define BLnrm2_  dnrm2
146 #define BLscal_  dscal
147 #define BLcopy_  dcopy
148 #define BLswap_  dswap
149 #define BLaxpy_  daxpy
150 #define BLasum_  dasum
151 #endif
152 
153 #endif
154 
155 /*
156    Real with character string arguments.
157 */
158 #if defined(PETSC_USES_CPTOFCD)
159 /*
160    Note that this assumes that machines which use cptofcd() use
161   the PETSC_HAVE_FORTRAN_CAPS option. This is true on the Cray T3D/T3E.
162 */
163 #define LAormqr_(a,b,c,d,e,f,g,h,i,j,k,l,m)   DORMQR(_cptofcd((a),1),_cptofcd((b),1),(c),(d),(e),(f),(g),(h),(i),(j),(k),(l),(m))
164 #define LAtrtrs_(a,b,c,d,e,f,g,h,i,j)         DTRTRS(_cptofcd((a),1),_cptofcd((b),1),_cptofcd((c),1),(d),(e),(f),(g),(h),(i),(j))
165 #define LApotrf_(a,b,c,d,e)                   DPOTRF(_cptofcd((a),1),(b),(c),(d),(e))
166 #define LApotrs_(a,b,c,d,e,f,g,h)             DPOTRS(_cptofcd((a),1),(b),(c),(d),(e),(f),(g),(h))
167 #define LAgemv_(a,b,c,d,e,f,g,h,i,j,k)        DGEMV(_cptofcd((a),1),(b),(c),(d),(e),(f),(g),(h),(i),(j),(k))
168 #define LAgetrs_(a,b,c,d,e,f,g,h,i)           DGETRS(_cptofcd((a),1),(b),(c),(d),(e),(f),(g),(h),(i))
169 #define LAgetrs_(a,b,c,d,e,f,g,h,i)           DGETRS(_cptofcd((a),1),(b),(c),(d),(e),(f),(g),(h),(i))
170 #define BLgemm_(a,b,c,d,e,f,g,h,i,j,k,l,m)    DGEMM(_cptofcd((a),1), _cptofcd((a),1),(c),(d),(e),(f),(g),(h),(i),(j),(k),(l),(m))
171 #define LAgesvd_(a,b,c,d,e,f,g,h,i,j,k,l,m,n) DGESVD(_cptofcd((a),1),_cptofcd((a),1),(c),(d),(e),(f),(g),(h),(i),(j),(k),(l),(m),(n))
172 #define LAgeev_(a,b,c,d,e,f,g,h,i,j,k,l,m,n)  DGEEV(_cptofcd((a),1),_cptofcd((a),1),(c),(d),(e),(f),(g),(h),(i),(j),(k),(l),(m),(n))
173 #define LAtrmv_  DTRMV
174 #define LAtrsl_  DTRSL
175 #define LAgetrf_ DGETRF
176 #elif defined(PETSC_HAVE_FORTRAN_UNDERSCORE) || defined(PETSC_BLASLAPACK_F2C)
177 #define LAormqr_ dormqr_
178 #define LAtrtrs_ dtrtrs_
179 #define LApotrf_ dpotrf_
180 #define LApotrs_ dpotrs_
181 #define LAgemv_  dgemv_
182 #define LAgetrs_ dgetrs_
183 #define LAtrmv_  dtrmv_
184 #define LAtrsl_  dtrsl_
185 #define BLgemm_  dgemm_
186 #define LAgesvd_ dgesvd_
187 #define LAgeev_  dgeev_
188 #elif defined(PETSC_HAVE_FORTRAN_CAPS)
189 #define LAormqr_ DORMQR
190 #define LAtrtrs_ DTRTRS
191 #define LApotrf_ DPOTRF
192 #define LApotrs_ DPOTRS
193 #define LAgemv_  DGEMV
194 #define LAgetrs_ DGETRS
195 #define LAtrmv_  DTRMV
196 #define LAtrsl_  DTRSL
197 #define LAgesvd_ DGESVD
198 #define LAgeev_  DGEEV
199 #define BLgemm_  DGEMM
200 #else
201 #define LAormqr_ dormqr
202 #define LAtrtrs_ dtrtrs
203 #define LApotrf_ dpotrf
204 #define LApotrs_ dpotrs
205 #define LAgemv_  dgemv
206 #define LAgetrs_ dgetrs
207 #define LAtrmv_  dtrmv
208 #define LAtrsl_  dtrsl
209 #define BLgemm_  dgemm
210 #define LAgesvd_ dgesvd
211 #define LAgeev_  dgeev
212 #endif
213 
214 #else
215 /*
216    Complex with no character string arguments
217 */
218 #if defined(PETSC_USES_FORTRAN_SINGLE)
219 #define ZGEQRF  CGEQRF
220 #define ZDOTC   CDOTC
221 #define DZNRM2  SCNRM2
222 #define ZSCAL   CSCAL
223 #define ZCOPY   CCOPY
224 #define ZSWAP   CSWAP
225 #define ZAXPY   CAXPY
226 #define DZASUM  SCASUM
227 #define ZGETRF  CGETRF
228 #define ZTRTRS  CTRTRS
229 #define ZPOTRF  CPOTRF
230 #define ZPOTRS  CPOTRS
231 #define ZGEMV   CGEMV
232 #define ZGETRS  CGETRS
233 #define ZGEMM   SGEMM
234 #define ZTRMV   CTRMV
235 #define ZTRSL   CTRSL
236 #define ZGEEV   CGEEV
237 #endif
238 
239 #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE) || defined(PETSC_BLASLAPACK_F2C)
240 #define LAgeqrf_ zgeqrf_
241 #define LAgetrf_ zgetrf_
242 #define LAgetf2_ zgetf2_
243 #define BLdot_   zdotc_
244 #define BLnrm2_  dznrm2_
245 #define BLscal_  zscal_
246 #define BLcopy_  zcopy_
247 #define BLswap_  zswap_
248 #define BLaxpy_  zaxpy_
249 #define BLasum_  dzasum_
250 #elif defined(PETSC_HAVE_FORTRAN_CAPS)
251 #define LAgeqrf_ ZGEQRF
252 #define BLdot_   ZDOTC
253 #define BLnrm2_  DZNRM2
254 #define BLscal_  ZSCAL
255 #define BLcopy_  ZCOPY
256 #define BLswap_  ZSWAP
257 #define BLaxpy_  ZAXPY
258 #define BLasum_  DZASUM
259 #define LAgetrf_ ZGETRF
260 #else
261 #define LAgeqrf_ zgeqrf
262 #define LAgetrf_ zgetrf
263 #define LAgetf2_ zgetf2
264 #define BLdot_   zdotc
265 #define BLnrm2_  dznrm2
266 #define BLscal_  zscal
267 #define BLcopy_  zcopy
268 #define BLswap_  zswap
269 #define BLaxpy_  zaxpy
270 #define BLasum_  dzasum
271 #endif
272 
273 #if defined(PETSC_USES_CPTOFCD)
274 #define LAtrtrs_(a,b,c,d,e,f,g,h,i,j)           ZTRTRS(_cptofcd((a),1),_cptofcd((b),1),_cptofcd((c),1),(d),(e),(f),(g),(h),(i),(j))
275 #define LApotrf_(a,b,c,d,e)                     ZPOTRF(_cptofcd((a),1),(b),(c),(d),(e))
276 #define LApotrs_(a,b,c,d,e,f,g,h)               ZPOTRS(_cptofcd((a),1),(b),(c),(d),(e),(f),(g),(h))
277 #define LAgemv_(a,b,c,d,e,f,g,h,i,j,k)          ZGEMV(_cptofcd((a),1),(b),(c),(d),(e),(f),(g),(h),(i),(j),(k))
278 #define LAgetrs_(a,b,c,d,e,f,g,h,i)             ZGETRS(_cptofcd((a),1),(b),(c),(d),(e),(f),(g),(h),(i))
279 #define BLgemm_(a,b,c,d,e,f,g,h,i,j,k,l,m)      ZGEMM(_cptofcd((a),1),_cptofcd((a),1),(c),(d),(e),(f),(g),(h),(i),(j),(k),(l),(m))
280 #define LAgesvd_(a,b,c,d,e,f,g,h,i,j,k,l,m,n,p) ZGESVD(_cptofcd((a),1),_cptofcd((a),1),(c),(d),(e),(f),(g),(h),(i),(j),(k),(l),(m),(n),(p))
281 #define LAgeev_(a,b,c,d,e,f,g,h,i,j,k,l,m,n)    ZGEEV(_cptofcd((a),1),_cptofcd((a),1),(c),(d),(e),(f),(g),(h),(i),(j),(k),(l),(m),(n))
282 #define LAtrmv_  ZTRMV
283 #define LAtrsl_  ZTRSL
284 #elif defined(PETSC_HAVE_FORTRAN_UNDERSCORE) || defined(PETSC_BLASLAPACK_F2C)
285 #define LAtrtrs_ ztrtrs_
286 #define LApotrf_ zpotrf_
287 #define LApotrs_ zpotrs_
288 #define LAgemv_  zgemv_
289 #define LAgetrs_ zgetrs_
290 #define LAtrmv_  ztrmv_
291 #define LAtrsl_  ztrsl_
292 #define BLgemm_  zgemm_
293 #define LAgesvd_ zgesvd_
294 #define LAgeev_  zgeev_
295 #elif defined(PETSC_HAVE_FORTRAN_CAPS)
296 #define LAtrtrs_ ZTRTRS
297 #define LApotrf_ ZPOTRF
298 #define LApotrs_ ZPOTRS
299 #define LAgemv_  ZGEMV
300 #define LAgetrf_ ZGETRF
301 #define LAgetf2_ ZGETF2
302 #define LAgetrs_ ZGETRS
303 #define LAtrmv_  ZTRMV
304 #define LAtrsl_  ZTRSL
305 #define BLgemm_  ZGEMM
306 #define LAgesvd_ ZGESVD
307 #define LAgeev_  ZGEEV
308 #else
309 #define LAtrtrs_ ztrtrs
310 #define LApotrf_ zpotrf
311 #define LApotrs_ zpotrs
312 #define LAgemv_  zgemv
313 #define LAgetrs_ zgetrs
314 #define LAtrmv_  ztrmv
315 #define LAtrsl_  ztrsl
316 #define BLgemm_  zgemm
317 #define LAgesvd_ zgesvd
318 #define LAgeev_  zgeev
319 #endif
320 
321 #endif
322 
323 EXTERN_C_BEGIN
324 
325 /*
326    BLdot cannot be used with COMPLEX because it cannot
327    handle returing a double complex to C++.
328 */
329 EXTERN PetscReal BLdot_(int*,PetscScalar*,int*,PetscScalar*,int*);
330 EXTERN PetscReal BLnrm2_(int*,PetscScalar*,int*);
331 EXTERN PetscReal BLasum_(int*,PetscScalar*,int*);
332 EXTERN void      BLscal_(int*,PetscScalar*,PetscScalar*,int*);
333 EXTERN void      BLcopy_(int*,PetscScalar*,int*,PetscScalar*,int*);
334 EXTERN void      BLswap_(int*,PetscScalar*,int*,PetscScalar*,int*);
335 EXTERN void      BLaxpy_(int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*);
336 EXTERN void      LAgetrf_(int*,int*,PetscScalar*,int*,int*,int*);
337 EXTERN void      LAgetf2_(int*,int*,PetscScalar*,int*,int*,int*);
338 EXTERN void      LAgeqrf_(int*,int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*,int*);
339 
340 #if defined(PETSC_USES_CPTOFCD)
341 
342 #if defined(PETSC_USE_COMPLEX)
343 EXTERN void   ZPOTRF(_fcd,int*,PetscScalar*,int*,int*);
344 EXTERN void   ZGEMV(_fcd,int*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar *,int*,PetscScalar*,PetscScalar*,int*);
345 EXTERN void   ZPOTRS(_fcd,int*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
346 EXTERN void   ZGETRS(_fcd,int*,int*,PetscScalar*,int*,int*,PetscScalar*,int*,int*);
347 EXTERN void   ZGEMM(_fcd,_fcd,int*,int*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*);
348 EXTERN void   ZGESVD(_fcd,_fcd,int *,int*,PetscScalar *,int*,PetscReal*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,PetscReal*,int*);
349 EXTERN void   ZGEEV(_fcd,_fcd,int *,PetscScalar *,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,PetscReal*,int*);
350 #else
351 EXTERN void   DPOTRF(_fcd,int*,PetscScalar*,int*,int*);
352 EXTERN void   DGEMV(_fcd,int*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar *,int*,PetscScalar*,PetscScalar*,int*);
353 EXTERN void   DPOTRS(_fcd,int*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
354 EXTERN void   DGETRS(_fcd,int*,int*,PetscScalar*,int*,int*,PetscScalar*,int*,int*);
355 EXTERN void   DGEMM(_fcd,_fcd,int*,int*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*);
356 EXTERN void   DGESVD(_fcd,_fcd,int *,int*,PetscScalar *,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
357 EXTERN void   DGEEV(_fcd,_fcd,int *,PetscScalar *,int*,PetscScalar*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
358 #endif
359 
360 #else
361 EXTERN void   LAormqr_(char*,char*,int*,int*,int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,int*);
362 EXTERN void   LAtrtrs_(char*,char*,char*,int*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
363 EXTERN void   LApotrf_(char*,int*,PetscScalar*,int*,int*);
364 EXTERN void   LAgemv_(char*,int*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar *,int*,PetscScalar*,PetscScalar*,int*);
365 EXTERN void   LApotrs_(char*,int*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
366 EXTERN void   LAgetrs_(char*,int*,int*,PetscScalar*,int*,int*,PetscScalar*,int*,int*);
367 EXTERN void   BLgemm_(char *,char*,int*,int*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*);
368 
369 /* ESSL uses a different calling sequence for dgeev(), zgeev() than LAPACK; */
370 #if defined(PETSC_HAVE_ESSL) && defined(PETSC_USE_COMPLEX)
371 EXTERN void   LAgeev_(int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*,int*,int*,PetscReal*,int*);
372 EXTERN void   LAgesvd_(char *,char *,int *,int*,PetscScalar *,int*,PetscReal*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,PetscReal*,int*);
373 #elif defined(PETSC_HAVE_ESSL)
374 EXTERN void   LAgeev_(int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*,int*,int*,PetscReal*,int*);
375 EXTERN void   LAgesvd_(char *,char *,int *,int*,PetscScalar *,int*,PetscReal*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
376 #elif !defined(PETSC_USE_COMPLEX)
377 EXTERN void   LAgeev_(char *,char *,int *,PetscScalar *,int*,PetscReal*,PetscReal*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
378 EXTERN void   LAgesvd_(char *,char *,int *,int*,PetscScalar *,int*,PetscReal*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
379 #else
380 EXTERN void   LAgeev_(char *,char *,int *,PetscScalar *,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,PetscReal*,int*);
381 EXTERN void   LAgesvd_(char *,char *,int *,int*,PetscScalar *,int*,PetscReal*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,PetscReal*,int*);
382 #endif
383 #endif
384 
385 EXTERN_C_END
386 
387 #endif
388 
389