Advertisement
Divinty2

Генератор матрицы CSR

Nov 14th, 2022
940
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.65 KB | None | 0 0
  1. int box_check(int x, int y, int z, int nx, int ny, int nz)
  2. {
  3.     return
  4.         (0 <= x) && (x < nx) &&
  5.         (0 <= y) && (y < ny) &&
  6.         (0 <= z) && (z < nz);
  7. }
  8.  
  9. void diffconv3d_mx2(int nx, int ny, int nz, double p, double q, double r, int* n, int** ia, int** ja, double** a)
  10. {
  11.     int x, y, z, cp, cr, i, nnz, nrow;
  12.  
  13.     // output:
  14.     int* irow, * icol;
  15.     double* data;
  16.  
  17.     // offsets:
  18.     int xof[7] = { 0, 0, -1, 0, 1, 0, 0 };
  19.     int yof[7] = { 0, -1, 0, 0, 0, 1, 0 };
  20.     int zof[7] = { -1, 0, 0, 0, 0, 0, 1 };
  21.     int crof[7] = { -nx * ny, -nx, -1, 0, 1, nx, nx * ny };
  22.     double c[7];
  23.  
  24.     // mx coeffs (exponential scheme):
  25.     {
  26.         c[0] = -exp(0.5 * r / ((double)nz + 1));
  27.         c[1] = -exp(0.5 * q / ((double)ny + 1));
  28.         c[2] = -exp(0.5 * p / ((double)nx + 1));
  29.         c[4] = -exp(-0.5 * p / ((double)nx + 1));
  30.         c[5] = -exp(-0.5 * q / ((double)ny + 1));
  31.         c[6] = -exp(-0.5 * r / ((double)nz + 1));
  32.  
  33.         c[3] = -(c[0] + c[1] + c[2] + c[4] + c[5] + c[6]);
  34.     }
  35.  
  36.     // alloc arrays:
  37.     {
  38.         nrow = nx * ny * nz;
  39.         nnz = 7 * nx * ny * nz - 2 * (nx * ny + ny * nz + nz * nx);
  40.  
  41.         irow = new int[nrow + 1];
  42.         icol = new int[nnz];
  43.         data = new double[nnz];
  44.     }
  45.  
  46.     // fill everything:
  47.     cp = 0;
  48.  
  49.     for (z = 0; z < nz; z++)
  50.         for (y = 0; y < ny; y++)
  51.             for (x = 0; x < nx; x++)
  52.             {
  53.                 cr = x + y * nx + z * nx * ny;
  54.  
  55.                 for (i = 0; i < 7; i++)
  56.                     if (box_check(x + xof[i], y + yof[i], z + zof[i], nx, ny, nz))
  57.                     {
  58.                         icol[cp] = cr + crof[i];
  59.                         data[cp++] = c[i];
  60.                     }
  61.  
  62.                 irow[cr + 1] = cp;
  63.             }
  64.  
  65.     irow[0] = 0;
  66.  
  67.     // voila.
  68.     if (n)  *n = nrow;
  69.     if (ia) *ia = irow; else delete[] irow;
  70.     if (ja) *ja = icol; else delete[] icol;
  71.     if (a)  *a = data; else delete[] data;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement