Ejemplo n.º 1
0
void cosmobl::set_ObjectRegion_SubBoxes (catalogue::Catalogue &data, catalogue::Catalogue &random, const int nx, const int ny, const int nz)
{
  vector<double> Lim;
  data.MinMax_var(catalogue::Var::_X_, Lim, 0);
  data.MinMax_var(catalogue::Var::_Y_, Lim, 0);
  data.MinMax_var(catalogue::Var::_Z_, Lim, 0);

  double Cell_X = (Lim[1]-Lim[0])/nx;
  double Cell_Y = (Lim[3]-Lim[2])/ny;
  double Cell_Z = (Lim[5]-Lim[4])/nz;

#pragma omp parallel num_threads(omp_get_max_threads())
  {
    
#pragma omp for schedule(static, 2) 
    for (int i=0; i<data.nObjects(); i++) {
      int i1 = min(int((data.xx(i)-Lim[0])/Cell_X), nx-1);
      int j1 = min(int((data.yy(i)-Lim[2])/Cell_Y), ny-1);
      int z1 = min(int((data.zz(i)-Lim[4])/Cell_Z), nz-1);
      int index = z1+nz*(j1+ny*i1);
      data.catalogue_object(i)->set_region(index);
    }

#pragma omp for schedule(static, 2) 
    for (int i=0; i<random.nObjects(); i++) {
      int i1 = min(int((random.xx(i)-Lim[0])/Cell_X), nx-1);
      int j1 = min(int((random.yy(i)-Lim[2])/Cell_Y), ny-1);
      int z1 = min(int((random.zz(i)-Lim[4])/Cell_Z), nz-1);
      int index = z1+nz*(j1+ny*i1);
      random.catalogue_object(i)->set_region(index);
    }
  }
  
}