void sym_sparse_matrix_to_stl(MatrixType const & A, std::vector<std::map<unsigned int, ScalarType> > & STL_A) { STL_A.resize(A.size1()); for (typename MatrixType::const_iterator1 row_it = A.begin1(); row_it != A.end1(); ++row_it) { for (typename MatrixType::const_iterator2 col_it = row_it.begin(); col_it != row_it.end(); ++col_it) { if (col_it.index1() >= col_it.index2()) STL_A[col_it.index1()][static_cast<unsigned int>(col_it.index2())] = *col_it; else break; //go to next row } } }
void generateJ(MatrixType const & A, std::vector<std::vector<vcl_size_t> > & J) { for (typename MatrixType::const_iterator1 row_it = A.begin1(); row_it != A.end1(); ++row_it) { for (typename MatrixType::const_iterator2 col_it = row_it.begin(); col_it != row_it.end(); ++col_it) { if (col_it.index1() > col_it.index2()) //Matrix is symmetric, thus only work on lower triangular part { J[col_it.index2()].push_back(col_it.index1()); J[col_it.index1()].push_back(col_it.index2()); } else break; //go to next row } } }
void init(MatrixType const & mat, row_scaling_tag const & tag) { diag_M.resize(mat.size1()); //resize without preserving values for (typename MatrixType::const_iterator1 row_it = mat.begin1(); row_it != mat.end1(); ++row_it) { for (typename MatrixType::const_iterator2 col_it = row_it.begin(); col_it != row_it.end(); ++col_it) { if (tag.norm() == 0) diag_M[col_it.index1()] = std::max<ScalarType>(diag_M[col_it.index1()], std::fabs(*col_it)); else if (tag.norm() == 1) diag_M[col_it.index1()] += std::fabs(*col_it); else if (tag.norm() == 2) diag_M[col_it.index1()] += (*col_it) * (*col_it); } if (!diag_M[row_it.index1()]) throw zero_on_diagonal_exception("ViennaCL: Zero row encountered while setting up row scaling preconditioner!"); if (tag.norm() == 2) diag_M[row_it.index1()] = std::sqrt(diag_M[row_it.index1()]); } }
void init(MatrixType const & mat) { diag_A.resize(viennacl::traits::size1(mat)); //resize without preserving values for (typename MatrixType::const_iterator1 row_it = mat.begin1(); row_it != mat.end1(); ++row_it) { bool diag_found = false; for (typename MatrixType::const_iterator2 col_it = row_it.begin(); col_it != row_it.end(); ++col_it) { if (col_it.index1() == col_it.index2()) { diag_A[col_it.index1()] = *col_it; diag_found = true; } } if (!diag_found) throw "ViennaCL: Zero in diagonal encountered while setting up Jacobi preconditioner!"; } }
jacobi_precond(MatrixType const & mat, jacobi_tag const & tag) : system_matrix(mat) { assert(mat.size1() == mat.size2()); diag_A_inv.resize(mat.size1()); //resize without preserving values for (typename MatrixType::const_iterator1 row_it = system_matrix.begin1(); row_it != system_matrix.end1(); ++row_it) { bool diag_found = false; for (typename MatrixType::const_iterator2 col_it = row_it.begin(); col_it != row_it.end(); ++col_it) { if (col_it.index1() == col_it.index2()) { diag_A_inv[col_it.index1()] = static_cast<ScalarType>(1.0) / *col_it; diag_found = true; } } if (!diag_found) throw "ViennaCL: Zero in diagonal encountered while setting up Jacobi preconditioner!"; } }