21 integer(kind=intType),
intent(in) :: level, sps, nFringe
22 type(
fringetype),
intent(inout),
dimension(nFringe) :: fringeList
23 logical,
intent(in) :: useWall
26 integer(kind=intType),
dimension(:),
allocatable :: fringeProc, cumFringeProc
27 integer(kind=intType),
dimension(:),
allocatable :: tmpInt
28 integer(kind=intType),
dimension(:),
allocatable :: recvSizes
29 integer(kind=intType),
dimension(:),
allocatable :: intSendBuf, intRecvBuf
30 integer(kind=intType) :: i, j, k, ii, jj, kk, iii, jjj, kkk, nn, index
31 integer(kind=intType) :: il, jl, kl, dIndex
32 integer(kind=intType) :: iStart, iEnd, iProc, iSize, nFringeProc
33 integer(kind=intType) :: sendCount, recvCount, ierr, totalRecvSize
34 integer mpiStatus(MPI_STATUS_SIZE)
50 allocate (fringeproc(
nproc), cumfringeproc(1:
nproc + 1))
52 fringeproc, cumfringeproc, nfringeproc)
60 allocate (tmpint(0:
nproc - 1), recvsizes(0:
nproc - 1))
64 if (iproc /=
myid)
then
65 tmpint(iproc) = (cumfringeproc(j + 1) - cumfringeproc(j)) * 2
70 call mpi_alltoall(tmpint, 1, adflow_integer, recvsizes, 1, adflow_integer, &
72 call echk(ierr, __file__, __line__)
78 totalrecvsize = sum(recvsizes)
79 allocate (intsendbuf(2 * nfringe), intrecvbuf(totalrecvsize))
83 intsendbuf(2 * j - 1) = fringelist(j)%donorBlock
84 intsendbuf(2 * j) = fringelist(j)%dIndex
92 istart = (cumfringeproc(j) - 1) * 2 + 1
93 isize = (cumfringeproc(j + 1) - cumfringeproc(j)) * 2
95 if (iproc /=
myid)
then
96 sendcount = sendcount + 1
97 call mpi_isend(intsendbuf(istart), isize, adflow_integer, iproc,
myid, &
99 call echk(ierr, __file__, __line__)
106 do iproc = 0,
nproc - 1
108 if (recvsizes(iproc) > 0)
then
109 recvcount = recvcount + 1
110 call mpi_irecv(intrecvbuf(ii), recvsizes(iproc), adflow_integer, &
112 call echk(ierr, __file__, __line__)
114 ii = ii + recvsizes(iproc)
119 do j = 1, nfringeproc
121 iproc = fringeproc(j)
122 istart = cumfringeproc(j)
123 iend = cumfringeproc(j + 1) - 1
125 if (iproc ==
myid)
then
127 nn = fringelist(i)%donorBlock
131 dindex = fringelist(i)%dIndex
132 call unwindindex(dindex, il, jl, kl, iii, jjj, kkk)
143 flowdoms(nn, level, sps)%status(iii + ii, jjj + jj, kkk + kk), .true.)
155 call mpi_waitany(recvcount,
recvrequests, index, mpistatus, ierr)
156 call echk(ierr, __file__, __line__)
160 call mpi_waitany(sendcount,
sendrequests, index, mpistatus, ierr)
161 call echk(ierr, __file__, __line__)
165 do j = 1, totalrecvsize / 2
167 nn = intrecvbuf(2 * j - 1)
172 dindex = intrecvbuf(2 * j)
173 call unwindindex(dindex, il, jl, kl, iii, jjj, kkk)
181 call setisdonor(
flowdoms(nn, level, sps)%status(iii + ii, jjj + jj, kkk + kk), .true.)
188 deallocate (intsendbuf, intrecvbuf, fringeproc, cumfringeproc, tmpint, recvsizes)
subroutine determinedonors(level, sps, fringeList, nFringe, useWall)
type(blocktype), dimension(:, :, :), allocatable, target flowdoms
integer, dimension(:), allocatable recvrequests
integer, dimension(:), allocatable sendrequests
integer adflow_comm_world
integer(kind=inttype), parameter sortbydonor
integer(kind=inttype) nclusters
integer(kind=inttype) ndomtotal
integer(kind=inttype), dimension(:), allocatable clusters
subroutine setisdonor(i, flag)
subroutine unwindindex(index, il, jl, kl, i, j, k)
subroutine qsortfringetype(arr, nn, sortType)
subroutine computefringeprocarray(fringes, n, fringeProc, cumFringeProc, nFringeProc)
subroutine setiswalldonor(i, flag)
subroutine echk(errorcode, file, line)
subroutine setpointers(nn, mm, ll)