65 end interface comm_vars
70 end interface comm_vars8
75 end interface comm_wait
80 end interface comm_gather
99 end interface comm_bcast
116 integer,
private :: comm_vsize_max
117 integer,
private :: comm_vsize_max_pc
119 logical,
private :: comm_isallperiodic
121 logical,
private :: comm_use_mpi_pc = .true.
123 logical,
private :: comm_use_mpi_onesided = .true.
125 logical,
private :: comm_use_mpi_onesided = .false.
129 integer,
private :: comm_datatype_t
130 integer,
private :: comm_world_t
132 type(mpi_datatype),
private :: comm_datatype_t
133 type(mpi_comm),
private :: comm_world_t
138 real(
rp),
pointer :: ptr(:,:,:)
143 integer :: ia, is, ie, ihalo
144 integer :: ja, js, je, jhalo
146 integer :: size2d_ns4
147 integer :: size2d_ns8
150 integer :: vars_num = 0
151 real(
rp),
pointer :: recvpack_we2p(:,:,:)
152 real(
rp),
pointer :: sendpack_p2we(:,:,:)
153 type(c_ptr),
allocatable :: recvbuf_we(:)
154 type(c_ptr),
allocatable :: recvbuf_ns(:)
155 integer,
allocatable :: req_cnt (:)
156 integer,
allocatable :: preq_cnt (:)
157 integer,
allocatable :: packid(:)
159 integer,
allocatable :: req_list(:,:)
160 integer,
allocatable :: preq_list(:,:)
161 integer,
allocatable :: win_packwe(:)
162 integer,
allocatable :: win_packns(:)
164 type(mpi_request),
allocatable :: req_list(:,:)
165 type(mpi_request),
allocatable :: preq_list(:,:)
166 type(mpi_win),
allocatable :: win_packwe(:)
167 type(mpi_win),
allocatable :: win_packns(:)
170 logical,
allocatable :: use_packbuf(:)
173 logical,
allocatable :: device_alloc(:)
174 type(ptr_t),
allocatable :: device_ptr(:)
178 integer,
private,
parameter :: comm_gid_max = 20
179 integer,
private :: comm_gid
180 type(ginfo_t),
private :: ginfo(comm_gid_max)
183 integer,
private :: group_packwe
184 integer,
private :: group_packns
186 type(mpi_group),
private :: group_packwe
187 type(mpi_group),
private :: group_packns
189 logical,
private :: group_packwe_created = .false.
190 logical,
private :: group_packns_created = .false.
192 logical,
private :: initialized = .false.
207 namelist / param_comm_cartesc / &
211 comm_use_mpi_onesided
217 type(mpi_group) :: group
224 if ( initialized )
return
227 log_info(
"COMM_setup",*)
'Setup'
229 comm_vsize_max = max( 10 +
qa*2, 25 )
230 comm_vsize_max_pc = 50 +
qa*2
233 comm_use_mpi_onesided = .false.
238 read(
io_fid_conf,nml=param_comm_cartesc,iostat=ierr)
240 log_info(
"COMM_setup",*)
'Not found namelist. Default used.'
241 elseif( ierr > 0 )
then
242 log_error(
"COMM_setup",*)
'Not appropriate names in namelist PARAM_COMM_CARTESC. Check!'
245 log_nml(param_comm_cartesc)
247 if ( prc_has_n .AND. prc_has_s .AND. prc_has_w .AND. prc_has_e )
then
248 comm_isallperiodic = .true.
250 comm_isallperiodic = .false.
255 if (
rp == kind(0.d0) )
then
256 comm_datatype_t = mpi_double_precision
257 elseif(
rp == kind(0.0) )
then
258 comm_datatype_t = mpi_real
260 log_error(
"COMM_setup",*)
'precision is not supportd'
275 if ( comm_use_mpi_onesided )
then
276 log_warn(
"COMM_setup",*)
"Open MPI does not support one-sided APIs with CUDA-aware UCX"
280 if ( comm_use_mpi_onesided )
then
282 comm_use_mpi_pc = .false.
284 call mpi_comm_group( comm_world_t, group, ierr )
287 if ( prc_has_s )
then
289 ranks(n) = prc_next(prc_s)
291 if ( prc_has_n )
then
293 if ( ranks(m) == prc_next(prc_n) )
exit
295 if ( m == n + 1 )
then
297 ranks(n) = prc_next(prc_n)
300 if ( prc_has_n .and. prc_has_w )
then
302 if ( ranks(m) == prc_next(prc_nw) )
exit
304 if ( m == n + 1 )
then
306 ranks(n) = prc_next(prc_nw)
308 else if ( prc_has_n )
then
310 if ( ranks(m) == prc_next(prc_n) )
exit
312 if ( m == n + 1 )
then
314 ranks(n) = prc_next(prc_n)
316 else if ( prc_has_w )
then
318 if ( ranks(m) == prc_next(prc_w) )
exit
320 if ( m == n + 1 )
then
322 ranks(n) = prc_next(prc_w)
325 if ( prc_has_n .and. prc_has_e )
then
327 if ( ranks(m) == prc_next(prc_ne) )
exit
329 if ( m == n + 1 )
then
331 ranks(n) = prc_next(prc_ne)
333 else if ( prc_has_n )
then
335 if ( ranks(m) == prc_next(prc_n) )
exit
337 if ( m == n + 1 )
then
339 ranks(n) = prc_next(prc_n)
341 else if ( prc_has_e )
then
343 if ( ranks(m) == prc_next(prc_e) )
exit
345 if ( m == n + 1 )
then
347 ranks(n) = prc_next(prc_e)
350 if ( prc_has_s .and. prc_has_w )
then
352 if ( ranks(m) == prc_next(prc_sw) )
exit
354 if ( m == n + 1 )
then
356 ranks(n) = prc_next(prc_sw)
358 else if ( prc_has_s )
then
360 if ( ranks(m) == prc_next(prc_s) )
exit
362 if ( m == n + 1 )
then
364 ranks(n) = prc_next(prc_s)
366 else if ( prc_has_w )
then
368 if ( ranks(m) == prc_next(prc_w) )
exit
370 if ( m == n + 1 )
then
372 ranks(n) = prc_next(prc_w)
375 if ( prc_has_s .and. prc_has_e )
then
377 if ( ranks(m) == prc_next(prc_se) )
exit
379 if ( m == n + 1 )
then
381 ranks(n) = prc_next(prc_se)
383 else if ( prc_has_s )
then
385 if ( ranks(m) == prc_next(prc_s) )
exit
387 if ( m == n + 1 )
then
389 ranks(n) = prc_next(prc_s)
391 else if ( prc_has_e )
then
393 if ( ranks(m) == prc_next(prc_e) )
exit
395 if ( m == n + 1 )
then
397 ranks(n) = prc_next(prc_e)
401 call mpi_group_incl( group, n, ranks, group_packns, ierr )
402 group_packns_created = .true.
404 group_packns_created = .false.
409 if ( prc_has_w )
then
411 ranks(n) = prc_next(prc_w)
413 if ( prc_has_e )
then
414 if ( n == 0 .or. ranks(1) .ne. prc_next(prc_e) )
then
416 ranks(n) = prc_next(prc_e)
421 call mpi_group_incl( group, n, ranks, group_packwe, ierr )
422 group_packwe_created = .true.
424 group_packwe_created = .false.
427 call mpi_group_free( group, ierr )
431 log_info(
"COMM_setup",*)
'Communication information'
432 log_info_cont(*)
'Maximum number of vars for one communication: ', comm_vsize_max
433 log_info_cont(*)
'All side is periodic? : ', comm_isallperiodic
444 KA, IA, JA, IHALO, JHALO, &
450 integer,
intent(in) :: ka, ia, ja, ihalo, jhalo
451 integer,
intent(out) :: gid
453 integer :: imax, jmax
454 integer :: nreq_ns, nreq_we, nreq_4c
459 type(mpi_info) :: win_info
462 integer(kind=MPI_ADDRESS_KIND) :: size
467 if ( .not. initialized )
then
468 log_error(
"COMM_regist",*)
'COMM_setup must be called before calling COMM_regist'
472 comm_gid = comm_gid + 1
473 if ( comm_gid > comm_gid_max )
then
474 log_error(
"COMM_regist",*)
'number of registed grid size exceeds the limit'
479 if ( ia < ihalo * 3 )
then
480 log_error(
"COMM_regist",*)
'IA must be >= IHALO * 3'
483 if ( ja < jhalo * 3 )
then
484 log_error(
"COMM_regist",*)
'JA must be >= JHALO * 3'
488 imax = ia - ihalo * 2
489 jmax = ja - jhalo * 2
493 ginfo(gid)%IS = ihalo + 1
494 ginfo(gid)%IE = ia - ihalo
495 ginfo(gid)%IHALO = ihalo
497 ginfo(gid)%JS = jhalo + 1
498 ginfo(gid)%JE = ja - jhalo
499 ginfo(gid)%JHALO = jhalo
505 if ( comm_use_mpi_pc )
then
506 ginfo(gid)%nreq_MAX = 2 * nreq_ns + 2 * nreq_we + 4 * nreq_4c + 1
508 ginfo(gid)%nreq_MAX = 2 * nreq_ns + 2 * nreq_we + 4 * nreq_4c
511 ginfo(gid)%size2D_NS4 = ia * jhalo
512 ginfo(gid)%size2D_NS8 = imax
513 ginfo(gid)%size2D_WE = jmax * ihalo
514 ginfo(gid)%size2D_4C = ihalo
516 allocate( ginfo(gid)%sendpack_P2WE(ginfo(gid)%size2D_WE * ka, 2, comm_vsize_max) )
520 allocate( ginfo(gid)%use_packbuf(comm_vsize_max) )
521 ginfo(gid)%use_packbuf(:) = .false.
525 allocate( ginfo(gid)%device_alloc(comm_vsize_max+comm_vsize_max_pc) )
526 allocate( ginfo(gid)%device_ptr(comm_vsize_max+1:comm_vsize_max_pc) )
527 ginfo(gid)%device_alloc(:) = .false.
530 if ( comm_use_mpi_onesided )
then
532 allocate( ginfo(gid)%recvbuf_WE(comm_vsize_max) )
533 allocate( ginfo(gid)%recvbuf_NS(comm_vsize_max) )
535 allocate( ginfo(gid)%win_packWE(comm_vsize_max) )
536 allocate( ginfo(gid)%win_packNS(comm_vsize_max) )
538 call mpi_info_create(win_info, ierr)
539 call mpi_info_set(win_info,
"no_locks",
"true", ierr)
540 call mpi_info_set(win_info,
"same_size",
"true", ierr)
541 call mpi_info_set(win_info,
"same_disp_unit",
"true", ierr)
543 do n = 1, comm_vsize_max
544 size = ginfo(gid)%size2D_WE * ka * 2 *
rp
547 real(
rp),
pointer :: pack(:)
548 call mpi_alloc_mem(
size, mpi_info_null, ginfo(gid)%recvbuf_WE(n), ierr)
549 call c_f_pointer(ginfo(gid)%recvbuf_WE(n), pack, (/ size/
rp /))
552 call mpi_win_create(pack,
size, ginfo(gid)%size2D_WE*ka*
rp, &
553 win_info, comm_world_t, &
554 ginfo(gid)%win_packWE(n), ierr)
558 call mpi_win_allocate(
size, ginfo(gid)%size2D_WE*ka*
rp, &
559 win_info, comm_world_t, &
560 ginfo(gid)%recvbuf_WE(n), ginfo(gid)%win_packWE(n), ierr)
562 size = ginfo(gid)%size2D_NS4 * ka * 2 *
rp
565 real(
rp),
pointer :: pack(:)
566 call mpi_alloc_mem(
size, mpi_info_null, ginfo(gid)%recvbuf_NS(n), ierr)
567 call c_f_pointer(ginfo(gid)%recvbuf_NS(n), pack, (/ size/
rp /))
570 call mpi_win_create(pack,
size,
rp, &
571 win_info, comm_world_t, &
572 ginfo(gid)%win_packNS(n), ierr)
576 call mpi_win_allocate(
size, rp, &
577 win_info, comm_world_t, &
578 ginfo(gid)%recvbuf_NS(n), ginfo(gid)%win_packNS(n), ierr)
582 call mpi_info_free(win_info, ierr)
584 do n = 1, comm_vsize_max
585 call mpi_win_post( group_packwe, mpi_mode_nostore, ginfo(gid)%win_packWE(n), ierr )
586 call mpi_win_post( group_packns, mpi_mode_nostore, ginfo(gid)%win_packNS(n), ierr )
589 ginfo(gid)%vars_num = 0
590 allocate( ginfo(gid)%packid(comm_vsize_max_pc) )
594 allocate( ginfo(gid)%recvpack_WE2P(ginfo(gid)%size2D_WE * ka, 2, comm_vsize_max) )
597 allocate( ginfo(gid)%req_cnt ( comm_vsize_max) )
598 allocate( ginfo(gid)%req_list(ginfo(gid)%nreq_MAX, comm_vsize_max) )
599 ginfo(gid)%req_cnt (:) = -1
600 ginfo(gid)%req_list(:,:) = mpi_request_null
602 if ( comm_use_mpi_pc )
then
603 ginfo(gid)%vars_num = 0
604 allocate( ginfo(gid)%packid(comm_vsize_max_pc) )
605 allocate( ginfo(gid)%preq_cnt ( comm_vsize_max_pc) )
606 allocate( ginfo(gid)%preq_list(ginfo(gid)%nreq_MAX+1,comm_vsize_max_pc) )
607 ginfo(gid)%preq_cnt (:) = -1
608 ginfo(gid)%preq_list(:,:) = mpi_request_null
615 log_info(
"COMM_regist",*)
'Register grid: id=', gid
616 log_info_cont(*)
'Data size of var (3D,including halo) [byte] : ', rp*ka*ia*ja
617 log_info_cont(*)
'Data size of halo [byte] : ', rp*ka*(2*ia*jhalo+2*jmax*ihalo)
618 log_info_cont(*)
'Ratio of halo against the whole 3D grid : ', real(2*ia*jhalo+2*jmax*ihalo) / real(ia*ja)
629 integer :: i, j, ierr
634 if ( comm_use_mpi_onesided )
then
636 do i = 1, comm_vsize_max
637 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(i), ierr )
638 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(i), ierr )
641 do i = 1, comm_vsize_max
642 call mpi_win_complete( ginfo(gid)%win_packWE(i), ierr )
643 call mpi_win_complete( ginfo(gid)%win_packNS(i), ierr )
646 do i = 1, comm_vsize_max
647 call mpi_win_wait( ginfo(gid)%win_packWE(i), ierr )
648 call mpi_win_wait( ginfo(gid)%win_packNS(i), ierr )
651 do i = 1, comm_vsize_max
652 call mpi_win_free(ginfo(gid)%win_packWE(i), ierr)
653 call mpi_win_free(ginfo(gid)%win_packNS(i), ierr)
656 real(rp),
pointer :: pack(:)
659 call c_f_pointer( ginfo(gid)%recvbuf_WE(i), pack, (/ginfo(gid)%size2D_WE*ka*2/) )
661 call c_f_pointer( ginfo(gid)%recvbuf_NS(i), pack, (/ginfo(gid)%size2D_NS4*ka*2/) )
664 call mpi_free_mem(ginfo(gid)%recvbuf_WE(i), ierr)
665 call mpi_free_mem(ginfo(gid)%recvbuf_NS(i), ierr)
669 deallocate( ginfo(gid)%packid )
670 ginfo(gid)%vars_num = 0
672 deallocate( ginfo(gid)%win_packWE )
673 deallocate( ginfo(gid)%win_packNS )
675 deallocate( ginfo(gid)%recvbuf_WE )
676 deallocate( ginfo(gid)%recvbuf_NS )
680 if ( comm_use_mpi_pc )
then
682 do j = 1, comm_vsize_max_pc
683 do i = 1, ginfo(gid)%nreq_MAX+1
684 if (ginfo(gid)%preq_list(i,j) .NE. mpi_request_null) &
685 call mpi_request_free(ginfo(gid)%preq_list(i,j), ierr)
688 if ( ginfo(gid)%device_alloc(j+comm_vsize_max) )
then
693 deallocate( ginfo(gid)%preq_cnt )
694 deallocate( ginfo(gid)%preq_list )
695 deallocate( ginfo(gid)%packid )
696 ginfo(gid)%vars_num = 0
698 deallocate( ginfo(gid)%device_ptr )
699 deallocate( ginfo(gid)%device_alloc )
704 deallocate( ginfo(gid)%req_cnt )
705 deallocate( ginfo(gid)%req_list )
708 deallocate( ginfo(gid)%recvpack_WE2P )
713 deallocate( ginfo(gid)%sendpack_P2WE )
715 deallocate( ginfo(gid)%use_packbuf )
720 if ( comm_use_mpi_onesided )
then
721 if ( group_packwe_created )
then
722 call mpi_group_free(group_packwe, ierr)
723 group_packwe_created = .false.
725 if ( group_packns_created )
then
726 call mpi_group_free(group_packns, ierr)
727 group_packns_created = .false.
734 initialized = .false.
750 character(len=*),
intent(in) :: varname
751 real(rp),
target,
intent(inout) :: var(:,:,:)
752 integer,
intent(inout) :: vid
754 integer,
intent(in),
optional :: gid
760 if ( .not. comm_use_mpi_pc )
return
762 if ( .not. acc_is_present(var) )
return
765 call prof_rapstart(
'COMM_init_pers', 2)
768 if (
present(gid) ) gid_ = gid
769 if ( gid_ > comm_gid_max )
then
770 log_error(
"COMM_vars_init",*)
'gid is invalid', gid_, comm_gid_max
774 if ( vid > comm_vsize_max )
then
775 log_error(
"COMM_vars_init",*)
'vid exceeds max', vid, comm_vsize_max, gid
779 ginfo(gid_)%vars_num = ginfo(gid_)%vars_num + 1
780 if ( ginfo(gid_)%vars_num > comm_vsize_max_pc )
then
781 log_error(
"COMM_vars_init",*)
'number of variable for MPI PC exceeds max', ginfo(gid_)%vars_num, comm_vsize_max_pc
785 vars_id = ginfo(gid_)%vars_num
786 ginfo(gid_)%packid(vars_id) = vid
789 if ( .not. acc_is_present(var) )
then
790 ginfo(gid_)%device_alloc(vars_id+comm_vsize_max) = .true.
791 ginfo(gid_)%device_ptr(vars_id*comm_vsize_max)%ptr => var
798 vid = vars_id + comm_vsize_max
800 log_info(
"COMM_vars_init",
'(1x,A,I3.3,A,I3.3,2A)')
'Initialize variable (grid ID = ', gid_,
'): ID = ', vid, &
801 ', name = ', trim(varname)
803 call prof_rapend (
'COMM_init_pers', 2)
819 character(len=*),
intent(in) :: varname
821 real(rp),
target,
intent(inout) :: var(:,:,:)
822 integer,
intent(inout) :: vid
824 integer,
intent(in),
optional :: gid
830 if ( .not. comm_use_mpi_pc )
return
832 if ( .not. acc_is_present(var) )
return
835 call prof_rapstart(
'COMM_init_pers', 2)
838 if (
present(gid) ) gid_ = gid
839 if ( gid_ > comm_gid_max )
then
840 log_error(
"COMM_vars8_init",*)
'gid is invalid', gid_, comm_gid_max
844 if ( vid > comm_vsize_max )
then
845 log_error(
"COMM_vars8_init",*)
'vid exceeds max', vid, comm_vsize_max
849 ginfo(gid_)%vars_num = ginfo(gid_)%vars_num + 1
850 if ( ginfo(gid_)%vars_num > comm_vsize_max_pc )
then
851 log_error(
"COMM_vars8_init",*)
'number of variable for MPI PC exceeds max', ginfo(gid_)%vars_num, comm_vsize_max_pc
855 vars_id = ginfo(gid_)%vars_num
856 ginfo(gid_)%packid(vars_id) = vid
859 if ( .not. acc_is_present(var) )
then
860 ginfo(gid_)%device_alloc(vars_id+comm_vsize_max) = .true.
861 ginfo(gid_)%device_ptr(vars_id+comm_vsize_max)%ptr => var
868 vid = vars_id + comm_vsize_max
870 log_info(
"COMM_vars8_init",
'(1x,A,I3.3,A,I3.3,2A)')
'Initialize variable (grid ID = ', gid_,
'): ID = ', vid, &
871 ', name = ', trim(varname)
873 call prof_rapend (
'COMM_init_pers', 2)
884 real(RP),
intent(inout) :: var(:,:,:)
886 integer,
intent(in) :: vid
888 integer,
intent(in),
optional :: gid
894 if (
present(gid) ) gid_ = gid
895 if ( gid_ > comm_gid_max )
then
896 log_error(
"COMM_vars_3D",*)
'gid is invalid', gid_, comm_gid_max
900 if ( vid > comm_vsize_max )
then
901 call prof_rapstart(
'COMM_vars_pers', 2)
903 call prof_rapend (
'COMM_vars_pers', 2)
905 call prof_rapstart(
'COMM_vars', 2)
906 if ( comm_use_mpi_onesided )
then
911 call prof_rapend (
'COMM_vars', 2)
923 real(RP),
intent(inout) :: var(:,:,:)
925 integer,
intent(in) :: vid
927 integer,
intent(in),
optional :: gid
933 if (
present(gid) ) gid_ = gid
934 if ( gid_ > comm_gid_max )
then
935 log_error(
"COMM_vars8_3D",*)
'gid is invalid', gid_, comm_gid_max
939 if ( vid > comm_vsize_max )
then
940 call prof_rapstart(
'COMM_vars_pers', 2)
942 call prof_rapend (
'COMM_vars_pers', 2)
944 call prof_rapstart(
'COMM_vars', 2)
945 if ( comm_use_mpi_onesided )
then
950 call prof_rapend (
'COMM_vars', 2)
962 real(RP),
intent(inout) :: var(:,:,:)
964 integer,
intent(in) :: vid
966 logical,
intent(in),
optional :: FILL_BND
967 integer,
intent(in),
optional :: gid
974 if (
present(fill_bnd) ) fill_bnd_ = fill_bnd
977 if (
present(gid) ) gid_ = gid
978 if ( gid_ > comm_gid_max )
then
979 log_error(
"COMM_wait_3D",*)
'gid is invalid', gid_, comm_gid_max
983 if ( vid > comm_vsize_max )
then
984 call prof_rapstart(
'COMM_wait_pers', 2)
986 call prof_rapend (
'COMM_wait_pers', 2)
988 call prof_rapstart(
'COMM_wait', 2)
989 if ( comm_use_mpi_onesided )
then
994 call prof_rapend (
'COMM_wait', 2)
998 if ( .NOT. comm_isallperiodic )
then
999 if ( fill_bnd_ )
then
1000 call copy_boundary_3d(var, gid_)
1013 real(RP),
intent(inout) :: var(:,:)
1015 integer,
intent(in) :: vid
1017 integer,
intent(in),
optional :: gid
1023 if (
present(gid) ) gid_ = gid
1024 if ( gid_ > comm_gid_max )
then
1025 log_error(
"COMM_vars_2D",*)
'gid is invalid', gid_, comm_gid_max
1029 call prof_rapstart(
'COMM_vars', 2)
1030 if ( comm_use_mpi_onesided )
then
1035 call prof_rapend (
'COMM_vars', 2)
1046 real(RP),
intent(inout) :: var(:,:)
1048 integer,
intent(in) :: vid
1050 integer,
intent(in),
optional :: gid
1056 if (
present(gid) ) gid_ = gid
1057 if ( gid_ > comm_gid_max )
then
1058 log_error(
"COMM_vars8_2D",*)
'gid is invalid', gid_, comm_gid_max
1062 call prof_rapstart(
'COMM_vars', 2)
1063 if ( comm_use_mpi_onesided )
then
1068 call prof_rapend (
'COMM_vars', 2)
1079 real(RP),
intent(inout) :: var(:,:)
1081 integer,
intent(in) :: vid
1083 logical,
intent(in),
optional :: FILL_BND
1084 integer,
intent(in),
optional :: gid
1086 logical :: FILL_BND_
1091 if (
present(fill_bnd) ) fill_bnd_ = fill_bnd
1094 if (
present(gid) ) gid_ = gid
1095 if ( gid_ > comm_gid_max )
then
1096 log_error(
"COMM_wait_2D",*)
'gid is invalid', gid_, comm_gid_max
1100 call prof_rapstart(
'COMM_wait', 2)
1101 if ( comm_use_mpi_onesided )
then
1106 call prof_rapend (
'COMM_wait', 2)
1108 if( .NOT. comm_isallperiodic )
then
1109 if ( fill_bnd_ )
then
1120 IA, IS, IE, JA, JS, JE, &
1127 integer,
intent(in) :: IA, IS, IE
1128 integer,
intent(in) :: JA, JS, JE
1129 real(RP),
intent(in) :: var(IA,JA)
1131 real(RP),
intent(out) :: varmean
1134 real(DP) :: stat1, stat2
1135 real(DP) :: allstat(2)
1151 stat1 = stat1 + var(i,j)
1152 stat2 = stat2 + 1.0_dp
1158 stat(:) = (/stat1, stat2/)
1162 call prof_rapstart(
'COMM_Allreduce', 2)
1163 call mpi_allreduce( stat, &
1166 mpi_double_precision, &
1170 call prof_rapend (
'COMM_Allreduce', 2)
1172 zerosw = 0.5_dp - sign(0.5_dp, allstat(1) - 1.e-12_dp )
1173 varmean = allstat(1) / ( allstat(2) + zerosw ) * ( 1.0_dp - zerosw )
1182 KA, IA, IS, IE, JA, JS, JE, &
1189 integer,
intent(in) :: KA
1190 integer,
intent(in) :: IA, IS, IE
1191 integer,
intent(in) :: JA, JS, JE
1192 real(RP),
intent(in) :: var(KA,IA,JA)
1194 real(RP),
intent(out) :: varmean(KA)
1196 real(DP) :: stat (KA,2)
1197 real(DP) :: allstat(KA,2)
1203 logical :: flag_device
1208 flag_device = acc_is_present(var)
1224 stat(k,1) = stat(k,1) + var(k,i,j)
1227 stat(k,2) = stat(k,2) + 1.0_dp
1238 call prof_rapstart(
'COMM_Allreduce', 2)
1240 call mpi_allreduce( stat, &
1243 mpi_double_precision, &
1248 call prof_rapend (
'COMM_Allreduce', 2)
1252 zerosw = 0.5_dp - sign(0.5_dp, allstat(k,2) - 1.e-12_dp )
1253 varmean(k) = allstat(k,1) / ( allstat(k,2) + zerosw ) * ( 1.0_dp - zerosw )
1273 integer,
intent(in) :: IA, JA
1274 real(RP),
intent(in) :: send(IA,JA)
1276 real(RP),
intent(out) :: recv(:,:,:)
1278 integer :: sendcounts, recvcounts
1282 sendcounts = ia * ja
1283 recvcounts = ia * ja
1286 call mpi_gather( send(:,:), &
1310 integer,
intent(in) :: KA, IA, JA
1311 real(RP),
intent(in) :: send(KA,IA,JA)
1313 real(RP),
intent(out) :: recv(:,:,:,:)
1315 integer :: sendcounts, recvcounts
1319 sendcounts = ka * ia * ja
1320 recvcounts = ka * ia * ja
1323 call mpi_gather( send(:,:,:), &
1344 real(SP),
intent(inout) :: var
1350 call prof_rapstart(
'COMM_Bcast', 2)
1354 call mpi_bcast( var, &
1361 call prof_rapend(
'COMM_Bcast', 2)
1370 real(DP),
intent(inout) :: var
1376 call prof_rapstart(
'COMM_Bcast', 2)
1380 call mpi_bcast( var, &
1382 mpi_double_precision, &
1387 call prof_rapend(
'COMM_Bcast', 2)
1399 integer,
intent(in) :: IA
1401 real(SP),
intent(inout) :: var(IA)
1407 call prof_rapstart(
'COMM_Bcast', 2)
1412 call mpi_bcast( var(:), &
1420 call prof_rapend(
'COMM_Bcast', 2)
1429 integer,
intent(in) :: IA
1431 real(DP),
intent(inout) :: var(IA)
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) :: IA, JA
1464 real(SP),
intent(inout) :: var(IA,JA)
1470 call prof_rapstart(
'COMM_Bcast', 2)
1475 call mpi_bcast( var(:,:), &
1483 call prof_rapend(
'COMM_Bcast', 2)
1492 integer,
intent(in) :: IA, JA
1494 real(DP),
intent(inout) :: var(IA,JA)
1500 call prof_rapstart(
'COMM_Bcast', 2)
1505 call mpi_bcast( var(:,:), &
1507 mpi_double_precision, &
1513 call prof_rapend(
'COMM_Bcast', 2)
1525 integer,
intent(in) :: KA, IA, JA
1527 real(SP),
intent(inout) :: var(KA,IA,JA)
1533 call prof_rapstart(
'COMM_Bcast', 2)
1535 counts = ka * ia * ja
1538 call mpi_bcast( var(:,:,:), &
1546 call prof_rapend(
'COMM_Bcast', 2)
1555 integer,
intent(in) :: KA, IA, JA
1557 real(DP),
intent(inout) :: var(KA,IA,JA)
1563 call prof_rapstart(
'COMM_Bcast', 2)
1565 counts = ka * ia * ja
1568 call mpi_bcast( var(:,:,:), &
1570 mpi_double_precision, &
1576 call prof_rapend(
'COMM_Bcast', 2)
1589 integer,
intent(in) :: KA, IA, JA, NT
1591 real(SP),
intent(inout) :: var(KA,IA,JA,NT)
1597 call prof_rapstart(
'COMM_Bcast', 2)
1599 counts = ka * ia * ja * nt
1600 if ( ka>0 .AND. ia>0 .AND. ja>0 .AND. nt>0 .AND. &
1602 log_error(
"COMM_bcast_4D",*)
'counts overflow'
1607 call mpi_bcast( var(:,:,:,:), &
1615 call prof_rapend(
'COMM_Bcast', 2)
1625 integer,
intent(in) :: KA, IA, JA, NT
1627 real(DP),
intent(inout) :: var(KA,IA,JA,NT)
1633 call prof_rapstart(
'COMM_Bcast', 2)
1635 counts = ka * ia * ja * nt
1636 if ( ka>0 .AND. ia>0 .AND. ja>0 .AND. nt>0 .AND. &
1638 log_error(
"COMM_bcast_4D",*)
'counts overflow'
1643 call mpi_bcast( var(:,:,:,:), &
1645 mpi_double_precision, &
1651 call prof_rapend(
'COMM_Bcast', 2)
1663 integer,
intent(inout) :: var
1669 call prof_rapstart(
'COMM_Bcast', 2)
1673 call mpi_bcast( var, &
1680 call prof_rapend(
'COMM_Bcast', 2)
1692 integer,
intent(in) :: IA
1693 integer,
intent(inout) :: var(IA)
1699 call prof_rapstart(
'COMM_Bcast', 2)
1703 call mpi_bcast( var(:), &
1710 call prof_rapend(
'COMM_Bcast', 2)
1722 integer,
intent(in) :: IA, JA
1724 integer,
intent(inout) :: var(IA,JA)
1730 call prof_rapstart(
'COMM_Bcast', 2)
1735 call mpi_bcast( var(:,:), &
1743 call prof_rapend(
'COMM_Bcast', 2)
1755 logical,
intent(inout) :: var
1761 call prof_rapstart(
'COMM_Bcast', 2)
1765 call mpi_bcast( var, &
1772 call prof_rapend(
'COMM_Bcast', 2)
1784 integer,
intent(in) :: IA
1785 logical,
intent(inout) :: var(IA)
1791 call prof_rapstart(
'COMM_Bcast', 2)
1796 call mpi_bcast( var(:), &
1804 call prof_rapend(
'COMM_Bcast', 2)
1816 character(len=*),
intent(inout) :: var
1822 call prof_rapstart(
'COMM_Bcast', 2)
1826 call mpi_bcast( var, &
1833 call prof_rapend(
'COMM_Bcast', 2)
1846 real(RP),
intent(inout) :: var(:,:,:)
1847 integer,
intent(in) :: gid
1848 integer,
intent(in) :: vid
1849 integer,
intent(in) :: seqid
1851 integer :: ireq, tag, ierr
1855 integer :: JA, JS, JE, JHALO
1861 real(RP),
pointer :: ptr(:,:)
1864 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
1871 jhalo = ginfo(gid)%JHALO
1877 call mpi_send_init( var(:,:,:),
size(var), comm_datatype_t, &
1878 mpi_proc_null, tag+ginfo(gid)%nreq_max+1, comm_world_t, &
1879 ginfo(gid)%preq_list(ginfo(gid)%nreq_max+1,vid), ierr )
1883 if ( prc_has_s )
then
1884 call mpi_recv_init( var(:,:,1:js-1), ginfo(gid)%size2D_NS4*ka, comm_datatype_t, &
1885 prc_next(prc_s), tag+1, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1889 if ( prc_has_n )
then
1890 call mpi_recv_init( var(:,:,je+1:ja), ginfo(gid)%size2D_NS4*ka, comm_datatype_t, &
1891 prc_next(prc_n), tag+2, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1896 ptr => ginfo(gid)%recvpack_WE2P(:,:,seqid)
1901 if ( prc_has_e )
then
1903 call mpi_recv_init( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
1905 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,2,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
1907 prc_next(prc_e), tag+3, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1911 if ( prc_has_w )
then
1913 call mpi_recv_init( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
1915 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,1,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
1917 prc_next(prc_w), tag+4, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1926 ptr => ginfo(gid)%sendpack_P2WE(:,:,seqid)
1930 if ( prc_has_w )
then
1932 call mpi_send_init( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
1934 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,1,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
1936 prc_next(prc_w), tag+3, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1940 if ( prc_has_e )
then
1942 call mpi_send_init( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
1944 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,2,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
1946 prc_next(prc_e), tag+4, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1952 if ( prc_has_n )
then
1953 call mpi_send_init( var(:,:,je-jhalo+1:je), ginfo(gid)%size2D_NS4*ka, comm_datatype_t, &
1954 prc_next(prc_n), tag+1, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1958 if ( prc_has_s )
then
1959 call mpi_send_init( var(:,:,js:js+jhalo-1), ginfo(gid)%size2D_NS4*ka, comm_datatype_t, &
1960 prc_next(prc_s), tag+2, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1964 ginfo(gid)%preq_cnt(vid) = ireq - 1
1967 nreq = ginfo(gid)%preq_cnt(vid)
1969 call mpi_testall( nreq, ginfo(gid)%preq_list(1:nreq,vid), &
1970 flag, mpi_statuses_ignore, ierr )
1983 real(RP),
intent(inout) :: var(:,:,:)
1984 integer,
intent(in) :: gid
1985 integer,
intent(in) :: vid
1986 integer,
intent(in) :: seqid
1988 integer :: ireq, tag, tagc
1993 integer :: IS, IE, IHALO
1994 integer :: JA, JS, JE, JHALO
2000 real(RP),
pointer :: ptr(:,:)
2006 ihalo = ginfo(gid)%IHALO
2010 jhalo = ginfo(gid)%JHALO
2012 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
2019 call mpi_send_init( var(:,:,:),
size(var), comm_datatype_t, &
2020 mpi_proc_null, tag+ginfo(gid)%nreq_max+1, comm_world_t, &
2021 ginfo(gid)%preq_list(ginfo(gid)%nreq_max+1,vid), ierr )
2024 if ( comm_isallperiodic )
then
2031 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2032 prc_next(prc_se), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2039 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2040 prc_next(prc_sw), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2047 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2048 prc_next(prc_ne), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2054 do j = je+1, je+jhalo
2055 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2056 prc_next(prc_nw), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2063 ptr => ginfo(gid)%recvpack_WE2P(:,:,seqid)
2065 call mpi_recv_init( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2067 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,2,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2069 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2074 call mpi_recv_init( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2076 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,1,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2078 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2085 call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
2086 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2093 call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
2094 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2102 do j = je-jhalo+1, je
2103 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
2104 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2110 do j = js, js+jhalo-1
2111 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
2112 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2120 ptr => ginfo(gid)%sendpack_P2WE(:,:,seqid)
2122 call mpi_send_init( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2124 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,1,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2126 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2131 call mpi_send_init( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2133 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,2,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2135 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2140 do j = je-jhalo+1, je
2141 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2142 prc_next(prc_nw), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2148 do j = je-jhalo+1, je
2149 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2150 prc_next(prc_ne), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2156 do j = js, js+jhalo-1
2157 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2158 prc_next(prc_sw), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2164 do j = js, js+jhalo-1
2165 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2166 prc_next(prc_se), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2177 if ( prc_has_s .AND. prc_has_e )
then
2180 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2181 prc_next(prc_se), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2185 else if ( prc_has_s )
then
2188 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2189 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2193 else if ( prc_has_e )
then
2196 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2197 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2203 if ( prc_has_s .AND. prc_has_w )
then
2206 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2207 prc_next(prc_sw), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2211 else if ( prc_has_s )
then
2214 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2215 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2219 else if ( prc_has_w )
then
2222 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2223 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2229 if ( prc_has_n .AND. prc_has_e )
then
2232 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2233 prc_next(prc_ne), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2237 else if ( prc_has_n )
then
2240 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2241 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2245 else if ( prc_has_e )
then
2248 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2249 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2255 if ( prc_has_n .AND. prc_has_w )
then
2258 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2259 prc_next(prc_nw), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2263 else if ( prc_has_n )
then
2266 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2267 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2271 else if ( prc_has_w )
then
2274 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2275 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2281 ptr => ginfo(gid)%recvpack_WE2P(:,:,seqid)
2285 if ( prc_has_e )
then
2288 call mpi_recv_init( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2290 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,2,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2292 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2296 if ( prc_has_w )
then
2299 call mpi_recv_init( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2301 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,1,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2303 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2309 if ( prc_has_s )
then
2312 call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
2313 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2319 if ( prc_has_n )
then
2322 call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
2323 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2331 if ( prc_has_n )
then
2333 do j = je-jhalo+1, je
2334 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
2335 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2341 if ( prc_has_s )
then
2343 do j = js, js+jhalo-1
2344 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
2345 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2352 ptr => ginfo(gid)%sendpack_P2WE(:,:,seqid)
2356 if ( prc_has_w )
then
2359 call mpi_send_init( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2361 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,1,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2363 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2367 if ( prc_has_e )
then
2370 call mpi_send_init( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2372 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,2,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2374 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2379 if ( prc_has_n .AND. prc_has_w )
then
2381 do j = je-jhalo+1, je
2382 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2383 prc_next(prc_nw), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2387 else if ( prc_has_n )
then
2389 do j = je-jhalo+1, je
2390 call mpi_send_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2391 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2395 else if ( prc_has_w )
then
2398 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2399 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2405 if ( prc_has_n .AND. prc_has_e )
then
2407 do j = je-jhalo+1, je
2408 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2409 prc_next(prc_ne), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2413 else if ( prc_has_n )
then
2415 do j = je-jhalo+1, je
2416 call mpi_send_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2417 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2421 else if ( prc_has_e )
then
2424 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2425 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2431 if ( prc_has_s .AND. prc_has_w )
then
2433 do j = js, js+jhalo-1
2434 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2435 prc_next(prc_sw), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2439 else if ( prc_has_s )
then
2441 do j = js, js+jhalo-1
2442 call mpi_send_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2443 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2447 else if ( prc_has_w )
then
2450 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2451 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2457 if ( prc_has_s .AND. prc_has_e )
then
2459 do j = js, js+jhalo-1
2460 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2461 prc_next(prc_se), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2465 else if ( prc_has_s )
then
2467 do j = js, js+jhalo-1
2468 call mpi_send_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2469 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2473 else if ( prc_has_e )
then
2476 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2477 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2486 ginfo(gid)%preq_cnt(vid) = ireq - 1
2489 nreq = ginfo(gid)%preq_cnt(vid)
2491 call mpi_testall( nreq, ginfo(gid)%preq_list(1:nreq,vid), &
2492 flag, mpi_statuses_ignore, ierr )
2507 real(RP),
intent(inout) :: var(:,:,:)
2508 integer,
intent(in) :: gid
2509 integer,
intent(in) :: vid
2512 integer :: ireq, tag
2515 integer :: IA, IS, IE
2516 integer :: JA, JS, JE
2517 integer :: IHALO, JHALO
2521 real(RP),
pointer :: ptr(:,:)
2522 logical :: flag_device
2526 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
2536 ihalo = ginfo(gid)%IHALO
2537 jhalo = ginfo(gid)%JHALO
2540 if ( ginfo(gid)%use_packbuf(vid) )
then
2541 log_error(
"vars_3D_mpi",*)
'packing buffer is already used', vid
2544 ginfo(gid)%use_packbuf(vid) = .true.
2548 flag_device = acc_is_present(var)
2555 if ( prc_has_s )
then
2556 call mpi_irecv( var(:,:,1:js-1), ginfo(gid)%size2D_NS4*ka, comm_datatype_t, &
2557 prc_next(prc_s), tag+1, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2561 if ( prc_has_n )
then
2562 call mpi_irecv( var(:,:,je+1:ja), ginfo(gid)%size2D_NS4*ka, comm_datatype_t, &
2563 prc_next(prc_n), tag+2, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2568 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
2572 if ( prc_has_e )
then
2574 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2576 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2578 prc_next(prc_e), tag+3, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2582 if ( prc_has_w )
then
2584 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2586 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2588 prc_next(prc_w), tag+4, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2598 call packwe_3d( ka, ia, is, ie, ja, js, je, &
2606 if ( prc_has_n )
then
2607 call mpi_isend( var(:,:,je-jhalo+1:je), ginfo(gid)%size2D_NS4*ka, comm_datatype_t, &
2608 prc_next(prc_n), tag+1, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2612 if ( prc_has_s )
then
2613 call mpi_isend( var(:,:,js:js+jhalo-1), ginfo(gid)%size2D_NS4*ka, comm_datatype_t, &
2614 prc_next(prc_s), tag+2, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2622 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
2627 if ( prc_has_w )
then
2629 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2631 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2633 prc_next(prc_w), tag+3, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2637 if ( prc_has_e )
then
2639 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2641 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2643 prc_next(prc_e), tag+4, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2650 ginfo(gid)%req_cnt(vid) = ireq - 1
2660 real(RP),
intent(inout) :: var(:,:,:)
2661 integer,
intent(in) :: gid
2662 integer,
intent(in) :: vid
2665 integer :: IA, IS, IE
2666 integer :: JA, JS, JE
2667 integer :: IHALO, JHALO
2669 integer(kind=MPI_ADDRESS_KIND) :: disp
2673 real(RP),
pointer :: ptr(:,:)
2684 ihalo = ginfo(gid)%IHALO
2685 jhalo = ginfo(gid)%JHALO
2689 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
2690 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
2694 call packwe_3d( ka, ia, is, ie, ja, js, je, &
2702 if ( prc_has_n )
then
2704 call mpi_put( var(:,:,je-jhalo+1:je), ginfo(gid)%size2D_NS4*ka, comm_datatype_t, &
2705 prc_next(prc_n), disp, ginfo(gid)%size2D_NS4*ka, comm_datatype_t, &
2706 ginfo(gid)%win_packNS(vid), ierr )
2709 if ( prc_has_s )
then
2710 disp = ka * ia * jhalo
2711 call mpi_put( var(:,:,js:js+jhalo-1), ginfo(gid)%size2D_NS4*ka, comm_datatype_t, &
2712 prc_next(prc_s), disp, ginfo(gid)%size2D_NS4*ka, comm_datatype_t, &
2713 ginfo(gid)%win_packNS(vid), ierr )
2720 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
2726 if ( prc_has_w )
then
2729 call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2731 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2733 prc_next(prc_w), disp, ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2734 ginfo(gid)%win_packWE(vid), ierr )
2737 if ( prc_has_e )
then
2740 call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2742 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2744 prc_next(prc_e), disp, ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2745 ginfo(gid)%win_packWE(vid), ierr )
2751 call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
2752 call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
2766 real(RP),
intent(inout) :: var(:,:,:)
2767 integer,
intent(in) :: gid
2768 integer,
intent(in) :: vid
2770 integer :: ireq, tag, tagc
2773 integer :: IA, IS, IE
2774 integer :: JA, JS, JE
2775 integer :: IHALO, JHALO
2780 real(RP),
pointer :: ptr(:,:)
2781 logical :: flag_device
2785 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
2796 ihalo = ginfo(gid)%IHALO
2797 jhalo = ginfo(gid)%JHALO
2800 if ( ginfo(gid)%use_packbuf(vid) )
then
2801 log_error(
"vars8_3D_mpi",*)
'packing buffer is already used', vid
2804 ginfo(gid)%use_packbuf(vid) = .true.
2808 flag_device = acc_is_present(var)
2811 if ( comm_isallperiodic )
then
2820 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2821 prc_next(prc_se), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2828 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2829 prc_next(prc_sw), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2836 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2837 prc_next(prc_ne), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2844 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2845 prc_next(prc_nw), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2850 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
2856 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2858 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2860 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2865 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2867 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2869 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2876 call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
2877 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2884 call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
2885 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2893 do j = je-jhalo+1, je
2894 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
2895 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2901 do j = js, js+jhalo-1
2902 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
2903 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2912 call packwe_3d( ka, ia, is, ie, ja, js, je, &
2920 do j = je-jhalo+1, je
2921 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2922 prc_next(prc_nw), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2928 do j = je-jhalo+1, je
2929 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2930 prc_next(prc_ne), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2936 do j = js, js+jhalo-1
2937 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2938 prc_next(prc_sw), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2944 do j = js, js+jhalo-1
2945 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2946 prc_next(prc_se), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2954 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
2961 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2963 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2965 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2970 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2972 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
2974 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2987 if ( prc_has_s .AND. prc_has_e )
then
2990 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2991 prc_next(prc_se), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2995 else if ( prc_has_s )
then
2998 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
2999 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3003 else if ( prc_has_e )
then
3006 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3007 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3013 if ( prc_has_s .AND. prc_has_w )
then
3016 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3017 prc_next(prc_sw), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3021 else if ( prc_has_s )
then
3024 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3025 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3029 else if ( prc_has_w )
then
3032 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3033 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3039 if ( prc_has_n .AND. prc_has_e )
then
3042 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3043 prc_next(prc_ne), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3047 else if ( prc_has_n )
then
3050 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3051 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3055 else if ( prc_has_e )
then
3058 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3059 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3065 if ( prc_has_n .AND. prc_has_w )
then
3068 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3069 prc_next(prc_nw), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3073 else if ( prc_has_n )
then
3076 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3077 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3081 else if ( prc_has_w )
then
3084 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3085 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3091 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
3095 if ( prc_has_e )
then
3098 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3100 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3102 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3106 if ( prc_has_w )
then
3109 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3111 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3113 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3119 if ( prc_has_s )
then
3122 call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
3123 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3129 if ( prc_has_n )
then
3132 call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
3133 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3141 if ( prc_has_n )
then
3143 do j = je-jhalo+1, je
3144 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
3145 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3151 if ( prc_has_s )
then
3153 do j = js, js+jhalo-1
3154 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
3155 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3165 call packwe_3d( ka, ia, is, ie, ja, js, je, &
3172 if ( prc_has_n .AND. prc_has_w )
then
3174 do j = je-jhalo+1, je
3175 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3176 prc_next(prc_nw), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3180 else if ( prc_has_n )
then
3182 do j = je-jhalo+1, je
3183 call mpi_isend( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3184 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3188 else if ( prc_has_w )
then
3191 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3192 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3198 if ( prc_has_n .AND. prc_has_e )
then
3200 do j = je-jhalo+1, je
3201 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3202 prc_next(prc_ne), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3206 else if ( prc_has_n )
then
3208 do j = je-jhalo+1, je
3209 call mpi_isend( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3210 prc_next(prc_n), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3214 else if ( prc_has_e )
then
3217 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3218 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3224 if ( prc_has_s .AND. prc_has_w )
then
3226 do j = js, js+jhalo-1
3227 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3228 prc_next(prc_sw), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3232 else if ( prc_has_s )
then
3234 do j = js, js+jhalo-1
3235 call mpi_isend( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3236 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3240 else if ( prc_has_w )
then
3243 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3244 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3250 if ( prc_has_s .AND. prc_has_e )
then
3252 do j = js, js+jhalo-1
3253 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3254 prc_next(prc_se), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3258 else if ( prc_has_s )
then
3260 do j = js, js+jhalo-1
3261 call mpi_isend( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3262 prc_next(prc_s), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3266 else if ( prc_has_e )
then
3269 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3270 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3279 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3285 if ( prc_has_w )
then
3288 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3290 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3292 prc_next(prc_w), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3296 if ( prc_has_e )
then
3299 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3301 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3303 prc_next(prc_e), tag+tagc, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3312 ginfo(gid)%req_cnt(vid) = ireq - 1
3322 real(RP),
intent(inout) :: var(:,:,:)
3323 integer,
intent(in) :: gid
3324 integer,
intent(in) :: vid
3327 integer :: IA, IS, IE
3328 integer :: JA, JS, JE
3329 integer :: IHALO, JHALO
3331 integer(kind=MPI_ADDRESS_KIND) :: disp
3336 real(RP),
pointer :: ptr(:,:)
3347 ihalo = ginfo(gid)%IHALO
3348 jhalo = ginfo(gid)%JHALO
3351 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
3352 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
3354 if ( comm_isallperiodic )
then
3360 do j = je-jhalo+1, je
3361 disp = ka * ( ihalo + ia * ( j - je+jhalo-1 ) )
3362 call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
3363 prc_next(prc_n), disp, ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
3364 ginfo(gid)%win_packNS(vid), ierr )
3367 do j = js, js+jhalo-1
3368 disp = ka * ( ihalo + ia * ( j - js + jhalo ) )
3369 call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
3370 prc_next(prc_s), disp, ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
3371 ginfo(gid)%win_packNS(vid), ierr )
3378 call packwe_3d( ka, ia, is, ie, ja, js, je, &
3384 do j = je-jhalo+1, je
3385 disp = ka * ( ie + ia * ( j - je+jhalo-1 ) )
3386 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3387 prc_next(prc_nw), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3388 ginfo(gid)%win_packNS(vid), ierr )
3391 do j = je-jhalo+1, je
3392 disp = ka * ( ia * ( j - je+jhalo-1 ) )
3393 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3394 prc_next(prc_ne), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3395 ginfo(gid)%win_packNS(vid), ierr )
3398 do j = js, js+jhalo-1
3399 disp = ka * ( ie + ia * ( j - js + jhalo ) )
3400 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3401 prc_next(prc_sw), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3402 ginfo(gid)%win_packNS(vid), ierr )
3405 do j = js, js+jhalo-1
3406 disp = ka * ( ia * ( j - js + jhalo ) )
3407 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3408 prc_next(prc_se), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3409 ginfo(gid)%win_packNS(vid), ierr )
3415 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3422 call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3424 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3426 prc_next(prc_w), disp, ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3427 ginfo(gid)%win_packWE(vid), ierr )
3431 call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3433 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3435 prc_next(prc_e), disp, ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3436 ginfo(gid)%win_packWE(vid), ierr )
3447 if ( prc_has_n )
then
3448 do j = je-jhalo+1, je
3449 disp = ka * ( ihalo + ia * ( j - je+jhalo-1 ) )
3450 call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
3451 prc_next(prc_n), disp, ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
3452 ginfo(gid)%win_packNS(vid), ierr )
3456 if ( prc_has_s )
then
3457 do j = js, js+jhalo-1
3458 disp = ka * ( ihalo + ia * ( j - js + jhalo ) )
3459 call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
3460 prc_next(prc_s), disp, ginfo(gid)%size2D_NS8*ka, comm_datatype_t, &
3461 ginfo(gid)%win_packNS(vid), ierr )
3469 call packwe_3d( ka, ia, is, ie, ja, js, je, &
3476 if ( prc_has_n .AND. prc_has_w )
then
3477 do j = je-jhalo+1, je
3478 disp = ka * ( ie + ia * ( j - je+jhalo-1 ) )
3479 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3480 prc_next(prc_nw), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3481 ginfo(gid)%win_packNS(vid), ierr )
3483 else if ( prc_has_n )
then
3484 do j = je-jhalo+1, je
3485 disp = ka * ( ia * ( j - je+jhalo-1 ) )
3486 call mpi_put( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3487 prc_next(prc_n), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3488 ginfo(gid)%win_packNS(vid), ierr )
3490 else if ( prc_has_w )
then
3492 disp = ka * ( ie + ia * ( j - je-1 + jhalo ) )
3493 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3494 prc_next(prc_w), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3495 ginfo(gid)%win_packNS(vid), ierr )
3499 if ( prc_has_n .AND. prc_has_e )
then
3500 do j = je-jhalo+1, je
3501 disp = ka * ( ia * ( j - je+jhalo-1 ) )
3502 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3503 prc_next(prc_ne), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3504 ginfo(gid)%win_packNS(vid), ierr )
3506 else if ( prc_has_n )
then
3507 do j = je-jhalo+1, je
3508 disp = ka * ( ie + ia * ( j - je+jhalo-1 ) )
3509 call mpi_put( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3510 prc_next(prc_n), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3511 ginfo(gid)%win_packNS(vid), ierr )
3513 else if ( prc_has_e )
then
3515 disp = ka * ia * ( j - je-1 + jhalo )
3516 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3517 prc_next(prc_e), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3518 ginfo(gid)%win_packNS(vid), ierr )
3522 if ( prc_has_s .AND. prc_has_w )
then
3523 do j = js, js+jhalo-1
3524 disp = ka * ( ie + ia * ( j - js + jhalo ) )
3525 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3526 prc_next(prc_sw), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3527 ginfo(gid)%win_packNS(vid), ierr )
3529 else if ( prc_has_s )
then
3530 do j = js, js+jhalo-1
3531 disp = ka * ( ia * ( j - js + jhalo ) )
3532 call mpi_put( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3533 prc_next(prc_s), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3534 ginfo(gid)%win_packNS(vid), ierr )
3536 else if ( prc_has_w )
then
3538 disp = ka * ( ie + ia * (j-1) )
3539 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3540 prc_next(prc_w), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3541 ginfo(gid)%win_packNS(vid), ierr )
3545 if ( prc_has_s .AND. prc_has_e )
then
3546 do j = js, js+jhalo-1
3547 disp = ka * ( ia * ( j - js + jhalo ) )
3548 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3549 prc_next(prc_se), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3550 ginfo(gid)%win_packNS(vid), ierr )
3552 else if ( prc_has_s )
then
3553 do j = js, js+jhalo-1
3554 disp = ka * ( ie + ia * ( j - js + jhalo ) )
3555 call mpi_put( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3556 prc_next(prc_s), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3557 ginfo(gid)%win_packNS(vid), ierr )
3559 else if ( prc_has_e )
then
3561 disp = ka * ( ia * ( j - 1 ) )
3562 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3563 prc_next(prc_e), disp, ginfo(gid)%size2D_4C*ka, comm_datatype_t, &
3564 ginfo(gid)%win_packNS(vid), ierr )
3571 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3577 if ( prc_has_w )
then
3580 call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3582 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3584 prc_next(prc_w), disp, ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3585 ginfo(gid)%win_packWE(vid), ierr )
3588 if ( prc_has_e )
then
3591 call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3593 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3595 prc_next(prc_e), disp, ginfo(gid)%size2D_WE*ka, comm_datatype_t, &
3596 ginfo(gid)%win_packWE(vid), ierr )
3604 call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
3605 call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
3619 real(RP),
intent(inout) :: var(:,:)
3620 integer,
intent(in) :: gid
3621 integer,
intent(in) :: vid
3623 integer :: IA, IS, IE
3624 integer :: JA, JS, JE
3625 integer :: IHALO, JHALO
3627 integer :: ireq, tag
3630 real(RP),
pointer :: ptr(:,:)
3631 logical :: flag_device
3641 ihalo = ginfo(gid)%IHALO
3642 jhalo = ginfo(gid)%JHALO
3644 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
3648 if ( ginfo(gid)%use_packbuf(vid) )
then
3649 log_error(
"vars_2D_mpi",*)
'packing buffer is already used', vid
3652 ginfo(gid)%use_packbuf(vid) = .true.
3656 flag_device = acc_is_present(var)
3663 if ( prc_has_s )
then
3664 call mpi_irecv( var(:,1:js-1), ginfo(gid)%size2D_NS4, comm_datatype_t, &
3665 prc_next(prc_s), tag+1, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3669 if ( prc_has_n )
then
3670 call mpi_irecv( var(:,je+1:ja), ginfo(gid)%size2D_NS4, comm_datatype_t, &
3671 prc_next(prc_n), tag+2, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3677 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
3681 if ( prc_has_e )
then
3683 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE, comm_datatype_t, &
3685 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE, comm_datatype_t, &
3687 prc_next(prc_e), tag+3, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3691 if ( prc_has_w )
then
3693 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE, comm_datatype_t, &
3695 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE, comm_datatype_t, &
3697 prc_next(prc_w), tag+4, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3708 call packwe_2d( ia, is, ie, ja, js, je, &
3713 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3718 if ( prc_has_w )
then
3720 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE, comm_datatype_t, &
3722 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, comm_datatype_t, &
3724 prc_next(prc_w), tag+3, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3728 if ( prc_has_e )
then
3730 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE, comm_datatype_t, &
3732 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, comm_datatype_t, &
3734 prc_next(prc_e), tag+4, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3745 if ( prc_has_n )
then
3746 call mpi_isend( var(:,je-jhalo+1:je), ginfo(gid)%size2D_NS4, comm_datatype_t, &
3747 prc_next(prc_n), tag+1, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3751 if ( prc_has_s )
then
3752 call mpi_isend( var(:,js:js+jhalo-1), ginfo(gid)%size2D_NS4, comm_datatype_t, &
3753 prc_next(prc_s), tag+2, comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3759 ginfo(gid)%req_cnt(vid) = ireq - 1
3769 real(RP),
intent(inout) :: var(:,:)
3770 integer,
intent(in) :: gid
3771 integer,
intent(in) :: vid
3773 integer :: IA, IS, IE
3774 integer :: JA, JS, JE
3775 integer :: IHALO, JHALO
3777 integer(kind=MPI_ADDRESS_KIND) :: disp
3781 real(RP),
pointer :: ptr(:,:)
3791 ihalo = ginfo(gid)%IHALO
3792 jhalo = ginfo(gid)%JHALO
3796 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
3797 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
3803 call packwe_2d( ia, is, ie, ja, js, je, &
3808 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3813 if ( prc_has_w )
then
3816 call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE, comm_datatype_t, &
3818 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, comm_datatype_t, &
3820 prc_next(prc_w), disp, ginfo(gid)%size2D_WE, comm_datatype_t, &
3821 ginfo(gid)%win_packWE(vid), ierr )
3824 if ( prc_has_e )
then
3827 call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE, comm_datatype_t, &
3829 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, comm_datatype_t, &
3831 prc_next(prc_e), disp, ginfo(gid)%size2D_WE, comm_datatype_t, &
3832 ginfo(gid)%win_packWE(vid), ierr )
3842 if ( prc_has_n )
then
3844 call mpi_put( var(:,je-jhalo+1:je), ginfo(gid)%size2D_NS4, comm_datatype_t, &
3845 prc_next(prc_n), disp, ginfo(gid)%size2D_NS4, comm_datatype_t, &
3846 ginfo(gid)%win_packNS(vid), ierr )
3849 if ( prc_has_s )
then
3851 call mpi_put( var(:,js:js+jhalo-1), ginfo(gid)%size2D_NS4, comm_datatype_t, &
3852 prc_next(prc_s), disp, ginfo(gid)%size2D_NS4, comm_datatype_t, &
3853 ginfo(gid)%win_packNS(vid), ierr )
3858 call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
3859 call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
3873 real(RP),
intent(inout) :: var(:,:)
3874 integer,
intent(in) :: gid
3875 integer,
intent(in) :: vid
3877 integer :: IA, IS, IE
3878 integer :: JA, JS, JE
3879 integer :: IHALO, JHALO
3881 integer :: ireq, tag, tagc
3886 real(RP),
pointer :: ptr(:,:)
3887 logical :: flag_device
3897 ihalo = ginfo(gid)%IHALO
3898 jhalo = ginfo(gid)%JHALO
3900 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
3904 if ( ginfo(gid)%use_packbuf(vid) )
then
3905 log_error(
"vars8_2D_mpi",*)
'packing buffer is already used', vid
3908 ginfo(gid)%use_packbuf(vid) = .true.
3912 flag_device = acc_is_present(var)
3915 if ( comm_isallperiodic )
then
3924 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
3925 comm_datatype_t, prc_next(prc_se), tag+tagc, &
3926 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3933 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
3934 comm_datatype_t, prc_next(prc_sw), tag+tagc, &
3935 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3942 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
3943 comm_datatype_t, prc_next(prc_ne), tag+tagc, &
3944 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3951 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
3952 comm_datatype_t, prc_next(prc_nw), tag+tagc, &
3953 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3958 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
3963 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE, &
3965 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE, &
3967 comm_datatype_t, prc_next(prc_e), tag+60, &
3968 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3972 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE, &
3974 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE, &
3976 comm_datatype_t, prc_next(prc_w), tag+70, &
3977 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3984 call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
3985 comm_datatype_t, prc_next(prc_s), tag+tagc, &
3986 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3993 call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
3994 comm_datatype_t, prc_next(prc_n), tag+tagc, &
3995 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4005 do j = je-jhalo+1, je
4006 call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
4007 comm_datatype_t, prc_next(prc_n), tag+tagc, &
4008 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4015 do j = js, js+jhalo-1
4016 call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
4017 comm_datatype_t, prc_next(prc_s), tag+tagc, &
4018 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4027 call packwe_2d( ia, is, ie, ja, js, je, &
4033 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4039 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE, &
4041 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, &
4043 comm_datatype_t, prc_next(prc_w), tag+60, &
4044 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4049 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE, &
4051 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, &
4053 comm_datatype_t, prc_next(prc_e), tag+70, &
4054 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4060 do j = je-jhalo+1, je
4061 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4062 comm_datatype_t, prc_next(prc_nw), tag+tagc, &
4063 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4070 do j = je-jhalo+1, je
4071 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4072 comm_datatype_t, prc_next(prc_ne), tag+tagc, &
4073 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4080 do j = js, js+jhalo-1
4081 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4082 comm_datatype_t, prc_next(prc_sw), tag+tagc, &
4083 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4090 do j = js, js+jhalo-1
4091 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4092 comm_datatype_t, prc_next(prc_se), tag+tagc, &
4093 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4110 if ( prc_has_s .AND. prc_has_e )
then
4113 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4114 comm_datatype_t, prc_next(prc_se), tag+tagc, &
4115 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4119 else if ( prc_has_s )
then
4122 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4123 comm_datatype_t, prc_next(prc_s), tag+tagc, &
4124 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4128 else if ( prc_has_e )
then
4131 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4132 comm_datatype_t, prc_next(prc_e), tag+tagc, &
4133 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4140 if ( prc_has_s .AND. prc_has_w )
then
4143 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4144 comm_datatype_t, prc_next(prc_sw), tag+tagc, &
4145 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4149 else if ( prc_has_s )
then
4152 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4153 comm_datatype_t, prc_next(prc_s), tag+tagc, &
4154 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4158 else if ( prc_has_w )
then
4161 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4162 comm_datatype_t, prc_next(prc_w), tag+tagc, &
4163 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4170 if ( prc_has_n .AND. prc_has_e )
then
4172 do j = je+1, je+jhalo
4173 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4174 comm_datatype_t, prc_next(prc_ne), tag+tagc, &
4175 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4179 else if ( prc_has_n )
then
4182 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4183 comm_datatype_t, prc_next(prc_n), tag+tagc, &
4184 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4188 else if ( prc_has_e )
then
4191 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4192 comm_datatype_t, prc_next(prc_e), tag+tagc, &
4193 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4200 if ( prc_has_n .AND. prc_has_w )
then
4203 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4204 comm_datatype_t, prc_next(prc_nw), tag+tagc, &
4205 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4209 else if ( prc_has_n )
then
4212 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4213 comm_datatype_t, prc_next(prc_n), tag+tagc, &
4214 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4218 else if ( prc_has_w )
then
4221 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4222 comm_datatype_t, prc_next(prc_w), tag+tagc, &
4223 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4230 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
4234 if ( prc_has_e )
then
4236 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE, &
4238 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE, &
4240 comm_datatype_t, prc_next(prc_e), tag+60, &
4241 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4246 if ( prc_has_w )
then
4248 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE, &
4250 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE, &
4252 comm_datatype_t, prc_next(prc_w), tag+70, &
4253 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4261 if ( prc_has_s )
then
4264 call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
4265 comm_datatype_t, prc_next(prc_s), tag+tagc, &
4266 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4273 if ( prc_has_n )
then
4276 call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
4277 comm_datatype_t, prc_next(prc_n), tag+tagc, &
4278 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4288 if ( prc_has_n )
then
4290 do j = je-jhalo+1, je
4291 call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
4292 comm_datatype_t, prc_next(prc_n), tag+tagc, &
4293 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4300 if ( prc_has_s )
then
4302 do j = js, js+jhalo-1
4303 call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
4304 comm_datatype_t, prc_next(prc_s), tag+tagc, &
4305 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4315 call packwe_2d( ia, is, ie, ja, js, je, &
4321 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4326 if ( prc_has_w )
then
4328 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE, &
4330 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, &
4332 comm_datatype_t, prc_next(prc_w), tag+60, &
4333 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4338 if ( prc_has_e )
then
4340 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE, &
4342 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, &
4344 comm_datatype_t, prc_next(prc_e), tag+70, &
4345 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4351 if ( prc_has_n .AND. prc_has_w )
then
4353 do j = je-jhalo+1, je
4354 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4355 comm_datatype_t, prc_next(prc_nw), tag+tagc, &
4356 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4360 else if ( prc_has_n )
then
4362 do j = je-jhalo+1, je
4363 call mpi_isend( var(1,j), ginfo(gid)%size2D_4C, &
4364 comm_datatype_t, prc_next(prc_n), tag+tagc, &
4365 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4369 else if ( prc_has_w )
then
4372 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4373 comm_datatype_t, prc_next(prc_w), tag+tagc, &
4374 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4381 if ( prc_has_n .AND. prc_has_e )
then
4383 do j = je-jhalo+1, je
4384 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4385 comm_datatype_t, prc_next(prc_ne), tag+tagc, &
4386 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4390 else if ( prc_has_n )
then
4392 do j = je-jhalo+1, je
4393 call mpi_isend( var(ie+1,j), ginfo(gid)%size2D_4C, &
4394 comm_datatype_t, prc_next(prc_n), tag+tagc, &
4395 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4399 else if ( prc_has_e )
then
4402 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4403 comm_datatype_t, prc_next(prc_e), tag+tagc, &
4404 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4411 if ( prc_has_s .AND. prc_has_w )
then
4413 do j = js, js+jhalo-1
4414 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4415 comm_datatype_t, prc_next(prc_sw), tag+tagc, &
4416 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4420 else if ( prc_has_s )
then
4422 do j = js, js+jhalo-1
4423 call mpi_isend( var(1,j), ginfo(gid)%size2D_4C, &
4424 comm_datatype_t, prc_next(prc_s), tag+tagc, &
4425 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4429 else if ( prc_has_w )
then
4432 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4433 comm_datatype_t, prc_next(prc_w), tag+tagc, &
4434 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4441 if ( prc_has_s .AND. prc_has_e )
then
4443 do j = js, js+jhalo-1
4444 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4445 comm_datatype_t, prc_next(prc_se), tag+tagc, &
4446 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4450 else if ( prc_has_s )
then
4452 do j = js, js+jhalo-1
4453 call mpi_isend( var(ie+1,j), ginfo(gid)%size2D_4C, &
4454 comm_datatype_t, prc_next(prc_s), tag+tagc, &
4455 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4459 else if ( prc_has_e )
then
4462 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4463 comm_datatype_t, prc_next(prc_e), tag+tagc, &
4464 comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
4476 ginfo(gid)%req_cnt(vid) = ireq - 1
4486 real(RP),
intent(inout) :: var(:,:)
4487 integer,
intent(in) :: gid
4488 integer,
intent(in) :: vid
4490 integer :: IA, IS, IE, IHALO
4491 integer :: JA, JS, JE, JHALO
4493 integer(kind=MPI_ADDRESS_KIND) :: disp
4498 real(RP),
pointer :: ptr(:,:)
4505 ihalo = ginfo(gid)%IHALO
4509 jhalo = ginfo(gid)%JHALO
4513 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
4514 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
4516 if ( comm_isallperiodic )
then
4524 do j = je-jhalo+1, je
4525 disp = ihalo + ia * ( j - je+jhalo-1 )
4526 call mpi_put( var(is,j), ginfo(gid)%size2D_NS8, comm_datatype_t, &
4527 prc_next(prc_n), disp, ginfo(gid)%size2D_NS8, comm_datatype_t, &
4528 ginfo(gid)%win_packNS(vid), ierr )
4531 do j = js, js+jhalo-1
4532 disp = ihalo + ia * ( j - js + jhalo )
4533 call mpi_put( var(is,j), ginfo(gid)%size2D_NS8, comm_datatype_t, &
4534 prc_next(prc_s), disp, ginfo(gid)%size2D_NS8, comm_datatype_t, &
4535 ginfo(gid)%win_packNS(vid), ierr )
4542 call packwe_2d( ia, is, ie, ja, js, je, &
4548 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4555 call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE, comm_datatype_t, &
4557 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, comm_datatype_t, &
4559 prc_next(prc_w), disp, ginfo(gid)%size2D_WE, comm_datatype_t, &
4560 ginfo(gid)%win_packWE(vid), ierr )
4564 call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE, comm_datatype_t, &
4566 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, comm_datatype_t, &
4568 prc_next(prc_e), disp, ginfo(gid)%size2D_WE, comm_datatype_t, &
4569 ginfo(gid)%win_packWE(vid), ierr )
4572 do j = je-jhalo+1, je
4573 disp = ie + ia * ( j - je+jhalo-1 )
4574 call mpi_put( var(is,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4575 prc_next(prc_nw), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4576 ginfo(gid)%win_packNS(vid), ierr )
4579 do j = je-jhalo+1, je
4580 disp = ia * ( j - je+jhalo-1 )
4581 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4582 prc_next(prc_ne), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4583 ginfo(gid)%win_packNS(vid), ierr )
4586 do j = js, js+jhalo-1
4587 disp = ie + ia * ( j - js + jhalo )
4588 call mpi_put( var(is,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4589 prc_next(prc_sw), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4590 ginfo(gid)%win_packNS(vid), ierr )
4593 do j = js, js+jhalo-1
4594 disp = ia * ( j - js + jhalo )
4595 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4596 prc_next(prc_se), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4597 ginfo(gid)%win_packNS(vid), ierr )
4609 if ( prc_has_n )
then
4610 do j = je-jhalo+1, je
4611 disp = ihalo + ia * ( j - je+jhalo-1 )
4612 call mpi_put( var(is,j), ginfo(gid)%size2D_NS8, comm_datatype_t, &
4613 prc_next(prc_n), disp, ginfo(gid)%size2D_NS8, comm_datatype_t, &
4614 ginfo(gid)%win_packNS(vid), ierr )
4618 if ( prc_has_s )
then
4619 do j = js, js+jhalo-1
4620 disp = ihalo + ia * ( j - js + jhalo )
4621 call mpi_put( var(is,j), ginfo(gid)%size2D_NS8, comm_datatype_t, &
4622 prc_next(prc_s), disp, ginfo(gid)%size2D_NS8, comm_datatype_t, &
4623 ginfo(gid)%win_packNS(vid), ierr )
4631 call packwe_2d( ia, is, ie, ja, js, je, &
4637 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4642 if ( prc_has_w )
then
4645 call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE, comm_datatype_t, &
4647 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, comm_datatype_t, &
4649 prc_next(prc_w), disp, ginfo(gid)%size2D_WE, comm_datatype_t, &
4650 ginfo(gid)%win_packWE(vid), ierr )
4653 if ( prc_has_e )
then
4656 call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE, comm_datatype_t, &
4658 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, comm_datatype_t, &
4660 prc_next(prc_e), disp, ginfo(gid)%size2D_WE, comm_datatype_t, &
4661 ginfo(gid)%win_packWE(vid), ierr )
4665 if ( prc_has_n .AND. prc_has_w )
then
4666 do j = je-jhalo+1, je
4667 disp = ie + ia * ( j - je+jhalo-1 )
4668 call mpi_put( var(is,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4669 prc_next(prc_nw), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4670 ginfo(gid)%win_packNS(vid), ierr )
4672 else if ( prc_has_n )
then
4673 do j = je-jhalo+1, je
4674 disp = ia * ( j - je+jhalo-1 )
4675 call mpi_put( var(1,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4676 prc_next(prc_n), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4677 ginfo(gid)%win_packNS(vid), ierr )
4679 else if ( prc_has_w )
then
4681 disp = ie + ia * ( j - je-1 + jhalo )
4682 call mpi_put( var(is,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4683 prc_next(prc_w), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4684 ginfo(gid)%win_packNS(vid), ierr )
4688 if ( prc_has_n .AND. prc_has_e )
then
4689 do j = je-jhalo+1, je
4690 disp = ia * ( j - je+jhalo-1 )
4691 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4692 prc_next(prc_ne), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4693 ginfo(gid)%win_packNS(vid), ierr )
4695 else if ( prc_has_n )
then
4696 do j = je-jhalo+1, je
4697 disp = ie + ia * ( j - je+jhalo-1 )
4698 call mpi_put( var(ie+1,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4699 prc_next(prc_n), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4700 ginfo(gid)%win_packNS(vid), ierr )
4702 else if ( prc_has_e )
then
4704 disp = ia * ( j - je-1 + jhalo )
4705 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4706 prc_next(prc_e), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4707 ginfo(gid)%win_packNS(vid), ierr )
4711 if ( prc_has_s .AND. prc_has_w )
then
4712 do j = js, js+jhalo-1
4713 disp = ie + ia * ( j - js + jhalo )
4714 call mpi_put( var(is,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4715 prc_next(prc_sw), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4716 ginfo(gid)%win_packNS(vid), ierr )
4718 else if ( prc_has_s )
then
4719 do j = js, js+jhalo-1
4720 disp = ia * ( j - js + jhalo )
4721 call mpi_put( var(1,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4722 prc_next(prc_s), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4723 ginfo(gid)%win_packNS(vid), ierr )
4725 else if ( prc_has_w )
then
4727 disp = ie + ia * ( j - 1 )
4728 call mpi_put( var(is,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4729 prc_next(prc_w), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4730 ginfo(gid)%win_packNS(vid), ierr )
4734 if ( prc_has_s .AND. prc_has_e )
then
4735 do j = js, js+jhalo-1
4736 disp = ia * ( j - js + jhalo )
4737 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4738 prc_next(prc_se), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4739 ginfo(gid)%win_packNS(vid), ierr )
4741 else if ( prc_has_s )
then
4742 do j = js, js+jhalo-1
4743 disp = ie + ia * ( j - js + jhalo )
4744 call mpi_put( var(ie+1,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4745 prc_next(prc_s), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4746 ginfo(gid)%win_packNS(vid), ierr )
4748 else if ( prc_has_e )
then
4750 disp = ia * ( j - 1 )
4751 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, comm_datatype_t, &
4752 prc_next(prc_e), disp, ginfo(gid)%size2D_4C, comm_datatype_t, &
4753 ginfo(gid)%win_packNS(vid), ierr )
4762 call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
4763 call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
4776 real(RP),
intent(inout) :: var(:,:,:)
4777 integer,
intent(in) :: gid
4778 integer,
intent(in) :: vid
4781 integer :: IA, IS, IE
4782 integer :: JA, JS, JE
4789 if ( ginfo(gid)%use_packbuf(ginfo(gid)%packid(vid)) )
then
4790 log_error(
"vars_3D_mpi_pc",*)
'packing buffer is already used', vid, ginfo(gid)%packid(vid)
4793 ginfo(gid)%use_packbuf(ginfo(gid)%packid(vid)) = .true.
4797 if ( ginfo(gid)%device_alloc(vid+comm_vsize_max) )
then
4810 ihalo = ginfo(gid)%IHALO
4811 call packwe_3d( ka, ia, is, ie, ja, js, je, &
4813 var, gid, ginfo(gid)%packid(vid))
4817 call mpi_startall(ginfo(gid)%preq_cnt(vid), ginfo(gid)%preq_list(1:ginfo(gid)%preq_cnt(vid),vid), ierr)
4826 real(RP),
intent(inout) :: var(:,:,:)
4827 integer,
intent(in) :: gid
4828 integer,
intent(in) :: vid
4831 integer :: IA, IS, IE
4832 integer :: JA, JS, JE
4839 call mpi_waitall( ginfo(gid)%req_cnt (vid), &
4840 ginfo(gid)%req_list(1:ginfo(gid)%req_cnt(vid),vid), &
4841 mpi_statuses_ignore, &
4851 ihalo = ginfo(gid)%IHALO
4852 call unpackwe_3d( ka, ia, is, ie, ja, js, je, &
4854 var, ginfo(gid)%recvpack_WE2P(:,:,vid) )
4859 ginfo(gid)%use_packbuf(vid) = .false.
4869 real(RP),
intent(inout) :: var(:,:,:)
4870 integer,
intent(in) :: gid
4871 integer,
intent(in) :: vid
4874 integer :: IA, IS, IE
4875 integer :: JA, JS, JE
4876 integer :: IHALO, JHALO
4878 real(RP),
pointer :: pack(:)
4890 ihalo = ginfo(gid)%IHALO
4891 jhalo = ginfo(gid)%JHALO
4893 call mpi_win_wait( ginfo(gid)%win_packWE(vid), ierr )
4895 call c_f_pointer( ginfo(gid)%recvbuf_WE(vid), pack, (/ginfo(gid)%size2D_WE*ka*2/) )
4896 call unpackwe_3d( ka, ia, is, ie, ja, js, je, &
4901 call mpi_win_wait( ginfo(gid)%win_packNS(vid), ierr )
4902 call c_f_pointer( ginfo(gid)%recvbuf_NS(vid), pack, (/ginfo(gid)%size2D_NS4*ka*2/) )
4903 call unpackns_3d( ka, ia, is, ie, ja, js, je, &
4909 call mpi_win_post( group_packwe, mpi_mode_nostore, ginfo(gid)%win_packWE(vid), ierr )
4910 call mpi_win_post( group_packns, mpi_mode_nostore, ginfo(gid)%win_packNS(vid), ierr )
4919 real(RP),
intent(inout) :: var(:,:)
4920 integer,
intent(in) :: gid
4921 integer,
intent(in) :: vid
4924 integer :: IA, IS, IE
4925 integer :: JA, JS, JE
4932 call mpi_waitall( ginfo(gid)%req_cnt(vid), &
4933 ginfo(gid)%req_list(1:ginfo(gid)%req_cnt(vid),vid), &
4934 mpi_statuses_ignore, &
4944 ihalo = ginfo(gid)%IHALO
4945 call unpackwe_2d( ka, ia, is, ie, ja, js, je, &
4947 var, ginfo(gid)%recvpack_WE2P(:,:,vid) )
4951 ginfo(gid)%use_packbuf(vid) = .false.
4961 real(RP),
intent(inout) :: var(:,:)
4962 integer,
intent(in) :: gid
4963 integer,
intent(in) :: vid
4966 integer :: IA, IS, IE
4967 integer :: JA, JS, JE
4968 integer :: IHALO, JHALO
4970 real(RP),
pointer :: pack(:)
4982 ihalo = ginfo(gid)%IHALO
4983 jhalo = ginfo(gid)%JHALO
4985 call mpi_win_wait( ginfo(gid)%win_packWE(vid), ierr )
4987 call c_f_pointer( ginfo(gid)%recvbuf_WE(vid), pack, (/ginfo(gid)%size2D_WE*ka*2/) )
4988 call unpackwe_2d( ka, ia, is, ie, ja, js, je, &
4993 call mpi_win_wait( ginfo(gid)%win_packNS(vid), ierr )
4994 call c_f_pointer( ginfo(gid)%recvbuf_NS(vid), pack, (/ginfo(gid)%size2D_NS4*ka*2/) )
4995 call unpackns_2d( ia, is, ie, ja, js, je, &
4999 call mpi_win_post( group_packwe, mpi_mode_nostore, ginfo(gid)%win_packWE(vid), ierr )
5000 call mpi_win_post( group_packns, mpi_mode_nostore, ginfo(gid)%win_packNS(vid), ierr )
5009 real(RP),
intent(inout) :: var(:,:,:)
5010 integer,
intent(in) :: gid
5011 integer,
intent(in) :: vid
5014 integer :: IA, IS, IE
5015 integer :: JA, JS, JE
5022 call mpi_waitall( ginfo(gid)%preq_cnt (vid), &
5023 ginfo(gid)%preq_list(1:ginfo(gid)%preq_cnt(vid),vid), &
5024 mpi_statuses_ignore, &
5034 ihalo = ginfo(gid)%IHALO
5035 pid = ginfo(gid)%packid(vid)
5036 call unpackwe_3d( ka, ia, is, ie, ja, js, je, &
5038 var, ginfo(gid)%recvpack_WE2P(:,:,pid) )
5043 ginfo(gid)%use_packbuf(ginfo(gid)%packid(vid)) = .false.
5047 if ( ginfo(gid)%device_alloc(vid+comm_vsize_max) )
then
5059 integer,
intent(in) :: KA
5060 integer,
intent(in) :: IA, IS, IE
5061 integer,
intent(in) :: JA, JS, JE
5062 integer,
intent(in) :: IHALO
5063 real(RP),
intent(in) :: var(KA,IA,JA)
5064 integer,
intent(in) :: gid
5065 integer,
intent(in) :: vid
5067 integer :: k, i, j, n
5070 real(RP),
pointer :: ptr(:,:,:)
5071 ptr => ginfo(gid)%sendpack_P2WE
5076 call prof_rapstart(
'COMM_pack', 3)
5078 if ( prc_has_w )
then
5084 do i = is, is+ihalo-1
5087 n = (j-js) * ka * ihalo &
5091 ptr(n,1,vid) = var(k,i,j)
5093 ginfo(gid)%sendpack_P2WE(n,1,vid) = var(k,i,j)
5101 if ( prc_has_e )
then
5107 do i = ie-ihalo+1, ie
5110 n = (j-js) * ka * ihalo &
5111 + (i-ie+ihalo-1) * ka &
5114 ptr(n,2,vid) = var(k,i,j)
5116 ginfo(gid)%sendpack_P2WE(n,2,vid) = var(k,i,j)
5124 call prof_rapend(
'COMM_pack', 3)
5131 subroutine packwe_2d( IA, IS, IE, JA, JS, JE, &
5135 integer,
intent(in) :: IA, IS, IE
5136 integer,
intent(in) :: JA, JS, JE
5137 integer,
intent(in) :: IHALO
5138 real(RP),
intent(in) :: var(IA,JA)
5139 integer,
intent(in) :: vid
5140 integer,
intent(in) :: gid
5145 real(RP),
pointer :: ptr(:,:,:)
5146 ptr => ginfo(gid)%sendpack_P2WE
5150 call prof_rapstart(
'COMM_pack', 3)
5152 if ( prc_has_w )
then
5160 do i = is, is+ihalo-1
5161 n = (j-js) * ihalo &
5164 ptr(n,1,vid) = var(i,j)
5166 ginfo(gid)%sendpack_P2WE(n,1,vid) = var(i,j)
5173 if ( prc_has_e )
then
5180 do i = ie-ihalo+1, ie
5181 n = (j-js) * ihalo &
5182 + (i-ie+ihalo-1) + 1
5184 ptr(n,2,vid) = var(i,j)
5186 ginfo(gid)%sendpack_P2WE(n,2,vid) = var(i,j)
5195 call prof_rapend(
'COMM_pack', 3)
5200 end subroutine packwe_2d
5202 subroutine unpackwe_3d( 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(KA,IA,JA)
5211 real(RP),
intent(in) :: buf(KA,IHALO,JS:JE,2)
5218 call prof_rapstart(
'COMM_unpack', 3)
5220 if ( prc_has_e )
then
5229 var(k,i,j) = buf(k,i-ie,j,2)
5236 if ( prc_has_w )
then
5245 var(k,i,j) = buf(k,i,j,1)
5252 call prof_rapend(
'COMM_unpack', 3)
5257 end subroutine unpackwe_3d
5259 subroutine unpackwe_2d( KA, IA, IS, IE, JA, JS, JE, &
5263 integer,
intent(in) :: KA
5264 integer,
intent(in) :: IA, IS, IE
5265 integer,
intent(in) :: JA, JS, JE
5266 integer,
intent(in) :: IHALO
5267 real(RP),
intent(inout) :: var(IA,JA)
5268 real(RP),
intent(in) :: buf(IHALO,JS:JE,KA,2)
5275 call prof_rapstart(
'COMM_unpack', 3)
5277 if( prc_has_e )
then
5282 do i = ie+1, ie+ihalo
5283 var(i,j) = buf(i-ie,j,1,2)
5289 if( prc_has_w )
then
5294 do i = is-ihalo, is-1
5295 var(i,j) = buf(i,j,1,1)
5303 call prof_rapend(
'COMM_unpack', 3)
5308 end subroutine unpackwe_2d
5310 subroutine unpackns_3d( KA, IA, IS, IE, JA, JS, JE, &
5314 integer,
intent(in) :: KA
5315 integer,
intent(in) :: IA, IS, IE
5316 integer,
intent(in) :: JA, JS, JE
5317 integer,
intent(in) :: JHALO
5318 real(RP),
intent(inout) :: var(KA,IA,JA)
5319 real(RP),
intent(in) :: buf(KA,IA,JHALO,2)
5326 call prof_rapstart(
'COMM_unpack', 3)
5328 if ( prc_has_s )
then
5335 var(k,i,j) = buf(k,i,j,1)
5341 if ( prc_has_w )
then
5348 var(k,i,j) = buf(k,i,j,1)
5354 if ( prc_has_e )
then
5361 var(k,i,j) = buf(k,i,j,1)
5369 if ( prc_has_n )
then
5376 var(k,i,j) = buf(k,i,j-je,2)
5382 if ( prc_has_w )
then
5389 var(k,i,j) = buf(k,i,j-je,2)
5395 if ( prc_has_e )
then
5402 var(k,i,j) = buf(k,i,j-je,2)
5412 call prof_rapend(
'COMM_unpack', 3)
5417 end subroutine unpackns_3d
5419 subroutine unpackns_2d( IA, IS, IE, JA, JS, JE, &
5423 integer,
intent(in) :: IA, IS, IE
5424 integer,
intent(in) :: JA, JS, JE
5425 integer,
intent(in) :: JHALO
5426 real(RP),
intent(inout) :: var(IA,JA)
5427 real(RP),
intent(in) :: buf(IA,JHALO,2)
5434 call prof_rapstart(
'COMM_unpack', 3)
5436 if ( prc_has_s )
then
5442 var(i,j) = buf(i,j,1)
5447 if ( prc_has_w )
then
5453 var(i,j) = buf(i,j,1)
5458 if ( prc_has_e )
then
5464 var(i,j) = buf(i,j,1)
5471 if ( prc_has_n )
then
5477 var(i,j) = buf(i,j-je,2)
5482 if ( prc_has_w )
then
5488 var(i,j) = buf(i,j-je,2)
5493 if ( prc_has_e )
then
5499 var(i,j) = buf(i,j-je,2)
5508 call prof_rapend(
'COMM_unpack', 3)
5513 end subroutine unpackns_2d
5515 subroutine copy_boundary_3d(var, gid)
5520 real(RP),
intent(inout) :: var(:,:,:)
5521 integer,
intent(in) :: gid
5524 integer :: IS, IE, IHALO
5525 integer :: JS, JE, JHALO
5535 ihalo = ginfo(gid)%IHALO
5538 jhalo = ginfo(gid)%JHALO
5543 if ( .NOT. prc_has_n )
then
5545 do j = je+1, je+jhalo
5549 var(k,i,j) = var(k,i,je)
5558 if ( .NOT. prc_has_s )
then
5561 do j = js-jhalo, js-1
5565 var(k,i,j) = var(k,i,js)
5576 if ( .NOT. prc_has_e )
then
5580 do i = ie+1, ie+ihalo
5582 var(k,i,j) = var(k,ie,j)
5591 if ( .NOT. prc_has_w )
then
5596 do i = is-ihalo, is-1
5597 var(:,i,j) = var(:,is,j)
5605 if ( .NOT. prc_has_n .AND. &
5606 .NOT. prc_has_w )
then
5608 do j = je+1, je+jhalo
5610 do i = is-ihalo, is-1
5612 var(k,i,j) = var(k,is,je)
5617 elseif( .NOT. prc_has_n )
then
5619 do j = je+1, je+jhalo
5620 do i = is-ihalo, is-1
5622 var(k,i,j) = var(k,i,je)
5627 elseif( .NOT. prc_has_w )
then
5629 do j = je+1, je+jhalo
5631 do i = is-ihalo, is-1
5633 var(k,i,j) = var(k,is,j)
5641 if ( .NOT. prc_has_s .AND. &
5642 .NOT. prc_has_w )
then
5645 do j = js-jhalo, js-1
5647 do i = is-ihalo, is-1
5649 var(k,i,j) = var(k,is,js)
5654 elseif( .NOT. prc_has_s )
then
5657 do j = js-jhalo, js-1
5658 do i = is-ihalo, is-1
5660 var(k,i,j) = var(k,i,js)
5665 elseif( .NOT. prc_has_w )
then
5667 do j = js-jhalo, js-1
5669 do i = is-ihalo, is-1
5671 var(k,i,j) = var(k,is,j)
5679 if ( .NOT. prc_has_n .AND. &
5680 .NOT. prc_has_e )
then
5682 do j = je+1, je+jhalo
5683 do i = ie+1, ie+ihalo
5685 var(k,i,j) = var(k,ie,je)
5690 elseif( .NOT. prc_has_n )
then
5692 do j = je+1, je+jhalo
5693 do i = ie+1, ie+ihalo
5695 var(k,i,j) = var(k,i,je)
5700 elseif( .NOT. prc_has_e )
then
5702 do j = je+1, je+jhalo
5703 do i = ie+1, ie+ihalo
5705 var(k,i,j) = var(k,ie,j)
5713 if ( .NOT. prc_has_s .AND. &
5714 .NOT. prc_has_e )
then
5716 do j = js-jhalo, js-1
5717 do i = ie+1, ie+ihalo
5719 var(k,i,j) = var(k,ie,js)
5724 elseif( .NOT. prc_has_s )
then
5727 do j = js-jhalo, js-1
5728 do i = ie+1, ie+ihalo
5730 var(k,i,j) = var(k,i,js)
5735 elseif( .NOT. prc_has_e )
then
5737 do j = js-jhalo, js-1
5738 do i = ie+1, ie+ihalo
5740 var(k,i,j) = var(k,ie,j)
5756 end subroutine copy_boundary_3d
5763 real(RP),
intent(inout) :: var(:,:)
5764 integer,
intent(in) :: gid
5766 integer :: IS, IE, IHALO
5767 integer :: JS, JE, JHALO
5776 ihalo = ginfo(gid)%IHALO
5779 jhalo = ginfo(gid)%JHALO
5784 if( .NOT. prc_has_n )
then
5786 do j = je+1, je+jhalo
5789 var(i,j) = var(i,je)
5797 if( .NOT. prc_has_s )
then
5800 do j = js-jhalo, js-1
5803 var(i,j) = var(i,js)
5812 if( .NOT. prc_has_e )
then
5816 do i = ie+1, ie+ihalo
5817 var(i,j) = var(ie,j)
5824 if( .NOT. prc_has_w )
then
5829 do i = is-ihalo, is-1
5830 var(i,j) = var(is,j)
5838 if( .NOT. prc_has_n .AND. .NOT. prc_has_w )
then
5840 do j = je+1, je+jhalo
5842 do i = is-ihalo, is-1
5843 var(i,j) = var(is,je)
5847 elseif( .NOT. prc_has_n )
then
5849 do j = je+1, je+jhalo
5850 do i = is-ihalo, is-1
5851 var(i,j) = var(i,je)
5855 elseif( .NOT. prc_has_w )
then
5857 do j = je+1, je+jhalo
5859 do i = is-ihalo, is-1
5860 var(i,j) = var(is,j)
5867 if( .NOT. prc_has_s .AND. .NOT. prc_has_w )
then
5870 do j = js-jhalo, js-1
5872 do i = is-ihalo, is-1
5873 var(i,j) = var(is,js)
5877 elseif( .NOT. prc_has_s )
then
5880 do j = js-jhalo, js-1
5881 do i = is-ihalo, is-1
5882 var(i,j) = var(i,js)
5886 elseif( .NOT. prc_has_w )
then
5888 do j = js-jhalo, js-1
5890 do i = is-ihalo, is-1
5891 var(i,j) = var(is,j)
5898 if( .NOT. prc_has_n .AND. .NOT. prc_has_e )
then
5900 do j = je+1, je+jhalo
5901 do i = ie+1, ie+ihalo
5902 var(i,j) = var(ie,je)
5906 elseif( .NOT. prc_has_n )
then
5908 do j = je+1, je+jhalo
5909 do i = ie+1, ie+ihalo
5910 var(i,j) = var(i,je)
5914 elseif( .NOT. prc_has_e )
then
5916 do j = je+1, je+jhalo
5917 do i = ie+1, ie+ihalo
5918 var(i,j) = var(ie,j)
5925 if( .NOT. prc_has_s .AND. .NOT. prc_has_e )
then
5927 do j = js-jhalo, js-1
5928 do i = ie+1, ie+ihalo
5929 var(i,j) = var(ie,js)
5933 elseif( .NOT. prc_has_s )
then
5936 do j = js-jhalo, js-1
5937 do i = ie+1, ie+ihalo
5938 var(i,j) = var(i,js)
5942 elseif( .NOT. prc_has_e )
then
5944 do j = js-jhalo, js-1
5945 do i = ie+1, ie+ihalo
5946 var(i,j) = var(ie,j)
subroutine, public comm_vars8_init(varname, var, vid, gid)
Register variables.
subroutine vars_3d_mpi_pc(var, gid, vid)
subroutine comm_gather_3d(KA, IA, JA, send, recv)
Get data from whole process value in 3D field.
subroutine comm_bcast_character(var)
Broadcast data for whole process value in character.
subroutine comm_bcast_4d_dp(KA, IA, JA, NT, var)
subroutine comm_horizontal_mean_2d(IA, IS, IE, JA, JS, JE, var, varmean)
calculate horizontal mean (global total with communication) 2D
subroutine comm_bcast_3d_sp(KA, IA, JA, var)
Broadcast data for whole process value in 3D field.
subroutine comm_wait_2d(var, vid, FILL_BND, gid)
subroutine wait_2d_mpi(var, gid, vid)
subroutine comm_bcast_2d_dp(IA, JA, var)
subroutine vars8_init_mpi_pc(var, gid, vid, seqid)
subroutine copy_boundary_2d(var, gid)
subroutine vars_2d_mpi_onesided(var, gid, vid)
subroutine comm_bcast_2d_sp(IA, JA, var)
Broadcast data for whole process value in 2D field.
subroutine vars_init_mpi_pc(var, gid, vid, seqid)
subroutine wait_3d_mpi_onesided(var, gid, vid)
subroutine comm_bcast_logical_1d(IA, var)
Broadcast data for whole process value in 1D (logical)
subroutine, public comm_finalize
Finalize.
subroutine comm_wait_3d(var, vid, FILL_BND, gid)
subroutine comm_bcast_4d_sp(KA, IA, JA, NT, var)
Broadcast data for whole process value in 4D field.
subroutine comm_bcast_logical_scr(var)
Broadcast data for whole process value in scalar (logical)
subroutine comm_vars_3d(var, vid, gid)
subroutine, public comm_regist(KA, IA, JA, IHALO, JHALO, gid)
Regist grid.
subroutine vars_3d_mpi_onesided(var, gid, vid)
subroutine comm_vars_2d(var, vid, gid)
subroutine vars8_3d_mpi_onesided(var, gid, vid)
subroutine vars_2d_mpi(var, gid, vid)
subroutine comm_bcast_int_scr(var)
Broadcast data for whole process value in scalar (integer)
subroutine, public comm_setup
Setup.
subroutine comm_vars8_3d(var, vid, gid)
subroutine comm_bcast_3d_dp(KA, IA, JA, var)
subroutine vars8_2d_mpi(var, gid, vid)
subroutine comm_horizontal_mean_3d(KA, IA, IS, IE, JA, JS, JE, var, varmean)
calculate horizontal mean (global total with communication) 3D
integer, public comm_datatype
datatype of variable
subroutine comm_bcast_1d_dp(IA, var)
subroutine packwe_3d(KA, IA, IS, IE, JA, JS, JE, IHALO, var, gid, vid)
subroutine comm_gather_2d(IA, JA, send, recv)
Get data from whole process value in 2D field.
subroutine wait_3d_mpi(var, gid, vid)
subroutine comm_bcast_int_2d(IA, JA, var)
Broadcast data for whole process value in 2D field (integer)
subroutine wait_3d_mpi_pc(var, gid, vid)
subroutine vars8_2d_mpi_onesided(var, gid, vid)
subroutine, public comm_vars_init(varname, var, vid, gid)
Register variables.
subroutine wait_2d_mpi_onesided(var, gid, vid)
subroutine comm_bcast_int_1d(IA, var)
Broadcast data for whole process value in 1D field (integer)
subroutine comm_vars8_2d(var, vid, gid)
integer, public comm_world
communication world ID
subroutine comm_bcast_scr_sp(var)
Broadcast data for whole process value in scalar field.
subroutine comm_bcast_1d_sp(IA, var)
Broadcast data for whole process value in 1D field.
subroutine vars_3d_mpi(var, gid, vid)
subroutine comm_bcast_scr_dp(var)
subroutine vars8_3d_mpi(var, gid, vid)
real(rp), public const_undef
integer, public io_fid_conf
Config file ID.
logical, public prc_has_s
integer, dimension(8), public prc_next
node ID of 8 neighbour process
integer, parameter, public prc_s
[node direction] south
integer, parameter, public prc_nw
[node direction] northwest
integer, parameter, public prc_ne
[node direction] northeast
integer, parameter, public prc_se
[node direction] southeast
integer, parameter, public prc_sw
[node direction] southwest
integer, parameter, public prc_w
[node direction] west
logical, public prc_twod
2D experiment
integer, parameter, public prc_n
[node direction] north
logical, public prc_has_e
logical, public prc_has_n
integer, parameter, public prc_e
[node direction] east
logical, public prc_has_w
integer, public prc_local_comm_world
local communicator
integer, parameter, public prc_masterrank
master process in each communicator
subroutine, public prc_abort
Abort Process.
integer, parameter, public rp