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 #include <petscsys.h> 14c4762a1bSJed Brown int main(int argc,char **argv) 15c4762a1bSJed Brown { 16c4762a1bSJed Brown PetscErrorCode ierr; 17c4762a1bSJed Brown PetscMPIInt rank,size; 18c4762a1bSJed Brown 19c4762a1bSJed Brown /* 20c4762a1bSJed Brown Every PETSc program should begin with the PetscInitialize() routine. 21c4762a1bSJed Brown argc, argv - These command line arguments are taken to extract the options 22c4762a1bSJed Brown supplied to PETSc and options supplied to MPI. 23c4762a1bSJed Brown help - When PETSc executable is invoked with the option -help, 24c4762a1bSJed Brown it prints the various options that can be applied at 25*c87e60e8SJose E. Roman runtime. The user can use the "help" variable to place 26c4762a1bSJed Brown additional help messages in this printout. 27c4762a1bSJed Brown */ 28c4762a1bSJed Brown ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr; 29c4762a1bSJed Brown 30c4762a1bSJed Brown /* 31c4762a1bSJed Brown The following MPI calls return the number of processes 32c4762a1bSJed Brown being used and the rank of this process in the group. 33c4762a1bSJed Brown */ 34ffc4695bSBarry Smith ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 35ffc4695bSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 36c4762a1bSJed Brown 37c4762a1bSJed Brown /* 38c4762a1bSJed Brown Here we would like to print only one message that represents 39c4762a1bSJed Brown all the processes in the group. We use PetscPrintf() with the 40c4762a1bSJed Brown communicator PETSC_COMM_WORLD. Thus, only one message is 41c4762a1bSJed Brown printed representing PETSC_COMM_WORLD, i.e., all the processors. 42c4762a1bSJed Brown */ 43c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_WORLD,"Number of processors = %d, rank = %d\n",size,rank);CHKERRQ(ierr); 44c4762a1bSJed Brown /* 45c4762a1bSJed Brown Here we would like to print info from each process, such that 46c4762a1bSJed Brown output from process "n" appears after output from process "n-1". 47c4762a1bSJed Brown To do this we use a combination of PetscSynchronizedPrintf() and 48c4762a1bSJed Brown PetscSynchronizedFlush() with the communicator PETSC_COMM_WORLD. 49c4762a1bSJed Brown All the processes print the message, one after another. 50c4762a1bSJed Brown PetscSynchronizedFlush() indicates that the current process in the 51c4762a1bSJed Brown given communicator has concluded printing, so that the next process 52c4762a1bSJed Brown in the communicator can begin printing to the screen. 53c4762a1bSJed Brown */ 54c4762a1bSJed Brown ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] Synchronized Hello World.\n",rank);CHKERRQ(ierr); 55c4762a1bSJed Brown ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] Synchronized Hello World - Part II.\n",rank);CHKERRQ(ierr); 56c4762a1bSJed Brown ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT);CHKERRQ(ierr); 57c4762a1bSJed Brown /* 58c4762a1bSJed Brown Here a barrier is used to separate the two states. 59c4762a1bSJed Brown */ 60ffc4695bSBarry Smith ierr = MPI_Barrier(PETSC_COMM_WORLD);CHKERRMPI(ierr); 61c4762a1bSJed Brown 62c4762a1bSJed Brown /* 63c4762a1bSJed Brown Here we simply use PetscPrintf() with the communicator PETSC_COMM_SELF 64c4762a1bSJed Brown (where each process is considered separately). Thus, this time the 65c4762a1bSJed Brown output from different processes does not appear in any particular order. 66c4762a1bSJed Brown */ 67c4762a1bSJed Brown ierr = PetscPrintf(PETSC_COMM_SELF,"[%d] Jumbled Hello World\n",rank);CHKERRQ(ierr); 68c4762a1bSJed Brown 69c4762a1bSJed Brown /* 70c4762a1bSJed Brown Always call PetscFinalize() before exiting a program. This routine 71c4762a1bSJed Brown - finalizes the PETSc libraries as well as MPI 72c4762a1bSJed Brown - provides summary and diagnostic information if certain runtime 73c4762a1bSJed Brown options are chosen (e.g., -log_view). 74c4762a1bSJed Brown See the PetscFinalize() manpage for more information. 75c4762a1bSJed Brown */ 76c4762a1bSJed Brown ierr = PetscFinalize(); 77c4762a1bSJed Brown return ierr; 78c4762a1bSJed Brown } 79c4762a1bSJed Brown 80c4762a1bSJed Brown /*TEST 81c4762a1bSJed Brown 82c4762a1bSJed Brown test: 83c4762a1bSJed Brown 84c4762a1bSJed Brown TEST*/ 85