xref: /petsc/include/petscblaslapack.h (revision ea709b57ddb8cc304f11df2e9a39d6a8fdb28b53)
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