create_win_allocate_dp_2d Subroutine

private subroutine create_win_allocate_dp_2d(comm, dim1, dim2, baseptr, win)

Uses

  • proc~~create_win_allocate_dp_2d~~UsesGraph proc~create_win_allocate_dp_2d create_win_allocate_dp_2d iso_c_binding iso_c_binding proc~create_win_allocate_dp_2d->iso_c_binding

Arguments

Type IntentOptional Attributes Name
type(comm_t), intent(in) :: comm
integer(kind=int32), intent(in) :: dim1
integer(kind=int32), intent(in) :: dim2
real(kind=dp), intent(out), pointer :: baseptr(:,:)
type(win_t), intent(out) :: win

Calls

proc~~create_win_allocate_dp_2d~~CallsGraph proc~create_win_allocate_dp_2d create_win_allocate_dp_2d mpi_win_allocate mpi_win_allocate proc~create_win_allocate_dp_2d->mpi_win_allocate proc~comm_get comm_t%comm_get proc~create_win_allocate_dp_2d->proc~comm_get

Called by

proc~~create_win_allocate_dp_2d~~CalledByGraph proc~create_win_allocate_dp_2d create_win_allocate_dp_2d interface~win_allocate win_allocate interface~win_allocate->proc~create_win_allocate_dp_2d proc~darray_create_dp darray_create_dp proc~darray_create_dp->interface~win_allocate proc~darray_create_i32 darray_create_i32 proc~darray_create_i32->interface~win_allocate proc~darray_create_i64 darray_create_i64 proc~darray_create_i64->interface~win_allocate proc~darray_create_sp darray_create_sp proc~darray_create_sp->interface~win_allocate proc~dlb_init dlb_init proc~dlb_init->interface~win_allocate interface~darray_create darray_create interface~darray_create->proc~darray_create_dp interface~darray_create->proc~darray_create_i32 interface~darray_create->proc~darray_create_i64 interface~darray_create->proc~darray_create_sp

Variables

Type Visibility Attributes Name Initial
type(c_ptr), private :: cptr
integer(kind=int32), private :: disp_unit
integer(kind=int32), private :: ierr
integer(kind=int32), private :: total_size
integer(kind=MPI_ADDRESS_KIND), private :: win_size

Source Code

   subroutine create_win_allocate_dp_2d(comm, dim1, dim2, baseptr, win)
      use iso_c_binding, only: c_ptr, c_f_pointer
      type(comm_t), intent(in) :: comm
      integer(int32), intent(in) :: dim1, dim2
      real(dp), pointer, intent(out) :: baseptr(:, :)
      type(win_t), intent(out) :: win
      type(c_ptr) :: cptr
      integer(MPI_ADDRESS_KIND) :: win_size
      integer(int32) :: disp_unit, ierr, total_size

      total_size = dim1*dim2
      win_size = int(total_size, MPI_ADDRESS_KIND)*int(storage_size(1.0_dp)/8_int32, MPI_ADDRESS_KIND)
      disp_unit = int(storage_size(1.0_dp)/8_int32, int32)

      call MPI_Win_allocate(win_size, disp_unit, MPI_INFO_NULL, &
                            comm%get(), cptr, win%m_win, ierr)
      call c_f_pointer(cptr, baseptr, [dim1, dim2])
      win%is_valid = .true.
   end subroutine create_win_allocate_dp_2d