1 static char help[] = "Test parallel ruotines for GLVis\n\n"; 2 3 #include <petscdmshell.h> 4 #include <petsc/private/glvisvecimpl.h> 5 6 PetscErrorCode VecView_Shell(Vec v, PetscViewer viewer) 7 { 8 PetscViewerFormat format; 9 PetscBool isglvis,isascii; 10 11 PetscErrorCode ierr; 12 PetscFunctionBegin; 13 ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 14 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERGLVIS,&isglvis);CHKERRQ(ierr); 15 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 16 if (isglvis) { 17 DM dm; 18 19 ierr = VecGetDM(v,&dm);CHKERRQ(ierr); 20 /* DMView() cannot be tested, as DMView_Shell defaults to VecView */ 21 if (!dm) PetscFunctionReturn(0); 22 ierr = VecView_GLVis(v,viewer);CHKERRQ(ierr); 23 } else if (isascii) { 24 const char* name; 25 PetscInt n; 26 27 ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr); 28 ierr = PetscObjectGetName((PetscObject)v,&name);CHKERRQ(ierr); 29 if (!PetscGlobalRank) { 30 ierr = PetscViewerASCIIPrintf(viewer,"Hello from rank 0 -> vector name %s, size %D\n",name,n);CHKERRQ(ierr); 31 } 32 } 33 PetscFunctionReturn(0); 34 } 35 36 PetscErrorCode DMSetUpGLVisViewer_Shell(PetscObject odm, PetscViewer viewer) 37 { 38 DM dm = (DM)odm; 39 Vec V; 40 PetscInt dim = 2; 41 const char *fec_type = { "testme" }; 42 PetscErrorCode ierr; 43 44 PetscFunctionBegin; 45 ierr = DMCreateGlobalVector(dm,&V);CHKERRQ(ierr); 46 ierr = PetscObjectSetName((PetscObject)V,"sample");CHKERRQ(ierr); 47 ierr = PetscViewerGLVisSetFields(viewer,1,&fec_type,&dim,NULL,(PetscObject*)&V,NULL,NULL);CHKERRQ(ierr); 48 ierr = VecDestroy(&V);CHKERRQ(ierr); 49 PetscFunctionReturn(0); 50 } 51 52 int main(int argc, char **argv) 53 { 54 DM dm; 55 Vec v; 56 PetscErrorCode ierr; 57 58 ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr; 59 ierr = DMShellCreate(PETSC_COMM_WORLD,&dm);CHKERRQ(ierr); 60 ierr = PetscObjectComposeFunction((PetscObject)dm,"DMSetUpGLVisViewer_C",DMSetUpGLVisViewer_Shell);CHKERRQ(ierr); 61 ierr = VecCreateMPI(PETSC_COMM_WORLD,1,PETSC_DECIDE,&v);CHKERRQ(ierr); 62 ierr = PetscObjectSetName((PetscObject)v,"seed");CHKERRQ(ierr); 63 ierr = VecSetOperation(v,VECOP_VIEW,(void (*)(void))VecView_Shell);CHKERRQ(ierr); 64 ierr = DMShellSetGlobalVector(dm,v);CHKERRQ(ierr); 65 ierr = VecDestroy(&v);CHKERRQ(ierr); 66 ierr = DMViewFromOptions(dm,NULL,"-dm_view");CHKERRQ(ierr); 67 ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr); 68 ierr = VecViewFromOptions(v,NULL,"-vec_view");CHKERRQ(ierr); 69 ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr); 70 ierr = DMDestroy(&dm);CHKERRQ(ierr); 71 ierr = PetscFinalize(); 72 return ierr; 73 } 74 75 /*TEST 76 77 test: 78 suffix: glvis_par 79 nsize: {{1 2}} 80 args: -dm_view glvis: -vec_view glvis: 81 output_file: output/ex8_glvis.out 82 83 TEST*/ 84