xref: /petsc/include/petscblaslapack.h (revision ae7cfceb55b5f4b52a4d945f9f2d81be7e2d348f)
1 /* $Id: petscblaslapack.h,v 1.41 2001/03/26 19:28:22 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_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
30 
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
38 
39 #if !defined(PETSC_USE_COMPLEX)
40 
41 /*
42     These are real case with no character string arguments
43 */
44 
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
71 
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
106 
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
177 
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
202 
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
236 
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
294 
295 #endif
296 
297 EXTERN_C_BEGIN
298 
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*);
312 
313 #if defined(PETSC_USES_CPTOFCD)
314 
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
340 
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*);
353 
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
375 
376 EXTERN_C_END
377 
378 #endif
379 
380