main.f
program main
implicit none
include 'mpif.h'
integer me, np, ierror
call MPI_init( ierror )
call MPI_comm_rank( mpi_comm_world, me, ierror )
call MPI_comm_size( mpi_comm_world, np, ierror )
call sendrecv(me, np)
call mpi_finalize( ierror )
stop
end
sendrecv.f
subroutine sendrecv(me, np)
include 'mpif.h'
integer np, me, sender, tag
integer, dimension(mpi_status_size) :: status
integer, dimension(1) :: recv, send
if (me.eq.0) then
do sender = 1, np-1
call mpi_recv(recv, 1, mpi_integer, sender, tag,
& mpi_comm_world, status, ierror)
end do
end if
if ((me.ge.1).and.(me.lt.np)) then
send(1) = me*12
call mpi_send(send, 1, mpi_integer, 0, tag,
& mpi_comm_world, ierror)
end if
return
endOn Feb 28, 2013, at 9:59 AM, Pradeep Jha <pradeep@ccs.engg.nagoya-u.ac.jp> wrote:Yes.
> Is it possible to call the MPI_send and MPI_recv commands inside a subroutine and not the main program?
You seem to have several errors in the sendrecv subroutine. I would strongly encourage you to use "implicit none" to avoid many of these errors. Here's a few errors I see offhand:
> I have written a minimal program for what I am trying to do. It is compiling fine but it is not working. The program just hangs in the "sendrecv" subroutine. Any ideas how can I do it?
- tag is not initialized
- what's send_length(1)?
- use MPI_INTEGER, not MPI_INT (MPI_INT = C int, MPI_INTEGER = Fortran INTEGER)
> _______________________________________________
> main.f
>
>
> program main
>
> include 'mpif.h'
>
> integer me, np, ierror
>
> call MPI_init( ierror )
> call MPI_comm_rank( mpi_comm_world, me, ierror )
> call MPI_comm_size( mpi_comm_world, np, ierror )
>
> call sendrecv(me, np)
>
> call mpi_finalize( ierror )
>
> stop
> end
>
> sendrecv.f
>
>
> subroutine sendrecv(me, np)
>
> include 'mpif.h'
>
> integer np, me, sender
> integer, dimension(mpi_status_size) :: status
>
> integer, dimension(1) :: recv, send
>
> if (me.eq.0) then
>
> do sender = 1, np-1
> call mpi_recv(recv, 1, mpi_int, sender, tag,
> & mpi_comm_world, status, ierror)
>
> end do
> end if
>
> if ((me.ge.1).and.(
> me.lt.np
> )) then
> send_length(1) = me*12
>
> call mpi_send(send, 1, mpi_int, 0, tag,
> & mpi_comm_world, ierror)
> end if
>
> return
> end
>
> users mailing list
> users@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users
--
Jeff Squyres
jsquyres@cisco.com
For corporate legal information go to: http://www.cisco.com/web/about/doing_business/legal/cri/
_______________________________________________
users mailing list
users@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users