57 module procedure comm_vars_2d
58 module procedure comm_vars_3d
59 end interface comm_vars
62 module procedure comm_vars8_2d
63 module procedure comm_vars8_3d
64 end interface comm_vars8
67 module procedure comm_wait_2d
68 module procedure comm_wait_3d
69 end interface comm_wait
74 end interface comm_gather
92 end interface comm_bcast
109 integer,
private :: comm_nreq_max
110 integer,
private :: comm_vsize_max
111 integer,
private :: comm_vsize_max_pc
113 logical,
private :: comm_isallperiodic
115 integer,
private :: comm_size2d_ns4
116 integer,
private :: comm_size2d_ns8
117 integer,
private :: comm_size2d_we
118 integer,
private :: comm_size2d_4c
120 integer,
private :: comm_vars_id = 0
122 logical,
private :: comm_use_mpi_pc = .true.
124 real(
rp),
private,
allocatable :: recvpack_w2p(:,:)
125 real(
rp),
private,
allocatable :: recvpack_e2p(:,:)
126 real(
rp),
private,
allocatable :: sendpack_p2w(:,:)
127 real(
rp),
private,
allocatable :: sendpack_p2e(:,:)
129 logical,
private,
allocatable :: use_packbuf(:)
132 integer,
private,
allocatable :: req_cnt (:)
133 integer,
private,
allocatable :: req_list(:,:)
134 integer,
private,
allocatable :: preq_cnt (:)
135 integer,
private,
allocatable :: preq_list(:,:)
136 integer,
private,
allocatable :: pseqid(:)
149 namelist / param_comm_cartesc / &
154 integer :: nreq_ns, nreq_we, nreq_4c
156 logical,
save :: initialized = .false.
161 if ( initialized )
return
164 log_info(
"COMM_setup",*)
'Setup'
166 comm_vsize_max = max( 10 +
qa*2, 25 )
167 comm_vsize_max_pc = 50 +
qa*2
171 read(
io_fid_conf,nml=param_comm_cartesc,iostat=ierr)
173 log_info(
"COMM_setup",*)
'Not found namelist. Default used.'
174 elseif( ierr > 0 )
then
175 log_error(
"COMM_setup",*)
'Not appropriate names in namelist PARAM_COMM_CARTESC. Check!'
178 log_nml(param_comm_cartesc)
184 if ( comm_use_mpi_pc )
then
185 comm_nreq_max = 2 * nreq_ns + 2 * nreq_we + 4 * nreq_4c + 1
187 comm_nreq_max = 2 * nreq_ns + 2 * nreq_we + 4 * nreq_4c
191 comm_size2d_ns8 =
imax
193 comm_size2d_4c =
ihalo
195 allocate( recvpack_w2p(comm_size2d_we*
ka,comm_vsize_max) )
196 allocate( recvpack_e2p(comm_size2d_we*
ka,comm_vsize_max) )
197 allocate( sendpack_p2w(comm_size2d_we*
ka,comm_vsize_max) )
198 allocate( sendpack_p2e(comm_size2d_we*
ka,comm_vsize_max) )
200 allocate( use_packbuf(comm_vsize_max) )
201 use_packbuf(:) = .false.
204 allocate( req_cnt( comm_vsize_max) )
205 allocate( req_list(comm_nreq_max,comm_vsize_max) )
207 req_list(:,:) = mpi_request_null
209 if ( comm_use_mpi_pc )
then
210 allocate( preq_cnt( comm_vsize_max_pc) )
211 allocate( preq_list(comm_nreq_max+1,comm_vsize_max_pc) )
213 preq_list(:,:) = mpi_request_null
215 allocate( pseqid(comm_vsize_max_pc) )
219 comm_isallperiodic = .true.
221 comm_isallperiodic = .false.
224 if (
rp == kind(0.d0) )
then
226 elseif(
rp == kind(0.0) )
then
229 log_error(
"COMM_setup",*)
'precision is not supportd'
236 log_info(
"COMM_setup",*)
'Communication information'
237 log_info_cont(*)
'Maximum number of vars for one communication: ', comm_vsize_max
238 log_info_cont(*)
'Data size of var (3D,including halo) [byte] : ',
rp*
ka*
ia*
ja
240 log_info_cont(*)
'Ratio of halo against the whole 3D grid : ', real(2*
ia*
jhalo+2*
jmax*
ihalo) / real(
ia*
ja)
241 log_info_cont(*)
'All side is periodic? : ', comm_isallperiodic
256 character(len=*),
intent(in) :: varname
257 real(
rp),
intent(inout) :: var(:,:,:)
258 integer,
intent(inout) :: vid
261 if ( vid > comm_vsize_max )
then
262 log_error(
"COMM_vars_init",*)
'vid exceeds max', vid, comm_vsize_max
266 if ( comm_use_mpi_pc )
then
268 comm_vars_id = comm_vars_id + 1
269 if ( comm_vars_id > comm_vsize_max_pc )
then
270 log_error(
"COMM_vars_init",*)
'number of variable for MPI PC exceeds max', comm_vars_id, comm_vsize_max_pc
278 vid = comm_vars_id + comm_vsize_max
280 log_info(
"COMM_vars_init",
'(1x,A,I3.3,2A)')
'Initialize variable : ID = ', vid, &
281 ', name = ', trim(varname)
296 character(len=*),
intent(in) :: varname
297 real(
rp),
intent(inout) :: var(:,:,:)
298 integer,
intent(inout) :: vid
301 if ( vid > comm_vsize_max )
then
302 log_error(
"COMM_vars8_init",*)
'vid exceeds max', vid, comm_vsize_max
306 if ( comm_use_mpi_pc )
then
308 comm_vars_id = comm_vars_id + 1
309 if ( comm_vars_id > comm_vsize_max_pc )
then
310 log_error(
"COMM_vars8_init",*)
'number of variable for MPI PC exceeds max', comm_vars_id, comm_vsize_max_pc
318 vid = comm_vars_id + comm_vsize_max
320 log_info(
"COMM_vars8_init",
'(1x,A,I3.3,2A)')
'Initialize variable : ID = ', vid, &
321 ', name = ', trim(varname)
329 subroutine comm_vars_3d(var, vid)
332 real(
rp),
intent(inout) :: var(:,:,:)
333 integer,
intent(in) :: vid
336 if ( vid > comm_vsize_max )
then
347 end subroutine comm_vars_3d
350 subroutine comm_vars8_3d(var, vid)
353 real(
rp),
intent(inout) :: var(:,:,:)
354 integer,
intent(in) :: vid
357 if ( vid > comm_vsize_max )
then
368 end subroutine comm_vars8_3d
371 subroutine comm_wait_3d(var, vid, FILL_BND)
374 real(
rp),
intent(inout) :: var(:,:,:)
375 integer,
intent(in) :: vid
376 logical,
intent(in),
optional :: fill_bnd
382 if (
present(fill_bnd) ) fill_bnd_ = fill_bnd
384 if ( vid > comm_vsize_max )
then
395 if ( .NOT. comm_isallperiodic )
then
396 if ( fill_bnd_ )
then
397 call copy_boundary_3d(var)
402 end subroutine comm_wait_3d
405 subroutine comm_vars_2d(var, vid)
407 real(
rp),
intent(inout) :: var(:,:)
408 integer,
intent(in) :: vid
416 end subroutine comm_vars_2d
419 subroutine comm_vars8_2d(var, vid)
422 real(
rp),
intent(inout) :: var(:,:)
423 integer,
intent(in) :: vid
431 end subroutine comm_vars8_2d
434 subroutine comm_wait_2d(var, vid, FILL_BND)
437 real(
rp),
intent(inout) :: var(:,:)
438 integer,
intent(in) :: vid
439 logical,
intent(in),
optional :: fill_bnd
445 if (
present(fill_bnd) ) fill_bnd_ = fill_bnd
451 if( .NOT. comm_isallperiodic )
then
452 if ( fill_bnd_ )
then
458 end subroutine comm_wait_2d
462 subroutine comm_horizontal_mean_2d( varmean, var )
467 real(
rp),
intent(out) :: varmean
468 real(
rp),
intent(in) :: var (
ia,
ja)
472 real(
rp) :: allstatval
473 real(
rp) :: allstatcnt
485 statval = statval + var(i,j)
486 statcnt = statcnt + 1.0_rp
494 call mpi_allreduce( statval, &
502 call mpi_allreduce( statcnt, &
512 zerosw = 0.5_rp - sign(0.5_rp, allstatcnt - 1.e-12_rp )
513 varmean = allstatval / ( allstatcnt + zerosw ) * ( 1.0_rp - zerosw )
517 end subroutine comm_horizontal_mean_2d
526 real(RP),
intent(out) :: varmean(KA)
527 real(RP),
intent(in) :: var (KA,IA,JA)
529 real(RP) :: statval (KA)
530 real(RP) :: statcnt (KA)
531 real(RP) :: allstatval(KA)
532 real(RP) :: allstatcnt(KA)
545 statval(k) = statval(k) + var(k,i,j)
546 statcnt(k) = statcnt(k) + 1.0_rp
555 call mpi_allreduce( statval(1), &
563 call mpi_allreduce( statcnt(1), &
574 zerosw = 0.5_rp - sign(0.5_rp, allstatcnt(k) - 1.e-12_rp )
575 varmean(k) = allstatval(k) / ( allstatcnt(k) + zerosw ) * ( 1.0_rp - zerosw )
589 real(RP),
intent(out) :: recv(:,:,:)
590 real(RP),
intent(in) :: send(:,:)
591 integer,
intent(in) :: gIA
592 integer,
intent(in) :: gJA
594 integer :: sendcounts, recvcounts
598 sendcounts = gia * gja
599 recvcounts = gia * gja
601 call mpi_gather( send(:,:), &
621 real(RP),
intent(out) :: recv(:,:,:,:)
622 real(RP),
intent(in) :: send(:,:,:)
623 integer,
intent(in) :: gIA
624 integer,
intent(in) :: gJA
625 integer,
intent(in) :: gKA
627 integer :: sendcounts, recvcounts
631 sendcounts = gia * gja * gka
632 recvcounts = gia * gja * gka
634 call mpi_gather( send(:,:,:), &
654 real(SP),
intent(inout) :: var
664 call mpi_bcast( var, &
680 real(DP),
intent(inout) :: var
690 call mpi_bcast( var, &
709 real(SP),
intent(inout) :: var(:)
710 integer,
intent(in) :: gIA
720 call mpi_bcast( var(:), &
736 real(DP),
intent(inout) :: var(:)
737 integer,
intent(in) :: gIA
747 call mpi_bcast( var(:), &
766 real(SP),
intent(inout) :: var(:,:)
767 integer,
intent(in) :: gIA
768 integer,
intent(in) :: gJA
778 call mpi_bcast( var(:,:), &
794 real(DP),
intent(inout) :: var(:,:)
795 integer,
intent(in) :: gIA
796 integer,
intent(in) :: gJA
806 call mpi_bcast( var(:,:), &
825 real(SP),
intent(inout) :: var(:,:,:)
826 integer,
intent(in) :: gIA
827 integer,
intent(in) :: gJA
828 integer,
intent(in) :: gKA
836 counts = gia * gja * gka
838 call mpi_bcast( var(:,:,:), &
854 real(DP),
intent(inout) :: var(:,:,:)
855 integer,
intent(in) :: gIA
856 integer,
intent(in) :: gJA
857 integer,
intent(in) :: gKA
865 counts = gia * gja * gka
867 call mpi_bcast( var(:,:,:), &
886 real(SP),
intent(inout) :: var(:,:,:,:)
887 integer,
intent(in) :: gIA
888 integer,
intent(in) :: gJA
889 integer,
intent(in) :: gKA
890 integer,
intent(in) :: gTime
898 counts = gia * gja * gka * gtime
899 if ( gia>0 .AND. gja>0 .AND. gka>0 .AND. gtime>0 .AND. &
901 log_error(
"COMM_bcast_4D",*)
'counts overflow'
905 call mpi_bcast( var(:,:,:,:), &
921 real(DP),
intent(inout) :: var(:,:,:,:)
922 integer,
intent(in) :: gIA
923 integer,
intent(in) :: gJA
924 integer,
intent(in) :: gKA
925 integer,
intent(in) :: gTime
933 counts = gia * gja * gka * gtime
934 if ( gia>0 .AND. gja>0 .AND. gka>0 .AND. gtime>0 .AND. &
936 log_error(
"COMM_bcast_4D",*)
'counts overflow'
940 call mpi_bcast( var(:,:,:,:), &
959 integer,
intent(inout) :: var
969 call mpi_bcast( var, &
988 integer,
intent(inout) :: var(:)
989 integer,
intent(in) :: gIA
999 call mpi_bcast( var(:), &
1018 integer,
intent(inout) :: var(:,:)
1019 integer,
intent(in) :: gIA
1020 integer,
intent(in) :: gJA
1030 call mpi_bcast( var(:,:), &
1049 logical,
intent(inout) :: var
1059 call mpi_bcast( var, &
1078 character(len=*),
intent(inout) :: var
1088 call mpi_bcast( var, &
1108 real(RP),
intent(inout) :: var(:,:,:)
1109 integer,
intent(in) :: vid
1110 integer,
intent(in) :: seqid
1112 integer :: ireq, tag, ierr
1126 mpi_proc_null, tag+comm_nreq_max+1,
comm_world, &
1127 preq_list(comm_nreq_max+1,vid), ierr )
1132 prc_next(prc_s), tag+1,
comm_world, preq_list(ireq,vid), ierr )
1136 prc_next(prc_n), tag+2,
comm_world, preq_list(ireq,vid), ierr )
1140 call mpi_recv_init( recvpack_e2p(:,seqid), comm_size2d_we*kd,
comm_datatype, &
1141 prc_next(prc_e), tag+3,
comm_world, preq_list(ireq,vid), ierr )
1144 call mpi_recv_init( recvpack_w2p(:,seqid), comm_size2d_we*kd,
comm_datatype, &
1145 prc_next(prc_w), tag+4,
comm_world, preq_list(ireq,vid), ierr )
1152 call mpi_send_init( sendpack_p2w(:,seqid), comm_size2d_we*kd,
comm_datatype, &
1153 prc_next(prc_w), tag+3,
comm_world, preq_list(ireq,vid), ierr )
1156 call mpi_send_init( sendpack_p2e(:,seqid), comm_size2d_we*kd,
comm_datatype, &
1157 prc_next(prc_e), tag+4,
comm_world, preq_list(ireq,vid), ierr )
1162 prc_next(prc_n), tag+1,
comm_world, preq_list(ireq,vid), ierr )
1166 prc_next(prc_s), tag+2,
comm_world, preq_list(ireq,vid), ierr )
1169 preq_cnt(vid) = ireq - 1
1174 call mpi_testall( preq_cnt(vid), preq_list(1:preq_cnt(vid),vid), &
1175 flag, mpi_statuses_ignore, ierr )
1186 real(RP),
intent(inout) :: var(:,:,:)
1187 integer,
intent(in) :: vid
1188 integer,
intent(in) :: seqid
1190 integer :: ireq, tag, tagc
1205 mpi_proc_null, tag+comm_nreq_max+1,
comm_world, &
1206 preq_list(comm_nreq_max+1,vid), ierr )
1209 if ( comm_isallperiodic )
then
1216 call mpi_recv_init( var(1,
ie+1,j), comm_size2d_4c*kd,
comm_datatype, &
1217 prc_next(prc_se), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1225 prc_next(prc_sw), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1232 call mpi_recv_init( var(1,
ie+1,j), comm_size2d_4c*kd,
comm_datatype, &
1233 prc_next(prc_ne), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1241 prc_next(prc_nw), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1247 call mpi_recv_init( recvpack_e2p(:,seqid), comm_size2d_we*kd,
comm_datatype, &
1248 prc_next(prc_e), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1252 call mpi_recv_init( recvpack_w2p(:,seqid), comm_size2d_we*kd,
comm_datatype, &
1253 prc_next(prc_w), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1260 prc_next(prc_s), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1268 prc_next(prc_n), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1278 prc_next(prc_n), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1286 prc_next(prc_s), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1293 call mpi_send_init( sendpack_p2w(:,seqid), comm_size2d_we*kd,
comm_datatype, &
1294 prc_next(prc_w), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1298 call mpi_send_init( sendpack_p2e(:,seqid), comm_size2d_we*kd,
comm_datatype, &
1299 prc_next(prc_e), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1305 prc_next(prc_nw), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1313 prc_next(prc_ne), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1321 prc_next(prc_sw), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1329 prc_next(prc_se), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1340 if ( prc_has_s .AND. prc_has_e )
then
1343 call mpi_recv_init( var(1,
ie+1,j), comm_size2d_4c*kd,
comm_datatype, &
1344 prc_next(prc_se), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1348 else if ( prc_has_s )
then
1351 call mpi_recv_init( var(1,
ie+1,j), comm_size2d_4c*kd,
comm_datatype, &
1352 prc_next(prc_s), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1356 else if ( prc_has_e )
then
1359 call mpi_recv_init( var(1,
ie+1,j), comm_size2d_4c*kd,
comm_datatype, &
1360 prc_next(prc_e), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1366 if ( prc_has_s .AND. prc_has_w )
then
1370 prc_next(prc_sw), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1374 else if ( prc_has_s )
then
1378 prc_next(prc_s), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1382 else if ( prc_has_w )
then
1386 prc_next(prc_w), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1392 if ( prc_has_n .AND. prc_has_e )
then
1395 call mpi_recv_init( var(1,
ie+1,j), comm_size2d_4c*kd,
comm_datatype, &
1396 prc_next(prc_ne), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1400 else if ( prc_has_n )
then
1403 call mpi_recv_init( var(1,
ie+1,j), comm_size2d_4c*kd,
comm_datatype, &
1404 prc_next(prc_n), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1408 else if ( prc_has_e )
then
1411 call mpi_recv_init( var(1,
ie+1,j), comm_size2d_4c*kd,
comm_datatype, &
1412 prc_next(prc_e), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1418 if ( prc_has_n .AND. prc_has_w )
then
1422 prc_next(prc_nw), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1426 else if ( prc_has_n )
then
1430 prc_next(prc_n), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1434 else if ( prc_has_w )
then
1438 prc_next(prc_w), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1444 if ( prc_has_e )
then
1446 call mpi_recv_init( recvpack_e2p(:,seqid), comm_size2d_we*kd,
comm_datatype, &
1447 prc_next(prc_e), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1451 if ( prc_has_w )
then
1453 call mpi_recv_init( recvpack_w2p(:,seqid), comm_size2d_we*kd,
comm_datatype, &
1454 prc_next(prc_w), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1459 if ( prc_has_s )
then
1463 prc_next(prc_s), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1469 if ( prc_has_n )
then
1473 prc_next(prc_n), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1481 if ( prc_has_n )
then
1485 prc_next(prc_n), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1491 if ( prc_has_s )
then
1495 prc_next(prc_s), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1502 if ( prc_has_w )
then
1504 call mpi_send_init( sendpack_p2w(:,seqid), comm_size2d_we*kd,
comm_datatype, &
1505 prc_next(prc_w), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1509 if ( prc_has_e )
then
1511 call mpi_send_init( sendpack_p2e(:,seqid), comm_size2d_we*kd,
comm_datatype, &
1512 prc_next(prc_e), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1516 if ( prc_has_n .AND. prc_has_w )
then
1520 prc_next(prc_nw), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1524 else if ( prc_has_n )
then
1528 prc_next(prc_n), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1532 else if ( prc_has_w )
then
1536 prc_next(prc_w), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1542 if ( prc_has_n .AND. prc_has_e )
then
1546 prc_next(prc_ne), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1550 else if ( prc_has_n )
then
1553 call mpi_send_init( var(1,
ie+1,j), comm_size2d_4c*kd,
comm_datatype, &
1554 prc_next(prc_n), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1558 else if ( prc_has_e )
then
1562 prc_next(prc_e), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1568 if ( prc_has_s .AND. prc_has_w )
then
1572 prc_next(prc_sw), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1576 else if ( prc_has_s )
then
1580 prc_next(prc_s), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1584 else if ( prc_has_w )
then
1588 prc_next(prc_w), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1594 if ( prc_has_s .AND. prc_has_e )
then
1598 prc_next(prc_se), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1602 else if ( prc_has_s )
then
1605 call mpi_send_init( var(1,
ie+1,j), comm_size2d_4c*kd,
comm_datatype, &
1606 prc_next(prc_s), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1610 else if ( prc_has_e )
then
1614 prc_next(prc_e), tag+tagc,
comm_world, preq_list(ireq,vid), ierr )
1623 preq_cnt(vid) = ireq - 1
1628 call mpi_testall( preq_cnt(vid), preq_list(1:preq_cnt(vid),vid), &
1629 flag, mpi_statuses_ignore, ierr )
1642 real(RP),
intent(inout) :: var(:,:,:)
1643 integer,
intent(in) :: vid
1646 integer :: ireq, tag
1658 if ( use_packbuf(vid) )
then
1659 log_error(
"vars_3D_mpi",*)
'packing buffer is already used', vid
1662 use_packbuf(vid) = .true.
1665 if ( comm_isallperiodic )
then
1670 prc_next(prc_s), tag+1,
comm_world, req_list(ireq,vid), ierr )
1674 prc_next(prc_n), tag+2,
comm_world, req_list(ireq,vid), ierr )
1678 call mpi_irecv( recvpack_e2p(:,vid), comm_size2d_we*kd,
comm_datatype, &
1679 prc_next(prc_e), tag+3,
comm_world, req_list(ireq,vid), ierr )
1682 call mpi_irecv( recvpack_w2p(:,vid), comm_size2d_we*kd,
comm_datatype, &
1683 prc_next(prc_w), tag+4,
comm_world, req_list(ireq,vid), ierr )
1692 call mpi_isend( sendpack_p2w(:,vid), comm_size2d_we*kd,
comm_datatype, &
1693 prc_next(prc_w), tag+3,
comm_world, req_list(ireq,vid), ierr )
1696 call mpi_isend( sendpack_p2e(:,vid), comm_size2d_we*kd,
comm_datatype, &
1697 prc_next(prc_e), tag+4,
comm_world, req_list(ireq,vid), ierr )
1702 prc_next(prc_n), tag+1,
comm_world, req_list(ireq,vid), ierr )
1706 prc_next(prc_s), tag+2,
comm_world, req_list(ireq,vid), ierr )
1713 if ( prc_has_s )
then
1715 prc_next(prc_s), tag+1,
comm_world, req_list(ireq,vid), ierr )
1719 if ( prc_has_n )
then
1721 prc_next(prc_n), tag+2,
comm_world, req_list(ireq,vid), ierr )
1726 if ( prc_has_e )
then
1727 call mpi_irecv( recvpack_e2p(:,vid), comm_size2d_we*kd,
comm_datatype, &
1728 prc_next(prc_e), tag+3,
comm_world, req_list(ireq,vid), ierr )
1732 if ( prc_has_w )
then
1733 call mpi_irecv( recvpack_w2p(:,vid), comm_size2d_we*kd,
comm_datatype, &
1734 prc_next(prc_w), tag+4,
comm_world, req_list(ireq,vid), ierr )
1745 if ( prc_has_w )
then
1746 call mpi_isend( sendpack_p2w(:,vid), comm_size2d_we*kd,
comm_datatype, &
1747 prc_next(prc_w), tag+3,
comm_world, req_list(ireq,vid), ierr )
1751 if ( prc_has_e )
then
1752 call mpi_isend( sendpack_p2e(:,vid), comm_size2d_we*kd,
comm_datatype, &
1753 prc_next(prc_e), tag+4,
comm_world, req_list(ireq,vid), ierr )
1758 if ( prc_has_n )
then
1760 prc_next(prc_n), tag+1,
comm_world, req_list(ireq,vid), ierr )
1764 if ( prc_has_s )
then
1766 prc_next(prc_s), tag+2,
comm_world, req_list(ireq,vid), ierr )
1772 req_cnt(vid) = ireq - 1
1784 real(RP),
intent(inout) :: var(:,:,:)
1785 integer,
intent(in) :: vid
1787 integer :: ireq, tag, tagc
1801 if ( use_packbuf(vid) )
then
1802 log_error(
"vars8_3D_mpi",*)
'packing buffer is already used', vid
1805 use_packbuf(vid) = .true.
1808 if ( comm_isallperiodic )
then
1816 prc_next(prc_se), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1824 prc_next(prc_sw), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1832 prc_next(prc_ne), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1840 prc_next(prc_nw), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1846 call mpi_irecv( recvpack_e2p(:,vid), comm_size2d_we*kd,
comm_datatype, &
1847 prc_next(prc_e), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1851 call mpi_irecv( recvpack_w2p(:,vid), comm_size2d_we*kd,
comm_datatype, &
1852 prc_next(prc_w), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1859 prc_next(prc_s), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1867 prc_next(prc_n), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1877 prc_next(prc_n), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1885 prc_next(prc_s), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1895 call mpi_isend( sendpack_p2w(:,vid), comm_size2d_we*kd,
comm_datatype, &
1896 prc_next(prc_w), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1900 call mpi_isend( sendpack_p2e(:,vid), comm_size2d_we*kd,
comm_datatype, &
1901 prc_next(prc_e), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1907 prc_next(prc_nw), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1915 prc_next(prc_ne), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1923 prc_next(prc_sw), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1931 prc_next(prc_se), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1942 if ( prc_has_s .AND. prc_has_e )
then
1946 prc_next(prc_se), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1950 else if ( prc_has_s )
then
1954 prc_next(prc_s), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1958 else if ( prc_has_e )
then
1962 prc_next(prc_e), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1968 if ( prc_has_s .AND. prc_has_w )
then
1972 prc_next(prc_sw), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1976 else if ( prc_has_s )
then
1980 prc_next(prc_s), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1984 else if ( prc_has_w )
then
1988 prc_next(prc_w), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
1994 if ( prc_has_n .AND. prc_has_e )
then
1998 prc_next(prc_ne), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2002 else if ( prc_has_n )
then
2006 prc_next(prc_n), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2010 else if ( prc_has_e )
then
2014 prc_next(prc_e), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2020 if ( prc_has_n .AND. prc_has_w )
then
2024 prc_next(prc_nw), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2028 else if ( prc_has_n )
then
2032 prc_next(prc_n), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2036 else if ( prc_has_w )
then
2040 prc_next(prc_w), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2046 if ( prc_has_e )
then
2048 call mpi_irecv( recvpack_e2p(:,vid), comm_size2d_we*kd,
comm_datatype, &
2049 prc_next(prc_e), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2053 if ( prc_has_w )
then
2055 call mpi_irecv( recvpack_w2p(:,vid), comm_size2d_we*kd,
comm_datatype, &
2056 prc_next(prc_w), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2061 if ( prc_has_s )
then
2065 prc_next(prc_s), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2071 if ( prc_has_n )
then
2075 prc_next(prc_n), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2083 if ( prc_has_n )
then
2087 prc_next(prc_n), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2093 if ( prc_has_s )
then
2097 prc_next(prc_s), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2107 if ( prc_has_w )
then
2109 call mpi_isend( sendpack_p2w(:,vid), comm_size2d_we*kd,
comm_datatype, &
2110 prc_next(prc_w), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2114 if ( prc_has_e )
then
2116 call mpi_isend( sendpack_p2e(:,vid), comm_size2d_we*kd,
comm_datatype, &
2117 prc_next(prc_e), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2122 if ( prc_has_n .AND. prc_has_w )
then
2126 prc_next(prc_nw), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2130 else if ( prc_has_n )
then
2133 call mpi_isend( var(1,1,j), comm_size2d_4c*kd,
comm_datatype, &
2134 prc_next(prc_n), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2138 else if ( prc_has_w )
then
2142 prc_next(prc_w), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2148 if ( prc_has_n .AND. prc_has_e )
then
2152 prc_next(prc_ne), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2156 else if ( prc_has_n )
then
2160 prc_next(prc_n), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2164 else if ( prc_has_e )
then
2168 prc_next(prc_e), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2174 if ( prc_has_s .AND. prc_has_w )
then
2178 prc_next(prc_sw), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2182 else if ( prc_has_s )
then
2185 call mpi_isend( var(1,1,j), comm_size2d_4c*kd,
comm_datatype, &
2186 prc_next(prc_s), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2190 else if ( prc_has_w )
then
2194 prc_next(prc_w), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2200 if ( prc_has_s .AND. prc_has_e )
then
2204 prc_next(prc_se), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2208 else if ( prc_has_s )
then
2212 prc_next(prc_s), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2216 else if ( prc_has_e )
then
2220 prc_next(prc_e), tag+tagc,
comm_world, req_list(ireq,vid), ierr )
2229 req_cnt(vid) = ireq - 1
2241 real(RP),
intent(inout) :: var(:,:)
2242 integer,
intent(in) :: vid
2244 integer :: ireq, tag
2252 if ( use_packbuf(vid) )
then
2253 log_error(
"vars_2D_mpi",*)
'packing buffer is already used', vid
2256 use_packbuf(vid) = .true.
2259 if ( comm_isallperiodic )
then
2263 call mpi_irecv( var(:,
js-
jhalo:
js-1), comm_size2d_ns4, &
2269 call mpi_irecv( var(:,
je+1:
je+
jhalo), comm_size2d_ns4, &
2276 call mpi_irecv( recvpack_e2p(:,vid), comm_size2d_we, &
2282 call mpi_irecv( recvpack_w2p(:,vid), comm_size2d_we, &
2293 call pack_2d(var, vid)
2296 call mpi_isend( sendpack_p2w(:,vid), comm_size2d_we, &
2302 call mpi_isend( sendpack_p2e(:,vid), comm_size2d_we, &
2309 call mpi_isend( var(:,
je-
jhalo+1:
je), comm_size2d_ns4, &
2315 call mpi_isend( var(:,
js:
js+
jhalo-1), comm_size2d_ns4, &
2324 if ( prc_has_s )
then
2325 call mpi_irecv( var(:,
js-
jhalo:
js-1), comm_size2d_ns4, &
2332 if ( prc_has_n )
then
2333 call mpi_irecv( var(:,
je+1:
je+
jhalo), comm_size2d_ns4, &
2341 if ( prc_has_e )
then
2342 call mpi_irecv( recvpack_e2p(:,vid), comm_size2d_we, &
2349 if ( prc_has_w )
then
2350 call mpi_irecv( recvpack_w2p(:,vid), comm_size2d_we, &
2362 call pack_2d(var, vid)
2365 if ( prc_has_w )
then
2366 call mpi_isend( sendpack_p2w(:,vid), comm_size2d_we, &
2373 if ( prc_has_e )
then
2374 call mpi_isend( sendpack_p2e(:,vid), comm_size2d_we, &
2382 if ( prc_has_n )
then
2383 call mpi_isend( var(:,
je-
jhalo+1:
je), comm_size2d_ns4, &
2390 if ( prc_has_s )
then
2391 call mpi_isend( var(:,
js:
js+
jhalo-1), comm_size2d_ns4, &
2399 req_cnt(vid) = ireq - 1
2411 real(RP),
intent(inout) :: var(:,:)
2412 integer,
intent(in) :: vid
2414 integer :: ireq, tag, tagc
2424 if ( use_packbuf(vid) )
then
2425 log_error(
"vars8_2D_mpi",*)
'packing buffer is already used', vid
2428 use_packbuf(vid) = .true.
2431 if ( comm_isallperiodic )
then
2438 call mpi_irecv( var(
ie+1,j), comm_size2d_4c, &
2447 call mpi_irecv( var(
is-
ihalo,j), comm_size2d_4c, &
2456 call mpi_irecv( var(
ie+1,j), comm_size2d_4c, &
2465 call mpi_irecv( var(
is-
ihalo,j), comm_size2d_4c, &
2472 call mpi_irecv( recvpack_e2p(:,vid), comm_size2d_we, &
2477 call mpi_irecv( recvpack_w2p(:,vid), comm_size2d_we, &
2485 call mpi_irecv( var(
is,j), comm_size2d_ns8, &
2494 call mpi_irecv( var(
is,j), comm_size2d_ns8, &
2507 call mpi_isend( var(
is,j), comm_size2d_ns8, &
2517 call mpi_isend( var(
is,j), comm_size2d_ns8, &
2526 call pack_2d(var, vid)
2529 call mpi_isend( sendpack_p2w(:,vid), comm_size2d_we, &
2535 call mpi_isend( sendpack_p2e(:,vid), comm_size2d_we, &
2543 call mpi_isend( var(
is,j), comm_size2d_4c, &
2553 call mpi_isend( var(
ie-
ihalo+1,j), comm_size2d_4c, &
2563 call mpi_isend( var(
is,j), comm_size2d_4c, &
2573 call mpi_isend( var(
ie-
ihalo+1,j), comm_size2d_4c, &
2585 if ( prc_has_s .AND. prc_has_e )
then
2588 call mpi_irecv( var(
ie+1,j), comm_size2d_4c, &
2594 else if ( prc_has_s )
then
2597 call mpi_irecv( var(
ie+1,j), comm_size2d_4c, &
2603 else if ( prc_has_e )
then
2606 call mpi_irecv( var(
ie+1,j), comm_size2d_4c, &
2615 if ( prc_has_s .AND. prc_has_w )
then
2618 call mpi_irecv( var(
is-
ihalo,j), comm_size2d_4c, &
2624 else if ( prc_has_s )
then
2627 call mpi_irecv( var(
is-
ihalo,j), comm_size2d_4c, &
2633 else if ( prc_has_w )
then
2636 call mpi_irecv( var(
is-
ihalo,j), comm_size2d_4c, &
2645 if ( prc_has_n .AND. prc_has_e )
then
2648 call mpi_irecv( var(
ie+1,j), comm_size2d_4c, &
2654 else if ( prc_has_n )
then
2657 call mpi_irecv( var(
ie+1,j), comm_size2d_4c, &
2663 else if ( prc_has_e )
then
2666 call mpi_irecv( var(
ie+1,j), comm_size2d_4c, &
2675 if ( prc_has_n .AND. prc_has_w )
then
2678 call mpi_irecv( var(
is-
ihalo,j), comm_size2d_4c, &
2684 else if ( prc_has_n )
then
2687 call mpi_irecv( var(
is-
ihalo,j), comm_size2d_4c, &
2693 else if ( prc_has_w )
then
2696 call mpi_irecv( var(
is-
ihalo,j), comm_size2d_4c, &
2705 if ( prc_has_e )
then
2706 call mpi_irecv( recvpack_e2p(:,vid), comm_size2d_we, &
2713 if ( prc_has_w )
then
2714 call mpi_irecv( recvpack_w2p(:,vid), comm_size2d_we, &
2723 if ( prc_has_s )
then
2726 call mpi_irecv( var(
is,j), comm_size2d_ns8, &
2735 if ( prc_has_n )
then
2738 call mpi_irecv( var(
is,j), comm_size2d_ns8, &
2750 if ( prc_has_n )
then
2753 call mpi_isend( var(
is,j), comm_size2d_ns8, &
2762 if ( prc_has_s )
then
2765 call mpi_isend( var(
is,j), comm_size2d_ns8, &
2775 call pack_2d(var, vid)
2778 if ( prc_has_w )
then
2779 call mpi_isend( sendpack_p2w(:,vid), comm_size2d_we, &
2786 if ( prc_has_e )
then
2787 call mpi_isend( sendpack_p2e(:,vid), comm_size2d_we, &
2794 if ( prc_has_n .AND. prc_has_w )
then
2797 call mpi_isend( var(
is,j), comm_size2d_4c, &
2803 else if ( prc_has_n )
then
2806 call mpi_isend( var(
is,j), comm_size2d_4c, &
2812 else if ( prc_has_w )
then
2815 call mpi_isend( var(
is,j), comm_size2d_4c, &
2824 if ( prc_has_n .AND. prc_has_e )
then
2827 call mpi_isend( var(
ie-
ihalo+1,j), comm_size2d_4c, &
2833 else if ( prc_has_n )
then
2836 call mpi_isend( var(
ie-
ihalo+1,j), comm_size2d_4c, &
2842 else if ( prc_has_e )
then
2845 call mpi_isend( var(
ie-
ihalo+1,j), comm_size2d_4c, &
2854 if ( prc_has_s .AND. prc_has_w )
then
2857 call mpi_isend( var(
is,j), comm_size2d_4c, &
2863 else if ( prc_has_s )
then
2866 call mpi_isend( var(
is,j), comm_size2d_4c, &
2872 else if ( prc_has_w )
then
2875 call mpi_isend( var(
is,j), comm_size2d_4c, &
2884 if ( prc_has_s .AND. prc_has_e )
then
2887 call mpi_isend( var(
ie-
ihalo+1,j), comm_size2d_4c, &
2893 else if ( prc_has_s )
then
2896 call mpi_isend( var(
ie-
ihalo+1,j), comm_size2d_4c, &
2902 else if ( prc_has_e )
then
2905 call mpi_isend( var(
ie-
ihalo+1,j), comm_size2d_4c, &
2916 req_cnt(vid) = ireq - 1
2928 real(RP),
intent(inout) :: var(:,:,:)
2929 integer,
intent(in) :: vid
2934 if ( use_packbuf(pseqid(vid)) )
then
2935 log_error(
"vars_3D_mpi_pc",*)
'packing buffer is already used', vid, pseqid(vid)
2938 use_packbuf(pseqid(vid)) = .true.
2943 call mpi_startall(preq_cnt(vid), preq_list(1:preq_cnt(vid),vid), ierr)
2952 real(RP),
intent(inout) :: var(:,:,:)
2953 integer,
intent(in) :: vid
2959 call mpi_waitall( req_cnt(vid), &
2960 req_list(1:req_cnt(vid),vid), &
2961 mpi_statuses_ignore, &
2963 if ( .not.
prc_twod )
call unpack_3d(var, vid)
2966 use_packbuf(vid) = .false.
2977 real(RP),
intent(inout) :: var(:,:)
2978 integer,
intent(in) :: vid
2984 call mpi_waitall( req_cnt(vid), &
2985 req_list(1:req_cnt(vid),vid), &
2986 mpi_statuses_ignore, &
2988 if ( .not.
prc_twod )
call unpack_2d(var, vid)
2991 use_packbuf(vid) = .false.
3002 real(RP),
intent(inout) :: var(:,:,:)
3003 integer,
intent(in) :: vid
3008 call mpi_waitall( preq_cnt(vid), &
3009 preq_list(1:preq_cnt(vid),vid), &
3010 mpi_statuses_ignore, &
3012 if ( .not.
prc_twod )
call unpack_3d(var, pseqid(vid))
3015 use_packbuf(pseqid(vid)) = .false.
3024 real(RP),
intent(in) :: var(:,:,:)
3025 integer,
intent(in) :: vid
3028 integer :: k, i, j, n
3034 if ( comm_isallperiodic )
then
3045 sendpack_p2w(n,vid) = var(k,i,j)
3058 sendpack_p2e(n,vid) = var(k,i,j)
3076 sendpack_p2w(n,vid) = var(k,i,j)
3092 sendpack_p2e(n,vid) = var(k,i,j)
3105 subroutine pack_2d(var, vid)
3108 real(RP),
intent(in) :: var(:,:)
3109 integer,
intent(in) :: vid
3115 if ( comm_isallperiodic )
then
3125 sendpack_p2w(n,vid) = var(i,j)
3136 sendpack_p2e(n,vid) = var(i,j)
3151 sendpack_p2w(n,vid) = var(i,j)
3164 sendpack_p2e(n,vid) = var(i,j)
3174 end subroutine pack_2d
3176 subroutine unpack_3d(var, vid)
3179 real(RP),
intent(inout) :: var(:,:,:)
3180 integer,
intent(in) :: vid
3183 integer :: i, j, k, n
3190 if ( comm_isallperiodic )
then
3200 var(k,i,j) = recvpack_e2p(n,vid)
3213 var(k,i,j) = recvpack_w2p(n,vid)
3230 var(k,i,j) = recvpack_e2p(n,vid)
3246 var(k,i,j) = recvpack_w2p(n,vid)
3257 end subroutine unpack_3d
3259 subroutine unpack_2d(var, vid)
3262 real(RP),
intent(inout) :: var(:,:)
3263 integer,
intent(in) :: vid
3270 if( comm_isallperiodic )
then
3278 var(i,j) = recvpack_e2p(n,vid)
3288 var(i,j) = recvpack_w2p(n,vid)
3302 var(i,j) = recvpack_e2p(n,vid)
3315 var(i,j) = recvpack_w2p(n,vid)
3325 end subroutine unpack_2d
3327 subroutine copy_boundary_3d(var)
3332 real(RP),
intent(inout) :: var(:,:,:)
3340 if ( .NOT. prc_has_n )
then
3344 var(:,i,j) = var(:,i,
je)
3351 if ( .NOT. prc_has_s )
then
3355 var(:,i,j) = var(:,i,
js)
3364 if ( .NOT. prc_has_e )
then
3368 var(:,i,j) = var(:,
ie,j)
3375 if ( .NOT. prc_has_w )
then
3379 var(:,i,j) = var(:,
is,j)
3386 if ( .NOT. prc_has_n .AND. &
3387 .NOT. prc_has_w )
then
3390 var(:,i,j) = var(:,
is,
je)
3393 elseif( .NOT. prc_has_n )
then
3396 var(:,i,j) = var(:,i,
je)
3399 elseif( .NOT. prc_has_w )
then
3402 var(:,i,j) = var(:,
is,j)
3408 if ( .NOT. prc_has_s .AND. &
3409 .NOT. prc_has_w )
then
3412 var(:,i,j) = var(:,
is,
js)
3415 elseif( .NOT. prc_has_s )
then
3418 var(:,i,j) = var(:,i,
js)
3421 elseif( .NOT. prc_has_w )
then
3424 var(:,i,j) = var(:,
is,j)
3430 if ( .NOT. prc_has_n .AND. &
3431 .NOT. prc_has_e )
then
3434 var(:,i,j) = var(:,
ie,
je)
3437 elseif( .NOT. prc_has_n )
then
3440 var(:,i,j) = var(:,i,
je)
3443 elseif( .NOT. prc_has_e )
then
3446 var(:,i,j) = var(:,
ie,j)
3452 if ( .NOT. prc_has_s .AND. &
3453 .NOT. prc_has_e )
then
3456 var(:,i,j) = var(:,
ie,
js)
3459 elseif( .NOT. prc_has_s )
then
3462 var(:,i,j) = var(:,i,
js)
3465 elseif( .NOT. prc_has_e )
then
3468 var(:,i,j) = var(:,
ie,j)
3478 end subroutine copy_boundary_3d
3485 real(RP),
intent(inout) :: var(:,:)
3493 if( .NOT. prc_has_n )
then
3497 var(i,j) = var(i,
je)
3504 if( .NOT. prc_has_s )
then
3508 var(i,j) = var(i,
js)
3516 if( .NOT. prc_has_e )
then
3520 var(i,j) = var(
ie,j)
3526 if( .NOT. prc_has_w )
then
3530 var(i,j) = var(
is,j)
3537 if( .NOT. prc_has_n .AND. .NOT. prc_has_w )
then
3540 var(i,j) = var(
is,
je)
3543 elseif( .NOT. prc_has_n )
then
3546 var(i,j) = var(i,
je)
3549 elseif( .NOT. prc_has_w )
then
3552 var(i,j) = var(
is,j)
3558 if( .NOT. prc_has_s .AND. .NOT. prc_has_w )
then
3561 var(i,j) = var(
is,
js)
3564 elseif( .NOT. prc_has_s )
then
3567 var(i,j) = var(i,
js)
3570 elseif( .NOT. prc_has_w )
then
3573 var(i,j) = var(
is,j)
3579 if( .NOT. prc_has_n .AND. .NOT. prc_has_e )
then
3582 var(i,j) = var(
ie,
je)
3585 elseif( .NOT. prc_has_n )
then
3588 var(i,j) = var(i,
je)
3591 elseif( .NOT. prc_has_e )
then
3594 var(i,j) = var(
ie,j)
3600 if( .NOT. prc_has_s .AND. .NOT. prc_has_e )
then
3603 var(i,j) = var(
ie,
js)
3606 elseif( .NOT. prc_has_s )
then
3609 var(i,j) = var(i,
js)
3612 elseif( .NOT. prc_has_e )
then
3615 var(i,j) = var(
ie,j)
3631 integer :: i, j, ierr
3634 deallocate( recvpack_w2p )
3635 deallocate( recvpack_e2p )
3636 deallocate( sendpack_p2w )
3637 deallocate( sendpack_p2e )
3639 deallocate( use_packbuf )
3642 deallocate( req_cnt )
3643 deallocate( req_list )
3645 if ( comm_use_mpi_pc )
then
3646 do j=1, comm_vsize_max_pc
3647 do i=1, comm_nreq_max+1
3648 if (preq_list(i,j) .NE. mpi_request_null) &
3649 call mpi_request_free(preq_list(i,j), ierr)
3652 deallocate( preq_cnt )
3653 deallocate( preq_list )
3654 deallocate( pseqid )