xref: /petsc/src/sys/tests/ex50.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "Tests using PetscViewerGetSubViewer() recursively\n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown /*T
5c4762a1bSJed Brown    Concepts: viewers
6c4762a1bSJed Brown    Processors: n
7c4762a1bSJed Brown T*/
8c4762a1bSJed Brown #include <petscsys.h>
9c4762a1bSJed Brown #include <petscviewer.h>
10c4762a1bSJed Brown 
11c4762a1bSJed Brown int main(int argc,char **argv)
12c4762a1bSJed Brown {
13c4762a1bSJed Brown   PetscViewer       viewer,subviewer,subsubviewer;
14c4762a1bSJed Brown   PetscViewerFormat format;
15c4762a1bSJed Brown   PetscBool         flg;
16c4762a1bSJed Brown   PetscSubcomm      psubcomm,psubsubcomm;
17c4762a1bSJed Brown   MPI_Comm          comm,subcomm,subsubcomm;
18c4762a1bSJed Brown   PetscMPIInt       size;
19c4762a1bSJed Brown 
20c4762a1bSJed Brown   /*
21c4762a1bSJed Brown     Every PETSc routine should begin with the PetscInitialize() routine.
22c4762a1bSJed Brown     argc, argv - These command line arguments are taken to extract the options
23c4762a1bSJed Brown                  supplied to PETSc and options supplied to MPI.
24c4762a1bSJed Brown     help       - When PETSc executable is invoked with the option -help,
25c4762a1bSJed Brown                  it prints the various options that can be applied at
26c4762a1bSJed Brown                  runtime.  The user can use the "help" variable place
27c4762a1bSJed Brown                  additional help messages in this printout.
28c4762a1bSJed Brown   */
29*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscInitialize(&argc,&argv,(char*)0,help));
30c4762a1bSJed Brown   comm = PETSC_COMM_WORLD;
315f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_size(comm,&size));
322c71b3e2SJacob Faibussowitsch   PetscCheckFalse(size < 4,PETSC_COMM_WORLD,PETSC_ERR_SUP,"Must run with at least 4 MPI processes");
335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetViewer(comm,NULL,NULL,"-viewer",&viewer,&format,&flg));
3428b400f6SJacob Faibussowitsch   PetscCheck(viewer,PETSC_COMM_WORLD,PETSC_ERR_SUP,"Must use -viewer option");
35c4762a1bSJed Brown 
365f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"Print called on original full viewer %d\n",PetscGlobalRank));
37c4762a1bSJed Brown 
385f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommCreate(comm,&psubcomm));
395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommSetNumber(psubcomm,2));
405f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommSetType(psubcomm,PETSC_SUBCOMM_CONTIGUOUS));
41c4762a1bSJed Brown   /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */
425f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommSetFromOptions(psubcomm));
43c4762a1bSJed Brown   subcomm = PetscSubcommChild(psubcomm);
44c4762a1bSJed Brown 
455f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerGetSubViewer(viewer,subcomm,&subviewer));
46c4762a1bSJed Brown 
475f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(subviewer,"  Print called on sub viewers %d\n",PetscGlobalRank));
48c4762a1bSJed Brown 
495f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommCreate(subcomm,&psubsubcomm));
505f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommSetNumber(psubsubcomm,2));
515f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommSetType(psubsubcomm,PETSC_SUBCOMM_CONTIGUOUS));
52c4762a1bSJed Brown   /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */
535f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommSetFromOptions(psubsubcomm));
54c4762a1bSJed Brown   subsubcomm = PetscSubcommChild(psubsubcomm);
55c4762a1bSJed Brown 
565f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerGetSubViewer(subviewer,subsubcomm,&subsubviewer));
57c4762a1bSJed Brown 
585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(subsubviewer,"  Print called on sub sub viewers %d\n",PetscGlobalRank));
59c4762a1bSJed Brown 
605f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerRestoreSubViewer(subviewer,subsubcomm,&subsubviewer));
615f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerRestoreSubViewer(viewer,subcomm,&subviewer));
62c4762a1bSJed Brown 
635f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommDestroy(&psubsubcomm));
645f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommDestroy(&psubcomm));
655f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerDestroy(&viewer));
66*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscFinalize());
67*b122ec5aSJacob Faibussowitsch   return 0;
68c4762a1bSJed Brown }
69c4762a1bSJed Brown 
70c4762a1bSJed Brown /*TEST
71c4762a1bSJed Brown 
72c4762a1bSJed Brown    test:
73c4762a1bSJed Brown       nsize: 4
74c4762a1bSJed Brown       args: -viewer
75c4762a1bSJed Brown 
76c4762a1bSJed Brown TEST*/
77