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