Пример #1
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()]);
          }
        }
Пример #2
0
 void init(MatrixType const & mat, row_scaling_tag const & tag)
 {
   switch (tag.norm())
   {
     case 0:
       detail::row_info(mat, diag_M, detail::SPARSE_ROW_NORM_INF);
       break;
     case 1:
       detail::row_info(mat, diag_M, detail::SPARSE_ROW_NORM_1);
       break;
     case 2:
       detail::row_info(mat, diag_M, detail::SPARSE_ROW_NORM_2);
       break;
     default:
       throw unknown_norm_exception("Unknown norm when initializing row_scaling preconditioner!");
   }
 }
Пример #3
0
 void init(MatrixType const & mat, row_scaling_tag const & tag)
 {
   switch (tag.norm())
   {
     case 0:
       detail::row_info(mat, diag_M, detail::SPARSE_ROW_NORM_INF);
       break;
     case 1:
       detail::row_info(mat, diag_M, detail::SPARSE_ROW_NORM_1);
       break;
     case 2:
       detail::row_info(mat, diag_M, detail::SPARSE_ROW_NORM_2);
       break;
     default:
       throw "Unknown norm!";
   }
 }