Advertisement
Divinty2

CR_AT

Jul 28th, 2022 (edited)
858
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. void CR_AT(int nrows,
  2.     sparse_matrix_t& A,
  3.     double* u,
  4.     double* f,
  5.     double eps,
  6.     int itermax,
  7.     int* number_of_operations)
  8. {
  9.     double* Ap = new double[nrows];
  10.     double* Atr = new double[nrows]; // A^T*r^n
  11.     double* p = new double[nrows];
  12.     double* r = new double[nrows];
  13.  
  14.     int iter = 0;
  15.     double alpha = 0.0;
  16.     double beta = 0.0;
  17.     double rr = 0;       // (r^n, r^n)
  18.     double Atr_p = 0;    // (A^T*r^n, p^n)
  19.     double Atr_Atr = 0;  // (A^T*r^n, A^T*r^n)
  20.  
  21.     matrix_descr descr = { SPARSE_MATRIX_TYPE_GENERAL, SPARSE_FILL_MODE_UPPER, SPARSE_DIAG_UNIT };
  22.  
  23.     eps *= eps * cblas_ddot(nrows, f, 1, f, 1);
  24.     copy(f, f + nrows, r);
  25.     mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, -1., A, descr, u, 1, r);
  26.     rr = cblas_ddot(nrows, r, 1, r, 1);
  27.  
  28.     mkl_sparse_d_mv(SPARSE_OPERATION_TRANSPOSE, 1., A, descr, r, 0, Atr);
  29.     copy(Atr, Atr + nrows, p);
  30.     Atr_p = cblas_ddot(nrows, Atr, 1, p, 1);
  31.     Atr_Atr = cblas_ddot(nrows, Atr, 1, Atr, 1);
  32.  
  33.  
  34.     while (rr > eps && iter < itermax) {
  35.         mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1., A, descr, p, 0, Ap);
  36.         alpha = Atr_p / cblas_ddot(nrows, Ap, 1, Ap, 1);
  37.  
  38.         iter++;
  39.  
  40.         cblas_daxpy(nrows, alpha, p, 1, u, 1);
  41.         cblas_daxpy(nrows, -alpha, Ap, 1, r, 1);
  42.  
  43.         rr = cblas_ddot(nrows, r, 1, r, 1);
  44.         mkl_sparse_d_mv(SPARSE_OPERATION_TRANSPOSE, 1., A, descr, r, 0, Atr);
  45.  
  46.         beta = Atr_Atr;
  47.         Atr_Atr = cblas_ddot(nrows, Atr, 1, Atr, 1);
  48.         beta = Atr_Atr / beta;
  49.  
  50.         cblas_daxpby(nrows, 1, Atr, 1, beta, p, 1);
  51.         Atr_p = cblas_ddot(nrows, Atr, 1, p, 1);
  52.  
  53.         *number_of_operations = iter;
  54.     }
  55.  
  56.     delete[] Ap;
  57.     delete[] Atr;
  58.     delete[] p;
  59.     delete[] r;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement