xref: /petsc/include/petscblaslapack.h (revision 419fbf4bd9bc2817a0ffc2887c90780c6d438dec)
1 /* $Id: petscblaslapack.h,v 1.48 2001/08/07 14:54:31 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_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),_cptofcd((b),1),(c),(d),(e),(f),(g),(h),(i),(j),(k),(l),(m))
123 #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))
124 #define LApotrf_(a,b,c,d,e)                   DPOTRF(_cptofcd((a),1),(b),(c),(d),(e))
125 #define LApotrs_(a,b,c,d,e,f,g,h)             DPOTRS(_cptofcd((a),1),(b),(c),(d),(e),(f),(g),(h))
126 #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))
127 #define LAgetrs_(a,b,c,d,e,f,g,h,i)           DGETRS(_cptofcd((a),1),(b),(c),(d),(e),(f),(g),(h),(i))
128 #define LAgetrs_(a,b,c,d,e,f,g,h,i)           DGETRS(_cptofcd((a),1),(b),(c),(d),(e),(f),(g),(h),(i))
129 #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))
130 #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))
131 #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))
132 #define LAtrmv_  DTRMV
133 #define LAtrsl_  DTRSL
134 #define LAgetrf_ DGETRF
135 #elif defined(PETSC_HAVE_FORTRAN_UNDERSCORE) || defined(PETSC_BLASLAPACK_F2C)
136 #define LAormqr_ dormqr_
137 #define LAtrtrs_ dtrtrs_
138 #define LApotrf_ dpotrf_
139 #define LApotrs_ dpotrs_
140 #define LAgemv_  dgemv_
141 #define LAgetrs_ dgetrs_
142 #define LAtrmv_  dtrmv_
143 #define LAtrsl_  dtrsl_
144 #define BLgemm_  dgemm_
145 #define LAgesvd_ dgesvd_
146 #define LAgeev_  dgeev_
147 #elif defined(PETSC_HAVE_FORTRAN_CAPS)
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 LAgesvd_ DGESVD
157 #define LAgeev_  DGEEV
158 #define BLgemm_  DGEMM
159 #else
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 BLgemm_  dgemm
169 #define LAgesvd_ dgesvd
170 #define LAgeev_  dgeev
171 #endif
172 
173 #else
174 /*
175    Complex with no character string arguments
176 */
177 #if defined(PETSC_USES_FORTRAN_SINGLE)
178 #define ZGEQRF  CGEQRF
179 #define ZDOTC   CDOTC
180 #define DZNRM2  SCNRM2
181 #define ZSCAL   CSCAL
182 #define ZCOPY   CCOPY
183 #define ZSWAP   CSWAP
184 #define ZAXPY   CAXPY
185 #define DZASUM  SCASUM
186 #define ZGETRF  CGETRF
187 #define ZTRTRS  CTRTRS
188 #define ZPOTRF  CPOTRF
189 #define ZPOTRS  CPOTRS
190 #define ZGEMV   CGEMV
191 #define ZGETRS  CGETRS
192 #define ZGEMM   SGEMM
193 #define ZTRMV   CTRMV
194 #define ZTRSL   CTRSL
195 #define ZGEEV   CGEEV
196 #endif
197 
198 #if defined(PETSC_HAVE_FORTRAN_UNDERSCORE) || defined(PETSC_BLASLAPACK_F2C)
199 #define LAgeqrf_ zgeqrf_
200 #define LAgetrf_ zgetrf_
201 #define LAgetf2_ zgetf2_
202 #define BLdot_   zdotc_
203 #define BLnrm2_  dznrm2_
204 #define BLscal_  zscal_
205 #define BLcopy_  zcopy_
206 #define BLswap_  zswap_
207 #define BLaxpy_  zaxpy_
208 #define BLasum_  dzasum_
209 #elif defined(PETSC_HAVE_FORTRAN_CAPS)
210 #define LAgeqrf_ ZGEQRF
211 #define BLdot_   ZDOTC
212 #define BLnrm2_  DZNRM2
213 #define BLscal_  ZSCAL
214 #define BLcopy_  ZCOPY
215 #define BLswap_  ZSWAP
216 #define BLaxpy_  ZAXPY
217 #define BLasum_  DZASUM
218 #define LAgetrf_ ZGETRF
219 #else
220 #define LAgeqrf_ zgeqrf
221 #define LAgetrf_ zgetrf
222 #define LAgetf2_ zgetf2
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 #endif
231 
232 #if defined(PETSC_USES_CPTOFCD)
233 #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))
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),(f),(g),(h))
236 #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))
237 #define LAgetrs_(a,b,c,d,e,f,g,h,i)             ZGETRS(_cptofcd((a),1),(b),(c),(d),(e),(f),(g),(h),(i))
238 #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))
239 #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))
240 #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))
241 #define LAtrmv_  ZTRMV
242 #define LAtrsl_  ZTRSL
243 #elif defined(PETSC_HAVE_FORTRAN_UNDERSCORE) || defined(PETSC_BLASLAPACK_F2C)
244 #define LAtrtrs_ ztrtrs_
245 #define LApotrf_ zpotrf_
246 #define LApotrs_ zpotrs_
247 #define LAgemv_  zgemv_
248 #define LAgetrs_ zgetrs_
249 #define LAtrmv_  ztrmv_
250 #define LAtrsl_  ztrsl_
251 #define BLgemm_  zgemm_
252 #define LAgesvd_ zgesvd_
253 #define LAgeev_  zgeev_
254 #elif defined(PETSC_HAVE_FORTRAN_CAPS)
255 #define LAtrtrs_ ZTRTRS
256 #define LApotrf_ ZPOTRF
257 #define LApotrs_ ZPOTRS
258 #define LAgemv_  ZGEMV
259 #define LAgetrf_ ZGETRF
260 #define LAgetf2_ ZGETF2
261 #define LAgetrs_ ZGETRS
262 #define LAtrmv_  ZTRMV
263 #define LAtrsl_  ZTRSL
264 #define BLgemm_  ZGEMM
265 #define LAgesvd_ ZGESVD
266 #define LAgeev_  ZGEEV
267 #else
268 #define LAtrtrs_ ztrtrs
269 #define LApotrf_ zpotrf
270 #define LApotrs_ zpotrs
271 #define LAgemv_  zgemv
272 #define LAgetrs_ zgetrs
273 #define LAtrmv_  ztrmv
274 #define LAtrsl_  ztrsl
275 #define BLgemm_  zgemm
276 #define LAgesvd_ zgesvd
277 #define LAgeev_  zgeev
278 #endif
279 
280 #endif
281 
282 EXTERN_C_BEGIN
283 
284 /*
285    BLdot cannot be used with COMPLEX because it cannot
286    handle returing a double complex to C++.
287 */
288 EXTERN PetscReal BLdot_(int*,PetscScalar*,int*,PetscScalar*,int*);
289 EXTERN PetscReal BLnrm2_(int*,PetscScalar*,int*);
290 EXTERN PetscReal BLasum_(int*,PetscScalar*,int*);
291 EXTERN void      BLscal_(int*,PetscScalar*,PetscScalar*,int*);
292 EXTERN void      BLcopy_(int*,PetscScalar*,int*,PetscScalar*,int*);
293 EXTERN void      BLswap_(int*,PetscScalar*,int*,PetscScalar*,int*);
294 EXTERN void      BLaxpy_(int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*);
295 EXTERN void      LAgetrf_(int*,int*,PetscScalar*,int*,int*,int*);
296 EXTERN void      LAgetf2_(int*,int*,PetscScalar*,int*,int*,int*);
297 EXTERN void      LAgeqrf_(int*,int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*,int*);
298 
299 #if defined(PETSC_USES_CPTOFCD)
300 
301 #if defined(PETSC_USE_COMPLEX)
302 EXTERN void   ZPOTRF(_fcd,int*,PetscScalar*,int*,int*);
303 EXTERN void   ZGEMV(_fcd,int*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar *,int*,PetscScalar*,PetscScalar*,int*);
304 EXTERN void   ZPOTRS(_fcd,int*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
305 EXTERN void   ZGETRS(_fcd,int*,int*,PetscScalar*,int*,int*,PetscScalar*,int*,int*);
306 EXTERN void   ZGEMM(_fcd,_fcd,int*,int*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*);
307 EXTERN void   ZGESVD(_fcd,_fcd,int *,int*,PetscScalar *,int*,PetscReal*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,PetscReal*,int*);
308 EXTERN void   ZGEEV(_fcd,_fcd,int *,PetscScalar *,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,PetscReal*,int*);
309 #else
310 EXTERN void   DPOTRF(_fcd,int*,PetscScalar*,int*,int*);
311 EXTERN void   DGEMV(_fcd,int*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar *,int*,PetscScalar*,PetscScalar*,int*);
312 EXTERN void   DPOTRS(_fcd,int*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
313 EXTERN void   DGETRS(_fcd,int*,int*,PetscScalar*,int*,int*,PetscScalar*,int*,int*);
314 EXTERN void   DGEMM(_fcd,_fcd,int*,int*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*);
315 EXTERN void   DGESVD(_fcd,_fcd,int *,int*,PetscScalar *,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
316 EXTERN void   DGEEV(_fcd,_fcd,int *,PetscScalar *,int*,PetscScalar*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
317 #endif
318 
319 #else
320 EXTERN void   LAormqr_(char*,char*,int*,int*,int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,int*);
321 EXTERN void   LAtrtrs_(char*,char*,char*,int*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
322 EXTERN void   LApotrf_(char*,int*,PetscScalar*,int*,int*);
323 EXTERN void   LAgemv_(char*,int*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar *,int*,PetscScalar*,PetscScalar*,int*);
324 EXTERN void   LApotrs_(char*,int*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
325 EXTERN void   LAgetrs_(char*,int*,int*,PetscScalar*,int*,int*,PetscScalar*,int*,int*);
326 EXTERN void   BLgemm_(char *,char*,int*,int*,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*);
327 
328 /* ESSL uses a different calling sequence for dgeev(), zgeev() than LAPACK; */
329 #if defined(PETSC_HAVE_ESSL) && defined(PETSC_USE_COMPLEX)
330 EXTERN void   LAgeev_(int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*,int*,int*,PetscReal*,int*);
331 EXTERN void   LAgesvd_(char *,char *,int *,int*,PetscScalar *,int*,PetscReal*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,PetscReal*,int*);
332 #elif defined(PETSC_HAVE_ESSL)
333 EXTERN void   LAgeev_(int*,PetscScalar*,int*,PetscScalar*,PetscScalar*,int*,int*,int*,PetscReal*,int*);
334 EXTERN void   LAgesvd_(char *,char *,int *,int*,PetscScalar *,int*,PetscReal*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
335 #elif !defined(PETSC_USE_COMPLEX)
336 EXTERN void   LAgeev_(char *,char *,int *,PetscScalar *,int*,PetscReal*,PetscReal*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
337 EXTERN void   LAgesvd_(char *,char *,int *,int*,PetscScalar *,int*,PetscReal*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,int*);
338 #else
339 EXTERN void   LAgeev_(char *,char *,int *,PetscScalar *,int*,PetscScalar*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,PetscReal*,int*);
340 EXTERN void   LAgesvd_(char *,char *,int *,int*,PetscScalar *,int*,PetscReal*,PetscScalar*,int*,PetscScalar*,int*,PetscScalar*,int*,PetscReal*,int*);
341 #endif
342 #endif
343 
344 EXTERN_C_END
345 
346 #endif
347 
348