28 public :: comm_data_transfer
32 interface comm_data_transfer
35 end interface comm_data_transfer
40 end interface comm_var
42 public :: comm_stat_sum
43 public :: comm_stat_sum_eachlayer
44 public :: comm_stat_avg
45 public :: comm_stat_max
46 public :: comm_stat_min
48 interface comm_stat_sum
51 end interface comm_stat_sum
53 interface comm_stat_sum_eachlayer
56 end interface comm_stat_sum_eachlayer
58 interface comm_stat_avg
61 end interface comm_stat_avg
63 interface comm_stat_max
66 end interface comm_stat_max
68 interface comm_stat_min
71 end interface comm_stat_min
132 private :: comm_list_generate
133 private :: comm_sortdest
134 private :: comm_sortdest_pl
135 private :: comm_sortdest_singular
137 private :: comm_debugtest
143 logical,
private :: comm_apply_barrier = .false.
144 integer,
private :: comm_varmax = 50
145 logical,
private :: debug = .false.
146 logical,
private :: testonly = .false.
149 integer,
private,
parameter :: rellist_vindex = 6
150 integer,
private,
parameter :: i_recv_grid = 1
151 integer,
private,
parameter :: i_recv_rgn = 2
152 integer,
private,
parameter :: i_recv_prc = 3
153 integer,
private,
parameter :: i_send_grid = 4
154 integer,
private,
parameter :: i_send_rgn = 5
155 integer,
private,
parameter :: i_send_prc = 6
157 integer,
private,
allocatable :: rellist(:,:)
158 integer,
private :: rellist_nmax
161 integer,
private,
parameter :: recv_nlim = 20
162 integer,
private,
parameter :: send_nlim = 20
164 integer,
private :: copy_nmax_r2r = 0
165 integer,
private :: recv_nmax_r2r = 0
166 integer,
private :: send_nmax_r2r = 0
168 integer,
private :: copy_nmax_p2r = 0
169 integer,
private :: recv_nmax_p2r = 0
170 integer,
private :: send_nmax_p2r = 0
172 integer,
private :: copy_nmax_r2p = 0
173 integer,
private :: recv_nmax_r2p = 0
174 integer,
private :: send_nmax_r2p = 0
176 integer,
private :: singular_nmax = 0
178 integer,
private,
parameter :: info_vindex = 3
179 integer,
private,
parameter :: i_size = 1
180 integer,
private,
parameter :: i_prc_from = 2
181 integer,
private,
parameter :: i_prc_to = 3
184 integer,
private,
parameter :: list_vindex = 4
185 integer,
private,
parameter :: i_grid_from = 1
186 integer,
private,
parameter :: i_l_from = 2
187 integer,
private,
parameter :: i_grid_to = 3
188 integer,
private,
parameter :: i_l_to = 4
191 integer,
private :: req_count
206 namelist / param_comm_icoa / &
207 comm_apply_barrier, &
217 if(
io_l )
write(
io_fid_log,*)
'+++ Module[comm]/Category[common share]' 221 if(
io_l )
write(
io_fid_log,*)
'*** PARAM_COMM_ICOA is not specified. use default.' 222 elseif( ierr > 0 )
then 223 write(*,*)
'xxx Not appropriate names in namelist PARAM_COMM_ICOA. STOP.' 230 elseif(
rp ==
sp )
then 233 write(*,*)
'xxx precision is not supportd' 243 if(
io_l )
write(
io_fid_log,*)
'====== communication information ======' 245 call comm_list_generate
248 call comm_sortdest_pl
249 call comm_sortdest_singular
251 allocate(
req_list( recv_nmax_r2r + send_nmax_r2r &
252 + recv_nmax_p2r + send_nmax_p2r &
253 + recv_nmax_r2p + send_nmax_r2p ) )
255 if( testonly )
call comm_debugtest
262 subroutine comm_list_generate
287 integer :: prc, prc_rmt
288 integer :: rgnid, rgnid_rmt
289 integer :: i, j, i_rmt, j_rmt
318 rellist(i_recv_grid,cnt) =
suf(i,j)
319 rellist(i_recv_rgn, cnt) = rgnid
320 rellist(i_recv_prc, cnt) = prc
321 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
322 rellist(i_send_rgn, cnt) = rgnid_rmt
323 rellist(i_send_prc, cnt) = prc_rmt
340 rellist(i_recv_grid,cnt) =
suf(i,j)
341 rellist(i_recv_rgn, cnt) = rgnid
342 rellist(i_recv_prc, cnt) = prc
343 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
344 rellist(i_send_rgn, cnt) = rgnid_rmt
345 rellist(i_send_prc, cnt) = prc_rmt
364 rellist(i_recv_grid,cnt) =
suf(i,j)
365 rellist(i_recv_rgn, cnt) = rgnid
366 rellist(i_recv_prc, cnt) = prc
367 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
368 rellist(i_send_rgn, cnt) = rgnid_rmt
369 rellist(i_send_prc, cnt) = prc_rmt
386 rellist(i_recv_grid,cnt) =
suf(i,j)
387 rellist(i_recv_rgn, cnt) = rgnid
388 rellist(i_recv_prc, cnt) = prc
389 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
390 rellist(i_send_rgn, cnt) = rgnid_rmt
391 rellist(i_send_prc, cnt) = prc_rmt
410 rellist(i_recv_grid,cnt) =
suf(i,j)
411 rellist(i_recv_rgn, cnt) = rgnid
412 rellist(i_recv_prc, cnt) = prc
413 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
414 rellist(i_send_rgn, cnt) = rgnid_rmt
415 rellist(i_send_prc, cnt) = prc_rmt
432 rellist(i_recv_grid,cnt) =
suf(i,j)
433 rellist(i_recv_rgn, cnt) = rgnid
434 rellist(i_recv_prc, cnt) = prc
435 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
436 rellist(i_send_rgn, cnt) = rgnid_rmt
437 rellist(i_send_prc, cnt) = prc_rmt
456 rellist(i_recv_grid,cnt) =
suf(i,j)
457 rellist(i_recv_rgn, cnt) = rgnid
458 rellist(i_recv_prc, cnt) = prc
459 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
460 rellist(i_send_rgn, cnt) = rgnid_rmt
461 rellist(i_send_prc, cnt) = prc_rmt
478 rellist(i_recv_grid,cnt) =
suf(i,j)
479 rellist(i_recv_rgn, cnt) = rgnid
480 rellist(i_recv_prc, cnt) = prc
481 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
482 rellist(i_send_rgn, cnt) = rgnid_rmt
483 rellist(i_send_prc, cnt) = prc_rmt
510 rellist(i_recv_grid,cnt) =
suf(i,j)
511 rellist(i_recv_rgn, cnt) = rgnid
512 rellist(i_recv_prc, cnt) = prc
513 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
514 rellist(i_send_rgn, cnt) = rgnid_rmt
515 rellist(i_send_prc, cnt) = prc_rmt
532 rellist(i_recv_grid,cnt) =
suf(i,j)
533 rellist(i_recv_rgn, cnt) = rgnid
534 rellist(i_recv_prc, cnt) = prc
535 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
536 rellist(i_send_rgn, cnt) = rgnid_rmt
537 rellist(i_send_prc, cnt) = prc_rmt
560 rellist(i_recv_grid,cnt) =
suf(i,j)
561 rellist(i_recv_rgn, cnt) = rgnid
562 rellist(i_recv_prc, cnt) = prc
563 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
564 rellist(i_send_rgn, cnt) = rgnid_rmt
565 rellist(i_send_prc, cnt) = prc_rmt
581 rellist(i_recv_grid,cnt) =
suf(i,j)
582 rellist(i_recv_rgn, cnt) = rgnid
583 rellist(i_recv_prc, cnt) = prc
584 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
585 rellist(i_send_rgn, cnt) = rgnid_rmt
586 rellist(i_send_prc, cnt) = prc_rmt
604 rellist(i_recv_grid,cnt) =
suf(i,j)
605 rellist(i_recv_rgn, cnt) = rgnid
606 rellist(i_recv_prc, cnt) = prc
607 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
608 rellist(i_send_rgn, cnt) = rgnid_rmt
609 rellist(i_send_prc, cnt) = prc_rmt
632 rellist(i_recv_grid,cnt) =
suf(i,j)
633 rellist(i_recv_rgn, cnt) = rgnid
634 rellist(i_recv_prc, cnt) = prc
635 rellist(i_send_grid,cnt) =
suf(i_rmt,j_rmt)
636 rellist(i_send_rgn, cnt) = rgnid_rmt
637 rellist(i_send_prc, cnt) = prc_rmt
648 if(
io_l )
write(
io_fid_log,
'(7(A10))')
'Count',
'|recv_grid',
'| recv_rgn',
'| recv_prc', &
649 '|send_grid',
'| send_rgn',
'| send_prc' 650 do cnt = 1, rellist_nmax
656 end subroutine comm_list_generate
660 subroutine comm_sortdest
671 integer :: sendbuf1(1)
672 integer :: recvbuf1(1)
674 integer,
allocatable :: sendbuf_info(:)
675 integer,
allocatable :: recvbuf_info(:)
676 integer,
allocatable :: sendbuf_list(:,:,:)
677 integer,
allocatable :: recvbuf_list(:,:,:)
678 integer,
allocatable :: REQ_list_r2r(:)
680 integer :: Recv_nglobal_r2r
681 integer :: Send_size_nglobal
683 integer :: cnt, irank, ipos
684 integer :: totalsize, rank, tag
686 integer :: i_from, j_from, r_from, g_from, l_from, p_from
687 integer :: i_to, j_to, r_to, g_to, l_to, p_to
704 allocate(
recv_list_r2r(list_vindex,rellist_nmax,recv_nlim) )
705 allocate(
send_list_r2r(list_vindex,rellist_nmax,send_nlim) )
711 do cnt = 1, rellist_nmax
713 if ( rellist(i_recv_prc,cnt) == rellist(i_send_prc,cnt) )
then 724 do n = 1, recv_nmax_r2r
725 if (
recv_info_r2r(i_prc_from,n) == rellist(i_send_prc,cnt) )
then 731 if ( irank < 0 )
then 732 recv_nmax_r2r = recv_nmax_r2r + 1
733 irank = recv_nmax_r2r
742 recv_list_r2r(i_grid_from,ipos,irank) = rellist(i_send_grid,cnt)
744 recv_list_r2r(i_grid_to ,ipos,irank) = rellist(i_recv_grid,cnt)
758 sendbuf1(1) = recv_nmax_r2r
760 call mpi_allreduce( sendbuf1(1), &
768 recv_nglobal_r2r = recvbuf1(1)
771 allocate( sendbuf_info(info_vindex*recv_nglobal_r2r) )
772 allocate( recvbuf_info(info_vindex*recv_nglobal_r2r*
prc_nprocs) )
775 do irank = 1, recv_nmax_r2r
776 n = (irank-1) * info_vindex
783 totalsize = info_vindex * recv_nglobal_r2r
785 if ( totalsize > 0 )
then 786 call mpi_allgather( sendbuf_info(1), &
796 send_size_nglobal = 0
800 n = (p-1) * info_vindex
802 if ( recvbuf_info(n+i_prc_from) ==
prc_myrank )
then 803 send_nmax_r2r = send_nmax_r2r + 1
804 irank = send_nmax_r2r
811 send_size_nglobal = max( send_size_nglobal, recvbuf_info(n+i_size) )
815 if(
io_l )
write(
io_fid_log,*)
'*** Recv_nmax_r2r(global) = ', recv_nglobal_r2r
816 if(
io_l )
write(
io_fid_log,*)
'*** Recv_nmax_r2r(local) = ', recv_nmax_r2r
817 if(
io_l )
write(
io_fid_log,*)
'*** Send_nmax_r2r(local) = ', send_nmax_r2r
818 if(
io_l )
write(
io_fid_log,*)
'*** Send_size_r2r(global) = ', send_size_nglobal
820 if(
io_l )
write(
io_fid_log,
'(A)')
'|---------------------------------------' 823 do irank = 1, recv_nmax_r2r
826 do irank = 1, send_nmax_r2r
831 allocate( req_list_r2r(recv_nmax_r2r+send_nmax_r2r) )
833 allocate( sendbuf_list(list_vindex,send_size_nglobal,recv_nmax_r2r) )
834 allocate( recvbuf_list(list_vindex,send_size_nglobal,send_nmax_r2r) )
835 sendbuf_list(:,:,:) = -1
839 do irank = 1, send_nmax_r2r
840 req_count = req_count + 1
845 call mpi_irecv( recvbuf_list(1,1,irank), &
851 req_list_r2r(req_count), &
855 do irank = 1, recv_nmax_r2r
860 req_count = req_count + 1
865 call mpi_isend( sendbuf_list(1,1,irank), &
871 req_list_r2r(req_count), &
876 if ( recv_nmax_r2r+send_nmax_r2r > 0 )
then 877 call mpi_waitall( recv_nmax_r2r+send_nmax_r2r, &
879 mpi_statuses_ignore, &
883 do irank = 1, send_nmax_r2r
894 '|ifrom',
'|jfrom',
'|rfrom',
'|gfrom',
'|lfrom',
'|pfrom', &
895 '| ito',
'| jto',
'| rto',
'| gto',
'| lto',
'| pto' 910 if(
io_l )
write(
io_fid_log,
'(13(I6))') ipos, i_from, j_from, r_from, g_from, l_from, p_from, &
911 i_to , j_to , r_to , g_to , l_to , p_to
916 do irank = 1, recv_nmax_r2r
918 '|ifrom',
'|jfrom',
'|rfrom',
'|gfrom',
'|lfrom',
'|pfrom', &
919 '| ito',
'| jto',
'| rto',
'| gto',
'| lto',
'| pto' 934 if(
io_l )
write(
io_fid_log,
'(13(I6))') ipos, i_from, j_from, r_from, g_from, l_from, p_from, &
935 i_to , j_to , r_to , g_to , l_to , p_to
941 do irank = 1, send_nmax_r2r
943 '|ifrom',
'|jfrom',
'|rfrom',
'|gfrom',
'|lfrom',
'|pfrom', &
944 '| ito',
'| jto',
'| rto',
'| gto',
'| lto',
'| pto' 959 if(
io_l )
write(
io_fid_log,
'(13(I6))') ipos, i_from, j_from, r_from, g_from, l_from, p_from, &
960 i_to , j_to , r_to , g_to , l_to , p_to
971 end subroutine comm_sortdest
975 subroutine comm_sortdest_pl
996 integer :: prc, prc_rmt
997 integer :: rgnid, rgnid_rmt
998 integer :: check_vert_num
1001 integer :: irank, ipos
1003 integer,
parameter :: Send_size_nglobal_pl = 10
1005 integer :: l, l_pl, n, v, vv
1006 integer :: i_from, j_from, r_from, g_from, l_from, p_from
1007 integer :: i_to, j_to, r_to, g_to, l_to, p_to
1021 allocate(
recv_list_p2r(list_vindex,send_size_nglobal_pl,recv_nlim) )
1022 allocate(
send_list_p2r(list_vindex,send_size_nglobal_pl,send_nlim) )
1038 allocate(
recv_list_r2p(list_vindex,send_size_nglobal_pl,recv_nlim) )
1039 allocate(
send_list_r2p(list_vindex,send_size_nglobal_pl,send_nlim) )
1053 if ( rgnid_rmt ==
i_npl )
then 1059 elseif( rgnid_rmt ==
i_spl )
then 1078 if ( prc == prc_rmt )
then 1090 do n = 1, recv_nmax_p2r
1097 if ( irank < 0 )
then 1098 recv_nmax_p2r = recv_nmax_p2r + 1
1099 irank = recv_nmax_p2r
1115 do n = 1, send_nmax_r2p
1122 if ( irank < 0 )
then 1123 send_nmax_r2p = send_nmax_r2p + 1
1124 irank = send_nmax_r2p
1157 if ( rgnid ==
i_npl )
then 1162 elseif( rgnid ==
i_spl )
then 1172 if ( prc == prc_rmt )
then 1184 do n = 1, recv_nmax_r2p
1191 if ( irank < 0 )
then 1192 recv_nmax_r2p = recv_nmax_r2p + 1
1193 irank = recv_nmax_r2p
1209 do n = 1, send_nmax_p2r
1216 if ( irank < 0 )
then 1217 send_nmax_p2r = send_nmax_p2r + 1
1218 irank = send_nmax_p2r
1252 if(
io_l )
write(
io_fid_log,*)
'*** Recv_nmax_p2r(local) = ', recv_nmax_p2r
1253 if(
io_l )
write(
io_fid_log,*)
'*** Send_nmax_p2r(local) = ', send_nmax_p2r
1255 if(
io_l )
write(
io_fid_log,
'(A)')
'|---------------------------------------' 1258 do irank = 1, recv_nmax_p2r
1261 do irank = 1, send_nmax_p2r
1270 '|rfrom',
'|gfrom',
'|lfrom',
'|pfrom', &
1271 '| ito',
'| jto',
'| rto',
'| gto',
'| lto',
'| pto' 1284 if(
io_l )
write(
io_fid_log,
'(11(I6))') ipos, r_from, g_from, l_from, p_from, &
1285 i_to , j_to , r_to , g_to , l_to , p_to
1290 do irank = 1, recv_nmax_p2r
1292 '|rfrom',
'|gfrom',
'|lfrom',
'|pfrom', &
1293 '| ito',
'| jto',
'| rto',
'| gto',
'| lto',
'| pto' 1306 if(
io_l )
write(
io_fid_log,
'(11(I6))') ipos, r_from, g_from, l_from, p_from, &
1307 i_to , j_to , r_to , g_to , l_to , p_to
1313 do irank = 1, send_nmax_p2r
1315 '|rfrom',
'|gfrom',
'|lfrom',
'|pfrom', &
1316 '| ito',
'| jto',
'| rto',
'| gto',
'| lto',
'| pto' 1329 if(
io_l )
write(
io_fid_log,
'(11(I6))') ipos, r_from, g_from, l_from, p_from, &
1330 i_to , j_to , r_to , g_to , l_to , p_to
1336 if(
io_l )
write(
io_fid_log,*)
'*** Recv_nmax_r2p(local) = ', recv_nmax_r2p
1337 if(
io_l )
write(
io_fid_log,*)
'*** Send_nmax_r2p(local) = ', send_nmax_r2p
1339 if(
io_l )
write(
io_fid_log,
'(A)')
'|---------------------------------------' 1342 do irank = 1, recv_nmax_r2p
1345 do irank = 1, send_nmax_r2p
1354 '|ifrom',
'|jfrom',
'|rfrom',
'|gfrom',
'|lfrom',
'|pfrom', &
1355 '| rto',
'| gto',
'| lto',
'| pto' 1368 if(
io_l )
write(
io_fid_log,
'(11(I6))') ipos, i_from, j_from, r_from, g_from, l_from, p_from, &
1369 r_to , g_to , l_to , p_to
1374 do irank = 1, recv_nmax_r2p
1376 '|ifrom',
'|jfrom',
'|rfrom',
'|gfrom',
'|lfrom',
'|pfrom', &
1377 '| rto',
'| gto',
'| lto',
'| pto' 1390 if(
io_l )
write(
io_fid_log,
'(11(I6))') ipos, i_from, j_from, r_from, g_from, l_from, p_from, &
1391 r_to , g_to , l_to , p_to
1397 do irank = 1, send_nmax_r2p
1399 '|ifrom',
'|jfrom',
'|rfrom',
'|gfrom',
'|lfrom',
'|pfrom', &
1400 '| rto',
'| gto',
'| lto',
'| pto' 1413 if(
io_l )
write(
io_fid_log,
'(11(I6))') ipos, i_from, j_from, r_from, g_from, l_from, p_from, &
1414 r_to , g_to , l_to , p_to
1419 if(
io_l )
write(
io_fid_log,*)
'*** Send_size_p2r,r2p = ', send_size_nglobal_pl
1431 end subroutine comm_sortdest_pl
1435 subroutine comm_sortdest_singular
1449 integer :: i, j, i_rmt, j_rmt
1452 integer :: i_from, j_from, r_from, g_from, l_from, p_from
1453 integer :: i_to, j_to, r_to, g_to, l_to, p_to
1520 if(
io_l )
write(
io_fid_log,
'(A)')
'|---------------------------------------' 1529 '|ifrom',
'|jfrom',
'|rfrom',
'|gfrom',
'|lfrom',
'|pfrom', &
1530 '| ito',
'| jto',
'| rto',
'| gto',
'| lto',
'| pto' 1545 if(
io_l )
write(
io_fid_log,
'(13(I6))') ipos, i_from, j_from, r_from, g_from, l_from, p_from, &
1546 i_to , j_to , r_to , g_to , l_to , p_to
1551 end subroutine comm_sortdest_singular
1563 real(SP),
intent(inout) :: var (:,:,:,:)
1564 real(SP),
intent(inout) :: var_pl(:,:,:,:)
1566 integer :: shp(4), kmax, vmax
1567 integer :: totalsize, rank, tag
1568 integer :: irank, ipos, imax
1569 integer :: ij_from, l_from, ij_to, l_to
1571 integer :: k, v, ikv
1578 if ( comm_apply_barrier )
then 1592 if ( kmax * vmax >
adm_kall * comm_varmax )
then 1593 write(*,*)
'xxx [COMM_data_transfer] kmax * vmax exceeds ADM_kall * COMM_varmax, stop!' 1594 write(*,*)
'xxx kmax * vmax = ', kmax * vmax
1595 write(*,*)
'xxx ADM_kall * COMM_varmax = ',
adm_kall * comm_varmax
1619 do irank = 1, recv_nmax_r2r
1620 req_count = req_count + 1
1636 do irank = 1, recv_nmax_p2r
1637 req_count = req_count + 1
1653 do irank = 1, recv_nmax_r2p
1654 req_count = req_count + 1
1674 do irank = 1, send_nmax_r2r
1690 ikv = (v-1) * imax * kmax &
1701 req_count = req_count + 1
1702 totalsize = imax * kmax * vmax
1718 do irank = 1, send_nmax_p2r
1734 ikv = (v-1) * imax * kmax &
1745 req_count = req_count + 1
1746 totalsize = imax * kmax * vmax
1762 do irank = 1, send_nmax_r2p
1778 ikv = (v-1) * imax * kmax &
1789 req_count = req_count + 1
1790 totalsize = imax * kmax * vmax
1817 do irank = 1, copy_nmax_r2r
1833 var(ij_to,k,l_to,v) = var(ij_from,k,l_from,v)
1842 do irank = 1, copy_nmax_p2r
1858 var(ij_to,k,l_to,v) = var_pl(ij_from,k,l_from,v)
1867 do irank = 1, copy_nmax_r2p
1883 var_pl(ij_to,k,l_to,v) = var(ij_from,k,l_from,v)
1894 if ( req_count > 0 )
then 1895 call mpi_waitall( req_count, &
1897 mpi_statuses_ignore, &
1914 do irank = 1, recv_nmax_r2r
1928 ikv = (v-1) * imax * kmax &
1941 do irank = 1, recv_nmax_p2r
1955 ikv = (v-1) * imax * kmax &
1968 do irank = 1, recv_nmax_r2p
1982 ikv = (v-1) * imax * kmax &
1998 do irank = 1, singular_nmax
2014 var(ij_to,k,l_to,v) = var(ij_from,k,l_from,v)
2042 real(DP),
intent(inout) :: var (:,:,:,:)
2043 real(DP),
intent(inout) :: var_pl(:,:,:,:)
2045 integer :: shp(4), kmax, vmax
2046 integer :: totalsize, rank, tag
2047 integer :: irank, ipos, imax
2048 integer :: ij_from, l_from, ij_to, l_to
2050 integer :: k, v, ikv
2057 if ( comm_apply_barrier )
then 2071 if ( kmax * vmax >
adm_kall * comm_varmax )
then 2072 write(*,*)
'xxx [COMM_data_transfer] kmax * vmax exceeds ADM_kall * COMM_varmax, stop!' 2073 write(*,*)
'xxx kmax * vmax = ', kmax * vmax
2074 write(*,*)
'xxx ADM_kall * COMM_varmax = ',
adm_kall * comm_varmax
2098 do irank = 1, recv_nmax_r2r
2099 req_count = req_count + 1
2106 mpi_double_precision, &
2115 do irank = 1, recv_nmax_p2r
2116 req_count = req_count + 1
2123 mpi_double_precision, &
2132 do irank = 1, recv_nmax_r2p
2133 req_count = req_count + 1
2140 mpi_double_precision, &
2153 do irank = 1, send_nmax_r2r
2169 ikv = (v-1) * imax * kmax &
2180 req_count = req_count + 1
2181 totalsize = imax * kmax * vmax
2188 mpi_double_precision, &
2197 do irank = 1, send_nmax_p2r
2213 ikv = (v-1) * imax * kmax &
2224 req_count = req_count + 1
2225 totalsize = imax * kmax * vmax
2232 mpi_double_precision, &
2241 do irank = 1, send_nmax_r2p
2257 ikv = (v-1) * imax * kmax &
2268 req_count = req_count + 1
2269 totalsize = imax * kmax * vmax
2276 mpi_double_precision, &
2296 do irank = 1, copy_nmax_r2r
2312 var(ij_to,k,l_to,v) = var(ij_from,k,l_from,v)
2321 do irank = 1, copy_nmax_p2r
2337 var(ij_to,k,l_to,v) = var_pl(ij_from,k,l_from,v)
2346 do irank = 1, copy_nmax_r2p
2362 var_pl(ij_to,k,l_to,v) = var(ij_from,k,l_from,v)
2373 if ( req_count > 0 )
then 2374 call mpi_waitall( req_count, &
2376 mpi_statuses_ignore, &
2393 do irank = 1, recv_nmax_r2r
2407 ikv = (v-1) * imax * kmax &
2420 do irank = 1, recv_nmax_p2r
2434 ikv = (v-1) * imax * kmax &
2447 do irank = 1, recv_nmax_r2p
2461 ikv = (v-1) * imax * kmax &
2477 do irank = 1, singular_nmax
2493 var(ij_to,k,l_to,v) = var(ij_from,k,l_from,v)
2520 real(DP),
intent(inout) :: var (:,:,:,:)
2522 integer :: shp(4), kmax, vmax
2523 integer :: totalsize, rank, tag
2524 integer :: irank, ipos, imax
2525 integer :: ij_from, l_from, ij_to, l_to
2527 integer :: k, v, ikv
2531 if ( comm_apply_barrier )
then 2543 if ( kmax * vmax >
adm_kall * comm_varmax )
then 2544 write(*,*)
'xxx [COMM_data_transfer_nopl] kmax * vmax exceeds ADM_kall * COMM_varmax, stop!' 2545 write(*,*)
'xxx kmax * vmax = ', kmax * vmax
2546 write(*,*)
'xxx ADM_kall * COMM_varmax = ',
adm_kall * comm_varmax
2561 do irank = 1, recv_nmax_r2r
2562 req_count = req_count + 1
2569 mpi_double_precision, &
2578 do irank = 1, send_nmax_r2r
2589 ikv = (v-1) * imax * kmax &
2599 req_count = req_count + 1
2600 totalsize = imax * kmax * vmax
2606 mpi_double_precision, &
2617 do irank = 1, copy_nmax_r2r
2628 var(ij_to,k,l_to,v) = var(ij_from,k,l_from,v)
2636 if ( req_count > 0 )
then 2637 call mpi_waitall( req_count, &
2639 mpi_statuses_ignore, &
2646 do irank = 1, recv_nmax_r2r
2655 ikv = (v-1) * imax * kmax &
2667 do irank = 1, singular_nmax
2678 var(ij_to,k,l_to,v) = var(ij_from,k,l_from,v)
2706 integer,
intent(in) :: kmax
2707 integer,
intent(in) :: vmax
2714 integer :: totalsize, rank, tag
2715 integer :: irank, ipos
2716 integer :: ij_from, l_from, ij_to, l_to
2717 integer :: r_from, r_to
2723 if ( comm_apply_barrier )
then 2736 do irank = 1, send_nmax_p2r
2742 req_count = req_count + 1
2743 totalsize = kmax * vmax
2747 call mpi_irecv( recvbuf_h2p_sp(1,
i_npl), &
2758 req_count = req_count + 1
2759 totalsize = kmax * vmax
2763 call mpi_irecv( recvbuf_h2p_sp(1,
i_spl), &
2776 do irank = 1, recv_nmax_p2r
2785 kk = (v-1) * kmax + k
2786 sendbuf_h2p_sp(kk,
i_npl) = var(ij_from,k,l_from,v)
2790 req_count = req_count + 1
2791 totalsize = kmax * vmax
2795 call mpi_isend( sendbuf_h2p_sp(1,
i_npl), &
2808 kk = (v-1) * kmax + k
2809 sendbuf_h2p_sp(kk,
i_spl) = var(ij_from,k,l_from,v)
2813 req_count = req_count + 1
2814 totalsize = kmax * vmax
2818 call mpi_isend( sendbuf_h2p_sp(1,
i_spl), &
2831 do irank = 1, copy_nmax_p2r
2844 var_pl(ij_to,k,l_to,v) = var(ij_from,k,l_from,v)
2852 if ( req_count > 0 )
then 2853 call mpi_waitall( req_count, &
2855 mpi_statuses_ignore, &
2860 do irank = 1, send_nmax_p2r
2871 kk = (v-1) * kmax + k
2872 var_pl(ij_to,k,l_to,v) = recvbuf_h2p_sp(kk,
i_npl)
2880 kk = (v-1) * kmax + k
2881 var_pl(ij_to,k,l_to,v) = recvbuf_h2p_sp(kk,
i_spl)
2914 integer,
intent(in) :: kmax
2915 integer,
intent(in) :: vmax
2922 integer :: totalsize, rank, tag
2923 integer :: irank, ipos
2924 integer :: ij_from, l_from, ij_to, l_to
2925 integer :: r_from, r_to
2931 if ( comm_apply_barrier )
then 2944 do irank = 1, send_nmax_p2r
2950 req_count = req_count + 1
2951 totalsize = kmax * vmax
2955 call mpi_irecv( recvbuf_h2p_dp(1,
i_npl), &
2957 mpi_double_precision, &
2966 req_count = req_count + 1
2967 totalsize = kmax * vmax
2971 call mpi_irecv( recvbuf_h2p_dp(1,
i_spl), &
2973 mpi_double_precision, &
2984 do irank = 1, recv_nmax_p2r
2993 kk = (v-1) * kmax + k
2994 sendbuf_h2p_dp(kk,
i_npl) = var(ij_from,k,l_from,v)
2998 req_count = req_count + 1
2999 totalsize = kmax * vmax
3003 call mpi_isend( sendbuf_h2p_dp(1,
i_npl), &
3005 mpi_double_precision, &
3016 kk = (v-1) * kmax + k
3017 sendbuf_h2p_dp(kk,
i_spl) = var(ij_from,k,l_from,v)
3021 req_count = req_count + 1
3022 totalsize = kmax * vmax
3026 call mpi_isend( sendbuf_h2p_dp(1,
i_spl), &
3028 mpi_double_precision, &
3039 do irank = 1, copy_nmax_p2r
3052 var_pl(ij_to,k,l_to,v) = var(ij_from,k,l_from,v)
3060 if ( req_count > 0 )
then 3061 call mpi_waitall( req_count, &
3063 mpi_statuses_ignore, &
3068 do irank = 1, send_nmax_p2r
3079 kk = (v-1) * kmax + k
3080 var_pl(ij_to,k,l_to,v) = recvbuf_h2p_dp(kk,
i_npl)
3088 kk = (v-1) * kmax + k
3089 var_pl(ij_to,k,l_to,v) = recvbuf_h2p_dp(kk,
i_spl)
3108 function suf(i,j)
result(suffix)
3120 subroutine comm_debugtest
3135 integer :: i, j, k, l, ij, rgnid, prc
3141 var(:,:,:,:) = -999.0_rp
3142 var_pl(:,:,:,:) = -999.0_rp
3153 var(ij,k,l,1) =
real(prc, kind=
rp)
3154 var(ij,k,l,2) =
real(rgnid,kind=
rp)
3155 var(ij,k,l,3) =
real(i, kind=
rp)
3156 var(ij,k,l,4) =
real(j, kind=
rp)
3163 var(1,k,l,:) = -1.0_rp
3174 var_pl(ij,k,l,1) =
real(-prc, kind=
rp)
3175 var_pl(ij,k,l,2) =
real(-rgnid,kind=
rp)
3176 var_pl(ij,k,l,3) =
real(-ij, kind=
rp)
3177 var_pl(ij,k,l,4) =
real(-ij, kind=
rp)
3197 '(',int(var(ij,k,l,1)),
',',int(var(ij,k,l,2)),
')' 3216 '(',int(var_pl(ij,k,l,1)),
',',int(var_pl(ij,k,l,2)),
')' 3237 '(',int(var(ij,k,l,3)),
',',int(var(ij,k,l,4)),
')' 3256 '(',int(var_pl(ij,k,l,3)),
',',int(var_pl(ij,k,l,4)),
')' 3267 call comm_data_transfer( var(:,:,:,:), var_pl(:,:,:,:) )
3284 '(',int(var(ij,k,l,1)),
',',int(var(ij,k,l,2)),
')' 3303 '(',int(var_pl(ij,k,l,1)),
',',int(var_pl(ij,k,l,2)),
')' 3324 '(',int(var(ij,k,l,3)),
',',int(var(ij,k,l,4)),
')' 3343 '(',int(var_pl(ij,k,l,3)),
',',int(var_pl(ij,k,l,4)),
')' 3361 var(ij,k,l,1) =
real(prc, kind=
rp)
3362 var(ij,k,l,2) =
real(rgnid,kind=
rp)
3363 var(ij,k,l,3) =
real(i, kind=
rp)
3364 var(ij,k,l,4) =
real(j, kind=
rp)
3374 var(ij,k,l,1) =
real(prc, kind=
rp)
3375 var(ij,k,l,2) =
real(rgnid,kind=
rp)
3376 var(ij,k,l,3) =
real(i, kind=
rp)
3377 var(ij,k,l,4) =
real(j, kind=
rp)
3386 call comm_var( var(:,:,:,:), var_pl(:,:,:,:),
adm_kall, 4 )
3403 '(',int(var(ij,k,l,1)),
',',int(var(ij,k,l,2)),
')' 3422 '(',int(var_pl(ij,k,l,1)),
',',int(var_pl(ij,k,l,2)),
')' 3443 '(',int(var(ij,k,l,3)),
',',int(var(ij,k,l,4)),
')' 3462 '(',int(var_pl(ij,k,l,3)),
',',int(var_pl(ij,k,l,4)),
')' 3471 end subroutine comm_debugtest
3480 real(SP),
intent(in) :: localsum
3481 real(SP),
intent(out) :: globalsum
3483 real(SP) :: sendbuf(1)
3490 sendbuf(1) = localsum
3492 call mpi_allgather( sendbuf, &
3501 globalsum = sum( recvbuf(:) )
3503 globalsum = localsum
3516 real(DP),
intent(in) :: localsum
3517 real(DP),
intent(out) :: globalsum
3519 real(DP) :: sendbuf(1)
3526 sendbuf(1) = localsum
3528 call mpi_allgather( sendbuf, &
3530 mpi_double_precision, &
3533 mpi_double_precision, &
3537 globalsum = sum( recvbuf(:) )
3539 globalsum = localsum
3552 integer,
intent(in) :: kall
3553 real(SP),
intent(in) :: localsum (kall)
3554 real(SP),
intent(out) :: globalsum(kall)
3556 real(SP) :: sendbuf(kall)
3566 displs(p) = (p-1) * kall
3571 sendbuf(:) = localsum(:)
3573 call mpi_allgatherv( sendbuf, &
3584 globalsum(k) = sum( recvbuf(k,:) )
3588 globalsum(k) = localsum(k)
3602 integer,
intent(in) :: kall
3603 real(DP),
intent(in) :: localsum (kall)
3604 real(DP),
intent(out) :: globalsum(kall)
3606 real(DP) :: sendbuf(kall)
3616 displs(p) = (p-1) * kall
3621 sendbuf(:) = localsum(:)
3623 call mpi_allgatherv( sendbuf, &
3625 mpi_double_precision, &
3629 mpi_double_precision, &
3634 globalsum(k) = sum( recvbuf(k,:) )
3638 globalsum(k) = localsum(k)
3652 real(SP),
intent(in) :: localavg
3653 real(SP),
intent(out) :: globalavg
3655 real(SP) :: sendbuf(1)
3662 sendbuf(1) = localavg
3664 call mpi_allgather( sendbuf, &
3673 globalavg = sum( recvbuf(:) ) /
real(
prc_nprocs,kind=
sp)
3675 globalavg = localavg
3688 real(DP),
intent(in) :: localavg
3689 real(DP),
intent(out) :: globalavg
3691 real(DP) :: sendbuf(1)
3698 sendbuf(1) = localavg
3700 call mpi_allgather( sendbuf, &
3702 mpi_double_precision, &
3705 mpi_double_precision, &
3709 globalavg = sum( recvbuf(:) ) /
real(
prc_nprocs,kind=
dp)
3711 globalavg = localavg
3724 real(SP),
intent(in) :: localmax
3725 real(SP),
intent(out) :: globalmax
3727 real(SP) :: sendbuf(1)
3733 sendbuf(1) = localmax
3735 call mpi_allgather( sendbuf, &
3744 globalmax = maxval( recvbuf(:) )
3756 real(DP),
intent(in) :: localmax
3757 real(DP),
intent(out) :: globalmax
3759 real(DP) :: sendbuf(1)
3765 sendbuf(1) = localmax
3767 call mpi_allgather( sendbuf, &
3769 mpi_double_precision, &
3772 mpi_double_precision, &
3776 globalmax = maxval( recvbuf(:) )
3788 real(SP),
intent(in) :: localmin
3789 real(SP),
intent(out) :: globalmin
3791 real(SP) :: sendbuf(1)
3797 sendbuf(1) = localmin
3799 call mpi_allgather( sendbuf, &
3808 globalmin = minval( recvbuf(:) )
3820 real(DP),
intent(in) :: localmin
3821 real(DP),
intent(out) :: globalmin
3823 real(DP) :: sendbuf(1)
3829 sendbuf(1) = localmin
3831 call mpi_allgather( sendbuf, &
3833 mpi_double_precision, &
3836 mpi_double_precision, &
3840 globalmin = minval( recvbuf(:) )
real(dp), dimension(:,:), allocatable, public recvbuf_r2r_dp
integer, parameter, public i_prc
process
integer, dimension(:,:,:), allocatable, public send_list_p2r
subroutine comm_var_sp(var, var_pl, kmax, vmax)
Data transfer with region halo => pole center.
integer, dimension(:,:,:), allocatable, public recv_list_r2r
subroutine comm_stat_sum_dp(localsum, globalsum)
subroutine, public comm_setup
Setup.
integer, dimension(:,:,:), allocatable, public prc_rgn_edge_tab
region link information (for 4 edges)
integer, parameter, public i_e
east
integer, parameter, public i_l
local region
integer, parameter, public adm_gmin_pl
integer, dimension(:,:,:), allocatable, public recv_list_p2r
integer, parameter, public i_se
south east
integer, parameter, public i_spl
south pole
real(sp), dimension(:,:), allocatable, public sendbuf_r2p_sp
integer, parameter, public adm_gslf_pl
integer, public adm_gall_1d
integer, dimension(:,:,:,:), allocatable, public prc_rgn_vert_tab
region link information (for 4 vertexes)
integer, dimension(:), allocatable, public copy_info_p2r
integer, dimension(:,:), allocatable, public recv_info_p2r
integer, dimension(:), allocatable, public prc_rgn_l2r
l,prc_me => rgn
integer, public io_fid_conf
Config file ID.
integer, dimension(:,:), allocatable, public send_info_r2p
integer, parameter, public adm_lall_pl
subroutine comm_stat_sum_sp(localsum, globalsum)
real(dp), dimension(:,:), allocatable, public recvbuf_r2p_dp
integer, dimension(:), allocatable, public singular_info
integer, dimension(:,:), allocatable, public recv_info_r2p
integer, public prc_nprocs
myrank in local communicator
integer, parameter, public i_dir
direction
integer, dimension(:,:), allocatable, public singular_list
subroutine comm_data_transfer_dp(var, var_pl)
Data transfer kernel.
subroutine comm_stat_avg_sp(localavg, globalavg)
integer, parameter, public i_sw
south west
logical, public io_l
output log or not? (this process)
integer, dimension(:,:), allocatable, public send_info_p2r
integer, parameter, public i_w
west
integer, public adm_gmax_pl
real(sp), dimension(:,:), allocatable, public sendbuf_r2r_sp
integer, parameter, public i_nw
north west
integer, dimension(:), allocatable, public copy_info_r2p
integer, dimension(:,:), allocatable, public recv_info_r2r
real(dp), dimension(:,:), allocatable, public recvbuf_p2r_dp
integer, dimension(:,:), allocatable, public prc_rgn_vert_num
number of region around the vertex (4 vertexes)
integer, dimension(:,:), allocatable, public copy_list_p2r
integer, dimension(:,:,:), allocatable, public recv_list_r2p
integer, dimension(prc_rgn_total_pl), public prc_rgn_r2p_pl
process ID which have the pole regions
subroutine comm_stat_max_dp(localmax, globalmax)
integer, public comm_datatype
integer, dimension(:), allocatable, public req_list
integer, dimension(prc_rgn_total_pl), public prc_rgn_rgn4pl
region, having pole data in the halo
real(dp), dimension(:,:), allocatable, public sendbuf_r2r_dp
integer, public adm_vlink
subroutine comm_stat_sum_eachlayer_sp(kall, localsum, globalsum)
integer, dimension(:), allocatable, public copy_info_r2r
integer, public prc_myrank
process num in local communicator
integer, parameter, public i_ne
north east
subroutine, public prc_abort
Abort Process.
real(sp), dimension(:,:), allocatable, public recvbuf_p2r_sp
integer, dimension(:,:), allocatable, public send_info_r2r
real(dp), dimension(:,:), allocatable, public sendbuf_p2r_dp
integer, public adm_gall_pl
real(sp), dimension(:,:), allocatable, public recvbuf_r2p_sp
subroutine comm_var_dp(var, var_pl, kmax, vmax)
Data transfer with region halo => pole center.
subroutine comm_stat_max_sp(localmax, globalmax)
subroutine, public comm_data_transfer_nopl(var)
Data transfer kernel.
subroutine, public prof_rapstart(rapname_base, level)
Start raptime.
integer, public prc_rgn_local
number of regular region (local)
integer, parameter, public i_npl
north pole
integer, parameter, public i_rgnid
region id
integer, dimension(:,:,:), allocatable, public prc_rgn_vert_tab_pl
region link information (for 4 vertexes)
integer function suf(i, j)
suffix calculation
module atmosphere / grid / icosahedralA / index
integer, parameter, public prc_rgn_total_pl
number of pole region
integer, dimension(:,:), allocatable, public prc_rgn_lp2r
l,prc => rgn
subroutine comm_stat_avg_dp(localavg, globalavg)
subroutine, public prc_mpifinish
Stop MPI peacefully.
real(dp), dimension(:,:), allocatable, public sendbuf_r2p_dp
integer, dimension(:,:,:), allocatable, public send_list_r2r
subroutine comm_data_transfer_sp(var, var_pl)
Data transfer kernel.
integer, parameter, public i_s
south
subroutine comm_stat_min_sp(localmin, globalmin)
integer, public prc_local_comm_world
local communicator
integer, parameter, public sp
logical, public io_nml
output log or not? (for namelist, this process)
subroutine comm_stat_sum_eachlayer_dp(kall, localsum, globalsum)
integer, parameter, public i_n
north
logical, public prc_have_pl
this ID manages pole region?
subroutine comm_stat_min_dp(localmin, globalmin)
subroutine, public prof_rapend(rapname_base, level)
Save raptime.
integer, public io_fid_log
Log file ID.
integer, dimension(:,:,:), allocatable, public send_list_r2p
integer, parameter, public rp
real(sp), dimension(:,:), allocatable, public sendbuf_p2r_sp
logical, dimension(:), allocatable, public prc_rgn_have_sgp
region have singlar point?
integer, parameter, public dp
integer, dimension(:,:), allocatable, public prc_rgn_r2lp
rgn => l,prc
real(sp), dimension(:,:), allocatable, public recvbuf_r2r_sp
integer, dimension(:,:), allocatable, public copy_list_r2r
integer, dimension(:,:), allocatable, public copy_list_r2p