61 end interface comm_vars
66 end interface comm_vars8
71 end interface comm_wait
76 end interface comm_gather
95 end interface comm_bcast
112 integer,
private :: comm_vsize_max
113 integer,
private :: comm_vsize_max_pc
115 logical,
private :: comm_isallperiodic
117 logical,
private :: comm_use_mpi_pc = .true.
119 logical,
private :: comm_use_mpi_onesided = .true.
121 logical,
private :: comm_use_mpi_onesided = .false.
130 real(
rp),
pointer :: ptr(:,:,:)
135 integer :: ia, is, ie, ihalo
136 integer :: ja, js, je, jhalo
138 integer :: size2d_ns4
139 integer :: size2d_ns8
142 integer :: vars_num = 0
143 real(
rp),
pointer :: recvpack_we2p(:,:,:)
144 real(
rp),
pointer :: sendpack_p2we(:,:,:)
145 type(c_ptr),
allocatable :: recvbuf_we(:)
146 type(c_ptr),
allocatable :: recvbuf_ns(:)
147 integer,
allocatable :: req_cnt (:)
148 type(mpi_request),
allocatable :: req_list(:,:)
149 integer,
allocatable :: preq_cnt (:)
150 type(mpi_request),
allocatable :: preq_list(:,:)
151 integer,
allocatable :: packid(:)
152 type(mpi_win),
allocatable :: win_packwe(:)
153 type(mpi_win),
allocatable :: win_packns(:)
155 logical,
allocatable :: use_packbuf(:)
158 logical,
allocatable :: device_alloc(:)
159 type(ptr_t),
allocatable :: device_ptr(:)
163 integer,
private,
parameter :: comm_gid_max = 20
164 integer,
private :: comm_gid
165 type(ginfo_t),
private :: ginfo(comm_gid_max)
167 type(mpi_group),
private :: group_packwe
168 type(mpi_group),
private :: group_packns
169 logical,
private :: group_packwe_created = .false.
170 logical,
private :: group_packns_created = .false.
172 logical,
private :: initialized = .false.
187 namelist / param_comm_cartesc / &
191 comm_use_mpi_onesided
194 type(mpi_group) :: group
200 if ( initialized )
return
203 log_info(
"COMM_setup",*)
'Setup'
205 comm_vsize_max = max( 10 +
qa*2, 25 )
206 comm_vsize_max_pc = 50 +
qa*2
209 comm_use_mpi_onesided = .false.
214 read(
io_fid_conf,nml=param_comm_cartesc,iostat=ierr)
216 log_info(
"COMM_setup",*)
'Not found namelist. Default used.'
217 elseif( ierr > 0 )
then
218 log_error(
"COMM_setup",*)
'Not appropriate names in namelist PARAM_COMM_CARTESC. Check!'
221 log_nml(param_comm_cartesc)
223 if ( prc_has_n .AND. prc_has_s .AND. prc_has_w .AND. prc_has_e )
then
224 comm_isallperiodic = .true.
226 comm_isallperiodic = .false.
229 if (
rp == kind(0.d0) )
then
231 elseif(
rp == kind(0.0) )
then
234 log_error(
"COMM_setup",*)
'precision is not supportd'
245 if ( comm_use_mpi_onesided )
then
246 log_warn(
"COMM_setup",*)
"Open MPI does not support one-sided APIs with CUDA-aware UCX"
250 if ( comm_use_mpi_onesided )
then
252 comm_use_mpi_pc = .false.
257 if ( prc_has_s )
then
259 ranks(n) = prc_next(prc_s)
261 if ( prc_has_n )
then
263 if ( ranks(m) == prc_next(prc_n) )
exit
265 if ( m == n + 1 )
then
267 ranks(n) = prc_next(prc_n)
270 if ( prc_has_n .and. prc_has_w )
then
272 if ( ranks(m) == prc_next(prc_nw) )
exit
274 if ( m == n + 1 )
then
276 ranks(n) = prc_next(prc_nw)
278 else if ( prc_has_n )
then
280 if ( ranks(m) == prc_next(prc_n) )
exit
282 if ( m == n + 1 )
then
284 ranks(n) = prc_next(prc_n)
286 else if ( prc_has_w )
then
288 if ( ranks(m) == prc_next(prc_w) )
exit
290 if ( m == n + 1 )
then
292 ranks(n) = prc_next(prc_w)
295 if ( prc_has_n .and. prc_has_e )
then
297 if ( ranks(m) == prc_next(prc_ne) )
exit
299 if ( m == n + 1 )
then
301 ranks(n) = prc_next(prc_ne)
303 else if ( prc_has_n )
then
305 if ( ranks(m) == prc_next(prc_n) )
exit
307 if ( m == n + 1 )
then
309 ranks(n) = prc_next(prc_n)
311 else if ( prc_has_e )
then
313 if ( ranks(m) == prc_next(prc_e) )
exit
315 if ( m == n + 1 )
then
317 ranks(n) = prc_next(prc_e)
320 if ( prc_has_s .and. prc_has_w )
then
322 if ( ranks(m) == prc_next(prc_sw) )
exit
324 if ( m == n + 1 )
then
326 ranks(n) = prc_next(prc_sw)
328 else if ( prc_has_s )
then
330 if ( ranks(m) == prc_next(prc_s) )
exit
332 if ( m == n + 1 )
then
334 ranks(n) = prc_next(prc_s)
336 else if ( prc_has_w )
then
338 if ( ranks(m) == prc_next(prc_w) )
exit
340 if ( m == n + 1 )
then
342 ranks(n) = prc_next(prc_w)
345 if ( prc_has_s .and. prc_has_e )
then
347 if ( ranks(m) == prc_next(prc_se) )
exit
349 if ( m == n + 1 )
then
351 ranks(n) = prc_next(prc_se)
353 else if ( prc_has_s )
then
355 if ( ranks(m) == prc_next(prc_s) )
exit
357 if ( m == n + 1 )
then
359 ranks(n) = prc_next(prc_s)
361 else if ( prc_has_e )
then
363 if ( ranks(m) == prc_next(prc_e) )
exit
365 if ( m == n + 1 )
then
367 ranks(n) = prc_next(prc_e)
371 call mpi_group_incl( group, n, ranks, group_packns, ierr )
372 group_packns_created = .true.
374 group_packns_created = .false.
379 if ( prc_has_w )
then
381 ranks(n) = prc_next(prc_w)
383 if ( prc_has_e )
then
384 if ( n == 0 .or. ranks(1) .ne. prc_next(prc_e) )
then
386 ranks(n) = prc_next(prc_e)
391 call mpi_group_incl( group, n, ranks, group_packwe, ierr )
392 group_packwe_created = .true.
394 group_packwe_created = .false.
397 call mpi_group_free( group, ierr )
401 log_info(
"COMM_setup",*)
'Communication information'
402 log_info_cont(*)
'Maximum number of vars for one communication: ', comm_vsize_max
403 log_info_cont(*)
'All side is periodic? : ', comm_isallperiodic
414 KA, IA, JA, IHALO, JHALO, &
420 integer,
intent(in) :: ka, ia, ja, ihalo, jhalo
421 integer,
intent(out) :: gid
423 integer :: imax, jmax
424 integer :: nreq_ns, nreq_we, nreq_4c
426 type(mpi_info) :: win_info
427 integer(kind=MPI_ADDRESS_KIND) :: size
432 if ( .not. initialized )
then
433 log_error(
"COMM_regist",*)
'COMM_setup must be called before calling COMM_regist'
437 comm_gid = comm_gid + 1
438 if ( comm_gid > comm_gid_max )
then
439 log_error(
"COMM_regist",*)
'number of registed grid size exceeds the limit'
444 if ( ia < ihalo * 3 )
then
445 log_error(
"COMM_regist",*)
'IA must be >= IHALO * 3'
448 if ( ja < jhalo * 3 )
then
449 log_error(
"COMM_regist",*)
'JA must be >= JHALO * 3'
453 imax = ia - ihalo * 2
454 jmax = ja - jhalo * 2
458 ginfo(gid)%IS = ihalo + 1
459 ginfo(gid)%IE = ia - ihalo
460 ginfo(gid)%IHALO = ihalo
462 ginfo(gid)%JS = jhalo + 1
463 ginfo(gid)%JE = ja - jhalo
464 ginfo(gid)%JHALO = jhalo
470 if ( comm_use_mpi_pc )
then
471 ginfo(gid)%nreq_MAX = 2 * nreq_ns + 2 * nreq_we + 4 * nreq_4c + 1
473 ginfo(gid)%nreq_MAX = 2 * nreq_ns + 2 * nreq_we + 4 * nreq_4c
476 ginfo(gid)%size2D_NS4 = ia * jhalo
477 ginfo(gid)%size2D_NS8 = imax
478 ginfo(gid)%size2D_WE = jmax * ihalo
479 ginfo(gid)%size2D_4C = ihalo
481 allocate( ginfo(gid)%sendpack_P2WE(ginfo(gid)%size2D_WE * ka, 2, comm_vsize_max) )
485 allocate( ginfo(gid)%use_packbuf(comm_vsize_max) )
486 ginfo(gid)%use_packbuf(:) = .false.
490 allocate( ginfo(gid)%device_alloc(comm_vsize_max+comm_vsize_max_pc) )
491 allocate( ginfo(gid)%device_ptr(comm_vsize_max+1:comm_vsize_max_pc) )
492 ginfo(gid)%device_alloc(:) = .false.
495 if ( comm_use_mpi_onesided )
then
497 allocate( ginfo(gid)%recvbuf_WE(comm_vsize_max) )
498 allocate( ginfo(gid)%recvbuf_NS(comm_vsize_max) )
500 allocate( ginfo(gid)%win_packWE(comm_vsize_max) )
501 allocate( ginfo(gid)%win_packNS(comm_vsize_max) )
503 call mpi_info_create(win_info, ierr)
504 call mpi_info_set(win_info,
"no_locks",
"true", ierr)
505 call mpi_info_set(win_info,
"same_size",
"true", ierr)
506 call mpi_info_set(win_info,
"same_disp_unit",
"true", ierr)
508 do n = 1, comm_vsize_max
509 size = ginfo(gid)%size2D_WE * ka * 2 *
rp
512 real(
rp),
pointer :: pack(:)
513 call mpi_alloc_mem(
size, mpi_info_null, ginfo(gid)%recvbuf_WE(n), ierr)
514 call c_f_pointer(ginfo(gid)%recvbuf_WE(n), pack, (/ size/
rp /))
517 call mpi_win_create(pack,
size, ginfo(gid)%size2D_WE*ka*
rp, &
519 ginfo(gid)%win_packWE(n), ierr)
523 call mpi_win_allocate(
size, ginfo(gid)%size2D_WE*ka*
rp, &
525 ginfo(gid)%recvbuf_WE(n), ginfo(gid)%win_packWE(n), ierr)
527 size = ginfo(gid)%size2D_NS4 * ka * 2 *
rp
530 real(
rp),
pointer :: pack(:)
531 call mpi_alloc_mem(
size, mpi_info_null, ginfo(gid)%recvbuf_NS(n), ierr)
532 call c_f_pointer(ginfo(gid)%recvbuf_NS(n), pack, (/ size/
rp /))
535 call mpi_win_create(pack,
size,
rp, &
537 ginfo(gid)%win_packNS(n), ierr)
541 call mpi_win_allocate(
size, rp, &
543 ginfo(gid)%recvbuf_NS(n), ginfo(gid)%win_packNS(n), ierr)
547 call mpi_info_free(win_info, ierr)
549 do n = 1, comm_vsize_max
550 call mpi_win_post( group_packwe, mpi_mode_nostore, ginfo(gid)%win_packWE(n), ierr )
551 call mpi_win_post( group_packns, mpi_mode_nostore, ginfo(gid)%win_packNS(n), ierr )
554 ginfo(gid)%vars_num = 0
555 allocate( ginfo(gid)%packid(comm_vsize_max_pc) )
559 allocate( ginfo(gid)%recvpack_WE2P(ginfo(gid)%size2D_WE * ka, 2, comm_vsize_max) )
562 allocate( ginfo(gid)%req_cnt ( comm_vsize_max) )
563 allocate( ginfo(gid)%req_list(ginfo(gid)%nreq_MAX, comm_vsize_max) )
564 ginfo(gid)%req_cnt (:) = -1
565 ginfo(gid)%req_list(:,:) = mpi_request_null
567 if ( comm_use_mpi_pc )
then
568 ginfo(gid)%vars_num = 0
569 allocate( ginfo(gid)%packid(comm_vsize_max_pc) )
570 allocate( ginfo(gid)%preq_cnt ( comm_vsize_max_pc) )
571 allocate( ginfo(gid)%preq_list(ginfo(gid)%nreq_MAX+1,comm_vsize_max_pc) )
572 ginfo(gid)%preq_cnt (:) = -1
573 ginfo(gid)%preq_list(:,:) = mpi_request_null
580 log_info(
"COMM_regist",*)
'Register grid: id=', gid
581 log_info_cont(*)
'Data size of var (3D,including halo) [byte] : ', rp*ka*ia*ja
582 log_info_cont(*)
'Data size of halo [byte] : ', rp*ka*(2*ia*jhalo+2*jmax*ihalo)
583 log_info_cont(*)
'Ratio of halo against the whole 3D grid : ', real(2*ia*jhalo+2*jmax*ihalo) / real(ia*ja)
594 integer :: i, j, ierr
599 if ( comm_use_mpi_onesided )
then
601 do i = 1, comm_vsize_max
602 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(i), ierr )
603 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(i), ierr )
606 do i = 1, comm_vsize_max
607 call mpi_win_complete( ginfo(gid)%win_packWE(i), ierr )
608 call mpi_win_complete( ginfo(gid)%win_packNS(i), ierr )
611 do i = 1, comm_vsize_max
612 call mpi_win_wait( ginfo(gid)%win_packWE(i), ierr )
613 call mpi_win_wait( ginfo(gid)%win_packNS(i), ierr )
616 do i = 1, comm_vsize_max
617 call mpi_win_free(ginfo(gid)%win_packWE(i), ierr)
618 call mpi_win_free(ginfo(gid)%win_packNS(i), ierr)
621 real(rp),
pointer :: pack(:)
624 call c_f_pointer( ginfo(gid)%recvbuf_WE(i), pack, (/ginfo(gid)%size2D_WE*ka*2/) )
626 call c_f_pointer( ginfo(gid)%recvbuf_NS(i), pack, (/ginfo(gid)%size2D_NS4*ka*2/) )
629 call mpi_free_mem(ginfo(gid)%recvbuf_WE(i), ierr)
630 call mpi_free_mem(ginfo(gid)%recvbuf_NS(i), ierr)
634 deallocate( ginfo(gid)%packid )
635 ginfo(gid)%vars_num = 0
637 deallocate( ginfo(gid)%win_packWE )
638 deallocate( ginfo(gid)%win_packNS )
640 deallocate( ginfo(gid)%recvbuf_WE )
641 deallocate( ginfo(gid)%recvbuf_NS )
645 if ( comm_use_mpi_pc )
then
647 do j = 1, comm_vsize_max_pc
648 do i = 1, ginfo(gid)%nreq_MAX+1
649 if (ginfo(gid)%preq_list(i,j) .NE. mpi_request_null) &
650 call mpi_request_free(ginfo(gid)%preq_list(i,j), ierr)
653 if ( ginfo(gid)%device_alloc(j+comm_vsize_max) )
then
658 deallocate( ginfo(gid)%preq_cnt )
659 deallocate( ginfo(gid)%preq_list )
660 deallocate( ginfo(gid)%packid )
661 ginfo(gid)%vars_num = 0
665 deallocate( ginfo(gid)%req_cnt )
666 deallocate( ginfo(gid)%req_list )
669 deallocate( ginfo(gid)%recvpack_WE2P )
674 deallocate( ginfo(gid)%sendpack_P2WE )
676 deallocate( ginfo(gid)%use_packbuf )
681 if ( comm_use_mpi_onesided )
then
682 if ( group_packwe_created )
then
683 call mpi_group_free(group_packwe, ierr)
684 group_packwe_created = .false.
686 if ( group_packns_created )
then
687 call mpi_group_free(group_packns, ierr)
688 group_packns_created = .false.
695 initialized = .false.
711 character(len=*),
intent(in) :: varname
712 real(rp),
target,
intent(inout) :: var(:,:,:)
713 integer,
intent(inout) :: vid
715 integer,
intent(in),
optional :: gid
721 if ( .not. comm_use_mpi_pc )
return
723 if ( .not. acc_is_present(var) )
return
726 call prof_rapstart(
'COMM_init_pers', 2)
729 if (
present(gid) ) gid_ = gid
730 if ( gid_ > comm_gid_max )
then
731 log_error(
"COMM_vars_init",*)
'gid is invalid', gid_, comm_gid_max
735 if ( vid > comm_vsize_max )
then
736 log_error(
"COMM_vars_init",*)
'vid exceeds max', vid, comm_vsize_max, gid
740 ginfo(gid_)%vars_num = ginfo(gid_)%vars_num + 1
741 if ( ginfo(gid_)%vars_num > comm_vsize_max_pc )
then
742 log_error(
"COMM_vars_init",*)
'number of variable for MPI PC exceeds max', ginfo(gid_)%vars_num, comm_vsize_max_pc
746 vars_id = ginfo(gid_)%vars_num
747 ginfo(gid_)%packid(vars_id) = vid
750 if ( .not. acc_is_present(var) )
then
751 ginfo(gid_)%device_alloc(vars_id+comm_vsize_max) = .true.
752 ginfo(gid_)%device_ptr(vars_id*comm_vsize_max)%ptr => var
759 vid = vars_id + comm_vsize_max
761 log_info(
"COMM_vars_init",
'(1x,A,I3.3,A,I3.3,2A)')
'Initialize variable (grid ID = ', gid_,
'): ID = ', vid, &
762 ', name = ', trim(varname)
764 call prof_rapend (
'COMM_init_pers', 2)
780 character(len=*),
intent(in) :: varname
782 real(rp),
target,
intent(inout) :: var(:,:,:)
783 integer,
intent(inout) :: vid
785 integer,
intent(in),
optional :: gid
791 if ( .not. comm_use_mpi_pc )
return
793 if ( .not. acc_is_present(var) )
return
796 call prof_rapstart(
'COMM_init_pers', 2)
799 if (
present(gid) ) gid_ = gid
800 if ( gid_ > comm_gid_max )
then
801 log_error(
"COMM_vars8_init",*)
'gid is invalid', gid_, comm_gid_max
805 if ( vid > comm_vsize_max )
then
806 log_error(
"COMM_vars8_init",*)
'vid exceeds max', vid, comm_vsize_max
810 ginfo(gid_)%vars_num = ginfo(gid_)%vars_num + 1
811 if ( ginfo(gid_)%vars_num > comm_vsize_max_pc )
then
812 log_error(
"COMM_vars8_init",*)
'number of variable for MPI PC exceeds max', ginfo(gid_)%vars_num, comm_vsize_max_pc
816 vars_id = ginfo(gid_)%vars_num
817 ginfo(gid_)%packid(vars_id) = vid
820 if ( .not. acc_is_present(var) )
then
821 ginfo(gid_)%device_alloc(vars_id+comm_vsize_max) = .true.
822 ginfo(gid_)%device_ptr(vars_id+comm_vsize_max)%ptr => var
829 vid = vars_id + comm_vsize_max
831 log_info(
"COMM_vars8_init",
'(1x,A,I3.3,A,I3.3,2A)')
'Initialize variable (grid ID = ', gid_,
'): ID = ', vid, &
832 ', name = ', trim(varname)
834 call prof_rapend (
'COMM_init_pers', 2)
845 real(RP),
intent(inout) :: var(:,:,:)
847 integer,
intent(in) :: vid
849 integer,
intent(in),
optional :: gid
855 if (
present(gid) ) gid_ = gid
856 if ( gid_ > comm_gid_max )
then
857 log_error(
"COMM_vars_3D",*)
'gid is invalid', gid_, comm_gid_max
861 if ( vid > comm_vsize_max )
then
862 call prof_rapstart(
'COMM_vars_pers', 2)
864 call prof_rapend (
'COMM_vars_pers', 2)
866 call prof_rapstart(
'COMM_vars', 2)
867 if ( comm_use_mpi_onesided )
then
872 call prof_rapend (
'COMM_vars', 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_vars8_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 logical,
intent(in),
optional :: FILL_BND
928 integer,
intent(in),
optional :: gid
935 if (
present(fill_bnd) ) fill_bnd_ = fill_bnd
938 if (
present(gid) ) gid_ = gid
939 if ( gid_ > comm_gid_max )
then
940 log_error(
"COMM_wait_3D",*)
'gid is invalid', gid_, comm_gid_max
944 if ( vid > comm_vsize_max )
then
945 call prof_rapstart(
'COMM_wait_pers', 2)
947 call prof_rapend (
'COMM_wait_pers', 2)
949 call prof_rapstart(
'COMM_wait', 2)
950 if ( comm_use_mpi_onesided )
then
955 call prof_rapend (
'COMM_wait', 2)
959 if ( .NOT. comm_isallperiodic )
then
960 if ( fill_bnd_ )
then
961 call copy_boundary_3d(var, gid_)
974 real(RP),
intent(inout) :: var(:,:)
976 integer,
intent(in) :: vid
978 integer,
intent(in),
optional :: gid
984 if (
present(gid) ) gid_ = gid
985 if ( gid_ > comm_gid_max )
then
986 log_error(
"COMM_vars_2D",*)
'gid is invalid', gid_, comm_gid_max
990 call prof_rapstart(
'COMM_vars', 2)
991 if ( comm_use_mpi_onesided )
then
996 call prof_rapend (
'COMM_vars', 2)
1007 real(RP),
intent(inout) :: var(:,:)
1009 integer,
intent(in) :: vid
1011 integer,
intent(in),
optional :: gid
1017 if (
present(gid) ) gid_ = gid
1018 if ( gid_ > comm_gid_max )
then
1019 log_error(
"COMM_vars8_2D",*)
'gid is invalid', gid_, comm_gid_max
1023 call prof_rapstart(
'COMM_vars', 2)
1024 if ( comm_use_mpi_onesided )
then
1029 call prof_rapend (
'COMM_vars', 2)
1040 real(RP),
intent(inout) :: var(:,:)
1042 integer,
intent(in) :: vid
1044 logical,
intent(in),
optional :: FILL_BND
1045 integer,
intent(in),
optional :: gid
1047 logical :: FILL_BND_
1052 if (
present(fill_bnd) ) fill_bnd_ = fill_bnd
1055 if (
present(gid) ) gid_ = gid
1056 if ( gid_ > comm_gid_max )
then
1057 log_error(
"COMM_wait_2D",*)
'gid is invalid', gid_, comm_gid_max
1061 call prof_rapstart(
'COMM_wait', 2)
1062 if ( comm_use_mpi_onesided )
then
1067 call prof_rapend (
'COMM_wait', 2)
1069 if( .NOT. comm_isallperiodic )
then
1070 if ( fill_bnd_ )
then
1081 IA, IS, IE, JA, JS, JE, &
1088 integer,
intent(in) :: IA, IS, IE
1089 integer,
intent(in) :: JA, JS, JE
1090 real(RP),
intent(in) :: var(IA,JA)
1092 real(RP),
intent(out) :: varmean
1095 real(DP) :: stat1, stat2
1096 real(DP) :: allstat(2)
1112 stat1 = stat1 + var(i,j)
1113 stat2 = stat2 + 1.0_dp
1119 stat(:) = (/stat1, stat2/)
1123 call prof_rapstart(
'COMM_Allreduce', 2)
1124 call mpi_allreduce( stat, &
1127 mpi_double_precision, &
1131 call prof_rapend (
'COMM_Allreduce', 2)
1133 zerosw = 0.5_dp - sign(0.5_dp, allstat(1) - 1.e-12_dp )
1134 varmean = allstat(1) / ( allstat(2) + zerosw ) * ( 1.0_dp - zerosw )
1143 KA, IA, IS, IE, JA, JS, JE, &
1150 integer,
intent(in) :: KA
1151 integer,
intent(in) :: IA, IS, IE
1152 integer,
intent(in) :: JA, JS, JE
1153 real(RP),
intent(in) :: var(KA,IA,JA)
1155 real(RP),
intent(out) :: varmean(KA)
1157 real(DP) :: stat (KA,2)
1158 real(DP) :: allstat(KA,2)
1164 logical :: flag_device
1169 flag_device = acc_is_present(var)
1185 stat(k,1) = stat(k,1) + var(k,i,j)
1188 stat(k,2) = stat(k,2) + 1.0_dp
1199 call prof_rapstart(
'COMM_Allreduce', 2)
1201 call mpi_allreduce( stat, &
1204 mpi_double_precision, &
1209 call prof_rapend (
'COMM_Allreduce', 2)
1213 zerosw = 0.5_dp - sign(0.5_dp, allstat(k,2) - 1.e-12_dp )
1214 varmean(k) = allstat(k,1) / ( allstat(k,2) + zerosw ) * ( 1.0_dp - zerosw )
1234 integer,
intent(in) :: IA, JA
1235 real(RP),
intent(in) :: send(IA,JA)
1237 real(RP),
intent(out) :: recv(:,:,:)
1239 integer :: sendcounts, recvcounts
1243 sendcounts = ia * ja
1244 recvcounts = ia * ja
1247 call mpi_gather( send(:,:), &
1271 integer,
intent(in) :: KA, IA, JA
1272 real(RP),
intent(in) :: send(KA,IA,JA)
1274 real(RP),
intent(out) :: recv(:,:,:,:)
1276 integer :: sendcounts, recvcounts
1280 sendcounts = ka * ia * ja
1281 recvcounts = ka * ia * ja
1284 call mpi_gather( send(:,:,:), &
1305 real(SP),
intent(inout) :: var
1311 call prof_rapstart(
'COMM_Bcast', 2)
1315 call mpi_bcast( var, &
1322 call prof_rapend(
'COMM_Bcast', 2)
1331 real(DP),
intent(inout) :: var
1337 call prof_rapstart(
'COMM_Bcast', 2)
1341 call mpi_bcast( var, &
1343 mpi_double_precision, &
1348 call prof_rapend(
'COMM_Bcast', 2)
1360 integer,
intent(in) :: IA
1362 real(SP),
intent(inout) :: var(IA)
1368 call prof_rapstart(
'COMM_Bcast', 2)
1373 call mpi_bcast( var(:), &
1381 call prof_rapend(
'COMM_Bcast', 2)
1390 integer,
intent(in) :: IA
1392 real(DP),
intent(inout) :: var(IA)
1398 call prof_rapstart(
'COMM_Bcast', 2)
1403 call mpi_bcast( var(:), &
1405 mpi_double_precision, &
1411 call prof_rapend(
'COMM_Bcast', 2)
1423 integer,
intent(in) :: IA, JA
1425 real(SP),
intent(inout) :: var(IA,JA)
1431 call prof_rapstart(
'COMM_Bcast', 2)
1436 call mpi_bcast( var(:,:), &
1444 call prof_rapend(
'COMM_Bcast', 2)
1453 integer,
intent(in) :: IA, JA
1455 real(DP),
intent(inout) :: var(IA,JA)
1461 call prof_rapstart(
'COMM_Bcast', 2)
1466 call mpi_bcast( var(:,:), &
1468 mpi_double_precision, &
1474 call prof_rapend(
'COMM_Bcast', 2)
1486 integer,
intent(in) :: KA, IA, JA
1488 real(SP),
intent(inout) :: var(KA,IA,JA)
1494 call prof_rapstart(
'COMM_Bcast', 2)
1496 counts = ka * ia * ja
1499 call mpi_bcast( var(:,:,:), &
1507 call prof_rapend(
'COMM_Bcast', 2)
1516 integer,
intent(in) :: KA, IA, JA
1518 real(DP),
intent(inout) :: var(KA,IA,JA)
1524 call prof_rapstart(
'COMM_Bcast', 2)
1526 counts = ka * ia * ja
1529 call mpi_bcast( var(:,:,:), &
1531 mpi_double_precision, &
1537 call prof_rapend(
'COMM_Bcast', 2)
1550 integer,
intent(in) :: KA, IA, JA, NT
1552 real(SP),
intent(inout) :: var(KA,IA,JA,NT)
1558 call prof_rapstart(
'COMM_Bcast', 2)
1560 counts = ka * ia * ja * nt
1561 if ( ka>0 .AND. ia>0 .AND. ja>0 .AND. nt>0 .AND. &
1563 log_error(
"COMM_bcast_4D",*)
'counts overflow'
1568 call mpi_bcast( var(:,:,:,:), &
1576 call prof_rapend(
'COMM_Bcast', 2)
1586 integer,
intent(in) :: KA, IA, JA, NT
1588 real(DP),
intent(inout) :: var(KA,IA,JA,NT)
1594 call prof_rapstart(
'COMM_Bcast', 2)
1596 counts = ka * ia * ja * nt
1597 if ( ka>0 .AND. ia>0 .AND. ja>0 .AND. nt>0 .AND. &
1599 log_error(
"COMM_bcast_4D",*)
'counts overflow'
1604 call mpi_bcast( var(:,:,:,:), &
1606 mpi_double_precision, &
1612 call prof_rapend(
'COMM_Bcast', 2)
1624 integer,
intent(inout) :: var
1630 call prof_rapstart(
'COMM_Bcast', 2)
1634 call mpi_bcast( var, &
1641 call prof_rapend(
'COMM_Bcast', 2)
1653 integer,
intent(in) :: IA
1654 integer,
intent(inout) :: var(IA)
1660 call prof_rapstart(
'COMM_Bcast', 2)
1664 call mpi_bcast( var(:), &
1671 call prof_rapend(
'COMM_Bcast', 2)
1683 integer,
intent(in) :: IA, JA
1685 integer,
intent(inout) :: var(IA,JA)
1691 call prof_rapstart(
'COMM_Bcast', 2)
1696 call mpi_bcast( var(:,:), &
1704 call prof_rapend(
'COMM_Bcast', 2)
1716 logical,
intent(inout) :: var
1722 call prof_rapstart(
'COMM_Bcast', 2)
1726 call mpi_bcast( var, &
1733 call prof_rapend(
'COMM_Bcast', 2)
1745 integer,
intent(in) :: IA
1746 logical,
intent(inout) :: var(IA)
1752 call prof_rapstart(
'COMM_Bcast', 2)
1757 call mpi_bcast( var(:), &
1765 call prof_rapend(
'COMM_Bcast', 2)
1777 character(len=*),
intent(inout) :: var
1783 call prof_rapstart(
'COMM_Bcast', 2)
1787 call mpi_bcast( var, &
1794 call prof_rapend(
'COMM_Bcast', 2)
1807 real(RP),
intent(inout) :: var(:,:,:)
1808 integer,
intent(in) :: gid
1809 integer,
intent(in) :: vid
1810 integer,
intent(in) :: seqid
1812 integer :: ireq, tag, ierr
1816 integer :: JA, JS, JE, JHALO
1822 real(RP),
pointer :: ptr(:,:)
1825 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
1832 jhalo = ginfo(gid)%JHALO
1839 mpi_proc_null, tag+ginfo(gid)%nreq_max+1,
comm_world_t, &
1840 ginfo(gid)%preq_list(ginfo(gid)%nreq_max+1,vid), ierr )
1844 if ( prc_has_s )
then
1845 call mpi_recv_init( var(:,:,1:js-1), ginfo(gid)%size2D_NS4*ka,
comm_datatype_t, &
1846 prc_next(prc_s), tag+1,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1850 if ( prc_has_n )
then
1851 call mpi_recv_init( var(:,:,je+1:ja), ginfo(gid)%size2D_NS4*ka,
comm_datatype_t, &
1852 prc_next(prc_n), tag+2,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1857 ptr => ginfo(gid)%recvpack_WE2P(:,:,seqid)
1862 if ( prc_has_e )
then
1864 call mpi_recv_init( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
1866 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,2,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
1868 prc_next(prc_e), tag+3,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1872 if ( prc_has_w )
then
1874 call mpi_recv_init( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
1876 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,1,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
1878 prc_next(prc_w), tag+4,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1887 ptr => ginfo(gid)%sendpack_P2WE(:,:,seqid)
1891 if ( prc_has_w )
then
1893 call mpi_send_init( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
1895 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,1,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
1897 prc_next(prc_w), tag+3,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1901 if ( prc_has_e )
then
1903 call mpi_send_init( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
1905 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,2,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
1907 prc_next(prc_e), tag+4,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1913 if ( prc_has_n )
then
1914 call mpi_send_init( var(:,:,je-jhalo+1:je), ginfo(gid)%size2D_NS4*ka,
comm_datatype_t, &
1915 prc_next(prc_n), tag+1,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1919 if ( prc_has_s )
then
1920 call mpi_send_init( var(:,:,js:js+jhalo-1), ginfo(gid)%size2D_NS4*ka,
comm_datatype_t, &
1921 prc_next(prc_s), tag+2,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
1925 ginfo(gid)%preq_cnt(vid) = ireq - 1
1928 nreq = ginfo(gid)%preq_cnt(vid)
1930 call mpi_testall( nreq, ginfo(gid)%preq_list(1:nreq,vid), &
1931 flag, mpi_statuses_ignore, ierr )
1944 real(RP),
intent(inout) :: var(:,:,:)
1945 integer,
intent(in) :: gid
1946 integer,
intent(in) :: vid
1947 integer,
intent(in) :: seqid
1949 integer :: ireq, tag, tagc
1954 integer :: IS, IE, IHALO
1955 integer :: JA, JS, JE, JHALO
1961 real(RP),
pointer :: ptr(:,:)
1967 ihalo = ginfo(gid)%IHALO
1971 jhalo = ginfo(gid)%JHALO
1973 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
1981 mpi_proc_null, tag+ginfo(gid)%nreq_max+1,
comm_world_t, &
1982 ginfo(gid)%preq_list(ginfo(gid)%nreq_max+1,vid), ierr )
1985 if ( comm_isallperiodic )
then
1992 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
1993 prc_next(prc_se), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2000 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2001 prc_next(prc_sw), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2008 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2009 prc_next(prc_ne), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2015 do j = je+1, je+jhalo
2016 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2017 prc_next(prc_nw), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2024 ptr => ginfo(gid)%recvpack_WE2P(:,:,seqid)
2026 call mpi_recv_init( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2028 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,2,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2030 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2035 call mpi_recv_init( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2037 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,1,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2039 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2046 call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
2047 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2054 call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
2055 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2063 do j = je-jhalo+1, je
2064 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
2065 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2071 do j = js, js+jhalo-1
2072 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
2073 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2081 ptr => ginfo(gid)%sendpack_P2WE(:,:,seqid)
2083 call mpi_send_init( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2085 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,1,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2087 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2092 call mpi_send_init( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2094 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,2,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2096 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2101 do j = je-jhalo+1, je
2102 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2103 prc_next(prc_nw), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2109 do j = je-jhalo+1, je
2110 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2111 prc_next(prc_ne), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2117 do j = js, js+jhalo-1
2118 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2119 prc_next(prc_sw), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2125 do j = js, js+jhalo-1
2126 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2127 prc_next(prc_se), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2138 if ( prc_has_s .AND. prc_has_e )
then
2141 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2142 prc_next(prc_se), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2146 else if ( prc_has_s )
then
2149 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2150 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2154 else if ( prc_has_e )
then
2157 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2158 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2164 if ( prc_has_s .AND. prc_has_w )
then
2167 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2168 prc_next(prc_sw), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2172 else if ( prc_has_s )
then
2175 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2176 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2180 else if ( prc_has_w )
then
2183 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2184 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2190 if ( prc_has_n .AND. prc_has_e )
then
2193 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2194 prc_next(prc_ne), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2198 else if ( prc_has_n )
then
2201 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2202 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2206 else if ( prc_has_e )
then
2209 call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2210 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2216 if ( prc_has_n .AND. prc_has_w )
then
2219 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2220 prc_next(prc_nw), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2224 else if ( prc_has_n )
then
2227 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2228 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2232 else if ( prc_has_w )
then
2235 call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2236 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2242 ptr => ginfo(gid)%recvpack_WE2P(:,:,seqid)
2246 if ( prc_has_e )
then
2249 call mpi_recv_init( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2251 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,2,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2253 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2257 if ( prc_has_w )
then
2260 call mpi_recv_init( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2262 call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,1,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2264 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2270 if ( prc_has_s )
then
2273 call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
2274 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2280 if ( prc_has_n )
then
2283 call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
2284 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2292 if ( prc_has_n )
then
2294 do j = je-jhalo+1, je
2295 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
2296 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2302 if ( prc_has_s )
then
2304 do j = js, js+jhalo-1
2305 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
2306 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2313 ptr => ginfo(gid)%sendpack_P2WE(:,:,seqid)
2317 if ( prc_has_w )
then
2320 call mpi_send_init( ptr(:,1), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2322 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,1,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2324 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2328 if ( prc_has_e )
then
2331 call mpi_send_init( ptr(:,2), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2333 call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,2,seqid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2335 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2340 if ( prc_has_n .AND. prc_has_w )
then
2342 do j = je-jhalo+1, je
2343 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2344 prc_next(prc_nw), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2348 else if ( prc_has_n )
then
2350 do j = je-jhalo+1, je
2351 call mpi_send_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2352 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2356 else if ( prc_has_w )
then
2359 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2360 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2366 if ( prc_has_n .AND. prc_has_e )
then
2368 do j = je-jhalo+1, je
2369 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2370 prc_next(prc_ne), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2374 else if ( prc_has_n )
then
2376 do j = je-jhalo+1, je
2377 call mpi_send_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2378 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2382 else if ( prc_has_e )
then
2385 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2386 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2392 if ( prc_has_s .AND. prc_has_w )
then
2394 do j = js, js+jhalo-1
2395 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2396 prc_next(prc_sw), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2400 else if ( prc_has_s )
then
2402 do j = js, js+jhalo-1
2403 call mpi_send_init( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2404 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2408 else if ( prc_has_w )
then
2411 call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2412 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2418 if ( prc_has_s .AND. prc_has_e )
then
2420 do j = js, js+jhalo-1
2421 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2422 prc_next(prc_se), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2426 else if ( prc_has_s )
then
2428 do j = js, js+jhalo-1
2429 call mpi_send_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2430 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2434 else if ( prc_has_e )
then
2437 call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2438 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%preq_list(ireq,vid), ierr )
2447 ginfo(gid)%preq_cnt(vid) = ireq - 1
2450 nreq = ginfo(gid)%preq_cnt(vid)
2452 call mpi_testall( nreq, ginfo(gid)%preq_list(1:nreq,vid), &
2453 flag, mpi_statuses_ignore, ierr )
2468 real(RP),
intent(inout) :: var(:,:,:)
2469 integer,
intent(in) :: gid
2470 integer,
intent(in) :: vid
2473 integer :: ireq, tag
2476 integer :: IA, IS, IE
2477 integer :: JA, JS, JE
2478 integer :: IHALO, JHALO
2482 real(RP),
pointer :: ptr(:,:)
2483 logical :: flag_device
2487 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
2497 ihalo = ginfo(gid)%IHALO
2498 jhalo = ginfo(gid)%JHALO
2501 if ( ginfo(gid)%use_packbuf(vid) )
then
2502 log_error(
"vars_3D_mpi",*)
'packing buffer is already used', vid
2505 ginfo(gid)%use_packbuf(vid) = .true.
2509 flag_device = acc_is_present(var)
2516 if ( prc_has_s )
then
2517 call mpi_irecv( var(:,:,1:js-1), ginfo(gid)%size2D_NS4*ka,
comm_datatype_t, &
2518 prc_next(prc_s), tag+1,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2522 if ( prc_has_n )
then
2523 call mpi_irecv( var(:,:,je+1:ja), ginfo(gid)%size2D_NS4*ka,
comm_datatype_t, &
2524 prc_next(prc_n), tag+2,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2529 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
2533 if ( prc_has_e )
then
2537 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2539 prc_next(prc_e), tag+3,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2543 if ( prc_has_w )
then
2547 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2549 prc_next(prc_w), tag+4,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2559 call packwe_3d( ka, ia, is, ie, ja, js, je, &
2567 if ( prc_has_n )
then
2568 call mpi_isend( var(:,:,je-jhalo+1:je), ginfo(gid)%size2D_NS4*ka,
comm_datatype_t, &
2569 prc_next(prc_n), tag+1,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2573 if ( prc_has_s )
then
2574 call mpi_isend( var(:,:,js:js+jhalo-1), ginfo(gid)%size2D_NS4*ka,
comm_datatype_t, &
2575 prc_next(prc_s), tag+2,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2583 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
2588 if ( prc_has_w )
then
2592 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2594 prc_next(prc_w), tag+3,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2598 if ( prc_has_e )
then
2602 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2604 prc_next(prc_e), tag+4,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2611 ginfo(gid)%req_cnt(vid) = ireq - 1
2621 real(RP),
intent(inout) :: var(:,:,:)
2622 integer,
intent(in) :: gid
2623 integer,
intent(in) :: vid
2626 integer :: IA, IS, IE
2627 integer :: JA, JS, JE
2628 integer :: IHALO, JHALO
2630 integer(kind=MPI_ADDRESS_KIND) :: disp
2634 real(RP),
pointer :: ptr(:,:)
2645 ihalo = ginfo(gid)%IHALO
2646 jhalo = ginfo(gid)%JHALO
2650 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
2651 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
2655 call packwe_3d( ka, ia, is, ie, ja, js, je, &
2663 if ( prc_has_n )
then
2665 call mpi_put( var(:,:,je-jhalo+1:je), ginfo(gid)%size2D_NS4*ka,
comm_datatype_t, &
2667 ginfo(gid)%win_packNS(vid), ierr )
2670 if ( prc_has_s )
then
2671 disp = ka * ia * jhalo
2672 call mpi_put( var(:,:,js:js+jhalo-1), ginfo(gid)%size2D_NS4*ka,
comm_datatype_t, &
2674 ginfo(gid)%win_packNS(vid), ierr )
2681 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
2687 if ( prc_has_w )
then
2692 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2695 ginfo(gid)%win_packWE(vid), ierr )
2698 if ( prc_has_e )
then
2703 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2706 ginfo(gid)%win_packWE(vid), ierr )
2712 call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
2713 call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
2727 real(RP),
intent(inout) :: var(:,:,:)
2728 integer,
intent(in) :: gid
2729 integer,
intent(in) :: vid
2731 integer :: ireq, tag, tagc
2734 integer :: IA, IS, IE
2735 integer :: JA, JS, JE
2736 integer :: IHALO, JHALO
2741 real(RP),
pointer :: ptr(:,:)
2742 logical :: flag_device
2746 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
2757 ihalo = ginfo(gid)%IHALO
2758 jhalo = ginfo(gid)%JHALO
2761 if ( ginfo(gid)%use_packbuf(vid) )
then
2762 log_error(
"vars8_3D_mpi",*)
'packing buffer is already used', vid
2765 ginfo(gid)%use_packbuf(vid) = .true.
2769 flag_device = acc_is_present(var)
2772 if ( comm_isallperiodic )
then
2781 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2782 prc_next(prc_se), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2789 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2790 prc_next(prc_sw), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2797 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2798 prc_next(prc_ne), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2805 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2806 prc_next(prc_nw), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2811 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
2819 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2821 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2828 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2830 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2837 call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
2838 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2845 call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
2846 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2854 do j = je-jhalo+1, je
2855 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
2856 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2862 do j = js, js+jhalo-1
2863 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
2864 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2873 call packwe_3d( ka, ia, is, ie, ja, js, je, &
2881 do j = je-jhalo+1, je
2882 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2883 prc_next(prc_nw), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2889 do j = je-jhalo+1, je
2890 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2891 prc_next(prc_ne), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2897 do j = js, js+jhalo-1
2898 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2899 prc_next(prc_sw), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2905 do j = js, js+jhalo-1
2906 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2907 prc_next(prc_se), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2915 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
2924 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2926 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2933 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
2935 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2948 if ( prc_has_s .AND. prc_has_e )
then
2951 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2952 prc_next(prc_se), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2956 else if ( prc_has_s )
then
2959 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2960 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2964 else if ( prc_has_e )
then
2967 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2968 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2974 if ( prc_has_s .AND. prc_has_w )
then
2977 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2978 prc_next(prc_sw), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2982 else if ( prc_has_s )
then
2985 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2986 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
2990 else if ( prc_has_w )
then
2993 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
2994 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3000 if ( prc_has_n .AND. prc_has_e )
then
3003 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3004 prc_next(prc_ne), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3008 else if ( prc_has_n )
then
3011 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3012 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3016 else if ( prc_has_e )
then
3019 call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3020 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3026 if ( prc_has_n .AND. prc_has_w )
then
3029 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3030 prc_next(prc_nw), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3034 else if ( prc_has_n )
then
3037 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3038 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3042 else if ( prc_has_w )
then
3045 call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3046 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3052 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
3056 if ( prc_has_e )
then
3061 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
3063 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3067 if ( prc_has_w )
then
3072 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
3074 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3080 if ( prc_has_s )
then
3083 call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
3084 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3090 if ( prc_has_n )
then
3093 call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
3094 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3102 if ( prc_has_n )
then
3104 do j = je-jhalo+1, je
3105 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
3106 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3112 if ( prc_has_s )
then
3114 do j = js, js+jhalo-1
3115 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
3116 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3126 call packwe_3d( ka, ia, is, ie, ja, js, je, &
3133 if ( prc_has_n .AND. prc_has_w )
then
3135 do j = je-jhalo+1, je
3136 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3137 prc_next(prc_nw), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3141 else if ( prc_has_n )
then
3143 do j = je-jhalo+1, je
3144 call mpi_isend( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3145 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3149 else if ( prc_has_w )
then
3152 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3153 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3159 if ( prc_has_n .AND. prc_has_e )
then
3161 do j = je-jhalo+1, je
3162 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3163 prc_next(prc_ne), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3167 else if ( prc_has_n )
then
3169 do j = je-jhalo+1, je
3170 call mpi_isend( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3171 prc_next(prc_n), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3175 else if ( prc_has_e )
then
3178 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3179 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3185 if ( prc_has_s .AND. prc_has_w )
then
3187 do j = js, js+jhalo-1
3188 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3189 prc_next(prc_sw), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3193 else if ( prc_has_s )
then
3195 do j = js, js+jhalo-1
3196 call mpi_isend( var(1,1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3197 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3201 else if ( prc_has_w )
then
3204 call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3205 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3211 if ( prc_has_s .AND. prc_has_e )
then
3213 do j = js, js+jhalo-1
3214 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3215 prc_next(prc_se), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3219 else if ( prc_has_s )
then
3221 do j = js, js+jhalo-1
3222 call mpi_isend( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3223 prc_next(prc_s), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3227 else if ( prc_has_e )
then
3230 call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3231 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3240 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3246 if ( prc_has_w )
then
3251 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
3253 prc_next(prc_w), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3257 if ( prc_has_e )
then
3262 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
3264 prc_next(prc_e), tag+tagc,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3273 ginfo(gid)%req_cnt(vid) = ireq - 1
3283 real(RP),
intent(inout) :: var(:,:,:)
3284 integer,
intent(in) :: gid
3285 integer,
intent(in) :: vid
3288 integer :: IA, IS, IE
3289 integer :: JA, JS, JE
3290 integer :: IHALO, JHALO
3292 integer(kind=MPI_ADDRESS_KIND) :: disp
3297 real(RP),
pointer :: ptr(:,:)
3308 ihalo = ginfo(gid)%IHALO
3309 jhalo = ginfo(gid)%JHALO
3312 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
3313 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
3315 if ( comm_isallperiodic )
then
3321 do j = je-jhalo+1, je
3322 disp = ka * ( ihalo + ia * ( j - je+jhalo-1 ) )
3323 call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
3325 ginfo(gid)%win_packNS(vid), ierr )
3328 do j = js, js+jhalo-1
3329 disp = ka * ( ihalo + ia * ( j - js + jhalo ) )
3330 call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
3332 ginfo(gid)%win_packNS(vid), ierr )
3339 call packwe_3d( ka, ia, is, ie, ja, js, je, &
3345 do j = je-jhalo+1, je
3346 disp = ka * ( ie + ia * ( j - je+jhalo-1 ) )
3347 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3349 ginfo(gid)%win_packNS(vid), ierr )
3352 do j = je-jhalo+1, je
3353 disp = ka * ( ia * ( j - je+jhalo-1 ) )
3354 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3356 ginfo(gid)%win_packNS(vid), ierr )
3359 do j = js, js+jhalo-1
3360 disp = ka * ( ie + ia * ( j - js + jhalo ) )
3361 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3363 ginfo(gid)%win_packNS(vid), ierr )
3366 do j = js, js+jhalo-1
3367 disp = ka * ( ia * ( j - js + jhalo ) )
3368 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3370 ginfo(gid)%win_packNS(vid), ierr )
3376 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3385 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
3388 ginfo(gid)%win_packWE(vid), ierr )
3394 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
3397 ginfo(gid)%win_packWE(vid), ierr )
3408 if ( prc_has_n )
then
3409 do j = je-jhalo+1, je
3410 disp = ka * ( ihalo + ia * ( j - je+jhalo-1 ) )
3411 call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
3413 ginfo(gid)%win_packNS(vid), ierr )
3417 if ( prc_has_s )
then
3418 do j = js, js+jhalo-1
3419 disp = ka * ( ihalo + ia * ( j - js + jhalo ) )
3420 call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka,
comm_datatype_t, &
3422 ginfo(gid)%win_packNS(vid), ierr )
3430 call packwe_3d( ka, ia, is, ie, ja, js, je, &
3437 if ( prc_has_n .AND. prc_has_w )
then
3438 do j = je-jhalo+1, je
3439 disp = ka * ( ie + ia * ( j - je+jhalo-1 ) )
3440 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3442 ginfo(gid)%win_packNS(vid), ierr )
3444 else if ( prc_has_n )
then
3445 do j = je-jhalo+1, je
3446 disp = ka * ( ia * ( j - je+jhalo-1 ) )
3449 ginfo(gid)%win_packNS(vid), ierr )
3451 else if ( prc_has_w )
then
3453 disp = ka * ( ie + ia * ( j - je-1 + jhalo ) )
3454 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3456 ginfo(gid)%win_packNS(vid), ierr )
3460 if ( prc_has_n .AND. prc_has_e )
then
3461 do j = je-jhalo+1, je
3462 disp = ka * ( ia * ( j - je+jhalo-1 ) )
3463 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3465 ginfo(gid)%win_packNS(vid), ierr )
3467 else if ( prc_has_n )
then
3468 do j = je-jhalo+1, je
3469 disp = ka * ( ie + ia * ( j - je+jhalo-1 ) )
3470 call mpi_put( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3472 ginfo(gid)%win_packNS(vid), ierr )
3474 else if ( prc_has_e )
then
3476 disp = ka * ia * ( j - je-1 + jhalo )
3477 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3479 ginfo(gid)%win_packNS(vid), ierr )
3483 if ( prc_has_s .AND. prc_has_w )
then
3484 do j = js, js+jhalo-1
3485 disp = ka * ( ie + ia * ( j - js + jhalo ) )
3486 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3488 ginfo(gid)%win_packNS(vid), ierr )
3490 else if ( prc_has_s )
then
3491 do j = js, js+jhalo-1
3492 disp = ka * ( ia * ( j - js + jhalo ) )
3495 ginfo(gid)%win_packNS(vid), ierr )
3497 else if ( prc_has_w )
then
3499 disp = ka * ( ie + ia * (j-1) )
3500 call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3502 ginfo(gid)%win_packNS(vid), ierr )
3506 if ( prc_has_s .AND. prc_has_e )
then
3507 do j = js, js+jhalo-1
3508 disp = ka * ( ia * ( j - js + jhalo ) )
3509 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3511 ginfo(gid)%win_packNS(vid), ierr )
3513 else if ( prc_has_s )
then
3514 do j = js, js+jhalo-1
3515 disp = ka * ( ie + ia * ( j - js + jhalo ) )
3516 call mpi_put( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3518 ginfo(gid)%win_packNS(vid), ierr )
3520 else if ( prc_has_e )
then
3522 disp = ka * ( ia * ( j - 1 ) )
3523 call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka,
comm_datatype_t, &
3525 ginfo(gid)%win_packNS(vid), ierr )
3532 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3538 if ( prc_has_w )
then
3543 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
3546 ginfo(gid)%win_packWE(vid), ierr )
3549 if ( prc_has_e )
then
3554 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka,
comm_datatype_t, &
3557 ginfo(gid)%win_packWE(vid), ierr )
3565 call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
3566 call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
3580 real(RP),
intent(inout) :: var(:,:)
3581 integer,
intent(in) :: gid
3582 integer,
intent(in) :: vid
3584 integer :: IA, IS, IE
3585 integer :: JA, JS, JE
3586 integer :: IHALO, JHALO
3588 integer :: ireq, tag
3591 real(RP),
pointer :: ptr(:,:)
3592 logical :: flag_device
3602 ihalo = ginfo(gid)%IHALO
3603 jhalo = ginfo(gid)%JHALO
3605 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
3609 if ( ginfo(gid)%use_packbuf(vid) )
then
3610 log_error(
"vars_2D_mpi",*)
'packing buffer is already used', vid
3613 ginfo(gid)%use_packbuf(vid) = .true.
3617 flag_device = acc_is_present(var)
3624 if ( prc_has_s )
then
3625 call mpi_irecv( var(:,1:js-1), ginfo(gid)%size2D_NS4,
comm_datatype_t, &
3626 prc_next(prc_s), tag+1,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3630 if ( prc_has_n )
then
3631 call mpi_irecv( var(:,je+1:ja), ginfo(gid)%size2D_NS4,
comm_datatype_t, &
3632 prc_next(prc_n), tag+2,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3638 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
3642 if ( prc_has_e )
then
3646 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE,
comm_datatype_t, &
3648 prc_next(prc_e), tag+3,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3652 if ( prc_has_w )
then
3656 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE,
comm_datatype_t, &
3658 prc_next(prc_w), tag+4,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3669 call packwe_2d( ia, is, ie, ja, js, je, &
3674 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3679 if ( prc_has_w )
then
3683 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE,
comm_datatype_t, &
3685 prc_next(prc_w), tag+3,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3689 if ( prc_has_e )
then
3693 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE,
comm_datatype_t, &
3695 prc_next(prc_e), tag+4,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3706 if ( prc_has_n )
then
3707 call mpi_isend( var(:,je-jhalo+1:je), ginfo(gid)%size2D_NS4,
comm_datatype_t, &
3708 prc_next(prc_n), tag+1,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3712 if ( prc_has_s )
then
3713 call mpi_isend( var(:,js:js+jhalo-1), ginfo(gid)%size2D_NS4,
comm_datatype_t, &
3714 prc_next(prc_s), tag+2,
comm_world_t, ginfo(gid)%req_list(ireq,vid), ierr )
3720 ginfo(gid)%req_cnt(vid) = ireq - 1
3730 real(RP),
intent(inout) :: var(:,:)
3731 integer,
intent(in) :: gid
3732 integer,
intent(in) :: vid
3734 integer :: IA, IS, IE
3735 integer :: JA, JS, JE
3736 integer :: IHALO, JHALO
3738 integer(kind=MPI_ADDRESS_KIND) :: disp
3742 real(RP),
pointer :: ptr(:,:)
3752 ihalo = ginfo(gid)%IHALO
3753 jhalo = ginfo(gid)%JHALO
3757 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
3758 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
3764 call packwe_2d( ia, is, ie, ja, js, je, &
3769 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3774 if ( prc_has_w )
then
3779 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE,
comm_datatype_t, &
3782 ginfo(gid)%win_packWE(vid), ierr )
3785 if ( prc_has_e )
then
3790 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE,
comm_datatype_t, &
3793 ginfo(gid)%win_packWE(vid), ierr )
3803 if ( prc_has_n )
then
3805 call mpi_put( var(:,je-jhalo+1:je), ginfo(gid)%size2D_NS4,
comm_datatype_t, &
3807 ginfo(gid)%win_packNS(vid), ierr )
3810 if ( prc_has_s )
then
3812 call mpi_put( var(:,js:js+jhalo-1), ginfo(gid)%size2D_NS4,
comm_datatype_t, &
3814 ginfo(gid)%win_packNS(vid), ierr )
3819 call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
3820 call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
3834 real(RP),
intent(inout) :: var(:,:)
3835 integer,
intent(in) :: gid
3836 integer,
intent(in) :: vid
3838 integer :: IA, IS, IE
3839 integer :: JA, JS, JE
3840 integer :: IHALO, JHALO
3842 integer :: ireq, tag, tagc
3847 real(RP),
pointer :: ptr(:,:)
3848 logical :: flag_device
3858 ihalo = ginfo(gid)%IHALO
3859 jhalo = ginfo(gid)%JHALO
3861 tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
3865 if ( ginfo(gid)%use_packbuf(vid) )
then
3866 log_error(
"vars8_2D_mpi",*)
'packing buffer is already used', vid
3869 ginfo(gid)%use_packbuf(vid) = .true.
3873 flag_device = acc_is_present(var)
3876 if ( comm_isallperiodic )
then
3885 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
3894 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
3903 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
3912 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
3919 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
3924 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE, &
3926 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE, &
3933 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE, &
3935 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE, &
3945 call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
3954 call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
3966 do j = je-jhalo+1, je
3967 call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
3976 do j = js, js+jhalo-1
3977 call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
3988 call packwe_2d( ia, is, ie, ja, js, je, &
3994 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4000 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE, &
4002 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, &
4010 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE, &
4012 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, &
4021 do j = je-jhalo+1, je
4022 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4031 do j = je-jhalo+1, je
4032 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4041 do j = js, js+jhalo-1
4042 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4051 do j = js, js+jhalo-1
4052 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4071 if ( prc_has_s .AND. prc_has_e )
then
4074 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4080 else if ( prc_has_s )
then
4083 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4089 else if ( prc_has_e )
then
4092 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4101 if ( prc_has_s .AND. prc_has_w )
then
4104 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4110 else if ( prc_has_s )
then
4113 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4119 else if ( prc_has_w )
then
4122 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4131 if ( prc_has_n .AND. prc_has_e )
then
4133 do j = je+1, je+jhalo
4134 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4140 else if ( prc_has_n )
then
4143 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4149 else if ( prc_has_e )
then
4152 call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4161 if ( prc_has_n .AND. prc_has_w )
then
4164 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4170 else if ( prc_has_n )
then
4173 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4179 else if ( prc_has_w )
then
4182 call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4191 ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
4195 if ( prc_has_e )
then
4197 call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE, &
4199 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE, &
4207 if ( prc_has_w )
then
4209 call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE, &
4211 call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE, &
4222 if ( prc_has_s )
then
4225 call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
4234 if ( prc_has_n )
then
4237 call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
4249 if ( prc_has_n )
then
4251 do j = je-jhalo+1, je
4252 call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
4261 if ( prc_has_s )
then
4263 do j = js, js+jhalo-1
4264 call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
4276 call packwe_2d( ia, is, ie, ja, js, je, &
4282 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4287 if ( prc_has_w )
then
4289 call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE, &
4291 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, &
4299 if ( prc_has_e )
then
4301 call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE, &
4303 call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, &
4312 if ( prc_has_n .AND. prc_has_w )
then
4314 do j = je-jhalo+1, je
4315 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4321 else if ( prc_has_n )
then
4323 do j = je-jhalo+1, je
4324 call mpi_isend( var(1,j), ginfo(gid)%size2D_4C, &
4330 else if ( prc_has_w )
then
4333 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4342 if ( prc_has_n .AND. prc_has_e )
then
4344 do j = je-jhalo+1, je
4345 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4351 else if ( prc_has_n )
then
4353 do j = je-jhalo+1, je
4354 call mpi_isend( var(ie+1,j), ginfo(gid)%size2D_4C, &
4360 else if ( prc_has_e )
then
4363 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4372 if ( prc_has_s .AND. prc_has_w )
then
4374 do j = js, js+jhalo-1
4375 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4381 else if ( prc_has_s )
then
4383 do j = js, js+jhalo-1
4384 call mpi_isend( var(1,j), ginfo(gid)%size2D_4C, &
4390 else if ( prc_has_w )
then
4393 call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4402 if ( prc_has_s .AND. prc_has_e )
then
4404 do j = js, js+jhalo-1
4405 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4411 else if ( prc_has_s )
then
4413 do j = js, js+jhalo-1
4414 call mpi_isend( var(ie+1,j), ginfo(gid)%size2D_4C, &
4420 else if ( prc_has_e )
then
4423 call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4437 ginfo(gid)%req_cnt(vid) = ireq - 1
4447 real(RP),
intent(inout) :: var(:,:)
4448 integer,
intent(in) :: gid
4449 integer,
intent(in) :: vid
4451 integer :: IA, IS, IE, IHALO
4452 integer :: JA, JS, JE, JHALO
4454 integer(kind=MPI_ADDRESS_KIND) :: disp
4459 real(RP),
pointer :: ptr(:,:)
4466 ihalo = ginfo(gid)%IHALO
4470 jhalo = ginfo(gid)%JHALO
4474 call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
4475 call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
4477 if ( comm_isallperiodic )
then
4485 do j = je-jhalo+1, je
4486 disp = ihalo + ia * ( j - je+jhalo-1 )
4489 ginfo(gid)%win_packNS(vid), ierr )
4492 do j = js, js+jhalo-1
4493 disp = ihalo + ia * ( j - js + jhalo )
4496 ginfo(gid)%win_packNS(vid), ierr )
4503 call packwe_2d( ia, is, ie, ja, js, je, &
4509 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4518 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE,
comm_datatype_t, &
4521 ginfo(gid)%win_packWE(vid), ierr )
4527 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE,
comm_datatype_t, &
4530 ginfo(gid)%win_packWE(vid), ierr )
4533 do j = je-jhalo+1, je
4534 disp = ie + ia * ( j - je+jhalo-1 )
4537 ginfo(gid)%win_packNS(vid), ierr )
4540 do j = je-jhalo+1, je
4541 disp = ia * ( j - je+jhalo-1 )
4542 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C,
comm_datatype_t, &
4544 ginfo(gid)%win_packNS(vid), ierr )
4547 do j = js, js+jhalo-1
4548 disp = ie + ia * ( j - js + jhalo )
4551 ginfo(gid)%win_packNS(vid), ierr )
4554 do j = js, js+jhalo-1
4555 disp = ia * ( j - js + jhalo )
4556 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C,
comm_datatype_t, &
4558 ginfo(gid)%win_packNS(vid), ierr )
4570 if ( prc_has_n )
then
4571 do j = je-jhalo+1, je
4572 disp = ihalo + ia * ( j - je+jhalo-1 )
4575 ginfo(gid)%win_packNS(vid), ierr )
4579 if ( prc_has_s )
then
4580 do j = js, js+jhalo-1
4581 disp = ihalo + ia * ( j - js + jhalo )
4584 ginfo(gid)%win_packNS(vid), ierr )
4592 call packwe_2d( ia, is, ie, ja, js, je, &
4598 ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4603 if ( prc_has_w )
then
4608 call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE,
comm_datatype_t, &
4611 ginfo(gid)%win_packWE(vid), ierr )
4614 if ( prc_has_e )
then
4619 call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE,
comm_datatype_t, &
4622 ginfo(gid)%win_packWE(vid), ierr )
4626 if ( prc_has_n .AND. prc_has_w )
then
4627 do j = je-jhalo+1, je
4628 disp = ie + ia * ( j - je+jhalo-1 )
4631 ginfo(gid)%win_packNS(vid), ierr )
4633 else if ( prc_has_n )
then
4634 do j = je-jhalo+1, je
4635 disp = ia * ( j - je+jhalo-1 )
4638 ginfo(gid)%win_packNS(vid), ierr )
4640 else if ( prc_has_w )
then
4642 disp = ie + ia * ( j - je-1 + jhalo )
4645 ginfo(gid)%win_packNS(vid), ierr )
4649 if ( prc_has_n .AND. prc_has_e )
then
4650 do j = je-jhalo+1, je
4651 disp = ia * ( j - je+jhalo-1 )
4652 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C,
comm_datatype_t, &
4654 ginfo(gid)%win_packNS(vid), ierr )
4656 else if ( prc_has_n )
then
4657 do j = je-jhalo+1, je
4658 disp = ie + ia * ( j - je+jhalo-1 )
4661 ginfo(gid)%win_packNS(vid), ierr )
4663 else if ( prc_has_e )
then
4665 disp = ia * ( j - je-1 + jhalo )
4666 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C,
comm_datatype_t, &
4668 ginfo(gid)%win_packNS(vid), ierr )
4672 if ( prc_has_s .AND. prc_has_w )
then
4673 do j = js, js+jhalo-1
4674 disp = ie + ia * ( j - js + jhalo )
4677 ginfo(gid)%win_packNS(vid), ierr )
4679 else if ( prc_has_s )
then
4680 do j = js, js+jhalo-1
4681 disp = ia * ( j - js + jhalo )
4684 ginfo(gid)%win_packNS(vid), ierr )
4686 else if ( prc_has_w )
then
4688 disp = ie + ia * ( j - 1 )
4691 ginfo(gid)%win_packNS(vid), ierr )
4695 if ( prc_has_s .AND. prc_has_e )
then
4696 do j = js, js+jhalo-1
4697 disp = ia * ( j - js + jhalo )
4698 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C,
comm_datatype_t, &
4700 ginfo(gid)%win_packNS(vid), ierr )
4702 else if ( prc_has_s )
then
4703 do j = js, js+jhalo-1
4704 disp = ie + ia * ( j - js + jhalo )
4707 ginfo(gid)%win_packNS(vid), ierr )
4709 else if ( prc_has_e )
then
4711 disp = ia * ( j - 1 )
4712 call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C,
comm_datatype_t, &
4714 ginfo(gid)%win_packNS(vid), ierr )
4723 call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
4724 call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
4737 real(RP),
intent(inout) :: var(:,:,:)
4738 integer,
intent(in) :: gid
4739 integer,
intent(in) :: vid
4742 integer :: IA, IS, IE
4743 integer :: JA, JS, JE
4750 if ( ginfo(gid)%use_packbuf(ginfo(gid)%packid(vid)) )
then
4751 log_error(
"vars_3D_mpi_pc",*)
'packing buffer is already used', vid, ginfo(gid)%packid(vid)
4754 ginfo(gid)%use_packbuf(ginfo(gid)%packid(vid)) = .true.
4758 if ( ginfo(gid)%device_alloc(vid+comm_vsize_max) )
then
4771 ihalo = ginfo(gid)%IHALO
4772 call packwe_3d( ka, ia, is, ie, ja, js, je, &
4774 var, gid, ginfo(gid)%packid(vid))
4778 call mpi_startall(ginfo(gid)%preq_cnt(vid), ginfo(gid)%preq_list(1:ginfo(gid)%preq_cnt(vid),vid), ierr)
4787 real(RP),
intent(inout) :: var(:,:,:)
4788 integer,
intent(in) :: gid
4789 integer,
intent(in) :: vid
4792 integer :: IA, IS, IE
4793 integer :: JA, JS, JE
4800 call mpi_waitall( ginfo(gid)%req_cnt (vid), &
4801 ginfo(gid)%req_list(1:ginfo(gid)%req_cnt(vid),vid), &
4802 mpi_statuses_ignore, &
4812 ihalo = ginfo(gid)%IHALO
4813 call unpackwe_3d( ka, ia, is, ie, ja, js, je, &
4815 var, ginfo(gid)%recvpack_WE2P(:,:,vid) )
4820 ginfo(gid)%use_packbuf(vid) = .false.
4830 real(RP),
intent(inout) :: var(:,:,:)
4831 integer,
intent(in) :: gid
4832 integer,
intent(in) :: vid
4835 integer :: IA, IS, IE
4836 integer :: JA, JS, JE
4837 integer :: IHALO, JHALO
4839 real(RP),
pointer :: pack(:)
4851 ihalo = ginfo(gid)%IHALO
4852 jhalo = ginfo(gid)%JHALO
4854 call mpi_win_wait( ginfo(gid)%win_packWE(vid), ierr )
4856 call c_f_pointer( ginfo(gid)%recvbuf_WE(vid), pack, (/ginfo(gid)%size2D_WE*ka*2/) )
4857 call unpackwe_3d( ka, ia, is, ie, ja, js, je, &
4862 call mpi_win_wait( ginfo(gid)%win_packNS(vid), ierr )
4863 call c_f_pointer( ginfo(gid)%recvbuf_NS(vid), pack, (/ginfo(gid)%size2D_NS4*ka*2/) )
4864 call unpackns_3d( ka, ia, is, ie, ja, js, je, &
4870 call mpi_win_post( group_packwe, mpi_mode_nostore, ginfo(gid)%win_packWE(vid), ierr )
4871 call mpi_win_post( group_packns, mpi_mode_nostore, ginfo(gid)%win_packNS(vid), ierr )
4880 real(RP),
intent(inout) :: var(:,:)
4881 integer,
intent(in) :: gid
4882 integer,
intent(in) :: vid
4885 integer :: IA, IS, IE
4886 integer :: JA, JS, JE
4893 call mpi_waitall( ginfo(gid)%req_cnt(vid), &
4894 ginfo(gid)%req_list(1:ginfo(gid)%req_cnt(vid),vid), &
4895 mpi_statuses_ignore, &
4905 ihalo = ginfo(gid)%IHALO
4906 call unpackwe_2d( ka, ia, is, ie, ja, js, je, &
4908 var, ginfo(gid)%recvpack_WE2P(:,:,vid) )
4912 ginfo(gid)%use_packbuf(vid) = .false.
4922 real(RP),
intent(inout) :: var(:,:)
4923 integer,
intent(in) :: gid
4924 integer,
intent(in) :: vid
4927 integer :: IA, IS, IE
4928 integer :: JA, JS, JE
4929 integer :: IHALO, JHALO
4931 real(RP),
pointer :: pack(:)
4943 ihalo = ginfo(gid)%IHALO
4944 jhalo = ginfo(gid)%JHALO
4946 call mpi_win_wait( ginfo(gid)%win_packWE(vid), ierr )
4948 call c_f_pointer( ginfo(gid)%recvbuf_WE(vid), pack, (/ginfo(gid)%size2D_WE*ka*2/) )
4949 call unpackwe_2d( ka, ia, is, ie, ja, js, je, &
4954 call mpi_win_wait( ginfo(gid)%win_packNS(vid), ierr )
4955 call c_f_pointer( ginfo(gid)%recvbuf_NS(vid), pack, (/ginfo(gid)%size2D_NS4*ka*2/) )
4956 call unpackns_2d( ia, is, ie, ja, js, je, &
4960 call mpi_win_post( group_packwe, mpi_mode_nostore, ginfo(gid)%win_packWE(vid), ierr )
4961 call mpi_win_post( group_packns, mpi_mode_nostore, ginfo(gid)%win_packNS(vid), ierr )
4970 real(RP),
intent(inout) :: var(:,:,:)
4971 integer,
intent(in) :: gid
4972 integer,
intent(in) :: vid
4975 integer :: IA, IS, IE
4976 integer :: JA, JS, JE
4983 call mpi_waitall( ginfo(gid)%preq_cnt (vid), &
4984 ginfo(gid)%preq_list(1:ginfo(gid)%preq_cnt(vid),vid), &
4985 mpi_statuses_ignore, &
4995 ihalo = ginfo(gid)%IHALO
4996 pid = ginfo(gid)%packid(vid)
4997 call unpackwe_3d( ka, ia, is, ie, ja, js, je, &
4999 var, ginfo(gid)%recvpack_WE2P(:,:,pid) )
5004 ginfo(gid)%use_packbuf(ginfo(gid)%packid(vid)) = .false.
5008 if ( ginfo(gid)%device_alloc(vid+comm_vsize_max) )
then
5016 subroutine packwe_3d( KA, IA, IS, IE, JA, JS, JE, &
5020 integer,
intent(in) :: KA
5021 integer,
intent(in) :: IA, IS, IE
5022 integer,
intent(in) :: JA, JS, JE
5023 integer,
intent(in) :: IHALO
5024 real(RP),
intent(in) :: var(KA,IA,JA)
5025 integer,
intent(in) :: gid
5026 integer,
intent(in) :: vid
5028 integer :: k, i, j, n
5031 real(RP),
pointer :: ptr(:,:,:)
5032 ptr => ginfo(gid)%sendpack_P2WE
5037 call prof_rapstart(
'COMM_pack', 3)
5039 if ( prc_has_w )
then
5045 do i = is, is+ihalo-1
5048 n = (j-js) * ka * ihalo &
5052 ptr(n,1,vid) = var(k,i,j)
5054 ginfo(gid)%sendpack_P2WE(n,1,vid) = var(k,i,j)
5062 if ( prc_has_e )
then
5068 do i = ie-ihalo+1, ie
5071 n = (j-js) * ka * ihalo &
5072 + (i-ie+ihalo-1) * ka &
5075 ptr(n,2,vid) = var(k,i,j)
5077 ginfo(gid)%sendpack_P2WE(n,2,vid) = var(k,i,j)
5085 call prof_rapend(
'COMM_pack', 3)
5092 subroutine packwe_2d( IA, IS, IE, JA, JS, JE, &
5096 integer,
intent(in) :: IA, IS, IE
5097 integer,
intent(in) :: JA, JS, JE
5098 integer,
intent(in) :: IHALO
5099 real(RP),
intent(in) :: var(IA,JA)
5100 integer,
intent(in) :: vid
5101 integer,
intent(in) :: gid
5106 real(RP),
pointer :: ptr(:,:,:)
5107 ptr => ginfo(gid)%sendpack_P2WE
5111 call prof_rapstart(
'COMM_pack', 3)
5113 if ( prc_has_w )
then
5121 do i = is, is+ihalo-1
5122 n = (j-js) * ihalo &
5125 ptr(n,1,vid) = var(i,j)
5127 ginfo(gid)%sendpack_P2WE(n,1,vid) = var(i,j)
5134 if ( prc_has_e )
then
5141 do i = ie-ihalo+1, ie
5142 n = (j-js) * ihalo &
5143 + (i-ie+ihalo-1) + 1
5145 ptr(n,2,vid) = var(i,j)
5147 ginfo(gid)%sendpack_P2WE(n,2,vid) = var(i,j)
5156 call prof_rapend(
'COMM_pack', 3)
5161 end subroutine packwe_2d
5163 subroutine unpackwe_3d( KA, IA, IS, IE, JA, JS, JE, &
5167 integer,
intent(in) :: KA
5168 integer,
intent(in) :: IA, IS, IE
5169 integer,
intent(in) :: JA, JS, JE
5170 integer,
intent(in) :: IHALO
5171 real(RP),
intent(inout) :: var(KA,IA,JA)
5172 real(RP),
intent(in) :: buf(KA,IHALO,JS:JE,2)
5179 call prof_rapstart(
'COMM_unpack', 3)
5181 if ( prc_has_e )
then
5190 var(k,i,j) = buf(k,i-ie,j,2)
5197 if ( prc_has_w )
then
5206 var(k,i,j) = buf(k,i,j,1)
5213 call prof_rapend(
'COMM_unpack', 3)
5218 end subroutine unpackwe_3d
5220 subroutine unpackwe_2d( KA, IA, IS, IE, JA, JS, JE, &
5224 integer,
intent(in) :: KA
5225 integer,
intent(in) :: IA, IS, IE
5226 integer,
intent(in) :: JA, JS, JE
5227 integer,
intent(in) :: IHALO
5228 real(RP),
intent(inout) :: var(IA,JA)
5229 real(RP),
intent(in) :: buf(IHALO,JS:JE,KA,2)
5236 call prof_rapstart(
'COMM_unpack', 3)
5238 if( prc_has_e )
then
5243 do i = ie+1, ie+ihalo
5244 var(i,j) = buf(i-ie,j,1,2)
5250 if( prc_has_w )
then
5255 do i = is-ihalo, is-1
5256 var(i,j) = buf(i,j,1,1)
5264 call prof_rapend(
'COMM_unpack', 3)
5269 end subroutine unpackwe_2d
5271 subroutine unpackns_3d( KA, IA, IS, IE, JA, JS, JE, &
5275 integer,
intent(in) :: KA
5276 integer,
intent(in) :: IA, IS, IE
5277 integer,
intent(in) :: JA, JS, JE
5278 integer,
intent(in) :: JHALO
5279 real(RP),
intent(inout) :: var(KA,IA,JA)
5280 real(RP),
intent(in) :: buf(KA,IA,JHALO,2)
5287 call prof_rapstart(
'COMM_unpack', 3)
5289 if ( prc_has_s )
then
5296 var(k,i,j) = buf(k,i,j,1)
5302 if ( prc_has_w )
then
5309 var(k,i,j) = buf(k,i,j,1)
5315 if ( prc_has_e )
then
5322 var(k,i,j) = buf(k,i,j,1)
5330 if ( prc_has_n )
then
5337 var(k,i,j) = buf(k,i,j-je,2)
5343 if ( prc_has_w )
then
5350 var(k,i,j) = buf(k,i,j-je,2)
5356 if ( prc_has_e )
then
5363 var(k,i,j) = buf(k,i,j-je,2)
5373 call prof_rapend(
'COMM_unpack', 3)
5378 end subroutine unpackns_3d
5380 subroutine unpackns_2d( IA, IS, IE, JA, JS, JE, &
5384 integer,
intent(in) :: IA, IS, IE
5385 integer,
intent(in) :: JA, JS, JE
5386 integer,
intent(in) :: JHALO
5387 real(RP),
intent(inout) :: var(IA,JA)
5388 real(RP),
intent(in) :: buf(IA,JHALO,2)
5395 call prof_rapstart(
'COMM_unpack', 3)
5397 if ( prc_has_s )
then
5403 var(i,j) = buf(i,j,1)
5408 if ( prc_has_w )
then
5414 var(i,j) = buf(i,j,1)
5419 if ( prc_has_e )
then
5425 var(i,j) = buf(i,j,1)
5432 if ( prc_has_n )
then
5438 var(i,j) = buf(i,j-je,2)
5443 if ( prc_has_w )
then
5449 var(i,j) = buf(i,j-je,2)
5454 if ( prc_has_e )
then
5460 var(i,j) = buf(i,j-je,2)
5469 call prof_rapend(
'COMM_unpack', 3)
5474 end subroutine unpackns_2d
5476 subroutine copy_boundary_3d(var, gid)
5481 real(RP),
intent(inout) :: var(:,:,:)
5482 integer,
intent(in) :: gid
5485 integer :: IS, IE, IHALO
5486 integer :: JS, JE, JHALO
5496 ihalo = ginfo(gid)%IHALO
5499 jhalo = ginfo(gid)%JHALO
5504 if ( .NOT. prc_has_n )
then
5506 do j = je+1, je+jhalo
5510 var(k,i,j) = var(k,i,je)
5519 if ( .NOT. prc_has_s )
then
5522 do j = js-jhalo, js-1
5526 var(k,i,j) = var(k,i,js)
5537 if ( .NOT. prc_has_e )
then
5541 do i = ie+1, ie+ihalo
5543 var(k,i,j) = var(k,ie,j)
5552 if ( .NOT. prc_has_w )
then
5557 do i = is-ihalo, is-1
5558 var(:,i,j) = var(:,is,j)
5566 if ( .NOT. prc_has_n .AND. &
5567 .NOT. prc_has_w )
then
5569 do j = je+1, je+jhalo
5571 do i = is-ihalo, is-1
5573 var(k,i,j) = var(k,is,je)
5578 elseif( .NOT. prc_has_n )
then
5580 do j = je+1, je+jhalo
5581 do i = is-ihalo, is-1
5583 var(k,i,j) = var(k,i,je)
5588 elseif( .NOT. prc_has_w )
then
5590 do j = je+1, je+jhalo
5592 do i = is-ihalo, is-1
5594 var(k,i,j) = var(k,is,j)
5602 if ( .NOT. prc_has_s .AND. &
5603 .NOT. prc_has_w )
then
5606 do j = js-jhalo, js-1
5608 do i = is-ihalo, is-1
5610 var(k,i,j) = var(k,is,js)
5615 elseif( .NOT. prc_has_s )
then
5618 do j = js-jhalo, js-1
5619 do i = is-ihalo, is-1
5621 var(k,i,j) = var(k,i,js)
5626 elseif( .NOT. prc_has_w )
then
5628 do j = js-jhalo, js-1
5630 do i = is-ihalo, is-1
5632 var(k,i,j) = var(k,is,j)
5640 if ( .NOT. prc_has_n .AND. &
5641 .NOT. prc_has_e )
then
5643 do j = je+1, je+jhalo
5644 do i = ie+1, ie+ihalo
5646 var(k,i,j) = var(k,ie,je)
5651 elseif( .NOT. prc_has_n )
then
5653 do j = je+1, je+jhalo
5654 do i = ie+1, ie+ihalo
5656 var(k,i,j) = var(k,i,je)
5661 elseif( .NOT. prc_has_e )
then
5663 do j = je+1, je+jhalo
5664 do i = ie+1, ie+ihalo
5666 var(k,i,j) = var(k,ie,j)
5674 if ( .NOT. prc_has_s .AND. &
5675 .NOT. prc_has_e )
then
5677 do j = js-jhalo, js-1
5678 do i = ie+1, ie+ihalo
5680 var(k,i,j) = var(k,ie,js)
5685 elseif( .NOT. prc_has_s )
then
5688 do j = js-jhalo, js-1
5689 do i = ie+1, ie+ihalo
5691 var(k,i,j) = var(k,i,js)
5696 elseif( .NOT. prc_has_e )
then
5698 do j = js-jhalo, js-1
5699 do i = ie+1, ie+ihalo
5701 var(k,i,j) = var(k,ie,j)
5717 end subroutine copy_boundary_3d
5724 real(RP),
intent(inout) :: var(:,:)
5725 integer,
intent(in) :: gid
5727 integer :: IS, IE, IHALO
5728 integer :: JS, JE, JHALO
5737 ihalo = ginfo(gid)%IHALO
5740 jhalo = ginfo(gid)%JHALO
5745 if( .NOT. prc_has_n )
then
5747 do j = je+1, je+jhalo
5750 var(i,j) = var(i,je)
5758 if( .NOT. prc_has_s )
then
5761 do j = js-jhalo, js-1
5764 var(i,j) = var(i,js)
5773 if( .NOT. prc_has_e )
then
5777 do i = ie+1, ie+ihalo
5778 var(i,j) = var(ie,j)
5785 if( .NOT. prc_has_w )
then
5790 do i = is-ihalo, is-1
5791 var(i,j) = var(is,j)
5799 if( .NOT. prc_has_n .AND. .NOT. prc_has_w )
then
5801 do j = je+1, je+jhalo
5803 do i = is-ihalo, is-1
5804 var(i,j) = var(is,je)
5808 elseif( .NOT. prc_has_n )
then
5810 do j = je+1, je+jhalo
5811 do i = is-ihalo, is-1
5812 var(i,j) = var(i,je)
5816 elseif( .NOT. prc_has_w )
then
5818 do j = je+1, je+jhalo
5820 do i = is-ihalo, is-1
5821 var(i,j) = var(is,j)
5828 if( .NOT. prc_has_s .AND. .NOT. prc_has_w )
then
5831 do j = js-jhalo, js-1
5833 do i = is-ihalo, is-1
5834 var(i,j) = var(is,js)
5838 elseif( .NOT. prc_has_s )
then
5841 do j = js-jhalo, js-1
5842 do i = is-ihalo, is-1
5843 var(i,j) = var(i,js)
5847 elseif( .NOT. prc_has_w )
then
5849 do j = js-jhalo, js-1
5851 do i = is-ihalo, is-1
5852 var(i,j) = var(is,j)
5859 if( .NOT. prc_has_n .AND. .NOT. prc_has_e )
then
5861 do j = je+1, je+jhalo
5862 do i = ie+1, ie+ihalo
5863 var(i,j) = var(ie,je)
5867 elseif( .NOT. prc_has_n )
then
5869 do j = je+1, je+jhalo
5870 do i = ie+1, ie+ihalo
5871 var(i,j) = var(i,je)
5875 elseif( .NOT. prc_has_e )
then
5877 do j = je+1, je+jhalo
5878 do i = ie+1, ie+ihalo
5879 var(i,j) = var(ie,j)
5886 if( .NOT. prc_has_s .AND. .NOT. prc_has_e )
then
5888 do j = js-jhalo, js-1
5889 do i = ie+1, ie+ihalo
5890 var(i,j) = var(ie,js)
5894 elseif( .NOT. prc_has_s )
then
5897 do j = js-jhalo, js-1
5898 do i = ie+1, ie+ihalo
5899 var(i,j) = var(i,js)
5903 elseif( .NOT. prc_has_e )
then
5905 do j = js-jhalo, js-1
5906 do i = ie+1, ie+ihalo
5907 var(i,j) = var(ie,j)