16 integer(kind=intType),
intent(out) :: sendList(:, :), recvList(:, :)
17 integer(kind=intType),
intent(out) :: nSend, nRecv
20 integer(kind=intType) :: nn, iDom, nnRow, i, jj, ii, nUniqueProc, iProc
21 integer(kind=intType),
dimension(:),
allocatable :: procsForThisRow, inverse, blkProc
48 do iproc = 0,
nproc - 1
58 nnrow = omat%rowPtr(idom + 1) - omat%rowPtr(idom)
59 procsforthisrow(1:nnrow) = omat%assignedProc(omat%rowPtr(idom):omat%rowPtr(idom + 1) - 1)
60 call unique(procsforthisrow, nnrow, nuniqueproc, inverse)
62 do jj = 1, nuniqueproc
63 if (procsforthisrow(jj) /=
myid)
then
66 sendlist(1, nsend) = procsforthisrow(jj)
67 sendlist(2, nsend) = idom
75 do idom = 1, omat%nRow
77 rowloop:
do jj = omat%rowPtr(idom), omat%rowPtr(idom + 1) - 1
80 if (omat%assignedProc(jj) ==
myid)
then
87 recvlist(1, nrecv) = blkproc(idom)
88 recvlist(2, nrecv) = idom
100 deallocate (procsforthisrow, inverse, blkproc)
104 recvList, nRecv, rBufSize)
115 type(
csrmatrix),
intent(in) :: oMat, oMatT
116 integer(kind=intType),
intent(out) :: sendList(:, :), recvList(:, :)
117 integer(kind=intType),
intent(out) :: nSend, nRecv
118 integer(kind=intType),
intent(in) :: rBufSize(nDomTotal)
121 integer(kind=intType) :: nn, iDom, jDom, nnRow, nnRowT, i, jj, ii, nUniqueProc, iProc
122 integer(kind=intType),
dimension(:),
allocatable :: blkProc, toRecv
123 integer(kind=intType),
dimension(:),
allocatable :: procsForThisRow, inverse
128 allocate (procsforthisrow(2 * ndomtotal), inverse(2 * ndomtotal), blkproc(ndomtotal))
131 do iproc = 0,
nproc - 1
147 if (rbufsize(idom) > 0)
then
149 nnrow = omat%rowPtr(idom + 1) - omat%rowPtr(idom)
150 procsforthisrow(1:nnrow) = omat%assignedProc(omat%rowPtr(idom):omat%rowPtr(idom + 1) - 1)
152 nnrowt = omatt%rowPtr(idom + 1) - omatt%rowPtr(idom)
153 procsforthisrow(nnrow + 1:nnrow + nnrowt) = &
154 omatt%assignedProc(omatt%rowPtr(idom):omatt%rowPtr(idom + 1) - 1)
156 call unique(procsforthisrow, nnrow + nnrowt, nuniqueproc, inverse)
158 do jj = 1, nuniqueproc
159 if (procsforthisrow(jj) /=
myid)
then
162 sendlist(1, nsend) = procsforthisrow(jj)
163 sendlist(2, nsend) = idom
171 allocate (torecv(ndomtotal))
173 do idom = 1, ndomtotal
174 do jj = omat%rowPtr(idom), omat%rowPtr(idom + 1) - 1
175 jdom = omat%colInd(jj)
176 if (omat%assignedProc(jj) ==
myid)
then
191 do idom = 1, ndomtotal
192 if (torecv(idom) == 1 .and. rbufsize(idom) > 0)
then
194 recvlist(1, nrecv) = blkproc(idom)
195 recvlist(2, nrecv) = idom
199 deallocate (procsforthisrow, inverse, blkproc, torecv)
202 subroutine sendoblock(oBlock, iDom, iProc, tagOffset, sendCount)
212 integer(kind=intType),
intent(in) :: iProc, iDom, tagOffset
213 integer(kind=intType),
intent(inout) :: sendCount
216 integer(kind=intType) :: tag, ierr
218 tag = tagoffset + idom
219 sendcount = sendcount + 1
220 call mpi_isend(oblock%rBuffer,
size(oblock%rbuffer), adflow_real, &
222 call echk(ierr, __file__, __line__)
224 sendcount = sendcount + 1
225 call mpi_isend(oblock%iBuffer,
size(oblock%iBuffer), adflow_integer, &
227 call echk(ierr, __file__, __line__)
231 subroutine sendofringe(oFringe, iDom, iProc, tagOffset, sendCount)
241 integer(kind=intType),
intent(in) :: iProc, iDom, tagOffset
242 integer(kind=intType),
intent(inout) :: sendCount
245 integer(kind=intType) :: tag, ierr
247 tag = idom + tagoffset
248 sendcount = sendcount + 1
249 call mpi_isend(ofringe%rBuffer,
size(ofringe%rbuffer), adflow_real, &
251 call echk(ierr, __file__, __line__)
253 sendcount = sendcount + 1
254 call mpi_isend(ofringe%iBuffer,
size(ofringe%iBuffer), adflow_integer, &
256 call echk(ierr, __file__, __line__)
260 subroutine sendosurf(oWall, iDom, iProc, tagOffset, sendCount)
270 integer(kind=intType),
intent(in) :: iProc, iDom, tagOffset
271 integer(kind=intType),
intent(inout) :: sendCount
274 integer(kind=intType) :: tag, ierr
276 tag = idom + tagoffset
277 sendcount = sendcount + 1
278 call mpi_isend(owall%rBuffer,
size(owall%rbuffer), adflow_real, &
280 call echk(ierr, __file__, __line__)
282 sendcount = sendcount + 1
283 call mpi_isend(owall%iBuffer,
size(owall%iBuffer), adflow_integer, &
285 call echk(ierr, __file__, __line__)
289 subroutine recvoblock(oBlock, iDom, iProc, tagOffset, iSize, rSize, &
300 integer(kind=intType),
intent(in) :: iDom, iProc, tagOffset, rSize, iSize
301 integer(kind=intType),
intent(inout) :: recvCount
302 integer(kind=intType),
intent(inout) :: recvInfo(2, recvCount + 2)
305 integer(kind=intType) :: tag, ierr
307 tag = tagoffset + idom
308 allocate (oblock%rBuffer(rsize), oblock%iBuffer(isize))
310 recvcount = recvcount + 1
311 call mpi_irecv(oblock%rBuffer, rsize, adflow_real, &
313 call echk(ierr, __file__, __line__)
314 recvinfo(:, recvcount) = (/idom, 1/)
316 recvcount = recvcount + 1
317 call mpi_irecv(oblock%iBuffer, isize, adflow_integer, &
319 call echk(ierr, __file__, __line__)
320 recvinfo(:, recvcount) = (/idom, 2/)
324 subroutine recvofringe(oFringe, iDom, iProc, tagOffset, iSize, rSize, &
335 integer(kind=intType),
intent(in) :: iDom, iProc, tagOffset, rSize, iSize
336 integer(kind=intType),
intent(inout) :: recvCount
337 integer(kind=intType),
intent(inout) :: recvInfo(2, recvCount + 2)
340 integer(kind=intType) :: tag, ierr
342 tag = tagoffset + idom
343 allocate (ofringe%rBuffer(rsize), ofringe%iBuffer(isize))
345 recvcount = recvcount + 1
346 call mpi_irecv(ofringe%rBuffer, rsize, adflow_real, &
348 call echk(ierr, __file__, __line__)
349 recvinfo(:, recvcount) = (/idom, 3/)
351 recvcount = recvcount + 1
352 call mpi_irecv(ofringe%iBuffer, isize, adflow_integer, &
354 call echk(ierr, __file__, __line__)
355 recvinfo(:, recvcount) = (/idom, 4/)
359 subroutine recvosurf(oWall, iDom, iProc, tagOffset, iSize, rSize, &
370 integer(kind=intType),
intent(in) :: iDom, iProc, tagOffset, rSize, iSize
371 integer(kind=intType),
intent(inout) :: recvCount
372 integer(kind=intType),
intent(inout) :: recvInfo(2, recvCount + 2)
375 integer(kind=intType) :: tag, ierr
377 tag = tagoffset + idom
378 allocate (owall%rBuffer(rsize), owall%iBuffer(isize))
380 recvcount = recvcount + 1
381 call mpi_irecv(owall%rBuffer, rsize, adflow_real, &
383 call echk(ierr, __file__, __line__)
384 recvinfo(:, recvcount) = (/idom, 5/)
386 recvcount = recvcount + 1
388 call mpi_irecv(owall%iBuffer, isize, adflow_integer, &
390 call echk(ierr, __file__, __line__)
391 recvinfo(:, recvcount) = (/idom, 6/)
396 nOFringeSend, nOfringeRecv, oFringes, &
397 fringeRecvSizes, cumFringeRecv)
411 integer(kind=intType),
dimension(:, :) :: oFringeSendList, oFringeRecvList
412 integer(kind=intType),
dimension(:),
allocatable :: cumFringeRecv, fringeRecvSizes
413 integer(kind=intType) :: nOFringeSend, nOfringeRecv
415 integer(kind=intType) :: sendCount, recvCount
416 integer(kind=intType) :: iDom, iProc, jj, ierr, index, i
417 integer mpiStatus(MPI_STATUS_SIZE)
421 do jj = 1, nofringerecv
423 iproc = ofringerecvlist(1, jj)
424 idom = ofringerecvlist(2, jj)
425 sendcount = sendcount + 1
426 call mpi_isend(ofringes(idom)%fringeReturnSize, 1, adflow_integer, &
428 call echk(ierr, __file__, __line__)
431 allocate (fringerecvsizes(nofringesend))
435 do jj = 1, nofringesend
437 iproc = ofringesendlist(1, jj)
438 idom = ofringesendlist(2, jj)
439 recvcount = recvcount + 1
441 call mpi_irecv(fringerecvsizes(jj), 1, adflow_integer, &
443 call echk(ierr, __file__, __line__)
448 call mpi_waitany(sendcount,
sendrequests, index, mpistatus, ierr)
449 call echk(ierr, __file__, __line__)
453 call mpi_waitany(recvcount,
recvrequests, index, mpistatus, ierr)
454 call echk(ierr, __file__, __line__)
459 allocate (cumfringerecv(1:nofringesend + 1))
461 do jj = 1, nofringesend
464 cumfringerecv(jj + 1) = cumfringerecv(jj) + fringerecvsizes(jj)
483 type(
csrmatrix),
intent(inout) :: overlap
486 integer(kind=intType) :: curRow, jj, jj1, iProc, iRow
487 real(kind=realtype) :: evencost, potentialsum, targetcost
488 real(Kind=realtype) :: totalsearch, totalbuild
490 real(kind=realtype),
dimension(0:nProc - 1) :: proccosts
491 real(kind=realtype),
dimension(0:nProc) :: cumproccosts
492 real(kind=realtype),
dimension(overlap%nRow) :: buildcost
493 real(kind=realtype),
parameter :: tol = 0.1_realtype
495 logical,
dimension(overlap%nnz) :: blockTaken
499 integer(kind=intType),
pointer,
dimension(:) :: rowPtr, assignedProc
500 real(kind=realtype),
pointer,
dimension(:) ::
data
503 rowptr => overlap%rowPtr
504 assignedproc => overlap%assignedProc
508 totalsearch = sum(overlap%data)
511 evencost = totalsearch /
nproc
520 cumproccosts(0) =
zero
528 do while (rowptr(currow + 1) - rowptr(currow) == 0)
532 masterloop:
do while (currow <= overlap%nRow .and. iproc <=
nproc)
538 targetcost = evencost * (iproc + 1)
542 if (
data(jj) /=
zero .and. .not. (blocktaken(jj)))
then
544 if (proccosts(iproc) == 0 .or. iproc ==
nproc - 1)
then
546 proccosts(iproc) = proccosts(iproc) +
data(jj)
547 blocktaken(jj) = .true.
548 assignedproc(jj) = iproc
554 potentialsum = cumproccosts(iproc) + proccosts(iproc) +
data(jj)
556 if (potentialsum < targetcost - tol * evencost)
then
558 proccosts(iproc) = proccosts(iproc) +
data(jj)
559 blocktaken(jj) = .true.
560 assignedproc(jj) = iproc
562 else if (potentialsum >= targetcost - tol * evencost .and. &
563 potentialsum <= targetcost + tol * evencost)
then
568 proccosts(iproc) = proccosts(iproc) +
data(jj)
569 blocktaken(jj) = .true.
570 assignedproc(jj) = iproc
573 cumproccosts(iproc + 1) = cumproccosts(iproc) + proccosts(iproc)
586 restofrow:
do jj1 = jj + 1, rowptr(currow + 1) - 1
588 potentialsum = cumproccosts(iproc) + proccosts(iproc) +
data(jj1)
590 if (
data(jj1) /=
zero .and. .not. (blocktaken(jj1)))
then
592 if (potentialsum < targetcost - tol * evencost)
then
596 proccosts(iproc) = proccosts(iproc) +
data(jj1)
597 blocktaken(jj1) = .true.
598 assignedproc(jj1) = iproc
600 else if (potentialsum >= targetcost - tol * evencost .and. &
601 potentialsum <= targetcost + tol * evencost)
then
604 proccosts(iproc) = proccosts(iproc) +
data(jj1)
605 blocktaken(jj1) = .true.
606 assignedproc(jj1) = iproc
621 cumproccosts(iproc + 1) = cumproccosts(iproc) + proccosts(iproc)
632 if (jj == rowptr(currow + 1))
then
640 findnextnonzerorow:
do while (jj == rowptr(currow + 1))
642 if (currow > overlap%nRow)
then
643 exit findnextnonzerorow
645 end do findnextnonzerorow
670 integer(kind=intType),
intent(in) :: level, sps
672 type(
commtype),
dimension(*),
intent(in) :: commPattern
677 integer :: size, procId, ierr, index
678 integer,
dimension(mpi_status_size) :: mpiStatus
680 integer(kind=intType) :: i, j, ii, jj, nVar, iFringe, jFringe
681 integer(kind=intType) :: d1, i1, j1, k1, d2, i2, j2, k2
682 integer(kind=intType) :: il, jl, kl, myIndex
684 integer(kind=intType),
dimension(:),
allocatable :: sendBufInt
685 integer(kind=intType),
dimension(:),
allocatable :: recvBufInt
689 ii = commpattern(level)%nProcSend
690 ii = commpattern(level)%nsendCum(ii)
691 jj = commpattern(level)%nProcRecv
692 jj = commpattern(level)%nrecvCum(jj)
694 allocate (sendbufint(ii * nvar), recvbufint(jj * nvar), stat=ierr)
700 intsends:
do i = 1, commpattern(level)%nProcSend
705 procid = commpattern(level)%sendProc(i)
706 size = nvar * commpattern(level)%nsend(i)
711 do j = 1, commpattern(level)%nsend(i)
716 d1 = commpattern(level)%sendList(i)%block(j)
717 i1 = commpattern(level)%sendList(i)%indices(j, 1)
718 j1 = commpattern(level)%sendList(i)%indices(j, 2)
719 k1 = commpattern(level)%sendList(i)%indices(j, 3)
722 ifringe = flowdoms(d1, level, sps)%fringePtr(1, i1, j1, k1)
723 if (ifringe > 0)
then
724 sendbufint(jj) = flowdoms(d1, level, sps)%fringes(ifringe)%donorProc
725 sendbufint(jj + 1) = flowdoms(d1, level, sps)%fringes(ifringe)%donorBlock
726 sendbufint(jj + 2) = flowdoms(d1, level, sps)%fringes(ifringe)%dIndex
729 sendbufint(jj + 1) = 0
730 sendbufint(jj + 2) = 0
739 call mpi_isend(sendbufint(ii),
size, adflow_integer, procid, &
752 intreceives:
do i = 1, commpattern(level)%nProcRecv
757 procid = commpattern(level)%recvProc(i)
758 size = nvar * commpattern(level)%nrecv(i)
762 call mpi_irecv(recvbufint(ii),
size, adflow_integer, procid, &
773 intlocalcopy:
do i = 1, internal(level)%ncopy
777 d1 = internal(level)%donorBlock(i)
778 i1 = internal(level)%donorIndices(i, 1)
779 j1 = internal(level)%donorIndices(i, 2)
780 k1 = internal(level)%donorIndices(i, 3)
784 d2 = internal(level)%haloBlock(i)
785 i2 = internal(level)%haloIndices(i, 1)
786 j2 = internal(level)%haloIndices(i, 2)
787 k2 = internal(level)%haloIndices(i, 3)
789 ifringe = flowdoms(d1, level, sps)%fringePtr(1, i1, j1, k1)
790 if (ifringe > 0)
then
794 jfringe = flowdoms(d2, level, sps)%fringePtr(1, i2, j2, k2)
799 il = flowdoms(d2, level, sps)%il
800 jl = flowdoms(d2, level, sps)%jl
801 kl = flowdoms(d2, level, sps)%kl
802 fringe%myIndex =
windindex(i2, j2, k2, il, jl, kl)
804 fringe%donorProc = flowdoms(d1, level, sps)%fringes(ifringe)%donorProc
805 fringe%donorBlock = flowdoms(d1, level, sps)%fringes(ifringe)%donorBlock
806 fringe%dIndex = flowdoms(d1, level, sps)%fringes(ifringe)%dIndex
807 fringe%donorFrac = flowdoms(d1, level, sps)%fringes(ifringe)%donorFrac
809 if (jfringe > 0)
then
812 flowdoms(d2, level, sps)%fringes(jfringe) = fringe
820 flowdoms(d2, level, sps)%nDonors, fringe)
824 flowdoms(d2, level, sps)%fringePtr(:, i2, j2, k2) = &
825 flowdoms(d2, level, sps)%nDonors
831 flowdoms(d2, level, sps)%fringePtr(1, i2, j2, k2) = 0
839 size = commpattern(level)%nProcRecv
840 intcompleterecvs:
do i = 1, commpattern(level)%nProcRecv
844 call mpi_waitany(
size,
recvrequests, index, mpistatus, ierr)
849 jj = nvar * commpattern(level)%nrecvCum(ii - 1)
850 do j = 1, commpattern(level)%nrecv(ii)
854 d2 = commpattern(level)%recvList(ii)%block(j)
855 i2 = commpattern(level)%recvList(ii)%indices(j, 1)
856 j2 = commpattern(level)%recvList(ii)%indices(j, 2)
857 k2 = commpattern(level)%recvList(ii)%indices(j, 3)
861 il = flowdoms(d2, level, sps)%il
862 jl = flowdoms(d2, level, sps)%jl
863 kl = flowdoms(d2, level, sps)%kl
864 fringe%myIndex =
windindex(i2, j2, k2, il, jl, kl)
866 fringe%donorProc = recvbufint(jj + 1)
867 fringe%donorBlock = recvbufint(jj + 2)
868 fringe%dIndex = recvbufint(jj + 3)
870 ifringe = flowdoms(d2, level, sps)%fringePtr(1, i2, j2, k2)
871 if (ifringe > 0)
then
873 flowdoms(d2, level, sps)%fringes(ifringe) = fringe
877 flowdoms(d2, level, sps)%nDonors, fringe)
881 flowdoms(d2, level, sps)%fringePtr(:, i2, j2, k2) = &
882 flowdoms(d2, level, sps)%nDonors
887 end do intcompleterecvs
891 size = commpattern(level)%nProcSend
892 do i = 1, commpattern(level)%nProcSend
893 call mpi_waitany(
size,
sendrequests, index, mpistatus, ierr)
898 deallocate (sendbufint, recvbufint)
912 sends:
do i = 1, commpattern(level)%nProcSend
917 procid = commpattern(level)%sendProc(i)
918 size = nvar * commpattern(level)%nsend(i)
923 do j = 1, commpattern(level)%nsend(i)
928 d1 = commpattern(level)%sendList(i)%block(j)
929 i1 = commpattern(level)%sendList(i)%indices(j, 1)
930 j1 = commpattern(level)%sendList(i)%indices(j, 2)
931 k1 = commpattern(level)%sendList(i)%indices(j, 3)
934 ifringe = flowdoms(d1, level, sps)%fringePtr(1, i1, j1, k1)
935 if (ifringe > 0)
then
936 sendbuffer(jj:jj + 2) = flowdoms(d1, level, sps)%fringes(ifringe)%donorFrac
946 call mpi_isend(
sendbuffer(ii),
size, adflow_real, procid, &
959 receives:
do i = 1, commpattern(level)%nProcRecv
964 procid = commpattern(level)%recvProc(i)
965 size = nvar * commpattern(level)%nrecv(i)
969 call mpi_irecv(
recvbuffer(ii),
size, adflow_real, procid, &
986 size = commpattern(level)%nProcRecv
987 completerecvs:
do i = 1, commpattern(level)%nProcRecv
991 call mpi_waitany(
size,
recvrequests, index, mpistatus, ierr)
996 jj = nvar * commpattern(level)%nrecvCum(ii - 1)
997 do j = 1, commpattern(level)%nrecv(ii)
1001 d2 = commpattern(level)%recvList(ii)%block(j)
1002 i2 = commpattern(level)%recvList(ii)%indices(j, 1)
1003 j2 = commpattern(level)%recvList(ii)%indices(j, 2)
1004 k2 = commpattern(level)%recvList(ii)%indices(j, 3)
1008 ifringe = flowdoms(d2, level, sps)%fringePtr(1, i2, j2, k2)
1009 flowdoms(d2, level, sps)%fringes(ifringe)%donorFrac =
recvbuffer(jj + 1:jj + 3)
1014 end do completerecvs
1018 size = commpattern(level)%nProcSend
1019 do i = 1, commpattern(level)%nProcSend
1020 call mpi_waitany(
size,
sendrequests, index, mpistatus, ierr)
1040 integer(kind=intType),
intent(in) :: level, sps
1042 type(
commtype),
dimension(*),
intent(in) :: commPattern
1044 integer(kind=intType) :: nn
1046 domainloop:
do nn = 1, ndom
1047 flowdoms(nn, level, sps)%intCommVars(1)%var => flowdoms(nn, level, sps)%status(:, :, :)
1074 integer(kind=intType),
intent(in) :: level, sps
1075 type(
commtype),
dimension(*),
intent(in) :: commPattern
1080 integer :: size, procID, ierr, index
1081 integer,
dimension(mpi_status_size) :: mpiStatus
1083 integer(kind=intType) :: mm
1084 integer(kind=intType) :: i, j, k, ii, jj
1085 integer(kind=intType) :: d1, i1, j1, k1, d2, i2, j2, k2
1086 integer(kind=intType),
dimension(:),
allocatable :: sendBuf, recvBuf
1087 logical :: CisDonor, CisHole, CisCompute, CisFloodSeed, CisFlooded, CisWallDonor, CisReceiver
1088 logical :: DisDonor, DisHole, DisCompute, DisFloodSeed, DisFlooded, DisWallDonor, DisReceiver
1089 integer(kind=intType) :: cellStatus, donorStatus
1091 ii = commpattern(level)%nProcSend
1092 ii = commpattern(level)%nsendCum(ii)
1093 jj = commpattern(level)%nProcRecv
1094 jj = commpattern(level)%nrecvCum(jj)
1097 allocate (sendbuf(ii), recvbuf(jj), stat=ierr)
1105 recvs:
do i = 1, commpattern(level)%nProcRecv
1110 procid = commpattern(level)%recvProc(i)
1111 size = commpattern(level)%nrecv(i)
1115 do j = 1, commpattern(level)%nrecv(i)
1119 d2 = commpattern(level)%recvList(i)%block(j)
1120 i2 = commpattern(level)%recvList(i)%indices(j, 1)
1121 j2 = commpattern(level)%recvList(i)%indices(j, 2)
1122 k2 = commpattern(level)%recvList(i)%indices(j, 3)
1124 recvbuf(jj) = flowdoms(d2, level, sps)%status(i2, j2, k2)
1130 call mpi_isend(recvbuf(ii),
size, adflow_integer, procid, &
1143 sends:
do i = 1, commpattern(level)%nProcSend
1148 procid = commpattern(level)%sendProc(i)
1149 size = commpattern(level)%nsend(i)
1153 call mpi_irecv(sendbuf(ii),
size, adflow_integer, procid, &
1164 localcopy:
do i = 1, internal(level)%ncopy
1168 d1 = internal(level)%donorBlock(i)
1169 i1 = internal(level)%donorIndices(i, 1)
1170 j1 = internal(level)%donorIndices(i, 2)
1171 k1 = internal(level)%donorIndices(i, 3)
1175 d2 = internal(level)%haloBlock(i)
1176 i2 = internal(level)%haloIndices(i, 1)
1177 j2 = internal(level)%haloIndices(i, 2)
1178 k2 = internal(level)%haloIndices(i, 3)
1182 cellstatus = flowdoms(d1, level, sps)%status(i1, j1, k1)
1183 call getstatus(cellstatus, cisdonor, cishole, ciscompute, &
1184 cisfloodseed, cisflooded, ciswalldonor, cisreceiver)
1186 donorstatus = flowdoms(d2, level, sps)%status(i2, j2, k2)
1187 call getstatus(donorstatus, disdonor, dishole, discompute, &
1188 disfloodseed, disflooded, diswalldonor, disreceiver)
1190 call setisdonor(flowdoms(d1, level, sps)%status(i1, j1, k1), &
1191 cisdonor .or. disdonor)
1193 call setiswalldonor(flowdoms(d1, level, sps)%status(i1, j1, k1), &
1194 ciswalldonor .or. diswalldonor)
1201 size = commpattern(level)%nProcSend
1202 completesends:
do i = 1, commpattern(level)%nProcSend
1206 call mpi_waitany(
size,
recvrequests, index, mpistatus, ierr)
1212 jj = commpattern(level)%nsendCum(ii - 1)
1214 do j = 1, commpattern(level)%nsend(ii)
1218 d1 = commpattern(level)%sendList(ii)%block(j)
1219 i1 = commpattern(level)%sendList(ii)%indices(j, 1)
1220 j1 = commpattern(level)%sendList(ii)%indices(j, 2)
1221 k1 = commpattern(level)%sendList(ii)%indices(j, 3)
1223 cellstatus = flowdoms(d1, level, sps)%status(i1, j1, k1)
1224 call getstatus(cellstatus, cisdonor, cishole, ciscompute, &
1225 cisfloodseed, cisflooded, ciswalldonor, cisreceiver)
1227 donorstatus = sendbuf(jj)
1228 call getstatus(donorstatus, disdonor, dishole, discompute, &
1229 disfloodseed, disflooded, diswalldonor, disreceiver)
1231 call setisdonor(flowdoms(d1, level, sps)%status(i1, j1, k1), &
1232 cisdonor .or. disdonor)
1234 call setiswalldonor(flowdoms(d1, level, sps)%status(i1, j1, k1), &
1235 ciswalldonor .or. diswalldonor)
1237 end do completesends
1241 size = commpattern(level)%nProcRecv
1242 do i = 1, commpattern(level)%nProcRecv
1243 call mpi_waitany(
size,
sendrequests, index, mpistatus, ierr)
1246 deallocate (recvbuf, sendbuf)
1265 integer(kind=intType),
intent(in) :: level, sps
1270 integer :: size, procId, ierr, index
1271 integer,
dimension(mpi_status_size) :: mpiStatus
1273 integer(kind=intType) :: nVar
1274 integer(kind=intType) :: i, j, k, ii, jj, iii, jjj, kkk, iFringe
1275 integer(kind=intType) :: d1, i1, j1, k1, d2, i2, j2, k2, ind
1276 integer(kind=intType),
dimension(:),
allocatable :: sendBufInt
1277 integer(kind=intType),
dimension(:),
allocatable :: recvBufInt
1279 type(
commtype),
pointer :: commPattern
1285 ii = commpattern%nProcSend
1286 ii = commpattern%nsendCum(ii)
1287 jj = commpattern%nProcRecv
1288 jj = commpattern%nrecvCum(jj)
1290 allocate (sendbufint(ii * nvar), recvbufint(jj * nvar), stat=ierr)
1296 sends:
do i = 1, commpattern%nProcSend
1301 procid = commpattern%sendProc(i)
1302 size = nvar * commpattern%nsend(i)
1307 do j = 1, commpattern%nsend(i)
1312 d1 = commpattern%sendList(i)%block(j)
1313 i1 = commpattern%sendList(i)%indices(j, 1)
1314 j1 = commpattern%sendList(i)%indices(j, 2)
1315 k1 = commpattern%sendList(i)%indices(j, 3)
1321 sendbufint(jj) = flowdoms(d1, level, sps)%globalCell(iii, jjj, kkk)
1330 call mpi_isend(sendbufint(ii),
size, adflow_integer, procid, &
1333 call echk(ierr, __file__, __line__)
1344 receives:
do i = 1, commpattern%nProcRecv
1349 procid = commpattern%recvProc(i)
1350 size = nvar * commpattern%nrecv(i)
1354 call mpi_irecv(recvbufint(ii),
size, adflow_integer, procid, &
1356 call echk(ierr, __file__, __line__)
1365 localinterp:
do i = 1, internal%ncopy
1369 d1 = internal%donorBlock(i)
1370 i1 = internal%donorIndices(i, 1)
1371 j1 = internal%donorIndices(i, 2)
1372 k1 = internal%donorIndices(i, 3)
1376 d2 = internal%haloBlock(i)
1377 i2 = internal%haloIndices(i, 1)
1378 j2 = internal%haloIndices(i, 2)
1379 k2 = internal%haloIndices(i, 3)
1387 flowdoms(d2, level, sps)%gInd(ind, i2, j2, k2) = &
1388 flowdoms(d1, level, sps)%globalCell(iii, jjj, kkk)
1397 size = commpattern%nProcRecv
1398 completerecvs:
do i = 1, commpattern%nProcRecv
1402 call mpi_waitany(
size,
recvrequests, index, mpistatus, ierr)
1403 call echk(ierr, __file__, __line__)
1408 jj = nvar * commpattern%nrecvCum(ii - 1)
1409 do j = 1, commpattern%nrecv(ii)
1413 d2 = commpattern%recvList(ii)%block(j)
1414 i2 = commpattern%recvList(ii)%indices(j, 1)
1415 j2 = commpattern%recvList(ii)%indices(j, 2)
1416 k2 = commpattern%recvList(ii)%indices(j, 3)
1420 flowdoms(d2, level, sps)%gInd(ind, i2, j2, k2) = &
1421 recvbufint(jj + ind)
1426 end do completerecvs
1430 size = commpattern%nProcSend
1431 do i = 1, commpattern%nProcSend
1432 call mpi_waitany(
size,
sendrequests, index, mpistatus, ierr)
1433 call echk(ierr, __file__, __line__)
1435 deallocate (sendbufint, recvbufint)
1456 integer(kind=intType),
intent(in),
dimension(:) :: zipperFamList
1457 integer(kind=intType),
intent(in) :: level, sps
1459 type(
commtype),
dimension(*),
intent(in) :: commPattern
1463 integer(kind=intType) :: i, j, k, ii, nn, mm
1464 real(kind=realtype),
dimension(:),
allocatable :: psave
1465 real(kind=realtype),
dimension(:, :),
pointer :: deltaptr
1474 allocate (flowdoms(nn, level, sps)%realCommVars(1)%var(1:
ib + 1, 1:
jb + 1, 1:
kb + 1))
1477 bocoloop:
do mm = 1,
nbocos
1482 deltaptr => flowdoms(nn, level, sps)%realCommVars(1)%var(2 + 1, :, :)
1484 deltaptr => flowdoms(nn, level, sps)%realCommVars(1)%var(
il + 1, :, :)
1486 deltaptr => flowdoms(nn, level, sps)%realCommVars(1)%var(:, 2 + 1, :)
1488 deltaptr => flowdoms(nn, level, sps)%realCommVars(1)%var(:,
jl + 1, :)
1490 deltaptr => flowdoms(nn, level, sps)%realCommVars(1)%var(:, :, 2 + 1)
1492 deltaptr => flowdoms(nn, level, sps)%realCommVars(1)%var(:, :,
kl + 1)
1501 deltaptr(i + 1, j + 1) =
bcdata(mm)%delta(i, j)
1517 bocoloop2:
do mm = 1,
nbocos
1522 deltaptr => flowdoms(nn, level, sps)%realCommVars(1)%var(2 + 1, :, :)
1524 deltaptr => flowdoms(nn, level, sps)%realCommVars(1)%var(
il + 1, :, :)
1526 deltaptr => flowdoms(nn, level, sps)%realCommVars(1)%var(:, 2 + 1, :)
1528 deltaptr => flowdoms(nn, level, sps)%realCommVars(1)%var(:,
jl + 1, :)
1530 deltaptr => flowdoms(nn, level, sps)%realCommVars(1)%var(:, :, 2 + 1)
1532 deltaptr => flowdoms(nn, level, sps)%realCommVars(1)%var(:, :,
jl + 1)
1541 bcdata(mm)%delta(i, j) = deltaptr(i + 1, j + 1)
1548 deallocate (flowdoms(nn, level, sps)%realCommVars(1)%var)
1568 integer(kind=intType),
intent(in) :: level, sps
1569 integer(kind=intType),
intent(in),
dimension(:) :: zipperFamList
1571 type(
commtype),
dimension(*),
intent(in) :: commPattern
1575 integer(kind=intType) :: i, j, k, ii, nn, mm
1576 integer(kind=intType),
dimension(:),
allocatable :: iBlankSave
1577 integer(kind=intType),
dimension(:, :),
pointer :: ibp
1583 ii = ii + (
ib + 1) * (
jb + 1) * (
kb + 1)
1586 allocate (iblanksave(ii))
1594 iblanksave(ii) =
iblank(i, j, k)
1608 bocoloop:
do mm = 1,
nbocos
1632 ibp(i + 1, j + 1) =
bcdata(mm)%iBlank(i, j)
1640 domainloop:
do nn = 1, ndom
1641 flowdoms(nn, level, sps)%intCommVars(1)%var => &
1642 flowdoms(nn, level, sps)%iblank(:, :, :)
1653 bocoloop2:
do mm = 1,
nbocos
1676 bcdata(mm)%iBlank(i, j) = ibp(i + 1, j + 1)
1687 iblank(i, j, k) = iblanksave(ii)
1692 deallocate (iblanksave)
1705 integer(kind=intType),
intent(in) :: level, sps
1708 integer(Kind=intType) :: nn, mm, ierr
1742 use blockpointers,
only: ndom,
il,
jl,
kl,
xseed, flowdoms,
x,
ib,
jb,
kb, &
1751 integer(kind=intType),
intent(in) :: level, sps
1752 type(
commtype),
pointer :: commPattern
1756 integer(kind=intType) :: nn, ii, jj, ierr, i, j, k, d1, i1, j1, k1, d2, i2, j2, k2
1757 integer(kind=intType) :: size, procID, index, iii, jjj
1758 integer,
dimension(mpi_status_size) :: mpiStatus
1759 real(kind=realtype) :: frac(3), frac0(3), xcen(3)
1760 integer(kind=intType),
dimension(8),
parameter :: indices = (/1, 2, 4, 3, 5, 6, 8, 7/)
1763 real(kind=realtype) :: fractol = 1e-4
1779 if (.not.
associated(flowdoms(nn, level, sps)%xSeed))
then
1780 allocate (flowdoms(nn, level, sps)%XSeed(0:
ib, 0:
jb, 0:
kb, 3))
1782 xseed => flowdoms(nn, level, sps)%xSeed
1788 x(i - 1, j - 1, k - 1, :) + &
1789 x(i, j - 1, k - 1, :) + &
1790 x(i - 1, j, k - 1, :) + &
1791 x(i, j, k - 1, :) + &
1792 x(i - 1, j - 1, k, :) + &
1793 x(i, j - 1, k, :) + &
1794 x(i - 1, j, k, :) + &
1803 flowdoms(nn, level, sps)%realCommVars(1)%var => flowdoms(nn, level, sps)%xSeed(:, :, :, 1)
1804 flowdoms(nn, level, sps)%realCommVars(2)%var => flowdoms(nn, level, sps)%xSeed(:, :, :, 2)
1805 flowdoms(nn, level, sps)%realCommVars(3)%var => flowdoms(nn, level, sps)%xSeed(:, :, :, 3)
1822 recvs:
do i = 1, commpattern%nProcRecv
1827 procid = commpattern%recvProc(i)
1828 size = 3 * commpattern%nrecv(i)
1832 do j = 1, commpattern%nrecv(i)
1836 d2 = commpattern%recvList(i)%block(j)
1837 i2 = commpattern%recvList(i)%indices(j, 1)
1838 j2 = commpattern%recvList(i)%indices(j, 2)
1839 k2 = commpattern%recvList(i)%indices(j, 3)
1842 recvbuffer(jj) = flowdoms(d2, level, sps)%xSeed(i2, j2, k2, 1)
1843 recvbuffer(jj + 1) = flowdoms(d2, level, sps)%xSeed(i2, j2, k2, 2)
1844 recvbuffer(jj + 2) = flowdoms(d2, level, sps)%xSeed(i2, j2, k2, 3)
1849 call mpi_isend(
recvbuffer(ii),
size, adflow_real, procid, &
1862 sends:
do i = 1, commpattern%nProcSend
1867 procid = commpattern%sendProc(i)
1868 size = 3 * commpattern%nsend(i)
1872 call mpi_irecv(
sendbuffer(ii),
size, adflow_real, procid, &
1883 localinterp:
do i = 1, internal%ncopy
1887 d1 = internal%donorBlock(i)
1888 i1 = internal%donorIndices(i, 1)
1889 j1 = internal%donorIndices(i, 2)
1890 k1 = internal%donorIndices(i, 3)
1894 d2 = internal%haloBlock(i)
1895 i2 = internal%haloIndices(i, 1)
1896 j2 = internal%haloIndices(i, 2)
1897 k2 = internal%haloIndices(i, 3)
1901 xcen = flowdoms(d2, level, sps)%xSeed(i2, j2, k2, :)
1904 internal%xCen(i, :) = xcen
1909 flowdoms(d1, level, sps)%x(i1 - 1:i1 + 1, j1 - 1:j1 + 1, k1 - 1:k1 + 1, :), frac0, frac)
1912 if (maxval(frac) >
one + fractol .or. minval(frac) <
zero - fractol)
then
1913 print *,
"Invalid overset connectivity update. Use 'frozen' or 'full' oversetUpdateMode instead."
1924 size = commpattern%nProcSend
1925 completesends:
do i = 1, commpattern%nProcSend
1929 call mpi_waitany(
size,
sendrequests, index, mpistatus, ierr)
1933 jj = 3 * commpattern%nsendCum(ii - 1)
1934 do j = 1, commpattern%nsend(ii)
1938 d2 = commpattern%sendList(ii)%block(j)
1939 i2 = commpattern%sendList(ii)%indices(j, 1)
1940 j2 = commpattern%sendList(ii)%indices(j, 2)
1941 k2 = commpattern%sendList(ii)%indices(j, 3)
1947 commpattern%sendList(ii)%xCen(j, :) = xcen
1952 flowdoms(d2, level, sps)%x(i2 - 1:i2 + 1, j2 - 1:j2 + 1, k2 - 1:k2 + 1, :), &
1956 if (maxval(frac) >
one + fractol .or. minval(frac) <
zero - fractol)
then
1957 print *,
"Invalid overset connectivity update. Use 'frozen' or 'full' oversetUpdateMode instead."
1962 call fractoweights(frac, commpattern%sendList(ii)%interp(j, :))
1965 end do completesends
1969 size = commpattern%nProcRecv
1970 do i = 1, commpattern%nProcRecv
1971 call mpi_waitany(
size,
recvrequests, index, mpistatus, ierr)
1982 use blockpointers,
only: ndom,
il,
jl,
kl,
xseed, flowdoms,
x,
ib,
jb,
kb, &
1991 integer(kind=intType),
intent(in) :: level, sps
1992 type(
commtype),
pointer :: commPattern
1996 integer(kind=intType) :: nn, ii, jj, ierr, i, j, k, d1, i1, j1, k1, d2, i2, j2, k2
1997 integer(kind=intType) :: size, procID, index, iii, jjj
1998 integer,
dimension(mpi_status_size) :: mpiStatus
1999 real(kind=realtype) :: frac(3), fracd(3), frac0(3), xcen(3), xcend(3), weight(8)
2000 integer(kind=intType),
dimension(8),
parameter :: indices = (/1, 2, 4, 3, 5, 6, 8, 7/)
2016 if (.not.
associated(flowdoms(nn, level, sps)%xSeed))
then
2017 allocate (flowdoms(nn, level, sps)%XSeed(0:
ib, 0:
jb, 0:
kb, 3))
2019 xseed => flowdoms(nn, level, sps)%xSeed
2025 x(i - 1, j - 1, k - 1, :) + &
2026 x(i, j - 1, k - 1, :) + &
2027 x(i - 1, j, k - 1, :) + &
2028 x(i, j, k - 1, :) + &
2029 x(i - 1, j - 1, k, :) + &
2030 x(i, j - 1, k, :) + &
2031 x(i - 1, j, k, :) + &
2038 xd(i - 1, j - 1, k - 1, :) + &
2039 xd(i, j - 1, k - 1, :) + &
2040 xd(i - 1, j, k - 1, :) + &
2041 xd(i, j, k - 1, :) + &
2042 xd(i - 1, j - 1, k, :) + &
2043 xd(i, j - 1, k, :) + &
2044 xd(i - 1, j, k, :) + &
2053 flowdoms(nn, level, sps)%realCommVars(1)%var => flowdoms(nn, level, sps)%xSeed(:, :, :, 1)
2054 flowdoms(nn, level, sps)%realCommVars(2)%var => flowdoms(nn, level, sps)%xSeed(:, :, :, 2)
2055 flowdoms(nn, level, sps)%realCommVars(3)%var => flowdoms(nn, level, sps)%xSeed(:, :, :, 3)
2056 flowdoms(nn, level, sps)%realCommVars(4)%var => flowdoms(nn, level, sps)%scratch(:, :, :, 1)
2057 flowdoms(nn, level, sps)%realCommVars(5)%var => flowdoms(nn, level, sps)%scratch(:, :, :, 2)
2058 flowdoms(nn, level, sps)%realCommVars(6)%var => flowdoms(nn, level, sps)%scratch(:, :, :, 3)
2075 recvs:
do i = 1, commpattern%nProcRecv
2080 procid = commpattern%recvProc(i)
2081 size = 6 * commpattern%nrecv(i)
2085 do j = 1, commpattern%nrecv(i)
2089 d2 = commpattern%recvList(i)%block(j)
2090 i2 = commpattern%recvList(i)%indices(j, 1)
2091 j2 = commpattern%recvList(i)%indices(j, 2)
2092 k2 = commpattern%recvList(i)%indices(j, 3)
2095 recvbuffer(jj) = flowdoms(d2, level, sps)%xSeed(i2, j2, k2, 1)
2096 recvbuffer(jj + 1) = flowdoms(d2, level, sps)%xSeed(i2, j2, k2, 2)
2097 recvbuffer(jj + 2) = flowdoms(d2, level, sps)%xSeed(i2, j2, k2, 3)
2098 recvbuffer(jj + 3) = flowdoms(d2, level, sps)%scratch(i2, j2, k2, 1)
2099 recvbuffer(jj + 4) = flowdoms(d2, level, sps)%scratch(i2, j2, k2, 2)
2100 recvbuffer(jj + 5) = flowdoms(d2, level, sps)%scratch(i2, j2, k2, 3)
2106 call mpi_isend(
recvbuffer(ii),
size, adflow_real, procid, &
2119 sends:
do i = 1, commpattern%nProcSend
2124 procid = commpattern%sendProc(i)
2125 size = 6 * commpattern%nsend(i)
2129 call mpi_irecv(
sendbuffer(ii),
size, adflow_real, procid, &
2140 localinterp:
do i = 1, internal%ncopy
2144 d1 = internal%donorBlock(i)
2145 i1 = internal%donorIndices(i, 1)
2146 j1 = internal%donorIndices(i, 2)
2147 k1 = internal%donorIndices(i, 3)
2151 d2 = internal%haloBlock(i)
2152 i2 = internal%haloIndices(i, 1)
2153 j2 = internal%haloIndices(i, 2)
2154 k2 = internal%haloIndices(i, 3)
2156 xcen = flowdoms(d2, level, sps)%xSeed(i2, j2, k2, :)
2157 xcend = flowdoms(d2, level, sps)%scratch(i2, j2, k2, 1:3)
2160 flowdoms(d1, level, sps)%x(i1 - 1:i1 + 1, j1 - 1:j1 + 1, k1 - 1:k1 + 1, :), &
2161 flowdomsd(d1, level, sps)%x(i1 - 1:i1 + 1, j1 - 1:j1 + 1, k1 - 1:k1 + 1, :), &
2165 call fractoweights_d(frac, fracd, weight, internal%donorInterpd(i, :))
2172 size = commpattern%nProcSend
2173 completesends:
do i = 1, commpattern%nProcSend
2177 call mpi_waitany(
size,
sendrequests, index, mpistatus, ierr)
2181 jj = 6 * commpattern%nsendCum(ii - 1)
2182 do j = 1, commpattern%nsend(ii)
2186 d2 = commpattern%sendList(ii)%block(j)
2187 i2 = commpattern%sendList(ii)%indices(j, 1)
2188 j2 = commpattern%sendList(ii)%indices(j, 2)
2189 k2 = commpattern%sendList(ii)%indices(j, 3)
2198 flowdoms(d2, level, sps)%x(i2 - 1:i2 + 1, j2 - 1:j2 + 1, k2 - 1:k2 + 1, :), &
2199 flowdomsd(d2, level, sps)%x(i2 - 1:i2 + 1, j2 - 1:j2 + 1, k2 - 1:k2 + 1, :), &
2204 commpattern%sendList(ii)%interpd(j, :))
2207 end do completesends
2211 size = commpattern%nProcRecv
2212 do i = 1, commpattern%nProcRecv
2213 call mpi_waitany(
size,
recvrequests, index, mpistatus, ierr)
2224 use blockpointers,
only: ndom,
il,
jl,
kl,
xseed, flowdoms,
x,
ib,
jb,
kb, &
2233 integer(kind=intType),
intent(in) :: level, sps
2234 type(
commtype),
pointer :: commPattern
2238 integer(kind=intType) :: nn, ii, jj, kk, ierr, i, j, k, d1, i1, j1, k1, d2, i2, j2, k2
2239 integer(kind=intType) :: size, procID, index, iii, jjj
2240 integer,
dimension(mpi_status_size) :: mpiStatus
2241 real(kind=realtype) :: frac(3), fracd(3), frac0(3), xcen(3), xcend(3), weight(8), add(3)
2242 integer(kind=intType),
dimension(8),
parameter :: indices = (/1, 2, 4, 3, 5, 6, 8, 7/)
2250 flowdoms(nn, 1, sps)%scratch(:, :, :, 1:3) =
zero
2258 sends:
do i = 1, commpattern%nProcSend
2263 procid = commpattern%sendProc(i)
2264 size = 3 * commpattern%nsend(i)
2269 do j = 1, commpattern%nsend(i)
2273 d1 = commpattern%sendList(i)%block(j)
2274 i1 = commpattern%sendList(i)%indices(j, 1)
2275 j1 = commpattern%sendList(i)%indices(j, 2)
2276 k1 = commpattern%sendList(i)%indices(j, 3)
2279 xcen = commpattern%sendList(i)%xCen(j, :)
2284 flowdoms(d1, level, sps)%x(i1 - 1:i1 + 1, j1 - 1:j1 + 1, k1 - 1:k1 + 1, :), &
2293 call fractoweights_b(frac, fracd, weight, commpattern%sendList(i)%interpd(j, :))
2299 flowdoms(d1, level, sps)%x(i1 - 1:i1 + 1, j1 - 1:j1 + 1, k1 - 1:k1 + 1, :), &
2300 flowdomsd(d1, level, sps)%x(i1 - 1:i1 + 1, j1 - 1:j1 + 1, k1 - 1:k1 + 1, :), &
2312 call mpi_isend(
sendbuffer(ii),
size, adflow_real, procid, &
2325 receives:
do i = 1, commpattern%nProcRecv
2330 procid = commpattern%recvProc(i)
2331 size = 3 * commpattern%nrecv(i)
2335 call mpi_irecv(
recvbuffer(ii),
size, adflow_real, procid, &
2346 localinterp:
do i = 1, internal%ncopy
2349 d1 = internal%donorBlock(i)
2350 i1 = internal%donorIndices(i, 1)
2351 j1 = internal%donorIndices(i, 2)
2352 k1 = internal%donorIndices(i, 3)
2354 d2 = internal%haloBlock(i)
2355 i2 = internal%haloIndices(i, 1)
2356 j2 = internal%haloIndices(i, 2)
2357 k2 = internal%haloIndices(i, 3)
2360 xcen = internal%XCen(i, :)
2365 flowdoms(d1, level, sps)%x(i1 - 1:i1 + 1, j1 - 1:j1 + 1, k1 - 1:k1 + 1, :), frac0, frac)
2373 call fractoweights_b(frac, fracd, weight, internal%Donorinterpd(i, :))
2379 flowdoms(d1, level, sps)%x(i1 - 1:i1 + 1, j1 - 1:j1 + 1, k1 - 1:k1 + 1, :), &
2380 flowdomsd(d1, level, sps)%x(i1 - 1:i1 + 1, j1 - 1:j1 + 1, k1 - 1:k1 + 1, :), &
2384 flowdoms(d2, level, sps)%scratch(i2, j2, k2, 1:3) = &
2385 flowdoms(d2, level, sps)%scratch(i2, j2, k2, 1:3) + xcend
2392 size = commpattern%nProcRecv
2393 completerecvs:
do i = 1, commpattern%nProcRecv
2397 call mpi_waitany(
size,
recvrequests, index, mpistatus, ierr)
2402 jj = 3 * commpattern%nrecvCum(ii - 1)
2403 do j = 1, commpattern%nrecv(ii)
2407 d2 = commpattern%recvList(ii)%block(j)
2408 i2 = commpattern%recvList(ii)%indices(j, 1)
2409 j2 = commpattern%recvList(ii)%indices(j, 2)
2410 k2 = commpattern%recvList(ii)%indices(j, 3)
2412 flowdoms(d2, level, sps)%scratch(i2, j2, k2, 1:3) = &
2413 flowdoms(d2, level, sps)%scratch(i2, j2, k2, 1:3) +
recvbuffer(jj + 1:jj + 3)
2417 end do completerecvs
2421 size = commpattern%nProcSend
2422 do i = 1, commpattern%nProcSend
2423 call mpi_waitany(
size,
sendrequests, index, mpistatus, ierr)
2431 flowdoms(nn, level, sps)%realCommVars(1)%var => flowdoms(nn, level, sps)%scratch(:, :, :, 1)
2432 flowdoms(nn, level, sps)%realCommVars(2)%var => flowdoms(nn, level, sps)%scratch(:, :, :, 2)
2433 flowdoms(nn, level, sps)%realCommVars(3)%var => flowdoms(nn, level, sps)%scratch(:, :, :, 3)
2450 xd(ii, jj, kk, :) =
xd(ii, jj, kk, :) + add
type(fringetype), dimension(:), pointer fringes
real(kind=realtype), dimension(:, :, :, :), pointer scratch
integer(kind=inttype), dimension(:, :, :), pointer iblank
integer(kind=inttype), dimension(:), pointer bcfaceid
integer(kind=inttype) nbocos
integer(kind=inttype), dimension(:), pointer bctype
real(kind=realtype), dimension(:, :, :, :), pointer xd
real(kind=realtype), dimension(:, :, :, :), pointer x
real(kind=realtype), dimension(:, :, :, :), pointer xseed
real(kind=realtype), dimension(:), allocatable recvbuffer
integer, dimension(:), allocatable recvrequests
real(kind=realtype), dimension(:), allocatable sendbuffer
type(internalcommtype), dimension(:, :), allocatable, target internaloverset
type(internalcommtype), dimension(:), allocatable internalcell_1st
type(internalcommtype), dimension(:), allocatable internalcell_2nd
integer, dimension(:), allocatable sendrequests
type(commtype), dimension(:, :), allocatable, target commpatternoverset
type(commtype), dimension(:), allocatable commpatterncell_1st
type(commtype), dimension(:), allocatable commpatterncell_2nd
integer adflow_comm_world
real(kind=realtype), parameter zero
integer(kind=inttype), parameter imax
integer(kind=inttype), parameter kmin
integer(kind=inttype), parameter jmax
real(kind=realtype), parameter eighth
real(kind=realtype), parameter one
real(kind=realtype), parameter half
integer(kind=inttype), parameter imin
integer(kind=inttype), parameter kmax
integer(kind=inttype), parameter jmin
subroutine whalo1to1realgeneric(nVar, level, sps, commPattern, internal)
subroutine whalo1to1intgeneric(nVar, level, sps, commPattern, internal)
subroutine whalo1to1realgeneric_b(nVar, level, sps, commPattern, internal)
subroutine emptyoversetcomm(level, sps)
subroutine exchangestatus(level, sps, commPattern, internal)
subroutine updateoversetconnectivity(level, sps)
subroutine recvofringe(oFringe, iDom, iProc, tagOffset, iSize, rSize, recvCount, recvInfo)
subroutine updateoversetconnectivity_b(level, sps)
subroutine setupfringeglobalind(level, sps)
subroutine getfringereturnsizes(oFringeSendList, oFringeRecvList, nOFringeSend, nOfringeRecv, oFringes, fringeRecvSizes, cumFringeRecv)
subroutine getosurfcommpattern(oMat, oMatT, sendList, nSend, recvList, nRecv, rBufSize)
subroutine sendofringe(oFringe, iDom, iProc, tagOffset, sendCount)
subroutine recvoblock(oBlock, iDom, iProc, tagOffset, iSize, rSize, recvCount, recvInfo)
subroutine exchangesurfacedelta(zipperFamList, level, sps, commPattern, internal)
subroutine oversetloadbalance(overlap)
subroutine getcommpattern(oMat, sendList, nSend, recvList, nRecv)
subroutine updateoversetconnectivity_d(level, sps)
subroutine exchangestatustranspose(level, sps, commPattern, internal)
subroutine recvosurf(oWall, iDom, iProc, tagOffset, iSize, rSize, recvCount, recvInfo)
subroutine sendosurf(oWall, iDom, iProc, tagOffset, sendCount)
subroutine exchangesurfaceiblanks(zipperFamList, level, sps, commPattern, internal)
subroutine exchangefringes(level, sps, commPattern, internal)
subroutine sendoblock(oBlock, iDom, iProc, tagOffset, sendCount)
integer(kind=inttype), dimension(:), allocatable ndomproc
integer(kind=inttype) ndomtotal
integer(kind=inttype), dimension(:), allocatable cumdomproc
subroutine fractoweights(frac, weights)
subroutine fractoweights_b(frac, fracd, weights, weightsd)
subroutine newtonupdate(xcen, blk, frac0, frac)
subroutine newtonupdate_b(xcen, xcend, blk, blkd, frac0, frac, fracd)
subroutine newtonupdate_d(xcen, xcend, blk, blkd, frac0, frac, fracd)
subroutine fractoweights_d(frac, fracd, weights, weightsd)
subroutine setisdonor(i, flag)
subroutine fractoweights(frac, weights)
subroutine addtofringelist(fringeList, n, fringe)
subroutine newtonupdate(xCen, blk, frac0, frac)
subroutine setiswalldonor(i, flag)
subroutine getstatus(i, isDonor, isHole, isCompute, isFloodSeed, isFlooded, isWallDonor, isReceiver)
integer(kind=inttype) function windindex(i, j, k, il, jl, kl)
logical function faminlist(famID, famList)
subroutine unique(arr, nn, n_unique, inverse)
subroutine setpointers_d(nn, level, sps)
subroutine echk(errorcode, file, line)
subroutine setpointers_b(nn, level, sps)
subroutine setpointers(nn, mm, ll)