Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef EIGEN_SPARSELU_UTILS_H
00012 #define EIGEN_SPARSELU_UTILS_H
00013
00014 namespace Eigen {
00015 namespace internal {
00016
00020 template <typename Scalar, typename Index>
00021 void SparseLUImpl<Scalar,Index>::countnz(const Index n, Index& nnzL, Index& nnzU, GlobalLU_t& glu)
00022 {
00023 nnzL = 0;
00024 nnzU = (glu.xusub)(n);
00025 Index nsuper = (glu.supno)(n);
00026 Index jlen;
00027 Index i, j, fsupc;
00028 if (n <= 0 ) return;
00029
00030 for (i = 0; i <= nsuper; i++)
00031 {
00032 fsupc = glu.xsup(i);
00033 jlen = glu.xlsub(fsupc+1) - glu.xlsub(fsupc);
00034
00035 for (j = fsupc; j < glu.xsup(i+1); j++)
00036 {
00037 nnzL += jlen;
00038 nnzU += j - fsupc + 1;
00039 jlen--;
00040 }
00041 }
00042 }
00043
00051 template <typename Scalar, typename Index>
00052 void SparseLUImpl<Scalar,Index>::fixupL(const Index n, const IndexVector& perm_r, GlobalLU_t& glu)
00053 {
00054 Index fsupc, i, j, k, jstart;
00055
00056 Index nextl = 0;
00057 Index nsuper = (glu.supno)(n);
00058
00059
00060 for (i = 0; i <= nsuper; i++)
00061 {
00062 fsupc = glu.xsup(i);
00063 jstart = glu.xlsub(fsupc);
00064 glu.xlsub(fsupc) = nextl;
00065 for (j = jstart; j < glu.xlsub(fsupc + 1); j++)
00066 {
00067 glu.lsub(nextl) = perm_r(glu.lsub(j));
00068 nextl++;
00069 }
00070 for (k = fsupc+1; k < glu.xsup(i+1); k++)
00071 glu.xlsub(k) = nextl;
00072 }
00073
00074 glu.xlsub(n) = nextl;
00075 }
00076
00077 }
00078
00079 }
00080 #endif // EIGEN_SPARSELU_UTILS_H