I'm trying to parallelize a Fortran code with rather complicated derived
types full of pointer arrays.  When I build the MPI type for sending, all
the static components are sent, but the pointer arrays are not (and retain
initial values).  I imagine this has to do with memory addresses when
creating the MPI struct, but I have no idea how to fix it.

I've included a simple code illustrating my issue below.  Any suggestions?

Thanks,
Jeremy

program mpi_struct_example
      use mpi
      implicit none
      ! declarations
      type :: small
          real, pointer :: array(:)
      end type small
      type(small) :: lala
      integer :: stat, counts(1), types(1), ierr, iam, n=0, MPI_SMALL
      integer (kind=MPI_ADDRESS_KIND) :: displs(1)
      ! initialize MPI and get my rank
      call MPI_INIT( ierr )
      call MPI_COMM_RANK( MPI_COMM_WORLD, iam, ierr )
      n = 20
      allocate( lala%array(n) )
      lala%array = 2.0
      ! build block counts, displacements, and oldtypes
      counts     = (/n/)
      displs     = (/0/)
      types      = (/MPI_REAL/)
      ! make and commit new type
      call MPI_TYPE_CREATE_STRUCT( 1, counts, displs, types, MPI_SMALL, ierr
)
      call MPI_TYPE_COMMIT( MPI_SMALL, ierr )
      if (iam .eq. 0) then
            ! reset the value of the array
            lala%array  = 1.0
            call MPI_SEND( lala, 1, MPI_SMALL, 1, 1, MPI_COMM_WORLD,
ierr)       ! this doesn't work
            !call MPI_SEND( lala%array, n, MPI_REAL, 1, 1, MPI_COMM_WORLD,
ierr) ! this does work
            write (*,*) "iam ",iam," and lala%array(1)  = ", lala%array(1)
      else
            call MPI_RECV( lala, 1, MPI_SMALL, 0, 1, MPI_COMM_WORLD, stat,
ierr )       ! this doesn't work
            !call MPI_RECV( lala%array, n, MPI_REAL, 0, 1, MPI_COMM_WORLD,
stat, ierr ) ! this does work
            write (*,*) "iam ",iam," and lala%array(1)  = ", lala%array(1),
" ( should be 1.0)"
      end if
      call MPI_FINALIZE(ierr)
end program mpi_struct_example

Reply via email to