Advertisement
Divinty2

Некорректная BGK

Jul 12th, 2022
1,049
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.91 KB | None | 0 0
  1. double ATA_norm(sparse_matrix_t& A, const matrix_descr descr, double* vec, int size) {
  2.     mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1., A, descr, vec, 0, vec);
  3.     double res = cblas_ddot(size, vec, 1, vec, 1);
  4.     res = sqrt(res);
  5.     return res;
  6. }
  7.  
  8. void Bidiagonalization_ATA(
  9.     int nrows,
  10.     sparse_matrix_t& A,
  11.     double** p,
  12.     double** q,
  13.     int size_q
  14. )
  15. {
  16.     double** z = new double* [size_q];
  17.     for (int i = 0; i < size_q; i++) z[i] = new double[nrows];
  18.  
  19.     double** w = new double* [size_q];
  20.     for (int i = 0; i < size_q; i++) w[i] = new double[nrows];
  21.  
  22.     double* ATAp = new double[nrows];
  23.     double* ATAq = new double[nrows];
  24.     double* tmp = new double[nrows];
  25.     double* alpha = new double[nrows];
  26.     double* beta = new double[nrows];
  27.  
  28.     ofstream outf("ab_check.txt");
  29.     matrix_descr descr = { SPARSE_MATRIX_TYPE_GENERAL,
  30.         SPARSE_FILL_MODE_UPPER, SPARSE_DIAG_UNIT };
  31.     //q[0] = (1, 0, 0, 0, 0, 0, 0, 0, 0)
  32.     q[0][0] = 1;
  33.     for (int i = 1; i < nrows; i++) q[0][i] = 0;
  34.     //set w_0 = ATA * q_0
  35.     mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1., A, descr, q[0], 0, tmp);
  36.     print(tmp, nrows, "Aq");
  37.     mkl_sparse_d_mv(SPARSE_OPERATION_TRANSPOSE, 1., A, descr, tmp, 0, w[0]);
  38.     print(w[0], nrows, "ATAq");
  39.     //alpha_0 = ||w_0||
  40.     alpha[0] = ATA_norm(A, descr, w[0], nrows);
  41.     //alpha[0] = e_norm(w[0], nrows);
  42.     cout << "alpha = " << alpha[0];
  43.     //p_0 = alpha_0^-1 * w_0
  44.     cblas_daxpby(nrows, 1.0 / alpha[0], w[0], 1, 0, p[0], 1);
  45.  
  46.     for (int i = 0; i < size_q - 1; i++)
  47.     {
  48.         //z_i = ATA * p_i - alpha_i * q_i
  49.         mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE,
  50.             1., A, descr, p[i], 0, tmp);
  51.         mkl_sparse_d_mv(SPARSE_OPERATION_TRANSPOSE,
  52.             1., A, descr, tmp, 0, ATAp);
  53.         cblas_daxpy(nrows, -1 * alpha[i], q[i], 1, ATAp, 1);
  54.         copy(ATAp, ATAp + nrows, z[i]);
  55.         //beta_i = ||z_i||
  56.         beta[i] = ATA_norm(A, descr, z[i], nrows);
  57.         //beta[i] = e_norm(z[i], nrows);
  58.         //q_i+1 = beta_i^-1 * z_i
  59.         cblas_daxpby(nrows, 1.0 / beta[i], z[i], 1, 0, q[i + 1], 1);
  60.  
  61.  
  62.         //w_i = ATA * q_i - beta_i-1 * p_i-1
  63.         mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1., A, descr, q[i + 1], 0, tmp);
  64.         mkl_sparse_d_mv(SPARSE_OPERATION_TRANSPOSE, 1., A, descr, tmp, 0, ATAq);
  65.         cblas_daxpy(nrows, -1 * beta[i], p[i], 1, ATAq, 1);
  66.         copy(ATAq, ATAq + nrows, w[i + 1]);
  67.         //alpha_i = ||w_i||
  68.         alpha[i + 1] = ATA_norm(A, descr, w[i + 1], nrows);
  69.         //alpha[i + 1] = e_norm(w[i + 1], nrows);
  70.         //outf << "alpha_" << i+1 << " = " << setprecision(3) << alpha[i+1] << "\t";
  71.         //p_i = alpha_i^-1 * w_i
  72.         cblas_daxpby(nrows, 1.0 / alpha[i + 1], w[i + 1], 1, 0, p[i + 1], 1);
  73.     }
  74.     outf << "\t";
  75.     for (int i = 0; i < size_q; i++) outf << i << "\t";
  76.     outf << "\nalpha\t";
  77.     for (int i = 0; i < size_q; i++) outf << setprecision(2) << alpha[i] << "\t";
  78.  
  79.     outf << "\nbeta \t";
  80.     for (int i = 0; i < size_q - 1; i++) outf << setprecision(2) << beta[i] << "\t";
  81.  
  82.     outf.close();
  83.  
  84.     delete[] w;
  85.     delete[] z;
  86.     delete[] ATAp;
  87.     delete[] ATAq;
  88.     delete[] alpha;
  89.     delete[] beta;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement