TBCI Numerical high perf. C++ Library  2.8.0
lapack.cpp
Go to the documentation of this file.
1 
5 /* $Id: lapack.cpp,v 1.8.2.12 2019/05/28 11:13:02 garloff Exp $ */
6 
7 //#define NO_NS
8 
10 #define LAPACK_INLINE inline
11 
12 #include "tbci/cplx.h"
13 #include "tbci/f_matrix.h"
14 #include "tbci/f_bandmatrix.h"
15 #include "tbci/lapack/lapack_lib.h"
16 
17 
19 
20 
21 //********************************************************************************
23 //********************************************************************************
25 {
26  char fact='E'; // equlibrate
27  if(!equi) fact='N'; // No equilibration
28  char trans='N'; //No transpose
29  integer n=A.columns(); // Dimension des Problems
30  integer kl=A.numSub(); //echt genutzte ND
31  integer ku=A.numSuper(); //echt genutzte ND
32  integer nrhs=1; // Anzahl rechter Seiten
33  //ab=A
34  integer ldab=A.ldab();
35  double* afb=new double[n*(2*kl+ku+1)];
36  integer ldafb=2*kl+ku+1;
37  integer* ipiv=new integer[n];
38  char equed;
39  double* r=new double[n];
40  double* c=new double[n];
41  TVector<double> x(B.size());
42  double rcond;
43  double ferr; //Vektor fuer mehrere rechte Seiten
44  double berr; //Vektor fuer mehrere rechte Seiten
45  double* work=new double[3*n];
46  integer* iwork=new integer[n];
47  integer info = 0;
48 
49  dgbsvx_(&fact, &trans, &n, &kl, &ku, &nrhs, A.get_fortran_matrix(), &ldab,
50  afb, &ldafb, ipiv, &equed,
51  r, c, B.get_fortran_vector(), &n,
52  x.get_fortran_vector(), &n,
53  &rcond, &ferr, &berr, work, iwork, &info);
54 
55  delete[] afb;
56  delete[] ipiv;
57  delete[] r;
58  delete[] c;
59  delete[] work;
60  delete[] iwork;
61 
62  if (info)
63  {
64  STD__ cerr << "Error inverting Matrix A! (" << info << ")" << STD__ endl;
65  STD__ cerr << "\n Equalized= " << equed << STD__ endl;
66  STD__ cerr << " 1/Cond= " << rcond << " epsilon= " << dlamch_ ("Epsilon")
67  << " f_err= " << ferr
68  << " b_err= " << berr << STD__ endl;
69  }
70  return x;
71 }
72 
73 
75 {
76  integer n=A.columns(); // Dimension des Problems
77  integer kl=A.numSub(); //echt genutzte ND
78  integer ku=A.numSuper();//echt genutzte ND
79  integer nrhs = 1; // Anzahl rechter Seiten
80  integer info = 0;
81  TVector<double> invA(B);
82  BVector<integer> ipiv(n);
83 
84  //Mit Kopie der Matrix, inclusive Platz fuer fill_in!
85  {
86  F_BandMatrix<double> temp(n,2*ku,kl);
87  temp.clear();
88  //Matrix kopieren
89  for(int i=0; i<n; i++)
90  {
91  temp(i,i)=A(i,i);
92  for(int j=1; j<=kl; j++) {if(i-j>=0) temp(i,i-j)=A(i,i-j);}
93  for(int k=1; k<=ku; k++) {if(i+k<n) temp(i,i+k)=A(i,i+k);}
94  }
95  integer ldab=temp.ldab(); // mindestens 2*kl+ku+1;
96  dgbsv_(&n, &kl, &ku,
97  &nrhs, temp.get_fortran_matrix(), &ldab, ipiv.get_fortran_vector(),
98  invA.get_fortran_vector(), &n, &info);
99  }
100  if (info)
101  STD__ cerr << "Error inverting Matrix A! (" << info << ")" << STD__ endl;
102  return invA;
103 }
104 
106 {
107  integer n=A.columns(); // Dimension des Problems
108  //integer kl=A.numSub(); //echt genutzte ND
109  //integer ku=A.numSuper(); //echt genutzte ND
110  integer nrhs = 1; // Anzahl rechter Seiten
111  integer info = 0;
112  TVector<double> invA(B);
113  BVector<integer> ipiv(n);
114  // Mit Ueberschreiben
115  {
116  if (ku > (long)A.numSuper()/2)
117  STD__ cerr << "Matrix too small to store fill_in" << STD__ endl;
118  integer ldab=A.ldab(); // mindestens 2*kl+ku+1;
119  dgbsv_(&n, &kl, &ku,
120  &nrhs, A.get_fortran_matrix(), &ldab, ipiv.get_fortran_vector(),
121  invA.get_fortran_vector(), &n, &info);
122  }
123 
124  if (info)
125  STD__ cerr << "Error inverting Matrix A! (" << info << ")" << STD__ endl;
126  return invA;
127 }
128 
129 TVector<double> lu_solve(const F_Matrix<double>& A, const Vector<double>& B, int overwriteA)
130 {
131  integer n=A.columns(); // Dimension des Problems
132  integer nrhs=1;
133  integer info=0;
134  TVector<double> invA(B);
135  BVector<integer> ipiv(n);
136  //not tested!!
137 
138  if (overwriteA)
139  {
140  dgesv_(&n, &nrhs, A.get_fortran_matrix(), &n, ipiv.get_fortran_vector(),
141  invA.get_fortran_vector(), &n, &info);
142  }
143  else
144  {
145  F_Matrix<double> temp(A);
146  dgesv_(&n, &nrhs, temp.get_fortran_matrix(), &n, ipiv.get_fortran_vector(),
147  invA.get_fortran_vector(), &n, &info);
148  }
149 
150  if (info)
151  STD__ cerr << "Error inverting Matrix A!" << STD__ endl;
152  return invA;
153 }
154 
155 
156 F_TMatrix<double> lu_solve(const F_Matrix<double>& A, const F_Matrix<double>& B, int overwriteA)
157 {
158  integer n=A.columns(); // Dimension des Problems
159  integer info;
160  F_TMatrix<double> invA(B);
161  BVector<integer> ipiv(n);
162 
163  if (overwriteA)
164  {
165  dgesv_(&n, &n, A.get_fortran_matrix(), &n, ipiv.get_fortran_vector(),
166  invA.get_fortran_matrix(), &n, &info);
167  }
168  else
169  {
170  F_Matrix<double> temp(A);
171  dgesv_(&n, &n, temp.get_fortran_matrix(), &n, ipiv.get_fortran_vector(),
172  invA.get_fortran_matrix(), &n, &info);
173  }
174 
175  if (info)
176  STD__ cerr << "Error inverting Matrix A!" << STD__ endl;
177  return invA;
178 }
179 
180 
181 F_TMatrix<double> inv(const F_Matrix<double>& A, int overwriteA)
182 {
183  integer n=A.columns(); // Dimension des Problems
184  integer info=0;
185  // Rechte Seite ist die Einheitsmatrix!
186  F_TMatrix<double> invA(0.0, n, n);
187  for (int i=0; i<n; i++)
188  invA.setval(1.0,i,i);
189  BVector<integer> ipiv(n);
190  F_Matrix<double> temp;
191  if (!overwriteA)
192  {
193  temp.resize(n,n);
194  temp=A;
195  }
196 
197  if (overwriteA)
198  dgesv_(&n, &n, A.get_fortran_matrix(), &n, ipiv.get_fortran_vector(),
199  invA.get_fortran_matrix(), &n, &info);
200  else
201  dgesv_(&n, &n, temp.get_fortran_matrix(), &n, ipiv.get_fortran_vector(),
202  invA.get_fortran_matrix(), &n, &info);
203  if (info)
204  STD__ cerr << "Error inverting Matrix A!" << STD__ endl;
205  return invA;
206 }
207 
208 F_TMatrix<cplx<double> > inv(const F_Matrix<cplx<double> >& A, int overwriteA)
209 {
210  integer n=A.columns(); // Dimension des Problems
211  integer info=0;
212  BVector<integer> ipiv(n);
213  F_Matrix<cplx<double> > temp;
214  if (!overwriteA)
215  {
216  temp.resize(n,n);
217  temp=A;
218  }
219  // Rechte Seite ist die Einheitsmatrix!
220  F_TMatrix<cplx<double> > invA(0.0, n, n);
221  for (int i=0; i<n; i++)
222  invA.setval(cplx<double>(1.0), i,i);
223 
224  if (overwriteA)
225  zgesv_(&n, &n, (doublecomplex*) A.get_fortran_matrix(), &n, ipiv.get_fortran_vector(),
226  (doublecomplex*) invA.get_fortran_matrix(), &n, &info);
227  else
228  zgesv_(&n, &n, (doublecomplex*) temp.get_fortran_matrix(), &n, ipiv.get_fortran_vector(),
229  (doublecomplex*) invA.get_fortran_matrix(), &n, &info);
230  if (info)
231  STD__ cerr << "Error inverting Matrix A!" << STD__ endl;
232  return invA;
233 }
234 
236 {
237  integer n=A.columns(); // Dimension des Problems
238  integer info=0;
239  BVector<integer> ipiv(n);
240  F_Matrix<cplx<double> > temp;
241  if (!overwriteA)
242  {
243  temp.resize(n,n);
244  temp=A;
245  }
246  F_TMatrix<cplx<double> > invA(B);
247 
248  if (overwriteA)
249  zgesv_(&n, &n, (doublecomplex*) A.get_fortran_matrix(), &n, ipiv.get_fortran_vector(),
250  (doublecomplex*) invA.get_fortran_matrix(), &n, &info);
251  else
252  zgesv_(&n, &n, (doublecomplex*) temp.get_fortran_matrix(), &n, ipiv.get_fortran_vector(),
253  (doublecomplex*) invA.get_fortran_matrix(), &n, &info);
254  if (info)
255  STD__ cerr << "Error inverting Matrix A!" << STD__ endl;
256  return invA;
257 }
258 
259 
260 //********************************************************************************
262 //********************************************************************************
264 {
265  char jobz='N'; //Eigenwerte und Eigenvektoren
266  char uplo='U'; //Obere Haelfte der Matrix lesen
267  integer N=A.columns(); // Dimension des Problems
268  integer lwork=3*N;
269  BVector<double> work(lwork);
270  integer info=0;
271  F_Matrix<double> EV(A); // Die Systemmatrix wird sonst ueberschrieben!!
272  dsyev_(&jobz, &uplo, &N, EV.get_fortran_matrix(),
273  &N, EW.get_fortran_vector(), work.get_fortran_vector(), &lwork,
274  &info);
275  return (int) info;
276 }
277 
278 
280 {
281  char jobz='V'; //Eigenwerte und Eigenvektoren
282  char uplo='U'; //Obere Haelfte der Matrix lesen
283  integer N=A.columns(); // Dimension des Problems
284  integer lwork=3*N;
285  BVector<double> work(lwork);
286  integer info=0;
287  EV = A; // Die Systemmatrix wird sonst ueberschrieben!!
288  dsyev_(&jobz, &uplo, &N, EV.get_fortran_matrix(),
289  &N, EW.get_fortran_vector(), work.get_fortran_vector(), &lwork,
290  &info);
291  return (int) info;
292 }
293 
294 
295 //symmtric Band Matrix
297 {
298  char jobz='V'; // Eigenwerte und Eigenvektoren
299  char uplo='U'; // Obere Haelfte der Matrix lesen
300  integer N=A.columns(); // Dimension des Problems
301  integer kd=A.numSuper(); // Anzahl der oberen Diags
302  integer lwork=3*N-2;
303  integer lda=1+A.numSuper()+A.numSub();
304  integer ldz =N; //fuer Eigenvektoren
305  BVector<double> work(lwork);
306  integer info=0;
307 
308  /* int dsbev_(char *jobz, char *uplo, integer *n, integer *kd,
309  doublereal *ab, integer *ldab, doublereal *w, doublereal *z, integer *
310  ldz, doublereal *work, integer *info); */
311 
312  dsbev_(&jobz, &uplo, & N, &kd, A.get_fortran_matrix(), &lda,
314  &ldz, work.get_fortran_vector(), &info);
315 
316  return (int) info;
317 }
318 
319 
321  double ew_min, double ew_max)
322 {
323  char jobz='V'; // Eigenwerte und Eigenvektoren
324  char uplo='U'; // Obere Haelfte der Matrix lesen
325  char range='V'; // Eigenwerte aus Intervall
326  integer N=A.columns(); // Dimension des Problems
327  integer kd=A.numSuper(); // Anzahl der oberen Diags
328  integer lda=1+A.numSuper()+A.numSub();
329  //integer lwork=7*N;
330  integer ldz =N; //fuer Eigenvektoren
331  BVector<double> work(7*N);
332  BVector<integer> iwork(5*N);
333  BVector<integer> ifail(N);
334  integer ldq =N; //fuer Eigenvektoren
335  BVector<double> q(N*ldq);
336  integer info=0, dummy, m;
337  double abstol=0;
338 
339  Vector<double> EW_temp(N);
340  F_Matrix<double> EV_temp(N,N);
341 
342 /* int dsbevx_(char *jobz, char *range, char *uplo, integer *n,
343  integer *kd, doublereal *ab, integer *ldab,
344  doublereal *q, integer *ldq,
345  doublereal *vl, doublereal *vu, integer *il, integer *iu,
346  doublereal *abstol, integer *m, doublereal *w, doublereal *z, integer *ldz,
347  doublereal *work, integer *iwork, integer *ifail, integer *info);
348 */
349  dsbevx_(&jobz, &range, &uplo, &N,
350  &kd, A.get_fortran_matrix(), &lda,
351  q.get_fortran_vector(), &ldq,
352  &ew_min, &ew_max, &dummy, &dummy,
353  &abstol, &m, EW_temp.get_fortran_vector(), EV_temp.get_fortran_matrix(), &ldz,
354  work.get_fortran_vector(), iwork.get_fortran_vector(),
355  ifail.get_fortran_vector(), &info);
356 
357  // Eigenwerte kopieren
358  EV.resize(N,m);
359  EW.resize(m);
360  for(int i=0; i<m; i++)
361  {
362  EW(i)=EW_temp(i);
363  EV.set_col(EV_temp.get_col(i), i);
364  }
365 
366  return (int) info;
367 }
368 
369 
370 
371 //********************************************************************************
373 //********************************************************************************
375 {
376  char jobvl='N'; //linke Eigenwerte und Eigenvektoren
377  char jobvr='N'; //rechte Eigenwerte und Eigenvektoren
378  integer N=A.columns(); // Dimension des Problems
379  doublecomplex* vl=0; // Keine linken Eigenvektoren
380  doublecomplex* vr=0; // Keine linken Eigenvektoren
381  integer lwork=2*N;
382  doublecomplex* work =NEW(doublecomplex,lwork);
383  doublereal* rwork=NEW(doublereal,lwork);
384  integer info=0;
385  zgeev_(&jobvl, &jobvr, &N,
386  (doublecomplex*) A.get_fortran_matrix(), &N,
387  (doublecomplex*) EW.get_fortran_vector(), vl,
388  &N, vr, &N, work, &lwork, rwork, &info);
389  TBCIDELETE(doublecomplex, work, lwork);
390  TBCIDELETE(doublereal, rwork, lwork);
391  return (int) info;
392 }
393 
394 
396 {
397  char jobvl='N'; //linke Eigenwerte und Eigenvektoren
398  char jobvr='V'; //rechte Eigenwerte und Eigenvektoren
399  integer N=A.columns(); // Dimension des Problems
400  doublecomplex* vl=0; // Keine linken Eigenvektoren
401  integer lwork=2*N;
402  doublecomplex* work =NEW(doublecomplex,lwork);
403  doublereal* rwork=NEW(doublereal,lwork);
404  integer info=0;
405  zgeev_(&jobvl, &jobvr, &N, (doublecomplex*) A.get_fortran_matrix(), &N,
406  (doublecomplex*) EW.get_fortran_vector(), vl,
407  &N, (doublecomplex*) EV.get_fortran_matrix(), &N, work, &lwork, rwork, &info);
408  TBCIDELETE(doublecomplex, work, lwork);
409  TBCIDELETE(doublereal, rwork, lwork);
410  return (int) info;
411 }
412 
413 
414 
415 
416 //********************************************************************************
418 //********************************************************************************
420  double EW_min, double EW_max,
421  Vector<double>& Eigenwerte, F_Matrix<cplx<double> >& Eigenvectoren)
422 {
423  // Benutzt wird nur die obere Haelfte der Bandmatrix A!!!!
424  long uplo=1;
425  // Ordnung des EWP bestimmen
426  long n=A.columns();
427  // Anzahl der Oberen Diagonalen der Matrizen A und B bestimmen
428  long ldab=A.numSuper()+1;
429  long ldbb=B.numSuper()+1;
430  // Allg. Variablen
431  long Anzahl_Eigenwerte;
432  long BerechneEV=1; // Eigenvektoren sollen berechnet werden
433 
434  // Laufvariablen
435  int i,j, x,y;
436 
437 
438  // *****************************************************************************
439  // Arrays im Fortran-Stil deklarieren,
440  // diese Arrays werden mit den Werten aus den Matrizen besetzt
441  //cout << "ab.bb..." << flush;
442  // *****************************************************************************
443  doublecomplex *ab = new doublecomplex[ldab*n];
444  doublecomplex *bb = new doublecomplex[ldbb*n];
445 
446  // Arrays kopieren
447  for (i=0; i<n; i++)
448  {
449  // Array A nach ab kopieren
450  for (j=i; j<i+ldab && j<n; j++)
451  {
452  // x und y sind die Koordinaten in Lapack-Bandstruktur
453  x=ldab+i-j-1;
454  y=j;
455  ab[x+ldab*y].r = CPLX__ real(A(i,j));
456  ab[x+ldab*y].i = CPLX__ imag(A(i,j));
457  }
458 
459  // Array B nach bb kopieren
460  for (j=i; j<i+ldbb && j<n; j++)
461  {
462  // x und y sind die Koordinaten in Lapack-Bandstruktur
463  x=ldbb+i-j-1;
464  y=j;
465  bb[x+ldbb*y].r = CPLX__ real(B(i,j));
466  bb[x+ldbb*y].i = CPLX__ imag(B(i,j));
467  }
468  }
469 
470  // *******************************************************************************
471  // Hilfsvariablen fuer die Eigenwertroutine deklarieren
472 
473  double* ew = new double[n]; // Temporaerer Eigenwertspeicher
474  long *iwork = new long[5*n];
475  double *rwork = new double[7*n];
476  doublecomplex *work = new doublecomplex[n];
477  doublecomplex *q = new doublecomplex[n*n];
478 
479  // *******************************************************************************
480  // Eigenwertroutine aufrufen:
481  long info=own_ew_(&BerechneEV, &uplo, &n, &Anzahl_Eigenwerte, ab, &ldab, bb, &ldbb,
482  &EW_min, &EW_max, ew, q, &n, work, rwork, iwork);
483  if (!info==0)
484  {
485  STD__ cerr << " Error calculating eigenvalues: (status " << info << ")" << STD__ endl;
486  return info;
487  }
488  delete [] ab ;
489  delete [] bb ;
490  // Wenn Eigenvektoren berechnen
491  if (BerechneEV==1 && Anzahl_Eigenwerte>0)
492  {
493  // neue Hilfsvariablen initialisieren
494  doublecomplex *EV = new doublecomplex[n*Anzahl_Eigenwerte];
495  long *ifail = new long[Anzahl_Eigenwerte];
496  // Eigenvektoren zu 0 setzen
497  for (i=0;i<n*Anzahl_Eigenwerte;i++)
498  {
499  EV[i].r=0;
500  EV[i].i=0;
501  }
502  info=own_ev_(&n, &Anzahl_Eigenwerte, ew, EV, &n, q, &n, work, rwork, iwork, ifail);
503  if (!info==0)
504  {
505  STD__ cerr << " Error calculating eigenvectors" << STD__ endl;
506  return info;
507  }
508  // *******************************************************************************
509  // Eigenvektoren in die Matrix Eigenvektoren eintragen
510  Eigenvectoren.resize(n,Anzahl_Eigenwerte);
511  for (j=0;j<Anzahl_Eigenwerte;j++)
512  {
513  for (int i=0; i<n; i++)
514  {
515  Eigenvectoren(i,j).set(EV[i+n*j].r, EV[i+n*j].i);
516  }
517  }
518  delete[] ifail;
519  delete[] EV;
520  } //endif Eigenvektorberechnung
521 
522  // Eigenwerte in Eigenwertvektor eintragen
523  Eigenwerte.resize(Anzahl_Eigenwerte);
524  for(i=0; i<Anzahl_Eigenwerte; i++) Eigenwerte(i) = ew[i];
525 
526  delete[] ew;
527  delete[] q;
528  delete[] iwork;
529  delete[] rwork;
530  delete[] work;
531  return 0;
532 }
533 
534 
535 
536 // ***************************************************************************
538 // ***************************************************************************
540 {
541  char jobz='V'; // Eigenvektoren berechnen
542  char uplo='U'; // obere Haelfte der Matrix wird gespeichert
543  integer n=A.rows(); // Ordnung des EWP bestimmen
544 
545  integer lwork =2*n-1;
546  doublecomplex *work = new doublecomplex[lwork];
547  double *rwork = new double[3*n-2];
548  integer info=0;
549 
550  EVec=A;
551  zheev_(&jobz, &uplo, &n, (doublecomplex*) EVec.get_fortran_matrix(), &n,
552  EW.get_fortran_vector(), work, &lwork, rwork, &info);
553 
554  if (!info==0)
555  {
556  STD__ cerr << " Error calculating eigenvalues: (status " << info << ")" << STD__ endl;
557  return info;
558  }
559 
560  // Alle alten Arrays loeschen
561  delete[] work;
562  delete[] rwork;
563  return 0;
564 }
565 
566 
568 {
569  char jobz='N'; // Eigenvektoren berechnen
570  char uplo='U'; // obere Haelfte der Matrix wird gespeichert
571  integer n=A.rows(); // Ordnung des EWP bestimmen
572 
573  integer lwork =2*n-1;
574  doublecomplex *work = new doublecomplex[lwork];
575  double *rwork = new double[3*n-2];
576  integer info=0;
577 
578  zheev_(&jobz, &uplo, &n, (doublecomplex*) A.get_fortran_matrix(), &n,
579  EW.get_fortran_vector(), work, &lwork, rwork, &info);
580 
581  if (!info==0)
582  {
583  STD__ cerr << " Error calculating eigenvalues: (status " << info << ")" << STD__ endl;
584  return info;
585  }
586 
587  // Alle alten Arrays loeschen
588  delete[] work;
589  delete[] rwork;
590  return 0;
591 }
592 
593 template class tbci_memalloc<doublecomplex>;
595 
int zgeev_(const char *jobvl, const char *jobvr, int *n, __complex__ double *a, int *lda, __complex__ double *w, __complex__ double *vl, int *ldvl, __complex__ double *vr, int *ldvr, __complex__ double *work, int *lwork, double *rwork, int *info)
const Vector< T > const Vector< T > & x
Definition: LM_fit.h:97
int dsbevx_(const char *jobz, const char *range, const char *uplo, int *n, int *kd, double *ab, int *ldab, double *q, int *ldq, double *vl, double *vu, int *il, int *iu, double *abstol, int *m, double *w, double *z, int *ldz, double *work, int *iwork, int *ifail, int *info)
double dlamch_(const char *)
provides basic Vector functionality but arithmetic operators (+=, - , *, /...).
Definition: bvector.h:67
TVector< T > get_col(const unsigned int) const
Definition: f_matrix.h:1606
long int own_ew_(long int *job, long int *up, long int *n, long int *m, __complex__ double *ab, long int *ldab, __complex__ double *bb, long int *ldbb, double *vl, double *vu, double *w, __complex__ double *q, long int *ldq, __complex__ double *work, double *rwork, long int *iwork)
– AHLAND driver routine (version 2.0) – Modified LAPACK-ROUTINE for the calculation of selected Eigen...
unsigned int ldab() const
Definition: f_bandmatrix.h:99
unsigned int columns() const
Definition: f_matrix.h:1213
long double fact(const double x)
Definition: mathplus.h:101
Our own complex class.
Definition: cplx.h:48
return c
Definition: f_matrix.h:760
F_TMatrix< double > inv(const F_Matrix< double > &A, int overwriteA=0)
Definition: lapack.cpp:181
#define NAMESPACE_TBCI
Definition: basics.h:317
F_TMatrix< double > lu_solve(const F_Matrix< double > &A, const F_Matrix< double > &B, int overwriteA=0)
Definition: lapack.cpp:156
F_Matrix< T > & resize(const unsigned r, const unsigned c)
Definition: f_matrix.h:1234
int dgesv_(int *n, int *nrhs, double *a, int *lda, int *ipiv, double *b, int *ldb, int *info)
T * get_fortran_matrix() const
Definition: f_matrix.h:1209
long int own_ev_(long int *n, long int *m, double *w, __complex__ double *z, long int *ldz, __complex__ double *q, long int *ldq, __complex__ double *work, double *rwork, long int *iwork, long int *ifail)
– AHLAND driver routine (version 2.0) –
int dsbev_(const char *jobz, const char *uplo, int *n, int *kd, double *ab, int *ldab, double *w, double *z, int *ldz, double *work, int *info)
T * get_fortran_matrix() const
Definition: f_matrix.h:181
doublereal r
Definition: f2c.h:34
void setval(const T val, const unsigned int r, const unsigned int c)
Definition: f_matrix.h:206
#define NEW(t, s)
Definition: malloc_cache.h:633
TVector< double > lu_solve_expert(const F_BandMatrix< double > &A, const Vector< double > &B, int equilibrate=1)
Solution of linear eqution systems, partial pivoting.
Definition: lapack.cpp:24
unsigned int numSub() const
Definition: f_bandmatrix.h:98
For specializations of the memory allocator:
Definition: malloc_cache.h:279
int dgbsvx_(const char *fact, const char *trans, int *n, int *kl, int *ku, int *nrhs, double *ab, int *ldab, double *afb, int *ldafb, int *ipiv, char *equed, double *r, double *c, double *b, int *ldb, double *x, int *ldx, double *rcond, double *ferr, double *berr, double *work, int *iwork, int *info)
unsigned int numSuper() const
Definition: f_bandmatrix.h:97
double doublereal
Definition: f2c.h:32
doublereal i
Definition: f2c.h:34
int integer
barf [ba:rf] 2.
Definition: f2c.h:27
unsigned long size() const
Definition: vector.h:104
int dsyev_(const char *jobz, const char *uplo, int *n, double *a, int *lda, double *w, double *work, int *lwork, int *info)
T *const & get_fortran_vector() const
Definition: bvector.h:164
C++ class for banded matrices using band storage in a one-dimensional array.
Definition: f_bandmatrix.h:46
#define CPLX__
Definition: basics.h:341
int zheev_(const char *jobz, const char *uplo, int *n, __complex__ double *a, int *lda, double *w, __complex__ double *work, int *lwork, double *rwork, int *info)
Temporary Base Class (non referable!) (acc.
Definition: bvector.h:50
int i
Definition: LM_fit.h:71
#define real
BVector< T > & resize(const BVector< T > &)
Actually it&#39;s a resize and copy (some people would expect the assignment op to do this) ...
Definition: bvector.h:361
int zgesv_(int *n, int *nrhs, __complex__ double *a, int *lda, int *ipiv, __complex__ double *b, int *ldb, int *info)
#define STD__
Definition: basics.h:338
#define TBCIDELETE(t, v, sz)
Definition: malloc_cache.h:634
Temporary Base Class Idiom: Class TVector is used for temporary variables.
Definition: bvector.h:52
#define NAMESPACE_END
Definition: basics.h:323
Definition: bvector.h:54
void set_col(const Vector< T > &, const unsigned int)
Definition: f_matrix.h:1600
const Vector< T > Vector< T > Vector< T > Vector< T > & y
Definition: LM_fit.h:172
unsigned int columns() const
Definition: f_bandmatrix.h:95
T *const & get_fortran_matrix() const
Definition: f_bandmatrix.h:141
int dgbsv_(int *n, int *kl, int *ku, int *nrhs, double *ab, int *ldab, int *ipiv, double *b, int *ldb, int *info)
int eig(const F_Matrix< double > &A, Vector< double > &EW)
eigenvalues (and eigenvectors) A*EV=EW*EV of symmetric double Matrix A
Definition: lapack.cpp:263
int imag(const int d)
Definition: basics.h:1068