61 module procedure comm_vars_2d
62 module procedure comm_vars_3d
63 end interface comm_vars
66 module procedure comm_vars8_2d
67 module procedure comm_vars8_3d
68 end interface comm_vars8
71 module procedure comm_wait_2d
72 module procedure comm_wait_3d
73 end interface comm_wait
78 end interface comm_gather
97 end interface comm_bcast
114 integer,
private :: comm_vsize_max
115 integer,
private :: comm_vsize_max_pc
117 logical,
private :: comm_isallperiodic
119 logical,
private :: comm_use_mpi_pc = .true.
121 logical,
private :: comm_use_mpi_onesided = .true.
123 logical,
private :: comm_use_mpi_onesided = .false.
128 real(
rp),
pointer :: ptr(:,:,:)
133 integer :: ia, is, ie, ihalo
134 integer :: ja, js, je, jhalo
136 integer :: size2d_ns4
137 integer :: size2d_ns8
140 integer :: vars_num = 0
141 real(
rp),
pointer :: recvpack_we2p(:,:,:)
142 real(
rp),
pointer :: sendpack_p2we(:,:,:)
143 type(c_ptr),
allocatable :: recvbuf_we(:)
144 type(c_ptr),
allocatable :: recvbuf_ns(:)
145 integer,
allocatable :: req_cnt (:)
146 integer,
allocatable :: req_list(:,:)
147 integer,
allocatable :: preq_cnt (:)
148 integer,
allocatable :: preq_list(:,:)
149 integer,
allocatable :: packid(:)
150 integer,
allocatable :: win_packwe(:)
151 integer,
allocatable :: win_packns(:)
153 logical,
allocatable :: use_packbuf(:)
156 logical,
allocatable :: device_alloc(:)
157 type(ptr_t),
allocatable :: device_ptr(:)
161 integer,
private,
parameter :: comm_gid_max = 20
162 integer,
private :: comm_gid
163 type(ginfo_t),
private,
save :: ginfo(comm_gid_max)
165 integer,
private :: group_packwe
166 integer,
private :: group_packns
167 logical,
private :: group_packwe_created = .false.
168 logical,
private :: group_packns_created = .false.
170 logical,
private :: initialized = .false.
184 namelist / param_comm_cartesc / &
188 comm_use_mpi_onesided
190 integer :: group, ranks(8)
196 if ( initialized )
return
199 log_info(
"COMM_setup",*)
'Setup'
201 comm_vsize_max = max( 10 +
qa*2, 25 )
202 comm_vsize_max_pc = 50 +
qa*2
205 comm_use_mpi_onesided = .false.
210 read(
io_fid_conf,nml=param_comm_cartesc,iostat=ierr)
212 log_info(
"COMM_setup",*)
'Not found namelist. Default used.'
213 elseif( ierr > 0 )
then
214 log_error(
"COMM_setup",*)
'Not appropriate names in namelist PARAM_COMM_CARTESC. Check!'
217 log_nml(param_comm_cartesc)
219 if ( prc_has_n .AND. prc_has_s .AND. prc_has_w .AND. prc_has_e )
then
220 comm_isallperiodic = .true.
222 comm_isallperiodic = .false.
225 if (
rp == kind(0.d0) )
then
227 elseif(
rp == kind(0.0) )
then
230 log_error(
"COMM_setup",*)
'precision is not supportd'
238 if ( comm_use_mpi_onesided )
then
239 log_warn(
"COMM_setup",*)
"Open MPI does not support one-sided APIs with CUDA-aware UCX"
243 if ( comm_use_mpi_onesided )
then
245 comm_use_mpi_pc = .false.
247 call mpi_comm_group(
comm_world, group, ierr )
250 if ( prc_has_s )
then
252 ranks(n) = prc_next(prc_s)
254 if ( prc_has_n )
then
256 if ( ranks(m) == prc_next(prc_n) )
exit
258 if ( m == n + 1 )
then
260 ranks(n) = prc_next(prc_n)
263 if ( prc_has_n .and. prc_has_w )
then
265 if ( ranks(m) == prc_next(prc_nw) )
exit
267 if ( m == n + 1 )
then
269 ranks(n) = prc_next(prc_nw)
271 else if ( prc_has_n )
then
273 if ( ranks(m) == prc_next(prc_n) )
exit
275 if ( m == n + 1 )
then
277 ranks(n) = prc_next(prc_n)
279 else if ( prc_has_w )
then
281 if ( ranks(m) == prc_next(prc_w) )
exit
283 if ( m == n + 1 )
then
285 ranks(n) = prc_next(prc_w)
288 if ( prc_has_n .and. prc_has_e )
then
290 if ( ranks(m) == prc_next(prc_ne) )
exit
292 if ( m == n + 1 )
then
294 ranks(n) = prc_next(prc_ne)
296 else if ( prc_has_n )
then
298 if ( ranks(m) == prc_next(prc_n) )
exit
300 if ( m == n + 1 )
then
302 ranks(n) = prc_next(prc_n)
304 else if ( prc_has_e )
then
306 if ( ranks(m) == prc_next(prc_e) )
exit
308 if ( m == n + 1 )
then
310 ranks(n) = prc_next(prc_e)
313 if ( prc_has_s .and. prc_has_w )
then
315 if ( ranks(m) == prc_next(prc_sw) )
exit
317 if ( m == n + 1 )
then
319 ranks(n) = prc_next(prc_sw)
321 else if ( prc_has_s )
then
323 if ( ranks(m) == prc_next(prc_s) )
exit
325 if ( m == n + 1 )
then
327 ranks(n) = prc_next(prc_s)
329 else if ( prc_has_w )
then
331 if ( ranks(m) == prc_next(prc_w) )
exit
333 if ( m == n + 1 )
then
335 ranks(n) = prc_next(prc_w)
338 if ( prc_has_s .and. prc_has_e )
then
340 if ( ranks(m) == prc_next(prc_se) )
exit
342 if ( m == n + 1 )
then
344 ranks(n) = prc_next(prc_se)
346 else if ( prc_has_s )
then
348 if ( ranks(m) == prc_next(prc_s) )
exit
350 if ( m == n + 1 )
then
352 ranks(n) = prc_next(prc_s)
354 else if ( prc_has_e )
then
356 if ( ranks(m) == prc_next(prc_e) )
exit
358 if ( m == n + 1 )
then
360 ranks(n) = prc_next(prc_e)
364 call mpi_group_incl( group, n, ranks, group_packns, ierr )
365 group_packns_created = .true.
367 group_packns_created = .false.
372 if ( prc_has_w )
then
374 ranks(n) = prc_next(prc_w)
376 if ( prc_has_e )
then
377 if ( n == 0 .or. ranks(1) .ne. prc_next(prc_e) )
then
379 ranks(n) = prc_next(prc_e)
384 call mpi_group_incl( group, n, ranks, group_packwe, ierr )
385 group_packwe_created = .true.
387 group_packwe_created = .false.
390 call mpi_group_free( group, ierr )
394 log_info(
"COMM_setup",*)
'Communication information'
395 log_info_cont(*)
'Maximum number of vars for one communication: ', comm_vsize_max
396 log_info_cont(*)
'All side is periodic? : ', comm_isallperiodic
407 KA, IA, JA, IHALO, JHALO, &
411 integer,
intent(in) :: ka, ia, ja, ihalo, jhalo
412 integer,
intent(out) :: gid
414 integer :: imax, jmax
415 integer :: nreq_ns, nreq_we, nreq_4c
418 integer(kind=MPI_ADDRESS_KIND) :: size
423 if ( .not. initialized )
then
424 log_error(
"COMM_regist",*)
'COMM_setup must be called before calling COMM_regist'
428 comm_gid = comm_gid + 1
429 if ( comm_gid > comm_gid_max )
then
430 log_error(
"COMM_regist",*)
'number of registed grid size exceeds the limit'
435 if ( ia < ihalo * 3 )
then
436 log_error(
"COMM_regist",*)
'IA must be >= IHALO * 3'
439 if ( ja < jhalo * 3 )
then
440 log_error(
"COMM_regist",*)
'JA must be >= JHALO * 3'
444 imax = ia - ihalo * 2
445 jmax = ja - jhalo * 2
449 ginfo(gid)%IS = ihalo + 1
450 ginfo(gid)%IE = ia - ihalo
451 ginfo(gid)%IHALO = ihalo
453 ginfo(gid)%JS = jhalo + 1
454 ginfo(gid)%JE = ja - jhalo
455 ginfo(gid)%JHALO = jhalo
461 if ( comm_use_mpi_pc )
then
462 ginfo(gid)%nreq_MAX = 2 * nreq_ns + 2 * nreq_we + 4 * nreq_4c + 1
464 ginfo(gid)%nreq_MAX = 2 * nreq_ns + 2 * nreq_we + 4 * nreq_4c
467 ginfo(gid)%size2D_NS4 = ia * jhalo
468 ginfo(gid)%size2D_NS8 = imax
469 ginfo(gid)%size2D_WE = jmax * ihalo
470 ginfo(gid)%size2D_4C = ihalo
472 allocate( ginfo(gid)%sendpack_P2WE(ginfo(gid)%size2D_WE * ka, 2, comm_vsize_max) )
476 allocate( ginfo(gid)%use_packbuf(comm_vsize_max) )
477 ginfo(gid)%use_packbuf(:) = .false.
481 allocate( ginfo(gid)%device_alloc(comm_vsize_max+comm_vsize_max_pc) )
482 allocate( ginfo(gid)%device_ptr(comm_vsize_max+1:comm_vsize_max_pc) )
483 ginfo(gid)%device_alloc(:) = .false.
486 if ( comm_use_mpi_onesided )
then
488 allocate( ginfo(gid)%recvbuf_WE(comm_vsize_max) )
489 allocate( ginfo(gid)%recvbuf_NS(comm_vsize_max) )
491 allocate( ginfo(gid)%win_packWE(comm_vsize_max) )
492 allocate( ginfo(gid)%win_packNS(comm_vsize_max) )
494 call mpi_info_create(win_info, ierr)
495 call mpi_info_set(win_info,
"no_locks",
"true", ierr)
496 call mpi_info_set(win_info,
"same_size",
"true", ierr)
497 call mpi_info_set(win_info,
"same_disp_unit",
"true", ierr)
499 do n = 1, comm_vsize_max
500 size = ginfo(gid)%size2D_WE * ka * 2 *
rp
503 real(
rp),
pointer :: pack(:)
504 call mpi_alloc_mem(
size, mpi_info_null, ginfo(gid)%recvbuf_WE(n), ierr)
505 call c_f_pointer(ginfo(gid)%recvbuf_WE(n), pack, (/ size/
rp /))
508 call mpi_win_create(pack,
size, ginfo(gid)%size2D_WE*ka*
rp, &
510 ginfo(gid)%win_packWE(n), ierr)
514 call mpi_win_allocate(
size, ginfo(gid)%size2D_WE*ka*
rp, &
516 ginfo(gid)%recvbuf_WE(n), ginfo(gid)%win_packWE(n), ierr)
518 size = ginfo(gid)%size2D_NS4 * ka * 2 *
rp
521 real(
rp),
pointer :: pack(:)
522 call mpi_alloc_mem(
size, mpi_info_null, ginfo(gid)%recvbuf_NS(n), ierr)
523 call c_f_pointer(ginfo(gid)%recvbuf_NS(n), pack, (/ size/
rp /))
526 call mpi_win_create(pack,
size,
rp, &
528 ginfo(gid)%win_packNS(n), ierr)
532 call mpi_win_allocate(
size, rp, &
534 ginfo(gid)%recvbuf_NS(n), ginfo(gid)%win_packNS(n), ierr)
538 call mpi_info_free(win_info, ierr)
540 do n = 1, comm_vsize_max
541 call mpi_win_post( group_packwe, mpi_mode_nostore, ginfo(gid)%win_packWE(n), ierr )
542 call mpi_win_post( group_packns, mpi_mode_nostore, ginfo(gid)%win_packNS(n), ierr )
545 ginfo(gid)%vars_num = 0
546 allocate( ginfo(gid)%packid(comm_vsize_max_pc) )
550 allocate( ginfo(gid)%recvpack_WE2P(ginfo(gid)%size2D_WE * ka, 2, comm_vsize_max) )
553 allocate( ginfo(gid)%req_cnt ( comm_vsize_max) )
554 allocate( ginfo(gid)%req_list(ginfo(gid)%nreq_MAX, comm_vsize_max) )
555 ginfo(gid)%req_cnt (:) = -1
556 ginfo(gid)%req_list(:,:) = mpi_request_null
558 if ( comm_use_mpi_pc )
then
559 ginfo(gid)%vars_num = 0
560 allocate( ginfo(gid)%packid(comm_vsize_max_pc) )
561 allocate( ginfo(gid)%preq_cnt ( comm_vsize_max_pc) )
562 allocate( ginfo(gid)%preq_list(ginfo(gid)%nreq_MAX+1,comm_vsize_max_pc) )
563 ginfo(gid)%preq_cnt (:) = -1
564 ginfo(gid)%preq_list(:,:) = mpi_request_null
571 log_info(
"COMM_regist",*)
'Register grid: id=', gid
572 log_info_cont(*)
'Data size of var (3D,including halo) [byte] : ', rp*ka*ia*ja
573 log_info_cont(*)
'Data size of halo [byte] : ', rp*ka*(2*ia*jhalo+2*jmax*ihalo)
574 log_info_cont(*)
'Ratio of halo against the whole 3D grid : ', real(2*ia*jhalo+2*jmax*ihalo) / real(ia*ja)
586 integer :: i, j, ierr
591 if ( comm_use_mpi_onesided )
then
593 do i = 1, comm_vsize_max
594 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(i), ierr )
595 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(i), ierr )
598 do i = 1, comm_vsize_max
599 call mpi_win_complete( ginfo(gid)%win_packWE(i), ierr )
600 call mpi_win_complete( ginfo(gid)%win_packNS(i), ierr )
603 do i = 1, comm_vsize_max
604 call mpi_win_wait( ginfo(gid)%win_packWE(i), ierr )
605 call mpi_win_wait( ginfo(gid)%win_packNS(i), ierr )
608 do i = 1, comm_vsize_max
609 call mpi_win_free(ginfo(gid)%win_packWE(i), ierr)
610 call mpi_win_free(ginfo(gid)%win_packNS(i), ierr)
613 real(rp),
pointer :: pack(:)
616 call c_f_pointer( ginfo(gid)%recvbuf_WE(i), pack, (/ginfo(gid)%size2D_WE*ka*2/) )
618 call c_f_pointer( ginfo(gid)%recvbuf_NS(i), pack, (/ginfo(gid)%size2D_NS4*ka*2/) )
621 call mpi_free_mem(ginfo(gid)%recvbuf_WE(i), ierr)
622 call mpi_free_mem(ginfo(gid)%recvbuf_NS(i), ierr)
626 deallocate( ginfo(gid)%packid )
627 ginfo(gid)%vars_num = 0
629 deallocate( ginfo(gid)%win_packWE )
630 deallocate( ginfo(gid)%win_packNS )
632 deallocate( ginfo(gid)%recvbuf_WE )
633 deallocate( ginfo(gid)%recvbuf_NS )
637 if ( comm_use_mpi_pc )
then
639 do j = 1, comm_vsize_max_pc
640 do i = 1, ginfo(gid)%nreq_MAX+1
641 if (ginfo(gid)%preq_list(i,j) .NE. mpi_request_null) &
642 call mpi_request_free(ginfo(gid)%preq_list(i,j), ierr)
645 if ( ginfo(gid)%device_alloc(j+comm_vsize_max) )
then
650 deallocate( ginfo(gid)%preq_cnt )
651 deallocate( ginfo(gid)%preq_list )
652 deallocate( ginfo(gid)%packid )
653 ginfo(gid)%vars_num = 0
657 deallocate( ginfo(gid)%req_cnt )
658 deallocate( ginfo(gid)%req_list )
661 deallocate( ginfo(gid)%recvpack_WE2P )
666 deallocate( ginfo(gid)%sendpack_P2WE )
668 deallocate( ginfo(gid)%use_packbuf )
673 if ( comm_use_mpi_onesided )
then
674 if ( group_packwe_created )
then
675 call mpi_group_free(group_packwe, ierr)
676 group_packwe_created = .false.
678 if ( group_packns_created )
then
679 call mpi_group_free(group_packns, ierr)
680 group_packns_created = .false.
687 initialized = .false.
701 character(len=*),
intent(in) :: varname
702 real(rp),
target,
intent(inout) :: var(:,:,:)
703 integer,
intent(inout) :: vid
705 integer,
intent(in),
optional :: gid
711 if ( .not. comm_use_mpi_pc )
return
713 if ( .not. acc_is_present(var) )
return
716 call prof_rapstart(
'COMM_init_pers', 2)
719 if (
present(gid) ) gid_ = gid
720 if ( gid_ > comm_gid_max )
then
721 log_error(
"COMM_vars_init",*)
'gid is invalid', gid_, comm_gid_max
725 if ( vid > comm_vsize_max )
then
726 log_error(
"COMM_vars_init",*)
'vid exceeds max', vid, comm_vsize_max, gid
730 ginfo(gid_)%vars_num = ginfo(gid_)%vars_num + 1
731 if ( ginfo(gid_)%vars_num > comm_vsize_max_pc )
then
732 log_error(
"COMM_vars_init",*)
'number of variable for MPI PC exceeds max', ginfo(gid_)%vars_num, comm_vsize_max_pc
736 vars_id = ginfo(gid_)%vars_num
737 ginfo(gid_)%packid(vars_id) = vid
740 if ( .not. acc_is_present(var) )
then
741 ginfo(gid_)%device_alloc(vars_id+comm_vsize_max) = .true.
742 ginfo(gid_)%device_ptr(vars_id*comm_vsize_max)%ptr => var
749 vid = vars_id + comm_vsize_max
751 log_info(
"COMM_vars_init",
'(1x,A,I3.3,A,I3.3,2A)')
'Initialize variable (grid ID = ', gid_,
'): ID = ', vid, &
752 ', name = ', trim(varname)
754 call prof_rapend (
'COMM_init_pers', 2)
768 character(len=*),
intent(in) :: varname
770 real(rp),
target,
intent(inout) :: var(:,:,:)
771 integer,
intent(inout) :: vid
773 integer,
intent(in),
optional :: gid
779 if ( .not. comm_use_mpi_pc )
return
781 if ( .not. acc_is_present(var) )
return
784 call prof_rapstart(
'COMM_init_pers', 2)
787 if (
present(gid) ) gid_ = gid
788 if ( gid_ > comm_gid_max )
then
789 log_error(
"COMM_vars8_init",*)
'gid is invalid', gid_, comm_gid_max
793 if ( vid > comm_vsize_max )
then
794 log_error(
"COMM_vars8_init",*)
'vid exceeds max', vid, comm_vsize_max
798 ginfo(gid_)%vars_num = ginfo(gid_)%vars_num + 1
799 if ( ginfo(gid_)%vars_num > comm_vsize_max_pc )
then
800 log_error(
"COMM_vars8_init",*)
'number of variable for MPI PC exceeds max', ginfo(gid_)%vars_num, comm_vsize_max_pc
804 vars_id = ginfo(gid_)%vars_num
805 ginfo(gid_)%packid(vars_id) = vid
808 if ( .not. acc_is_present(var) )
then
809 ginfo(gid_)%device_alloc(vars_id+comm_vsize_max) = .true.
810 ginfo(gid_)%device_ptr(vars_id+comm_vsize_max)%ptr => var
817 vid = vars_id + comm_vsize_max
819 log_info(
"COMM_vars8_init",
'(1x,A,I3.3,A,I3.3,2A)')
'Initialize variable (grid ID = ', gid_,
'): ID = ', vid, &
820 ', name = ', trim(varname)
822 call prof_rapend (
'COMM_init_pers', 2)
828 subroutine comm_vars_3d(var, vid, gid)
831 real(rp),
intent(inout) :: var(:,:,:)
833 integer,
intent(in) :: vid
835 integer,
intent(in),
optional :: gid
841 if (
present(gid) ) gid_ = gid
842 if ( gid_ > comm_gid_max )
then
843 log_error(
"COMM_vars_3D",*)
'gid is invalid', gid_, comm_gid_max
847 if ( vid > comm_vsize_max )
then
848 call prof_rapstart(
'COMM_vars_pers', 2)
850 call prof_rapend (
'COMM_vars_pers', 2)
852 call prof_rapstart(
'COMM_vars', 2)
853 if ( comm_use_mpi_onesided )
then
858 call prof_rapend (
'COMM_vars', 2)
862 end subroutine comm_vars_3d
865 subroutine comm_vars8_3d(var, vid, gid)
868 real(rp),
intent(inout) :: var(:,:,:)
870 integer,
intent(in) :: vid
872 integer,
intent(in),
optional :: gid
878 if (
present(gid) ) gid_ = gid
879 if ( gid_ > comm_gid_max )
then
880 log_error(
"COMM_vars8_3D",*)
'gid is invalid', gid_, comm_gid_max
884 if ( vid > comm_vsize_max )
then
885 call prof_rapstart(
'COMM_vars_pers', 2)
887 call prof_rapend (
'COMM_vars_pers', 2)
889 call prof_rapstart(
'COMM_vars', 2)
890 if ( comm_use_mpi_onesided )
then
895 call prof_rapend (
'COMM_vars', 2)
899 end subroutine comm_vars8_3d
902 subroutine comm_wait_3d(var, vid, FILL_BND, gid)
905 real(rp),
intent(inout) :: var(:,:,:)
907 integer,
intent(in) :: vid
909 logical,
intent(in),
optional :: fill_bnd
910 integer,
intent(in),
optional :: gid
917 if (
present(fill_bnd) ) fill_bnd_ = fill_bnd
920 if (
present(gid) ) gid_ = gid
921 if ( gid_ > comm_gid_max )
then
922 log_error(
"COMM_wait_3D",*)
'gid is invalid', gid_, comm_gid_max
926 if ( vid > comm_vsize_max )
then
927 call prof_rapstart(
'COMM_wait_pers', 2)
929 call prof_rapend (
'COMM_wait_pers', 2)
931 call prof_rapstart(
'COMM_wait', 2)
932 if ( comm_use_mpi_onesided )
then
937 call prof_rapend (
'COMM_wait', 2)
941 if ( .NOT. comm_isallperiodic )
then
942 if ( fill_bnd_ )
then
943 call copy_boundary_3d(var, gid_)
948 end subroutine comm_wait_3d
951 subroutine comm_vars_2d(var, vid, gid)
954 real(rp),
intent(inout) :: var(:,:)
956 integer,
intent(in) :: vid
958 integer,
intent(in),
optional :: gid
964 if (
present(gid) ) gid_ = gid
965 if ( gid_ > comm_gid_max )
then
966 log_error(
"COMM_vars_2D",*)
'gid is invalid', gid_, comm_gid_max
970 call prof_rapstart(
'COMM_vars', 2)
971 if ( comm_use_mpi_onesided )
then
976 call prof_rapend (
'COMM_vars', 2)
979 end subroutine comm_vars_2d
982 subroutine comm_vars8_2d(var, vid, gid)
985 real(rp),
intent(inout) :: var(:,:)
987 integer,
intent(in) :: vid
989 integer,
intent(in),
optional :: gid
995 if (
present(gid) ) gid_ = gid
996 if ( gid_ > comm_gid_max )
then
997 log_error(
"COMM_vars8_2D",*)
'gid is invalid', gid_, comm_gid_max
1001 call prof_rapstart(
'COMM_vars', 2)
1002 if ( comm_use_mpi_onesided )
then
1007 call prof_rapend (
'COMM_vars', 2)
1010 end subroutine comm_vars8_2d
1013 subroutine comm_wait_2d(var, vid, FILL_BND, gid)
1016 real(rp),
intent(inout) :: var(:,:)
1018 integer,
intent(in) :: vid
1020 logical,
intent(in),
optional :: fill_bnd
1021 integer,
intent(in),
optional :: gid
1023 logical :: fill_bnd_
1028 if (
present(fill_bnd) ) fill_bnd_ = fill_bnd
1031 if (
present(gid) ) gid_ = gid
1032 if ( gid_ > comm_gid_max )
then
1033 log_error(
"COMM_wait_2D",*)
'gid is invalid', gid_, comm_gid_max
1037 call prof_rapstart(
'COMM_wait', 2)
1038 if ( comm_use_mpi_onesided )
then
1043 call prof_rapend (
'COMM_wait', 2)
1045 if( .NOT. comm_isallperiodic )
then
1046 if ( fill_bnd_ )
then
1052 end subroutine comm_wait_2d
1056 subroutine comm_horizontal_mean_2d( &
1057 IA, IS, IE, JA, JS, JE, &
1064 integer,
intent(in) :: ia, is, ie
1065 integer,
intent(in) :: ja, js, je
1066 real(rp),
intent(in) :: var(ia,ja)
1068 real(rp),
intent(out) :: varmean
1071 real(dp) :: stat1, stat2
1072 real(dp) :: allstat(2)
1088 stat1 = stat1 + var(i,j)
1089 stat2 = stat2 + 1.0_dp
1095 stat(:) = (/stat1, stat2/)
1099 call prof_rapstart(
'COMM_Allreduce', 2)
1100 call mpi_allreduce( stat, &
1103 mpi_double_precision, &
1107 call prof_rapend (
'COMM_Allreduce', 2)
1109 zerosw = 0.5_dp - sign(0.5_dp, allstat(1) - 1.e-12_dp )
1110 varmean = allstat(1) / ( allstat(2) + zerosw ) * ( 1.0_dp - zerosw )
1114 end subroutine comm_horizontal_mean_2d
1119 KA, IA, IS, IE, JA, JS, JE, &
1126 integer,
intent(in) :: KA
1127 integer,
intent(in) :: IA, IS, IE
1128 integer,
intent(in) :: JA, JS, JE
1129 real(RP),
intent(in) :: var(KA,IA,JA)
1131 real(RP),
intent(out) :: varmean(KA)
1133 real(DP) :: stat (KA,2)
1134 real(DP) :: allstat(KA,2)
1140 logical :: flag_device
1145 flag_device = acc_is_present(var)
1161 stat(k,1) = stat(k,1) + var(k,i,j)
1164 stat(k,2) = stat(k,2) + 1.0_dp
1175 call prof_rapstart(
'COMM_Allreduce', 2)
1177 call mpi_allreduce( stat, &
1180 mpi_double_precision, &
1185 call prof_rapend (
'COMM_Allreduce', 2)
1189 zerosw = 0.5_dp - sign(0.5_dp, allstat(k,2) - 1.e-12_dp )
1190 varmean(k) = allstat(k,1) / ( allstat(k,2) + zerosw ) * ( 1.0_dp - zerosw )
1210 integer,
intent(in) :: IA, JA
1211 real(RP),
intent(in) :: send(IA,JA)
1213 real(RP),
intent(out) :: recv(:,:,:)
1215 integer :: sendcounts, recvcounts
1219 sendcounts = ia * ja
1220 recvcounts = ia * ja
1223 call mpi_gather( send(:,:), &
1247 integer,
intent(in) :: KA, IA, JA
1248 real(RP),
intent(in) :: send(KA,IA,JA)
1250 real(RP),
intent(out) :: recv(:,:,:,:)
1252 integer :: sendcounts, recvcounts
1256 sendcounts = ka * ia * ja
1257 recvcounts = ka * ia * ja
1260 call mpi_gather( send(:,:,:), &
1281 real(SP),
intent(inout) :: var
1287 call prof_rapstart(
'COMM_Bcast', 2)
1291 call mpi_bcast( var, &
1298 call prof_rapend(
'COMM_Bcast', 2)
1307 real(DP),
intent(inout) :: var
1313 call prof_rapstart(
'COMM_Bcast', 2)
1317 call mpi_bcast( var, &
1319 mpi_double_precision, &
1324 call prof_rapend(
'COMM_Bcast', 2)
1336 integer,
intent(in) :: IA
1338 real(SP),
intent(inout) :: var(IA)
1344 call prof_rapstart(
'COMM_Bcast', 2)
1349 call mpi_bcast( var(:), &
1357 call prof_rapend(
'COMM_Bcast', 2)
1366 integer,
intent(in) :: IA
1368 real(DP),
intent(inout) :: var(IA)
1374 call prof_rapstart(
'COMM_Bcast', 2)
1379 call mpi_bcast( var(:), &
1381 mpi_double_precision, &
1387 call prof_rapend(
'COMM_Bcast', 2)
1399 integer,
intent(in) :: IA, JA
1401 real(SP),
intent(inout) :: var(IA,JA)
1407 call prof_rapstart(
'COMM_Bcast', 2)
1412 call mpi_bcast( var(:,:), &
1420 call prof_rapend(
'COMM_Bcast', 2)
1429 integer,
intent(in) :: IA, JA
1431 real(DP),
intent(inout) :: var(IA,JA)
1437 call prof_rapstart(
'COMM_Bcast', 2)
1442 call mpi_bcast( var(:,:), &
1444 mpi_double_precision, &
1450 call prof_rapend(
'COMM_Bcast', 2)
1462 integer,
intent(in) :: KA, IA, JA
1464 real(SP),
intent(inout) :: var(KA,IA,JA)
1470 call prof_rapstart(
'COMM_Bcast', 2)
1472 counts = ka * ia * ja
1475 call mpi_bcast( var(:,:,:), &
1483 call prof_rapend(
'COMM_Bcast', 2)
1492 integer,
intent(in) :: KA, IA, JA
1494 real(DP),
intent(inout) :: var(KA,IA,JA)
1500 call prof_rapstart(
'COMM_Bcast', 2)
1502 counts = ka * ia * ja
1505 call mpi_bcast( var(:,:,:), &
1507 mpi_double_precision, &
1513 call prof_rapend(
'COMM_Bcast', 2)
1525 integer,
intent(in) :: KA, IA, JA, NT
1527 real(SP),
intent(inout) :: var(KA,IA,JA,NT)
1533 call prof_rapstart(
'COMM_Bcast', 2)
1535 counts = ka * ia * ja * nt
1536 if ( ka>0 .AND. ia>0 .AND. ja>0 .AND. nt>0 .AND. &
1538 log_error(
"COMM_bcast_4D",*)
'counts overflow'
1543 call mpi_bcast( var(:,:,:,:), &
1551 call prof_rapend(
'COMM_Bcast', 2)
1560 integer,
intent(in) :: KA, IA, JA, NT
1562 real(DP),
intent(inout) :: var(KA,IA,JA,NT)
1568 call prof_rapstart(
'COMM_Bcast', 2)
1570 counts = ka * ia * ja * nt
1571 if ( ka>0 .AND. ia>0 .AND. ja>0 .AND. nt>0 .AND. &
1573 log_error(
"COMM_bcast_4D",*)
'counts overflow'
1578 call mpi_bcast( var(:,:,:,:), &
1580 mpi_double_precision, &
1586 call prof_rapend(
'COMM_Bcast', 2)
1598 integer,
intent(inout) :: var
1604 call prof_rapstart(
'COMM_Bcast', 2)
1608 call mpi_bcast( var, &
1615 call prof_rapend(
'COMM_Bcast', 2)
1627 integer,
intent(in) :: IA
1628 integer,
intent(inout) :: var(IA)
1634 call prof_rapstart(
'COMM_Bcast', 2)
1638 call mpi_bcast( var(:), &
1645 call prof_rapend(
'COMM_Bcast', 2)
1657 integer,
intent(in) :: IA, JA
1659 integer,
intent(inout) :: var(IA,JA)
1665 call prof_rapstart(
'COMM_Bcast', 2)
1670 call mpi_bcast( var(:,:), &
1678 call prof_rapend(
'COMM_Bcast', 2)
1690 logical,
intent(inout) :: var
1696 call prof_rapstart(
'COMM_Bcast', 2)
1700 call mpi_bcast( var, &
1707 call prof_rapend(
'COMM_Bcast', 2)
1719 integer,
intent(in) :: IA
1720 logical,
intent(inout) :: var(IA)
1726 call prof_rapstart(
'COMM_Bcast', 2)
1731 call mpi_bcast( var(:), &
1739 call prof_rapend(
'COMM_Bcast', 2)
1751 character(len=*),
intent(inout) :: var
1757 call prof_rapstart(
'COMM_Bcast', 2)
1761 call mpi_bcast( var, &
1768 call prof_rapend(
'COMM_Bcast', 2)
1781 real(RP),
intent(inout) :: var(:,:,:)
1782 integer,
intent(in) :: gid
1783 integer,
intent(in) :: vid
1784 integer,
intent(in) :: seqid
1786 integer :: ireq, tag, ierr
1790 integer :: JA, JS, JE, JHALO
1796 real(RP),
pointer :: ptr(:,:)
1799 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
1806 jhalo = ginfo(gid)%JHALO
1813 mpi_proc_null, tag+ginfo(gid)%nreq_max+1,
comm_world, &
1814 ginfo(gid)%preq_list(ginfo(gid)%nreq_max+1,vid), ierr )
1818 if ( prc_has_s )
then
1819 call mpi_recv_init( var(:,:,1:js-1), ginfo(gid)%size2D_NS4*ka,
comm_datatype, &
1820 prc_next(prc_s), tag+1,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1824 if ( prc_has_n )
then
1825 call mpi_recv_init( var(:,:,je+1:ja), ginfo(gid)%size2D_NS4*ka,
comm_datatype, &
1826 prc_next(prc_n), tag+2,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1831 ptr => ginfo(gid)%recvpack_WE2P(:,:,seqid)
1836 if ( prc_has_e )
then
1838 call mpi_recv_init( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
1840 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,2,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
1842 prc_next(prc_e), tag+3,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1846 if ( prc_has_w )
then
1848 call mpi_recv_init( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
1850 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,1,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
1852 prc_next(prc_w), tag+4,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1861 ptr => ginfo(gid)%sendpack_P2WE(:,:,seqid)
1865 if ( prc_has_w )
then
1867 call mpi_send_init( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
1869 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,1,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
1871 prc_next(prc_w), tag+3,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1875 if ( prc_has_e )
then
1877 call mpi_send_init( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
1879 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,2,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
1881 prc_next(prc_e), tag+4,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1887 if ( prc_has_n )
then
1888 call mpi_send_init( var(:,:,je-jhalo+1:je), ginfo(gid)%size2D_NS4*ka,
comm_datatype, &
1889 prc_next(prc_n), tag+1,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1893 if ( prc_has_s )
then
1894 call mpi_send_init( var(:,:,js:js+jhalo-1), ginfo(gid)%size2D_NS4*ka,
comm_datatype, &
1895 prc_next(prc_s), tag+2,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1899 ginfo(gid)%preq_cnt(vid) = ireq - 1
1902 nreq = ginfo(gid)%preq_cnt(vid)
1904 call mpi_testall( nreq, ginfo(gid)%preq_list(1:nreq,vid), &
1905 flag, mpi_statuses_ignore, ierr )
1918 real(RP),
intent(inout) :: var(:,:,:)
1919 integer,
intent(in) :: gid
1920 integer,
intent(in) :: vid
1921 integer,
intent(in) :: seqid
1923 integer :: ireq, tag, tagc
1928 integer :: IS, IE, IHALO
1929 integer :: JA, JS, JE, JHALO
1935 real(RP),
pointer :: ptr(:,:)
1941 ihalo = ginfo(gid)%IHALO
1945 jhalo = ginfo(gid)%JHALO
1947 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
1955 mpi_proc_null, tag+ginfo(gid)%nreq_max+1,
comm_world, &
1956 ginfo(gid)%preq_list(ginfo(gid)%nreq_max+1,vid), ierr )
1959 if ( comm_isallperiodic )
then
1966 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
1967 prc_next(prc_se), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1974 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
1975 prc_next(prc_sw), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1982 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
1983 prc_next(prc_ne), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1989 do j = je+1, je+jhalo
1990 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
1991 prc_next(prc_nw), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1998 ptr => ginfo(gid)%recvpack_WE2P(:,:,seqid)
2000 call mpi_recv_init( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2002 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,2,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2004 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2009 call mpi_recv_init( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2011 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,1,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2013 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2020 call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
2021 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2028 call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
2029 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2037 do j = je-jhalo+1, je
2038 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
2039 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2045 do j = js, js+jhalo-1
2046 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
2047 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2055 ptr => ginfo(gid)%sendpack_P2WE(:,:,seqid)
2057 call mpi_send_init( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2059 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,1,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2061 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2066 call mpi_send_init( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2068 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,2,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2070 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2075 do j = je-jhalo+1, je
2076 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2077 prc_next(prc_nw), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2083 do j = je-jhalo+1, je
2084 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2085 prc_next(prc_ne), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2091 do j = js, js+jhalo-1
2092 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2093 prc_next(prc_sw), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2099 do j = js, js+jhalo-1
2100 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2101 prc_next(prc_se), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2112 if ( prc_has_s .AND. prc_has_e )
then
2115 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2116 prc_next(prc_se), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2120 else if ( prc_has_s )
then
2123 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2124 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2128 else if ( prc_has_e )
then
2131 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2132 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2138 if ( prc_has_s .AND. prc_has_w )
then
2141 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2142 prc_next(prc_sw), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2146 else if ( prc_has_s )
then
2149 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2150 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2154 else if ( prc_has_w )
then
2157 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2158 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2164 if ( prc_has_n .AND. prc_has_e )
then
2167 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2168 prc_next(prc_ne), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2172 else if ( prc_has_n )
then
2175 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2176 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2180 else if ( prc_has_e )
then
2183 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2184 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2190 if ( prc_has_n .AND. prc_has_w )
then
2193 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2194 prc_next(prc_nw), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2198 else if ( prc_has_n )
then
2201 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2202 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2206 else if ( prc_has_w )
then
2209 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2210 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2216 ptr => ginfo(gid)%recvpack_WE2P(:,:,seqid)
2220 if ( prc_has_e )
then
2223 call mpi_recv_init( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2225 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,2,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2227 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2231 if ( prc_has_w )
then
2234 call mpi_recv_init( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2236 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,1,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2238 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2244 if ( prc_has_s )
then
2247 call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
2248 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2254 if ( prc_has_n )
then
2257 call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
2258 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2266 if ( prc_has_n )
then
2268 do j = je-jhalo+1, je
2269 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
2270 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2276 if ( prc_has_s )
then
2278 do j = js, js+jhalo-1
2279 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
2280 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2287 ptr => ginfo(gid)%sendpack_P2WE(:,:,seqid)
2291 if ( prc_has_w )
then
2294 call mpi_send_init( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2296 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,1,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2298 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2302 if ( prc_has_e )
then
2305 call mpi_send_init( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2307 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,2,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2309 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2314 if ( prc_has_n .AND. prc_has_w )
then
2316 do j = je-jhalo+1, je
2317 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2318 prc_next(prc_nw), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2322 else if ( prc_has_n )
then
2324 do j = je-jhalo+1, je
2325 call mpi_send_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2326 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2330 else if ( prc_has_w )
then
2333 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2334 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2340 if ( prc_has_n .AND. prc_has_e )
then
2342 do j = je-jhalo+1, je
2343 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2344 prc_next(prc_ne), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2348 else if ( prc_has_n )
then
2350 do j = je-jhalo+1, je
2351 call mpi_send_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2352 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2356 else if ( prc_has_e )
then
2359 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2360 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2366 if ( prc_has_s .AND. prc_has_w )
then
2368 do j = js, js+jhalo-1
2369 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2370 prc_next(prc_sw), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2374 else if ( prc_has_s )
then
2376 do j = js, js+jhalo-1
2377 call mpi_send_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2378 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2382 else if ( prc_has_w )
then
2385 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2386 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2392 if ( prc_has_s .AND. prc_has_e )
then
2394 do j = js, js+jhalo-1
2395 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2396 prc_next(prc_se), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2400 else if ( prc_has_s )
then
2402 do j = js, js+jhalo-1
2403 call mpi_send_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2404 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2408 else if ( prc_has_e )
then
2411 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2412 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2421 ginfo(gid)%preq_cnt(vid) = ireq - 1
2424 nreq = ginfo(gid)%preq_cnt(vid)
2426 call mpi_testall( nreq, ginfo(gid)%preq_list(1:nreq,vid), &
2427 flag, mpi_statuses_ignore, ierr )
2442 real(RP),
intent(inout) :: var(:,:,:)
2443 integer,
intent(in) :: gid
2444 integer,
intent(in) :: vid
2447 integer :: ireq, tag
2450 integer :: IA, IS, IE
2451 integer :: JA, JS, JE
2452 integer :: IHALO, JHALO
2456 real(RP),
pointer :: ptr(:,:)
2457 logical :: flag_device
2461 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
2471 ihalo = ginfo(gid)%IHALO
2472 jhalo = ginfo(gid)%JHALO
2475 if ( ginfo(gid)%use_packbuf(vid) )
then
2476 log_error(
"vars_3D_mpi",*)
'packing buffer is already used', vid
2479 ginfo(gid)%use_packbuf(vid) = .true.
2483 flag_device = acc_is_present(var)
2490 if ( prc_has_s )
then
2491 call mpi_irecv( var(:,:,1:js-1), ginfo(gid)%size2D_NS4*ka,
comm_datatype, &
2492 prc_next(prc_s), tag+1,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2496 if ( prc_has_n )
then
2497 call mpi_irecv( var(:,:,je+1:ja), ginfo(gid)%size2D_NS4*ka,
comm_datatype, &
2498 prc_next(prc_n), tag+2,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2503 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
2507 if ( prc_has_e )
then
2509 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2511 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2513 prc_next(prc_e), tag+3,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2517 if ( prc_has_w )
then
2519 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2521 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2523 prc_next(prc_w), tag+4,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2533 call packwe_3d( ka, ia, is, ie, ja, js, je, &
2541 if ( prc_has_n )
then
2542 call mpi_isend( var(:,:,je-jhalo+1:je), ginfo(gid)%size2D_NS4*ka,
comm_datatype, &
2543 prc_next(prc_n), tag+1,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2547 if ( prc_has_s )
then
2548 call mpi_isend( var(:,:,js:js+jhalo-1), ginfo(gid)%size2D_NS4*ka,
comm_datatype, &
2549 prc_next(prc_s), tag+2,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2557 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
2562 if ( prc_has_w )
then
2564 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2566 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2568 prc_next(prc_w), tag+3,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2572 if ( prc_has_e )
then
2574 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2576 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2578 prc_next(prc_e), tag+4,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2585 ginfo(gid)%req_cnt(vid) = ireq - 1
2597 real(RP),
intent(inout) :: var(:,:,:)
2598 integer,
intent(in) :: gid
2599 integer,
intent(in) :: vid
2602 integer :: IA, IS, IE
2603 integer :: JA, JS, JE
2604 integer :: IHALO, JHALO
2606 integer(kind=MPI_ADDRESS_KIND) :: disp
2610 real(RP),
pointer :: ptr(:,:)
2621 ihalo = ginfo(gid)%IHALO
2622 jhalo = ginfo(gid)%JHALO
2626 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
2627 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
2631 call packwe_3d( ka, ia, is, ie, ja, js, je, &
2639 if ( prc_has_n )
then
2641 call mpi_put( var(:,:,je-jhalo+1:je), ginfo(gid)%size2D_NS4*ka,
comm_datatype, &
2642 prc_next(prc_n), disp, ginfo(gid)%size2D_NS4*ka,
comm_datatype, &
2643 ginfo(gid)%win_packNS(vid), ierr )
2646 if ( prc_has_s )
then
2647 disp = ka * ia * jhalo
2648 call mpi_put( var(:,:,js:js+jhalo-1), ginfo(gid)%size2D_NS4*ka,
comm_datatype, &
2649 prc_next(prc_s), disp, ginfo(gid)%size2D_NS4*ka,
comm_datatype, &
2650 ginfo(gid)%win_packNS(vid), ierr )
2657 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
2663 if ( prc_has_w )
then
2666 call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2668 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2670 prc_next(prc_w), disp, ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2671 ginfo(gid)%win_packWE(vid), ierr )
2674 if ( prc_has_e )
then
2677 call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2679 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2681 prc_next(prc_e), disp, ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2682 ginfo(gid)%win_packWE(vid), ierr )
2688 call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
2689 call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
2703 real(RP),
intent(inout) :: var(:,:,:)
2704 integer,
intent(in) :: gid
2705 integer,
intent(in) :: vid
2707 integer :: ireq, tag, tagc
2710 integer :: IA, IS, IE
2711 integer :: JA, JS, JE
2712 integer :: IHALO, JHALO
2717 real(RP),
pointer :: ptr(:,:)
2718 logical :: flag_device
2722 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
2733 ihalo = ginfo(gid)%IHALO
2734 jhalo = ginfo(gid)%JHALO
2737 if ( ginfo(gid)%use_packbuf(vid) )
then
2738 log_error(
"vars8_3D_mpi",*)
'packing buffer is already used', vid
2741 ginfo(gid)%use_packbuf(vid) = .true.
2745 flag_device = acc_is_present(var)
2748 if ( comm_isallperiodic )
then
2757 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2758 prc_next(prc_se), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2765 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2766 prc_next(prc_sw), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2773 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2774 prc_next(prc_ne), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2781 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2782 prc_next(prc_nw), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2787 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
2793 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2795 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2797 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2802 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2804 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2806 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2813 call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
2814 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2821 call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
2822 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2830 do j = je-jhalo+1, je
2831 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
2832 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2838 do j = js, js+jhalo-1
2839 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
2840 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2849 call packwe_3d( ka, ia, is, ie, ja, js, je, &
2857 do j = je-jhalo+1, je
2858 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2859 prc_next(prc_nw), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2865 do j = je-jhalo+1, je
2866 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2867 prc_next(prc_ne), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2873 do j = js, js+jhalo-1
2874 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2875 prc_next(prc_sw), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2881 do j = js, js+jhalo-1
2882 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2883 prc_next(prc_se), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2891 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
2898 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2900 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2902 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2907 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2909 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
2911 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2924 if ( prc_has_s .AND. prc_has_e )
then
2927 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2928 prc_next(prc_se), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2932 else if ( prc_has_s )
then
2935 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2936 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2940 else if ( prc_has_e )
then
2943 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2944 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2950 if ( prc_has_s .AND. prc_has_w )
then
2953 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2954 prc_next(prc_sw), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2958 else if ( prc_has_s )
then
2961 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2962 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2966 else if ( prc_has_w )
then
2969 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2970 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2976 if ( prc_has_n .AND. prc_has_e )
then
2979 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2980 prc_next(prc_ne), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2984 else if ( prc_has_n )
then
2987 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2988 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2992 else if ( prc_has_e )
then
2995 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
2996 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3002 if ( prc_has_n .AND. prc_has_w )
then
3005 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3006 prc_next(prc_nw), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3010 else if ( prc_has_n )
then
3013 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3014 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3018 else if ( prc_has_w )
then
3021 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3022 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3028 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
3032 if ( prc_has_e )
then
3035 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3037 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3039 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3043 if ( prc_has_w )
then
3046 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3048 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3050 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3056 if ( prc_has_s )
then
3059 call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
3060 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3066 if ( prc_has_n )
then
3069 call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
3070 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3078 if ( prc_has_n )
then
3080 do j = je-jhalo+1, je
3081 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
3082 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3088 if ( prc_has_s )
then
3090 do j = js, js+jhalo-1
3091 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
3092 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3102 call packwe_3d( ka, ia, is, ie, ja, js, je, &
3109 if ( prc_has_n .AND. prc_has_w )
then
3111 do j = je-jhalo+1, je
3112 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3113 prc_next(prc_nw), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3117 else if ( prc_has_n )
then
3119 do j = je-jhalo+1, je
3120 call mpi_isend( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3121 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3125 else if ( prc_has_w )
then
3128 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3129 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3135 if ( prc_has_n .AND. prc_has_e )
then
3137 do j = je-jhalo+1, je
3138 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3139 prc_next(prc_ne), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3143 else if ( prc_has_n )
then
3145 do j = je-jhalo+1, je
3146 call mpi_isend( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3147 prc_next(prc_n), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3151 else if ( prc_has_e )
then
3154 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3155 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3161 if ( prc_has_s .AND. prc_has_w )
then
3163 do j = js, js+jhalo-1
3164 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3165 prc_next(prc_sw), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3169 else if ( prc_has_s )
then
3171 do j = js, js+jhalo-1
3172 call mpi_isend( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3173 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3177 else if ( prc_has_w )
then
3180 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3181 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3187 if ( prc_has_s .AND. prc_has_e )
then
3189 do j = js, js+jhalo-1
3190 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3191 prc_next(prc_se), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3195 else if ( prc_has_s )
then
3197 do j = js, js+jhalo-1
3198 call mpi_isend( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3199 prc_next(prc_s), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3203 else if ( prc_has_e )
then
3206 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3207 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3216 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3222 if ( prc_has_w )
then
3225 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3227 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3229 prc_next(prc_w), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3233 if ( prc_has_e )
then
3236 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3238 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3240 prc_next(prc_e), tag+tagc,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3249 ginfo(gid)%req_cnt(vid) = ireq - 1
3261 real(RP),
intent(inout) :: var(:,:,:)
3262 integer,
intent(in) :: gid
3263 integer,
intent(in) :: vid
3266 integer :: IA, IS, IE
3267 integer :: JA, JS, JE
3268 integer :: IHALO, JHALO
3270 integer(kind=MPI_ADDRESS_KIND) :: disp
3275 real(RP),
pointer :: ptr(:,:)
3286 ihalo = ginfo(gid)%IHALO
3287 jhalo = ginfo(gid)%JHALO
3290 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
3291 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
3293 if ( comm_isallperiodic )
then
3299 do j = je-jhalo+1, je
3300 disp = ka * ( ihalo + ia * ( j - je+jhalo-1 ) )
3301 call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
3302 prc_next(prc_n), disp, ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
3303 ginfo(gid)%win_packNS(vid), ierr )
3306 do j = js, js+jhalo-1
3307 disp = ka * ( ihalo + ia * ( j - js + jhalo ) )
3308 call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
3309 prc_next(prc_s), disp, ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
3310 ginfo(gid)%win_packNS(vid), ierr )
3317 call packwe_3d( ka, ia, is, ie, ja, js, je, &
3323 do j = je-jhalo+1, je
3324 disp = ka * ( ie + ia * ( j - je+jhalo-1 ) )
3325 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3326 prc_next(prc_nw), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3327 ginfo(gid)%win_packNS(vid), ierr )
3330 do j = je-jhalo+1, je
3331 disp = ka * ( ia * ( j - je+jhalo-1 ) )
3332 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3333 prc_next(prc_ne), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3334 ginfo(gid)%win_packNS(vid), ierr )
3337 do j = js, js+jhalo-1
3338 disp = ka * ( ie + ia * ( j - js + jhalo ) )
3339 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3340 prc_next(prc_sw), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3341 ginfo(gid)%win_packNS(vid), ierr )
3344 do j = js, js+jhalo-1
3345 disp = ka * ( ia * ( j - js + jhalo ) )
3346 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3347 prc_next(prc_se), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3348 ginfo(gid)%win_packNS(vid), ierr )
3354 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3361 call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3363 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3365 prc_next(prc_w), disp, ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3366 ginfo(gid)%win_packWE(vid), ierr )
3370 call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3372 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3374 prc_next(prc_e), disp, ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3375 ginfo(gid)%win_packWE(vid), ierr )
3386 if ( prc_has_n )
then
3387 do j = je-jhalo+1, je
3388 disp = ka * ( ihalo + ia * ( j - je+jhalo-1 ) )
3389 call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
3390 prc_next(prc_n), disp, ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
3391 ginfo(gid)%win_packNS(vid), ierr )
3395 if ( prc_has_s )
then
3396 do j = js, js+jhalo-1
3397 disp = ka * ( ihalo + ia * ( j - js + jhalo ) )
3398 call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
3399 prc_next(prc_s), disp, ginfo(gid)%size2D_NS8*ka,
comm_datatype, &
3400 ginfo(gid)%win_packNS(vid), ierr )
3408 call packwe_3d( ka, ia, is, ie, ja, js, je, &
3415 if ( prc_has_n .AND. prc_has_w )
then
3416 do j = je-jhalo+1, je
3417 disp = ka * ( ie + ia * ( j - je+jhalo-1 ) )
3418 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3419 prc_next(prc_nw), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3420 ginfo(gid)%win_packNS(vid), ierr )
3422 else if ( prc_has_n )
then
3423 do j = je-jhalo+1, je
3424 disp = ka * ( ia * ( j - je+jhalo-1 ) )
3425 call mpi_put( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3426 prc_next(prc_n), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3427 ginfo(gid)%win_packNS(vid), ierr )
3429 else if ( prc_has_w )
then
3431 disp = ka * ( ie + ia * ( j - je-1 + jhalo ) )
3432 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3433 prc_next(prc_w), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3434 ginfo(gid)%win_packNS(vid), ierr )
3438 if ( prc_has_n .AND. prc_has_e )
then
3439 do j = je-jhalo+1, je
3440 disp = ka * ( ia * ( j - je+jhalo-1 ) )
3441 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3442 prc_next(prc_ne), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3443 ginfo(gid)%win_packNS(vid), ierr )
3445 else if ( prc_has_n )
then
3446 do j = je-jhalo+1, je
3447 disp = ka * ( ie + ia * ( j - je+jhalo-1 ) )
3448 call mpi_put( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3449 prc_next(prc_n), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3450 ginfo(gid)%win_packNS(vid), ierr )
3452 else if ( prc_has_e )
then
3454 disp = ka * ia * ( j - je-1 + jhalo )
3455 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3456 prc_next(prc_e), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3457 ginfo(gid)%win_packNS(vid), ierr )
3461 if ( prc_has_s .AND. prc_has_w )
then
3462 do j = js, js+jhalo-1
3463 disp = ka * ( ie + ia * ( j - js + jhalo ) )
3464 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3465 prc_next(prc_sw), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3466 ginfo(gid)%win_packNS(vid), ierr )
3468 else if ( prc_has_s )
then
3469 do j = js, js+jhalo-1
3470 disp = ka * ( ia * ( j - js + jhalo ) )
3471 call mpi_put( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3472 prc_next(prc_s), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3473 ginfo(gid)%win_packNS(vid), ierr )
3475 else if ( prc_has_w )
then
3477 disp = ka * ( ie + ia * (j-1) )
3478 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3479 prc_next(prc_w), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3480 ginfo(gid)%win_packNS(vid), ierr )
3484 if ( prc_has_s .AND. prc_has_e )
then
3485 do j = js, js+jhalo-1
3486 disp = ka * ( ia * ( j - js + jhalo ) )
3487 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3488 prc_next(prc_se), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3489 ginfo(gid)%win_packNS(vid), ierr )
3491 else if ( prc_has_s )
then
3492 do j = js, js+jhalo-1
3493 disp = ka * ( ie + ia * ( j - js + jhalo ) )
3494 call mpi_put( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3495 prc_next(prc_s), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3496 ginfo(gid)%win_packNS(vid), ierr )
3498 else if ( prc_has_e )
then
3500 disp = ka * ( ia * ( j - 1 ) )
3501 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3502 prc_next(prc_e), disp, ginfo(gid)%size2D_4C*ka,
comm_datatype, &
3503 ginfo(gid)%win_packNS(vid), ierr )
3510 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3516 if ( prc_has_w )
then
3519 call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3521 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3523 prc_next(prc_w), disp, ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3524 ginfo(gid)%win_packWE(vid), ierr )
3527 if ( prc_has_e )
then
3530 call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3532 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3534 prc_next(prc_e), disp, ginfo(gid)%size2D_WE*ka,
comm_datatype, &
3535 ginfo(gid)%win_packWE(vid), ierr )
3543 call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
3544 call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
3558 real(RP),
intent(inout) :: var(:,:)
3559 integer,
intent(in) :: gid
3560 integer,
intent(in) :: vid
3562 integer :: IA, IS, IE
3563 integer :: JA, JS, JE
3564 integer :: IHALO, JHALO
3566 integer :: ireq, tag
3569 real(RP),
pointer :: ptr(:,:)
3570 logical :: flag_device
3580 ihalo = ginfo(gid)%IHALO
3581 jhalo = ginfo(gid)%JHALO
3583 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
3587 if ( ginfo(gid)%use_packbuf(vid) )
then
3588 log_error(
"vars_2D_mpi",*)
'packing buffer is already used', vid
3591 ginfo(gid)%use_packbuf(vid) = .true.
3595 flag_device = acc_is_present(var)
3602 if ( prc_has_s )
then
3603 call mpi_irecv( var(:,1:js-1), ginfo(gid)%size2D_NS4,
comm_datatype, &
3604 prc_next(prc_s), tag+1,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3608 if ( prc_has_n )
then
3609 call mpi_irecv( var(:,je+1:ja), ginfo(gid)%size2D_NS4,
comm_datatype, &
3610 prc_next(prc_n), tag+2,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3616 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
3620 if ( prc_has_e )
then
3622 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE,
comm_datatype, &
3624 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE,
comm_datatype, &
3626 prc_next(prc_e), tag+3,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3630 if ( prc_has_w )
then
3632 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE,
comm_datatype, &
3634 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE,
comm_datatype, &
3636 prc_next(prc_w), tag+4,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3647 call packwe_2d( ia, is, ie, ja, js, je, &
3652 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3657 if ( prc_has_w )
then
3659 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE,
comm_datatype, &
3661 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE,
comm_datatype, &
3663 prc_next(prc_w), tag+3,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3667 if ( prc_has_e )
then
3669 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE,
comm_datatype, &
3671 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE,
comm_datatype, &
3673 prc_next(prc_e), tag+4,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3684 if ( prc_has_n )
then
3685 call mpi_isend( var(:,je-jhalo+1:je), ginfo(gid)%size2D_NS4,
comm_datatype, &
3686 prc_next(prc_n), tag+1,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3690 if ( prc_has_s )
then
3691 call mpi_isend( var(:,js:js+jhalo-1), ginfo(gid)%size2D_NS4,
comm_datatype, &
3692 prc_next(prc_s), tag+2,
comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3698 ginfo(gid)%req_cnt(vid) = ireq - 1
3710 real(RP),
intent(inout) :: var(:,:)
3711 integer,
intent(in) :: gid
3712 integer,
intent(in) :: vid
3714 integer :: IA, IS, IE
3715 integer :: JA, JS, JE
3716 integer :: IHALO, JHALO
3718 integer(kind=MPI_ADDRESS_KIND) :: disp
3722 real(RP),
pointer :: ptr(:,:)
3732 ihalo = ginfo(gid)%IHALO
3733 jhalo = ginfo(gid)%JHALO
3737 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
3738 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
3744 call packwe_2d( ia, is, ie, ja, js, je, &
3749 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3754 if ( prc_has_w )
then
3757 call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE,
comm_datatype, &
3759 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE,
comm_datatype, &
3761 prc_next(prc_w), disp, ginfo(gid)%size2D_WE,
comm_datatype, &
3762 ginfo(gid)%win_packWE(vid), ierr )
3765 if ( prc_has_e )
then
3768 call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE,
comm_datatype, &
3770 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE,
comm_datatype, &
3772 prc_next(prc_e), disp, ginfo(gid)%size2D_WE,
comm_datatype, &
3773 ginfo(gid)%win_packWE(vid), ierr )
3783 if ( prc_has_n )
then
3785 call mpi_put( var(:,je-jhalo+1:je), ginfo(gid)%size2D_NS4,
comm_datatype, &
3786 prc_next(prc_n), disp, ginfo(gid)%size2D_NS4,
comm_datatype, &
3787 ginfo(gid)%win_packNS(vid), ierr )
3790 if ( prc_has_s )
then
3792 call mpi_put( var(:,js:js+jhalo-1), ginfo(gid)%size2D_NS4,
comm_datatype, &
3793 prc_next(prc_s), disp, ginfo(gid)%size2D_NS4,
comm_datatype, &
3794 ginfo(gid)%win_packNS(vid), ierr )
3799 call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
3800 call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
3814 real(RP),
intent(inout) :: var(:,:)
3815 integer,
intent(in) :: gid
3816 integer,
intent(in) :: vid
3818 integer :: IA, IS, IE
3819 integer :: JA, JS, JE
3820 integer :: IHALO, JHALO
3822 integer :: ireq, tag, tagc
3827 real(RP),
pointer :: ptr(:,:)
3828 logical :: flag_device
3838 ihalo = ginfo(gid)%IHALO
3839 jhalo = ginfo(gid)%JHALO
3841 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
3845 if ( ginfo(gid)%use_packbuf(vid) )
then
3846 log_error(
"vars8_2D_mpi",*)
'packing buffer is already used', vid
3849 ginfo(gid)%use_packbuf(vid) = .true.
3853 flag_device = acc_is_present(var)
3856 if ( comm_isallperiodic )
then
3865 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
3867 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3874 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
3876 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3883 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
3885 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3892 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
3894 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3899 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
3904 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE, &
3906 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE, &
3909 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3913 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE, &
3915 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE, &
3918 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3925 call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
3927 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3934 call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
3936 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3946 do j = je-jhalo+1, je
3947 call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
3949 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3956 do j = js, js+jhalo-1
3957 call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
3959 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3968 call packwe_2d( ia, is, ie, ja, js, je, &
3974 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3980 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE, &
3982 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, &
3985 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3990 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE, &
3992 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, &
3995 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4001 do j = je-jhalo+1, je
4002 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4004 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4011 do j = je-jhalo+1, je
4012 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4014 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4021 do j = js, js+jhalo-1
4022 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4024 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4031 do j = js, js+jhalo-1
4032 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4034 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4051 if ( prc_has_s .AND. prc_has_e )
then
4054 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4056 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4060 else if ( prc_has_s )
then
4063 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4065 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4069 else if ( prc_has_e )
then
4072 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4074 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4081 if ( prc_has_s .AND. prc_has_w )
then
4084 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4086 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4090 else if ( prc_has_s )
then
4093 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4095 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4099 else if ( prc_has_w )
then
4102 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4104 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4111 if ( prc_has_n .AND. prc_has_e )
then
4113 do j = je+1, je+jhalo
4114 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4116 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4120 else if ( prc_has_n )
then
4123 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4125 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4129 else if ( prc_has_e )
then
4132 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4134 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4141 if ( prc_has_n .AND. prc_has_w )
then
4144 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4146 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4150 else if ( prc_has_n )
then
4153 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4155 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4159 else if ( prc_has_w )
then
4162 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4164 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4171 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
4175 if ( prc_has_e )
then
4177 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE, &
4179 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE, &
4182 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4187 if ( prc_has_w )
then
4189 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE, &
4191 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE, &
4194 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4202 if ( prc_has_s )
then
4205 call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
4207 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4214 if ( prc_has_n )
then
4217 call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
4219 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4229 if ( prc_has_n )
then
4231 do j = je-jhalo+1, je
4232 call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
4234 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4241 if ( prc_has_s )
then
4243 do j = js, js+jhalo-1
4244 call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
4246 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4256 call packwe_2d( ia, is, ie, ja, js, je, &
4262 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4267 if ( prc_has_w )
then
4269 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE, &
4271 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, &
4274 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4279 if ( prc_has_e )
then
4281 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE, &
4283 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, &
4286 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4292 if ( prc_has_n .AND. prc_has_w )
then
4294 do j = je-jhalo+1, je
4295 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4297 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4301 else if ( prc_has_n )
then
4303 do j = je-jhalo+1, je
4304 call mpi_isend( var(1,j), ginfo(gid)%size2D_4C, &
4306 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4310 else if ( prc_has_w )
then
4313 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4315 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4322 if ( prc_has_n .AND. prc_has_e )
then
4324 do j = je-jhalo+1, je
4325 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4327 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4331 else if ( prc_has_n )
then
4333 do j = je-jhalo+1, je
4334 call mpi_isend( var(ie+1,j), ginfo(gid)%size2D_4C, &
4336 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4340 else if ( prc_has_e )
then
4343 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4345 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4352 if ( prc_has_s .AND. prc_has_w )
then
4354 do j = js, js+jhalo-1
4355 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4357 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4361 else if ( prc_has_s )
then
4363 do j = js, js+jhalo-1
4364 call mpi_isend( var(1,j), ginfo(gid)%size2D_4C, &
4366 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4370 else if ( prc_has_w )
then
4373 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4375 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4382 if ( prc_has_s .AND. prc_has_e )
then
4384 do j = js, js+jhalo-1
4385 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4387 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4391 else if ( prc_has_s )
then
4393 do j = js, js+jhalo-1
4394 call mpi_isend( var(ie+1,j), ginfo(gid)%size2D_4C, &
4396 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4400 else if ( prc_has_e )
then
4403 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4405 comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4417 ginfo(gid)%req_cnt(vid) = ireq - 1
4429 real(RP),
intent(inout) :: var(:,:)
4430 integer,
intent(in) :: gid
4431 integer,
intent(in) :: vid
4433 integer :: IA, IS, IE, IHALO
4434 integer :: JA, JS, JE, JHALO
4436 integer(kind=MPI_ADDRESS_KIND) :: disp
4441 real(RP),
pointer :: ptr(:,:)
4448 ihalo = ginfo(gid)%IHALO
4452 jhalo = ginfo(gid)%JHALO
4456 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
4457 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
4459 if ( comm_isallperiodic )
then
4467 do j = je-jhalo+1, je
4468 disp = ihalo + ia * ( j - je+jhalo-1 )
4469 call mpi_put( var(is,j), ginfo(gid)%size2D_NS8,
comm_datatype, &
4470 prc_next(prc_n), disp, ginfo(gid)%size2D_NS8,
comm_datatype, &
4471 ginfo(gid)%win_packNS(vid), ierr )
4474 do j = js, js+jhalo-1
4475 disp = ihalo + ia * ( j - js + jhalo )
4476 call mpi_put( var(is,j), ginfo(gid)%size2D_NS8,
comm_datatype, &
4477 prc_next(prc_s), disp, ginfo(gid)%size2D_NS8,
comm_datatype, &
4478 ginfo(gid)%win_packNS(vid), ierr )
4485 call packwe_2d( ia, is, ie, ja, js, je, &
4491 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4498 call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE,
comm_datatype, &
4500 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE,
comm_datatype, &
4502 prc_next(prc_w), disp, ginfo(gid)%size2D_WE,
comm_datatype, &
4503 ginfo(gid)%win_packWE(vid), ierr )
4507 call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE,
comm_datatype, &
4509 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE,
comm_datatype, &
4511 prc_next(prc_e), disp, ginfo(gid)%size2D_WE,
comm_datatype, &
4512 ginfo(gid)%win_packWE(vid), ierr )
4515 do j = je-jhalo+1, je
4516 disp = ie + ia * ( j - je+jhalo-1 )
4517 call mpi_put( var(is,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4518 prc_next(prc_nw), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4519 ginfo(gid)%win_packNS(vid), ierr )
4522 do j = je-jhalo+1, je
4523 disp = ia * ( j - je+jhalo-1 )
4524 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4525 prc_next(prc_ne), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4526 ginfo(gid)%win_packNS(vid), ierr )
4529 do j = js, js+jhalo-1
4530 disp = ie + ia * ( j - js + jhalo )
4531 call mpi_put( var(is,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4532 prc_next(prc_sw), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4533 ginfo(gid)%win_packNS(vid), ierr )
4536 do j = js, js+jhalo-1
4537 disp = ia * ( j - js + jhalo )
4538 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4539 prc_next(prc_se), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4540 ginfo(gid)%win_packNS(vid), ierr )
4552 if ( prc_has_n )
then
4553 do j = je-jhalo+1, je
4554 disp = ihalo + ia * ( j - je+jhalo-1 )
4555 call mpi_put( var(is,j), ginfo(gid)%size2D_NS8,
comm_datatype, &
4556 prc_next(prc_n), disp, ginfo(gid)%size2D_NS8,
comm_datatype, &
4557 ginfo(gid)%win_packNS(vid), ierr )
4561 if ( prc_has_s )
then
4562 do j = js, js+jhalo-1
4563 disp = ihalo + ia * ( j - js + jhalo )
4564 call mpi_put( var(is,j), ginfo(gid)%size2D_NS8,
comm_datatype, &
4565 prc_next(prc_s), disp, ginfo(gid)%size2D_NS8,
comm_datatype, &
4566 ginfo(gid)%win_packNS(vid), ierr )
4574 call packwe_2d( ia, is, ie, ja, js, je, &
4580 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4585 if ( prc_has_w )
then
4588 call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE,
comm_datatype, &
4590 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE,
comm_datatype, &
4592 prc_next(prc_w), disp, ginfo(gid)%size2D_WE,
comm_datatype, &
4593 ginfo(gid)%win_packWE(vid), ierr )
4596 if ( prc_has_e )
then
4599 call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE,
comm_datatype, &
4601 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE,
comm_datatype, &
4603 prc_next(prc_e), disp, ginfo(gid)%size2D_WE,
comm_datatype, &
4604 ginfo(gid)%win_packWE(vid), ierr )
4608 if ( prc_has_n .AND. prc_has_w )
then
4609 do j = je-jhalo+1, je
4610 disp = ie + ia * ( j - je+jhalo-1 )
4611 call mpi_put( var(is,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4612 prc_next(prc_nw), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4613 ginfo(gid)%win_packNS(vid), ierr )
4615 else if ( prc_has_n )
then
4616 do j = je-jhalo+1, je
4617 disp = ia * ( j - je+jhalo-1 )
4618 call mpi_put( var(1,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4619 prc_next(prc_n), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4620 ginfo(gid)%win_packNS(vid), ierr )
4622 else if ( prc_has_w )
then
4624 disp = ie + ia * ( j - je-1 + jhalo )
4625 call mpi_put( var(is,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4626 prc_next(prc_w), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4627 ginfo(gid)%win_packNS(vid), ierr )
4631 if ( prc_has_n .AND. prc_has_e )
then
4632 do j = je-jhalo+1, je
4633 disp = ia * ( j - je+jhalo-1 )
4634 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4635 prc_next(prc_ne), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4636 ginfo(gid)%win_packNS(vid), ierr )
4638 else if ( prc_has_n )
then
4639 do j = je-jhalo+1, je
4640 disp = ie + ia * ( j - je+jhalo-1 )
4641 call mpi_put( var(ie+1,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4642 prc_next(prc_n), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4643 ginfo(gid)%win_packNS(vid), ierr )
4645 else if ( prc_has_e )
then
4647 disp = ia * ( j - je-1 + jhalo )
4648 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4649 prc_next(prc_e), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4650 ginfo(gid)%win_packNS(vid), ierr )
4654 if ( prc_has_s .AND. prc_has_w )
then
4655 do j = js, js+jhalo-1
4656 disp = ie + ia * ( j - js + jhalo )
4657 call mpi_put( var(is,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4658 prc_next(prc_sw), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4659 ginfo(gid)%win_packNS(vid), ierr )
4661 else if ( prc_has_s )
then
4662 do j = js, js+jhalo-1
4663 disp = ia * ( j - js + jhalo )
4664 call mpi_put( var(1,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4665 prc_next(prc_s), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4666 ginfo(gid)%win_packNS(vid), ierr )
4668 else if ( prc_has_w )
then
4670 disp = ie + ia * ( j - 1 )
4671 call mpi_put( var(is,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4672 prc_next(prc_w), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4673 ginfo(gid)%win_packNS(vid), ierr )
4677 if ( prc_has_s .AND. prc_has_e )
then
4678 do j = js, js+jhalo-1
4679 disp = ia * ( j - js + jhalo )
4680 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4681 prc_next(prc_se), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4682 ginfo(gid)%win_packNS(vid), ierr )
4684 else if ( prc_has_s )
then
4685 do j = js, js+jhalo-1
4686 disp = ie + ia * ( j - js + jhalo )
4687 call mpi_put( var(ie+1,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4688 prc_next(prc_s), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4689 ginfo(gid)%win_packNS(vid), ierr )
4691 else if ( prc_has_e )
then
4693 disp = ia * ( j - 1 )
4694 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C,
comm_datatype, &
4695 prc_next(prc_e), disp, ginfo(gid)%size2D_4C,
comm_datatype, &
4696 ginfo(gid)%win_packNS(vid), ierr )
4705 call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
4706 call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
4719 real(RP),
intent(inout) :: var(:,:,:)
4720 integer,
intent(in) :: gid
4721 integer,
intent(in) :: vid
4724 integer :: IA, IS, IE
4725 integer :: JA, JS, JE
4732 if ( ginfo(gid)%use_packbuf(ginfo(gid)%packid(vid)) )
then
4733 log_error(
"vars_3D_mpi_pc",*)
'packing buffer is already used', vid, ginfo(gid)%packid(vid)
4736 ginfo(gid)%use_packbuf(ginfo(gid)%packid(vid)) = .true.
4740 if ( ginfo(gid)%device_alloc(vid+comm_vsize_max) )
then
4753 ihalo = ginfo(gid)%IHALO
4754 call packwe_3d( ka, ia, is, ie, ja, js, je, &
4756 var, gid, ginfo(gid)%packid(vid))
4760 call mpi_startall(ginfo(gid)%preq_cnt(vid), ginfo(gid)%preq_list(1:ginfo(gid)%preq_cnt(vid),vid), ierr)
4769 real(RP),
intent(inout) :: var(:,:,:)
4770 integer,
intent(in) :: gid
4771 integer,
intent(in) :: vid
4774 integer :: IA, IS, IE
4775 integer :: JA, JS, JE
4782 call mpi_waitall( ginfo(gid)%req_cnt (vid), &
4783 ginfo(gid)%req_list(1:ginfo(gid)%req_cnt(vid),vid), &
4784 mpi_statuses_ignore, &
4794 ihalo = ginfo(gid)%IHALO
4795 call unpackwe_3d( ka, ia, is, ie, ja, js, je, &
4797 var, ginfo(gid)%recvpack_WE2P(:,:,vid) )
4802 ginfo(gid)%use_packbuf(vid) = .false.
4812 real(RP),
intent(inout) :: var(:,:,:)
4813 integer,
intent(in) :: gid
4814 integer,
intent(in) :: vid
4817 integer :: IA, IS, IE
4818 integer :: JA, JS, JE
4819 integer :: IHALO, JHALO
4821 real(RP),
pointer :: pack(:)
4833 ihalo = ginfo(gid)%IHALO
4834 jhalo = ginfo(gid)%JHALO
4836 call mpi_win_wait( ginfo(gid)%win_packWE(vid), ierr )
4838 call c_f_pointer( ginfo(gid)%recvbuf_WE(vid), pack, (/ginfo(gid)%size2D_WE*ka*2/) )
4839 call unpackwe_3d( ka, ia, is, ie, ja, js, je, &
4844 call mpi_win_wait( ginfo(gid)%win_packNS(vid), ierr )
4845 call c_f_pointer( ginfo(gid)%recvbuf_NS(vid), pack, (/ginfo(gid)%size2D_NS4*ka*2/) )
4846 call unpackns_3d( ka, ia, is, ie, ja, js, je, &
4852 call mpi_win_post( group_packwe, mpi_mode_nostore, ginfo(gid)%win_packWE(vid), ierr )
4853 call mpi_win_post( group_packns, mpi_mode_nostore, ginfo(gid)%win_packNS(vid), ierr )
4862 real(RP),
intent(inout) :: var(:,:)
4863 integer,
intent(in) :: gid
4864 integer,
intent(in) :: vid
4867 integer :: IA, IS, IE
4868 integer :: JA, JS, JE
4875 call mpi_waitall( ginfo(gid)%req_cnt(vid), &
4876 ginfo(gid)%req_list(1:ginfo(gid)%req_cnt(vid),vid), &
4877 mpi_statuses_ignore, &
4887 ihalo = ginfo(gid)%IHALO
4888 call unpackwe_2d( ka, ia, is, ie, ja, js, je, &
4890 var, ginfo(gid)%recvpack_WE2P(:,:,vid) )
4894 ginfo(gid)%use_packbuf(vid) = .false.
4904 real(RP),
intent(inout) :: var(:,:)
4905 integer,
intent(in) :: gid
4906 integer,
intent(in) :: vid
4909 integer :: IA, IS, IE
4910 integer :: JA, JS, JE
4911 integer :: IHALO, JHALO
4913 real(RP),
pointer :: pack(:)
4925 ihalo = ginfo(gid)%IHALO
4926 jhalo = ginfo(gid)%JHALO
4928 call mpi_win_wait( ginfo(gid)%win_packWE(vid), ierr )
4930 call c_f_pointer( ginfo(gid)%recvbuf_WE(vid), pack, (/ginfo(gid)%size2D_WE*ka*2/) )
4931 call unpackwe_2d( ka, ia, is, ie, ja, js, je, &
4936 call mpi_win_wait( ginfo(gid)%win_packNS(vid), ierr )
4937 call c_f_pointer( ginfo(gid)%recvbuf_NS(vid), pack, (/ginfo(gid)%size2D_NS4*ka*2/) )
4938 call unpackns_2d( ia, is, ie, ja, js, je, &
4942 call mpi_win_post( group_packwe, mpi_mode_nostore, ginfo(gid)%win_packWE(vid), ierr )
4943 call mpi_win_post( group_packns, mpi_mode_nostore, ginfo(gid)%win_packNS(vid), ierr )
4952 real(RP),
intent(inout) :: var(:,:,:)
4953 integer,
intent(in) :: gid
4954 integer,
intent(in) :: vid
4957 integer :: IA, IS, IE
4958 integer :: JA, JS, JE
4965 call mpi_waitall( ginfo(gid)%preq_cnt (vid), &
4966 ginfo(gid)%preq_list(1:ginfo(gid)%preq_cnt(vid),vid), &
4967 mpi_statuses_ignore, &
4977 ihalo = ginfo(gid)%IHALO
4978 pid = ginfo(gid)%packid(vid)
4979 call unpackwe_3d( ka, ia, is, ie, ja, js, je, &
4981 var, ginfo(gid)%recvpack_WE2P(:,:,pid) )
4986 ginfo(gid)%use_packbuf(ginfo(gid)%packid(vid)) = .false.
4990 if ( ginfo(gid)%device_alloc(vid+comm_vsize_max) )
then
4998 subroutine packwe_3d( KA, IA, IS, IE, JA, JS, JE, &
5002 integer,
intent(in) :: KA
5003 integer,
intent(in) :: IA, IS, IE
5004 integer,
intent(in) :: JA, JS, JE
5005 integer,
intent(in) :: IHALO
5006 real(RP),
intent(in) :: var(KA,IA,JA)
5007 integer,
intent(in) :: gid
5008 integer,
intent(in) :: vid
5010 integer :: k, i, j, n
5013 real(RP),
pointer :: ptr(:,:,:)
5014 ptr => ginfo(gid)%sendpack_P2WE
5019 call prof_rapstart(
'COMM_pack', 3)
5021 if ( prc_has_w )
then
5027 do i = is, is+ihalo-1
5030 n = (j-js) * ka * ihalo &
5034 ptr(n,1,vid) = var(k,i,j)
5036 ginfo(gid)%sendpack_P2WE(n,1,vid) = var(k,i,j)
5044 if ( prc_has_e )
then
5050 do i = ie-ihalo+1, ie
5053 n = (j-js) * ka * ihalo &
5054 + (i-ie+ihalo-1) * ka &
5057 ptr(n,2,vid) = var(k,i,j)
5059 ginfo(gid)%sendpack_P2WE(n,2,vid) = var(k,i,j)
5067 call prof_rapend(
'COMM_pack', 3)
5074 subroutine packwe_2d( IA, IS, IE, JA, JS, JE, &
5078 integer,
intent(in) :: IA, IS, IE
5079 integer,
intent(in) :: JA, JS, JE
5080 integer,
intent(in) :: IHALO
5081 real(RP),
intent(in) :: var(IA,JA)
5082 integer,
intent(in) :: vid
5083 integer,
intent(in) :: gid
5088 real(RP),
pointer :: ptr(:,:,:)
5089 ptr => ginfo(gid)%sendpack_P2WE
5093 call prof_rapstart(
'COMM_pack', 3)
5095 if ( prc_has_w )
then
5103 do i = is, is+ihalo-1
5104 n = (j-js) * ihalo &
5107 ptr(n,1,vid) = var(i,j)
5109 ginfo(gid)%sendpack_P2WE(n,1,vid) = var(i,j)
5116 if ( prc_has_e )
then
5123 do i = ie-ihalo+1, ie
5124 n = (j-js) * ihalo &
5125 + (i-ie+ihalo-1) + 1
5127 ptr(n,2,vid) = var(i,j)
5129 ginfo(gid)%sendpack_P2WE(n,2,vid) = var(i,j)
5138 call prof_rapend(
'COMM_pack', 3)
5143 end subroutine packwe_2d
5145 subroutine unpackwe_3d( KA, IA, IS, IE, JA, JS, JE, &
5149 integer,
intent(in) :: KA
5150 integer,
intent(in) :: IA, IS, IE
5151 integer,
intent(in) :: JA, JS, JE
5152 integer,
intent(in) :: IHALO
5153 real(RP),
intent(inout) :: var(KA,IA,JA)
5154 real(RP),
intent(in) :: buf(KA,IHALO,JS:JE,2)
5161 call prof_rapstart(
'COMM_unpack', 3)
5163 if ( prc_has_e )
then
5172 var(k,i,j) = buf(k,i-ie,j,2)
5179 if ( prc_has_w )
then
5188 var(k,i,j) = buf(k,i,j,1)
5195 call prof_rapend(
'COMM_unpack', 3)
5200 end subroutine unpackwe_3d
5202 subroutine unpackwe_2d( KA, IA, IS, IE, JA, JS, JE, &
5206 integer,
intent(in) :: KA
5207 integer,
intent(in) :: IA, IS, IE
5208 integer,
intent(in) :: JA, JS, JE
5209 integer,
intent(in) :: IHALO
5210 real(RP),
intent(inout) :: var(IA,JA)
5211 real(RP),
intent(in) :: buf(IHALO,JS:JE,KA,2)
5218 call prof_rapstart(
'COMM_unpack', 3)
5220 if( prc_has_e )
then
5225 do i = ie+1, ie+ihalo
5226 var(i,j) = buf(i-ie,j,1,2)
5232 if( prc_has_w )
then
5237 do i = is-ihalo, is-1
5238 var(i,j) = buf(i,j,1,1)
5246 call prof_rapend(
'COMM_unpack', 3)
5251 end subroutine unpackwe_2d
5253 subroutine unpackns_3d( KA, IA, IS, IE, JA, JS, JE, &
5257 integer,
intent(in) :: KA
5258 integer,
intent(in) :: IA, IS, IE
5259 integer,
intent(in) :: JA, JS, JE
5260 integer,
intent(in) :: JHALO
5261 real(RP),
intent(inout) :: var(KA,IA,JA)
5262 real(RP),
intent(in) :: buf(KA,IA,JHALO,2)
5269 call prof_rapstart(
'COMM_unpack', 3)
5271 if ( prc_has_s )
then
5278 var(k,i,j) = buf(k,i,j,1)
5284 if ( prc_has_w )
then
5291 var(k,i,j) = buf(k,i,j,1)
5297 if ( prc_has_e )
then
5304 var(k,i,j) = buf(k,i,j,1)
5312 if ( prc_has_n )
then
5319 var(k,i,j) = buf(k,i,j-je,2)
5325 if ( prc_has_w )
then
5332 var(k,i,j) = buf(k,i,j-je,2)
5338 if ( prc_has_e )
then
5345 var(k,i,j) = buf(k,i,j-je,2)
5355 call prof_rapend(
'COMM_unpack', 3)
5360 end subroutine unpackns_3d
5362 subroutine unpackns_2d( IA, IS, IE, JA, JS, JE, &
5366 integer,
intent(in) :: IA, IS, IE
5367 integer,
intent(in) :: JA, JS, JE
5368 integer,
intent(in) :: JHALO
5369 real(RP),
intent(inout) :: var(IA,JA)
5370 real(RP),
intent(in) :: buf(IA,JHALO,2)
5377 call prof_rapstart(
'COMM_unpack', 3)
5379 if ( prc_has_s )
then
5385 var(i,j) = buf(i,j,1)
5390 if ( prc_has_w )
then
5396 var(i,j) = buf(i,j,1)
5401 if ( prc_has_e )
then
5407 var(i,j) = buf(i,j,1)
5414 if ( prc_has_n )
then
5420 var(i,j) = buf(i,j-je,2)
5425 if ( prc_has_w )
then
5431 var(i,j) = buf(i,j-je,2)
5436 if ( prc_has_e )
then
5442 var(i,j) = buf(i,j-je,2)
5451 call prof_rapend(
'COMM_unpack', 3)
5456 end subroutine unpackns_2d
5458 subroutine copy_boundary_3d(var, gid)
5463 real(RP),
intent(inout) :: var(:,:,:)
5464 integer,
intent(in) :: gid
5467 integer :: IS, IE, IHALO
5468 integer :: JS, JE, JHALO
5478 ihalo = ginfo(gid)%IHALO
5481 jhalo = ginfo(gid)%JHALO
5486 if ( .NOT. prc_has_n )
then
5488 do j = je+1, je+jhalo
5492 var(k,i,j) = var(k,i,je)
5501 if ( .NOT. prc_has_s )
then
5504 do j = js-jhalo, js-1
5508 var(k,i,j) = var(k,i,js)
5519 if ( .NOT. prc_has_e )
then
5523 do i = ie+1, ie+ihalo
5525 var(k,i,j) = var(k,ie,j)
5534 if ( .NOT. prc_has_w )
then
5539 do i = is-ihalo, is-1
5540 var(:,i,j) = var(:,is,j)
5548 if ( .NOT. prc_has_n .AND. &
5549 .NOT. prc_has_w )
then
5551 do j = je+1, je+jhalo
5553 do i = is-ihalo, is-1
5555 var(k,i,j) = var(k,is,je)
5560 elseif( .NOT. prc_has_n )
then
5562 do j = je+1, je+jhalo
5563 do i = is-ihalo, is-1
5565 var(k,i,j) = var(k,i,je)
5570 elseif( .NOT. prc_has_w )
then
5572 do j = je+1, je+jhalo
5574 do i = is-ihalo, is-1
5576 var(k,i,j) = var(k,is,j)
5584 if ( .NOT. prc_has_s .AND. &
5585 .NOT. prc_has_w )
then
5588 do j = js-jhalo, js-1
5590 do i = is-ihalo, is-1
5592 var(k,i,j) = var(k,is,js)
5597 elseif( .NOT. prc_has_s )
then
5600 do j = js-jhalo, js-1
5601 do i = is-ihalo, is-1
5603 var(k,i,j) = var(k,i,js)
5608 elseif( .NOT. prc_has_w )
then
5610 do j = js-jhalo, js-1
5612 do i = is-ihalo, is-1
5614 var(k,i,j) = var(k,is,j)
5622 if ( .NOT. prc_has_n .AND. &
5623 .NOT. prc_has_e )
then
5625 do j = je+1, je+jhalo
5626 do i = ie+1, ie+ihalo
5628 var(k,i,j) = var(k,ie,je)
5633 elseif( .NOT. prc_has_n )
then
5635 do j = je+1, je+jhalo
5636 do i = ie+1, ie+ihalo
5638 var(k,i,j) = var(k,i,je)
5643 elseif( .NOT. prc_has_e )
then
5645 do j = je+1, je+jhalo
5646 do i = ie+1, ie+ihalo
5648 var(k,i,j) = var(k,ie,j)
5656 if ( .NOT. prc_has_s .AND. &
5657 .NOT. prc_has_e )
then
5659 do j = js-jhalo, js-1
5660 do i = ie+1, ie+ihalo
5662 var(k,i,j) = var(k,ie,js)
5667 elseif( .NOT. prc_has_s )
then
5670 do j = js-jhalo, js-1
5671 do i = ie+1, ie+ihalo
5673 var(k,i,j) = var(k,i,js)
5678 elseif( .NOT. prc_has_e )
then
5680 do j = js-jhalo, js-1
5681 do i = ie+1, ie+ihalo
5683 var(k,i,j) = var(k,ie,j)
5699 end subroutine copy_boundary_3d
5706 real(RP),
intent(inout) :: var(:,:)
5707 integer,
intent(in) :: gid
5709 integer :: IS, IE, IHALO
5710 integer :: JS, JE, JHALO
5719 ihalo = ginfo(gid)%IHALO
5722 jhalo = ginfo(gid)%JHALO
5727 if( .NOT. prc_has_n )
then
5729 do j = je+1, je+jhalo
5732 var(i,j) = var(i,je)
5740 if( .NOT. prc_has_s )
then
5743 do j = js-jhalo, js-1
5746 var(i,j) = var(i,js)
5755 if( .NOT. prc_has_e )
then
5759 do i = ie+1, ie+ihalo
5760 var(i,j) = var(ie,j)
5767 if( .NOT. prc_has_w )
then
5772 do i = is-ihalo, is-1
5773 var(i,j) = var(is,j)
5781 if( .NOT. prc_has_n .AND. .NOT. prc_has_w )
then
5783 do j = je+1, je+jhalo
5785 do i = is-ihalo, is-1
5786 var(i,j) = var(is,je)
5790 elseif( .NOT. prc_has_n )
then
5792 do j = je+1, je+jhalo
5793 do i = is-ihalo, is-1
5794 var(i,j) = var(i,je)
5798 elseif( .NOT. prc_has_w )
then
5800 do j = je+1, je+jhalo
5802 do i = is-ihalo, is-1
5803 var(i,j) = var(is,j)
5810 if( .NOT. prc_has_s .AND. .NOT. prc_has_w )
then
5813 do j = js-jhalo, js-1
5815 do i = is-ihalo, is-1
5816 var(i,j) = var(is,js)
5820 elseif( .NOT. prc_has_s )
then
5823 do j = js-jhalo, js-1
5824 do i = is-ihalo, is-1
5825 var(i,j) = var(i,js)
5829 elseif( .NOT. prc_has_w )
then
5831 do j = js-jhalo, js-1
5833 do i = is-ihalo, is-1
5834 var(i,j) = var(is,j)
5841 if( .NOT. prc_has_n .AND. .NOT. prc_has_e )
then
5843 do j = je+1, je+jhalo
5844 do i = ie+1, ie+ihalo
5845 var(i,j) = var(ie,je)
5849 elseif( .NOT. prc_has_n )
then
5851 do j = je+1, je+jhalo
5852 do i = ie+1, ie+ihalo
5853 var(i,j) = var(i,je)
5857 elseif( .NOT. prc_has_e )
then
5859 do j = je+1, je+jhalo
5860 do i = ie+1, ie+ihalo
5861 var(i,j) = var(ie,j)
5868 if( .NOT. prc_has_s .AND. .NOT. prc_has_e )
then
5870 do j = js-jhalo, js-1
5871 do i = ie+1, ie+ihalo
5872 var(i,j) = var(ie,js)
5876 elseif( .NOT. prc_has_s )
then
5879 do j = js-jhalo, js-1
5880 do i = ie+1, ie+ihalo
5881 var(i,j) = var(i,js)
5885 elseif( .NOT. prc_has_e )
then
5887 do j = js-jhalo, js-1
5888 do i = ie+1, ie+ihalo
5889 var(i,j) = var(ie,j)