41 SparseMatrix &systemMatrix,
42 std::vector<std::pair<UInt, UInt>> &listVariableSystemMatrixEntries) {
44 klu_free_symbolic(&mSymbolic, &mCommon);
47 const Int n = Eigen::internal::convert_index<Int>(systemMatrix.rows());
49 auto Ap = Eigen::internal::convert_index<Int *>(systemMatrix.outerIndexPtr());
50 auto Ai = Eigen::internal::convert_index<Int *>(systemMatrix.innerIndexPtr());
52 mVaryingColumns.clear();
55 mChangedEntries = listVariableSystemMatrixEntries;
57 Eigen::internal::convert_index<Int>(mChangedEntries.size());
59 for (
auto &changedEntry : mChangedEntries) {
60 mVaryingRows.push_back(changedEntry.first);
61 mVaryingColumns.push_back(changedEntry.second);
65 int *colPtr = mVaryingColumns.empty() ? nullptr : &mVaryingColumns[0];
66 int *rowPtr = mVaryingRows.empty() ? nullptr : &mVaryingRows[0];
68 mSymbolic = klu_analyze_partial(n, Ap, Ai, colPtr, rowPtr, varying_entries,
69 mPreordering, &mCommon);
71 if (mVaryingColumns.empty()) {
74 "KLUAdapter: No variable COLUMN entries passed to klu_analyze_partial");
76 if (mVaryingRows.empty()) {
79 "KLUAdapter: No variable ROW entries passed to klu_analyze_partial");
85 nnz = Eigen::internal::convert_index<Int>(systemMatrix.nonZeros());
90 klu_free_numeric(&mNumeric, &mCommon);
93 auto Ap = Eigen::internal::convert_index<Int *>(systemMatrix.outerIndexPtr());
94 auto Ai = Eigen::internal::convert_index<Int *>(systemMatrix.innerIndexPtr());
95 auto Ax = Eigen::internal::convert_index<Real *>(systemMatrix.valuePtr());
97 mNumeric = klu_factor(Ap, Ai, Ax, mSymbolic, &mCommon);
100 Eigen::internal::convert_index<Int>(mChangedEntries.size());
105 if (!(mVaryingColumns.empty()) && !(mVaryingRows.empty())) {
106 if (mPartialRefactorizationMethod ==
107 DPsim::PARTIAL_REFACTORIZATION_METHOD::FACTORIZATION_PATH) {
108 klu_compute_path(mSymbolic, mNumeric, &mCommon, Ap, Ai,
109 &mVaryingColumns[0], &mVaryingRows[0], varying_entries);
110 }
else if (mPartialRefactorizationMethod ==
111 DPsim::PARTIAL_REFACTORIZATION_METHOD::REFACTORIZATION_RESTART) {
112 klu_determine_start(mSymbolic, mNumeric, &mCommon, Ap, Ai,
113 &mVaryingColumns[0], &mVaryingRows[0],
121 if (systemMatrix.nonZeros() != nnz) {
126 Eigen::internal::convert_index<Int *>(systemMatrix.outerIndexPtr());
128 Eigen::internal::convert_index<Int *>(systemMatrix.innerIndexPtr());
129 auto Ax = Eigen::internal::convert_index<Real *>(systemMatrix.valuePtr());
130 klu_refactor(Ap, Ai, Ax, mSymbolic, mNumeric, &mCommon);
135 SparseMatrix &systemMatrix,
136 std::vector<std::pair<UInt, UInt>> &listVariableSystemMatrixEntries) {
137 if (systemMatrix.nonZeros() != nnz) {
138 preprocessing(systemMatrix, listVariableSystemMatrixEntries);
142 Eigen::internal::convert_index<Int *>(systemMatrix.outerIndexPtr());
144 Eigen::internal::convert_index<Int *>(systemMatrix.innerIndexPtr());
145 auto Ax = Eigen::internal::convert_index<Real *>(systemMatrix.valuePtr());
147 if (mPartialRefactorizationMethod ==
148 PARTIAL_REFACTORIZATION_METHOD::FACTORIZATION_PATH) {
149 klu_partial_factorization_path(Ap, Ai, Ax, mSymbolic, mNumeric, &mCommon);
150 }
else if (mPartialRefactorizationMethod ==
151 PARTIAL_REFACTORIZATION_METHOD::REFACTORIZATION_RESTART) {
152 klu_partial_refactorization_restart(Ap, Ai, Ax, mSymbolic, mNumeric,
155 klu_refactor(Ap, Ai, Ax, mSymbolic, mNumeric, &mCommon);
158 if (mCommon.status == KLU_PIVOT_FAULT) {
169 Matrix x = rightSideVector;
174 Int rhsCols = Eigen::internal::convert_index<Int>(rightSideVector.cols());
177 Int rhsRows = Eigen::internal::convert_index<Int>(rightSideVector.rows());
183 klu_tsolve(mSymbolic, mNumeric, rhsRows, rhsCols,
184 x.const_cast_derived().data(), &mCommon);
190 std::string outputName =
"A" + std::to_string(counter) +
".mtx";
191 Int n = Eigen::internal::convert_index<Int>(matrix.rows());
193 auto Ap = Eigen::internal::convert_index<const Int *>(matrix.outerIndexPtr());
194 auto Ai = Eigen::internal::convert_index<const Int *>(matrix.innerIndexPtr());
195 auto Ax = Eigen::internal::convert_index<const Real *>(matrix.valuePtr());
196 Int nz = Eigen::internal::convert_index<Int>(matrix.nonZeros());
199 ofs.open(outputName);
204 ofs <<
"%%MatrixMarket matrix coordinate real general" << std::endl;
205 ofs << n <<
" " << n <<
" " << nz << std::endl;
206 for (
int i = 0; i < n; i++) {
207 for (
int j = Ap[i]; j < Ap[i + 1]; j++) {
208 ofs << i + 1 <<
" " << Ai[j] + 1 <<
" " << Ax[j] << std::endl;
216 case SCALING_METHOD::NO_SCALING:
219 case SCALING_METHOD::SUM_SCALING:
222 case SCALING_METHOD::MAX_SCALING:
229 SPDLOG_LOGGER_INFO(
mSLog,
"Matrix is scaled using " +
234 case FILL_IN_REDUCTION_METHOD::AMD:
235 mPreordering = AMD_ORDERING;
237 case FILL_IN_REDUCTION_METHOD::AMD_NV:
238 mPreordering = AMD_ORDERING_NV;
240 case FILL_IN_REDUCTION_METHOD::AMD_RA:
241 mPreordering = AMD_ORDERING_RA;
244 mPreordering = AMD_ORDERING;
247 SPDLOG_LOGGER_INFO(
mSLog,
248 "Matrix is fill reduced with " +
252 mPartialRefactorizationMethod =
256 mSLog,
"Matrix is refactored " +
260 case USE_BTF::DO_BTF:
263 case USE_BTF::NO_BTF:
270 SPDLOG_LOGGER_INFO(
mSLog,
void preprocessing(SparseMatrix &systemMatrix, std::vector< std::pair< UInt, UInt > > &listVariableSystemMatrixEntries) override
preprocessing function pre-ordering and scaling the matrix