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 */ 1063a3b9bcSJacob Faibussowitsch PetscCallMPI(MPI_Init(&argc, &argv)); 11540e20f2SPierre Jolivet #if defined(PETSC_HAVE_ELEMENTAL) 1263a3b9bcSJacob Faibussowitsch PetscCall(PetscElementalInitializePackage()); 13540e20f2SPierre Jolivet #endif 14c4762a1bSJed Brown /* We can now change the communicator universe for PETSc */ 1563a3b9bcSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &rank)); 1663a3b9bcSJacob 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 */ 27*327415f7SBarry Smith PetscFunctionBeginUser; 289566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, (char*) 0, help)); 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 */ 349566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 359566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 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 representng PETSC_COMM_WORLD, i.e., all the processors. 42c4762a1bSJed Brown */ 439566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Number of processors = %d, rank = %d\n", size, rank)); 44c4762a1bSJed Brown 45c4762a1bSJed Brown /* 46c4762a1bSJed Brown Always call PetscFinalize() before exiting a program. This routine 47c4762a1bSJed Brown - finalizes the PETSc libraries as well as MPI 48c4762a1bSJed Brown - provides summary and diagnostic information if certain runtime 49c4762a1bSJed Brown options are chosen (e.g., -log_view). See PetscFinalize() 50c4762a1bSJed Brown manpage for more information. 51c4762a1bSJed Brown */ 52d0609cedSBarry Smith PetscCall(PetscFinalize()); 5363a3b9bcSJacob Faibussowitsch PetscCallMPI(MPI_Comm_free(&PETSC_COMM_WORLD)); 54540e20f2SPierre Jolivet #if defined(PETSC_HAVE_ELEMENTAL) 5563a3b9bcSJacob Faibussowitsch PetscCall(PetscElementalFinalizePackage()); 56540e20f2SPierre Jolivet #endif 57c4762a1bSJed Brown /* Since we initialized MPI, we must call MPI_Finalize() */ 5863a3b9bcSJacob Faibussowitsch PetscCallMPI(MPI_Finalize()); 5963a3b9bcSJacob Faibussowitsch return 0; 60c4762a1bSJed Brown } 61c4762a1bSJed Brown 62c4762a1bSJed Brown /*TEST 63c4762a1bSJed Brown 64c4762a1bSJed Brown test: 65c4762a1bSJed Brown nsize: 5 66c4762a1bSJed Brown args: -options_left no 67c4762a1bSJed Brown filter: sort -b | grep -v saws_port_auto_selectcd 68c4762a1bSJed Brown filter_output: sort -b 69c4762a1bSJed Brown 70c4762a1bSJed Brown TEST*/ 71