KASKADE 7 development version
acml_to_stdlapack.hh
Go to the documentation of this file.
1#ifndef __ACML_TO_STDLAPACK__
2#define __ACML_TO_STDLAPACK__
3
4#include <algorithm>
5#include <cstdlib> // malloc, with clang++
6#ifdef __cplusplus
7extern "C" {
8#endif
9#include <cblas.h>
10#if defined(Darwin) || defined(Atlas)
11#include <clapack.h>
12#endif
13#if defined(Cygwin) || defined(Atlas)
14#include "lapack/lapacke_utils.h"
15#define __CLPK_integer int
16int ilaenv_(int*,char*,int,char*,int,int*,int*,int*,int*);
17#endif
18#ifdef DEBUG
19#define VDEBUG 1
20#else
21#define VDEBUG 0
22#endif
23#include <cstdio>
24
25void dgemm(char transa, char transb, int m, int n, int k, double alpha, double *a, int lda, double *b, int ldb, double beta, double *c, int ldc)
26{
27 enum CBLAS_TRANSPOSE ntransa=CblasNoTrans, ntransb=CblasNoTrans;
28 if ( transa == 't' ) ntransa=CblasTrans;
29 if ( transb == 't' ) ntransb=CblasTrans;
30 if (VDEBUG) printf("***entering cblas_dgemm ***\n");
31 cblas_dgemm(CblasColMajor,ntransa,ntransb,m,n,k,alpha,a,lda,b,ldb,beta,c,ldc);
32 if (VDEBUG) printf("***dgemm finished***\n");
33};
34
35void dgemv(char transa, int m, int n, double alpha, double *a, int lda, double *x, int incx, double beta, double *y, int incy)
36{
37 enum CBLAS_TRANSPOSE ntransa=CblasNoTrans;
38 if ( transa == 't' ) ntransa=CblasTrans;
39 if (VDEBUG) printf("*** entering cblas_dgemv***\n");
40 cblas_dgemv(CblasColMajor,ntransa,m,n,alpha,a,lda,x,incx,beta,y,incy);
41 if (VDEBUG) printf("***dgemv finished***\n");
42};
43
44void dgels(char trans, int mA, int nA, int nrhsA, double *a, int ldaA, double *b, int ldbA, int *infoA)
45{
46 __CLPK_integer m=mA, n=nA, nrhs=nrhsA, lda=ldaA, ldb=ldbA, info=*infoA;
47 __CLPK_integer mn = std::min(m,n);
48 __CLPK_integer lwork = std::max( 1, mn + std::max( mn, nrhs )*n );
49 double *work = (double*) malloc(lwork*sizeof(double));
50 if (VDEBUG) printf("*** entering dgels ***\n");
51 dgels_(&trans,&m,&n,&nrhs,a,&lda,b,&ldb,work,&lwork,&info);
52 *infoA=info;
53 free(work);
54 if (VDEBUG) printf("***dgels finished***\n");
55};
56
57void dsyevd(char jobz, char uplo, int nA, double *a, int ldaA, double *w, int *infoA)
58{
59 __CLPK_integer n=nA, lda=ldaA, info=*infoA;
60 __CLPK_integer lwork=1+5*n+5*n*n, liwork=3+5*n;
61 double *work = (double*) malloc(lwork*sizeof(double));
62 __CLPK_integer *iwork = (__CLPK_integer*) malloc(liwork*sizeof(int));
63 if (VDEBUG) printf("*** entering dsyevd***\n");
64 dsyevd_(&jobz,&uplo,&n,a,&lda,w,work,&lwork,iwork,&liwork,&info);
65 *infoA=info;
66 free(work); free(iwork);
67 if (VDEBUG) printf("***dsyevd finished***\n");
68};
69
70void dgelsy(int mA, int nA, int nrhsA, double *a, int ldaA, double *b, int ldbA, int *jpvtA, double rcond, int *rankA, int *infoA)
71{
72 __CLPK_integer m=mA, n=nA, nrhs=nrhsA, lda=ldaA, ldb=ldbA, *jpvt,
73 rank=*rankA, info=*infoA;
74 __CLPK_integer mn = std::min(m,n);
75 __CLPK_integer lwork = std::max( mn+2*n+n*(n+1), 2*mn+n*nrhs );
76 int i;
77 double *work = (double*) malloc(lwork*sizeof(double));
78 jpvt = (__CLPK_integer*)malloc(n*sizeof(__CLPK_integer));
79 for (i=0;i<n;i++) jpvt[i]=jpvtA[i];
80 if (VDEBUG) printf("*** entering dgelsy ***\n");
81 dgelsy_(&m,&n,&nrhs,a,&lda,b,&ldb,jpvt,&rcond,&rank,work,&lwork,&info);
82 for (i=0;i<n;i++) jpvtA[i]=jpvt[i];
83 *infoA=info;
84 *rankA=rank;
85 free(work); free(jpvt);
86 if (VDEBUG) printf("***dgelsy finished***\n");
87};
88
89void dgesv(int nA, int nrhsA, double *a, int ldaA, int *pivA, double *b, int ldbA, int *infoA)
90{
91 __CLPK_integer n=nA, nrhs=nrhsA, lda=ldaA, *ipiv=pivA, ldb=ldbA;
92 __CLPK_integer info;
93 info=*infoA;
94 if (VDEBUG) printf("*** entering dgesv ***\n");
95 dgesv_(&n,&nrhs,a,&lda,ipiv,b,&ldb,&info);
96 *infoA=info;
97 if (VDEBUG) printf("***dgesv finished***\n");
98};
99
100void dgesvd(char jobu, char jobvt, int mA, int nA, double *a, int ldaA, double *sing, double *u, int lduA, double *vt, int ldvtA, int *infoA)
101{
102 __CLPK_integer m=mA, n=nA, lda=ldaA, ldu=lduA, ldvt=ldvtA,info=*infoA;
103 __CLPK_integer lwork = std::max(3*std::min(m,n)+std::max(m,n),5*std::min(m,n));
104 double *work = (double*) malloc(lwork*sizeof(double));
105 if (VDEBUG) printf("*** entering dgesvd ***\n");
106 dgesvd_(&jobu,&jobvt,&m,&n,a,&lda,sing,u,&ldu,vt,&ldvt,work,&lwork,&info);
107 *infoA=info;
108 free(work);
109 if (VDEBUG) printf("***dgesvd finished***\n");
110};
111
112void dstev(char jobz, int nA, double *diag, double *offd, double *z, int ldzA, int *infoA)
113{
114 __CLPK_integer n=nA, ldz=ldzA, info=*infoA;
115 __CLPK_integer lwork = std::max(1,2*n-2);
116 double *work = (double*) malloc(lwork*sizeof(double));
117 if (VDEBUG) printf("*** entering dstev ***\n");
118 dstev_(&jobz,&n,diag,offd,z,&ldz,work,&info);
119 *infoA=info;
120 free(work);
121 if (VDEBUG) printf("***dstev finished***\n");
122};
123
124void dgetrf(int mA, int nA, double *a, int ldaA, int *ipiv, int *infoA)
125{
126 __CLPK_integer m=mA, n=nA, lda=ldaA,info=*infoA;
127 dgetrf_( &m, &n, a, &lda, ipiv, &info );
128 *infoA=info;
129};
130
131void dgetri(int nA, double *a, int ldaA, int *ipiv, int *infoA)
132{
133 __CLPK_integer n=nA, lda=ldaA, info=*infoA;
134 int minusOne=-1, one=1;
135#if defined(Cygwin) || defined(Atlas)
136 __CLPK_integer lwork = n* (__CLPK_integer) ilaenv_( &one, "dgetri",6, "",0, (int*) &n, &minusOne, &minusOne, &minusOne );
137#else
138 __CLPK_integer lwork = n* (__CLPK_integer) ilaenv_( &one, "dgetri", "", (int*) &n, &minusOne, &minusOne, &minusOne );
139#endif
140 double *work = (double*) malloc(lwork*sizeof(double));
141 if (VDEBUG) printf("*** entering dgetri ***\n");
142 dgetri_( &n, a, &lda, ipiv, work, &lwork, &info );
143 *infoA=info;
144 free(work);
145 if (VDEBUG) printf("***dgetri finished***\n");
146};
147
148void sgetrf(int mA, int nA, float *a, int ldaA, int *ipiv, int *infoA)
149{
150 __CLPK_integer m=mA, n=nA, lda=ldaA,info=*infoA;
151 sgetrf_( &m, &n, a, &lda, ipiv, &info );
152 *infoA=info;
153};
154
155void sgetri(int nA, float *a, int ldaA, int *ipiv, int *infoA)
156{
157 __CLPK_integer n=nA, lda=ldaA, info=*infoA;
158 int minusOne=-1, one=1;
159#if defined(Cygwin) || defined(Atlas)
160 __CLPK_integer lwork = n* (__CLPK_integer) ilaenv_( &one, "sgetri",6, "",0, (int*) &n, &minusOne, &minusOne, &minusOne );
161#else
162 __CLPK_integer lwork = n* (__CLPK_integer) ilaenv_( &one, "sgetri", "", (int*) &n, &minusOne, &minusOne, &minusOne );
163#endif
164 float *work = (float*) malloc(lwork*sizeof(float));
165 if (VDEBUG) printf("*** entering sgetri ***\n");
166 sgetri_( &n, a, &lda, ipiv, work, &lwork, &info );
167 *infoA=info;
168 free(work);
169 if (VDEBUG) printf("***sgetri finished***\n");
170};
171
172void sgemv(char transa, int m, int n, float alpha, float *a, int lda, float *x, int incx, float beta, float *y, int incy)
173{
174 enum CBLAS_TRANSPOSE ntransa=CblasNoTrans;
175 if ( transa == 't' ) ntransa=CblasTrans;
176 if (VDEBUG) printf("*** entering cblas_sgemv***\n");
177 cblas_sgemv(CblasColMajor,ntransa,m,n,alpha,a,lda,x,incx,beta,y,incy);
178 if (VDEBUG) printf("***sgemv finished***\n");
179};
180
181// example for a new placeholder routine - use copy/paste, then adapt the name and parameter list,
182// and uncomment the code
183//
184// void sgetrf(int m, int n, float *a, int lda, int *ipiv, int *info)
185// {
186// printf("*** sgetrf: Please supply mapping routine to standard LAPACK routine sgetrf_ ***\n");
187// printf("*** by editing this routine in header file linalg/acml_to_stdlapack.hh\n");
188// printf("*** Execution of program aborted! ***\n");
189// exit(10);
190// };
191//
192
193#ifdef __cplusplus
194}
195#endif
196
197#endif
void dgetrf(int mA, int nA, double *a, int ldaA, int *ipiv, int *infoA)
void dsyevd(char jobz, char uplo, int nA, double *a, int ldaA, double *w, int *infoA)
void sgemv(char transa, int m, int n, float alpha, float *a, int lda, float *x, int incx, float beta, float *y, int incy)
void dgemm(char transa, char transb, int m, int n, int k, double alpha, double *a, int lda, double *b, int ldb, double beta, double *c, int ldc)
void dgesvd(char jobu, char jobvt, int mA, int nA, double *a, int ldaA, double *sing, double *u, int lduA, double *vt, int ldvtA, int *infoA)
void sgetrf(int mA, int nA, float *a, int ldaA, int *ipiv, int *infoA)
void dgemv(char transa, int m, int n, double alpha, double *a, int lda, double *x, int incx, double beta, double *y, int incy)
void dgelsy(int mA, int nA, int nrhsA, double *a, int ldaA, double *b, int ldbA, int *jpvtA, double rcond, int *rankA, int *infoA)
void dstev(char jobz, int nA, double *diag, double *offd, double *z, int ldzA, int *infoA)
void dgetri(int nA, double *a, int ldaA, int *ipiv, int *infoA)
void dgesv(int nA, int nrhsA, double *a, int ldaA, int *pivA, double *b, int ldbA, int *infoA)
void dgels(char trans, int mA, int nA, int nrhsA, double *a, int ldaA, double *b, int ldbA, int *infoA)
void sgetri(int nA, float *a, int ldaA, int *ipiv, int *infoA)
#define VDEBUG
Dune::FieldVector< T, n > max(Dune::FieldVector< T, n > x, Dune::FieldVector< T, n > const &y)
Componentwise maximum.
Definition: fixdune.hh:110
Dune::FieldVector< T, n > diag(Dune::FieldMatrix< T, n, n > const &A)
Matrix diagonal as a vector.
Definition: fixdune.hh:542
constexpr int rank
Reports the rank of vector, matrix, and tensor types of static size.
Definition: scalar.hh:150
Dune::FieldVector< T, n > min(Dune::FieldVector< T, n > x, Dune::FieldVector< T, n > const &y)
Componentwise minimum.
Definition: fixdune.hh:122
void dgetrf_(int *m, int *n, double *a, int *lda, int *ipiv, int *info)