Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef SPARSELU_COPY_TO_UCOL_H
00030 #define SPARSELU_COPY_TO_UCOL_H
00031
00032 namespace Eigen {
00033 namespace internal {
00034
00049 template <typename Scalar, typename Index>
00050 Index SparseLUImpl<Scalar,Index>::copy_to_ucol(const Index jcol, const Index nseg, IndexVector& segrep, BlockIndexVector repfnz ,IndexVector& perm_r, BlockScalarVector dense, GlobalLU_t& glu)
00051 {
00052 Index ksub, krep, ksupno;
00053
00054 Index jsupno = glu.supno(jcol);
00055
00056
00057 Index k = nseg - 1, i;
00058 Index nextu = glu.xusub(jcol);
00059 Index kfnz, isub, segsize;
00060 Index new_next,irow;
00061 Index fsupc, mem;
00062 for (ksub = 0; ksub < nseg; ksub++)
00063 {
00064 krep = segrep(k); k--;
00065 ksupno = glu.supno(krep);
00066 if (jsupno != ksupno )
00067 {
00068 kfnz = repfnz(krep);
00069 if (kfnz != emptyIdxLU)
00070 {
00071 fsupc = glu.xsup(ksupno);
00072 isub = glu.xlsub(fsupc) + kfnz - fsupc;
00073 segsize = krep - kfnz + 1;
00074 new_next = nextu + segsize;
00075 while (new_next > glu.nzumax)
00076 {
00077 mem = memXpand<ScalarVector>(glu.ucol, glu.nzumax, nextu, UCOL, glu.num_expansions);
00078 if (mem) return mem;
00079 mem = memXpand<IndexVector>(glu.usub, glu.nzumax, nextu, USUB, glu.num_expansions);
00080 if (mem) return mem;
00081
00082 }
00083
00084 for (i = 0; i < segsize; i++)
00085 {
00086 irow = glu.lsub(isub);
00087 glu.usub(nextu) = perm_r(irow);
00088 glu.ucol(nextu) = dense(irow);
00089 dense(irow) = Scalar(0.0);
00090 nextu++;
00091 isub++;
00092 }
00093
00094 }
00095
00096 }
00097
00098 }
00099 glu.xusub(jcol + 1) = nextu;
00100 return 0;
00101 }
00102
00103 }
00104 }
00105
00106 #endif // SPARSELU_COPY_TO_UCOL_H