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];
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
129TVector<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
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
181F_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
208F_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);
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);
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,
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
593template class tbci_memalloc<doublecomplex>;
595
const Vector< T > const Vector< T > & x
Definition LM_fit.h:97
int i
Definition LM_fit.h:71
doublereal y
Definition TOMS_707.C:27
#define STD__
Definition basics.h:338
#define NAMESPACE_END
Definition basics.h:323
#define NAMESPACE_TBCI
Definition basics.h:317
provides basic Vector functionality but arithmetic operators (+=, - , *, /...).
Definition bvector.h:68
T *const & get_fortran_vector() const
Definition bvector.h:164
BVector< T > & resize(const BVector< T > &)
Actually it's a resize and copy (some people would expect the assignment op to do this).
Definition bvector.h:361
C++ class for banded matrices using band storage in a one-dimensional array.
unsigned int columns() const
unsigned int ldab() const
T *const & get_fortran_matrix() const
unsigned int numSub() const
unsigned int numSuper() const
TVector< T > get_col(const unsigned int) const
Definition f_matrix.h:1606
void set_col(const Vector< T > &, const unsigned int)
Definition f_matrix.h:1600
T * get_fortran_matrix() const
Definition f_matrix.h:1209
F_Matrix< T > & resize(const unsigned r, const unsigned c)
Definition f_matrix.h:1234
unsigned int columns() const
Definition f_matrix.h:1213
Temporary Base Class (non referable!) (acc.
Definition f_matrix.h:71
T * get_fortran_matrix() const
Definition f_matrix.h:181
void setval(const T val, const unsigned int r, const unsigned int c)
Definition f_matrix.h:206
Temporary Base Class Idiom: Class TVector is used for temporary variables.
Definition vector.h:73
unsigned long size() const
Definition vector.h:104
Our own complex class.
Definition cplx.h:56
T imag(const TBCI__ cplx< T > &z)
Definition cplx.h:674
return c
Definition f_matrix.h:760
NAMESPACE_TBCI TVector< double > lu_solve_expert(const F_BandMatrix< double > &A, const Vector< double > &B, int equi)
Solution of linear eqution systems, partial pivoting.
Definition lapack.cpp:24
F_TMatrix< double > inv(const F_Matrix< double > &A, int overwriteA)
Definition lapack.cpp:181
TVector< double > lu_solve(const F_BandMatrix< double > &A, const Vector< double > &B)
Definition lapack.cpp:74
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 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)
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)
int zgesv_(int *n, int *nrhs, __complex__ double *a, int *lda, int *ipiv, __complex__ double *b, int *ldb, int *info)
double dlamch_(const char *)
int dsyev_(const char *jobz, const char *uplo, int *n, double *a, int *lda, double *w, double *work, int *lwork, int *info)
int dgbsv_(int *n, int *kl, int *ku, int *nrhs, double *ab, int *ldab, int *ipiv, double *b, int *ldb, int *info)
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)
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)
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)
int dgesv_(int *n, int *nrhs, double *a, int *lda, int *ipiv, double *b, int *ldb, int *info)
#define TBCIDELETE(t, v, sz)
#define NEW(t, s)
long double fact(const double x)
Definition mathplus.h:101
#define doublereal
#define integer
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) –
#define real
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...
#define doublecomplex
doublereal i
Definition f2c.h:34
doublereal r
Definition f2c.h:34
For specializations of the memory allocator: