subroutine RecalculateFlip_Mesh2D_t(this)
implicit none
class(Mesh2D_t),intent(inout) :: this
! Local
integer :: e1
integer :: s1
integer :: e2
integer :: e2Global
integer :: s2
integer :: flip
integer :: bcid
integer :: lnid1(1:2)
integer :: lnid2(1:2)
integer :: nid1(1:2,1:4,1:this%nElem)
integer :: nid2(1:2,1:4,1:this%nElem)
integer :: nloc1(1:2)
integer :: nloc2(1:2)
integer :: n1
integer :: n1Global
integer :: n2
integer :: n2Global
integer :: c1
integer :: c2
integer :: i,j
integer :: l
integer :: nShifts
integer :: neighborRank
integer :: rankId
integer :: offset
integer :: msgCount
integer :: globalSideId
integer,allocatable :: requests(:)
integer,allocatable :: stats(:,:)
integer :: iError
integer :: tag
logical :: theyMatch
allocate(requests(1:this%nSides*2))
allocate(stats(MPI_STATUS_SIZE,1:this%nSides*2))
if(this%decomp%mpiEnabled) then
rankId = this%decomp%rankId
offset = this%decomp%offsetElem(rankId+1)
else
rankId = 0
offset = 0
endif
msgCount = 0
do e1 = 1,this%nElem
do s1 = 1,4
e2Global = this%sideInfo(3,s1,e1)
e2 = e2Global-offset
s2 = this%sideInfo(4,s1,e1)/10
flip = this%sideInfo(4,s1,e1)-s2*10
bcid = this%sideInfo(5,s1,e1)
if(e2Global > 0) then
if(this%decomp%mpiEnabled) then
neighborRank = this%decomp%elemToRank(e2Global)
else
neighborRank = 0
endif
if(neighborRank == rankId) then
lnid1 = this%CGNSSideMap(1:2,s1) ! local CGNS corner node ids for element 1 side
lnid2 = this%CGNSSideMap(1:2,s2) ! local CGNS corner node ids for element 2 side
do l = 1,2
i = this%CGNSCornerMap(1,lnid1(l))
j = this%CGNSCornerMap(2,lnid1(l))
nid1(l,s1,e1) = this%globalNodeIDs(i,j,e1)
i = this%CGNSCornerMap(1,lnid2(l))
j = this%CGNSCornerMap(2,lnid2(l))
nid2(l,s1,e1) = this%globalNodeIDs(i,j,e2)
enddo
else ! In this case, we need to exchange
globalSideId = abs(this%sideInfo(2,s1,e1))
lnid1 = this%CGNSSideMap(1:2,s1) ! local CGNS corner node ids for element 1 side
do l = 1,2
i = this%CGNSCornerMap(1,lnid1(l))
j = this%CGNSCornerMap(2,lnid1(l))
nid1(l,s1,e1) = this%globalNodeIDs(i,j,e1)
tag = l+2*globalSideId
msgCount = msgCount+1
call MPI_IRECV(nid2(l,s1,e1), &
1, &
MPI_INTEGER, &
neighborRank,tag, &
this%decomp%mpiComm, &
requests(msgCount),iError)
! Send nid1(l) from this rank to nid2(l) on the other rank
msgCount = msgCount+1
call MPI_ISEND(nid1(l,s1,e1), &
1, &
MPI_INTEGER, &
neighborRank,tag, &
this%decomp%mpiComm, &
requests(msgCount),iError)
enddo
endif ! MPI or not
endif ! If not physical boundary
enddo
enddo
if(this%decomp%mpiEnabled .and. msgCount > 0) then
call MPI_WaitAll(msgCount, &
requests(1:msgCount), &
stats(1:MPI_STATUS_SIZE,1:msgCount), &
iError)
endif
do e1 = 1,this%nElem
do s1 = 1,4
e2Global = this%sideInfo(3,s1,e1)
s2 = this%sideInfo(4,s1,e1)/10
nloc1(1:2) = nid1(1:2,s1,e1)
nloc2(1:2) = nid2(1:2,s1,e1)
if(e2Global > 0) then
theyMatch = CompareArray(nloc1,nloc2,2)
if(theyMatch) then
this%sideInfo(4,s1,e1) = 10*s2
else
this%sideInfo(4,s1,e1) = 10*s2+1
endif
endif
enddo
enddo
deallocate(requests)
deallocate(stats)
endsubroutine RecalculateFlip_Mesh2D_t