xref: /petsc/src/sys/tests/ex50.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
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   PetscErrorCode    ierr;
14c4762a1bSJed Brown   PetscViewer       viewer,subviewer,subsubviewer;
15c4762a1bSJed Brown   PetscViewerFormat format;
16c4762a1bSJed Brown   PetscBool         flg;
17c4762a1bSJed Brown   PetscSubcomm      psubcomm,psubsubcomm;
18c4762a1bSJed Brown   MPI_Comm          comm,subcomm,subsubcomm;
19c4762a1bSJed Brown   PetscMPIInt       size;
20c4762a1bSJed Brown 
21c4762a1bSJed Brown   /*
22c4762a1bSJed Brown     Every PETSc routine should begin with the PetscInitialize() routine.
23c4762a1bSJed Brown     argc, argv - These command line arguments are taken to extract the options
24c4762a1bSJed Brown                  supplied to PETSc and options supplied to MPI.
25c4762a1bSJed Brown     help       - When PETSc executable is invoked with the option -help,
26c4762a1bSJed Brown                  it prints the various options that can be applied at
27c4762a1bSJed Brown                  runtime.  The user can use the "help" variable place
28c4762a1bSJed Brown                  additional help messages in this printout.
29c4762a1bSJed Brown   */
30c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
31c4762a1bSJed Brown   comm = PETSC_COMM_WORLD;
32*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_size(comm,&size));
332c71b3e2SJacob Faibussowitsch   PetscCheckFalse(size < 4,PETSC_COMM_WORLD,PETSC_ERR_SUP,"Must run with at least 4 MPI processes");
34*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetViewer(comm,NULL,NULL,"-viewer",&viewer,&format,&flg));
352c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!viewer,PETSC_COMM_WORLD,PETSC_ERR_SUP,"Must use -viewer option");
36c4762a1bSJed Brown 
37*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"Print called on original full viewer %d\n",PetscGlobalRank));
38c4762a1bSJed Brown 
39*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommCreate(comm,&psubcomm));
40*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommSetNumber(psubcomm,2));
41*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommSetType(psubcomm,PETSC_SUBCOMM_CONTIGUOUS));
42c4762a1bSJed Brown   /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */
43*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommSetFromOptions(psubcomm));
44c4762a1bSJed Brown   subcomm = PetscSubcommChild(psubcomm);
45c4762a1bSJed Brown 
46*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerGetSubViewer(viewer,subcomm,&subviewer));
47c4762a1bSJed Brown 
48*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(subviewer,"  Print called on sub viewers %d\n",PetscGlobalRank));
49c4762a1bSJed Brown 
50*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommCreate(subcomm,&psubsubcomm));
51*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommSetNumber(psubsubcomm,2));
52*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommSetType(psubsubcomm,PETSC_SUBCOMM_CONTIGUOUS));
53c4762a1bSJed Brown   /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */
54*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommSetFromOptions(psubsubcomm));
55c4762a1bSJed Brown   subsubcomm = PetscSubcommChild(psubsubcomm);
56c4762a1bSJed Brown 
57*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerGetSubViewer(subviewer,subsubcomm,&subsubviewer));
58c4762a1bSJed Brown 
59*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(subsubviewer,"  Print called on sub sub viewers %d\n",PetscGlobalRank));
60c4762a1bSJed Brown 
61*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerRestoreSubViewer(subviewer,subsubcomm,&subsubviewer));
62*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerRestoreSubViewer(viewer,subcomm,&subviewer));
63c4762a1bSJed Brown 
64*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommDestroy(&psubsubcomm));
65*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSubcommDestroy(&psubcomm));
66*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerDestroy(&viewer));
67c4762a1bSJed Brown   ierr = PetscFinalize();
68c4762a1bSJed Brown   return ierr;
69c4762a1bSJed Brown }
70c4762a1bSJed Brown 
71c4762a1bSJed Brown /*TEST
72c4762a1bSJed Brown 
73c4762a1bSJed Brown    test:
74c4762a1bSJed Brown       nsize: 4
75c4762a1bSJed Brown       args: -viewer
76c4762a1bSJed Brown 
77c4762a1bSJed Brown TEST*/
78