Changeset 2559 in Sophya for trunk/SophyaExt/LinAlg


Ignore:
Timestamp:
Jul 22, 2004, 3:38:49 PM (21 years ago)
Author:
cmv
Message:

correction bug svddriver pour complex<r_4> et complex<r_8> (cmv 22/07/04)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaExt/LinAlg/intflapack.cc

    r2556 r2559  
    122122               r_8* work, int_4* lwork, int_4* info);
    123123  void cgesvd_(char* jobu, char* jobvt, int_4* m, int_4* n, complex<r_4>* a, int_4* lda,
    124                complex<r_4>* s, complex<r_4>* u, int_4* ldu, complex<r_4>* vt, int_4* ldvt,
    125                complex<r_4>* work, int_4* lwork, int_4* info);
     124               r_4* s, complex<r_4>* u, int_4* ldu, complex<r_4>* vt, int_4* ldvt,
     125               complex<r_4>* work, int_4* lwork, r_4* rwork, int_4* info);
    126126  void zgesvd_(char* jobu, char* jobvt, int_4* m, int_4* n, complex<r_8>* a, int_4* lda,
    127                complex<r_8>* s, complex<r_8>* u, int_4* ldu, complex<r_8>* vt, int_4* ldvt,
    128                complex<r_8>* work, int_4* lwork, int_4* info);
     127               r_8* s, complex<r_8>* u, int_4* ldu, complex<r_8>* vt, int_4* ldvt,
     128               complex<r_8>* work, int_4* lwork, r_8* rwork, int_4* info);
    129129
    130130// Driver pour eigen decomposition for symetric/hermitian matrices
     
    512512  int_4 info; 
    513513
    514   if (typeid(T) == typeid(r_4) )
     514  if (typeid(T) == typeid(r_4) ) {
    515515    sgesvd_(&jobu, &jobvt, &m, &n, (r_4 *)a.Data(), &lda,
    516516            (r_4 *)s.Data(), (r_4 *) up->Data(), &ldu, (r_4 *)vtp->Data(), &ldvt,
    517517            (r_4 *)work, &lwork, &info);
    518   else if (typeid(T) == typeid(r_8) )
     518  } else if (typeid(T) == typeid(r_8) ) {
    519519    dgesvd_(&jobu, &jobvt, &m, &n, (r_8 *)a.Data(), &lda,
    520520            (r_8 *)s.Data(), (r_8 *) up->Data(), &ldu, (r_8 *)vtp->Data(), &ldvt,
    521521            (r_8 *)work, &lwork, &info);
    522   else if (typeid(T) == typeid(complex<r_4>) )
     522  } else if (typeid(T) == typeid(complex<r_4>) ) {
     523    r_4 * rwork = new r_4[5*minmn +5];
     524    r_4 * sloc  = new r_4[minmn];
    523525    cgesvd_(&jobu, &jobvt, &m, &n, (complex<r_4> *)a.Data(), &lda,
    524             (complex<r_4> *)s.Data(), (complex<r_4> *) up->Data(), &ldu,
     526            (r_4 *)sloc, (complex<r_4> *) up->Data(), &ldu,
    525527            (complex<r_4> *)vtp->Data(), &ldvt,
    526             (complex<r_4> *)work, &lwork, &info);
    527   else if (typeid(T) == typeid(complex<r_8>) )
     528            (complex<r_4> *)work, &lwork, (r_4 *)rwork, &info);
     529    for(int_4 i=0;i<minmn;i++) s[i] = sloc[i];
     530    delete [] rwork; delete [] sloc;
     531  } else if (typeid(T) == typeid(complex<r_8>) )  {
     532    r_8 * rwork = new r_8[5*minmn +5];
     533    r_8 * sloc  = new r_8[minmn];
    528534    zgesvd_(&jobu, &jobvt, &m, &n, (complex<r_8> *)a.Data(), &lda,
    529             (complex<r_8> *)s.Data(), (complex<r_8> *) up->Data(), &ldu,
     535            (r_8 *)sloc, (complex<r_8> *) up->Data(), &ldu,
    530536            (complex<r_8> *)vtp->Data(), &ldvt,
    531             (complex<r_8> *)work, &lwork, &info);
    532   else {
     537            (complex<r_8> *)work, &lwork, (r_8 *)rwork, &info);
     538    for(int_4 i=0;i<minmn;i++) s[i] = sloc[i];
     539    delete [] rwork; delete [] sloc;
     540  } else {
    533541    if (jobu == 'N') delete up;
    534542    if (jobvt == 'N') delete vtp;
Note: See TracChangeset for help on using the changeset viewer.