xref: /petsc/src/sys/tutorials/ex2.c (revision ffc4695bcb29f4b022f59a5fd6bc99fc280ff6d8)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "Synchronized printing.\n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown /*T
5c4762a1bSJed Brown    Concepts: petsc^introduction
6c4762a1bSJed Brown    Concepts: printing^synchronized
7c4762a1bSJed Brown    Concepts: printing^in parallel
8c4762a1bSJed Brown    Concepts: printf^synchronized
9c4762a1bSJed Brown    Concepts: printf^in parallel
10c4762a1bSJed Brown    Processors: n
11c4762a1bSJed Brown T*/
12c4762a1bSJed Brown 
13c4762a1bSJed Brown 
14c4762a1bSJed Brown 
15c4762a1bSJed Brown #include <petscsys.h>
16c4762a1bSJed Brown int main(int argc,char **argv)
17c4762a1bSJed Brown {
18c4762a1bSJed Brown   PetscErrorCode ierr;
19c4762a1bSJed Brown   PetscMPIInt    rank,size;
20c4762a1bSJed Brown 
21c4762a1bSJed Brown   /*
22c4762a1bSJed Brown     Every PETSc program 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,NULL,help);if (ierr) return ierr;
31c4762a1bSJed Brown 
32c4762a1bSJed Brown   /*
33c4762a1bSJed Brown      The following MPI calls return the number of processes
34c4762a1bSJed Brown      being used and the rank of this process in the group.
35c4762a1bSJed Brown    */
36*ffc4695bSBarry Smith   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
37*ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
38c4762a1bSJed Brown 
39c4762a1bSJed Brown   /*
40c4762a1bSJed Brown      Here we would like to print only one message that represents
41c4762a1bSJed Brown      all the processes in the group.  We use PetscPrintf() with the
42c4762a1bSJed Brown      communicator PETSC_COMM_WORLD.  Thus, only one message is
43c4762a1bSJed Brown      printed representing PETSC_COMM_WORLD, i.e., all the processors.
44c4762a1bSJed Brown   */
45c4762a1bSJed Brown   ierr = PetscPrintf(PETSC_COMM_WORLD,"Number of processors = %d, rank = %d\n",size,rank);CHKERRQ(ierr);
46c4762a1bSJed Brown   /*
47c4762a1bSJed Brown      Here we would like to print info from each process, such that
48c4762a1bSJed Brown      output from process "n" appears after output from process "n-1".
49c4762a1bSJed Brown      To do this we use a combination of PetscSynchronizedPrintf() and
50c4762a1bSJed Brown      PetscSynchronizedFlush() with the communicator PETSC_COMM_WORLD.
51c4762a1bSJed Brown      All the processes print the message, one after another.
52c4762a1bSJed Brown      PetscSynchronizedFlush() indicates that the current process in the
53c4762a1bSJed Brown      given communicator has concluded printing, so that the next process
54c4762a1bSJed Brown      in the communicator can begin printing to the screen.
55c4762a1bSJed Brown      */
56c4762a1bSJed Brown   ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] Synchronized Hello World.\n",rank);CHKERRQ(ierr);
57c4762a1bSJed Brown   ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] Synchronized Hello World - Part II.\n",rank);CHKERRQ(ierr);
58c4762a1bSJed Brown   ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT);CHKERRQ(ierr);
59c4762a1bSJed Brown   /*
60c4762a1bSJed Brown     Here a barrier is used to separate the two states.
61c4762a1bSJed Brown   */
62*ffc4695bSBarry Smith   ierr = MPI_Barrier(PETSC_COMM_WORLD);CHKERRMPI(ierr);
63c4762a1bSJed Brown 
64c4762a1bSJed Brown   /*
65c4762a1bSJed Brown     Here we simply use PetscPrintf() with the communicator PETSC_COMM_SELF
66c4762a1bSJed Brown     (where each process is considered separately).  Thus, this time the
67c4762a1bSJed Brown     output from different processes does not appear in any particular order.
68c4762a1bSJed Brown   */
69c4762a1bSJed Brown   ierr = PetscPrintf(PETSC_COMM_SELF,"[%d] Jumbled Hello World\n",rank);CHKERRQ(ierr);
70c4762a1bSJed Brown 
71c4762a1bSJed Brown   /*
72c4762a1bSJed Brown      Always call PetscFinalize() before exiting a program.  This routine
73c4762a1bSJed Brown        - finalizes the PETSc libraries as well as MPI
74c4762a1bSJed Brown        - provides summary and diagnostic information if certain runtime
75c4762a1bSJed Brown          options are chosen (e.g., -log_view).
76c4762a1bSJed Brown      See the PetscFinalize() manpage for more information.
77c4762a1bSJed Brown   */
78c4762a1bSJed Brown   ierr = PetscFinalize();
79c4762a1bSJed Brown   return ierr;
80c4762a1bSJed Brown }
81c4762a1bSJed Brown 
82c4762a1bSJed Brown 
83c4762a1bSJed Brown /*TEST
84c4762a1bSJed Brown 
85c4762a1bSJed Brown    test:
86c4762a1bSJed Brown 
87c4762a1bSJed Brown TEST*/
88