| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(MappedVector3D), | intent(inout) | :: | this | |||
| type(Mesh3D), | intent(inout) | :: | mesh |
subroutine SideExchange_MappedVector3D(this,mesh)
implicit none
class(MappedVector3D),intent(inout) :: this
type(Mesh3D),intent(inout) :: mesh
! Local
integer :: offset
offset = mesh%decomp%offsetElem(mesh%decomp%rankId+1)
if(mesh%decomp%mpiEnabled) then
if(.not. mesh%decomp%halo_built) then
call mesh%decomp%BuildHaloExchange(mesh%sideInfo,mesh%nElem,6)
endif
if(mesh%decomp%halo_nsides > 0) then
call this%MPIExchangeAsync(mesh)
endif
endif
! The local (same-rank) side exchange runs on the device while the
! aggregated MPI messages are in flight.
call SideExchange_3D_gpu(this%extboundary_gpu, &
this%boundary_gpu,mesh%sideinfo_gpu,mesh%decomp%elemToRank_gpu, &
mesh%decomp%rankid,offset,this%interp%N,3*this%nvar,this%nelem)
if(mesh%decomp%mpiEnabled) then
if(mesh%decomp%halo_nsides > 0) then
call mesh%decomp%FinalizeMPIExchangeAsync()
! Unpack the received traces into extBoundary, applying side flips
call HaloUnpack_3D_gpu(this%halo_recvbuf_gpu,this%extboundary_gpu, &
mesh%decomp%halo_sides_gpu,this%interp%N,3*this%nvar, &
this%nelem,mesh%decomp%halo_nsides)
endif
endif
endsubroutine SideExchange_MappedVector3D