xref: /petsc/src/sys/tutorials/ex4.c (revision 63a3b9bc7a1f24f247904ccba9383635fe6abade)
1c4762a1bSJed Brown static char help[] = "Introductory example that illustrates running PETSc on a subset of processes.\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown  #include <petscsys.h>
4c4762a1bSJed Brown 
5c4762a1bSJed Brown int main(int argc, char *argv[])
6c4762a1bSJed Brown {
7c4762a1bSJed Brown   PetscMPIInt rank, size;
8c4762a1bSJed Brown 
9c4762a1bSJed Brown   /* We must call MPI_Init() first, making us, not PETSc, responsible for MPI */
10*63a3b9bcSJacob Faibussowitsch   PetscCallMPI(MPI_Init(&argc, &argv));
11540e20f2SPierre Jolivet #if defined(PETSC_HAVE_ELEMENTAL)
12*63a3b9bcSJacob Faibussowitsch   PetscCall(PetscElementalInitializePackage());
13540e20f2SPierre Jolivet #endif
14c4762a1bSJed Brown   /* We can now change the communicator universe for PETSc */
15*63a3b9bcSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &rank));
16*63a3b9bcSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_split(MPI_COMM_WORLD, rank%2, 0, &PETSC_COMM_WORLD));
17c4762a1bSJed Brown 
18c4762a1bSJed Brown   /*
19c4762a1bSJed Brown     Every PETSc routine should begin with the PetscInitialize() routine.
20c4762a1bSJed Brown     argc, argv - These command line arguments are taken to extract the options
21c4762a1bSJed Brown                  supplied to PETSc and options supplied to MPI.
22c4762a1bSJed Brown     help       - When PETSc executable is invoked with the option -help,
23c4762a1bSJed Brown                  it prints the various options that can be applied at
24c4762a1bSJed Brown                  runtime.  The user can use the "help" variable place
25c4762a1bSJed Brown                  additional help messages in this printout.
26c4762a1bSJed Brown   */
279566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, (char*) 0, help));
28c4762a1bSJed Brown 
29c4762a1bSJed Brown   /*
30c4762a1bSJed Brown      The following MPI calls return the number of processes
31c4762a1bSJed Brown      being used and the rank of this process in the group.
32c4762a1bSJed Brown    */
339566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size));
349566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank));
35c4762a1bSJed Brown 
36c4762a1bSJed Brown   /*
37c4762a1bSJed Brown      Here we would like to print only one message that represents
38c4762a1bSJed Brown      all the processes in the group.  We use PetscPrintf() with the
39c4762a1bSJed Brown      communicator PETSC_COMM_WORLD.  Thus, only one message is
40c4762a1bSJed Brown      printed representng PETSC_COMM_WORLD, i.e., all the processors.
41c4762a1bSJed Brown   */
429566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Number of processors = %d, rank = %d\n", size, rank));
43c4762a1bSJed Brown 
44c4762a1bSJed Brown   /*
45c4762a1bSJed Brown      Always call PetscFinalize() before exiting a program.  This routine
46c4762a1bSJed Brown        - finalizes the PETSc libraries as well as MPI
47c4762a1bSJed Brown        - provides summary and diagnostic information if certain runtime
48c4762a1bSJed Brown          options are chosen (e.g., -log_view).  See PetscFinalize()
49c4762a1bSJed Brown      manpage for more information.
50c4762a1bSJed Brown   */
51d0609cedSBarry Smith   PetscCall(PetscFinalize());
52*63a3b9bcSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_free(&PETSC_COMM_WORLD));
53540e20f2SPierre Jolivet #if defined(PETSC_HAVE_ELEMENTAL)
54*63a3b9bcSJacob Faibussowitsch   PetscCall(PetscElementalFinalizePackage());
55540e20f2SPierre Jolivet #endif
56c4762a1bSJed Brown   /* Since we initialized MPI, we must call MPI_Finalize() */
57*63a3b9bcSJacob Faibussowitsch   PetscCallMPI(MPI_Finalize());
58*63a3b9bcSJacob Faibussowitsch   return 0;
59c4762a1bSJed Brown }
60c4762a1bSJed Brown 
61c4762a1bSJed Brown /*TEST
62c4762a1bSJed Brown 
63c4762a1bSJed Brown    test:
64c4762a1bSJed Brown       nsize: 5
65c4762a1bSJed Brown       args: -options_left no
66c4762a1bSJed Brown       filter: sort -b | grep -v saws_port_auto_selectcd
67c4762a1bSJed Brown       filter_output: sort -b
68c4762a1bSJed Brown 
69c4762a1bSJed Brown TEST*/
70