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"); }
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; */ }