| // This file is part of Eigen, a lightweight C++ template library |
| // for linear algebra. |
| // |
| // Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr> |
| // |
| // This Source Code Form is subject to the terms of the Mozilla |
| // Public License v. 2.0. If a copy of the MPL was not distributed |
| // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| #ifndef EIGEN_SPARSELU_UTILS_H |
| #define EIGEN_SPARSELU_UTILS_H |
| |
| // IWYU pragma: private |
| #include "./InternalHeaderCheck.h" |
| |
| namespace Eigen { |
| namespace internal { |
| |
| /** |
| * \brief Count Nonzero elements in the factors |
| */ |
| template <typename Scalar, typename StorageIndex> |
| void SparseLUImpl<Scalar, StorageIndex>::countnz(const Index n, Index& nnzL, Index& nnzU, GlobalLU_t& glu) { |
| nnzL = 0; |
| nnzU = (glu.xusub)(n); |
| Index nsuper = (glu.supno)(n); |
| Index jlen; |
| Index i, j, fsupc; |
| if (n <= 0) return; |
| // For each supernode |
| for (i = 0; i <= nsuper; i++) { |
| fsupc = glu.xsup(i); |
| jlen = glu.xlsub(fsupc + 1) - glu.xlsub(fsupc); |
| |
| for (j = fsupc; j < glu.xsup(i + 1); j++) { |
| nnzL += jlen; |
| nnzU += j - fsupc + 1; |
| jlen--; |
| } |
| } |
| } |
| |
| /** |
| * \brief Fix up the data storage lsub for L-subscripts. |
| * |
| * It removes the subscripts sets for structural pruning, |
| * and applies permutation to the remaining subscripts |
| * |
| */ |
| template <typename Scalar, typename StorageIndex> |
| void SparseLUImpl<Scalar, StorageIndex>::fixupL(const Index n, const IndexVector& perm_r, GlobalLU_t& glu) { |
| Index fsupc, i, j, k, jstart; |
| |
| StorageIndex nextl = 0; |
| Index nsuper = (glu.supno)(n); |
| |
| // For each supernode |
| for (i = 0; i <= nsuper; i++) { |
| fsupc = glu.xsup(i); |
| jstart = glu.xlsub(fsupc); |
| glu.xlsub(fsupc) = nextl; |
| for (j = jstart; j < glu.xlsub(fsupc + 1); j++) { |
| glu.lsub(nextl) = perm_r(glu.lsub(j)); // Now indexed into P*A |
| nextl++; |
| } |
| for (k = fsupc + 1; k < glu.xsup(i + 1); k++) glu.xlsub(k) = nextl; // other columns in supernode i |
| } |
| |
| glu.xlsub(n) = nextl; |
| } |
| |
| } // end namespace internal |
| |
| } // end namespace Eigen |
| #endif // EIGEN_SPARSELU_UTILS_H |