Changeset 13

Show
Ignore:
Timestamp:
04/09/07 10:53:44 (2 years ago)
Author:
pernet
Message:

LUdivine Gauss pour experimentations

Location:
include/fflas-ffpack
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • include/fflas-ffpack/fflas.h

    r12 r13  
    150150           @brief ftrsv: TRiangular System solve with Vector 
    151151           Computes  X <- op(A^-1).X\\ 
    152            size of X is m 
     152           size of X is N 
    153153        */ 
    154154        template<class Field> 
  • include/fflas-ffpack/ffpack.h

    r10 r13  
    394394        static size_t  
    395395        LUdivine_small (const Field& F, const enum FFLAS_DIAG Diag, 
     396                        const size_t M, const size_t N, 
     397                        typename Field::Element * A, const size_t lda, 
     398                        size_t* P, size_t* Q, const enum FFPACK_LUDIVINE_TAG LuTag=FfpackLQUP); 
     399        template <class Field> 
     400        static size_t  
     401        LUdivine_gauss (const Field& F, const enum FFLAS_DIAG Diag, 
    396402                        const size_t M, const size_t N, 
    397403                        typename Field::Element * A, const size_t lda, 
  • include/fflas-ffpack/ffpack_ludivine.inl

    r11 r13  
    2929//              return TURBO (F, M, N, A, lda, P, Q, cutoff); 
    3030// } 
     31 
     32 
     33template<class Field> 
     34inline size_t 
     35FFPACK::LUdivine_gauss( const Field& F, const enum FFLAS_DIAG Diag, 
     36                        const size_t M, const size_t N,          
     37                        typename Field::Element * A, const size_t lda, size_t*P,  
     38                        size_t *Q, const enum FFPACK_LUDIVINE_TAG LuTag){ 
     39        static typename Field::Element mone,one; 
     40        F.init(one,1.0); 
     41        F.neg (mone, one); 
     42        size_t MN = MIN(M,N); 
     43        typename Field::Element * Acurr = A; 
     44        size_t r = 0; 
     45         
     46        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; 
     49                size_t p = r; 
     50                while ((p < N) && F.isZero (*(Acurr++))) 
     51                        p++; 
     52                if (p == N){ 
     53                        Q[r] ++; 
     54                        Acurr += lda; 
     55                } else { 
     56                        P[r] = p; 
     57                        if (r < Q[r]) 
     58                                fcopy (F, N-r, (A + r*(lda+1)), 1, (A+Q[r]*lda+r),1); 
     59                        fswap (F, M, A+r, lda, A+p, lda); 
     60                        Acurr += lda +1; 
     61                        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); 
     69                } else 
     70                        return r; 
     71        } 
     72                         
     73        return r; 
     74} 
    3175 
    3276