Advertisement
Divinty2

Conjugate Gradients

Jun 16th, 2022
819
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. //Метод сопряжённых градиентов с использованием библиотеки MKL
  2. void CG(
  3.     int nrows,                  //число строк в матрице
  4.     sparse_matrix_t& A,         //квадратная с.п.о. матрица в формате csr
  5.     double* u,                  //вектор решения
  6.     double* f,                  //правая часть
  7.     double eps,                 //заданная погрешность
  8.     int itermax,                //максимальное число итераций
  9.     int* number_of_operations   //суммарное число выполненных итераций
  10. )
  11. {
  12.     double* Ap = new double[nrows];
  13.     double* p = new double[nrows];
  14.     double* r = new double[nrows];
  15.  
  16.     int iter = 0;
  17.     double alpha = 0.0;
  18.     double beta = 0.0;
  19.     double rr = 0;
  20.  
  21.     matrix_descr descr = { SPARSE_MATRIX_TYPE_GENERAL, SPARSE_FILL_MODE_UPPER, SPARSE_DIAG_UNIT };
  22.  
  23.     copy(f, f + nrows, r);
  24.     mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, -1., A, descr, u, 1, r);
  25.  
  26.     eps *= eps * cblas_ddot(nrows, f, 1, f, 1);
  27.     copy(r, r + nrows, p);
  28.     rr = cblas_ddot(nrows, r, 1, r, 1);
  29.     while (rr > eps && iter < itermax)
  30.     {
  31.         mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1., A, descr, p, 0, Ap);
  32.  
  33.         alpha = rr / cblas_ddot(nrows, Ap, 1, p, 1);
  34.  
  35.         cblas_daxpy(nrows, alpha, p, 1, u, 1);
  36.         cblas_daxpy(nrows, -alpha, Ap, 1, r, 1);
  37.  
  38.         beta = rr;
  39.         rr = cblas_ddot(nrows, r, 1, r, 1);
  40.         beta = rr / beta;
  41.  
  42.         cblas_daxpby(nrows, 1, r, 1, beta, p, 1);
  43.  
  44.         iter++;
  45.         *number_of_operations = iter;
  46.     }
  47.     delete[] Ap;
  48.     delete[] p;
  49.     delete[] r;
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement