1! 2! This introductory example illustrates running PETSc on a subset 3! of processes 4! 5! ----------------------------------------------------------------------- 6 7 program main 8#include <petsc/finclude/petscsys.h> 9 use petscmpi ! or mpi or mpi_f08 10 use petscsys 11 implicit none 12 13 PetscErrorCode ierr 14 PetscMPIInt rank, size, zero, two 15 16! We must call MPI_Init() first, making us, not PETSc, responsible 17! for MPI 18 19 PetscCallMPIA(MPI_Init(ierr)) 20 21! We can now change the communicator universe for PETSc 22 23 zero = 0 24 two = 2 25 PetscCallMPIA(MPI_Comm_rank(MPI_COMM_WORLD,rank,ierr)) 26 PetscCallMPIA(MPI_Comm_split(MPI_COMM_WORLD,mod(rank,two),zero,PETSC_COMM_WORLD,ierr)) 27 28! Every PETSc routine should begin with the PetscInitialize() 29! routine. 30 31 PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER,ierr)) 32 33! The following MPI calls return the number of processes being used 34! and the rank of this process in the group. 35 36 PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD,size,ierr)) 37 PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD,rank,ierr)) 38 39! Here we would like to print only one message that represents all 40! the processes in the group. 41 if (rank .eq. 0) write(6,100) size,rank 42 100 format('No of Procs = ',i4,' rank = ',i4) 43 44! Always call PetscFinalize() before exiting a program. This 45! routine - finalizes the PETSc libraries as well as MPI - provides 46! summary and diagnostic information if certain runtime options are 47! chosen (e.g., -log_view). See PetscFinalize() manpage for more 48! information. 49 50 PetscCallA(PetscFinalize(ierr)) 51 PetscCallMPIA(MPI_Comm_free(PETSC_COMM_WORLD,ierr)) 52 53! Since we initialized MPI, we must call MPI_Finalize() 54 55 PetscCallMPIA( MPI_Finalize(ierr)) 56 end 57 58! 59!/*TEST 60! 61! test: 62! 63!TEST*/ 64