74 & GrecvW, GsendW, Wtile, Wexchange, &
75 & GrecvE, GsendE, Etile, Eexchange, &
76 & GrecvS, GsendS, Stile, Sexchange, &
77 & GrecvN, GsendN, Ntile, Nexchange)
87 logical,
intent(in) :: EW_periodic, NS_periodic
89 integer,
intent(in) :: ng, Nghost
91 logical,
intent(out) :: Wexchange, Eexchange
92 logical,
intent(out) :: Sexchange, Nexchange
94 integer,
intent(out) :: GrecvW, GsendW, Wtile
95 integer,
intent(out) :: GrecvE, GsendE, Etile
96 integer,
intent(out) :: GrecvS, GsendS, Stile
97 integer,
intent(out) :: GrecvN, GsendN, Ntile
102 integer :: MyRankI, MyRankJ, Null_Value, rank
104 integer,
dimension(-1:NtileI(ng),-1:NtileJ(ng)) :: table
114 null_value=mpi_proc_null
120 table(i,j)=null_value
155 IF (ew_periodic)
THEN
156 IF ((table(myranki-1,myrankj).eq.null_value).and. &
158 wtile=table(
ntilei(ng)-1,myrankj)
159 etile=table(myranki+1,myrankj)
168 ELSE IF ((table(myranki+1,myrankj).eq.null_value).and. &
170 wtile=table(myranki-1,myrankj)
171 etile=table(0,myrankj)
181 wtile=table(myranki-1,myrankj)
182 etile=table(myranki+1,myrankj)
189 wtile=table(myranki-1,myrankj)
190 etile=table(myranki+1,myrankj)
199 IF (wtile.eq.null_value)
THEN
204 IF (etile.eq.null_value)
THEN
230 IF (ns_periodic)
THEN
231 IF ((table(myranki,myrankj-1).eq.null_value).and. &
233 stile=table(myranki,
ntilej(ng)-1)
234 ntile=table(myranki,myrankj+1)
243 ELSE IF ((table(myranki,myrankj+1).eq.null_value).and. &
245 stile=table(myranki,myrankj-1)
246 ntile=table(myranki,0)
256 stile=table(myranki,myrankj-1)
257 ntile=table(myranki,myrankj+1)
264 stile=table(myranki,myrankj-1)
265 ntile=table(myranki,myrankj+1)
274 IF (stile.eq.null_value)
THEN
279 IF (ntile.eq.null_value)
THEN
291 & LBi, UBi, LBj, UBj, &
292 & Nghost, EW_periodic, NS_periodic, &
305 logical,
intent(in) :: EW_periodic, NS_periodic
307 integer,
intent(in) :: ng, tile, model, Nvar
308 integer,
intent(in) :: LBi, UBi, LBj, UBj
309 integer,
intent(in) :: Nghost
312 real(r8),
intent(inout) :: A(LBi:,LBj:)
314 real(r8),
intent(inout),
optional :: B(LBi:,LBj:)
315 real(r8),
intent(inout),
optional :: C(LBi:,LBj:)
316 real(r8),
intent(inout),
optional :: D(LBi:,LBj:)
318 real(r8),
intent(inout) :: A(LBi:UBi,LBj:UBj)
320 real(r8),
intent(inout),
optional :: B(LBi:UBi,LBj:UBj)
321 real(r8),
intent(inout),
optional :: C(LBi:UBi,LBj:UBj)
322 real(r8),
intent(inout),
optional :: D(LBi:UBi,LBj:UBj)
327 logical :: Wexchange, Sexchange, Eexchange, Nexchange
329 integer :: i, icS, icN, ioff, Imin, Imax, Ilen
330 integer :: j, jcW, jcE, joff, Jmin, Jmax, Jlen
331 integer :: m, mc, Ierror, Lstr, pp
332 integer :: Wtile, GsendW, GrecvW, Wtag, Werror, Wrequest
333 integer :: Stile, GsendS, GrecvS, Stag, Serror, Srequest
334 integer :: Etile, GsendE, GrecvE, Etag, Eerror, Erequest
335 integer :: Ntile, GsendN, GrecvN, Ntag, Nerror, Nrequest
336 integer :: EWsize, sizeW, sizeE
337 integer :: NSsize, sizeS, sizeN
340 integer,
dimension(MPI_STATUS_SIZE,4) :: status
343 real(r8),
dimension(Nvar*HaloSizeJ(ng)) :: sendW, sendE
344 real(r8),
dimension(Nvar*HaloSizeJ(ng)) :: recvW, recvE
346 real(r8),
dimension(Nvar*HaloSizeI(ng)) :: sendS, sendN
347 real(r8),
dimension(Nvar*HaloSizeI(ng)) :: recvS, recvN
349 character (len=MPI_MAX_ERROR_STRING) :: string
351 character (len=*),
parameter :: MyFile = &
352 & __FILE__//
", mp_exchange2d"
354# include "set_bounds.h"
362 CALL wclock_on (ng, model, 60, __line__, myfile)
373 & 4*
SIZE(sends))*kind(a),r8))
376 & grecvw, gsendw, wtile, wexchange, &
377 & grecve, gsende, etile, eexchange, &
378 & grecvs, gsends, stile, sexchange, &
379 & grecvn, gsendn, ntile, nexchange)
396 IF (ew_periodic.or.ns_periodic)
THEN
401 ewsize=nvar*(nghost+pp)*jlen
402 nssize=nvar*(nghost+pp)*ilen
403 IF (
SIZE(sende).lt.ewsize)
THEN
404 WRITE (
stdout,10)
'EWsize = ', ewsize,
SIZE(sende)
405 10
FORMAT (/,
' MP_EXCHANGE2D - communication buffer too small, ', &
408 IF (
SIZE(sendn).lt.nssize)
THEN
409 WRITE (
stdout,10)
'NSsize = ', nssize,
SIZE(sendn)
434 jcw=joff+1+(j-jmin)+mc
446 jcw=joff+1+(j-jmin)+mc
458 jcw=joff+1+(j-jmin)+mc
483 jce=joff+1+(j-jmin)+mc
495 jce=joff+1+(j-jmin)+mc
507 jce=joff+1+(j-jmin)+mc
520 CALL mpi_irecv (recvw, ewsize,
mp_float, wtile, etag, &
524 CALL mpi_irecv (recve, ewsize,
mp_float, etile, wtag, &
528 CALL mpi_send (sendw, sizew,
mp_float, wtile, wtag, &
532 CALL mpi_send (sende, sizee,
mp_float, etile, etag, &
543 CALL mpi_wait (wrequest, status(1,1), werror)
544 IF (werror.ne.mpi_success)
THEN
545 CALL mpi_error_string (werror, string, lstr, ierror)
546 lstr=len_trim(string)
547 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Western Edge)', &
548 &
myrank, werror, string(1:lstr)
549 20
FORMAT (/,
' MP_EXCHANGE2D - error during ',a, &
550 &
' call, Node = ',i3.3,
' Error = ',i3,/,15x,a)
569 jcw=joff+1+(j-jmin)+mc
580 jcw=joff+1+(j-jmin)+mc
591 jcw=joff+1+(j-jmin)+mc
600 CALL mpi_wait (erequest, status(1,3), eerror)
601 IF (eerror.ne.mpi_success)
THEN
602 CALL mpi_error_string (eerror, string, lstr, ierror)
603 lstr=len_trim(string)
604 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Eastern Edge)', &
605 &
myrank, eerror, string(1:lstr)
624 jce=joff+1+(j-jmin)+mc
635 jce=joff+1+(j-jmin)+mc
646 jce=joff+1+(j-jmin)+mc
675 ics=ioff+1+(i-imin)+mc
687 ics=ioff+1+(i-imin)+mc
699 ics=ioff+1+(i-imin)+mc
724 icn=ioff+1+(i-imin)+mc
736 icn=ioff+1+(i-imin)+mc
748 icn=ioff+1+(i-imin)+mc
761 CALL mpi_irecv (recvs, nssize,
mp_float, stile, ntag, &
765 CALL mpi_irecv (recvn, nssize,
mp_float, ntile, stag, &
769 CALL mpi_send (sends, sizes,
mp_float, stile, stag, &
773 CALL mpi_send (sendn, sizen,
mp_float, ntile, ntag, &
784 CALL mpi_wait (srequest, status(1,2), serror)
785 IF (serror.ne.mpi_success)
THEN
786 CALL mpi_error_string (serror, string, lstr, ierror)
787 lstr=len_trim(string)
788 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Southern Edge)', &
789 &
myrank, serror, string(1:lstr)
808 ics=ioff+1+(i-imin)+mc
819 ics=ioff+1+(i-imin)+mc
830 ics=ioff+1+(i-imin)+mc
839 CALL mpi_wait (nrequest, status(1,4), nerror)
840 IF (nerror.ne.mpi_success)
THEN
841 CALL mpi_error_string (nerror, string, lstr, ierror)
842 lstr=len_trim(string)
843 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Northern Edge)', &
844 &
myrank, nerror, string(1:lstr)
863 icn=ioff+1+(i-imin)+mc
874 icn=ioff+1+(i-imin)+mc
885 icn=ioff+1+(i-imin)+mc
898 CALL wclock_off (ng, model, 60, __line__, myfile)
908 SUBROUTINE mp_exchange2d_xtr (ng, tile, model, Nvar, &
909 & LBi, UBi, LBj, UBj, &
910 & Nghost, EW_periodic, NS_periodic, &
923 logical,
intent(in) :: EW_periodic, NS_periodic
925 integer,
intent(in) :: ng, tile, model, Nvar
926 integer,
intent(in) :: LBi, UBi, LBj, UBj
927 integer,
intent(in) :: Nghost
930 real(r8),
intent(inout) :: A(LBi:,LBj:)
932 real(r8),
intent(inout),
optional :: B(LBi:,LBj:)
933 real(r8),
intent(inout),
optional :: C(LBi:,LBj:)
934 real(r8),
intent(inout),
optional :: D(LBi:,LBj:)
936 real(r8),
intent(inout) :: A(LBi:UBi,LBj:UBj)
938 real(r8),
intent(inout),
optional :: B(LBi:UBi,LBj:UBj)
939 real(r8),
intent(inout),
optional :: C(LBi:UBi,LBj:UBj)
940 real(r8),
intent(inout),
optional :: D(LBi:UBi,LBj:UBj)
945 logical :: Wexchange, Sexchange, Eexchange, Nexchange
947 integer :: i, icS, icN, ioff, Imin, Imax, Ilen
948 integer :: j, jcW, jcE, joff, Jmin, Jmax, Jlen
949 integer :: m, mc, Ierror, Lstr, pp
950 integer :: Wtile, GsendW, GrecvW, Wtag, Werror, Wrequest
951 integer :: Stile, GsendS, GrecvS, Stag, Serror, Srequest
952 integer :: Etile, GsendE, GrecvE, Etag, Eerror, Erequest
953 integer :: Ntile, GsendN, GrecvN, Ntag, Nerror, Nrequest
954 integer :: EWsize, sizeW, sizeE
955 integer :: NSsize, sizeS, sizeN
958 integer,
dimension(MPI_STATUS_SIZE,4) :: status
961 real(r8),
dimension(Nvar*HaloSizeJ(ng)) :: sendW, sendE
962 real(r8),
dimension(Nvar*HaloSizeJ(ng)) :: recvW, recvE
964 real(r8),
dimension(Nvar*HaloSizeI(ng)) :: sendS, sendN
965 real(r8),
dimension(Nvar*HaloSizeI(ng)) :: recvS, recvN
967 character (len=MPI_MAX_ERROR_STRING) :: string
969 character (len=*),
parameter :: MyFile = &
970 & __FILE__//
", mp_exchange2d"
972# include "set_bounds_xtr.h"
980 CALL wclock_on (ng, model, 60, __line__, myfile)
991 & 4*
SIZE(sends))*kind(a),r8))
994 & grecvw, gsendw, wtile, wexchange, &
995 & grecve, gsende, etile, eexchange, &
996 & grecvs, gsends, stile, sexchange, &
997 & grecvn, gsendn, ntile, nexchange)
1014 IF (ew_periodic.or.ns_periodic)
THEN
1019 ewsize=nvar*(nghost+pp)*jlen
1020 nssize=nvar*(nghost+pp)*ilen
1021 IF (
SIZE(sende).lt.ewsize)
THEN
1022 WRITE (
stdout,10)
'EWsize = ', ewsize,
SIZE(sende)
1023 10
FORMAT (/,
' MP_EXCHANGE2D - communication buffer too small, ', &
1026 IF (
SIZE(sendn).lt.nssize)
THEN
1027 WRITE (
stdout,10)
'NSsize = ', nssize,
SIZE(sendn)
1045 IF (
PRESENT(b))
THEN
1052 jcw=joff+1+(j-jmin)+mc
1057 IF (
PRESENT(c))
THEN
1064 jcw=joff+1+(j-jmin)+mc
1069 IF (
PRESENT(d))
THEN
1076 jcw=joff+1+(j-jmin)+mc
1094 IF (
PRESENT(b))
THEN
1101 jce=joff+1+(j-jmin)+mc
1106 IF (
PRESENT(c))
THEN
1113 jce=joff+1+(j-jmin)+mc
1118 IF (
PRESENT(d))
THEN
1125 jce=joff+1+(j-jmin)+mc
1138 CALL mpi_irecv (recvw, ewsize,
mp_float, wtile, etag, &
1142 CALL mpi_irecv (recve, ewsize,
mp_float, etile, wtag, &
1146 CALL mpi_send (sendw, sizew,
mp_float, wtile, wtag, &
1150 CALL mpi_send (sende, sizee,
mp_float, etile, etag, &
1161 CALL mpi_wait (wrequest, status(1,1), werror)
1162 IF (werror.ne.mpi_success)
THEN
1163 CALL mpi_error_string (werror, string, lstr, ierror)
1164 lstr=len_trim(string)
1165 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Western Edge)', &
1166 &
myrank, werror, string(1:lstr)
1167 20
FORMAT (/,
' MP_EXCHANGE2D - error during ',a, &
1168 &
' call, Node = ',i3.3,
' Error = ',i3,/,15x,a)
1181 IF (
PRESENT(b))
THEN
1187 jcw=joff+1+(j-jmin)+mc
1192 IF (
PRESENT(c))
THEN
1198 jcw=joff+1+(j-jmin)+mc
1203 IF (
PRESENT(d))
THEN
1209 jcw=joff+1+(j-jmin)+mc
1218 CALL mpi_wait (erequest, status(1,3), eerror)
1219 IF (eerror.ne.mpi_success)
THEN
1220 CALL mpi_error_string (eerror, string, lstr, ierror)
1221 lstr=len_trim(string)
1222 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Eastern Edge)', &
1223 &
myrank, eerror, string(1:lstr)
1236 IF (
PRESENT(b))
THEN
1242 jce=joff+1+(j-jmin)+mc
1247 IF (
PRESENT(c))
THEN
1253 jce=joff+1+(j-jmin)+mc
1258 IF (
PRESENT(d))
THEN
1264 jce=joff+1+(j-jmin)+mc
1286 IF (
PRESENT(b))
THEN
1293 ics=ioff+1+(i-imin)+mc
1298 IF (
PRESENT(c))
THEN
1305 ics=ioff+1+(i-imin)+mc
1310 IF (
PRESENT(d))
THEN
1317 ics=ioff+1+(i-imin)+mc
1335 IF (
PRESENT(b))
THEN
1342 icn=ioff+1+(i-imin)+mc
1347 IF (
PRESENT(c))
THEN
1354 icn=ioff+1+(i-imin)+mc
1359 IF (
PRESENT(d))
THEN
1366 icn=ioff+1+(i-imin)+mc
1379 CALL mpi_irecv (recvs, nssize,
mp_float, stile, ntag, &
1383 CALL mpi_irecv (recvn, nssize,
mp_float, ntile, stag, &
1387 CALL mpi_send (sends, sizes,
mp_float, stile, stag, &
1391 CALL mpi_send (sendn, sizen,
mp_float, ntile, ntag, &
1402 CALL mpi_wait (srequest, status(1,2), serror)
1403 IF (serror.ne.mpi_success)
THEN
1404 CALL mpi_error_string (serror, string, lstr, ierror)
1405 lstr=len_trim(string)
1406 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Southern Edge)', &
1407 &
myrank, serror, string(1:lstr)
1420 IF (
PRESENT(b))
THEN
1426 ics=ioff+1+(i-imin)+mc
1431 IF (
PRESENT(c))
THEN
1437 ics=ioff+1+(i-imin)+mc
1442 IF (
PRESENT(d))
THEN
1448 ics=ioff+1+(i-imin)+mc
1457 CALL mpi_wait (nrequest, status(1,4), nerror)
1458 IF (nerror.ne.mpi_success)
THEN
1459 CALL mpi_error_string (nerror, string, lstr, ierror)
1460 lstr=len_trim(string)
1461 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Northern Edge)', &
1462 &
myrank, nerror, string(1:lstr)
1475 IF (
PRESENT(b))
THEN
1481 icn=ioff+1+(i-imin)+mc
1486 IF (
PRESENT(c))
THEN
1492 icn=ioff+1+(i-imin)+mc
1497 IF (
PRESENT(d))
THEN
1503 icn=ioff+1+(i-imin)+mc
1516 CALL wclock_off (ng, model, 60, __line__, myfile)
1520 END SUBROUTINE mp_exchange2d_xtr
1527 & Nghost, EW_periodic, NS_periodic, &
1540 logical,
intent(in) :: EW_periodic, NS_periodic
1542 integer,
intent(in) :: ng, tile, model, Nvar, boundary
1543 integer,
intent(in) :: LBij, UBij
1544 integer,
intent(in) :: Nghost
1546# ifdef ASSUMED_SHAPE
1547 real(r8),
intent(inout) :: A(LBij:)
1549 real(r8),
intent(inout),
optional :: B(LBij:)
1550 real(r8),
intent(inout),
optional :: C(LBij:)
1551 real(r8),
intent(inout),
optional :: D(LBij:)
1553 real(r8),
intent(inout) :: A(LBij:UBij)
1555 real(r8),
intent(inout),
optional :: B(LBij:UBij)
1556 real(r8),
intent(inout),
optional :: C(LBij:UBij)
1557 real(r8),
intent(inout),
optional :: D(LBij:UBij)
1562 logical :: Wexchange, Sexchange, Eexchange, Nexchange
1564 integer :: i, icS, icN
1565 integer :: j, jcW, jcE
1566 integer :: m, Ierror, Lstr, pp
1567 integer :: Wtile, GsendW, GrecvW, Wtag, Werror, Wrequest
1568 integer :: Stile, GsendS, GrecvS, Stag, Serror, Srequest
1569 integer :: Etile, GsendE, GrecvE, Etag, Eerror, Erequest
1570 integer :: Ntile, GsendN, GrecvN, Ntag, Nerror, Nrequest
1571 integer :: EWsize, sizeW, sizeE
1572 integer :: NSsize, sizeS, sizeN
1575 integer,
dimension(MPI_STATUS_SIZE,4) :: status
1578 real(r8),
dimension(Nvar*HaloBry(ng)) :: sendW, sendE
1579 real(r8),
dimension(Nvar*HaloBry(ng)) :: recvW, recvE
1581 real(r8),
dimension(Nvar*HaloBry(ng)) :: sendS, sendN
1582 real(r8),
dimension(Nvar*HaloBry(ng)) :: recvS, recvN
1584 character (len=MPI_MAX_ERROR_STRING) :: string
1586 character (len=*),
parameter :: MyFile = &
1587 & __FILE__//
", mp_exchange2d_bry"
1589# include "set_bounds.h"
1597 CALL wclock_on (ng, model, 63, __line__, myfile)
1608 & 4*
SIZE(sends))*kind(a),r8))
1611 & grecvw, gsendw, wtile, wexchange, &
1612 & grecve, gsende, etile, eexchange, &
1613 & grecvs, gsends, stile, sexchange, &
1614 & grecvn, gsendn, ntile, nexchange)
1618 wexchange=wexchange.and.((boundary.eq.
isouth).or. &
1620 eexchange=eexchange.and.((boundary.eq.
isouth).or. &
1622 sexchange=sexchange.and.((boundary.eq.
iwest).or. &
1623 & (boundary.eq.
ieast))
1624 nexchange=nexchange.and.((boundary.eq.
iwest).or. &
1625 & (boundary.eq.
ieast))
1636 IF (ew_periodic.or.ns_periodic)
THEN
1641 ewsize=nvar*(nghost+pp)
1642 nssize=nvar*(nghost+pp)
1643 IF (
SIZE(sende).lt.ewsize)
THEN
1644 WRITE (
stdout,10)
'EWsize = ', ewsize,
SIZE(sende)
1645 10
FORMAT (/,
' MP_EXCHANGE2D_BRY - communication buffer too ', &
1648 IF (
SIZE(sendn).lt.nssize)
THEN
1649 WRITE (
stdout,10)
'NSsize = ', nssize,
SIZE(sendn)
1665 IF (
PRESENT(b))
THEN
1673 IF (
PRESENT(c))
THEN
1681 IF (
PRESENT(d))
THEN
1700 IF (
PRESENT(b))
THEN
1708 IF (
PRESENT(c))
THEN
1716 IF (
PRESENT(d))
THEN
1732 CALL mpi_irecv (recvw, ewsize,
mp_float, wtile, etag, &
1736 CALL mpi_irecv (recve, ewsize,
mp_float, etile, wtag, &
1740 CALL mpi_send (sendw, sizew,
mp_float, wtile, wtag, &
1744 CALL mpi_send (sende, sizee,
mp_float, etile, etag, &
1755 CALL mpi_wait (wrequest, status(1,1), werror)
1756 IF (werror.ne.mpi_success)
THEN
1757 CALL mpi_error_string (werror, string, lstr, ierror)
1758 lstr=len_trim(string)
1759 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Western Edge)', &
1760 &
myrank, werror, string(1:lstr)
1761 20
FORMAT (/,
' MP_EXCHANGE2D_BRY - error during ',a, &
1762 &
' call, Node = ',i3.3,
' Error = ',i3,/,15x,a)
1773 IF (
PRESENT(b))
THEN
1780 IF (
PRESENT(c))
THEN
1787 IF (
PRESENT(d))
THEN
1798 CALL mpi_wait (erequest, status(1,3), eerror)
1799 IF (eerror.ne.mpi_success)
THEN
1800 CALL mpi_error_string (eerror, string, lstr, ierror)
1801 lstr=len_trim(string)
1802 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Eastern Edge)', &
1803 &
myrank, eerror, string(1:lstr)
1814 IF (
PRESENT(b))
THEN
1821 IF (
PRESENT(c))
THEN
1828 IF (
PRESENT(d))
THEN
1850 IF (
PRESENT(b))
THEN
1858 IF (
PRESENT(c))
THEN
1866 IF (
PRESENT(d))
THEN
1885 IF (
PRESENT(b))
THEN
1893 IF (
PRESENT(c))
THEN
1901 IF (
PRESENT(d))
THEN
1917 CALL mpi_irecv (recvs, nssize,
mp_float, stile, ntag, &
1921 CALL mpi_irecv (recvn, nssize,
mp_float, ntile, stag, &
1925 CALL mpi_send (sends, sizes,
mp_float, stile, stag, &
1929 CALL mpi_send (sendn, sizen,
mp_float, ntile, ntag, &
1940 CALL mpi_wait (srequest, status(1,2), serror)
1941 IF (serror.ne.mpi_success)
THEN
1942 CALL mpi_error_string (serror, string, lstr, ierror)
1943 lstr=len_trim(string)
1944 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Southern Edge)', &
1945 &
myrank, serror, string(1:lstr)
1956 IF (
PRESENT(b))
THEN
1963 IF (
PRESENT(c))
THEN
1970 IF (
PRESENT(d))
THEN
1981 CALL mpi_wait (nrequest, status(1,4), nerror)
1982 IF (nerror.ne.mpi_success)
THEN
1983 CALL mpi_error_string (nerror, string, lstr, ierror)
1984 lstr=len_trim(string)
1985 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Northern Edge)', &
1986 &
myrank, nerror, string(1:lstr)
1997 IF (
PRESENT(b))
THEN
2004 IF (
PRESENT(c))
THEN
2011 IF (
PRESENT(d))
THEN
2026 CALL wclock_off (ng, model, 63, __line__, myfile)
2034 & LBi, UBi, LBj, UBj, LBk, UBk, &
2035 & Nghost, EW_periodic, NS_periodic, &
2048 logical,
intent(in) :: EW_periodic, NS_periodic
2050 integer,
intent(in) :: ng, tile, model, Nvar
2051 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
2052 integer,
intent(in) :: Nghost
2054# ifdef ASSUMED_SHAPE
2055 real(r8),
intent(inout) :: A(LBi:,LBj:,LBk:)
2057 real(r8),
intent(inout),
optional :: B(LBi:,LBj:,LBk:)
2058 real(r8),
intent(inout),
optional :: C(LBi:,LBj:,LBk:)
2059 real(r8),
intent(inout),
optional :: D(LBi:,LBj:,LBk:)
2061 real(r8),
intent(inout) :: A(LBi:UBi,LBj:UBj,LBk:UBk)
2063 real(r8),
intent(inout),
optional :: B(LBi:UBi,LBj:UBj,LBk:UBk)
2064 real(r8),
intent(inout),
optional :: C(LBi:UBi,LBj:UBj,LBk:UBk)
2065 real(r8),
intent(inout),
optional :: D(LBi:UBi,LBj:UBj,LBk:UBk)
2070 logical :: Wexchange, Sexchange, Eexchange, Nexchange
2072 integer :: i, ikS, ikN, ioff, Imin, Imax, Ilen, IKlen
2073 integer :: j, jkW, jkE, joff, Jmin, Jmax, Jlen, JKlen
2074 integer :: k, kc, m, mc, Ierror, Klen, Lstr, pp
2075 integer :: Wtile, GsendW, GrecvW, Wtag, Werror, Wrequest
2076 integer :: Stile, GsendS, GrecvS, Stag, Serror, Srequest
2077 integer :: Etile, GsendE, GrecvE, Etag, Eerror, Erequest
2078 integer :: Ntile, GsendN, GrecvN, Ntag, Nerror, Nrequest
2079 integer :: EWsize, sizeW, sizeE
2080 integer :: NSsize, sizeS, sizeN
2083 integer,
dimension(MPI_STATUS_SIZE,4) :: status
2086 real(r8),
dimension(Nvar*HaloSizeJ(ng)* &
& (UBk-LBk+1)) :: sendW, sendE
2087 real(r8),
dimension(Nvar*HaloSizeJ(ng)* &
& (UBk-LBk+1)) :: recvW, recvE
2089 real(r8),
dimension(Nvar*HaloSizeI(ng)* &
& (UBk-LBk+1)) :: sendS, sendN
2090 real(r8),
dimension(Nvar*HaloSizeI(ng)* &
& (UBk-LBk+1)) :: recvS, recvN
2092 character (len=MPI_MAX_ERROR_STRING) :: string
2094 character (len=*),
parameter :: MyFile = &
2095 & __FILE__//
", mp_exchange3d"
2097# include "set_bounds.h"
2105 CALL wclock_on (ng, model, 61, __line__, myfile)
2116 & 4*
SIZE(sends))*kind(a),r8))
2119 & grecvw, gsendw, wtile, wexchange, &
2120 & grecve, gsende, etile, eexchange, &
2121 & grecvs, gsends, stile, sexchange, &
2122 & grecvn, gsendn, ntile, nexchange)
2142 IF (ew_periodic.or.ns_periodic)
THEN
2147 ewsize=nvar*(nghost+pp)*jklen
2148 nssize=nvar*(nghost+pp)*iklen
2149 IF (
SIZE(sende).lt.ewsize)
THEN
2150 WRITE (
stdout,10)
'EWsize = ', ewsize,
SIZE(sende)
2151 10
FORMAT (/,
' MP_EXCHANGE3D - communication buffer too small, ', &
2154 IF (
SIZE(sendn).lt.nssize)
THEN
2155 WRITE (
stdout,10)
'NSsize = ', nssize,
SIZE(sendn)
2176 IF (
PRESENT(b))
THEN
2185 jkw=joff+1+(j-jmin)+kc
2191 IF (
PRESENT(c))
THEN
2200 jkw=joff+1+(j-jmin)+kc
2206 IF (
PRESENT(d))
THEN
2215 jkw=joff+1+(j-jmin)+kc
2237 IF (
PRESENT(b))
THEN
2246 jke=joff+1+(j-jmin)+kc
2252 IF (
PRESENT(c))
THEN
2261 jke=joff+1+(j-jmin)+kc
2267 IF (
PRESENT(d))
THEN
2276 jke=joff+1+(j-jmin)+kc
2290 CALL mpi_irecv (recvw, ewsize,
mp_float, wtile, etag, &
2294 CALL mpi_irecv (recve, ewsize,
mp_float, etile, wtag, &
2298 CALL mpi_send (sendw, sizew,
mp_float, wtile, wtag, &
2302 CALL mpi_send (sende, sizee,
mp_float, etile, etag, &
2313 CALL mpi_wait (wrequest, status(1,1), werror)
2314 IF (werror.ne.mpi_success)
THEN
2315 CALL mpi_error_string (werror, string, lstr, ierror)
2316 lstr=len_trim(string)
2317 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Western Edge)', &
2318 &
myrank, werror, string(1:lstr)
2334 IF (
PRESENT(b))
THEN
2342 jkw=joff+1+(j-jmin)+kc
2348 IF (
PRESENT(c))
THEN
2356 jkw=joff+1+(j-jmin)+kc
2362 IF (
PRESENT(d))
THEN
2370 jkw=joff+1+(j-jmin)+kc
2380 CALL mpi_wait (erequest, status(1,3), eerror)
2381 IF (eerror.ne.mpi_success)
THEN
2382 CALL mpi_error_string (eerror, string, lstr, ierror)
2383 lstr=len_trim(string)
2384 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Eastern Edge)', &
2385 &
myrank, eerror, string(1:lstr)
2386 20
FORMAT (/,
' MP_EXCHANGE3D - error during ',a, &
2387 &
' call, Node = ',i3.3,
' Error = ',i3,/,15x,a)
2403 IF (
PRESENT(b))
THEN
2411 jke=joff+1+(j-jmin)+kc
2417 IF (
PRESENT(c))
THEN
2425 jke=joff+1+(j-jmin)+kc
2431 IF (
PRESENT(d))
THEN
2439 jke=joff+1+(j-jmin)+kc
2465 IF (
PRESENT(b))
THEN
2474 iks=ioff+1+(i-imin)+kc
2480 IF (
PRESENT(c))
THEN
2489 iks=ioff+1+(i-imin)+kc
2495 IF (
PRESENT(d))
THEN
2504 iks=ioff+1+(i-imin)+kc
2526 IF (
PRESENT(b))
THEN
2535 ikn=ioff+1+(i-imin)+kc
2541 IF (
PRESENT(c))
THEN
2550 ikn=ioff+1+(i-imin)+kc
2556 IF (
PRESENT(d))
THEN
2565 ikn=ioff+1+(i-imin)+kc
2579 CALL mpi_irecv (recvs, nssize,
mp_float, stile, ntag, &
2583 CALL mpi_irecv (recvn, nssize,
mp_float, ntile, stag, &
2587 CALL mpi_send (sends, sizes,
mp_float, stile, stag, &
2591 CALL mpi_send (sendn, sizen,
mp_float, ntile, ntag, &
2602 CALL mpi_wait (srequest, status(1,2), serror)
2603 IF (serror.ne.mpi_success)
THEN
2604 CALL mpi_error_string (serror, string, lstr, ierror)
2605 lstr=len_trim(string)
2606 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Southern Edge)', &
2607 &
myrank, serror, string(1:lstr)
2623 IF (
PRESENT(b))
THEN
2631 iks=ioff+1+(i-imin)+kc
2637 IF (
PRESENT(c))
THEN
2645 iks=ioff+1+(i-imin)+kc
2651 IF (
PRESENT(d))
THEN
2659 iks=ioff+1+(i-imin)+kc
2669 CALL mpi_wait (nrequest, status(1,4), nerror)
2670 IF (nerror.ne.mpi_success)
THEN
2671 CALL mpi_error_string (nerror, string, lstr, ierror)
2672 lstr=len_trim(string)
2673 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Northern Edge)', &
2674 &
myrank, nerror, string(1:lstr)
2690 IF (
PRESENT(b))
THEN
2698 ikn=ioff+1+(i-imin)+kc
2704 IF (
PRESENT(c))
THEN
2712 ikn=ioff+1+(i-imin)+kc
2718 IF (
PRESENT(d))
THEN
2726 ikn=ioff+1+(i-imin)+kc
2740 CALL wclock_off (ng, model, 61, __line__, myfile)
2749 & LBij, UBij, LBk, UBk, &
2750 & Nghost, EW_periodic, NS_periodic, &
2763 logical,
intent(in) :: EW_periodic, NS_periodic
2765 integer,
intent(in) :: ng, tile, model, Nvar, boundary
2766 integer,
intent(in) :: LBij, UBij, LBk, UBk
2767 integer,
intent(in) :: Nghost
2769# ifdef ASSUMED_SHAPE
2770 real(r8),
intent(inout) :: A(LBij:,LBk:)
2772 real(r8),
intent(inout),
optional :: B(LBij:,LBk:)
2773 real(r8),
intent(inout),
optional :: C(LBij:,LBk:)
2774 real(r8),
intent(inout),
optional :: D(LBij:,LBk:)
2776 real(r8),
intent(inout) :: A(LBij:UBij,LBk:UBk)
2778 real(r8),
intent(inout),
optional :: B(LBij:UBij,LBk:UBk)
2779 real(r8),
intent(inout),
optional :: C(LBij:UBij,LBk:UBk)
2780 real(r8),
intent(inout),
optional :: D(LBij:UBij,LBk:UBk)
2785 logical :: Wexchange, Sexchange, Eexchange, Nexchange
2787 integer :: i, ikS, ikN, ioff
2788 integer :: j, jkW, jkE, joff
2789 integer :: k, m, mc, Ierror, Klen, Lstr, pp
2790 integer :: Wtile, GsendW, GrecvW, Wtag, Werror, Wrequest
2791 integer :: Stile, GsendS, GrecvS, Stag, Serror, Srequest
2792 integer :: Etile, GsendE, GrecvE, Etag, Eerror, Erequest
2793 integer :: Ntile, GsendN, GrecvN, Ntag, Nerror, Nrequest
2794 integer :: EWsize, sizeW, sizeE
2795 integer :: NSsize, sizeS, sizeN
2798 integer,
dimension(MPI_STATUS_SIZE,4) :: status
2801 real(r8),
dimension(Nvar*HaloBry(ng)*(UBk-LBk+1)) :: sendW, sendE
2802 real(r8),
dimension(Nvar*HaloBry(ng)*(UBk-LBk+1)) :: recvW, recvE
2803 real(r8),
dimension(Nvar*HaloBry(ng)*(UBk-LBk+1)) :: sendS, sendN
2804 real(r8),
dimension(Nvar*HaloBry(ng)*(UBk-LBk+1)) :: recvS, recvN
2806 character (len=MPI_MAX_ERROR_STRING) :: string
2808 character (len=*),
parameter :: MyFile = &
2809 & __FILE__//
", mp_exchange3d_bry"
2811# include "set_bounds.h"
2819 CALL wclock_on (ng, model, 63, __line__, myfile)
2830 & 4*
SIZE(sends))*kind(a),r8))
2833 & grecvw, gsendw, wtile, wexchange, &
2834 & grecve, gsende, etile, eexchange, &
2835 & grecvs, gsends, stile, sexchange, &
2836 & grecvn, gsendn, ntile, nexchange)
2840 wexchange=wexchange.and.((boundary.eq.
isouth).or. &
2842 eexchange=eexchange.and.((boundary.eq.
isouth).or. &
2844 sexchange=sexchange.and.((boundary.eq.
iwest).or. &
2845 & (boundary.eq.
ieast))
2846 nexchange=nexchange.and.((boundary.eq.
iwest).or. &
2847 & (boundary.eq.
ieast))
2859 IF (ew_periodic.or.ns_periodic)
THEN
2864 ewsize=nvar*(nghost+pp)*klen
2865 nssize=nvar*(nghost+pp)*klen
2866 IF (
SIZE(sende).lt.ewsize)
THEN
2867 WRITE (
stdout,10)
'EWsize = ', ewsize,
SIZE(sende)
2868 10
FORMAT (/,
' MP_EXCHANGE3D_BRY - communication buffer too ', &
2869 &
'small, ', a, 2i8)
2871 IF (
SIZE(sendn).lt.nssize)
THEN
2872 WRITE (
stdout,10)
'NSsize = ', nssize,
SIZE(sendn)
2890 IF (
PRESENT(b))
THEN
2897 jkw=joff+1+(k-lbk)+mc
2902 IF (
PRESENT(c))
THEN
2909 jkw=joff+1+(k-lbk)+mc
2914 IF (
PRESENT(d))
THEN
2921 jkw=joff+1+(k-lbk)+mc
2939 IF (
PRESENT(b))
THEN
2946 jke=joff+1+(k-lbk)+mc
2951 IF (
PRESENT(c))
THEN
2958 jke=joff+1+(k-lbk)+mc
2963 IF (
PRESENT(d))
THEN
2970 jke=joff+1+(k-lbk)+mc
2983 CALL mpi_irecv (recvw, ewsize,
mp_float, wtile, etag, &
2987 CALL mpi_irecv (recve, ewsize,
mp_float, etile, wtag, &
2991 CALL mpi_send (sendw, sizew,
mp_float, wtile, wtag, &
2995 CALL mpi_send (sende, sizee,
mp_float, etile, etag, &
3006 CALL mpi_wait (wrequest, status(1,1), werror)
3007 IF (werror.ne.mpi_success)
THEN
3008 CALL mpi_error_string (werror, string, lstr, ierror)
3009 lstr=len_trim(string)
3010 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Western Edge)', &
3011 &
myrank, werror, string(1:lstr)
3024 IF (
PRESENT(b))
THEN
3030 jkw=joff+1+(k-lbk)+mc
3035 IF (
PRESENT(c))
THEN
3041 jkw=joff+1+(k-lbk)+mc
3046 IF (
PRESENT(d))
THEN
3052 jkw=joff+1+(k-lbk)+mc
3061 CALL mpi_wait (erequest, status(1,3), eerror)
3062 IF (eerror.ne.mpi_success)
THEN
3063 CALL mpi_error_string (eerror, string, lstr, ierror)
3064 lstr=len_trim(string)
3065 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Eastern Edge)', &
3066 &
myrank, eerror, string(1:lstr)
3067 20
FORMAT (/,
' MP_EXCHANGE3D_BRY - error during ',a, &
3068 &
' call, Node = ',i3.3,
' Error = ',i3,/,15x,a)
3081 IF (
PRESENT(b))
THEN
3087 jke=joff+1+(k-lbk)+mc
3092 IF (
PRESENT(c))
THEN
3098 jke=joff+1+(k-lbk)+mc
3103 IF (
PRESENT(d))
THEN
3109 jke=joff+1+(k-lbk)+mc
3131 IF (
PRESENT(b))
THEN
3138 iks=ioff+1+(k-lbk)+mc
3143 IF (
PRESENT(c))
THEN
3150 iks=ioff+1+(k-lbk)+mc
3155 IF (
PRESENT(d))
THEN
3162 iks=ioff+1+(k-lbk)+mc
3180 IF (
PRESENT(b))
THEN
3187 ikn=ioff+1+(k-lbk)+mc
3192 IF (
PRESENT(c))
THEN
3199 ikn=ioff+1+(k-lbk)+mc
3204 IF (
PRESENT(d))
THEN
3211 ikn=ioff+1+(k-lbk)+mc
3224 CALL mpi_irecv (recvs, nssize,
mp_float, stile, ntag, &
3228 CALL mpi_irecv (recvn, nssize,
mp_float, ntile, stag, &
3232 CALL mpi_send (sends, sizes,
mp_float, stile, stag, &
3236 CALL mpi_send (sendn, sizen,
mp_float, ntile, ntag, &
3247 CALL mpi_wait (srequest, status(1,2), serror)
3248 IF (serror.ne.mpi_success)
THEN
3249 CALL mpi_error_string (serror, string, lstr, ierror)
3250 lstr=len_trim(string)
3251 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Southern Edge)', &
3252 &
myrank, serror, string(1:lstr)
3265 IF (
PRESENT(b))
THEN
3271 iks=ioff+1+(k-lbk)+mc
3276 IF (
PRESENT(c))
THEN
3282 iks=ioff+1+(k-lbk)+mc
3287 IF (
PRESENT(d))
THEN
3293 iks=ioff+1+(k-lbk)+mc
3302 CALL mpi_wait (nrequest, status(1,4), nerror)
3303 IF (nerror.ne.mpi_success)
THEN
3304 CALL mpi_error_string (nerror, string, lstr, ierror)
3305 lstr=len_trim(string)
3306 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Northern Edge)', &
3307 &
myrank, nerror, string(1:lstr)
3320 IF (
PRESENT(b))
THEN
3326 ikn=ioff+1+(k-lbk)+mc
3331 IF (
PRESENT(c))
THEN
3337 ikn=ioff+1+(k-lbk)+mc
3342 IF (
PRESENT(d))
THEN
3348 ikn=ioff+1+(k-lbk)+mc
3361 CALL wclock_off (ng, model, 63, __line__, myfile)
3370 & LBi, UBi, LBj, UBj, LBk, UBk, LBt, UBt, &
3371 & Nghost, EW_periodic, NS_periodic, &
3384 logical,
intent(in) :: EW_periodic, NS_periodic
3386 integer,
intent(in) :: ng, tile, model, Nvar
3387 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk, LBt, UBt
3388 integer,
intent(in) :: Nghost
3390# ifdef ASSUMED_SHAPE
3391 real(r8),
intent(inout) :: A(LBi:,LBj:,LBk:,LBt:)
3393 real(r8),
intent(inout),
optional :: B(LBi:,LBj:,LBk:,LBt:)
3394 real(r8),
intent(inout),
optional :: C(LBi:,LBj:,LBk:,LBt:)
3397 real(r8),
intent(inout) :: A(LBi:UBi,LBj:UBj,LBk:UBk,LBt:UBt)
3399 real(r8),
intent(inout),
optional :: &
3400 & B(LBi:UBi,LBj:UBj,LBk:UBk,LBt:UBt)
3401 real(r8),
intent(inout),
optional :: &
3402 & C(LBi:UBi,LBj:UBj,LBk:UBk,LBt:UBt)
3407 logical :: Wexchange, Sexchange, Eexchange, Nexchange
3409 integer :: i, ikS, ikN, ioff, Imin, Imax, Ilen, IKlen, IKTlen
3410 integer :: j, jkW, jkE, joff, Jmin, Jmax, Jlen, JKlen, JKTlen
3411 integer :: k, kc, m, mc, Ierror, Klen, Lstr, Tlen, pp
3413 integer :: Wtile, GsendW, GrecvW, Wtag, Werror, Wrequest
3414 integer :: Stile, GsendS, GrecvS, Stag, Serror, Srequest
3415 integer :: Etile, GsendE, GrecvE, Etag, Eerror, Erequest
3416 integer :: Ntile, GsendN, GrecvN, Ntag, Nerror, Nrequest
3417 integer :: EWsize, sizeW, sizeE
3418 integer :: NSsize, sizeS, sizeN
3421 integer,
dimension(MPI_STATUS_SIZE,4) :: status
3424 real(r8),
dimension(Nvar*HaloSizeJ(ng)* &
& (UBk-LBk+1)*(UBt-LBt+1)) :: sendW, sendE
3425 real(r8),
dimension(Nvar*HaloSizeJ(ng)* &
& (UBk-LBk+1)*(UBt-LBt+1)) :: recvW, recvE
3427 real(r8),
dimension(Nvar*HaloSizeI(ng)* &
& (UBk-LBk+1)*(UBt-LBt+1)) :: sendS, sendN
3428 real(r8),
dimension(Nvar*HaloSizeI(ng)* &
& (UBk-LBk+1)*(UBt-LBt+1)) :: recvS, recvN
3430 character (len=MPI_MAX_ERROR_STRING) :: string
3432 character (len=*),
parameter :: MyFile = &
3433 & __FILE__//
", mp_exchange4d"
3435# include "set_bounds.h"
3443 CALL wclock_on (ng, model, 62, __line__, myfile)
3454 & 4*
SIZE(sends))*kind(a),r8))
3457 & grecvw, gsendw, wtile, wexchange, &
3458 & grecve, gsende, etile, eexchange, &
3459 & grecvs, gsends, stile, sexchange, &
3460 & grecvn, gsendn, ntile, nexchange)
3483 IF (ew_periodic.or.ns_periodic)
THEN
3488 ewsize=nvar*(nghost+pp)*jktlen
3489 nssize=nvar*(nghost+pp)*iktlen
3490 IF (
SIZE(sende).lt.ewsize)
THEN
3491 WRITE (
stdout,10)
'EWsize = ', ewsize,
SIZE(sende)
3492 10
FORMAT (/,
' MP_EXCHANGE4D - communication buffer too small, ', &
3495 IF (
SIZE(sendn).lt.nssize)
THEN
3496 WRITE (
stdout,10)
'NSsize = ', nssize,
SIZE(sendn)
3515 sendw(jkw)=a(i,j,k,l)
3520 IF (
PRESENT(b))
THEN
3531 jkw=joff+1+(j-jmin)+kc
3532 sendw(jkw)=b(i,j,k,l)
3538 IF (
PRESENT(c))
THEN
3549 jkw=joff+1+(j-jmin)+kc
3550 sendw(jkw)=c(i,j,k,l)
3570 sende(jke)=a(i,j,k,l)
3575 IF (
PRESENT(b))
THEN
3586 jke=joff+1+(j-jmin)+kc
3587 sende(jke)=b(i,j,k,l)
3593 IF (
PRESENT(c))
THEN
3604 jke=joff+1+(j-jmin)+kc
3605 sende(jke)=c(i,j,k,l)
3619 CALL mpi_irecv (recvw, ewsize,
mp_float, wtile, etag, &
3623 CALL mpi_irecv (recve, ewsize,
mp_float, etile, wtag, &
3627 CALL mpi_send (sendw, sizew,
mp_float, wtile, wtag, &
3631 CALL mpi_send (sende, sizee,
mp_float, etile, etag, &
3642 CALL mpi_wait (wrequest, status(1,1), werror)
3643 IF (werror.ne.mpi_success)
THEN
3644 CALL mpi_error_string (werror, string, lstr, ierror)
3645 lstr=len_trim(string)
3646 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Western Edge)', &
3647 &
myrank, werror, string(1:lstr)
3648 20
FORMAT (/,
' MP_EXCHANGE4D - error during ',a, &
3649 &
' call, Node = ',i3.3,
' Error = ',i3,/,15x,a)
3655 mc=(grecvw-m)*jktlen
3663 a(i,j,k,l)=recvw(jkw)
3668 IF (
PRESENT(b))
THEN
3671 mc=(grecvw-m)*jktlen
3678 jkw=joff+1+(j-jmin)+kc
3679 b(i,j,k,l)=recvw(jkw)
3685 IF (
PRESENT(c))
THEN
3688 mc=(grecvw-m)*jktlen
3695 jkw=joff+1+(j-jmin)+kc
3696 c(i,j,k,l)=recvw(jkw)
3706 CALL mpi_wait (erequest, status(1,3), eerror)
3707 IF (eerror.ne.mpi_success)
THEN
3708 CALL mpi_error_string (eerror, string, lstr, ierror)
3709 lstr=len_trim(string)
3710 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Eastern Edge)', &
3711 &
myrank, eerror, string(1:lstr)
3725 a(i,j,k,l)=recve(jke)
3730 IF (
PRESENT(b))
THEN
3740 jke=joff+1+(j-jmin)+kc
3741 b(i,j,k,l)=recve(jke)
3747 IF (
PRESENT(c))
THEN
3757 jke=joff+1+(j-jmin)+kc
3758 c(i,j,k,l)=recve(jke)
3782 sends(iks)=a(i,j,k,l)
3787 IF (
PRESENT(b))
THEN
3798 iks=ioff+1+(i-imin)+kc
3799 sends(iks)=b(i,j,k,l)
3805 IF (
PRESENT(c))
THEN
3816 iks=ioff+1+(i-imin)+kc
3817 sends(iks)=c(i,j,k,l)
3837 sendn(ikn)=a(i,j,k,l)
3842 IF (
PRESENT(b))
THEN
3853 ikn=ioff+1+(i-imin)+kc
3854 sendn(ikn)=b(i,j,k,l)
3860 IF (
PRESENT(c))
THEN
3871 ikn=ioff+1+(i-imin)+kc
3872 sendn(ikn)=c(i,j,k,l)
3886 CALL mpi_irecv (recvs, nssize,
mp_float, stile, ntag, &
3890 CALL mpi_irecv (recvn, nssize,
mp_float, ntile, stag, &
3894 CALL mpi_send (sends, sizes,
mp_float, stile, stag, &
3898 CALL mpi_send (sendn, sizen,
mp_float, ntile, ntag, &
3909 CALL mpi_wait (srequest, status(1,2), serror)
3910 IF (serror.ne.mpi_success)
THEN
3911 CALL mpi_error_string (serror, string, lstr, ierror)
3912 lstr=len_trim(string)
3913 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Southern Edge)', &
3914 &
myrank, serror, string(1:lstr)
3920 mc=(grecvs-m)*iktlen
3928 a(i,j,k,l)=recvs(iks)
3933 IF (
PRESENT(b))
THEN
3936 mc=(grecvs-m)*iktlen
3943 iks=ioff+1+(i-imin)+kc
3944 b(i,j,k,l)=recvs(iks)
3950 IF (
PRESENT(c))
THEN
3953 mc=(grecvs-m)*iktlen
3960 iks=ioff+1+(i-imin)+kc
3961 c(i,j,k,l)=recvs(iks)
3971 CALL mpi_wait (nrequest, status(1,4), nerror)
3972 IF (nerror.ne.mpi_success)
THEN
3973 CALL mpi_error_string (nerror, string, lstr, ierror)
3974 lstr=len_trim(string)
3975 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Northern Edge)', &
3976 &
myrank, nerror, string(1:lstr)
3990 a(i,j,k,l)=recvn(ikn)
3995 IF (
PRESENT(b))
THEN
4005 ikn=ioff+1+(i-imin)+kc
4006 b(i,j,k,l)=recvn(ikn)
4012 IF (
PRESENT(c))
THEN
4022 ikn=ioff+1+(i-imin)+kc
4023 c(i,j,k,l)=recvn(ikn)
4037 CALL wclock_off (ng, model, 62, __line__, myfile)
4047 & LBi, UBi, LBj, UBj, &
4048 & Nghost, EW_periodic, NS_periodic, &
4049 & ad_A, ad_B, ad_C, ad_D)
4061 logical,
intent(in) :: EW_periodic, NS_periodic
4063 integer,
intent(in) :: ng, tile, model, Nvar
4064 integer,
intent(in) :: LBi, UBi, LBj, UBj
4065 integer,
intent(in) :: Nghost
4067# ifdef ASSUMED_SHAPE
4068 real(r8),
intent(inout) :: ad_A(LBi:,LBj:)
4070 real(r8),
intent(inout),
optional :: ad_B(LBi:,LBj:)
4071 real(r8),
intent(inout),
optional :: ad_C(LBi:,LBj:)
4072 real(r8),
intent(inout),
optional :: ad_D(LBi:,LBj:)
4074 real(r8),
intent(inout) :: ad_A(LBi:UBi,LBj:UBj)
4076 real(r8),
intent(inout),
optional :: ad_B(LBi:UBi,LBj:UBj)
4077 real(r8),
intent(inout),
optional :: ad_C(LBi:UBi,LBj:UBj)
4078 real(r8),
intent(inout),
optional :: ad_D(LBi:UBi,LBj:UBj)
4083 logical :: Wexchange, Sexchange, Eexchange, Nexchange
4085 integer :: i, icS, icN, ioff, Imin, Imax, Ilen
4086 integer :: j, jcW, jcE, joff, Jmin, Jmax, Jlen
4087 integer :: m, mc, Ierror, Lstr, pp
4088 integer :: Wtile, GsendW, GrecvW, Wtag, Werror, Wrequest
4089 integer :: Stile, GsendS, GrecvS, Stag, Serror, Srequest
4090 integer :: Etile, GsendE, GrecvE, Etag, Eerror, Erequest
4091 integer :: Ntile, GsendN, GrecvN, Ntag, Nerror, Nrequest
4092 integer :: BufferSizeEW, EWsize, sizeW, sizeE
4093 integer :: BufferSizeNS, NSsize, sizeS, sizeN
4096 integer,
dimension(MPI_STATUS_SIZE,4) :: status
4099 real(r8),
dimension(Nvar*HaloSizeJ(ng)) :: sendW, sendE
4100 real(r8),
dimension(Nvar*HaloSizeJ(ng)) :: recvW, recvE
4102 real(r8),
dimension(Nvar*HaloSizeI(ng)) :: sendS, sendN
4103 real(r8),
dimension(Nvar*HaloSizeI(ng)) :: recvS, recvN
4105 character (len=MPI_MAX_ERROR_STRING) :: string
4107 character (len=*),
parameter :: MyFile = &
4108 & __FILE__//
", ad_mp_exchange2d"
4110# include "set_bounds.h"
4118 CALL wclock_on (ng, model, 60, __line__, myfile)
4129 & 4*
SIZE(sends))*kind(ad_a),r8))
4132 & grecvw, gsendw, wtile, wexchange, &
4133 & grecve, gsende, etile, eexchange, &
4134 & grecvs, gsends, stile, sexchange, &
4135 & grecvn, gsendn, ntile, nexchange)
4152 IF (ew_periodic.or.ns_periodic)
THEN
4157 nssize=nvar*(nghost+pp)*ilen
4158 ewsize=nvar*(nghost+pp)*jlen
4161 IF (
SIZE(sende).lt.ewsize)
THEN
4162 WRITE (
stdout,10)
'EWsize = ', ewsize,
SIZE(sende)
4163 10
FORMAT (/,
' AD_MP_EXCHANGE2D - communication buffer too', &
4164 &
' small, ',a, 2i8)
4166 IF (
SIZE(sendn).lt.nssize)
THEN
4167 WRITE (
stdout,10)
'NSsize = ', nssize,
SIZE(sendn)
4188 recvn(icn)=ad_a(i,j)
4192 IF (
PRESENT(ad_b))
THEN
4199 icn=ioff+1+(i-imin)+mc
4202 recvn(icn)=ad_b(i,j)
4207 IF (
PRESENT(ad_c))
THEN
4214 icn=ioff+1+(i-imin)+mc
4217 recvn(icn)=ad_c(i,j)
4222 IF (
PRESENT(ad_d))
THEN
4229 icn=ioff+1+(i-imin)+mc
4232 recvn(icn)=ad_d(i,j)
4253 recvs(ics)=ad_a(i,j)
4257 IF (
PRESENT(ad_b))
THEN
4264 ics=ioff+1+(i-imin)+mc
4267 recvs(ics)=ad_b(i,j)
4272 IF (
PRESENT(ad_c))
THEN
4279 ics=ioff+1+(i-imin)+mc
4282 recvs(ics)=ad_c(i,j)
4287 IF (
PRESENT(ad_d))
THEN
4294 ics=ioff+1+(i-imin)+mc
4297 recvs(ics)=ad_d(i,j)
4313 CALL mpi_irecv (sends, nssize,
mp_float, stile, ntag, &
4320 CALL mpi_irecv (sendn, nssize,
mp_float, ntile, stag, &
4327 CALL mpi_send (recvs, sizes,
mp_float, stile, stag, &
4334 CALL mpi_send (recvn, sizen,
mp_float, ntile, ntag, &
4343 CALL mpi_wait (srequest, status(1,2), serror)
4344 IF (serror.ne.mpi_success)
THEN
4345 CALL mpi_error_string (serror, string, lstr, ierror)
4346 lstr=len_trim(string)
4347 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Southern Edge)', &
4348 &
myrank, serror, string(1:lstr)
4349 20
FORMAT (/,
' AD_MP_EXCHANGE2D - error during ',a,
' call,', &
4350 &
' Node = ', i3.3,
' Error = ',i3,/,18x,a)
4362 ad_a(i,j)=ad_a(i,j)+sends(ics)
4366 IF (
PRESENT(ad_b))
THEN
4372 ics=ioff+1+(i-imin)+mc
4375 ad_b(i,j)=ad_b(i,j)+sends(ics)
4380 IF (
PRESENT(ad_c))
THEN
4386 ics=ioff+1+(i-imin)+mc
4389 ad_c(i,j)=ad_c(i,j)+sends(ics)
4394 IF (
PRESENT(ad_d))
THEN
4400 ics=ioff+1+(i-imin)+mc
4403 ad_d(i,j)=ad_d(i,j)+sends(ics)
4412 CALL mpi_wait (nrequest, status(1,4), nerror)
4413 IF (nerror.ne.mpi_success)
THEN
4414 CALL mpi_error_string (nerror, string, lstr, ierror)
4415 lstr=len_trim(string)
4416 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Northern Edge)', &
4417 &
myrank, nerror, string(1:lstr)
4429 ad_a(i,j)=ad_a(i,j)+sendn(icn)
4433 IF (
PRESENT(ad_b))
THEN
4439 icn=ioff+1+(i-imin)+mc
4442 ad_b(i,j)=ad_b(i,j)+sendn(icn)
4447 IF (
PRESENT(ad_c))
THEN
4453 icn=ioff+1+(i-imin)+mc
4456 ad_c(i,j)=ad_c(i,j)+sendn(icn)
4461 IF (
PRESENT(ad_d))
THEN
4467 icn=ioff+1+(i-imin)+mc
4470 ad_d(i,j)=ad_d(i,j)+sendn(icn)
4495 recve(jce)=ad_a(i,j)
4499 IF (
PRESENT(ad_b))
THEN
4506 jce=joff+1+(j-jmin)+mc
4509 recve(jce)=ad_b(i,j)
4514 IF (
PRESENT(ad_c))
THEN
4521 jce=joff+1+(j-jmin)+mc
4524 recve(jce)=ad_c(i,j)
4529 IF (
PRESENT(ad_d))
THEN
4536 jce=joff+1+(j-jmin)+mc
4539 recve(jce)=ad_d(i,j)
4560 recvw(jcw)=ad_a(i,j)
4564 IF (
PRESENT(ad_b))
THEN
4571 jcw=joff+1+(j-jmin)+mc
4574 recvw(jcw)=ad_b(i,j)
4579 IF (
PRESENT(ad_c))
THEN
4586 jcw=joff+1+(j-jmin)+mc
4589 recvw(jcw)=ad_c(i,j)
4594 IF (
PRESENT(ad_d))
THEN
4601 jcw=joff+1+(j-jmin)+mc
4604 recvw(jcw)=ad_d(i,j)
4620 CALL mpi_irecv (sendw, ewsize,
mp_float, wtile, etag, &
4627 CALL mpi_irecv (sende, ewsize,
mp_float, etile, wtag, &
4634 CALL mpi_send (recvw, sizew,
mp_float, wtile, wtag, &
4641 CALL mpi_send (recve, sizee,
mp_float, etile, etag, &
4650 CALL mpi_wait (wrequest, status(1,1), werror)
4651 IF (werror.ne.mpi_success)
THEN
4652 CALL mpi_error_string (werror, string, lstr, ierror)
4653 lstr=len_trim(string)
4654 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Western Edge)', &
4655 &
myrank, werror, string(1:lstr)
4667 ad_a(i,j)=ad_a(i,j)+sendw(jcw)
4671 IF (
PRESENT(ad_b))
THEN
4677 jcw=joff+1+(j-jmin)+mc
4680 ad_b(i,j)=ad_b(i,j)+sendw(jcw)
4685 IF (
PRESENT(ad_c))
THEN
4691 jcw=joff+1+(j-jmin)+mc
4694 ad_c(i,j)=ad_c(i,j)+sendw(jcw)
4699 IF (
PRESENT(ad_d))
THEN
4705 jcw=joff+1+(j-jmin)+mc
4708 ad_d(i,j)=ad_d(i,j)+sendw(jcw)
4717 CALL mpi_wait (erequest, status(1,3), eerror)
4718 IF (eerror.ne.mpi_success)
THEN
4719 CALL mpi_error_string (eerror, string, lstr, ierror)
4720 lstr=len_trim(string)
4721 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Eastern Edge)', &
4722 &
myrank, eerror, string(1:lstr)
4734 ad_a(i,j)=ad_a(i,j)+sende(jce)
4738 IF (
PRESENT(ad_b))
THEN
4744 jce=joff+1+(j-jmin)+mc
4747 ad_b(i,j)=ad_b(i,j)+sende(jce)
4752 IF (
PRESENT(ad_c))
THEN
4758 jce=joff+1+(j-jmin)+mc
4761 ad_c(i,j)=ad_c(i,j)+sende(jce)
4766 IF (
PRESENT(ad_d))
THEN
4772 jce=joff+1+(j-jmin)+mc
4775 ad_d(i,j)=ad_d(i,j)+sende(jce)
4788 CALL wclock_off (ng, model, 60, __line__, myfile)
4798 & Nghost, EW_periodic, NS_periodic,&
4799 & ad_A, ad_B, ad_C, ad_D)
4811 logical,
intent(in) :: EW_periodic, NS_periodic
4813 integer,
intent(in) :: ng, tile, model, Nvar, boundary
4814 integer,
intent(in) :: LBij, UBij
4815 integer,
intent(in) :: Nghost
4817# ifdef ASSUMED_SHAPE
4818 real(r8),
intent(inout) :: ad_A(LBij:)
4820 real(r8),
intent(inout),
optional :: ad_B(LBij:)
4821 real(r8),
intent(inout),
optional :: ad_C(LBij:)
4822 real(r8),
intent(inout),
optional :: ad_D(LBij:)
4824 real(r8),
intent(inout) :: ad_A(LBij:UBij)
4826 real(r8),
intent(inout),
optional :: ad_B(LBij:UBij)
4827 real(r8),
intent(inout),
optional :: ad_C(LBij:UBij)
4828 real(r8),
intent(inout),
optional :: ad_D(LBij:UBij)
4833 logical :: Wexchange, Sexchange, Eexchange, Nexchange
4835 integer :: i, icS, icN
4836 integer :: j, jcW, jcE
4837 integer :: m, Ierror, Lstr, pp
4838 integer :: Wtile, GsendW, GrecvW, Wtag, Werror, Wrequest
4839 integer :: Stile, GsendS, GrecvS, Stag, Serror, Srequest
4840 integer :: Etile, GsendE, GrecvE, Etag, Eerror, Erequest
4841 integer :: Ntile, GsendN, GrecvN, Ntag, Nerror, Nrequest
4842 integer :: BufferSizeEW, EWsize, sizeW, sizeE
4843 integer :: BufferSizeNS, NSsize, sizeS, sizeN
4846 integer,
dimension(MPI_STATUS_SIZE,4) :: status
4849 real(r8),
dimension(Nvar*HaloBry(ng)) :: sendW, sendE
4850 real(r8),
dimension(Nvar*HaloBry(ng)) :: recvW, recvE
4852 real(r8),
dimension(Nvar*HaloBry(ng)) :: sendS, sendN
4853 real(r8),
dimension(Nvar*HaloBry(ng)) :: recvS, recvN
4855 character (len=MPI_MAX_ERROR_STRING) :: string
4857 character (len=*),
parameter :: MyFile = &
4858 & __FILE__//
", ad_mp_exchange2d_bry"
4860# include "set_bounds.h"
4868 CALL wclock_on (ng, model, 63, __line__, myfile)
4879 & 4*
SIZE(sends))*kind(ad_a),r8))
4882 & grecvw, gsendw, wtile, wexchange, &
4883 & grecve, gsende, etile, eexchange, &
4884 & grecvs, gsends, stile, sexchange, &
4885 & grecvn, gsendn, ntile, nexchange)
4889 wexchange=wexchange.and.((boundary.eq.
isouth).or. &
4891 eexchange=eexchange.and.((boundary.eq.
isouth).or. &
4893 sexchange=sexchange.and.((boundary.eq.
iwest).or. &
4894 & (boundary.eq.
ieast))
4895 nexchange=nexchange.and.((boundary.eq.
iwest).or. &
4896 & (boundary.eq.
ieast))
4907 IF (ew_periodic.or.ns_periodic)
THEN
4912 nssize=nvar*(nghost+pp)
4913 ewsize=nvar*(nghost+pp)
4914 buffersizens=nvar*(nghost+pp)
4915 buffersizeew=nvar*(nghost+pp)
4916 IF (
SIZE(sende).lt.ewsize)
THEN
4917 WRITE (
stdout,10)
'EWsize = ', ewsize,
SIZE(sende)
4918 10
FORMAT (/,
' AD_MP_EXCHANGE2D_BRY - communication buffer too', &
4919 &
' small, ',a, 2i8)
4921 IF (
SIZE(sendn).lt.nssize)
THEN
4922 WRITE (
stdout,10)
'NSsize = ', nssize,
SIZE(sendn)
4945 IF (
PRESENT(ad_b))
THEN
4956 IF (
PRESENT(ad_c))
THEN
4967 IF (
PRESENT(ad_d))
THEN
4996 IF (
PRESENT(ad_b))
THEN
5007 IF (
PRESENT(ad_c))
THEN
5018 IF (
PRESENT(ad_d))
THEN
5040 CALL mpi_irecv (sends, nssize,
mp_float, stile, ntag, &
5047 CALL mpi_irecv (sendn, nssize,
mp_float, ntile, stag, &
5054 CALL mpi_send (recvs, sizes,
mp_float, stile, stag, &
5061 CALL mpi_send (recvn, sizen,
mp_float, ntile, ntag, &
5070 CALL mpi_wait (srequest, status(1,2), serror)
5071 IF (serror.ne.mpi_success)
THEN
5072 CALL mpi_error_string (serror, string, lstr, ierror)
5073 lstr=len_trim(string)
5074 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Southern Edge)', &
5075 &
myrank, serror, string(1:lstr)
5076 20
FORMAT (/,
' AD_MP_EXCHANGE2D_BRY - error during ',a,
' call,', &
5077 &
' Node = ', i3.3,
' Error = ',i3,/,18x,a)
5088 ad_a(j)=ad_a(j)+sends(ics)
5091 IF (
PRESENT(ad_b))
THEN
5097 ad_b(j)=ad_b(j)+sends(ics)
5101 IF (
PRESENT(ad_c))
THEN
5107 ad_c(j)=ad_c(j)+sends(ics)
5111 IF (
PRESENT(ad_d))
THEN
5117 ad_d(j)=ad_d(j)+sends(ics)
5125 CALL mpi_wait (nrequest, status(1,4), nerror)
5126 IF (nerror.ne.mpi_success)
THEN
5127 CALL mpi_error_string (nerror, string, lstr, ierror)
5128 lstr=len_trim(string)
5129 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Northern Edge)', &
5130 &
myrank, nerror, string(1:lstr)
5141 ad_a(j)=ad_a(j)+sendn(icn)
5144 IF (
PRESENT(ad_b))
THEN
5150 ad_b(j)=ad_b(j)+sendn(icn)
5154 IF (
PRESENT(ad_c))
THEN
5160 ad_c(j)=ad_c(j)+sendn(icn)
5164 IF (
PRESENT(ad_d))
THEN
5170 ad_d(j)=ad_d(j)+sendn(icn)
5196 IF (
PRESENT(ad_b))
THEN
5207 IF (
PRESENT(ad_c))
THEN
5218 IF (
PRESENT(ad_d))
THEN
5247 IF (
PRESENT(ad_b))
THEN
5258 IF (
PRESENT(ad_c))
THEN
5269 IF (
PRESENT(ad_d))
THEN
5291 CALL mpi_irecv (sendw, ewsize,
mp_float, wtile, etag, &
5298 CALL mpi_irecv (sende, ewsize,
mp_float, etile, wtag, &
5305 CALL mpi_send (recvw, sizew,
mp_float, wtile, wtag, &
5312 CALL mpi_send (recve, sizee,
mp_float, etile, etag, &
5321 CALL mpi_wait (wrequest, status(1,1), werror)
5322 IF (werror.ne.mpi_success)
THEN
5323 CALL mpi_error_string (werror, string, lstr, ierror)
5324 lstr=len_trim(string)
5325 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Western Edge)', &
5326 &
myrank, werror, string(1:lstr)
5337 ad_a(i)=ad_a(i)+sendw(jcw)
5340 IF (
PRESENT(ad_b))
THEN
5346 ad_b(i)=ad_b(i)+sendw(jcw)
5350 IF (
PRESENT(ad_c))
THEN
5356 ad_c(i)=ad_c(i)+sendw(jcw)
5360 IF (
PRESENT(ad_d))
THEN
5366 ad_d(i)=ad_d(i)+sendw(jcw)
5374 CALL mpi_wait (erequest, status(1,3), eerror)
5375 IF (eerror.ne.mpi_success)
THEN
5376 CALL mpi_error_string (eerror, string, lstr, ierror)
5377 lstr=len_trim(string)
5378 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Eastern Edge)', &
5379 &
myrank, eerror, string(1:lstr)
5390 ad_a(i)=ad_a(i)+sende(jce)
5393 IF (
PRESENT(ad_b))
THEN
5399 ad_b(i)=ad_b(i)+sende(jce)
5403 IF (
PRESENT(ad_c))
THEN
5409 ad_c(i)=ad_c(i)+sende(jce)
5413 IF (
PRESENT(ad_d))
THEN
5419 ad_d(i)=ad_d(i)+sende(jce)
5431 CALL wclock_off (ng, model, 63, __line__, myfile)
5440 & LBi, UBi, LBj, UBj, LBk, UBk, &
5441 & Nghost, EW_periodic, NS_periodic, &
5442 & ad_A, ad_B, ad_C, ad_D)
5454 logical,
intent(in) :: EW_periodic, NS_periodic
5456 integer,
intent(in) :: ng, tile, model, Nvar
5457 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk
5458 integer,
intent(in) :: Nghost
5460# ifdef ASSUMED_SHAPE
5461 real(r8),
intent(inout) :: ad_A(LBi:,LBj:,LBk:)
5463 real(r8),
intent(inout),
optional :: ad_B(LBi:,LBj:,LBk:)
5464 real(r8),
intent(inout),
optional :: ad_C(LBi:,LBj:,LBk:)
5465 real(r8),
intent(inout),
optional :: ad_D(LBi:,LBj:,LBk:)
5467 real(r8),
intent(inout) :: ad_A(LBi:UBi,LBj:UBj,LBk:UBk)
5469 real(r8),
intent(inout),
optional :: ad_B(LBi:UBi,LBj:UBj,LBk:UBk)
5470 real(r8),
intent(inout),
optional :: ad_C(LBi:UBi,LBj:UBj,LBk:UBk)
5471 real(r8),
intent(inout),
optional :: ad_D(LBi:UBi,LBj:UBj,LBk:UBk)
5476 logical :: Wexchange, Sexchange, Eexchange, Nexchange
5478 integer :: i, ikS, ikN, ioff, Imin, Imax, Ilen, IKlen
5479 integer :: j, jkW, jkE, joff, Jmin, Jmax, Jlen, JKlen
5480 integer :: k, kc, m, mc, Ierror, Klen, Lstr, pp
5481 integer :: Wtile, GsendW, GrecvW, Wtag, Werror, Wrequest
5482 integer :: Stile, GsendS, GrecvS, Stag, Serror, Srequest
5483 integer :: Etile, GsendE, GrecvE, Etag, Eerror, Erequest
5484 integer :: Ntile, GsendN, GrecvN, Ntag, Nerror, Nrequest
5485 integer :: BufferSizeEW, EWsize, sizeW, sizeE
5486 integer :: BufferSizeNS, NSsize, sizeS, sizeN
5489 integer,
dimension(MPI_STATUS_SIZE,4) :: status
5492 real(r8),
dimension(Nvar*HaloSizeJ(ng)* &
& (UBk-LBk+1)) :: sendW, sendE
5493 real(r8),
dimension(Nvar*HaloSizeI(ng)* &
& (UBk-LBk+1)) :: sendS, sendN
5495 real(r8),
dimension(Nvar*HaloSizeJ(ng)* &
& (UBk-LBk+1)) :: recvW, recvE
5496 real(r8),
dimension(Nvar*HaloSizeI(ng)* &
& (UBk-LBk+1)) :: recvS, recvN
5498 character (len=MPI_MAX_ERROR_STRING) :: string
5500 character (len=*),
parameter :: MyFile = &
5501 & __FILE__//
", ad_mp_exchange3d"
5503# include "set_bounds.h"
5511 CALL wclock_on (ng, model, 61, __line__, myfile)
5522 & 4*
SIZE(sends))*kind(ad_a),r8))
5525 & grecvw, gsendw, wtile, wexchange, &
5526 & grecve, gsende, etile, eexchange, &
5527 & grecvs, gsends, stile, sexchange, &
5528 & grecvn, gsendn, ntile, nexchange)
5548 IF (ew_periodic.or.ns_periodic)
THEN
5553 nssize=nvar*(nghost+pp)*iklen
5554 ewsize=nvar*(nghost+pp)*jklen
5557 IF (
SIZE(sende).lt.ewsize)
THEN
5558 WRITE (
stdout,10)
'EWsize = ', ewsize,
SIZE(sende)
5559 10
FORMAT (/,
' AD_MP_EXCHANGE3D - communication buffer too', &
5560 &
' small, ',a, 2i8)
5562 IF (
SIZE(sendn).lt.nssize)
THEN
5563 WRITE (
stdout,10)
'NSsize = ', nssize,
SIZE(sendn)
5586 recvn(ikn)=ad_a(i,j,k)
5591 IF (
PRESENT(ad_b))
THEN
5600 ikn=ioff+1+(i-imin)+kc
5603 recvn(ikn)=ad_b(i,j,k)
5609 IF (
PRESENT(ad_c))
THEN
5618 ikn=ioff+1+(i-imin)+kc
5621 recvn(ikn)=ad_c(i,j,k)
5627 IF (
PRESENT(ad_d))
THEN
5636 ikn=ioff+1+(i-imin)+kc
5639 recvn(ikn)=ad_d(i,j,k)
5663 recvs(iks)=ad_a(i,j,k)
5668 IF (
PRESENT(ad_b))
THEN
5677 iks=ioff+1+(i-imin)+kc
5680 recvs(iks)=ad_b(i,j,k)
5686 IF (
PRESENT(ad_c))
THEN
5695 iks=ioff+1+(i-imin)+kc
5698 recvs(iks)=ad_c(i,j,k)
5704 IF (
PRESENT(ad_d))
THEN
5713 iks=ioff+1+(i-imin)+kc
5716 recvs(iks)=ad_d(i,j,k)
5733 CALL mpi_irecv (sends, nssize,
mp_float, stile, ntag, &
5740 CALL mpi_irecv (sendn, nssize,
mp_float, ntile, stag, &
5747 CALL mpi_send (recvs, sizes,
mp_float, stile, stag, &
5754 CALL mpi_send (recvn, sizen,
mp_float, ntile, ntag, &
5763 CALL mpi_wait (srequest, status(1,2), serror)
5764 IF (serror.ne.mpi_success)
THEN
5765 CALL mpi_error_string (serror, string, lstr, ierror)
5766 lstr=len_trim(string)
5767 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Southern Edge)', &
5768 &
myrank, serror, string(1:lstr)
5769 20
FORMAT (/,
' AD_MP_EXCHANGE3D - error during ',a,
' call,', &
5770 &
' Node = ', i3.3,
' Error = ',i3,/,18x,a)
5784 ad_a(i,j,k)=ad_a(i,j,k)+sends(iks)
5789 IF (
PRESENT(ad_b))
THEN
5797 iks=ioff+1+(i-imin)+kc
5800 ad_b(i,j,k)=ad_b(i,j,k)+sends(iks)
5806 IF (
PRESENT(ad_c))
THEN
5814 iks=ioff+1+(i-imin)+kc
5817 ad_c(i,j,k)=ad_c(i,j,k)+sends(iks)
5823 IF (
PRESENT(ad_d))
THEN
5831 iks=ioff+1+(i-imin)+kc
5834 ad_d(i,j,k)=ad_d(i,j,k)+sends(iks)
5844 CALL mpi_wait (nrequest, status(1,4), nerror)
5845 IF (nerror.ne.mpi_success)
THEN
5846 CALL mpi_error_string (nerror, string, lstr, ierror)
5847 lstr=len_trim(string)
5848 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Northern Edge)', &
5849 &
myrank, nerror, string(1:lstr)
5863 ad_a(i,j,k)=ad_a(i,j,k)+sendn(ikn)
5868 IF (
PRESENT(ad_b))
THEN
5876 ikn=ioff+1+(i-imin)+kc
5879 ad_b(i,j,k)=ad_b(i,j,k)+sendn(ikn)
5885 IF (
PRESENT(ad_c))
THEN
5893 ikn=ioff+1+(i-imin)+kc
5896 ad_c(i,j,k)=ad_c(i,j,k)+sendn(ikn)
5902 IF (
PRESENT(ad_d))
THEN
5910 ikn=ioff+1+(i-imin)+kc
5913 ad_d(i,j,k)=ad_d(i,j,k)+sendn(ikn)
5941 recve(jke)=ad_a(i,j,k)
5946 IF (
PRESENT(ad_b))
THEN
5955 jke=joff+1+(j-jmin)+kc
5958 recve(jke)=ad_b(i,j,k)
5964 IF (
PRESENT(ad_c))
THEN
5973 jke=joff+1+(j-jmin)+kc
5976 recve(jke)=ad_c(i,j,k)
5982 IF (
PRESENT(ad_d))
THEN
5991 jke=joff+1+(j-jmin)+kc
5994 recve(jke)=ad_d(i,j,k)
6018 recvw(jkw)=ad_a(i,j,k)
6023 IF (
PRESENT(ad_b))
THEN
6032 jkw=joff+1+(j-jmin)+kc
6035 recvw(jkw)=ad_b(i,j,k)
6041 IF (
PRESENT(ad_c))
THEN
6050 jkw=joff+1+(j-jmin)+kc
6053 recvw(jkw)=ad_c(i,j,k)
6059 IF (
PRESENT(ad_d))
THEN
6068 jkw=joff+1+(j-jmin)+kc
6071 recvw(jkw)=ad_d(i,j,k)
6088 CALL mpi_irecv (sendw, ewsize,
mp_float, wtile, etag, &
6095 CALL mpi_irecv (sende, ewsize,
mp_float, etile, wtag, &
6102 CALL mpi_send (recvw, sizew,
mp_float, wtile, wtag, &
6109 CALL mpi_send (recve, sizee,
mp_float, etile, etag, &
6118 CALL mpi_wait (wrequest, status(1,1), werror)
6119 IF (werror.ne.mpi_success)
THEN
6120 CALL mpi_error_string (werror, string, lstr, ierror)
6121 lstr=len_trim(string)
6122 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Western Edge)', &
6123 &
myrank, werror, string(1:lstr)
6137 ad_a(i,j,k)=ad_a(i,j,k)+sendw(jkw)
6142 IF (
PRESENT(ad_b))
THEN
6150 jkw=joff+1+(j-jmin)+kc
6153 ad_b(i,j,k)=ad_b(i,j,k)+sendw(jkw)
6159 IF (
PRESENT(ad_c))
THEN
6167 jkw=joff+1+(j-jmin)+kc
6170 ad_c(i,j,k)=ad_c(i,j,k)+sendw(jkw)
6176 IF (
PRESENT(ad_d))
THEN
6184 jkw=joff+1+(j-jmin)+kc
6187 ad_d(i,j,k)=ad_d(i,j,k)+sendw(jkw)
6197 CALL mpi_wait (erequest, status(1,3), eerror)
6198 IF (eerror.ne.mpi_success)
THEN
6199 CALL mpi_error_string (eerror, string, lstr, ierror)
6200 lstr=len_trim(string)
6201 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Eastern Edge)', &
6202 &
myrank, eerror, string(1:lstr)
6216 ad_a(i,j,k)=ad_a(i,j,k)+sende(jke)
6221 IF (
PRESENT(ad_b))
THEN
6229 jke=joff+1+(j-jmin)+kc
6232 ad_b(i,j,k)=ad_b(i,j,k)+sende(jke)
6238 IF (
PRESENT(ad_c))
THEN
6246 jke=joff+1+(j-jmin)+kc
6249 ad_c(i,j,k)=ad_c(i,j,k)+sende(jke)
6255 IF (
PRESENT(ad_d))
THEN
6263 jke=joff+1+(j-jmin)+kc
6266 ad_d(i,j,k)=ad_d(i,j,k)+sende(jke)
6280 CALL wclock_off (ng, model, 61, __line__, myfile)
6288 & LBij, UBij, LBk, UBk, &
6289 & Nghost, EW_periodic, NS_periodic,&
6290 & ad_A, ad_B, ad_C, ad_D)
6302 logical,
intent(in) :: EW_periodic, NS_periodic
6304 integer,
intent(in) :: ng, tile, model, Nvar, boundary
6305 integer,
intent(in) :: LBij, UBij, LBk, UBk
6306 integer,
intent(in) :: Nghost
6308# ifdef ASSUMED_SHAPE
6309 real(r8),
intent(inout) :: ad_A(LBij:,LBk:)
6311 real(r8),
intent(inout),
optional :: ad_B(LBij:,LBk:)
6312 real(r8),
intent(inout),
optional :: ad_C(LBij:,LBk:)
6313 real(r8),
intent(inout),
optional :: ad_D(LBij:,LBk:)
6315 real(r8),
intent(inout) :: ad_A(LBij:UBij,LBk:UBk)
6317 real(r8),
intent(inout),
optional :: ad_B(LBij:UBij,LBk:UBk)
6318 real(r8),
intent(inout),
optional :: ad_C(LBij:UBij,LBk:UBk)
6319 real(r8),
intent(inout),
optional :: ad_D(LBij:UBij,LBk:UBk)
6324 logical :: Wexchange, Sexchange, Eexchange, Nexchange
6326 integer :: i, ikS, ikN, ioff
6327 integer :: j, jkW, jkE, joff
6328 integer :: k, m, mc, Ierror, Klen, Lstr, pp
6329 integer :: Wtile, GsendW, GrecvW, Wtag, Werror, Wrequest
6330 integer :: Stile, GsendS, GrecvS, Stag, Serror, Srequest
6331 integer :: Etile, GsendE, GrecvE, Etag, Eerror, Erequest
6332 integer :: Ntile, GsendN, GrecvN, Ntag, Nerror, Nrequest
6333 integer :: BufferSizeEW, EWsize, sizeW, sizeE
6334 integer :: BufferSizeNS, NSsize, sizeS, sizeN
6337 integer,
dimension(MPI_STATUS_SIZE,4) :: status
6340 real(r8),
dimension(Nvar*HaloBry(ng)*(UBk-LBk+1)) :: sendW, sendE
6341 real(r8),
dimension(Nvar*HaloBry(ng)*(UBk-LBk+1)) :: recvW, recvE
6342 real(r8),
dimension(Nvar*HaloBry(ng)*(UBk-LBk+1)) :: sendS, sendN
6343 real(r8),
dimension(Nvar*HaloBry(ng)*(UBk-LBk+1)) :: recvS, recvN
6345 character (len=MPI_MAX_ERROR_STRING) :: string
6347 character (len=*),
parameter :: MyFile = &
6348 & __FILE__//
", ad_mp_exchange3d_bry"
6350# include "set_bounds.h"
6358 CALL wclock_on (ng, model, 63, __line__, myfile)
6369 & 4*
SIZE(sends))*kind(ad_a),r8))
6372 & grecvw, gsendw, wtile, wexchange, &
6373 & grecve, gsende, etile, eexchange, &
6374 & grecvs, gsends, stile, sexchange, &
6375 & grecvn, gsendn, ntile, nexchange)
6379 wexchange=wexchange.and.((boundary.eq.
isouth).or. &
6381 eexchange=eexchange.and.((boundary.eq.
isouth).or. &
6383 sexchange=sexchange.and.((boundary.eq.
iwest).or. &
6384 & (boundary.eq.
ieast))
6385 nexchange=nexchange.and.((boundary.eq.
iwest).or. &
6386 & (boundary.eq.
ieast))
6398 IF (ew_periodic.or.ns_periodic)
THEN
6403 nssize=nvar*(nghost+pp)*klen
6404 ewsize=nvar*(nghost+pp)*klen
6405 buffersizens=nvar*(nghost+pp)*klen
6406 buffersizeew=nvar*(nghost+pp)*klen
6407 IF (
SIZE(sende).lt.ewsize)
THEN
6408 WRITE (
stdout,10)
'EWsize = ', ewsize,
SIZE(sende)
6409 10
FORMAT (/,
' AD_MP_EXCHANGE3D_BRY - communication buffer too', &
6410 &
' small, ',a, 2i8)
6412 IF (
SIZE(sendn).lt.nssize)
THEN
6413 WRITE (
stdout,10)
'NSsize = ', nssize,
SIZE(sendn)
6434 recvn(ikn)=ad_a(j,k)
6438 IF (
PRESENT(ad_b))
THEN
6445 ikn=ioff+1+(k-lbk)+mc
6448 recvn(ikn)=ad_b(j,k)
6453 IF (
PRESENT(ad_c))
THEN
6460 ikn=ioff+1+(k-lbk)+mc
6463 recvn(ikn)=ad_c(j,k)
6468 IF (
PRESENT(ad_d))
THEN
6475 ikn=ioff+1+(k-lbk)+mc
6478 recvn(ikn)=ad_d(j,k)
6499 recvs(iks)=ad_a(j,k)
6503 IF (
PRESENT(ad_b))
THEN
6510 iks=ioff+1+(k-lbk)+mc
6513 recvs(iks)=ad_b(j,k)
6518 IF (
PRESENT(ad_c))
THEN
6525 iks=ioff+1+(k-lbk)+mc
6528 recvs(iks)=ad_c(j,k)
6533 IF (
PRESENT(ad_d))
THEN
6540 iks=ioff+1+(k-lbk)+mc
6543 recvs(iks)=ad_d(j,k)
6559 CALL mpi_irecv (sends, nssize,
mp_float, stile, ntag, &
6566 CALL mpi_irecv (sendn, nssize,
mp_float, ntile, stag, &
6573 CALL mpi_send (recvs, sizes,
mp_float, stile, stag, &
6580 CALL mpi_send (recvn, sizen,
mp_float, ntile, ntag, &
6589 CALL mpi_wait (srequest, status(1,2), serror)
6590 IF (serror.ne.mpi_success)
THEN
6591 CALL mpi_error_string (serror, string, lstr, ierror)
6592 lstr=len_trim(string)
6593 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Southern Edge)', &
6594 &
myrank, serror, string(1:lstr)
6595 20
FORMAT (/,
' AD_MP_EXCHANGE3D_BRY - error during ',a,
' call,', &
6596 &
' Node = ', i3.3,
' Error = ',i3,/,18x,a)
6608 ad_a(j,k)=ad_a(j,k)+sends(iks)
6612 IF (
PRESENT(ad_b))
THEN
6618 iks=ioff+1+(k-lbk)+mc
6621 ad_b(j,k)=ad_b(j,k)+sends(iks)
6626 IF (
PRESENT(ad_c))
THEN
6632 iks=ioff+1+(k-lbk)+mc
6635 ad_c(j,k)=ad_c(j,k)+sends(iks)
6640 IF (
PRESENT(ad_d))
THEN
6646 iks=ioff+1+(k-lbk)+mc
6649 ad_d(j,k)=ad_d(j,k)+sends(iks)
6658 CALL mpi_wait (nrequest, status(1,4), nerror)
6659 IF (nerror.ne.mpi_success)
THEN
6660 CALL mpi_error_string (nerror, string, lstr, ierror)
6661 lstr=len_trim(string)
6662 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Northern Edge)', &
6663 &
myrank, nerror, string(1:lstr)
6675 ad_a(j,k)=ad_a(j,k)+sendn(ikn)
6679 IF (
PRESENT(ad_b))
THEN
6685 ikn=ioff+1+(k-lbk)+mc
6688 ad_b(j,k)=ad_b(j,k)+sendn(ikn)
6693 IF (
PRESENT(ad_c))
THEN
6699 ikn=ioff+1+(k-lbk)+mc
6702 ad_c(j,k)=ad_c(j,k)+sendn(ikn)
6707 IF (
PRESENT(ad_d))
THEN
6713 ikn=ioff+1+(k-lbk)+mc
6716 ad_d(j,k)=ad_d(j,k)+sendn(ikn)
6741 recve(jke)=ad_a(i,k)
6745 IF (
PRESENT(ad_b))
THEN
6752 jke=joff+1+(k-lbk)+mc
6755 recve(jke)=ad_b(i,k)
6760 IF (
PRESENT(ad_c))
THEN
6767 jke=joff+1+(k-lbk)+mc
6770 recve(jke)=ad_c(i,k)
6775 IF (
PRESENT(ad_d))
THEN
6782 jke=joff+1+(k-lbk)+mc
6785 recve(jke)=ad_d(i,k)
6806 recvw(jkw)=ad_a(i,k)
6810 IF (
PRESENT(ad_b))
THEN
6817 jkw=joff+1+(k-lbk)+mc
6820 recvw(jkw)=ad_b(i,k)
6825 IF (
PRESENT(ad_c))
THEN
6832 jkw=joff+1+(k-lbk)+mc
6835 recvw(jkw)=ad_c(i,k)
6840 IF (
PRESENT(ad_d))
THEN
6847 jkw=joff+1+(k-lbk)+mc
6850 recvw(jkw)=ad_d(i,k)
6866 CALL mpi_irecv (sendw, ewsize,
mp_float, wtile, etag, &
6873 CALL mpi_irecv (sende, ewsize,
mp_float, etile, wtag, &
6880 CALL mpi_send (recvw, sizew,
mp_float, wtile, wtag, &
6887 CALL mpi_send (recve, sizee,
mp_float, etile, etag, &
6896 CALL mpi_wait (wrequest, status(1,1), werror)
6897 IF (werror.ne.mpi_success)
THEN
6898 CALL mpi_error_string (werror, string, lstr, ierror)
6899 lstr=len_trim(string)
6900 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Western Edge)', &
6901 &
myrank, werror, string(1:lstr)
6913 ad_a(i,k)=ad_a(i,k)+sendw(jkw)
6917 IF (
PRESENT(ad_b))
THEN
6923 jkw=joff+1+(k-lbk)+mc
6926 ad_b(i,k)=ad_b(i,k)+sendw(jkw)
6931 IF (
PRESENT(ad_c))
THEN
6937 jkw=joff+1+(k-lbk)+mc
6940 ad_c(i,k)=ad_c(i,k)+sendw(jkw)
6945 IF (
PRESENT(ad_d))
THEN
6951 jkw=joff+1+(k-lbk)+mc
6954 ad_d(i,k)=ad_d(i,k)+sendw(jkw)
6963 CALL mpi_wait (erequest, status(1,3), eerror)
6964 IF (eerror.ne.mpi_success)
THEN
6965 CALL mpi_error_string (eerror, string, lstr, ierror)
6966 lstr=len_trim(string)
6967 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Eastern Edge)', &
6968 &
myrank, eerror, string(1:lstr)
6980 ad_a(i,k)=ad_a(i,k)+sende(jke)
6984 IF (
PRESENT(ad_b))
THEN
6990 jke=joff+1+(k-lbk)+mc
6993 ad_b(i,k)=ad_b(i,k)+sende(jke)
6998 IF (
PRESENT(ad_c))
THEN
7004 jke=joff+1+(k-lbk)+mc
7007 ad_c(i,k)=ad_c(i,k)+sende(jke)
7012 IF (
PRESENT(ad_d))
THEN
7018 jke=joff+1+(k-lbk)+mc
7021 ad_d(i,k)=ad_d(i,k)+sende(jke)
7034 CALL wclock_off (ng, model, 63, __line__, myfile)
7042 & LBi, UBi, LBj, UBj, LBk, UBk, &
7044 & Nghost, EW_periodic, NS_periodic, &
7057 logical,
intent(in) :: EW_periodic, NS_periodic
7059 integer,
intent(in) :: ng, tile, model, Nvar
7060 integer,
intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk, LBt, UBt
7061 integer,
intent(in) :: Nghost
7063# ifdef ASSUMED_SHAPE
7064 real(r8),
intent(inout) :: ad_A(LBi:,LBj:,LBk:,LBt:)
7066 real(r8),
intent(inout),
optional :: ad_B(LBi:,LBj:,LBk:,LBt:)
7067 real(r8),
intent(inout),
optional :: ad_C(LBi:,LBj:,LBk:,LBt:)
7069 real(r8),
intent(inout) :: ad_A(LBi:UBi,LBj:UBj,LBk:UBk,LBt:UBt)
7071 real(r8),
intent(inout),
optional :: &
7072 & ad_B(LBi:UBi,LBj:UBj,LBk:UBk,LBt:UBt)
7073 real(r8),
intent(inout),
optional :: &
7074 & ad_C(LBi:UBi,LBj:UBj,LBk:UBk,LBt:UBt)
7079 logical :: Wexchange, Sexchange, Eexchange, Nexchange
7081 integer :: i, ikS, ikN, ioff, Imin, Imax, Ilen, IKlen, IKTlen
7082 integer :: j, jkW, jkE, joff, Jmin, Jmax, Jlen, JKlen, JKTlen
7083 integer :: k, kc, m, mc, Ierror, Klen, Lstr, Tlen, pp
7085 integer :: Wtile, GsendW, GrecvW, Wtag, Werror, Wrequest
7086 integer :: Stile, GsendS, GrecvS, Stag, Serror, Srequest
7087 integer :: Etile, GsendE, GrecvE, Etag, Eerror, Erequest
7088 integer :: Ntile, GsendN, GrecvN, Ntag, Nerror, Nrequest
7089 integer :: BufferSizeEW, EWsize, sizeW, sizeE
7090 integer :: BufferSizeNS, NSsize, sizeS, sizeN
7093 integer,
dimension(MPI_STATUS_SIZE,4) :: status
7096 real(r8),
dimension(Nvar*HaloSizeJ(ng)*(UBk-LBk+1)* &
& (UBt-LBt+1)) :: sendW, sendE
7097 real(r8),
dimension(Nvar*HaloSizeI(ng)*(UBk-LBk+1)* &
& (UBt-LBt+1)) :: sendS, sendN
7099 real(r8),
dimension(Nvar*HaloSizeJ(ng)*(UBk-LBk+1)* &
& (UBt-LBt+1)) :: recvW, recvE
7100 real(r8),
dimension(Nvar*HaloSizeI(ng)*(UBk-LBk+1)* &
& (UBt-LBt+1)) :: recvS, recvN
7102 character (len=MPI_MAX_ERROR_STRING) :: string
7104 character (len=*),
parameter :: MyFile = &
7105 & __FILE__//
", ad_mp_exchange4d"
7107# include "set_bounds.h"
7115 CALL wclock_on (ng, model, 62, __line__, myfile)
7126 & 4*
SIZE(sends))*kind(ad_a),r8))
7129 & grecvw, gsendw, wtile, wexchange, &
7130 & grecve, gsende, etile, eexchange, &
7131 & grecvs, gsends, stile, sexchange, &
7132 & grecvn, gsendn, ntile, nexchange)
7155 IF (ew_periodic.or.ns_periodic)
THEN
7160 nssize=nvar*(nghost+pp)*iktlen
7161 ewsize=nvar*(nghost+pp)*jktlen
7162 buffersizens=nvar*
halosizei(ng)*klen*tlen
7163 buffersizeew=nvar*
halosizej(ng)*klen*tlen
7164 IF (
SIZE(sende).lt.ewsize)
THEN
7165 WRITE (
stdout,10)
'EWsize = ', ewsize,
SIZE(sende)
7166 10
FORMAT (/,
' AD_MP_EXCHANGE4D - communication buffer too', &
7167 &
' small, ',a, 2i8)
7169 IF (
SIZE(sendn).lt.nssize)
THEN
7170 WRITE (
stdout,10)
'NSsize = ', nssize,
SIZE(sendn)
7195 recvn(ikn)=ad_a(i,j,k,l)
7196 ad_a(i,j,k,l)=0.0_r8
7201 IF (
PRESENT(ad_b))
THEN
7212 ikn=ioff+1+(i-imin)+kc
7215 recvn(ikn)=ad_b(i,j,k,l)
7216 ad_b(i,j,k,l)=0.0_r8
7222 IF (
PRESENT(ad_c))
THEN
7233 ikn=ioff+1+(i-imin)+kc
7236 recvn(ikn)=ad_c(i,j,k,l)
7237 ad_c(i,j,k,l)=0.0_r8
7252 mc=(grecvs-m)*iktlen
7263 recvs(iks)=ad_a(i,j,k,l)
7264 ad_a(i,j,k,l)=0.0_r8
7269 IF (
PRESENT(ad_b))
THEN
7272 mc=(grecvs-m)*iktlen
7280 iks=ioff+1+(i-imin)+kc
7283 recvs(iks)=ad_b(i,j,k,l)
7284 ad_b(i,j,k,l)=0.0_r8
7290 IF (
PRESENT(ad_c))
THEN
7293 mc=(grecvs-m)*iktlen
7301 iks=ioff+1+(i-imin)+kc
7304 recvs(iks)=ad_c(i,j,k,l)
7305 ad_c(i,j,k,l)=0.0_r8
7322 CALL mpi_irecv (sends, nssize,
mp_float, stile, ntag, &
7329 CALL mpi_irecv (sendn, nssize,
mp_float, ntile, stag, &
7336 CALL mpi_send (recvs, sizes,
mp_float, stile, stag, &
7343 CALL mpi_send (recvn, sizen,
mp_float, ntile, ntag, &
7352 CALL mpi_wait (srequest, status(1,2), serror)
7353 IF (serror.ne.mpi_success)
THEN
7354 CALL mpi_error_string (serror, string, lstr, ierror)
7355 lstr=len_trim(string)
7356 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Southern Edge)', &
7357 &
myrank, serror, string(1:lstr)
7358 20
FORMAT (/,
' AD_MP_EXCHANGE4D - error during ',a,
' call,', &
7359 &
' Node = ', i3.3,
' Error = ',i3,/,18x,a)
7375 ad_a(i,j,k,l)=ad_a(i,j,k,l)+sends(iks)
7381 IF (
PRESENT(ad_b))
THEN
7391 iks=ioff+1+(i-imin)+kc
7394 ad_b(i,j,k,l)=ad_b(i,j,k,l)+sends(iks)
7401 IF (
PRESENT(ad_c))
THEN
7411 iks=ioff+1+(i-imin)+kc
7414 ad_c(i,j,k,l)=ad_c(i,j,k,l)+sends(iks)
7425 CALL mpi_wait (nrequest, status(1,4), nerror)
7426 IF (nerror.ne.mpi_success)
THEN
7427 CALL mpi_error_string (nerror, string, lstr, ierror)
7428 lstr=len_trim(string)
7429 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Northern Edge)', &
7430 &
myrank, nerror, string(1:lstr)
7446 ad_a(i,j,k,l)=ad_a(i,j,k,l)+sendn(ikn)
7452 IF (
PRESENT(ad_b))
THEN
7462 ikn=ioff+1+(i-imin)+kc
7465 ad_b(i,j,k,l)=ad_b(i,j,k,l)+sendn(ikn)
7472 IF (
PRESENT(ad_c))
THEN
7482 ikn=ioff+1+(i-imin)+kc
7485 ad_c(i,j,k,l)=ad_c(i,j,k,l)+sendn(ikn)
7516 recve(jke)=ad_a(i,j,k,l)
7517 ad_a(i,j,k,l)=0.0_r8
7522 IF (
PRESENT(ad_b))
THEN
7533 jke=joff+1+(j-jmin)+kc
7536 recve(jke)=ad_b(i,j,k,l)
7537 ad_b(i,j,k,l)=0.0_r8
7543 IF (
PRESENT(ad_c))
THEN
7554 jke=joff+1+(j-jmin)+kc
7557 recve(jke)=ad_c(i,j,k,l)
7558 ad_c(i,j,k,l)=0.0_r8
7573 mc=(grecvw-m)*jktlen
7584 recvw(jkw)=ad_a(i,j,k,l)
7585 ad_a(i,j,k,l)=0.0_r8
7590 IF (
PRESENT(ad_b))
THEN
7593 mc=(grecvw-m)*jktlen
7601 jkw=joff+1+(j-jmin)+kc
7604 recvw(jkw)=ad_b(i,j,k,l)
7605 ad_b(i,j,k,l)=0.0_r8
7611 IF (
PRESENT(ad_c))
THEN
7614 mc=(grecvw-m)*jktlen
7622 jkw=joff+1+(j-jmin)+kc
7625 recvw(jkw)=ad_c(i,j,k,l)
7626 ad_c(i,j,k,l)=0.0_r8
7643 CALL mpi_irecv (sendw, ewsize,
mp_float, wtile, etag, &
7650 CALL mpi_irecv (sende, ewsize,
mp_float, etile, wtag, &
7657 CALL mpi_send (recvw, sizew,
mp_float, wtile, wtag, &
7664 CALL mpi_send (recve, sizee,
mp_float, etile, etag, &
7673 CALL mpi_wait (wrequest, status(1,1), werror)
7674 IF (werror.ne.mpi_success)
THEN
7675 CALL mpi_error_string (werror, string, lstr, ierror)
7676 lstr=len_trim(string)
7677 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Western Edge)', &
7678 &
myrank, werror, string(1:lstr)
7694 ad_a(i,j,k,l)=ad_a(i,j,k,l)+sendw(jkw)
7700 IF (
PRESENT(ad_b))
THEN
7710 jkw=joff+1+(j-jmin)+kc
7713 ad_b(i,j,k,l)=ad_b(i,j,k,l)+sendw(jkw)
7720 IF (
PRESENT(ad_c))
THEN
7730 jkw=joff+1+(j-jmin)+kc
7733 ad_c(i,j,k,l)=ad_c(i,j,k,l)+sendw(jkw)
7744 CALL mpi_wait (erequest, status(1,3), eerror)
7745 IF (eerror.ne.mpi_success)
THEN
7746 CALL mpi_error_string (eerror, string, lstr, ierror)
7747 lstr=len_trim(string)
7748 WRITE (
stdout,20)
'MPI_SEND/MPI_IRECV (Eastern Edge)', &
7749 &
myrank, eerror, string(1:lstr)
7765 ad_a(i,j,k,l)=ad_a(i,j,k,l)+sende(jke)
7771 IF (
PRESENT(ad_b))
THEN
7781 jke=joff+1+(j-jmin)+kc
7784 ad_b(i,j,k,l)=ad_b(i,j,k,l)+sende(jke)
7791 IF (
PRESENT(ad_c))
THEN
7801 jke=joff+1+(j-jmin)+kc
7804 ad_c(i,j,k,l)=ad_c(i,j,k,l)+sende(jke)
7818 CALL wclock_off (ng, model, 62, __line__, myfile)
integer, parameter mp_float
integer, dimension(:), allocatable halosizei
integer, dimension(:), allocatable halosizej
real(r8), dimension(:), allocatable bmemmax
integer, dimension(:), allocatable ntilei
integer, dimension(:), allocatable ntilej
integer, parameter isouth
integer, parameter inorth
subroutine mp_exchange2d_bry(ng, tile, model, nvar, boundary, lbij, ubij, nghost, ew_periodic, ns_periodic, a, b, c, d)
subroutine ad_mp_exchange3d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c, ad_d)
subroutine ad_mp_exchange4d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, lbt, ubt, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c)
subroutine mp_exchange4d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, lbt, ubt, nghost, ew_periodic, ns_periodic, a, b, c)
subroutine ad_mp_exchange2d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c, ad_d)
subroutine mp_exchange2d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, nghost, ew_periodic, ns_periodic, a, b, c, d)
subroutine mp_exchange3d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, nghost, ew_periodic, ns_periodic, a, b, c, d)
subroutine mp_exchange3d_bry(ng, tile, model, nvar, boundary, lbij, ubij, lbk, ubk, nghost, ew_periodic, ns_periodic, a, b, c, d)
subroutine ad_mp_exchange3d_bry(ng, tile, model, nvar, boundary, lbij, ubij, lbk, ubk, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c, ad_d)
subroutine ad_mp_exchange2d_bry(ng, tile, model, nvar, boundary, lbij, ubij, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c, ad_d)
subroutine tile_neighbors(ng, nghost, ew_periodic, ns_periodic, grecvw, gsendw, wtile, wexchange, grecve, gsende, etile, eexchange, grecvs, gsends, stile, sexchange, grecvn, gsendn, ntile, nexchange)
recursive subroutine wclock_off(ng, model, region, line, routine)
recursive subroutine wclock_on(ng, model, region, line, routine)