xref: /petsc/src/dm/tests/ex8.c (revision 6a98f8dc3f2c9149905a87dc2e9d0fedaf64e09a)
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