Changeset 2572 in Sophya for trunk/SophyaExt/LinAlg
- Timestamp:
- Jul 28, 2004, 4:21:21 PM (21 years ago)
- Location:
- trunk/SophyaExt/LinAlg
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaExt/LinAlg/intflapack.cc
r2567 r2572 199 199 } 200 200 201 // --- ATTENTION BUG POSSIBLE dans l'avenir (CMV) --- REZA A LIRE S.T.P.202 // -> Cette connerie de Fortran/C interface203 // Dans les routines fortran de lapack:204 // Appel depuis le C avec:205 // int_4 lwork = -1;206 // SUBROUTINE SSYSV( UPLO,N,NRHS,A,LDA,IPIV,B,LDB,WORK,LWORK,INFO)207 // INTEGER INFO, LDA, LDB, LWORK, N, NRHS208 // LOGICAL LQUERY209 // LQUERY = ( LWORK.EQ.-1 )210 // ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN211 // ==> le test est bien interprete sous Linux mais pas sous OSF212 // ==> Sous OSF "LWORK.EQ.-1" est FALSE quand on passe lwork=-1 par argument213 // ==> POUR REZA: confusion entier 4 / 8 bits ??? (bizarre on l'aurait vu avant?)214 201 //////////////////////////////////////////////////////////////////////////////////// 215 202 template <class T> 216 203 int_4 LapackServer<T>::ilaenv_en_C(int_4 ispec,char *name,char *opts,int_4 n1,int_4 n2,int_4 n3,int_4 n4) 217 204 { 218 int_4 nc1 = strlen(name); 219 int_4 nc2 = strlen(opts); 220 int_4 rc=0; 205 int_4 nc1 = strlen(name), nc2 = strlen(opts), rc=0; 221 206 rc = ilaenv_(&ispec,name,opts,&n1,&n2,&n3,&n4,nc1,nc2); 222 207 //cout<<"ilaenv_en_C("<<ispec<<","<<name<<"("<<nc1<<"),"<<opts<<"("<<nc2<<")," 223 208 // <<n1<<","<<n2<<","<<n3<<","<<n4<<") = "<<rc<<endl; 224 209 return rc; 210 } 211 212 template <class T> 213 int_4 LapackServer<T>::type2i4(void *val,int nbytes) 214 // Retourne un entier contenant la valeur contenue dans val 215 // - nbytes = nombre de bytes dans le contenu de val 216 // ex: r_4 x = 3.4; type2i4(&x,4) -> 3 217 // ex: r_8 x = 3.4; type2i4(&x,8) -> 3 218 // ex: complex<r_4> x(3.4,7.8); type2i4(&x,4) -> 3 219 // ex: complex<r_8> x(3.4,7.8); type2i4(&x,8) -> 3 220 { 221 r_4* x4; r_8* x8; int_4 lw=0; 222 if(nbytes==4) {x4 = (r_4*)val; lw = (int_4)(*x4);} 223 else {x8 = (r_8*)val; lw = (int_4)(*x8);} 224 return lw; 225 225 } 226 226 … … 317 317 int_4 lwork = -1; 318 318 T * work = NULL; 319 T wkget[2]; 319 320 320 321 char uplo = 'U'; // char uplo = 'L'; … … 322 323 323 324 if (typeid(T) == typeid(r_4) ) { 324 lwork = ilaenv_en_C(1,"SSYTRF",struplo,n,-1,-1,-1) * n; 325 work = new T[lwork +GARDMEM]; 325 ssysv_(&uplo, &n, &nrhs, (r_4 *)a.Data(), &lda, ipiv, (r_4 *)b.Data(), &ldb, 326 (r_4 *)wkget, &lwork, &info); 327 lwork = type2i4(&wkget[0],4); work = new T[lwork +GARDMEM]; 326 328 ssysv_(&uplo, &n, &nrhs, (r_4 *)a.Data(), &lda, ipiv, (r_4 *)b.Data(), &ldb, 327 329 (r_4 *)work, &lwork, &info); 328 330 } else if (typeid(T) == typeid(r_8) ) { 329 lwork = ilaenv_en_C(1,"DSYTRF",struplo,n,-1,-1,-1) * n; 330 work = new T[lwork +GARDMEM]; 331 dsysv_(&uplo, &n, &nrhs, (r_8 *)a.Data(), &lda, ipiv, (r_8 *)b.Data(), &ldb, 332 (r_8 *)wkget, &lwork, &info); 333 lwork = type2i4(&wkget[0],8); work = new T[lwork +GARDMEM]; 331 334 dsysv_(&uplo, &n, &nrhs, (r_8 *)a.Data(), &lda, ipiv, (r_8 *)b.Data(), &ldb, 332 335 (r_8 *)work, &lwork, &info); 333 336 } else if (typeid(T) == typeid(complex<r_4>) ) { 334 lwork = ilaenv_en_C(1,"CSYTRF",struplo,n,-1,-1,-1) * n; 335 work = new T[lwork +GARDMEM]; 337 csysv_(&uplo, &n, &nrhs, (complex<r_4> *)a.Data(), &lda, ipiv, 338 (complex<r_4> *)b.Data(), &ldb, 339 (complex<r_4> *)wkget, &lwork, &info); 340 lwork = type2i4(&wkget[0],4); work = new T[lwork +GARDMEM]; 336 341 csysv_(&uplo, &n, &nrhs, (complex<r_4> *)a.Data(), &lda, ipiv, 337 342 (complex<r_4> *)b.Data(), &ldb, 338 343 (complex<r_4> *)work, &lwork, &info); 339 344 } else if (typeid(T) == typeid(complex<r_8>) ) { 340 lwork = ilaenv_en_C(1,"ZSYTRF",struplo,n,-1,-1,-1) * n; 341 work = new T[lwork +GARDMEM]; 345 zsysv_(&uplo, &n, &nrhs, (complex<r_8> *)a.Data(), &lda, ipiv, 346 (complex<r_8> *)b.Data(), &ldb, 347 (complex<r_8> *)wkget, &lwork, &info); 348 lwork = type2i4(&wkget[0],8); work = new T[lwork +GARDMEM]; 342 349 zsysv_(&uplo, &n, &nrhs, (complex<r_8> *)a.Data(), &lda, ipiv, 343 350 (complex<r_8> *)b.Data(), &ldb, … … 410 417 if (maxmnrhs < 1) maxmnrhs = 1; 411 418 412 int_4 lwork = minmn+maxmnrhs*5; 413 T * work = new T[lwork]; 419 int_4 lwork = -1; //minmn+maxmnrhs*5; 420 T * work = NULL; 421 T wkget[2]; 414 422 415 423 char trans = 'N'; 416 424 417 if (typeid(T) == typeid(r_4) ) 425 if (typeid(T) == typeid(r_4) ) { 426 sgels_(&trans, &m, &n, &nrhs, (r_4 *)a.Data(), &lda, 427 (r_4 *)b.Data(), &ldb, (r_4 *)wkget, &lwork, &info); 428 lwork = type2i4(&wkget[0],4); work = new T[lwork +GARDMEM]; 418 429 sgels_(&trans, &m, &n, &nrhs, (r_4 *)a.Data(), &lda, 419 430 (r_4 *)b.Data(), &ldb, (r_4 *)work, &lwork, &info); 420 else if (typeid(T) == typeid(r_8) ) 431 } else if (typeid(T) == typeid(r_8) ) { 432 dgels_(&trans, &m, &n, &nrhs, (r_8 *)a.Data(), &lda, 433 (r_8 *)b.Data(), &ldb, (r_8 *)wkget, &lwork, &info); 434 lwork = type2i4(&wkget[0],8); work = new T[lwork +GARDMEM]; 421 435 dgels_(&trans, &m, &n, &nrhs, (r_8 *)a.Data(), &lda, 422 436 (r_8 *)b.Data(), &ldb, (r_8 *)work, &lwork, &info); 423 else if (typeid(T) == typeid(complex<r_4>) ) 437 } else if (typeid(T) == typeid(complex<r_4>) ) { 438 cgels_(&trans, &m, &n, &nrhs, (complex<r_4> *)a.Data(), &lda, 439 (complex<r_4> *)b.Data(), &ldb, (complex<r_4> *)wkget, &lwork, &info); 440 lwork = type2i4(&wkget[0],4); work = new T[lwork +GARDMEM]; 424 441 cgels_(&trans, &m, &n, &nrhs, (complex<r_4> *)a.Data(), &lda, 425 442 (complex<r_4> *)b.Data(), &ldb, (complex<r_4> *)work, &lwork, &info); 426 else if (typeid(T) == typeid(complex<r_8>) ) 443 } else if (typeid(T) == typeid(complex<r_8>) ) { 444 zgels_(&trans, &m, &n, &nrhs, (complex<r_8> *)a.Data(), &lda, 445 (complex<r_8> *)b.Data(), &ldb, (complex<r_8> *)wkget, &lwork, &info); 446 lwork = type2i4(&wkget[0],8); work = new T[lwork +GARDMEM]; 427 447 zgels_(&trans, &m, &n, &nrhs, (complex<r_8> *)a.Data(), &lda, 428 448 (complex<r_8> *)b.Data(), &ldb, (complex<r_8> *)work, &lwork, &info); 429 else {430 delete[] work;449 } else { 450 if(work) delete [] work; work=NULL; 431 451 string tn = typeid(T).name(); 432 452 cerr << " LapackServer::LeastSquareSolve(a,b) - Unsupported DataType T = " << tn << endl; 433 453 throw TypeMismatchExc("LapackServer::LeastSquareSolve(a,b) - Unsupported DataType (T)"); 434 454 } 435 delete[] work;455 if(work) delete [] work; 436 456 return(info); 437 457 } … … 447 467 \param b : input vector b overwritten by solution on output (beware of size changing) 448 468 \param x : output matrix of solutions. 469 \param rank : output the rank of the matrix. 449 470 \return : return code from lapack driver _gelsd() 450 471 \warning : b is not resized. … … 462 483 int_4 n = a.NCols(); 463 484 464 if(b.NRows() != n)485 if(b.NRows() != m) 465 486 throw(SzMismatchError("LapackServer::LeastSquareSolveSVD_DC(a,b) bad matching dim between a and b")); 466 487 … … 469 490 int_4 maxmn = (m > n) ? m : n; 470 491 471 if(b.NRows() != n)472 throw(SzMismatchError("LapackServer::LeastSquareSolveSVD_DC(a,b) bad matching dim between a and b"));473 474 492 int_4 lda = m; 475 493 int_4 ldb = maxmn; 476 494 int_4 info; 477 495 478 { // Use {} for automatic des-alloc bsave479 TMatrix<T> bsave( n,nrhs); bsave.SetMemoryMapping(BaseArray::FortranMemoryMapping);496 { // Use {} for automatic des-allocation of "bsave" 497 TMatrix<T> bsave(m,nrhs); bsave.SetMemoryMapping(BaseArray::FortranMemoryMapping); 480 498 bsave = b; 481 499 b.ReSize(maxmn,nrhs); b = (T) 0; 482 for(int i=0;i< n;i++) for(int j=0;j<nrhs;j++) b(i,j) = bsave(i,j);483 } 500 for(int i=0;i<m;i++) for(int j=0;j<nrhs;j++) b(i,j) = bsave(i,j); 501 } // Use {} for automatic des-allocation of "bsave" 484 502 s.ReSize(minmn); 485 503 486 int_4 smlsiz = 25; 504 int_4 smlsiz = 25; // Normallement ilaenv_en_C(9,...) renvoie toujours 25 487 505 if(typeid(T) == typeid(r_4) ) smlsiz = ilaenv_en_C(9,"SGELSD"," ",0,0,0,0); 488 506 else if(typeid(T) == typeid(r_8) ) smlsiz = ilaenv_en_C(9,"DGELSD"," ",0,0,0,0); … … 490 508 else if(typeid(T) == typeid(complex<r_8>) ) smlsiz = ilaenv_en_C(9,"ZGELSD"," ",0,0,0,0); 491 509 if(smlsiz<0) smlsiz = 0; 492 493 510 r_8 dum = log((r_8)minmn/(r_8)(smlsiz+1.)) / log(2.); 494 511 int_4 nlvl = int_4(dum) + 1; if(nlvl<0) nlvl = 0; 495 512 513 T * work = NULL; 514 int_4 * iwork = NULL; 515 int_4 lwork=-1, lrwork; 516 T wkget[2]; 517 496 518 if(typeid(T) == typeid(r_4) ) { 497 int_4 lwork = 12*minmn + 2*minmn*smlsiz + 8*minmn*nlvl + minmn*nrhs + (smlsiz+1)*(smlsiz+1);498 r_4* work = new r_4[lwork +GARDMEM];499 int_4* iwork = new int_4[3*minmn*nlvl+11*minmn +GARDMEM];500 519 r_4* sloc = new r_4[minmn]; 501 520 r_4 srcond = rcond; 521 iwork = new int_4[3*minmn*nlvl+11*minmn +GARDMEM]; 522 sgelsd_(&m,&n,&nrhs,(r_4*)a.Data(),&lda, 523 (r_4*)b.Data(),&ldb,(r_4*)sloc,&srcond,&rank, 524 (r_4*)wkget,&lwork,(int_4*)iwork,&info); 525 lwork = type2i4(&wkget[0],4); work = new T[lwork +GARDMEM]; 502 526 sgelsd_(&m,&n,&nrhs,(r_4*)a.Data(),&lda, 503 527 (r_4*)b.Data(),&ldb,(r_4*)sloc,&srcond,&rank, 504 528 (r_4*)work,&lwork,(int_4*)iwork,&info); 505 529 for(int_4 i=0;i<minmn;i++) s(i) = sloc[i]; 506 delete [] sloc; delete [] work; delete [] iwork;530 delete [] sloc; 507 531 } else if(typeid(T) == typeid(r_8) ) { 508 int_4 lwork = 12*minmn + 2*minmn*smlsiz + 8*minmn*nlvl + minmn*nrhs + (smlsiz+1)*(smlsiz+1); 509 r_8* work = new r_8[lwork +GARDMEM]; 510 int_4* iwork = new int_4[3*minmn*nlvl+11*minmn +GARDMEM]; 532 iwork = new int_4[3*minmn*nlvl+11*minmn +GARDMEM]; 533 dgelsd_(&m,&n,&nrhs,(r_8*)a.Data(),&lda, 534 (r_8*)b.Data(),&ldb,(r_8*)s.Data(),&rcond,&rank, 535 (r_8*)wkget,&lwork,(int_4*)iwork,&info); 536 lwork = type2i4(&wkget[0],8); work = new T[lwork +GARDMEM]; 511 537 dgelsd_(&m,&n,&nrhs,(r_8*)a.Data(),&lda, 512 538 (r_8*)b.Data(),&ldb,(r_8*)s.Data(),&rcond,&rank, 513 539 (r_8*)work,&lwork,(int_4*)iwork,&info); 514 delete [] work; delete [] iwork;515 540 } else if(typeid(T) == typeid(complex<r_4>) ) { 516 int_4 lwork = 2*minmn + minmn*nrhs; 517 complex<r_4>* work = new complex<r_4>[lwork +GARDMEM]; 518 int_4 lrwork = 10*minmn + 2*minmn*smlsiz + 8*minmn*nlvl + 3*smlsiz*nrhs + (smlsiz+1)*(smlsiz+1); 541 // Cf meme remarque que ci-dessous (complex<r_8) 542 lrwork = 10*minmn + 2*minmn*smlsiz + 8*minmn*nlvl + 3*smlsiz*nrhs + (smlsiz+1)*(smlsiz+1); 543 int_4 lrwork_d = 12*minmn + 2*minmn*smlsiz + 8*minmn*nlvl + minmn*nrhs + (smlsiz+1)*(smlsiz+1); 544 if(lrwork_d > lrwork) lrwork = lrwork_d; 519 545 r_4* rwork = new r_4[lrwork +GARDMEM]; 520 i nt_4* iwork = new int_4[3*minmn*nlvl+11*minmn +GARDMEM];546 iwork = new int_4[3*minmn*nlvl+11*minmn +GARDMEM]; 521 547 r_4* sloc = new r_4[minmn]; 522 548 r_4 srcond = rcond; 523 549 cgelsd_(&m,&n,&nrhs,(complex<r_4>*)a.Data(),&lda, 524 550 (complex<r_4>*)b.Data(),&ldb,(r_4*)sloc,&srcond,&rank, 551 (complex<r_4>*)wkget,&lwork,(r_4*)rwork,(int_4*)iwork,&info); 552 lwork = type2i4(&wkget[0],4); work = new T[lwork +GARDMEM]; 553 cgelsd_(&m,&n,&nrhs,(complex<r_4>*)a.Data(),&lda, 554 (complex<r_4>*)b.Data(),&ldb,(r_4*)sloc,&srcond,&rank, 525 555 (complex<r_4>*)work,&lwork,(r_4*)rwork,(int_4*)iwork,&info); 526 556 for(int_4 i=0;i<minmn;i++) s(i) = sloc[i]; 527 delete [] sloc; delete [] work; delete [] rwork; delete [] iwork;557 delete [] sloc; delete [] rwork; 528 558 } else if(typeid(T) == typeid(complex<r_8>) ) { 529 int_4 lwork = 2*minmn + minmn*nrhs; 530 complex<r_8>* work = new complex<r_8>[lwork +GARDMEM]; 531 int_4 lrwork = 10*minmn + 2*minmn*smlsiz + 8*minmn*nlvl + 3*smlsiz*nrhs + (smlsiz+1)*(smlsiz+1); 559 // CMV: Bizarrement, la formule donnee dans zgelsd() plante pour des N grands (500) 560 // On prend (par analogie) la formule pour "lwork" de dgelsd() 561 lrwork = 10*minmn + 2*minmn*smlsiz + 8*minmn*nlvl + 3*smlsiz*nrhs + (smlsiz+1)*(smlsiz+1); 562 int_4 lrwork_d = 12*minmn + 2*minmn*smlsiz + 8*minmn*nlvl + minmn*nrhs + (smlsiz+1)*(smlsiz+1); 563 if(lrwork_d > lrwork) lrwork = lrwork_d; 532 564 r_8* rwork = new r_8[lrwork +GARDMEM]; 533 int_4* iwork = new int_4[3*minmn*nlvl+11*minmn +GARDMEM]; 534 r_8 srcond = rcond; 565 iwork = new int_4[3*minmn*nlvl+11*minmn +GARDMEM]; 535 566 zgelsd_(&m,&n,&nrhs,(complex<r_8>*)a.Data(),&lda, 536 (complex<r_8>*)b.Data(),&ldb,(r_8*)s.Data(),&srcond,&rank, 567 (complex<r_8>*)b.Data(),&ldb,(r_8*)s.Data(),&rcond,&rank, 568 (complex<r_8>*)wkget,&lwork,(r_8*)rwork,(int_4*)iwork,&info); 569 lwork = type2i4(&wkget[0],8); work = new T[lwork +GARDMEM]; 570 zgelsd_(&m,&n,&nrhs,(complex<r_8>*)a.Data(),&lda, 571 (complex<r_8>*)b.Data(),&ldb,(r_8*)s.Data(),&rcond,&rank, 537 572 (complex<r_8>*)work,&lwork,(r_8*)rwork,(int_4*)iwork,&info); 538 delete [] work; delete [] rwork; delete [] iwork;573 delete [] rwork; 539 574 } else { 575 if(work) delete [] work; work=NULL; 576 if(iwork) delete [] iwork; iwork=NULL; 540 577 string tn = typeid(T).name(); 541 578 cerr << " LapackServer::LeastSquareSolveSVD_DC(a,b) - Unsupported DataType T = " << tn << endl; … … 543 580 } 544 581 582 if(work) delete [] work; if(iwork) delete [] iwork; 545 583 return(info); 546 584 } … … 572 610 \f] 573 611 U and V are orthogonal (unitary) matrices. 574 \param a : input m-by-n matrix (in Fo tranMemoryMapping)612 \param a : input m-by-n matrix (in FortranMemoryMapping) 575 613 \param s : Vector of min(m,n) singular values (descending order) 576 \param u : Matrix of left singular vectors577 \param vt : Transpose of right singular vectors .614 \param u : m-by-m Matrix of left singular vectors 615 \param vt : Transpose of right singular vectors (n-by-n matrix). 578 616 \return : return code from lapack driver _gesvd() 579 617 */ … … 649 687 int_4 info; 650 688 651 int_4 lwork = maxmn*5*wspace_size_factor; 652 T * work = new T[lwork]; 689 int_4 lwork = -1; // maxmn*5 *wspace_size_factor; 690 T * work = NULL; // = new T[lwork]; 691 T wkget[2]; 653 692 654 693 if (typeid(T) == typeid(r_4) ) { 694 sgesvd_(&jobu, &jobvt, &m, &n, (r_4 *)a.Data(), &lda, 695 (r_4 *)s.Data(), (r_4 *) up->Data(), &ldu, (r_4 *)vtp->Data(), &ldvt, 696 (r_4 *)wkget, &lwork, &info); 697 lwork = type2i4(&wkget[0],4); work = new T[lwork +GARDMEM]; 655 698 sgesvd_(&jobu, &jobvt, &m, &n, (r_4 *)a.Data(), &lda, 656 699 (r_4 *)s.Data(), (r_4 *) up->Data(), &ldu, (r_4 *)vtp->Data(), &ldvt, … … 659 702 dgesvd_(&jobu, &jobvt, &m, &n, (r_8 *)a.Data(), &lda, 660 703 (r_8 *)s.Data(), (r_8 *) up->Data(), &ldu, (r_8 *)vtp->Data(), &ldvt, 704 (r_8 *)wkget, &lwork, &info); 705 lwork = type2i4(&wkget[0],8); work = new T[lwork +GARDMEM]; 706 dgesvd_(&jobu, &jobvt, &m, &n, (r_8 *)a.Data(), &lda, 707 (r_8 *)s.Data(), (r_8 *) up->Data(), &ldu, (r_8 *)vtp->Data(), &ldvt, 661 708 (r_8 *)work, &lwork, &info); 662 709 } else if (typeid(T) == typeid(complex<r_4>) ) { 663 710 r_4 * rwork = new r_4[5*minmn +GARDMEM]; 664 711 r_4 * sloc = new r_4[minmn]; 712 cgesvd_(&jobu, &jobvt, &m, &n, (complex<r_4> *)a.Data(), &lda, 713 (r_4 *)sloc, (complex<r_4> *) up->Data(), &ldu, 714 (complex<r_4> *)vtp->Data(), &ldvt, 715 (complex<r_4> *)wkget, &lwork, (r_4 *)rwork, &info); 716 lwork = type2i4(&wkget[0],4); work = new T[lwork +GARDMEM]; 665 717 cgesvd_(&jobu, &jobvt, &m, &n, (complex<r_4> *)a.Data(), &lda, 666 718 (r_4 *)sloc, (complex<r_4> *) up->Data(), &ldu, … … 675 727 (r_8 *)sloc, (complex<r_8> *) up->Data(), &ldu, 676 728 (complex<r_8> *)vtp->Data(), &ldvt, 729 (complex<r_8> *)wkget, &lwork, (r_8 *)rwork, &info); 730 lwork = type2i4(&wkget[0],8); work = new T[lwork +GARDMEM]; 731 zgesvd_(&jobu, &jobvt, &m, &n, (complex<r_8> *)a.Data(), &lda, 732 (r_8 *)sloc, (complex<r_8> *) up->Data(), &ldu, 733 (complex<r_8> *)vtp->Data(), &ldvt, 677 734 (complex<r_8> *)work, &lwork, (r_8 *)rwork, &info); 678 735 for(int_4 i=0;i<minmn;i++) s[i] = sloc[i]; 679 736 delete [] rwork; delete [] sloc; 680 737 } else { 738 if(work) delete [] work; work=NULL; 681 739 if (jobu == 'N') delete up; 682 740 if (jobvt == 'N') delete vtp; … … 686 744 } 687 745 746 if(work) delete [] work; 688 747 if (jobu == 'N') delete up; 689 748 if (jobvt == 'N') delete vtp; … … 712 771 u.ReSize(m,m); 713 772 vt.ReSize(n,n); 714 715 int_4 lda = n; 716 int_4 ldu = u.NCols(); 717 int_4 ldvt = vt.NCols(); 718 int_4 info; 773 774 int_4 lda = m; 775 int_4 ldu = m; 776 int_4 ldvt = n; 777 int_4 info; 778 int_4 lwork=-1; 779 T * work = NULL; 780 int_4 * iwork = NULL; 781 T wkget[2]; 719 782 720 783 if(typeid(T) == typeid(r_4) ) { 721 784 r_4* sloc = new r_4[minmn]; 722 int_4 lwork = 3*minmn*minmn + supermax; 723 r_4* work = new r_4[lwork +GARDMEM]; 724 int_4* iwork = new int_4[8*minmn +GARDMEM]; 785 iwork = new int_4[8*minmn +GARDMEM]; 786 sgesdd_(&jobz,&m,&n,(r_4*)a.Data(),&lda, 787 (r_4*)sloc,(r_4*)u.Data(),&ldu,(r_4*)vt.Data(),&ldvt, 788 (r_4*)wkget,&lwork,(int_4*)iwork,&info); 789 lwork = type2i4(&wkget[0],4); work = new T[lwork +GARDMEM]; 725 790 sgesdd_(&jobz,&m,&n,(r_4*)a.Data(),&lda, 726 791 (r_4*)sloc,(r_4*)u.Data(),&ldu,(r_4*)vt.Data(),&ldvt, 727 792 (r_4*)work,&lwork,(int_4*)iwork,&info); 728 793 for(int_4 i=0;i<minmn;i++) s(i) = (r_8) sloc[i]; 729 delete [] sloc; delete [] work; delete [] iwork;794 delete [] sloc; 730 795 } else if(typeid(T) == typeid(r_8) ) { 731 int_4 lwork = 3*minmn*minmn + supermax; 732 r_8* work = new r_8[lwork +GARDMEM]; 733 int_4* iwork = new int_4[8*minmn +GARDMEM]; 796 iwork = new int_4[8*minmn +GARDMEM]; 797 dgesdd_(&jobz,&m,&n,(r_8*)a.Data(),&lda, 798 (r_8*)s.Data(),(r_8*)u.Data(),&ldu,(r_8*)vt.Data(),&ldvt, 799 (r_8*)wkget,&lwork,(int_4*)iwork,&info); 800 lwork = type2i4(&wkget[0],8); work = new T[lwork +GARDMEM]; 734 801 dgesdd_(&jobz,&m,&n,(r_8*)a.Data(),&lda, 735 802 (r_8*)s.Data(),(r_8*)u.Data(),&ldu,(r_8*)vt.Data(),&ldvt, 736 803 (r_8*)work,&lwork,(int_4*)iwork,&info); 737 delete [] work; delete [] iwork;738 804 } else if(typeid(T) == typeid(complex<r_4>) ) { 739 805 r_4* sloc = new r_4[minmn]; 740 int_4 lwork = minmn*minmn+2*minmn+maxmn;741 complex<r_4>* work = new complex<r_4>[lwork +GARDMEM];742 806 r_4* rwork = new r_4[5*minmn*minmn+5*minmn +GARDMEM]; 743 int_4* iwork = new int_4[8*minmn +GARDMEM]; 807 iwork = new int_4[8*minmn +GARDMEM]; 808 cgesdd_(&jobz,&m,&n,(complex<r_4>*)a.Data(),&lda, 809 (r_4*)sloc,(complex<r_4>*)u.Data(),&ldu,(complex<r_4>*)vt.Data(),&ldvt, 810 (complex<r_4>*)wkget,&lwork,(r_4*)rwork,(int_4*)iwork,&info); 811 lwork = type2i4(&wkget[0],4); work = new T[lwork +GARDMEM]; 744 812 cgesdd_(&jobz,&m,&n,(complex<r_4>*)a.Data(),&lda, 745 813 (r_4*)sloc,(complex<r_4>*)u.Data(),&ldu,(complex<r_4>*)vt.Data(),&ldvt, 746 814 (complex<r_4>*)work,&lwork,(r_4*)rwork,(int_4*)iwork,&info); 747 815 for(int_4 i=0;i<minmn;i++) s(i) = (r_8) sloc[i]; 748 delete [] sloc; delete [] work; delete [] rwork; delete [] iwork;816 delete [] sloc; delete [] rwork; 749 817 } else if(typeid(T) == typeid(complex<r_8>) ) { 750 int_4 lwork = minmn*minmn+2*minmn+maxmn;751 complex<r_8>* work = new complex<r_8>[lwork +GARDMEM];752 818 r_8* rwork = new r_8[5*minmn*minmn+5*minmn +GARDMEM]; 753 int_4* iwork = new int_4[8*minmn +GARDMEM]; 819 iwork = new int_4[8*minmn +GARDMEM]; 820 zgesdd_(&jobz,&m,&n,(complex<r_8>*)a.Data(),&lda, 821 (r_8*)s.Data(),(complex<r_8>*)u.Data(),&ldu,(complex<r_8>*)vt.Data(),&ldvt, 822 (complex<r_8>*)wkget,&lwork,(r_8*)rwork,(int_4*)iwork,&info); 823 lwork = type2i4(&wkget[0],8); work = new T[lwork +GARDMEM]; 754 824 zgesdd_(&jobz,&m,&n,(complex<r_8>*)a.Data(),&lda, 755 825 (r_8*)s.Data(),(complex<r_8>*)u.Data(),&ldu,(complex<r_8>*)vt.Data(),&ldvt, 756 826 (complex<r_8>*)work,&lwork,(r_8*)rwork,(int_4*)iwork,&info); 757 delete [] work; delete [] rwork; delete [] iwork;827 delete [] rwork; 758 828 } else { 829 if(work) delete [] work; work=NULL; 830 if(iwork) delete [] iwork; iwork=NULL; 759 831 string tn = typeid(T).name(); 760 832 cerr << " LapackServer::SVD_DC(...) - Unsupported DataType T = " << tn << endl; … … 762 834 } 763 835 836 if(work) delete [] work; if(iwork) delete [] iwork; 764 837 return(info); 765 838 } … … 794 867 int_4 lda = a.Step(cola); 795 868 int_4 info = 0; 869 int_4 lwork = -1; 870 T * work = NULL; 871 T wkget[2]; 796 872 797 873 b.ReSize(n); b = 0.; 798 874 799 875 if (typeid(T) == typeid(r_4) ) { 800 int_4 lwork = 3*n-1; r_4* work = new r_4[lwork +GARDMEM];801 876 r_4* w = new r_4[n]; 877 ssyev_(&jobz,&uplo,&n,(r_4 *)a.Data(),&lda,(r_4 *)w,(r_4 *)wkget,&lwork,&info); 878 lwork = type2i4(&wkget[0],4); /* 3*n-1;*/ work = new T[lwork +GARDMEM]; 802 879 ssyev_(&jobz,&uplo,&n,(r_4 *)a.Data(),&lda,(r_4 *)w,(r_4 *)work,&lwork,&info); 803 880 if(info==0) for(int i=0;i<n;i++) b(i) = w[i]; 804 delete [] w ork; delete [] w;881 delete [] w; 805 882 } else if (typeid(T) == typeid(r_8) ) { 806 int_4 lwork = 3*n-1; r_8* work = new r_8[lwork +GARDMEM];807 883 r_8* w = new r_8[n]; 884 dsyev_(&jobz,&uplo,&n,(r_8 *)a.Data(),&lda,(r_8 *)w,(r_8 *)wkget,&lwork,&info); 885 lwork = type2i4(&wkget[0],8); /* 3*n-1;*/ work = new T[lwork +GARDMEM]; 808 886 dsyev_(&jobz,&uplo,&n,(r_8 *)a.Data(),&lda,(r_8 *)w,(r_8 *)work,&lwork,&info); 809 887 if(info==0) for(int i=0;i<n;i++) b(i) = w[i]; 810 delete [] w ork; delete [] w;888 delete [] w; 811 889 } else if (typeid(T) == typeid(complex<r_4>) ) { 812 int_4 lwork = 2*n-1; complex<r_4>* work = new complex<r_4>[lwork +GARDMEM];813 890 r_4* rwork = new r_4[3*n-2 +GARDMEM]; r_4* w = new r_4[n]; 891 cheev_(&jobz,&uplo,&n,(complex<r_4> *)a.Data(),&lda,(r_4 *)w 892 ,(complex<r_4> *)wkget,&lwork,(r_4 *)rwork,&info); 893 lwork = type2i4(&wkget[0],4); /* 2*n-1;*/ work = new T[lwork +GARDMEM]; 814 894 cheev_(&jobz,&uplo,&n,(complex<r_4> *)a.Data(),&lda,(r_4 *)w 815 895 ,(complex<r_4> *)work,&lwork,(r_4 *)rwork,&info); 816 896 if(info==0) for(int i=0;i<n;i++) b(i) = w[i]; 817 delete [] work; delete []rwork; delete [] w;897 delete [] rwork; delete [] w; 818 898 } else if (typeid(T) == typeid(complex<r_8>) ) { 819 int_4 lwork = 2*n-1; complex<r_8>* work = new complex<r_8>[lwork +GARDMEM];820 899 r_8* rwork = new r_8[3*n-2 +GARDMEM]; r_8* w = new r_8[n]; 900 zheev_(&jobz,&uplo,&n,(complex<r_8> *)a.Data(),&lda,(r_8 *)w 901 ,(complex<r_8> *)wkget,&lwork,(r_8 *)rwork,&info); 902 lwork = type2i4(&wkget[0],8); /* 2*n-1;*/ work = new T[lwork +GARDMEM]; 821 903 zheev_(&jobz,&uplo,&n,(complex<r_8> *)a.Data(),&lda,(r_8 *)w 822 904 ,(complex<r_8> *)work,&lwork,(r_8 *)rwork,&info); 823 905 if(info==0) for(int i=0;i<n;i++) b(i) = w[i]; 824 delete [] work; delete []rwork; delete [] w;906 delete [] rwork; delete [] w; 825 907 } else { 908 if(work) delete [] work; work=NULL; 826 909 string tn = typeid(T).name(); 827 910 cerr << " LapackServer::LapackEigenSym(a,b) - Unsupported DataType T = " << tn << endl; … … 829 912 } 830 913 914 if(work) delete [] work; 831 915 return(info); 832 916 } … … 880 964 int_4 ldvr = n, ldvl = 1; 881 965 966 int_4 lwork = -1; 967 T * work = NULL; 968 T wkget[2]; 969 882 970 if (typeid(T) == typeid(r_4) ) { 883 int_4 lwork = 4*n; r_4* work = new r_4[lwork +GARDMEM];884 971 r_4* wr = new r_4[n]; r_4* wi = new r_4[n]; r_4* vl = NULL; 972 sgeev_(&jobvl,&jobvr,&n,(r_4 *)a.Data(),&lda,(r_4 *)wr,(r_4 *)wi, 973 (r_4 *)vl,&ldvl,(r_4 *)evec.Data(),&ldvr, 974 (r_4 *)wkget,&lwork,&info); 975 lwork = type2i4(&wkget[0],4); /* 4*n;*/ work = new T[lwork +GARDMEM]; 885 976 sgeev_(&jobvl,&jobvr,&n,(r_4 *)a.Data(),&lda,(r_4 *)wr,(r_4 *)wi, 886 977 (r_4 *)vl,&ldvl,(r_4 *)evec.Data(),&ldvr, 887 978 (r_4 *)work,&lwork,&info); 888 979 if(info==0) for(int i=0;i<n;i++) eval(i) = complex<r_8>(wr[i],wi[i]); 889 delete [] w ork; delete [] wr; delete [] wi;980 delete [] wr; delete [] wi; 890 981 } else if (typeid(T) == typeid(r_8) ) { 891 int_4 lwork = 4*n; r_8* work = new r_8[lwork +GARDMEM];892 982 r_8* wr = new r_8[n]; r_8* wi = new r_8[n]; r_8* vl = NULL; 983 dgeev_(&jobvl,&jobvr,&n,(r_8 *)a.Data(),&lda,(r_8 *)wr,(r_8 *)wi, 984 (r_8 *)vl,&ldvl,(r_8 *)evec.Data(),&ldvr, 985 (r_8 *)wkget,&lwork,&info); 986 lwork = type2i4(&wkget[0],8); /* 4*n;*/ work = new T[lwork +GARDMEM]; 893 987 dgeev_(&jobvl,&jobvr,&n,(r_8 *)a.Data(),&lda,(r_8 *)wr,(r_8 *)wi, 894 988 (r_8 *)vl,&ldvl,(r_8 *)evec.Data(),&ldvr, 895 989 (r_8 *)work,&lwork,&info); 896 990 if(info==0) for(int i=0;i<n;i++) eval(i) = complex<r_8>(wr[i],wi[i]); 897 delete [] w ork; delete [] wr; delete [] wi;991 delete [] wr; delete [] wi; 898 992 } else if (typeid(T) == typeid(complex<r_4>) ) { 899 int_4 lwork = 2*n; complex<r_4>* work = new complex<r_4>[lwork +GARDMEM];900 993 r_4* rwork = new r_4[2*n +GARDMEM]; r_4* vl = NULL; TVector< complex<r_4> > w(n); 994 cgeev_(&jobvl,&jobvr,&n,(complex<r_4> *)a.Data(),&lda,(complex<r_4> *)w.Data(), 995 (complex<r_4> *)vl,&ldvl,(complex<r_4> *)evec.Data(),&ldvr, 996 (complex<r_4> *)wkget,&lwork,(r_4 *)rwork,&info); 997 lwork = type2i4(&wkget[0],4); /* 2*n;*/ work = new T[lwork +GARDMEM]; 901 998 cgeev_(&jobvl,&jobvr,&n,(complex<r_4> *)a.Data(),&lda,(complex<r_4> *)w.Data(), 902 999 (complex<r_4> *)vl,&ldvl,(complex<r_4> *)evec.Data(),&ldvr, 903 1000 (complex<r_4> *)work,&lwork,(r_4 *)rwork,&info); 904 1001 if(info==0) for(int i=0;i<n;i++) eval(i) = w(i); 905 delete [] work; delete []rwork;1002 delete [] rwork; 906 1003 } else if (typeid(T) == typeid(complex<r_8>) ) { 907 int_4 lwork = 2*n; complex<r_8>* work = new complex<r_8>[lwork +GARDMEM];908 1004 r_8* rwork = new r_8[2*n +GARDMEM]; r_8* vl = NULL; 909 1005 zgeev_(&jobvl,&jobvr,&n,(complex<r_8> *)a.Data(),&lda,(complex<r_8> *)eval.Data(), 910 1006 (complex<r_8> *)vl,&ldvl,(complex<r_8> *)evec.Data(),&ldvr, 1007 (complex<r_8> *)wkget,&lwork,(r_8 *)rwork,&info); 1008 lwork = type2i4(&wkget[0],8); /* 2*n;*/ work = new T[lwork +GARDMEM]; 1009 zgeev_(&jobvl,&jobvr,&n,(complex<r_8> *)a.Data(),&lda,(complex<r_8> *)eval.Data(), 1010 (complex<r_8> *)vl,&ldvl,(complex<r_8> *)evec.Data(),&ldvr, 911 1011 (complex<r_8> *)work,&lwork,(r_8 *)rwork,&info); 912 delete [] work; delete []rwork;1012 delete [] rwork; 913 1013 } else { 1014 if(work) delete [] work; work=NULL; 914 1015 string tn = typeid(T).name(); 915 1016 cerr << " LapackServer::LapackEigen(a,b) - Unsupported DataType T = " << tn << endl; … … 917 1018 } 918 1019 1020 if(work) delete [] work; 919 1021 return(info); 920 1022 } -
trunk/SophyaExt/LinAlg/intflapack.h
r2567 r2572 38 38 TArray<T>* up=NULL, TArray<T> * vtp=NULL); 39 39 int_4 ilaenv_en_C(int_4 ispec,char *name,char *opts,int_4 n1,int_4 n2,int_4 n3,int_4 n4); 40 int_4 type2i4(void *val,int nbytes); 40 41 41 42 int wspace_size_factor;
Note:
See TracChangeset
for help on using the changeset viewer.