Beispiel #1
0
 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
     }
   }
 }
Beispiel #2
0
 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
     }
   }
 }
Beispiel #3
0
        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!";
   }
 }