!By Isaak Daniels PROGRAM WORK IMPLICIT NONE INCLUDE "mpif.h" !constants REAL*8,PARAMETER::X_LOWER=0 !lowest value of range REAL*8,PARAMETER::X_UPPER=10 REAL*8,PARAMETER::Width=(X_UPPER-X_LOWER) INTEGER,PARAMETER::NUM_RECTANGLES=10 REAL*8,PARAMETER::RECT_WIDTH=(Width/NUM_RECTANGLES) !variables INTEGER::ierr,i,i2,x,my_range_start,my_range_end, my_range_length INTEGER::mpi_error_code,number_of_processes,my_server INTEGER::my_rank REAL*8::sum REAL,DIMENSION(NUM_RECTANGLES)::areas !Define the algorithm CALL MPI_Init(mpi_error_code) CALL MPI_COMM_SIZE(MPI_COMM_WORLD,number_of_processes,mpi_error_code) CALL MPI_COMM_RANK(MPI_COMM_WORLD,my_rank,mpi_error_code) sum=0 my_server=0 !Creating ranges divided up amongst eh processes. my_range_length=NUM_RECTANGLES/number_of_processes my_range_start=my_rank*my_range_length x=(my_rank-1)*RECT_WIDTH+X_LOWER CALL FUNCTION(x,i2) areas(my_rank)=i2*RECT_WIDTH !Examining whether the given rank is of the server IF (my_rank.NE.0) THEN CALL MPI_Send(areas(my_rank),1,MPI_DOUBLE_PRECISION,my_server,1,& & MPI_COMM_WORLD, ierr) ELSE CALL MPI_Recv(areas(my_rank),1,MPI_DOUBLE_PRECISION,my_rank,1, & & MPI_COMM_WORLD, ierr) !Summing up results DO i=1,number_of_processes sum=sum+areas(i) END DO WRITE(6,*) sum END IF CALL MPI_Finalize(mpi_error_code) END PROGRAM WORK SUBROUTINE FUNCTION(i,i2) INTEGER::i,i2 i2=i**2 RETURN END SUBROUTINE FUNCTION