61 ScalarVector& dense, ScalarVector& tempv, IndexVector& segrep,
62 IndexVector& repfnz, GlobalLU_t& glu) {
63 Index ksub, jj, nextl_col;
64 Index fsupc, nsupc, nsupr, nrow;
68 Index segsize, no_zeros;
71 const Index PacketSize = internal::packet_traits<Scalar>::size;
73 for (ksub = 0; ksub < nseg; ksub++) {
81 fsupc = glu.xsup(glu.supno(krep));
82 nsupc = krep - fsupc + 1;
83 nsupr = glu.xlsub(fsupc + 1) - glu.xlsub(fsupc);
85 lptr = glu.xlsub(fsupc);
90 for (jj = jcol; jj < jcol + w; jj++) {
91 nextl_col = (jj - jcol) * m;
94 kfnz = repfnz_col(krep);
95 if (kfnz == emptyIdxLU)
continue;
97 segsize = krep - kfnz + 1;
99 u_rows = (std::max)(segsize, u_rows);
103 Index ldu = internal::first_multiple<Index>(u_rows, PacketSize);
108 for (jj = jcol; jj < jcol + w; jj++) {
109 nextl_col = (jj - jcol) * m;
113 kfnz = repfnz_col(krep);
114 if (kfnz == emptyIdxLU)
continue;
116 segsize = krep - kfnz + 1;
117 luptr = glu.xlusup(fsupc);
118 no_zeros = kfnz - fsupc;
120 Index isub = lptr + no_zeros;
121 Index off = u_rows - segsize;
122 for (Index i = 0; i < off; i++) U(i, u_col) = Scalar(0);
123 for (Index i = 0; i < segsize; i++) {
124 Index irow = glu.lsub(isub);
125 U(i + off, u_col) = dense_col(irow);
131 luptr = glu.xlusup(fsupc);
132 Index lda = glu.xlusup(fsupc + 1) - glu.xlusup(fsupc);
133 no_zeros = (krep - u_rows + 1) - fsupc;
134 luptr += lda * no_zeros + no_zeros;
135 MappedMatrixBlock A(glu.lusup.data() + luptr, u_rows, u_rows,
OuterStride<>(lda));
136 U = A.template triangularView<UnitLower>().solve(U);
140 MappedMatrixBlock B(glu.lusup.data() + luptr, nrow, u_rows,
OuterStride<>(lda));
141 eigen_assert(tempv.size() > w * ldu + nrow * w + 1);
143 Index ldl = internal::first_multiple<Index>(nrow, PacketSize);
144 Index offset = (PacketSize - internal::first_default_aligned(B.data(), PacketSize)) % PacketSize;
145 MappedMatrixBlock L(tempv.
data() + w * ldu + offset, nrow, u_cols,
OuterStride<>(ldl));
151 for (jj = jcol; jj < jcol + w; jj++) {
152 nextl_col = (jj - jcol) * m;
156 kfnz = repfnz_col(krep);
157 if (kfnz == emptyIdxLU)
continue;
159 segsize = krep - kfnz + 1;
160 no_zeros = kfnz - fsupc;
161 Index isub = lptr + no_zeros;
163 Index off = u_rows - segsize;
164 for (Index i = 0; i < segsize; i++) {
165 Index irow = glu.lsub(isub++);
166 dense_col(irow) = U.coeff(i + off, u_col);
167 U.coeffRef(i + off, u_col) = Scalar(0);
171 for (Index i = 0; i < nrow; i++) {
172 Index irow = glu.lsub(isub++);
173 dense_col(irow) -= L.coeff(i, u_col);
174 L.coeffRef(i, u_col) = Scalar(0);
181 for (jj = jcol; jj < jcol + w; jj++) {
182 nextl_col = (jj - jcol) * m;
186 kfnz = repfnz_col(krep);
187 if (kfnz == emptyIdxLU)
continue;
189 segsize = krep - kfnz + 1;
190 luptr = glu.xlusup(fsupc);
192 Index lda = glu.xlusup(fsupc + 1) - glu.xlusup(fsupc);
196 no_zeros = kfnz - fsupc;
198 LU_kernel_bmod<1>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
199 else if (segsize == 2)
200 LU_kernel_bmod<2>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
201 else if (segsize == 3)
202 LU_kernel_bmod<3>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
204 LU_kernel_bmod<Dynamic>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr,