Teuchos - Trilinos Tools Package Version of the Day
Teuchos_BLAS_wrappers.hpp
Go to the documentation of this file.
1/*
2// @HEADER
3// ***********************************************************************
4//
5// Teuchos: Common Tools Package
6// Copyright (2004) Sandia Corporation
7//
8// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
9// license for use of this work by or on behalf of the U.S. Government.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
39//
40// ***********************************************************************
41// @HEADER
42*/
43
44#ifndef _TEUCHOS_BLAS_WRAPPERS_HPP_
45#define _TEUCHOS_BLAS_WRAPPERS_HPP_
46
48#ifdef _MSC_VER
49/* disable warning for C-linkage returning complex class */
50#pragma warning ( disable : 4190 )
51#endif
52
58/* A) Define PREFIX and Teuchos_fcd based on platform. */
59
60#if defined(INTEL_CXML)
61# define PREFIX __stdcall
62# define Teuchos_fcd const char *, unsigned int
63#elif defined(INTEL_MKL)
64# define PREFIX
65# define Teuchos_fcd const char *
66#else /* Not CRAY_T3X or INTEL_CXML or INTEL_MKL */
67# define PREFIX
68# define Teuchos_fcd const char *
69#endif
70
71
72/* B) Take care of of the link name case */
73
74
75#define DROTG_F77 F77_BLAS_MANGLE(drotg,DROTG)
76#define DROT_F77 F77_BLAS_MANGLE(drot,DROT)
77#define DASUM_F77 F77_BLAS_MANGLE(dasum,DASUM)
78#define DAXPY_F77 F77_BLAS_MANGLE(daxpy,DAXPY)
79#define DCOPY_F77 F77_BLAS_MANGLE(dcopy,DCOPY)
80#define DDOT_F77 F77_BLAS_MANGLE(ddot,DDOT)
81#define DNRM2_F77 F77_BLAS_MANGLE(dnrm2,DNRM2)
82#define DSCAL_F77 F77_BLAS_MANGLE(dscal,DSCAL)
83#define IDAMAX_F77 F77_BLAS_MANGLE(idamax,IDAMAX)
84#define DGEMV_F77 F77_BLAS_MANGLE(dgemv,DGEMV)
85#define DGER_F77 F77_BLAS_MANGLE(dger,DGER)
86#define DTRMV_F77 F77_BLAS_MANGLE(dtrmv,DTRMV)
87#define DGEMM_F77 F77_BLAS_MANGLE(dgemm,DGEMM)
88#define DSWAP_F77 F77_BLAS_MANGLE(dswap,DSWAP)
89#define DSYMM_F77 F77_BLAS_MANGLE(dsymm,DSYMM)
90#define DSYRK_F77 F77_BLAS_MANGLE(dsyrk,DSYRK)
91#define DTRMM_F77 F77_BLAS_MANGLE(dtrmm,DTRMM)
92#define DTRSM_F77 F77_BLAS_MANGLE(dtrsm,DTRSM)
93
94#ifdef HAVE_TEUCHOS_COMPLEX
95
96#define ZROTG_F77 F77_BLAS_MANGLE(zrotg,ZROTG)
97#define ZROT_F77 F77_BLAS_MANGLE(zrot,ZROT)
98#define ZASUM_F77 F77_BLAS_MANGLE(dzasum,DZASUM)
99#define ZAXPY_F77 F77_BLAS_MANGLE(zaxpy,ZAXPY)
100#define ZCOPY_F77 F77_BLAS_MANGLE(zcopy,ZCOPY)
101#define ZDOT_F77 F77_BLAS_MANGLE(zdotc,ZDOTC)
102#define ZNRM2_F77 F77_BLAS_MANGLE(dznrm2,DZNRM2)
103#define ZSCAL_F77 F77_BLAS_MANGLE(zscal,ZSCAL)
104#define IZAMAX_F77 F77_BLAS_MANGLE(izamax,IZAMAX)
105#define ZGEMV_F77 F77_BLAS_MANGLE(zgemv,ZGEMV)
106#define ZGER_F77 F77_BLAS_MANGLE(zgeru,ZGERU)
107#define ZTRMV_F77 F77_BLAS_MANGLE(ztrmv,ZTRMV)
108#define ZGEMM_F77 F77_BLAS_MANGLE(zgemm,ZGEMM)
109#define ZSWAP_F77 F77_BLAS_MANGLE(zswap,ZSWAP)
110#define ZSYMM_F77 F77_BLAS_MANGLE(zsymm,ZSYMM)
111#define ZSYRK_F77 F77_BLAS_MANGLE(zsyrk,ZSYRK)
112#define ZHERK_F77 F77_BLAS_MANGLE(zherk,ZHERK)
113#define ZTRMM_F77 F77_BLAS_MANGLE(ztrmm,ZTRMM)
114#define ZTRSM_F77 F77_BLAS_MANGLE(ztrsm,ZTRSM)
115
116#endif /* HAVE_TEUCHOS_COMPLEX */
117
118#define SROTG_F77 F77_BLAS_MANGLE(srotg,SROTG)
119#define SROT_F77 F77_BLAS_MANGLE(srot,SROT)
120#define SSCAL_F77 F77_BLAS_MANGLE(sscal,SSCAL)
121#define SCOPY_F77 F77_BLAS_MANGLE(scopy,SCOPY)
122#define SAXPY_F77 F77_BLAS_MANGLE(saxpy,SAXPY)
123#define SDOT_F77 F77_BLAS_MANGLE(sdot,SDOT)
124#define SNRM2_F77 F77_BLAS_MANGLE(snrm2,SNRM2)
125#define SASUM_F77 F77_BLAS_MANGLE(sasum,SASUM)
126#define ISAMAX_F77 F77_BLAS_MANGLE(isamax,ISAMAX)
127#define SGEMV_F77 F77_BLAS_MANGLE(sgemv,SGEMV)
128#define SGER_F77 F77_BLAS_MANGLE(sger,SGER)
129#define STRMV_F77 F77_BLAS_MANGLE(strmv,STRMV)
130#define SGEMM_F77 F77_BLAS_MANGLE(sgemm,SGEMM)
131#define SSWAP_F77 F77_BLAS_MANGLE(sswap,SSWAP)
132#define SSYMM_F77 F77_BLAS_MANGLE(ssymm,SSYMM)
133#define SSYRK_F77 F77_BLAS_MANGLE(ssyrk,SSYRK)
134#define STRMM_F77 F77_BLAS_MANGLE(strmm,STRMM)
135#define STRSM_F77 F77_BLAS_MANGLE(strsm,STRSM)
136
137#ifdef HAVE_TEUCHOS_COMPLEX
138
139#define CROTG_F77 F77_BLAS_MANGLE(crotg,CROTG)
140#define CROT_F77 F77_BLAS_MANGLE(crot,CROT)
141#define SCASUM_F77 F77_BLAS_MANGLE(scasum,SCASUM)
142#define CAXPY_F77 F77_BLAS_MANGLE(caxpy,CAXPY)
143#define CCOPY_F77 F77_BLAS_MANGLE(ccopy,CCOPY)
144#define CDOT_F77 F77_BLAS_MANGLE(cdotc,CDOTC)
145#define SCNRM2_F77 F77_BLAS_MANGLE(scnrm2,SCNRM2)
146#define CSCAL_F77 F77_BLAS_MANGLE(cscal,CSCAL)
147#define ICAMAX_F77 F77_BLAS_MANGLE(icamax,ICAMAX)
148#define CGEMV_F77 F77_BLAS_MANGLE(cgemv,CGEMV)
149#define CGER_F77 F77_BLAS_MANGLE(cgeru,CGERU)
150#define CTRMV_F77 F77_BLAS_MANGLE(ctrmv,CTRMV)
151#define CGEMM_F77 F77_BLAS_MANGLE(cgemm,CGEMM)
152#define CSWAP_F77 F77_BLAS_MANGLE(cswap,CSWAP)
153#define CSYMM_F77 F77_BLAS_MANGLE(csymm,CSYMM)
154#define CSYRK_F77 F77_BLAS_MANGLE(csyrk,CSYRK)
155#define CHERK_F77 F77_BLAS_MANGLE(cherk,CHERK)
156#define CTRMM_F77 F77_BLAS_MANGLE(ctrmm,CTRMM)
157#define CTRSM_F77 F77_BLAS_MANGLE(ctrsm,CTRSM)
158
159#endif /* HAVE_TEUCHOS_COMPLEX */
160
161
162/* C) Define the function prototypes for all platforms! */
163
164#ifdef __cplusplus
165extern "C" {
166#endif
167
168
169/* Double precision BLAS 1 */
170void PREFIX DROTG_F77(double* da, double* db, double* c, double* s);
171void PREFIX DROT_F77(const int* n, double* dx, const int* incx, double* dy, const int* incy, double* c, double* s);
172double PREFIX DASUM_F77(const int* n, const double x[], const int* incx);
173void PREFIX DAXPY_F77(const int* n, const double* alpha, const double x[], const int* incx, double y[], const int* incy);
174void PREFIX DCOPY_F77(const int* n, const double *x, const int* incx, double *y, const int* incy);
175double PREFIX DDOT_F77(const int* n, const double x[], const int* incx, const double y[], const int* incy);
176double PREFIX DNRM2_F77(const int* n, const double x[], const int* incx);
177void PREFIX DSCAL_F77(const int* n, const double* alpha, double *x, const int* incx);
178void PREFIX DSWAP_F77(const int* const n, double* const x, const int* const incx,
179 double* const y, const int* const incy);
180int PREFIX IDAMAX_F77(const int* n, const double *x, const int* incx);
181
182/* Double std::complex precision BLAS 1 */
183#if defined(HAVE_TEUCHOS_COMPLEX) && defined(__cplusplus)
184
185# if defined(HAVE_COMPLEX_BLAS_PROBLEM)
186# if defined(HAVE_FIXABLE_COMPLEX_BLAS_PROBLEM)
187void PREFIX ZDOT_F77(std::complex<double> *ret, const int* n, const std::complex<double> x[], const int* incx, const std::complex<double> y[], const int* incy);
188# elif defined(HAVE_VECLIB_COMPLEX_BLAS)
189// no declarations; they're in cblas.h
190# include <vecLib/cblas.h>
191# else
192 // mfh 01 Feb 2013: If the code reaches this point, it means that
193 // some complex BLAS routines are broken, but there is no easy
194 // workaround. We deal with this in Teuchos_BLAS.cpp by
195 // reimplementing the offending routines.
196# endif // HAVE_COMPLEX_BLAS_PROBLEM
197# else // no problem
198std::complex<double> PREFIX ZDOT_F77(const int* n, const std::complex<double> x[], const int* incx, const std::complex<double> y[], const int* incy);
199# endif // defined(HAVE_COMPLEX_BLAS_PROBLEM)
200
201double PREFIX ZNRM2_F77(const int* n, const std::complex<double> x[], const int* incx);
202double PREFIX ZASUM_F77(const int* n, const std::complex<double> x[], const int* incx);
203void PREFIX ZROTG_F77(std::complex<double>* da, std::complex<double>* db, double* c, std::complex<double>* s);
204void PREFIX ZROT_F77(const int* n, std::complex<double>* dx, const int* incx, std::complex<double>* dy, const int* incy, double* c, std::complex<double>* s);
205void PREFIX ZAXPY_F77(const int* n, const std::complex<double>* alpha, const std::complex<double> x[], const int* incx, std::complex<double> y[], const int* incy);
206void PREFIX ZCOPY_F77(const int* n, const std::complex<double> *x, const int* incx, std::complex<double> *y, const int* incy);
207void PREFIX ZSCAL_F77(const int* n, const std::complex<double>* alpha, std::complex<double> *x, const int* incx);
208void PREFIX ZSWAP_F77(const int* const n, std::complex<double>* const x, const int* const incx,
209 std::complex<double>* const y, const int* const incy);
210int PREFIX IZAMAX_F77(const int* n, const std::complex<double> *x, const int* incx);
211
212#endif /* defined(HAVE_TEUCHOS_COMPLEX) && defined(__cplusplus) */
213
214/* Single precision BLAS 1 */
215#ifdef HAVE_TEUCHOS_BLASFLOAT
216# ifdef HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX
217# include <vecLib/cblas.h>
218# elif defined(HAVE_TEUCHOS_BLASFLOAT_DOUBLE_RETURN)
219double PREFIX SASUM_F77(const int* n, const float x[], const int* incx);
220double PREFIX SDOT_F77(const int* n, const float x[], const int* incx, const float y[], const int* incy);
221double PREFIX SNRM2_F77(const int* n, const float x[], const int* incx);
222# else
223float PREFIX SASUM_F77(const int* n, const float x[], const int* incx);
224float PREFIX SDOT_F77(const int* n, const float x[], const int* incx, const float y[], const int* incy);
225float PREFIX SNRM2_F77(const int* n, const float x[], const int* incx);
226# endif // which blasfloat
227#endif // ifdef blasfloat
228void PREFIX SROTG_F77(float* da, float* db, float* c, float* s);
229void PREFIX SROT_F77(const int* n, float* dx, const int* incx, float* dy, const int* incy, float* c, float* s);
230void PREFIX SAXPY_F77(const int* n, const float* alpha, const float x[], const int* incx, float y[], const int* incy);
231void PREFIX SCOPY_F77(const int* n, const float *x, const int* incx, float *y, const int* incy);
232void PREFIX SSCAL_F77(const int* n, const float* alpha, float *x, const int* incx);
233void PREFIX SSWAP_F77(const int* const n, float* const x, const int* const incx,
234 float* const y, const int* const incy);
235int PREFIX ISAMAX_F77(const int* n, const float *x, const int* incx);
236
237/* Single std::complex precision BLAS 1 */
238#if defined(HAVE_TEUCHOS_COMPLEX) && defined(__cplusplus)
239# if defined(HAVE_TEUCHOS_BLASFLOAT)
240# if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
241// no declarations; they're in cblas.h
242# include <vecLib/cblas.h>
243# elif defined(HAVE_TEUCHOS_BLASFLOAT_DOUBLE_RETURN)
244double PREFIX SCASUM_F77(const int* n, const std::complex<float> x[], const int* incx);
245double PREFIX SCNRM2_F77(const int* n, const std::complex<float> x[], const int* incx);
246# else
247float PREFIX SCASUM_F77(const int* n, const std::complex<float> x[], const int* incx);
248float PREFIX SCNRM2_F77(const int* n, const std::complex<float> x[], const int* incx);
249# endif // Whether or not we have the veclib bugfix
250#endif // defined(HAVE_TEUCHOS_BLASFLOAT)
251
252#if defined(HAVE_TEUCHOS_BLASFLOAT_APPLE_VECLIB_BUGFIX)
253// no declarations; they're in cblas.h
254#include <vecLib/cblas.h>
255#elif defined(HAVE_COMPLEX_BLAS_PROBLEM) && defined(HAVE_FIXABLE_COMPLEX_BLAS_PROBLEM)
256void PREFIX CDOT_F77(std::complex<float> *ret, const int* n, const std::complex<float> x[], const int* incx, const std::complex<float> y[], const int* incy);
257#elif defined(HAVE_TEUCHOS_BLASFLOAT)
258std::complex<float> PREFIX CDOT_F77(const int* n, const std::complex<float> x[], const int* incx, const std::complex<float> y[], const int* incy);
259#else
260// the code is literally in Teuchos_BLAS.cpp
261#endif
262
263void PREFIX CROTG_F77(std::complex<float>* da, std::complex<float>* db, float* c, std::complex<float>* s);
264void PREFIX CROT_F77(const int* n, std::complex<float>* dx, const int* incx, std::complex<float>* dy, const int* incy, float* c, std::complex<float>* s);
265void PREFIX CAXPY_F77(const int* n, const std::complex<float>* alpha, const std::complex<float> x[], const int* incx, std::complex<float> y[], const int* incy);
266void PREFIX CCOPY_F77(const int* n, const std::complex<float> *x, const int* incx, std::complex<float> *y, const int* incy);
267void PREFIX CSCAL_F77(const int* n, const std::complex<float>* alpha, std::complex<float> *x, const int* incx);
268void PREFIX CSWAP_F77(const int* const n, std::complex<float>* const x, const int* const incx,
269 std::complex<float>* const y, const int* const incy);
270int PREFIX ICAMAX_F77(const int* n, const std::complex<float> *x, const int* incx);
271
272#endif /* defined(HAVE_TEUCHOS_COMPLEX) && defined(__cplusplus) */
273
274/* Double precision BLAS 2 */
275void PREFIX DGEMV_F77(Teuchos_fcd, const int* m, const int* n, const double* alpha, const double A[], const int* lda,
276 const double x[], const int* incx, const double* beta, double y[], const int* incy);
277void PREFIX DTRMV_F77(Teuchos_fcd, Teuchos_fcd, Teuchos_fcd, const int *n,
278 const double *a, const int *lda, double *x, const int *incx);
279void PREFIX DGER_F77(const int *m, const int *n, const double *alpha, const double *x, const int *incx, const double *y,
280 const int *incy, double *a, const int *lda);
281
282/* Double precision BLAS 2 */
283#if defined(HAVE_TEUCHOS_COMPLEX) && defined(__cplusplus)
284
285void PREFIX ZGEMV_F77(Teuchos_fcd, const int* m, const int* n, const std::complex<double>* alpha, const std::complex<double> A[], const int* lda,
286 const std::complex<double> x[], const int* incx, const std::complex<double>* beta, std::complex<double> y[], const int* incy);
287void PREFIX ZTRMV_F77(Teuchos_fcd, Teuchos_fcd, Teuchos_fcd, const int *n,
288 const std::complex<double> *a, const int *lda, std::complex<double> *x, const int *incx);
289void PREFIX ZGER_F77(const int *m, const int *n, const std::complex<double> *alpha, const std::complex<double> *x, const int *incx, const std::complex<double> *y,
290 const int *incy, std::complex<double> *a, const int *lda);
291
292#endif /* defined(HAVE_TEUCHOS_COMPLEX) && defined(__cplusplus) */
293
294/* Single precision BLAS 2 */
295void PREFIX SGEMV_F77(Teuchos_fcd, const int* m, const int* n, const float* alpha, const float A[], const int* lda,
296 const float x[], const int* incx, const float* beta, float y[], const int* incy);
297void PREFIX STRMV_F77(Teuchos_fcd, Teuchos_fcd, Teuchos_fcd, const int *n,
298 const float *a, const int *lda, float *x, const int *incx);
299void PREFIX SGER_F77(const int *m, const int *n, const float *alpha, const float *x, const int *incx, const float *y,
300 const int *incy, float *a, const int *lda);
301
302/* Single std::complex precision BLAS 2 */
303#if defined(HAVE_TEUCHOS_COMPLEX) && defined(__cplusplus)
304
305void PREFIX CGEMV_F77(Teuchos_fcd, const int* m, const int* n, const std::complex<float>* alpha, const std::complex<float> A[], const int* lda,
306 const std::complex<float> x[], const int* incx, const std::complex<float>* beta, std::complex<float> y[], const int* incy);
307void PREFIX CTRMV_F77(Teuchos_fcd, Teuchos_fcd, Teuchos_fcd, const int *n,
308 const std::complex<float> *a, const int *lda, std::complex<float> *x, const int *incx);
309void PREFIX CGER_F77(const int *m, const int *n, const std::complex<float> *alpha, const std::complex<float> *x, const int *incx, const std::complex<float> *y,
310 const int *incy, std::complex<float> *a, const int *lda);
311
312#endif /* defined(HAVE_TEUCHOS_COMPLEX) && defined(__cplusplus) */
313
314/* Double precision BLAS 3 */
315void PREFIX DGEMM_F77(Teuchos_fcd, Teuchos_fcd, const int *m, const int *
316 n, const int *k, const double *alpha, const double *a, const int *lda,
317 const double *b, const int *ldb, const double *beta, double *c, const int *ldc);
318void PREFIX DSYMM_F77(Teuchos_fcd, Teuchos_fcd, const int *m, const int * n,
319 const double *alpha, const double *a, const int *lda,
320 const double *b, const int *ldb, const double *beta, double *c, const int *ldc);
321void PREFIX DSYRK_F77(Teuchos_fcd, Teuchos_fcd, const int *n, const int * k,
322 const double *alpha, const double *a, const int *lda,
323 const double *beta, double *c, const int *ldc);
324void PREFIX DTRMM_F77(Teuchos_fcd, Teuchos_fcd, Teuchos_fcd, Teuchos_fcd,
325 const int *m, const int *n, const double *alpha, const double *a, const int * lda, double *b, const int *ldb);
326void PREFIX DTRSM_F77(Teuchos_fcd, Teuchos_fcd, Teuchos_fcd, Teuchos_fcd,
327 const int *m, const int *n, const double *alpha, const double *a, const int *
328 lda, double *b, const int *ldb);
329
330/* Double std::complex precision BLAS 3 */
331#if defined(HAVE_TEUCHOS_COMPLEX) && defined(__cplusplus)
332
333void PREFIX ZGEMM_F77(Teuchos_fcd, Teuchos_fcd, const int *m, const int *
334 n, const int *k, const std::complex<double> *alpha, const std::complex<double> *a, const int *lda,
335 const std::complex<double> *b, const int *ldb, const std::complex<double> *beta, std::complex<double> *c, const int *ldc);
336void PREFIX ZSYMM_F77(Teuchos_fcd, Teuchos_fcd, const int *m, const int * n,
337 const std::complex<double> *alpha, const std::complex<double> *a, const int *lda,
338 const std::complex<double> *b, const int *ldb, const std::complex<double> *beta, std::complex<double> *c, const int *ldc);
339void PREFIX ZSYRK_F77(Teuchos_fcd, Teuchos_fcd, const int *n, const int * k,
340 const std::complex<double> *alpha, const std::complex<double> *a, const int *lda,
341 const std::complex<double> *beta, std::complex<double> *c, const int *ldc);
342void PREFIX ZHERK_F77(Teuchos_fcd, Teuchos_fcd, const int *n, const int * k,
343 const std::complex<double> *alpha, const std::complex<double> *a, const int *lda,
344 const std::complex<double> *beta, std::complex<double> *c, const int *ldc);
345void PREFIX ZTRMM_F77(Teuchos_fcd, Teuchos_fcd, Teuchos_fcd, Teuchos_fcd,
346 const int *m, const int *n, const std::complex<double> *alpha, const std::complex<double> *a, const int * lda, std::complex<double> *b, const int *ldb);
347void PREFIX ZTRSM_F77(Teuchos_fcd, Teuchos_fcd, Teuchos_fcd, Teuchos_fcd,
348 const int *m, const int *n, const std::complex<double> *alpha, const std::complex<double> *a, const int *
349 lda, std::complex<double> *b, const int *ldb);
350
351#endif /* defined(HAVE_TEUCHOS_COMPLEX) && defined(__cplusplus) */
352
353/* Single precision BLAS 3 */
354void PREFIX SGEMM_F77(Teuchos_fcd, Teuchos_fcd, const int *m, const int *
355 n, const int *k, const float *alpha, const float *a, const int *lda,
356 const float *b, const int *ldb, const float *beta, float *c, const int *ldc);
357void PREFIX SSYMM_F77(Teuchos_fcd, Teuchos_fcd, const int *m, const int * n,
358 const float *alpha, const float *a, const int *lda,
359 const float *b, const int *ldb, const float *beta, float *c, const int *ldc);
360void PREFIX SSYRK_F77(Teuchos_fcd, Teuchos_fcd, const int *n, const int * k,
361 const float *alpha, const float *a, const int *lda,
362 const float *beta, float *c, const int *ldc);
363void PREFIX STRMM_F77(Teuchos_fcd, Teuchos_fcd, Teuchos_fcd, Teuchos_fcd,
364 const int *m, const int *n, const float *alpha, const float *a, const int * lda, float *b, const int *ldb);
365void PREFIX STRSM_F77(Teuchos_fcd, Teuchos_fcd, Teuchos_fcd, Teuchos_fcd,
366 const int *m, const int *n, const float *alpha, const float *a, const int *
367 lda, float *b, const int *ldb);
368
369/* Single std::complex precision BLAS 3 */
370
371#if defined(HAVE_TEUCHOS_COMPLEX) && defined(__cplusplus)
372
373void PREFIX CGEMM_F77(Teuchos_fcd, Teuchos_fcd, const int *m, const int *
374 n, const int *k, const std::complex<float> *alpha, const std::complex<float> *a, const int *lda,
375 const std::complex<float> *b, const int *ldb, const std::complex<float> *beta, std::complex<float> *c, const int *ldc);
376void PREFIX CSYMM_F77(Teuchos_fcd, Teuchos_fcd, const int *m, const int * n,
377 const std::complex<float> *alpha, const std::complex<float> *a, const int *lda,
378 const std::complex<float> *b, const int *ldb, const std::complex<float> *beta, std::complex<float> *c, const int *ldc);
379void PREFIX CTRMM_F77(Teuchos_fcd, Teuchos_fcd, Teuchos_fcd, Teuchos_fcd,
380 const int *m, const int *n, const std::complex<float> *alpha, const std::complex<float> *a, const int * lda, std::complex<float> *b, const int *ldb);
381void PREFIX CSYRK_F77(Teuchos_fcd, Teuchos_fcd, const int *n, const int * k,
382 const std::complex<float> *alpha, const std::complex<float> *a, const int *lda,
383 const std::complex<float> *beta, std::complex<float> *c, const int *ldc);
384void PREFIX CHERK_F77(Teuchos_fcd, Teuchos_fcd, const int *n, const int * k,
385 const std::complex<float> *alpha, const std::complex<float> *a, const int *lda,
386 const std::complex<float> *beta, std::complex<float> *c, const int *ldc);
387void PREFIX CTRSM_F77(Teuchos_fcd, Teuchos_fcd, Teuchos_fcd, Teuchos_fcd,
388 const int *m, const int *n, const std::complex<float> *alpha, const std::complex<float> *a, const int *
389 lda, std::complex<float> *b, const int *ldb);
390
391#endif /* defined(HAVE_TEUCHOS_COMPLEX) && defined(__cplusplus) */
392
393#ifdef __cplusplus
394}
395#endif
396
397/* Don't leave a global macros called PREFIX or Teuchos_fcd laying around */
398
399#ifdef PREFIX
400#undef PREFIX
401#endif
402
403#ifdef Teuchos_fcd
404#undef Teuchos_fcd
405#endif
406
407#endif /* end of TEUCHOS_BLAS_WRAPPERS_HPP_ */
Teuchos header file which uses auto-configuration information to include necessary C++ headers.