Guest User

Untitled

a guest
Jun 17th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1.     //compute some cell lists real quick
  2.     for (int pi = 0; pi < _px.size(); pi++)
  3.     {          
  4.         int i = (_px[pi]-_offset[0])/_h[0];
  5.         int j = (_py[pi]-_offset[1])/_h[1];
  6.         int k = (_pz[pi]-_offset[2])/_h[2];
  7.  
  8.         _cells[i*_ny*_nz+j*_nz+k].push_back(pi);
  9.     }
  10.  
  11.     for (int i = 0; i < _nx; i++) {
  12.         for (int j = 0; j < _ny; j++) {
  13.             for (int k = 0; k < _nz; k++) {
  14.  
  15.                 //bounds
  16.                 int low_i = std::max(0,i-1);
  17.                 int low_j = std::max(0,j-1);
  18.                 int low_k = std::max(0,k-1);
  19.  
  20.                 int high_i = std::min(i+1,_nx-1);
  21.                 int high_j = std::min(j+1,_ny-1);
  22.                 int high_k = std::min(k+1,_nz-1);
  23.  
  24.                 //+1/-1 support
  25.                 for (int ii = low_i; ii <= high_i; ii++)
  26.                     for (int jj = low_j; jj <= high_j; jj++)
  27.                         for (int kk = low_k; kk <= high_k; kk++)
  28.                         {
  29.                             //target cell center
  30.                             float posii = ii * _h[0] + _offset[0] + 0.5f*_h[0];
  31.                             float posjj = jj * _h[1] + _offset[1] + 0.5f*_h[1];
  32.                             float poskk = kk * _h[2] + _offset[2] + 0.5f*_h[2];
  33.  
  34.                             for (int it = 0; it < _cells[ii*_ny*_nz+jj*_nz+kk].size(); it++)                           
  35.                             {
  36.                                 float px = _px[_cells[ii*_ny*_nz+jj*_nz+kk].at(it)];
  37.                                 float py = _py[_cells[ii*_ny*_nz+jj*_nz+kk].at(it)];
  38.                                 float pz = _pz[_cells[ii*_ny*_nz+jj*_nz+kk].at(it)];
  39.  
  40.                                 //tent kernel interpol
  41.                                 float m_mass = 1.f*tent(px-posii,_h[0])*tent(py-posjj,_h[1])*tent(pz-poskk,_h[2]);
  42.  
  43.                                 _weights[it] += m_mass;
  44.                             }
  45.                         }
  46.             }
  47.         }
  48.     }
  49.  
  50.     for (int i = 0; i < _nx; i++) {
  51.         for (int j = 0; j < _ny; j++) {
  52.             for (int k = 0; k < _nz; k++) {
  53.  
  54.                 //bounds
  55.                 int low_i = std::max(0,i-1);
  56.                 int low_j = std::max(0,j-1);
  57.                 int low_k = std::max(0,k-1);
  58.  
  59.                 int high_i = std::min(i+1,_nx-1);
  60.                 int high_j = std::min(j+1,_ny-1);
  61.                 int high_k = std::min(k+1,_nz-1);
  62.  
  63.                 //+1/-1 support
  64.                 for (int ii = low_i; ii <= high_i; ii++)
  65.                     for (int jj = low_j; jj <= high_j; jj++)
  66.                         for (int kk = low_k; kk <= high_k; kk++)
  67.                         {
  68.                             //target cell center
  69.                             float posii = ii * _h[0] + _offset[0] + 0.5f*_h[0];
  70.                             float posjj = jj * _h[1] + _offset[1] + 0.5f*_h[1];
  71.                             float poskk = kk * _h[2] + _offset[2] + 0.5f*_h[2];
  72.  
  73.                             for (int it = 0; it < _cells[ii*_ny*_nz+jj*_nz+kk].size(); it++)                           
  74.                             {
  75.                                 if (_weights[it] == 0.f) continue;
  76.  
  77.                                 float px = _px[_cells[ii*_ny*_nz+jj*_nz+kk].at(it)];
  78.                                 float py = _py[_cells[ii*_ny*_nz+jj*_nz+kk].at(it)];
  79.                                 float pz = _pz[_cells[ii*_ny*_nz+jj*_nz+kk].at(it)];
  80.  
  81.                                 //tent kernel interpol
  82.                                 float p_mass = _h_part_density[it] * tent(px-posii,_h[0])*tent(py-posjj,_h[1])*tent(pz-poskk,_h[2]) / _weights[it];
  83.  
  84.                                 _h_density->at(ii,jj,kk) += p_mass;
  85.                             }
  86.                         }
  87.             }
  88.         }
  89.     }
  90.  
  91.  
  92.     //sanity check
  93.     float max_dens = 0.f;
  94.  
  95.     for (int i = 0; i < _nx; i++) {
  96.         for (int j = 0; j < _ny; j++) {
  97.             for (int k = 0; k < _nz; k++) {
  98.                 max_dens = std::max(max_dens,_h_density->at(i,j,k));
  99.             }
  100.         }
  101.     }
Add Comment
Please, Sign In to add comment