Пример #1
0
int main(int argc, char **args) {
  
  int nx, ny, nz;

  cout << "Enter nx ny nz: ";
  cin >> nx;
  cin >> ny;
  cin >> nz;
//  nx = 1;
//  ny = 2;
//  nz = 3;

  int n = nx*ny*nz;

  int sample_nx, sample_ny, sample_nz;
  sample_nx = 32;
  sample_ny = 32;
  sample_nz = 32;
  double x_scale = ((double)nx)/((double)sample_nx);
  double y_scale = ((double)ny)/((double)sample_ny);
  double z_scale = ((double)nz)/((double)sample_nz);
  int sample_n = sample_nx*sample_ny*sample_nz;

  char filename[1024];
  sprintf(filename,"parameters-%d.h5",nx);

  HDF *file = new HDF(filename,1);
  int compress = 0;

  file->createFileSpace(1,n,NULL,NULL);
  printf("Cell Ids\n");
  file->createDataSet("Cell Ids",H5T_NATIVE_INT,compress);

  int *cell_ids = new int[n];
  for (int i=0; i<n; i++)
    cell_ids[i] = i+1;

  file->setHyperSlab(n);
  file->createMemorySpace(1,n,NULL,NULL);
  file->writeInt(cell_ids);

  delete [] cell_ids;
  cell_ids = NULL;

  file->closeDataSet();
 // file->closeDataSpaces();

  printf("Permeability\n");
  file->createDataSet("Permeability",H5T_NATIVE_DOUBLE,compress);

  double *values = new double[n];
  for (int i=0; i<n; i++) values[i] = 0.;

  double *sample_values = new double[sample_n];
  for (int i=0; i<sample_n; i++) sample_values[i] = 0.;

//  strcpy(filename,"permeability.final");
  strcpy(filename,"permeability.sample");
  FileIO *datafile = new FileIO(filename);
//  for (int i=0; i<n; i++) {
  for (int i=0; i<sample_n; i++) {
    datafile->getLine();
//    datafile->readDouble(&values[i]);
    datafile->readDouble(&sample_values[i]);
  }
  delete datafile;

  int count = 0;
  for (int k=0; k<nz; k++) {
    int kk = (int)(((double)k)/z_scale);
    for (int j=0; j<ny; j++) {
      int jj = (int)(((double)j)/y_scale);
      for (int i=0; i<nx; i++) {
        int ii = (int)(((double)i)/x_scale);
        int index = ii + jj*sample_nx + kk*sample_nx*sample_ny;
        values[count++] = sample_values[index];
      }
    }
  }

  file->setHyperSlab(n);
  file->createMemorySpace(1,n,NULL,NULL);
  file->writeDouble(values);

  file->closeDataSet();
 // file->closeDataSpaces();

  // use same data space
  printf("Porosity\n");
  file->createDataSet("Porosity",H5T_NATIVE_DOUBLE,compress);

  for (int i=0; i<sample_n; i++) sample_values[i] = 0.;

//  strcpy(filename,"porosity.final");
  strcpy(filename,"porosity.sample");
  datafile = new FileIO(filename);
  for (int i=0; i<n; i++) values[i] = 0.;
//  for (int i=0; i<n; i++) {
  for (int i=0; i<sample_n; i++) {
    datafile->getLine();
//    datafile->readDouble(&values[i]);
    datafile->readDouble(&sample_values[i]);
  }
  delete datafile;

  count = 0;
  for (int k=0; k<nz; k++) {
    int kk = (int)(((double)k)/z_scale);
    for (int j=0; j<ny; j++) {
      int jj = (int)(((double)j)/y_scale);
      for (int i=0; i<nx; i++) {
        int ii = (int)(((double)i)/x_scale);
        int index = ii + jj*sample_nx + kk*sample_nx*sample_ny;
        values[count++] = sample_values[index];
      }
    }
  }

  file->setHyperSlab(n);
  file->createMemorySpace(1,n,NULL,NULL);
  file->writeDouble(values);

  file->closeDataSet();
  file->closeDataSpaces();

  delete file;

  delete [] values;
  delete [] sample_values;
 
  printf("Done!\n");
}  
Пример #2
0
MAD::MAD(Grid **grid_) {

  ifc_polygon = NULL;
  river_polygon = NULL;
  ascii_grids = NULL;
  spp_polygon = NULL;

  PetscReal mx = 1.;
  PetscReal my = 1.;
  PetscReal mz = 1.;

  PetscInt nx, ny, nz;

  char filename[1024];
  PetscBool option_found;
  strcpy(filename,"mdt.in");
  PetscOptionsGetString(PETSC_NULL,"-mdtin",filename,1024,&option_found);

  FileIO *file = new FileIO(filename);
  file->getLine();
  file->readInt(&nx);
  file->readInt(&ny);
  file->readInt(&nz);
  delete file;

  PetscReal dx;
  PetscReal dy;
  PetscReal dz;// */

  PetscReal len_x = 120.;
  PetscReal len_y = 122;
  PetscReal len_z = 60.;

  dx = len_x/(PetscReal)nx;
  dy = len_y/(PetscReal)ny;
  dz = len_z/(PetscReal)nz;

  PetscInt n = nx*ny*nz;

  PetscPrintf(PETSC_COMM_WORLD,"nx = %d, dx = %f, lenx = %f\n",nx,dx,nx*dx);
  PetscPrintf(PETSC_COMM_WORLD,"ny = %d, dy = %f, leny = %f\n",ny,dy,ny*dy);
  PetscPrintf(PETSC_COMM_WORLD,"nz = %d, dz = %f, lenz = %f\n",nz,dz,nz*dz);
  *grid_ = new Grid(nx,ny,nz);
  Grid *grid = *grid_;

// grid spacing with a bias
#if 0
  PetscReal sum_x = 0.;
  PetscReal sum_y = 0.;
  dx = 0.8470329472543
  PetscReal *dx_array = new double[nx];
  PetscReal *dy_array = new double[ny];
  PetscReal *dz_array = new double[nz];
  for (int i=0; i<nx; i++)
    dx_array[i] = 10.;
  for (int i=0; i<ny; i++)
    dy_array[i] = 10.;
  for (int i=0; i<nz; i++)
    dz_array[i] = 0.25;

  for (int i=11; i<19; i++) {
    dx_array[i] = 10.*pow(1.30242241518419,(double)(10-i));
    sum_x += dx_array[i];
  }

  for (int i=19; i<89; i++) {
    dx_array[i] = 1.;
    sum_x += dx_array[i];
  }

  for (int i=89; i<97; i++) {
    dx_array[i] = 10.*pow(1.30242241518419,(double)(i-97));
    sum_x += dx_array[i];
  }

  for (int i=97; i<9; i++) {
    dy_array[110+i] = 10.*pow(1.353088,i+1.);
    dy_array[9-i] = 10.*pow(1.353088,i+1.);
    sum_y += dy_array[9-i];
  }
  grid->setGridSpacing(dx_array,dy_array,dz_array);
#else
  grid->setGridSpacing(dx,dy,dz);
#endif

//  grid->setOrigin(593618.9,114565.1,70.);
  grid->setRotation(34.); // must come before ->setOrigin()
  grid->setOrigin(594237.2891,115984.7447,70.);

//  grid->computeCoordinates();
//  grid->computeConnectivity();
  grid->computeCellMapping();
  grid->setUpCells();
  grid->computeVertexMapping();
  grid->setUpVertices();
  grid->mapVerticesToCells();

  ifc_polygon = new Polygon();
  ifc_polygon->createIFCPolygon();

#if 0
  char ascii_filename[1024];
  strcpy(ascii_filename,"test.asc");
  AsciiGrid **ascii_grid = new AsciiGrid*[2];
  ascii_grid[0] = new AsciiGrid(ascii_filename);
  ascii_grid[0]->setMaterialId(1);
  ascii_grid[1] = new AsciiGrid("default",2,2,-1.e10,-1.e10,1.e10,-9999.,
                                1.e20,0); 
#else

  AsciiGrid::nasciigrids = 6;
  string *grid_filenames = new string[AsciiGrid::nasciigrids];
#if 0
  grid_filenames[0].append("./basalt_300area.asc");
  grid_filenames[1].append("./u9_300area.asc");
  grid_filenames[2].append("./u8_300area.asc");
  grid_filenames[3].append("./u5gravel_300area.asc");
  grid_filenames[4].append("./u5silt_300area.asc");
  grid_filenames[5].append("./newbath_10mDEM_grid.ascii");
#else
  grid_filenames[0].append("../basalt_300area.asc");
  grid_filenames[1].append("../u9_300area.asc");
  grid_filenames[2].append("../u8_300area.asc");
  grid_filenames[3].append("../u5gravel_300area.asc");
  grid_filenames[4].append("../u5silt_300area.asc");
  grid_filenames[5].append("../newbath_10mDEM_grid.ascii");
#endif

  ascii_grids = new AsciiGrid*[AsciiGrid::nasciigrids];
  for (PetscInt i=0; i<AsciiGrid::nasciigrids; i++) {
    char filename[32];
    strcpy(filename,grid_filenames[i].c_str());
    ascii_grids[i] = new AsciiGrid(filename);
  }
  ascii_grids[0]->setMaterialId(10);
  ascii_grids[1]->setMaterialId(9);
  ascii_grids[2]->setMaterialId(8);
  ascii_grids[3]->setMaterialId(6);
  ascii_grids[4]->setMaterialId(5);
  ascii_grids[5]->setMaterialId(1);

  PetscInt mod = grid->num_cells_ghosted/10;
  for (PetscInt i=0; i<grid->num_cells_ghosted; i++) {
    PetscInt material_id = 0;
    PetscReal x = grid->cells[i].getX();
    PetscReal y = grid->cells[i].getY();
    PetscReal z = grid->cells[i].getZ();
    for (PetscInt ilayer=0; ilayer<AsciiGrid::nasciigrids; ilayer++) {
      PetscReal zlayer = ascii_grids[ilayer]->computeElevationFromCoordinate(x,y);
      if (zlayer > ascii_grids[ilayer]->nodata && zlayer >= z) {
        material_id = ascii_grids[ilayer]->getMaterialId();
        break;
      }
    }
    if (material_id == 0) grid->cells[i].setActive(0);
    grid->cells[i].setMaterialId(material_id);
    if (river_polygon) {
      if (!river_polygon->pointInPolygon(x,y)) {
        grid->cells[i].setActive(0);
        grid->cells[i].negateMaterialId();
      }
    }
    if (i%mod == 0) {
      PetscPrintf(PETSC_COMM_WORLD,"%d of %d cells mapped with materials and activity.\n",
                  i,grid->num_cells_ghosted);
    }
  }

#endif

  flagGridCells(grid);

#if 0
  computeEastBoundary(grid,1);
  computeWestBoundary(grid,1);
  computeNorthBoundary(grid,0);
  computeSouthBoundary(grid,0);
  computeTopBoundary(grid,0);
#endif

  computeIFCBoundary(grid,ifc_polygon);

#if 0
  BoundarySet *river = grid->getBoundarySet("East");
  BoundarySet *west = grid->getBoundarySet("West");
  BoundarySet *north = grid->getBoundarySet("North");
  BoundarySet *south = grid->getBoundarySet("South");
  BoundarySet *recharge = grid->getBoundarySet("Top");
#endif

/*
  Condition *new_condition = new Condition("river.bc");
  river->condition = new_condition;
  new_condition = new Condition("west.bc");
  west->condition = new_condition;
  new_condition = new Condition("recharge.bc");
  recharge->condition = new_condition;
  new_condition = NULL;
*/  

}