pack_and_send_float Subroutine

private subroutine pack_and_send_float(vm, bufsize, recvPets, rootPet, buffer, outbuffer, dims)

Arguments

Type IntentOptional Attributes Name
type(ESMF_VM) :: vm
integer :: bufsize(:)
integer :: recvPets
integer :: rootPet
real(kind=ESMF_KIND_R8) :: buffer(:)
real(kind=ESMF_KIND_R8) :: outbuffer(:,:)
integer :: dims(:)

Calls

proc~~pack_and_send_float~~CallsGraph proc~pack_and_send_float pack_and_send_float interface~esmf_vmsend ESMF_VMSend proc~pack_and_send_float->interface~esmf_vmsend proc~esmf_vmsendchar ESMF_VMSendChar interface~esmf_vmsend->proc~esmf_vmsendchar proc~esmf_vmsendchararray ESMF_VMSendCharArray interface~esmf_vmsend->proc~esmf_vmsendchararray proc~esmf_vmsendi4 ESMF_VMSendI4 interface~esmf_vmsend->proc~esmf_vmsendi4 proc~esmf_vmsendi8 ESMF_VMSendI8 interface~esmf_vmsend->proc~esmf_vmsendi8 proc~esmf_vmsendlogical ESMF_VMSendLogical interface~esmf_vmsend->proc~esmf_vmsendlogical proc~esmf_vmsendr4 ESMF_VMSendR4 interface~esmf_vmsend->proc~esmf_vmsendr4 proc~esmf_vmsendr8 ESMF_VMSendR8 interface~esmf_vmsend->proc~esmf_vmsendr8 interface~c_esmc_vmsend c_ESMC_VMSend proc~esmf_vmsendchar->interface~c_esmc_vmsend interface~c_esmc_vmsendnb c_ESMC_VMSendNB proc~esmf_vmsendchar->interface~c_esmc_vmsendnb proc~esmf_imerr ESMF_IMErr proc~esmf_vmsendchar->proc~esmf_imerr proc~esmf_logfounderror ESMF_LogFoundError proc~esmf_vmsendchar->proc~esmf_logfounderror proc~esmf_vmgetinit ESMF_VMGetInit proc~esmf_vmsendchar->proc~esmf_vmgetinit proc~esmf_vmsendchararray->interface~c_esmc_vmsend proc~esmf_vmsendchararray->interface~c_esmc_vmsendnb proc~esmf_vmsendchararray->proc~esmf_imerr proc~esmf_vmsendchararray->proc~esmf_logfounderror proc~esmf_vmsendchararray->proc~esmf_vmgetinit proc~esmf_vmsendi4->interface~c_esmc_vmsend proc~esmf_vmsendi4->interface~c_esmc_vmsendnb proc~esmf_vmsendi4->proc~esmf_imerr proc~esmf_vmsendi4->proc~esmf_logfounderror proc~esmf_vmsendi4->proc~esmf_vmgetinit proc~esmf_vmsendi8->interface~c_esmc_vmsend proc~esmf_vmsendi8->interface~c_esmc_vmsendnb proc~esmf_vmsendi8->proc~esmf_imerr proc~esmf_vmsendi8->proc~esmf_logfounderror proc~esmf_vmsendi8->proc~esmf_vmgetinit proc~esmf_vmsendlogical->interface~c_esmc_vmsend proc~esmf_vmsendlogical->interface~c_esmc_vmsendnb proc~esmf_vmsendlogical->proc~esmf_imerr proc~esmf_vmsendlogical->proc~esmf_logfounderror proc~esmf_vmsendlogical->proc~esmf_vmgetinit proc~esmf_vmsendr4->interface~c_esmc_vmsend proc~esmf_vmsendr4->interface~c_esmc_vmsendnb proc~esmf_vmsendr4->proc~esmf_imerr proc~esmf_vmsendr4->proc~esmf_logfounderror proc~esmf_vmsendr4->proc~esmf_vmgetinit proc~esmf_vmsendr8->interface~c_esmc_vmsend proc~esmf_vmsendr8->interface~c_esmc_vmsendnb proc~esmf_vmsendr8->proc~esmf_imerr proc~esmf_vmsendr8->proc~esmf_logfounderror proc~esmf_vmsendr8->proc~esmf_vmgetinit proc~esmf_imerr->proc~esmf_logfounderror proc~esmf_initcheckdeep ESMF_InitCheckDeep proc~esmf_imerr->proc~esmf_initcheckdeep esmf_breakpoint esmf_breakpoint proc~esmf_logfounderror->esmf_breakpoint proc~esmf_logrc2msg ESMF_LogRc2Msg proc~esmf_logfounderror->proc~esmf_logrc2msg proc~esmf_logwrite ESMF_LogWrite proc~esmf_logfounderror->proc~esmf_logwrite

Source Code

subroutine pack_and_send_float(vm, bufsize, recvPets, rootPet, buffer, &
                               outbuffer, dims)

  type(ESMF_VM) :: vm
  integer :: bufsize(:)
  integer :: recvPets
  integer :: rootPet
  real(ESMF_KIND_R8) :: buffer(:)
  real(ESMF_KIND_R8) :: outbuffer(:,:)
  integer :: dims(:)

  integer :: xdim, start
  integer :: lbnd(2), ubnd(2)
  integer :: i,j,k,ii
  real(ESMF_KIND_R8), pointer :: sendbuf(:)
  integer :: localrc

  ! fill my own pointer first
  lbnd = lbound(outbuffer)
  ubnd = ubound(outbuffer)
  xdim = ubnd(1)-lbnd(1)+1
  bufsize(2)=ubnd(2)-lbnd(2)+1
  do i=1,bufsize(2)
    outbuffer(:, lbnd(2)+i-1) = buffer((i-1)*bufsize(1)+1 : (i-1)*bufsize(1)+xdim)
  enddo
  if (recvPets > 1) then
     allocate(sendbuf(dims(1)*bufsize(2)))
     start=xdim
     do k = 1, recvPets-1
       if (k>1) then
        if (dims(k) /= dims(k-1)) then
          deallocate(sendbuf)
          allocate(sendbuf(dims(k)*bufsize(2)))
        endif
       endif
       ii = 1
       do j = 1, bufsize(2)
         do i = start+1, start+dims(k)
            sendbuf(ii) = buffer((j-1)*bufsize(1)+i)
            ii=ii+1
         enddo
       enddo
       call ESMF_VMSend(vm, sendbuf, dims(k)*bufsize(2), rootPet+k, rc=localrc)
       start = start+dims(k)
     enddo
     deallocate(sendbuf)
  endif
end subroutine pack_and_send_float