xref: /petsc/src/sys/tests/ex50.c (revision 327415f76d85372a4417cf1aaa14db707d4d6c04)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "Tests using PetscViewerGetSubViewer() recursively\n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown #include <petscsys.h>
5c4762a1bSJed Brown #include <petscviewer.h>
6c4762a1bSJed Brown 
7c4762a1bSJed Brown int main(int argc,char **argv)
8c4762a1bSJed Brown {
9c4762a1bSJed Brown   PetscViewer       viewer,subviewer,subsubviewer;
10c4762a1bSJed Brown   PetscViewerFormat format;
11c4762a1bSJed Brown   PetscBool         flg;
12c4762a1bSJed Brown   PetscSubcomm      psubcomm,psubsubcomm;
13c4762a1bSJed Brown   MPI_Comm          comm,subcomm,subsubcomm;
14c4762a1bSJed Brown   PetscMPIInt       size;
15c4762a1bSJed Brown 
16c4762a1bSJed Brown   /*
17c4762a1bSJed Brown     Every PETSc routine should begin with the PetscInitialize() routine.
18c4762a1bSJed Brown     argc, argv - These command line arguments are taken to extract the options
19c4762a1bSJed Brown                  supplied to PETSc and options supplied to MPI.
20c4762a1bSJed Brown     help       - When PETSc executable is invoked with the option -help,
21c4762a1bSJed Brown                  it prints the various options that can be applied at
22c4762a1bSJed Brown                  runtime.  The user can use the "help" variable place
23c4762a1bSJed Brown                  additional help messages in this printout.
24c4762a1bSJed Brown   */
25*327415f7SBarry Smith   PetscFunctionBeginUser;
269566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc,&argv,(char*)0,help));
27c4762a1bSJed Brown   comm = PETSC_COMM_WORLD;
289566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm,&size));
29be096a46SBarry Smith   PetscCheck(size >= 4,PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with at least 4 MPI processes");
309566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetViewer(comm,NULL,NULL,"-viewer",&viewer,&format,&flg));
3128b400f6SJacob Faibussowitsch   PetscCheck(viewer,PETSC_COMM_WORLD,PETSC_ERR_SUP,"Must use -viewer option");
32c4762a1bSJed Brown 
339566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer,"Print called on original full viewer %d\n",PetscGlobalRank));
34c4762a1bSJed Brown 
359566063dSJacob Faibussowitsch   PetscCall(PetscSubcommCreate(comm,&psubcomm));
369566063dSJacob Faibussowitsch   PetscCall(PetscSubcommSetNumber(psubcomm,2));
379566063dSJacob Faibussowitsch   PetscCall(PetscSubcommSetType(psubcomm,PETSC_SUBCOMM_CONTIGUOUS));
38c4762a1bSJed Brown   /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */
399566063dSJacob Faibussowitsch   PetscCall(PetscSubcommSetFromOptions(psubcomm));
40c4762a1bSJed Brown   subcomm = PetscSubcommChild(psubcomm);
41c4762a1bSJed Brown 
429566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetSubViewer(viewer,subcomm,&subviewer));
43c4762a1bSJed Brown 
449566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(subviewer,"  Print called on sub viewers %d\n",PetscGlobalRank));
45c4762a1bSJed Brown 
469566063dSJacob Faibussowitsch   PetscCall(PetscSubcommCreate(subcomm,&psubsubcomm));
479566063dSJacob Faibussowitsch   PetscCall(PetscSubcommSetNumber(psubsubcomm,2));
489566063dSJacob Faibussowitsch   PetscCall(PetscSubcommSetType(psubsubcomm,PETSC_SUBCOMM_CONTIGUOUS));
49c4762a1bSJed Brown   /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */
509566063dSJacob Faibussowitsch   PetscCall(PetscSubcommSetFromOptions(psubsubcomm));
51c4762a1bSJed Brown   subsubcomm = PetscSubcommChild(psubsubcomm);
52c4762a1bSJed Brown 
539566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetSubViewer(subviewer,subsubcomm,&subsubviewer));
54c4762a1bSJed Brown 
559566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(subsubviewer,"  Print called on sub sub viewers %d\n",PetscGlobalRank));
56c4762a1bSJed Brown 
579566063dSJacob Faibussowitsch   PetscCall(PetscViewerRestoreSubViewer(subviewer,subsubcomm,&subsubviewer));
589566063dSJacob Faibussowitsch   PetscCall(PetscViewerRestoreSubViewer(viewer,subcomm,&subviewer));
59c4762a1bSJed Brown 
609566063dSJacob Faibussowitsch   PetscCall(PetscSubcommDestroy(&psubsubcomm));
619566063dSJacob Faibussowitsch   PetscCall(PetscSubcommDestroy(&psubcomm));
629566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&viewer));
639566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
64b122ec5aSJacob Faibussowitsch   return 0;
65c4762a1bSJed Brown }
66c4762a1bSJed Brown 
67c4762a1bSJed Brown /*TEST
68c4762a1bSJed Brown 
69c4762a1bSJed Brown    test:
70c4762a1bSJed Brown       nsize: 4
71c4762a1bSJed Brown       args: -viewer
72c4762a1bSJed Brown 
73c4762a1bSJed Brown TEST*/
74