HΦ  3.1.0
matrixlapack.c File Reference

wrapper for linear algebra operations using lapack More...

#include "matrixlapack.h"
#include <stdlib.h>
#include "mfmemory.h"

Go to the source code of this file.

Functions

int dgetrf_ (int *m, int *n, double *a, int *lda, int *ipiv, int *info)
 
int dgetri_ (int *n, double *a, int *lda, int *ipiv, double *work, int *lwork, int *info)
 
int dsyev_ (char *jobz, char *uplo, int *n, double *a, int *lda, double *w, double *work, int *lwork, int *info)
 
int M_DSYEV (char *jobz, char *uplo, int *n, double *a, int *lda, double *w, double *work, int *lwork, int *info)
 
double dlamch_ (char *cmach)
 
int zheev_ (char *jobz, char *uplo, int *n, double complex *a, int *lda, double *w, double complex *work, int *lwork, double *rwork, int *info)
 
int dsyevx_ (char *jobz, char *range, char *uplo, int *n, double *a, int *lda, double *vl, double *vu, int *il, int *iu, double *abstol, int *m, double *w, double *z__, int *ldz, double *work, int *lwork, int *iwork, int *ifail, int *info)
 
void to_f (int N, int M, double **A, double *a)
 function for transforming Row-major matrix (C) to Column-major matrix (Fortran) More...
 
int DSEVvalue (int xNsize, double **A, double *r)
 obtain eigenvalues of real symmetric A More...
 
int DInv (int xNsize, double **xM, double **xIM)
 obtain eigenvalues of inverse of real matrix xM More...
 
int DSEVvector (int xNsize, double **A, double *r, double **vec)
 obtain eigenvalues and eigenvectors of real symmetric A More...
 
int DSEVXU (int xNsize, double **A, double *r, double **X, int xNev)
 obtain eigenvalues A More...
 
int ZHEEVall (int xNsize, double complex **A, double complex *r, double complex **vec)
 obtain eigenvalues and eigenvectors of Hermite matrix A More...
 

Detailed Description

wrapper for linear algebra operations using lapack

Version
0.1, 0.2
Author
Takahiro Misawa (The University of Tokyo)

Definition in file matrixlapack.c.

Function Documentation

◆ dgetrf_()

int dgetrf_ ( int *  m,
int *  n,
double *  a,
int *  lda,
int *  ipiv,
int *  info 
)

Referenced by DInv().

◆ dgetri_()

int dgetri_ ( int *  n,
double *  a,
int *  lda,
int *  ipiv,
double *  work,
int *  lwork,
int *  info 
)

Referenced by DInv().

◆ DInv()

int DInv ( int  xNsize,
double **  xM,
double **  xIM 
)

obtain eigenvalues of inverse of real matrix xM

Parameters
[in]xNsizematrix size
[in]xMmatrix
[out]xIMinverse of xM
Returns
Author
Takahiro Misawa (The University of Tokyo)
Kazuyoshi Yoshimi (The University of Tokyo)

Definition at line 154 of file matrixlapack.c.

References dgetrf_(), and dgetri_().

154  {
155 
156  int i,j,k;
157  int m,n,lda,info,*piv,lwork;
158  double *work;
159  double *a;
160 
161  m=n=lda=lwork=xNsize;
162 
163  a = (double*)malloc(xNsize*xNsize*sizeof(double));
164  work = (double*)malloc(xNsize*sizeof(double));
165  piv = (int*)malloc(xNsize*sizeof(int));
166 
167  k=0;
168  for(j=0;j<xNsize;j++){
169  for(i=0;i<xNsize;i++){
170  a[k] = xM[i][j];
171  k++;
172  }
173  }
174 
175  dgetrf_(&m, &n, a, &lda, piv, &info);
176  dgetri_(&n, a, &lda, piv, work, &lwork, &info);
177 
178  if(info != 0){
179  free(a);
180  free(work);
181  free(piv);
182  return 0;
183  }
184 
185  for(k=0;k<xNsize*xNsize;k++){
186  xIM[k%xNsize][k/xNsize] = a[k];
187  }
188  free(a);
189  free(work);
190  free(piv);
191 
192  return 1;
193 }
int dgetri_(int *n, double *a, int *lda, int *ipiv, double *work, int *lwork, int *info)
int dgetrf_(int *m, int *n, double *a, int *lda, int *ipiv, int *info)

◆ dlamch_()

double dlamch_ ( char *  cmach)

Referenced by DSEVXU().

◆ DSEVvalue()

int DSEVvalue ( int  xNsize,
double **  A,
double *  r 
)

obtain eigenvalues of real symmetric A

Parameters
[in]xNsize
[in]Amatrix
[out]reigenvalues
Returns
Author
Takahiro Misawa (The University of Tokyo)
Kazuyoshi Yoshimi (The University of Tokyo)

Definition at line 94 of file matrixlapack.c.

References M_DSYEV(), and to_f().

Referenced by Lanczos_EigenValue().

94  {
95 
96  int k;
97  char jobz, uplo;
98  int n, lda, lwork, info;
99  double *a, *w, *work;
100 #ifdef SR
101  int *iwork, liwork;
102  liwork = 5 * xNsize + 3;
103  iwork = (int*)malloc(liwork * sizeof(double));
104 #endif
105 
106  n = lda = xNsize;
107  lwork = 4*xNsize; /* 3*xNsize OK?*/
108 
109  a = (double*)malloc(xNsize*xNsize*sizeof(double));
110  w = (double*)malloc(xNsize*sizeof(double));
111  work = (double*)malloc(lwork*sizeof(double));
112 
113  to_f(xNsize, xNsize, A, a);
114 
115  jobz = 'N';
116  uplo = 'U';
117 
118 #ifdef SR
119  M_DSYEV(&jobz, &uplo, &n, a, &lda, w, work, &lwork, &iwork, &liwork, &info);
120  free(iwork);
121 #else
122  M_DSYEV(&jobz, &uplo, &n, a, &lda, w, work, &lwork, &info);
123 #endif
124 
125  if(info != 0){
126  free(a);
127  free(w);
128  free(work);
129  return 0;
130  }
131 
132  for(k=0;k<xNsize;k++){
133  r[k] = w[k];
134  }
135 
136  free(a);
137  free(w);
138  free(work);
139 
140  return 1;
141 }
int M_DSYEV(char *jobz, char *uplo, int *n, double *a, int *lda, double *w, double *work, int *lwork, int *info)
void to_f(int N, int M, double **A, double *a)
function for transforming Row-major matrix (C) to Column-major matrix (Fortran)
Definition: matrixlapack.c:67

◆ DSEVvector()

int DSEVvector ( int  xNsize,
double **  A,
double *  r,
double **  vec 
)

obtain eigenvalues and eigenvectors of real symmetric A

Parameters
xNsizesize of matrix
Amatrix
reigenvalues
veceignevectos
Returns
Author
Takahiro Misawa (The University of Tokyo)
Kazuyoshi Yoshimi (The University of Tokyo)

Definition at line 210 of file matrixlapack.c.

References dsyev_(), M_DSYEV(), and vec.

Referenced by vec12().

210  {
211 
212  int i,j,k;
213  char jobz, uplo;
214  int n, lda, lwork, info;
215  double *a, *w, *work;
216 #ifdef SR
217  int *iwork, liwork;
218  liwork = 5 * xNsize + 3;
219  iwork = (int*)malloc(liwork * sizeof(double));
220  lwork = 2 * xNsize * xNsize + 6 * xNsize + 1; /* 3*xNsize OK?*/
221 #else
222  lwork = 4 * xNsize; /* 3*xNsize OK?*/
223 #endif
224 
225  n = lda = xNsize;
226 
227  a = (double*)malloc(xNsize*xNsize*sizeof(double));
228  w = (double*)malloc(xNsize*sizeof(double));
229  work = (double*)malloc(lwork*sizeof(double));
230 
231  k=0;
232  for(j=0;j<xNsize;j++){
233  for(i=0;i<xNsize;i++){
234  a[k] = A[i][j];
235  k++;
236  }
237  }
238 
239  jobz = 'V';
240  uplo = 'U';
241 
242 #ifdef SR
243  M_DSYEV(&jobz, &uplo, &n, a, &lda, w, work, &lwork, iwork, &liwork, &info);
244  free(iwork);
245 #else
246  dsyev_(&jobz, &uplo, &n, a, &lda, w, work, &lwork, &info);
247 #endif
248 
249  k=0;
250  for(i=0;i<xNsize;i++){
251  for(j=0;j<xNsize;j++){
252  vec[i][j]=a[k];
253  k++;
254  }
255  }
256 
257  if(info != 0){
258  free(a);
259  free(w);
260  free(work);
261  return 0;
262  }
263 
264  for(k=0;k<xNsize;k++){
265  r[k] = w[k];
266  }
267 
268  free(a);
269  free(w);
270  free(work);
271 
272  return 1;
273 }
int M_DSYEV(char *jobz, char *uplo, int *n, double *a, int *lda, double *w, double *work, int *lwork, int *info)
double complex ** vec
Definition: global.h:45
int dsyev_(char *jobz, char *uplo, int *n, double *a, int *lda, double *w, double *work, int *lwork, int *info)

◆ DSEVXU()

int DSEVXU ( int  xNsize,
double **  A,
double *  r,
double **  X,
int  xNev 
)

obtain eigenvalues A

Parameters
xNsizesize of A
Amatrix
reigenvalues
Xeigenvectors
xNevnumber of eigenvalues
Returns
Author
Takahiro Misawa (The University of Tokyo)
Kazuyoshi Yoshimi (The University of Tokyo)

Definition at line 291 of file matrixlapack.c.

References dlamch_(), dsyevx_(), and X.

291  {
292 
293  int i,j,k;
294  char jobz, range, uplo;
295  int n, lda, il, iu, m, ldz, lwork, *iwork, *ifail, info;
296  double *a, *w, *work, vl, vu, abstol, *z;
297 
298  n = lda = ldz = xNsize;
299  lwork = 8*xNsize;
300 
301  a = (double*)malloc(xNsize*xNsize*sizeof(double));
302  w = (double*)malloc(xNsize*sizeof(double));
303  z = (double*)malloc(xNsize*xNsize*sizeof(double));
304  work = (double*)malloc(lwork*sizeof(double));
305  iwork = (int*)malloc(5*xNsize*sizeof(int));
306  ifail = (int*)malloc(xNsize*sizeof(int));
307 
308 #ifdef SR
309  abstol = 0.0;
310 #else
311  abstol = 2.0*dlamch_("S");
312 #endif
313  vl = vu = 0.0;
314 
315  k=0;
316  for(j=0;j<xNsize;j++){
317  for(i=0;i<xNsize;i++){
318  a[k] = A[i][j];
319  k++;
320  }
321  }
322 
323  jobz = 'V';
324  range = 'I';
325  uplo = 'U';
326 
327  il = xNsize-xNev+1;
328  iu = xNsize;
329  m = iu-il+1;
330 
331  dsyevx_(&jobz, &range, &uplo, &n, a, &lda, &vl, &vu, &il, &iu, &abstol,
332  &m, w, z, &ldz, work, &lwork, iwork, ifail, &info);
333 
334  if(info != 0){
335  free(a);
336  free(w);
337  free(z);
338  free(work);
339  free(iwork);
340  free(ifail);
341  return 0;
342  }
343 
344  for(k=0;k<xNev;k++){
345  r[k+xNsize-xNev] = w[k];
346  }
347 
348  for(k=0;k<xNsize*xNev;k++){
349  X[k%xNsize][k/xNsize+xNsize-xNev] = z[k];
350  }
351  free(a);
352  free(w);
353  free(z);
354  free(work);
355  free(iwork);
356  free(ifail);
357 
358  return 1;
359 }
double dlamch_(char *cmach)
int dsyevx_(char *jobz, char *range, char *uplo, int *n, double *a, int *lda, double *vl, double *vu, int *il, int *iu, double *abstol, int *m, double *w, double *z__, int *ldz, double *work, int *lwork, int *iwork, int *ifail, int *info)
struct EDMainCalStruct X
Definition: struct.h:431

◆ dsyev_()

int dsyev_ ( char *  jobz,
char *  uplo,
int *  n,
double *  a,
int *  lda,
double *  w,
double *  work,
int *  lwork,
int *  info 
)

Referenced by DSEVvector().

◆ dsyevx_()

int dsyevx_ ( char *  jobz,
char *  range,
char *  uplo,
int *  n,
double *  a,
int *  lda,
double *  vl,
double *  vu,
int *  il,
int *  iu,
double *  abstol,
int *  m,
double *  w,
double *  z__,
int *  ldz,
double *  work,
int *  lwork,
int *  iwork,
int *  ifail,
int *  info 
)

Referenced by DSEVXU().

◆ M_DSYEV()

int M_DSYEV ( char *  jobz,
char *  uplo,
int *  n,
double *  a,
int *  lda,
double *  w,
double *  work,
int *  lwork,
int *  info 
)

Referenced by DSEVvalue(), and DSEVvector().

◆ to_f()

void to_f ( int  N,
int  M,
double **  A,
double *  a 
)

function for transforming Row-major matrix (C) to Column-major matrix (Fortran)

Parameters
[in]N
[in]M
[in]ARow-major matrix
[out]aColumn-major matrix
Author
Takahiro Misawa (The University of Tokyo)
Parameters
[in]N
[in]M
[in]A
[out]a

Definition at line 67 of file matrixlapack.c.

Referenced by DSEVvalue().

72  {
73  int i,j,k;
74  k=0;
75  for(j=0;j<M;j++){
76  for(i=0;i<N;i++){
77  a[k] = A[i][j];
78  k++;
79  }
80  }
81 }

◆ zheev_()

int zheev_ ( char *  jobz,
char *  uplo,
int *  n,
double complex *  a,
int *  lda,
double *  w,
double complex *  work,
int *  lwork,
double *  rwork,
int *  info 
)

Referenced by ZHEEVall().

◆ ZHEEVall()

int ZHEEVall ( int  xNsize,
double complex **  A,
double complex *  r,
double complex **  vec 
)

obtain eigenvalues and eigenvectors of Hermite matrix A

Parameters
xNsizesize of matrix
Amatrix
reigenvalues
veceigenvectors
Returns
Author
Takahiro Misawa (The University of Tokyo)
Kazuyoshi Yoshimi (The University of Tokyo)

Definition at line 375 of file matrixlapack.c.

References vec, zheev_(), and zheevd_().

Referenced by lapack_diag().

375  {
376 
377  int i,j,k;
378  char jobz, uplo;
379  int n, lda, lwork, info, lrwork;
380  double *rwork;
381  double *w;
382  double complex *a, *work;
383 #ifdef SR
384  int *iwork, liwork;
385  liwork = 5 * xNsize + 3;
386  iwork = (int*)malloc(liwork * sizeof(double));
387 #endif
388 
389  n = lda = xNsize;
390 #ifdef SR
391  lwork = xNsize*xNsize + 2 * xNsize; /* 3*xNsize OK?*/
392  lrwork = 2 * xNsize*xNsize + 5*xNsize + 1;
393 #else
394  lwork = 4*xNsize; /* 3*xNsize OK?*/
395  lrwork = lwork;
396 #endif
397 
398  a = (double complex*)malloc(xNsize*xNsize*sizeof(double complex));
399  w = (double*)malloc(xNsize*sizeof(double));
400  work = (double complex*)malloc(lwork*sizeof(double complex));
401  rwork = (double*)malloc(lrwork*sizeof(double));
402 
403  k=0;
404  for(j=0;j<xNsize;j++){
405  for(i=0;i<xNsize;i++){
406  a[k] = A[i][j];
407  k++;
408  }
409  }
410 
411  jobz = 'V';
412  uplo = 'U';
413 
414 #ifdef SR
415  int zheevd_(char *jobz, char *uplo, int *n, double complex *a, int *lda, double *w, double complex *work, int *lwork, double *rwork, int *iwork, int *liwork, int *info);
416  free(iwork);
417 #else
418  zheev_(&jobz, &uplo, &n, a, &lda, w, work, &lwork, rwork, &info);
419 #endif
420 
421  if(info != 0){
422  free(a);
423  free(w);
424  free(work);
425  free(rwork);
426  return 0;
427  }
428 
429  k=0;
430  for(i=0;i<xNsize;i++){
431  for(j=0;j<xNsize;j++){
432  vec[i][j]=a[k];
433  k++;
434  }
435  }
436 
437 
438  for(k=0;k<xNsize;k++){
439  r[k] = w[k];
440  }
441 
442  free(a);
443  free(w);
444  free(work);
445  free(rwork);
446 
447  return 1;
448 }
double complex ** vec
Definition: global.h:45
void zheevd_(char *jobz, char *uplo, int *n, double complex *a, int *lda, double *w, double complex *work, int *lwork, double *rwork, int *lrwork, int *iwork, int *liwork, int *info)
int zheev_(char *jobz, char *uplo, int *n, double complex *a, int *lda, double *w, double complex *work, int *lwork, double *rwork, int *info)