xref: /petsc/src/sys/tests/ex50.c (revision 732aec7a18f2199fb53bb9a2f3aef439a834ce31)
1c4762a1bSJed Brown static char help[] = "Tests using PetscViewerGetSubViewer() recursively\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscsys.h>
4c4762a1bSJed Brown #include <petscviewer.h>
5c4762a1bSJed Brown 
main(int argc,char ** argv)6d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
7d71ae5a4SJacob Faibussowitsch {
8c4762a1bSJed Brown   PetscViewer       viewer, subviewer, subsubviewer;
9c4762a1bSJed Brown   PetscViewerFormat format;
10c4762a1bSJed Brown   PetscBool         flg;
11c4762a1bSJed Brown   PetscSubcomm      psubcomm, psubsubcomm;
12c4762a1bSJed Brown   MPI_Comm          comm, subcomm, subsubcomm;
13c4762a1bSJed Brown   PetscMPIInt       size;
14c4762a1bSJed Brown 
15c4762a1bSJed Brown   /*
16c4762a1bSJed Brown     Every PETSc routine should begin with the PetscInitialize() routine.
17c4762a1bSJed Brown     argc, argv - These command line arguments are taken to extract the options
18c4762a1bSJed Brown                  supplied to PETSc and options supplied to MPI.
19c4762a1bSJed Brown     help       - When PETSc executable is invoked with the option -help,
20c4762a1bSJed Brown                  it prints the various options that can be applied at
21c4762a1bSJed Brown                  runtime.  The user can use the "help" variable place
22c4762a1bSJed Brown                  additional help messages in this printout.
23c4762a1bSJed Brown   */
24327415f7SBarry Smith   PetscFunctionBeginUser;
25*c8025a54SPierre Jolivet   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
26c4762a1bSJed Brown   comm = PETSC_COMM_WORLD;
279566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
28811af0c4SBarry Smith   PetscCheck(size >= 4, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with at least 4 MPI ranks");
29648c30bcSBarry Smith   PetscCall(PetscOptionsCreateViewer(comm, NULL, NULL, "-viewer", &viewer, &format, &flg));
3028b400f6SJacob Faibussowitsch   PetscCheck(viewer, PETSC_COMM_WORLD, PETSC_ERR_SUP, "Must use -viewer option");
31c4762a1bSJed Brown 
329566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "Print called on original full viewer %d\n", PetscGlobalRank));
33c4762a1bSJed Brown 
349566063dSJacob Faibussowitsch   PetscCall(PetscSubcommCreate(comm, &psubcomm));
359566063dSJacob Faibussowitsch   PetscCall(PetscSubcommSetNumber(psubcomm, 2));
369566063dSJacob Faibussowitsch   PetscCall(PetscSubcommSetType(psubcomm, PETSC_SUBCOMM_CONTIGUOUS));
37c4762a1bSJed Brown   /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */
389566063dSJacob Faibussowitsch   PetscCall(PetscSubcommSetFromOptions(psubcomm));
39c4762a1bSJed Brown   subcomm = PetscSubcommChild(psubcomm);
40c4762a1bSJed Brown 
419566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetSubViewer(viewer, subcomm, &subviewer));
42c4762a1bSJed Brown 
439566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(subviewer, "  Print called on sub viewers %d\n", PetscGlobalRank));
44c4762a1bSJed Brown 
459566063dSJacob Faibussowitsch   PetscCall(PetscSubcommCreate(subcomm, &psubsubcomm));
469566063dSJacob Faibussowitsch   PetscCall(PetscSubcommSetNumber(psubsubcomm, 2));
479566063dSJacob Faibussowitsch   PetscCall(PetscSubcommSetType(psubsubcomm, PETSC_SUBCOMM_CONTIGUOUS));
48c4762a1bSJed Brown   /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */
499566063dSJacob Faibussowitsch   PetscCall(PetscSubcommSetFromOptions(psubsubcomm));
50c4762a1bSJed Brown   subsubcomm = PetscSubcommChild(psubsubcomm);
51c4762a1bSJed Brown 
529566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetSubViewer(subviewer, subsubcomm, &subsubviewer));
53c4762a1bSJed Brown 
549566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(subsubviewer, "  Print called on sub sub viewers %d\n", PetscGlobalRank));
55c4762a1bSJed Brown 
569566063dSJacob Faibussowitsch   PetscCall(PetscViewerRestoreSubViewer(subviewer, subsubcomm, &subsubviewer));
579566063dSJacob Faibussowitsch   PetscCall(PetscViewerRestoreSubViewer(viewer, subcomm, &subviewer));
58c4762a1bSJed Brown 
599566063dSJacob Faibussowitsch   PetscCall(PetscSubcommDestroy(&psubsubcomm));
609566063dSJacob Faibussowitsch   PetscCall(PetscSubcommDestroy(&psubcomm));
61648c30bcSBarry Smith   PetscCall(PetscViewerDestroy(&viewer));
629566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
63b122ec5aSJacob Faibussowitsch   return 0;
64c4762a1bSJed Brown }
65c4762a1bSJed Brown 
66c4762a1bSJed Brown /*TEST
67c4762a1bSJed Brown 
68c4762a1bSJed Brown    test:
69c4762a1bSJed Brown       nsize: 4
70c4762a1bSJed Brown       args: -viewer
71c4762a1bSJed Brown 
72b4025f61SBarry Smith    test:
73b4025f61SBarry Smith       suffix: 2
74b4025f61SBarry Smith       nsize: 4
75b4025f61SBarry Smith       args: -viewer -psubcomm_type interlaced
76b4025f61SBarry Smith 
77c4762a1bSJed Brown TEST*/
78