subroutine SideExchange_MappedScalar3D_t(this,mesh)
implicit none
class(MappedScalar3D_t),intent(inout) :: this
type(Mesh3D),intent(inout) :: mesh
! Local
integer :: e1,e2,s1,s2,e2Global
integer :: flip
integer :: i,i2,j,j2,ivar
integer :: r2
integer :: rankId,offset
integer,pointer :: elemtorank(:)
elemtorank => mesh%decomp%elemToRank(:)
rankId = mesh%decomp%rankId
offset = mesh%decomp%offsetElem(rankId+1)
if(mesh%decomp%mpiEnabled) then
call this%MPIExchangeAsync(mesh)
endif
do concurrent(s1=1:6,e1=1:mesh%nElem,ivar=1:this%nvar)
e2Global = mesh%sideInfo(3,s1,e1)
s2 = mesh%sideInfo(4,s1,e1)/10
flip = mesh%sideInfo(4,s1,e1)-s2*10
if(e2Global > 0) then
r2 = elemToRank(e2Global)
if(r2 == rankId) then
e2 = e2Global-offset
if(flip == 0) then
do j = 1,this%interp%N+1
do i = 1,this%interp%N+1
this%extBoundary(i,j,s1,e1,ivar) = this%boundary(i,j,s2,e2,ivar)
enddo
enddo
else if(flip == 1) then
do j = 1,this%interp%N+1
do i = 1,this%interp%N+1
i2 = this%interp%N+2-i
j2 = j
this%extBoundary(i,j,s1,e1,ivar) = this%boundary(i2,j2,s2,e2,ivar)
enddo
enddo
else if(flip == 2) then
do j = 1,this%interp%N+1
do i = 1,this%interp%N+1
i2 = this%interp%N+2-i
j2 = this%interp%N+2-j
this%extBoundary(i,j,s1,e1,ivar) = this%boundary(i2,j2,s2,e2,ivar)
enddo
enddo
else if(flip == 3) then
do j = 1,this%interp%N+1
do i = 1,this%interp%N+1
i2 = i
j2 = this%interp%N+2-j
this%extBoundary(i,j,s1,e1,ivar) = this%boundary(i2,j2,s2,e2,ivar)
enddo
enddo
else if(flip == 4) then
do j = 1,this%interp%N+1
do i = 1,this%interp%N+1
this%extBoundary(i,j,s1,e1,ivar) = this%boundary(j,i,s2,e2,ivar)
enddo
enddo
else if(flip == 5) then
do j = 1,this%interp%N+1
do i = 1,this%interp%N+1
i2 = this%interp%N+2-j
j2 = i
this%extBoundary(i,j,s1,e1,ivar) = this%boundary(i2,j2,s2,e2,ivar)
enddo
enddo
else if(flip == 6) then
do j = 1,this%interp%N+1
do i = 1,this%interp%N+1
i2 = this%interp%N+2-j
j2 = this%interp%N+2-i
this%extBoundary(i,j,s1,e1,ivar) = this%boundary(i2,j2,s2,e2,ivar)
enddo
enddo
else if(flip == 7) then
do j = 1,this%interp%N+1
do i = 1,this%interp%N+1
i2 = j
j2 = this%interp%N+2-i
this%extBoundary(i,j,s1,e1,ivar) = this%boundary(i2,j2,s2,e2,ivar)
enddo
enddo
endif
endif
endif
enddo
if(mesh%decomp%mpiEnabled) then
call mesh%decomp%FinalizeMPIExchangeAsync()
! Apply side flips for data exchanged with MPI
call this%ApplyFlip(mesh)
endif
endsubroutine SideExchange_MappedScalar3D_t