1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Tests VecView()/VecLoad() for DMDA vectors (this tests DMDAGlobalToNatural()).\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscdm.h> 5c4762a1bSJed Brown #include <petscdmda.h> 6c4762a1bSJed Brown #include <petscviewerhdf5.h> 7c4762a1bSJed Brown 8c4762a1bSJed Brown int main(int argc,char **argv) 9c4762a1bSJed Brown { 10c4762a1bSJed Brown PetscMPIInt rank,size; 11c4762a1bSJed Brown PetscInt N = 6,M=8,P=5,dof=1; 12c4762a1bSJed Brown PetscInt stencil_width=1,pt=0,st=0; 13c4762a1bSJed Brown PetscErrorCode ierr; 14c4762a1bSJed Brown PetscBool flg2,flg3,isbinary,mpiio; 15c4762a1bSJed Brown DMBoundaryType bx = DM_BOUNDARY_NONE,by = DM_BOUNDARY_NONE,bz = DM_BOUNDARY_NONE; 16c4762a1bSJed Brown DMDAStencilType stencil_type = DMDA_STENCIL_STAR; 17c4762a1bSJed Brown DM da,da2; 18c4762a1bSJed Brown Vec global1,global2; 19c4762a1bSJed Brown PetscScalar mone = -1.0; 20c4762a1bSJed Brown PetscReal norm; 21c4762a1bSJed Brown PetscViewer viewer; 22c4762a1bSJed Brown PetscRandom rdm; 23c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5) 24c4762a1bSJed Brown PetscBool ishdf5; 25c4762a1bSJed Brown #endif 26c4762a1bSJed Brown 27c4762a1bSJed Brown ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; 28ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 29ffc4695bSBarry Smith ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 30c4762a1bSJed Brown 31c4762a1bSJed Brown ierr = PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL);CHKERRQ(ierr); 32c4762a1bSJed Brown ierr = PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL);CHKERRQ(ierr); 33c4762a1bSJed Brown ierr = PetscOptionsGetInt(NULL,NULL,"-P",&P,NULL);CHKERRQ(ierr); 34c4762a1bSJed Brown ierr = PetscOptionsGetInt(NULL,NULL,"-dof",&dof,NULL);CHKERRQ(ierr); 35c4762a1bSJed Brown ierr = PetscOptionsGetInt(NULL,NULL,"-stencil_width",&stencil_width,NULL);CHKERRQ(ierr); 36c4762a1bSJed Brown ierr = PetscOptionsGetInt(NULL,NULL,"-periodic",&pt,NULL);CHKERRQ(ierr); 37c4762a1bSJed Brown if (pt == 1) bx = DM_BOUNDARY_PERIODIC; 38c4762a1bSJed Brown if (pt == 2) by = DM_BOUNDARY_PERIODIC; 39c4762a1bSJed Brown if (pt == 4) {bx = DM_BOUNDARY_PERIODIC; by = DM_BOUNDARY_PERIODIC;} 40c4762a1bSJed Brown 41c4762a1bSJed Brown ierr = PetscOptionsGetInt(NULL,NULL,"-stencil_type",&st,NULL);CHKERRQ(ierr); 42c4762a1bSJed Brown stencil_type = (DMDAStencilType) st; 43c4762a1bSJed Brown 44c4762a1bSJed Brown ierr = PetscOptionsHasName(NULL,NULL,"-oned",&flg2);CHKERRQ(ierr); 45c4762a1bSJed Brown ierr = PetscOptionsHasName(NULL,NULL,"-twod",&flg2);CHKERRQ(ierr); 46c4762a1bSJed Brown ierr = PetscOptionsHasName(NULL,NULL,"-threed",&flg3);CHKERRQ(ierr); 47c4762a1bSJed Brown 48c4762a1bSJed Brown ierr = PetscOptionsHasName(NULL,NULL,"-binary",&isbinary);CHKERRQ(ierr); 49c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5) 50c4762a1bSJed Brown ierr = PetscOptionsHasName(NULL,NULL,"-hdf5",&ishdf5);CHKERRQ(ierr); 51c4762a1bSJed Brown #endif 52c4762a1bSJed Brown ierr = PetscOptionsHasName(NULL,NULL,"-mpiio",&mpiio);CHKERRQ(ierr); 53c4762a1bSJed Brown if (flg2) { 54c4762a1bSJed Brown ierr = DMDACreate2d(PETSC_COMM_WORLD,bx,by,stencil_type,M,N,PETSC_DECIDE,PETSC_DECIDE,dof,stencil_width,0,0,&da);CHKERRQ(ierr); 55c4762a1bSJed Brown } else if (flg3) { 56c4762a1bSJed Brown ierr = DMDACreate3d(PETSC_COMM_WORLD,bx,by,bz,stencil_type,M,N,P,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,dof,stencil_width,0,0,0,&da);CHKERRQ(ierr); 57c4762a1bSJed Brown } else { 58c4762a1bSJed Brown ierr = DMDACreate1d(PETSC_COMM_WORLD,bx,M,dof,stencil_width,NULL,&da);CHKERRQ(ierr); 59c4762a1bSJed Brown } 60c4762a1bSJed Brown ierr = DMSetFromOptions(da);CHKERRQ(ierr); 61c4762a1bSJed Brown ierr = DMSetUp(da);CHKERRQ(ierr); 62c4762a1bSJed Brown 63c4762a1bSJed Brown ierr = DMCreateGlobalVector(da,&global1);CHKERRQ(ierr); 64c4762a1bSJed Brown ierr = PetscObjectSetName((PetscObject)global1,"Test_Vec");CHKERRQ(ierr); 65c4762a1bSJed Brown ierr = PetscRandomCreate(PETSC_COMM_WORLD,&rdm);CHKERRQ(ierr); 66c4762a1bSJed Brown ierr = PetscRandomSetFromOptions(rdm);CHKERRQ(ierr); 67c4762a1bSJed Brown ierr = VecSetRandom(global1,rdm);CHKERRQ(ierr); 68c4762a1bSJed Brown if (isbinary) { 69c4762a1bSJed Brown if (mpiio) { 70c4762a1bSJed Brown ierr = PetscOptionsSetValue(NULL,"-viewer_binary_mpiio","");CHKERRQ(ierr); 71c4762a1bSJed Brown } 72c4762a1bSJed Brown ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,"temp",FILE_MODE_WRITE,&viewer);CHKERRQ(ierr); 73c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5) 74c4762a1bSJed Brown } else if (ishdf5) { 75c4762a1bSJed Brown ierr = PetscViewerHDF5Open(PETSC_COMM_WORLD,"temp",FILE_MODE_WRITE,&viewer);CHKERRQ(ierr); 76c4762a1bSJed Brown #endif 77*546078acSJacob Faibussowitsch } else SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"Invalid Viewer : Run with -binary or -hdf5 option"); 78c4762a1bSJed Brown ierr = VecView(global1,viewer);CHKERRQ(ierr); 79c4762a1bSJed Brown ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 80c4762a1bSJed Brown 81c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_WORLD,"Global vector written to temp file is \n");CHKERRQ(ierr); 82c4762a1bSJed Brown ierr = VecView(global1,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 83c4762a1bSJed Brown 84c4762a1bSJed Brown if (flg2) { 85c4762a1bSJed Brown ierr = DMDACreate2d(PETSC_COMM_WORLD,bx,by,stencil_type,M,N,PETSC_DECIDE,PETSC_DECIDE,dof,stencil_width,0,0,&da2);CHKERRQ(ierr); 86c4762a1bSJed Brown } else if (flg3) { 87c4762a1bSJed Brown ierr = DMDACreate3d(PETSC_COMM_WORLD,bx,by,bz,stencil_type,M,N,P,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,dof,stencil_width,0,0,0,&da2);CHKERRQ(ierr); 88c4762a1bSJed Brown } else { 89c4762a1bSJed Brown ierr = DMDACreate1d(PETSC_COMM_WORLD,bx,M,dof,stencil_width,NULL,&da2);CHKERRQ(ierr); 90c4762a1bSJed Brown } 91c4762a1bSJed Brown ierr = DMSetFromOptions(da2);CHKERRQ(ierr); 92c4762a1bSJed Brown ierr = DMSetUp(da2);CHKERRQ(ierr); 93c4762a1bSJed Brown 94c4762a1bSJed Brown if (isbinary) { 95c4762a1bSJed Brown ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,"temp",FILE_MODE_READ,&viewer);CHKERRQ(ierr); 96c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5) 97c4762a1bSJed Brown } else if (ishdf5) { 98c4762a1bSJed Brown ierr = PetscViewerHDF5Open(PETSC_COMM_WORLD,"temp",FILE_MODE_READ,&viewer);CHKERRQ(ierr); 99c4762a1bSJed Brown #endif 100*546078acSJacob Faibussowitsch } else SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"Invalid Viewer : Run with -binary or -hdf5 option"); 101c4762a1bSJed Brown 102c4762a1bSJed Brown ierr = DMCreateGlobalVector(da2,&global2);CHKERRQ(ierr); 103c4762a1bSJed Brown ierr = PetscObjectSetName((PetscObject)global2,"Test_Vec");CHKERRQ(ierr); 104c4762a1bSJed Brown ierr = VecLoad(global2,viewer);CHKERRQ(ierr); 105c4762a1bSJed Brown ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 106c4762a1bSJed Brown 107c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_WORLD,"Global vector read from temp file is \n");CHKERRQ(ierr); 108c4762a1bSJed Brown ierr = VecView(global2,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 109c4762a1bSJed Brown ierr = VecAXPY(global2,mone,global1);CHKERRQ(ierr); 110c4762a1bSJed Brown ierr = VecNorm(global2,NORM_MAX,&norm);CHKERRQ(ierr); 111c4762a1bSJed Brown if (norm != 0.0) { 112c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_WORLD,"ex23: Norm of difference %g should be zero\n",(double)norm);CHKERRQ(ierr); 113c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_WORLD," Number of processors %d\n",size);CHKERRQ(ierr); 114c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_WORLD," M,N,P,dof %D %D %D %D\n",M,N,P,dof);CHKERRQ(ierr); 115c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_WORLD," stencil_width %D stencil_type %d periodic %d\n",stencil_width,(int)stencil_type,(int)pt);CHKERRQ(ierr); 116c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_WORLD," dimension %d\n",1 + (int) flg2 + (int) flg3);CHKERRQ(ierr); 117c4762a1bSJed Brown } 118c4762a1bSJed Brown 119c4762a1bSJed Brown ierr = PetscRandomDestroy(&rdm);CHKERRQ(ierr); 120c4762a1bSJed Brown ierr = DMDestroy(&da);CHKERRQ(ierr); 121c4762a1bSJed Brown ierr = DMDestroy(&da2);CHKERRQ(ierr); 122c4762a1bSJed Brown ierr = VecDestroy(&global1);CHKERRQ(ierr); 123c4762a1bSJed Brown ierr = VecDestroy(&global2);CHKERRQ(ierr); 124c4762a1bSJed Brown ierr = PetscFinalize(); 125c4762a1bSJed Brown return ierr; 126c4762a1bSJed Brown } 127