Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.40 KB | None | 0 0
  1. void MultiGridSolver::RelaxError(unsigned int nIterations, ublas::matrix<double> & input_f, ublas::matrix<double> & inout_u, ublas::matrix<double> & output_r) {
  2.    
  3.     //ensure consistent sizes
  4.     assert(input_f.size1() == output_r.size1() && output_r.size1() == inout_u.size1());
  5.     assert(input_f.size2() == output_r.size2() && output_r.size2() == inout_u.size2());
  6.  
  7.     //size
  8.     unsigned int n = inout_u.size1();
  9.  
  10.     //spacing
  11.     double spacing = 1.0/n;
  12.    
  13.     for (unsigned int n_iter = 0; n_iter < nIterations; n_iter++) {
  14.  
  15.         //red halfiteration
  16.         for (unsigned int i = 1; i < n-1; i++) {
  17.             for (unsigned int j = 1; j < n-1; j++) {
  18.                 if ( (i+j) %2 == 0) {   //optimize!
  19.                     inout_u(i,j) = (inout_u(i-1,j) + inout_u(i+1,j)+ inout_u(i,j-1) + inout_u(i,j+1) - spacing*spacing*input_f(i,j))/4.0;
  20.                 }
  21.             }
  22.         }
  23.  
  24.         //black halfiteration
  25.         for (unsigned int i = 1; i < n-1; i++) {
  26.             for (unsigned int j = 1; j < n-1; j++) {
  27.                 if ( (i+j) %2 == 1) {   //optimize!
  28.                     inout_u(i,j) = (inout_u(i-1,j) + inout_u(i+1,j)+ inout_u(i,j-1) + inout_u(i,j+1) - spacing*spacing*input_f(i,j))/4.0;
  29.                 }
  30.             }
  31.         }
  32.    
  33.     }
  34.  
  35.     //residual
  36.     for (unsigned int i = 1; i < n-1; i++) {
  37.         for (unsigned int j = 1; j < n-1; j++) {
  38.             double laplacian = (-inout_u(i-1,j) - inout_u(i+1,j) - inout_u(i,j-1) - inout_u(i,j+1) + 4*inout_u(i,j)) / (spacing*spacing);
  39.             output_r(i,j) = (laplacian - input_f(i,j))*(laplacian-input_f(i,j));
  40.         }
  41.     }
  42. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement