1 2 static char help[] = "Tests DMDAGetElements() and VecView() contour plotting for 2d DMDAs.\n\n"; 3 4 5 #include <petscdm.h> 6 #include <petscdmda.h> 7 #include <petscdraw.h> 8 9 int main(int argc,char **argv) 10 { 11 PetscInt M = 10,N = 8,ne,nc,i; 12 const PetscInt *e; 13 PetscErrorCode ierr; 14 PetscBool flg = PETSC_FALSE; 15 DM da; 16 PetscViewer viewer; 17 Vec local,global; 18 PetscScalar value; 19 DMBoundaryType bx = DM_BOUNDARY_NONE,by = DM_BOUNDARY_NONE; 20 DMDAStencilType stype = DMDA_STENCIL_BOX; 21 PetscScalar *lv; 22 23 ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; 24 ierr = PetscViewerDrawOpen(PETSC_COMM_WORLD,0,"",300,0,300,300,&viewer);CHKERRQ(ierr); 25 26 /* Read options */ 27 ierr = PetscOptionsGetInt(NULL,NULL,"-M",&M,NULL);CHKERRQ(ierr); 28 ierr = PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL);CHKERRQ(ierr); 29 ierr = PetscOptionsGetBool(NULL,NULL,"-star_stencil",&flg,NULL);CHKERRQ(ierr); 30 if (flg) stype = DMDA_STENCIL_STAR; 31 32 /* Create distributed array and get vectors */ 33 ierr = DMDACreate2d(PETSC_COMM_WORLD,bx,by,stype,M,N,PETSC_DECIDE,PETSC_DECIDE,1,1,NULL,NULL,&da);CHKERRQ(ierr); 34 ierr = DMSetFromOptions(da);CHKERRQ(ierr); 35 ierr = DMSetUp(da);CHKERRQ(ierr); 36 ierr = DMCreateGlobalVector(da,&global);CHKERRQ(ierr); 37 ierr = DMCreateLocalVector(da,&local);CHKERRQ(ierr); 38 39 value = -3.0; 40 ierr = VecSet(global,value);CHKERRQ(ierr); 41 ierr = DMGlobalToLocalBegin(da,global,INSERT_VALUES,local);CHKERRQ(ierr); 42 ierr = DMGlobalToLocalEnd(da,global,INSERT_VALUES,local);CHKERRQ(ierr); 43 44 ierr = DMDASetElementType(da,DMDA_ELEMENT_P1);CHKERRQ(ierr); 45 ierr = DMDAGetElements(da,&ne,&nc,&e);CHKERRQ(ierr); 46 ierr = VecGetArray(local,&lv);CHKERRQ(ierr); 47 for (i=0; i<ne; i++) { 48 ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"i %D e[3*i] %D %D %D\n",i,e[3*i],e[3*i+1],e[3*i+2]);CHKERRQ(ierr); 49 lv[e[3*i]] = i; 50 } 51 ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD,stdout);CHKERRQ(ierr); 52 ierr = VecRestoreArray(local,&lv);CHKERRQ(ierr); 53 ierr = DMDARestoreElements(da,&ne,&nc,&e);CHKERRQ(ierr); 54 55 ierr = DMLocalToGlobalBegin(da,local,ADD_VALUES,global);CHKERRQ(ierr); 56 ierr = DMLocalToGlobalEnd(da,local,ADD_VALUES,global);CHKERRQ(ierr); 57 58 ierr = DMView(da,viewer);CHKERRQ(ierr); 59 ierr = VecView(global,viewer);CHKERRQ(ierr); 60 61 /* Free memory */ 62 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 63 ierr = VecDestroy(&local);CHKERRQ(ierr); 64 ierr = VecDestroy(&global);CHKERRQ(ierr); 65 ierr = DMDestroy(&da);CHKERRQ(ierr); 66 ierr = PetscFinalize(); 67 return ierr; 68 } 69 70 71 72 /*TEST 73 74 test: 75 requires: x 76 77 test: 78 suffix: 2 79 nsize: 2 80 requires: x 81 82 TEST*/ 83