subroutine MPIExchangeAsync_MappedScalar3D(this,mesh)
implicit none
class(MappedScalar3D),intent(inout) :: this
type(Mesh3D),intent(inout) :: mesh
! Local
integer :: e1,s1,e2,s2,ivar
integer :: globalSideId,r2,tag
integer :: iError
integer :: msgCount
real(prec),pointer :: boundary(:,:,:,:,:)
real(prec),pointer :: extboundary(:,:,:,:,:)
msgCount = 0
call c_f_pointer(this%boundary_gpu,boundary,[this%interp%N+1,this%interp%N+1,6,this%nelem,this%nvar])
call c_f_pointer(this%extboundary_gpu,extboundary,[this%interp%N+1,this%interp%N+1,6,this%nelem,this%nvar])
do ivar = 1,this%nvar
do e1 = 1,this%nElem
do s1 = 1,6
e2 = mesh%sideInfo(3,s1,e1) ! Neighbor Element
if(e2 > 0) then
r2 = mesh%decomp%elemToRank(e2) ! Neighbor Rank
if(r2 /= mesh%decomp%rankId) then
s2 = mesh%sideInfo(4,s1,e1)/10
globalSideId = abs(mesh%sideInfo(2,s1,e1))
! create unique tag for each side and each variable
tag = globalsideid+mesh%nUniqueSides*(ivar-1)
msgCount = msgCount+1
call MPI_IRECV(extBoundary(:,:,s1,e1,ivar), &
(this%interp%N+1)*(this%interp%N+1), &
mesh%decomp%mpiPrec, &
r2,tag, &
mesh%decomp%mpiComm, &
mesh%decomp%requests(msgCount),iError)
msgCount = msgCount+1
call MPI_ISEND(boundary(:,:,s1,e1,ivar), &
(this%interp%N+1)*(this%interp%N+1), &
mesh%decomp%mpiPrec, &
r2,tag, &
mesh%decomp%mpiComm, &
mesh%decomp%requests(msgCount),iError)
endif
endif
enddo
enddo
enddo
mesh%decomp%msgCount = msgCount
endsubroutine MPIExchangeAsync_MappedScalar3D