MPI:Exemplo Trapezoidal

De WikiLICC
Revisão de 15h56min de 7 de julho de 2010 por Dago (Discussão | contribs) (Criou página com '<code> program trapezoidal implicit none include 'mpif.h' integer :: my_rank, p,local_n, source,k integer :: status(MPI_STATUS_SIZE) integer :: ierr real*8 :: …')
(dif) ← Edição anterior | ver versão atual (dif) | Versão posterior → (dif)
Ir para: navegação, pesquisa

program trapezoidal implicit none include 'mpif.h'

integer :: my_rank, p,local_n, source,k integer :: status(MPI_STATUS_SIZE) integer :: ierr real*8  :: h,local_a,local_b,integral,total,Trap

! Wall Time Declarations: real*8  :: inicio,fim, totalwalltime, traperror

real*8  :: a = 0.d0, b = 1.d0 integer :: n = 1048576 integer :: dest= 0 integer :: tag = 0 integer :: repeticoes =1000

call MPI_Init(ierr) call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierr) call MPI_Comm_size(MPI_COMM_WORLD, p, ierr)

if (my_rank == 0) then

 print *,'Processos:     p=',p
 print *,'Repeticoes:    r=',repeticoes
 print *,'Num.Trapezios: n=',n
 print *,'Intervalo: (a,b)=(',a,b,')'

endif

inicio = MPI_WTIME(ierr)

do k=1,repeticoes

h        = (b-a)/n
local_n  = n/p
local_a  = a + my_rank*local_n*h
local_b  = local_a + local_n*h
integral = Trap(local_a, local_b, local_n, h)
if (my_rank == 0) then
  total = integral
  do source = 1, p-1
    call MPI_RECV(integral, 1, MPI_DOUBLE_PRECISION, source, tag, MPI_COMM_WORLD, status, ierr)
    total = total + integral
  enddo
else
  call MPI_SEND(integral, 1, MPI_DOUBLE_PRECISION, dest, tag, MPI_COMM_WORLD, ierr)
endif

enddo

fim = MPI_WTIME(ierr)

if (my_rank == 0) then

 traperror    = total  - 1.0d0
 totalwalltime= fim - inicio
 print *,'Estimativa=:',total
 print *,'Erro      =',traperror
 print *,'Walltime  =',totalwalltime,' s '

endif

call MPI_FINALIZE(ierr) end program !---------------------------------------------------- real*8 function Trap(local_a, local_b, local_n, h) real*8  :: local_a,local_b,h,integral,x,f integer :: local_n,i

integral = (f(local_a) + f(local_b))/2.0 x = local_a do i = 1, local_n-1

  x = x + h
  integral = integral + f(x)

enddo Trap = integral*h end function

!---------------------------------------------------- real*8 function f(x) real*8  :: x

f = 5*x*x*x*x end function