Show
Ignore:
Timestamp:
04/09/07 12:02:27 (2 years ago)
Author:
pernet
Message:
 
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • include/fflas-ffpack/ffpack_ludivine.inl

    r13 r14  
    3737                        typename Field::Element * A, const size_t lda, size_t*P,  
    3838                        size_t *Q, const enum FFPACK_LUDIVINE_TAG LuTag){ 
    39         static typename Field::Element mone,one; 
     39        static typename Field::Element mone,one,zero; 
    4040        F.init(one,1.0); 
     41        F.init(zero,0.0); 
    4142        F.neg (mone, one); 
    4243        size_t MN = MIN(M,N); 
     
    4546         
    4647        for (size_t k = 0; k < MN; ++k){ 
    47                 write_field(F,cerr<<"A = "<<endl,A,M,N,lda); 
    48                 cerr<<"Q["<<r<<"] = "<<Q[r]<<endl; 
    4948                size_t p = r; 
     49                Acurr = A+k*lda+r; 
    5050                while ((p < N) && F.isZero (*(Acurr++))) 
    5151                        p++; 
    52                 if (p == N){ 
    53                         Q[r] ++; 
    54                         Acurr += lda; 
    55                 } else { 
     52                if (p < N){ 
    5653                        P[r] = p; 
    57                         if (r < Q[r]) 
    58                                 fcopy (F, N-r, (A + r*(lda+1)), 1, (A+Q[r]*lda+r),1); 
     54                        if (r < k){ 
     55                                fcopy (F, N-r, (A + r*(lda+1)), 1, (A+k*lda+r),1); 
     56                                Acurr = A+r+k*lda; 
     57                                for (size_t i=r; i<N; ++i) 
     58                                        F.assign(*(Acurr++),zero); 
     59                        } 
     60                         
    5961                        fswap (F, M, A+r, lda, A+p, lda); 
    60                         Acurr += lda +1; 
     62                        Q[r] = k; 
    6163                        r++; 
    62                         Q[r] = r; 
    63                 } 
    64                 if (Q[r]<M){ 
    65                         write_field(F,cerr<<"A avant  = "<<endl,A,M,N,lda); 
    66                         ftrsv (F, FflasUpper, FflasTrans, FflasNonUnit, r, A, lda, A+(Q[r])*lda, 1); 
    67                         write_field(F,cerr<<"A milieu = "<<endl,A,M,N,lda); 
    68                         fgemv (F, FflasTrans, N-r,r, mone, A+r, lda, A+(Q[r])*lda, 1, one, Acurr, 1); 
     64                } 
     65                if (k+1<M){ 
     66                        ftrsv (F, FflasUpper, FflasTrans, FflasNonUnit, r, A, lda, A+(k+1)*lda, 1); 
     67                        fgemv (F, FflasTrans, r, N-r, mone, A+r, lda, A+(k+1)*lda, 1, one, A+(k+1)*lda+r, 1); 
    6968                } else 
    7069                        return r;