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