| | 31 | |
| | 32 | |
| | 33 | template<class Field> |
| | 34 | inline size_t |
| | 35 | FFPACK::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 | } |