Changeset 2561 in Sophya for trunk/SophyaExt/LinAlg/intflapack.cc
- Timestamp:
- Jul 23, 2004, 12:53:35 PM (21 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaExt/LinAlg/intflapack.cc
r2559 r2561 128 128 complex<r_8>* work, int_4* lwork, r_8* rwork, int_4* info); 129 129 130 // Driver pour decomposition SVD Divide and Conquer 131 void sgesdd_(char* jobz, int_4* m, int_4* n, r_4* a, int_4* lda, 132 r_4* s, r_4* u, int_4* ldu, r_4* vt, int_4* ldvt, 133 r_4* work, int_4* lwork, int_4* iwork, int_4* info); 134 void dgesdd_(char* jobz, int_4* m, int_4* n, r_8* a, int_4* lda, 135 r_8* s, r_8* u, int_4* ldu, r_8* vt, int_4* ldvt, 136 r_8* work, int_4* lwork, int_4* iwork, int_4* info); 137 void cgesdd_(char* jobz, int_4* m, int_4* n, complex<r_4>* a, int_4* lda, 138 r_4* s, complex<r_4>* u, int_4* ldu, complex<r_4>* vt, int_4* ldvt, 139 complex<r_4>* work, int_4* lwork, r_4* rwork, int_4* iwork, int_4* info); 140 void zgesdd_(char* jobz, int_4* m, int_4* n, complex<r_8>* a, int_4* lda, 141 r_8* s, complex<r_8>* u, int_4* ldu, complex<r_8>* vt, int_4* ldvt, 142 complex<r_8>* work, int_4* lwork, r_8* rwork, int_4* iwork, int_4* info); 143 130 144 // Driver pour eigen decomposition for symetric/hermitian matrices 131 145 void ssyev_(char* jobz, char* uplo, int_4* n, r_4* a, int_4* lda, r_4* w, … … 253 267 \param a : input matrix symetric , overwritten on output 254 268 \param b : input-output, input vector b, contains x on exit 255 \return : return code from lapack driver _gesv()269 \return : return code from lapack driver 256 270 */ 257 271 template <class T> … … 347 361 { 348 362 if ( ( a.NbDimensions() != 2 ) || ( b.NbDimensions() != 2 ) ) 349 throw(SzMismatchError("LapackServer::L inSolve(a,b) a Or b NbDimensions() != 2"));363 throw(SzMismatchError("LapackServer::LeastSquareSolve(a,b) a Or b NbDimensions() != 2")); 350 364 351 365 int_4 rowa = a.RowsKA(); … … 450 464 { 451 465 if ( ( a.NbDimensions() != 2 ) ) 452 throw(SzMismatchError("LapackServer::SVD (a, ...) a.NbDimensions() != 2"));466 throw(SzMismatchError("LapackServer::SVDDriver(a, ...) a.NbDimensions() != 2")); 453 467 454 468 int_4 rowa = a.RowsKA(); … … 456 470 457 471 if ( !a.IsPacked(rowa) ) 458 throw(SzMismatchError("LapackServer::SVD (a, ...) a Not Column Packed "));472 throw(SzMismatchError("LapackServer::SVDDriver(a, ...) a Not Column Packed ")); 459 473 460 474 int_4 m = a.Size(rowa); … … 470 484 if ( up != NULL) { 471 485 if ( dynamic_cast< TVector<T> * > (vtp) ) 472 throw( TypeMismatchExc("LapackServer::SVD () Wrong type (=TVector<T>) for u !") );486 throw( TypeMismatchExc("LapackServer::SVDDriver() Wrong type (=TVector<T>) for u !") ); 473 487 up->SetMemoryMapping(BaseArray::FortranMemoryMapping); 474 488 sz[0] = sz[1] = m; … … 482 496 if ( vtp != NULL) { 483 497 if ( dynamic_cast< TVector<T> * > (vtp) ) 484 throw( TypeMismatchExc("LapackServer::SVD () Wrong type (=TVector<T>) for vt !") );498 throw( TypeMismatchExc("LapackServer::SVDDriver() Wrong type (=TVector<T>) for vt !") ); 485 499 vtp->SetMemoryMapping(BaseArray::FortranMemoryMapping); 486 500 sz[0] = sz[1] = n; … … 510 524 int_4 lwork = maxmn*5*wspace_size_factor; 511 525 T * work = new T[lwork]; 512 int_4 info; 526 int_4 info; 513 527 514 528 if (typeid(T) == typeid(r_4) ) { … … 543 557 string tn = typeid(T).name(); 544 558 cerr << " LapackServer::SVDDriver(...) - Unsupported DataType T = " << tn << endl; 545 throw TypeMismatchExc("LapackServer:: LinSolve(a,b) - Unsupported DataType (T)");559 throw TypeMismatchExc("LapackServer::SVDDriver(a,b) - Unsupported DataType (T)"); 546 560 } 547 561 548 562 if (jobu == 'N') delete up; 549 563 if (jobvt == 'N') delete vtp; 564 return(info); 565 } 566 567 568 //! Interface to Lapack SVD driver s/d/c/zgesdd(). 569 /*! Same as SVD but with Divide and Conquer method */ 570 template <class T> 571 int LapackServer<T>::SVD_DC(TMatrix<T>& a, TVector<T>& s, TMatrix<T>& u, TMatrix<T>& vt) 572 { 573 574 if ( !a.IsPacked() ) 575 throw(SzMismatchError("LapackServer::SVD_DC(a, ...) a Not Packed ")); 576 577 int_4 m = a.NRows(); 578 int_4 n = a.NCols(); 579 int_4 maxmn = (m > n) ? m : n; 580 int_4 minmn = (m < n) ? m : n; 581 int_4 supermax = 4*minmn*minmn+4*minmn; if(maxmn>supermax) supermax=maxmn; 582 583 char jobz = 'A'; 584 585 s.ReSize(minmn); 586 u.ReSize(m,m); 587 vt.ReSize(n,n); 588 589 int_4 lda = n; 590 int_4 ldu = u.NCols(); 591 int_4 ldvt = vt.NCols(); 592 int_4 info; 593 594 if(typeid(T) == typeid(r_4) ) { 595 int_4 lwork = 3*minmn*minmn + supermax; 596 r_4* work = new r_4[lwork +5]; 597 int_4* iwork = new int_4[8*minmn +5]; 598 sgesdd_(&jobz,&m,&n,(r_4*)a.Data(),&lda, 599 (r_4*)s.Data(),(r_4*)u.Data(),&ldu,(r_4*)vt.Data(),&ldvt, 600 (r_4*)work,&lwork,(int_4*)iwork,&info); 601 delete [] work; delete [] iwork; 602 } else if(typeid(T) == typeid(r_8) ) { 603 int_4 lwork = 3*minmn*minmn + supermax; 604 r_8* work = new r_8[lwork +5]; 605 int_4* iwork = new int_4[8*minmn +5]; 606 dgesdd_(&jobz,&m,&n,(r_8*)a.Data(),&lda, 607 (r_8*)s.Data(),(r_8*)u.Data(),&ldu,(r_8*)vt.Data(),&ldvt, 608 (r_8*)work,&lwork,(int_4*)iwork,&info); 609 delete [] work; delete [] iwork; 610 } else if(typeid(T) == typeid(complex<r_4>) ) { 611 r_4* sloc = new r_4[minmn]; 612 int_4 lwork = minmn*minmn+2*minmn+maxmn; 613 complex<r_4>* work = new complex<r_4>[lwork +5]; 614 r_4* rwork = new r_4[5*minmn*minmn+5*minmn +5]; 615 int_4* iwork = new int_4[8*minmn +5]; 616 cgesdd_(&jobz,&m,&n,(complex<r_4>*)a.Data(),&lda, 617 (r_4*)sloc,(complex<r_4>*)u.Data(),&ldu,(complex<r_4>*)vt.Data(),&ldvt, 618 (complex<r_4>*)work,&lwork,(r_4*)rwork,(int_4*)iwork,&info); 619 for(int_4 i=0;i<minmn;i++) s[i] = sloc[i]; 620 delete [] sloc; delete [] work; delete [] rwork; delete [] iwork; 621 } else if(typeid(T) == typeid(complex<r_8>) ) { 622 r_8* sloc = new r_8[minmn]; 623 int_4 lwork = minmn*minmn+2*minmn+maxmn; 624 complex<r_8>* work = new complex<r_8>[lwork +5]; 625 r_8* rwork = new r_8[5*minmn*minmn+5*minmn +5]; 626 int_4* iwork = new int_4[8*minmn +5]; 627 zgesdd_(&jobz,&m,&n,(complex<r_8>*)a.Data(),&lda, 628 (r_8*)sloc,(complex<r_8>*)u.Data(),&ldu,(complex<r_8>*)vt.Data(),&ldvt, 629 (complex<r_8>*)work,&lwork,(r_8*)rwork,(int_4*)iwork,&info); 630 for(int_4 i=0;i<minmn;i++) s[i] = sloc[i]; 631 delete [] sloc; delete [] work; delete [] rwork; delete [] iwork; 632 } else { 633 string tn = typeid(T).name(); 634 cerr << " LapackServer::SVD_DC(...) - Unsupported DataType T = " << tn << endl; 635 throw TypeMismatchExc("LapackServer::SVD_DC - Unsupported DataType (T)"); 636 } 637 550 638 return(info); 551 639 } … … 559 647 \param eigenvector : if true compute eigenvectors, if not only eigenvalues 560 648 \param a : on return array of eigenvectors (same order than eval, one vector = one column) 561 \return : return code from lapack driver _gesvd()649 \return : return code from lapack driver 562 650 */ 563 651 … … 574 662 throw(SzMismatchError("LapackServer::LapackEigenSym(a,b) a Not Column Packed")); 575 663 576 char uplo='U'; char struplo[5]; struplo[0]=uplo; struplo[1]='\0';664 char uplo='U'; 577 665 char jobz='N'; if(eigenvector) jobz='V'; 578 char strjobz[5]; strjobz[0]=jobz; strjobz[1]='\0';579 666 580 667 int_4 n = a.Size(rowa); … … 587 674 int_4 lwork = 3*n-1 +5; r_4* work = new r_4[lwork]; 588 675 r_4* w = new r_4[n]; 589 ssyev_( strjobz,struplo,&n,(r_4 *)a.Data(),&lda,(r_4 *)w,(r_4 *)work,&lwork,&info);676 ssyev_(&jobz,&uplo,&n,(r_4 *)a.Data(),&lda,(r_4 *)w,(r_4 *)work,&lwork,&info); 590 677 if(info==0) for(int i=0;i<n;i++) b(i) = w[i]; 591 678 delete [] work; delete [] w; … … 593 680 int_4 lwork = 3*n-1 +5; r_8* work = new r_8[lwork]; 594 681 r_8* w = new r_8[n]; 595 dsyev_( strjobz,struplo,&n,(r_8 *)a.Data(),&lda,(r_8 *)w,(r_8 *)work,&lwork,&info);682 dsyev_(&jobz,&uplo,&n,(r_8 *)a.Data(),&lda,(r_8 *)w,(r_8 *)work,&lwork,&info); 596 683 if(info==0) for(int i=0;i<n;i++) b(i) = w[i]; 597 684 delete [] work; delete [] w; … … 599 686 int_4 lwork = 2*n-1 +5; complex<r_4>* work = new complex<r_4>[lwork]; 600 687 r_4* rwork = new r_4[3*n-2 +5]; r_4* w = new r_4[n]; 601 cheev_( strjobz,struplo,&n,(complex<r_4> *)a.Data(),&lda,(r_4 *)w688 cheev_(&jobz,&uplo,&n,(complex<r_4> *)a.Data(),&lda,(r_4 *)w 602 689 ,(complex<r_4> *)work,&lwork,(r_4 *)rwork,&info); 603 690 if(info==0) for(int i=0;i<n;i++) b(i) = w[i]; … … 606 693 int_4 lwork = 2*n-1 +5; complex<r_8>* work = new complex<r_8>[lwork]; 607 694 r_8* rwork = new r_8[3*n-2 +5]; r_8* w = new r_8[n]; 608 zheev_( strjobz,struplo,&n,(complex<r_8> *)a.Data(),&lda,(r_8 *)w695 zheev_(&jobz,&uplo,&n,(complex<r_8> *)a.Data(),&lda,(r_8 *)w 609 696 ,(complex<r_8> *)work,&lwork,(r_8 *)rwork,&info); 610 697 if(info==0) for(int i=0;i<n;i++) b(i) = w[i]; … … 627 714 \param eigenvector : if true compute (right) eigenvectors, if not only eigenvalues 628 715 \param a : on return array of eigenvectors 629 \return : return code from lapack driver _gesvd()716 \return : return code from lapack driver 630 717 \verbatim 631 718 eval : contains the computed eigenvalues. … … 656 743 throw(SzMismatchError("LapackServer::LapackEigen(a,b) a Not Column Packed")); 657 744 658 char jobvl = 'N'; char strjobvl[5]; strjobvl[0] = jobvl; strjobvl[1] = '\0';745 char jobvl = 'N'; 659 746 char jobvr = 'N'; if(eigenvector) jobvr='V'; 660 char strjobvr[5]; strjobvr[0] = jobvr; strjobvr[1] = '\0';661 747 662 748 int_4 n = a.Size(rowa); … … 671 757 int_4 lwork = 4*n +5; r_4* work = new r_4[lwork]; 672 758 r_4* wr = new r_4[n]; r_4* wi = new r_4[n]; r_4* vl = NULL; 673 sgeev_( strjobvl,strjobvr,&n,(r_4 *)a.Data(),&lda,(r_4 *)wr,(r_4 *)wi,759 sgeev_(&jobvl,&jobvr,&n,(r_4 *)a.Data(),&lda,(r_4 *)wr,(r_4 *)wi, 674 760 (r_4 *)vl,&ldvl,(r_4 *)evec.Data(),&ldvr, 675 761 (r_4 *)work,&lwork,&info); … … 679 765 int_4 lwork = 4*n +5; r_8* work = new r_8[lwork]; 680 766 r_8* wr = new r_8[n]; r_8* wi = new r_8[n]; r_8* vl = NULL; 681 dgeev_( strjobvl,strjobvr,&n,(r_8 *)a.Data(),&lda,(r_8 *)wr,(r_8 *)wi,767 dgeev_(&jobvl,&jobvr,&n,(r_8 *)a.Data(),&lda,(r_8 *)wr,(r_8 *)wi, 682 768 (r_8 *)vl,&ldvl,(r_8 *)evec.Data(),&ldvr, 683 769 (r_8 *)work,&lwork,&info); … … 687 773 int_4 lwork = 2*n +5; complex<r_4>* work = new complex<r_4>[lwork]; 688 774 r_4* rwork = new r_4[2*n+5]; r_4* vl = NULL; TVector< complex<r_4> > w(n); 689 cgeev_( strjobvl,strjobvr,&n,(complex<r_4> *)a.Data(),&lda,(complex<r_4> *)w.Data(),775 cgeev_(&jobvl,&jobvr,&n,(complex<r_4> *)a.Data(),&lda,(complex<r_4> *)w.Data(), 690 776 (complex<r_4> *)vl,&ldvl,(complex<r_4> *)evec.Data(),&ldvr, 691 777 (complex<r_4> *)work,&lwork,(r_4 *)rwork,&info); … … 695 781 int_4 lwork = 2*n +5; complex<r_8>* work = new complex<r_8>[lwork]; 696 782 r_8* rwork = new r_8[2*n+5]; r_8* vl = NULL; 697 zgeev_( strjobvl,strjobvr,&n,(complex<r_8> *)a.Data(),&lda,(complex<r_8> *)eval.Data(),783 zgeev_(&jobvl,&jobvr,&n,(complex<r_8> *)a.Data(),&lda,(complex<r_8> *)eval.Data(), 698 784 (complex<r_8> *)vl,&ldvl,(complex<r_8> *)evec.Data(),&ldvr, 699 785 (complex<r_8> *)work,&lwork,(r_8 *)rwork,&info);
Note:
See TracChangeset
for help on using the changeset viewer.