SCALE-RM
Data Types | Functions/Subroutines | Variables
scale_comm_cartesc Module Reference

module COMMUNICATION More...

Functions/Subroutines

subroutine, public comm_setup
 Setup. More...
 
subroutine, public comm_regist (KA, IA, JA, IHALO, JHALO, gid)
 Regist grid. More...
 
subroutine, public comm_finalize
 Finalize. More...
 
subroutine, public comm_vars_init (varname, var, vid, gid)
 Register variables. More...
 
subroutine, public comm_vars8_init (varname, var, vid, gid)
 Register variables. More...
 
subroutine comm_horizontal_mean_3d (KA, IA, IS, IE, JA, JS, JE, var, varmean)
 calculate horizontal mean (global total with communication) 3D More...
 
subroutine comm_gather_2d (IA, JA, send, recv)
 Get data from whole process value in 2D field. More...
 
subroutine comm_gather_3d (KA, IA, JA, send, recv)
 Get data from whole process value in 3D field. More...
 
subroutine comm_bcast_scr_sp (var)
 Broadcast data for whole process value in scalar field. More...
 
subroutine comm_bcast_scr_dp (var)
 
subroutine comm_bcast_1d_sp (IA, var)
 Broadcast data for whole process value in 1D field. More...
 
subroutine comm_bcast_1d_dp (IA, var)
 
subroutine comm_bcast_2d_sp (IA, JA, var)
 Broadcast data for whole process value in 2D field. More...
 
subroutine comm_bcast_2d_dp (IA, JA, var)
 
subroutine comm_bcast_3d_sp (KA, IA, JA, var)
 Broadcast data for whole process value in 3D field. More...
 
subroutine comm_bcast_3d_dp (KA, IA, JA, var)
 
subroutine comm_bcast_4d_sp (KA, IA, JA, NT, var)
 Broadcast data for whole process value in 4D field. More...
 
subroutine comm_bcast_4d_dp (KA, IA, JA, NT, var)
 
subroutine comm_bcast_int_scr (var)
 Broadcast data for whole process value in scalar (integer) More...
 
subroutine comm_bcast_int_1d (IA, var)
 Broadcast data for whole process value in 1D field (integer) More...
 
subroutine comm_bcast_int_2d (IA, JA, var)
 Broadcast data for whole process value in 2D field (integer) More...
 
subroutine comm_bcast_logical_scr (var)
 Broadcast data for whole process value in scalar (logical) More...
 
subroutine comm_bcast_logical_1d (IA, var)
 Broadcast data for whole process value in 1D (logical) More...
 
subroutine comm_bcast_character (var)
 Broadcast data for whole process value in character. More...
 
subroutine vars_init_mpi_pc (var, gid, vid, seqid)
 
subroutine vars8_init_mpi_pc (var, gid, vid, seqid)
 
subroutine vars_3d_mpi (var, gid, vid)
 
subroutine vars_3d_mpi_onesided (var, gid, vid)
 
subroutine vars8_3d_mpi (var, gid, vid)
 
subroutine vars8_3d_mpi_onesided (var, gid, vid)
 
subroutine vars_2d_mpi (var, gid, vid)
 
subroutine vars_2d_mpi_onesided (var, gid, vid)
 
subroutine vars8_2d_mpi (var, gid, vid)
 
subroutine vars8_2d_mpi_onesided (var, gid, vid)
 
subroutine vars_3d_mpi_pc (var, gid, vid)
 
subroutine wait_3d_mpi (var, gid, vid)
 
subroutine wait_3d_mpi_onesided (var, gid, vid)
 
subroutine wait_2d_mpi (var, gid, vid)
 
subroutine wait_2d_mpi_onesided (var, gid, vid)
 
subroutine wait_3d_mpi_pc (var, gid, vid)
 
subroutine packwe_3d (KA, IA, IS, IE, JA, JS, JE, IHALO, var, gid, vid)
 
subroutine copy_boundary_2d (var, gid)
 

Variables

integer, public comm_datatype
 datatype of variable More...
 
integer, public comm_world
 communication world ID More...
 

Detailed Description

module COMMUNICATION

Description
MPI Communication module for Cartesian C-grid
Author
Team SCALE
NAMELIST
  • PARAM_COMM_CARTESC
    nametypedefault valuecomment
    COMM_VSIZE_MAX integer # limit of communication variables at once
    COMM_VSIZE_MAX_PC integer # limit of total communication variables for MPI PC
    COMM_USE_MPI_PC logical .true. MPI persistent communication
    COMM_USE_MPI_ONESIDED logical .false. MPI one-sided communication

History Output
No history output

Function/Subroutine Documentation

◆ comm_setup()

subroutine, public scale_comm_cartesc::comm_setup

Setup.

Definition at line 178 of file scale_comm_cartesC.F90.

178  use scale_prc, only: &
180  use scale_prc_cartesc, only: &
181  prc_twod
182  implicit none
183 
184  namelist / param_comm_cartesc / &
185  comm_vsize_max, &
186  comm_vsize_max_pc, &
187  comm_use_mpi_pc, &
188  comm_use_mpi_onesided
189 
190  integer :: group, ranks(8)
191  integer :: n, m
192 
193  integer :: ierr
194  !---------------------------------------------------------------------------
195 
196  if ( initialized ) return
197 
198  log_newline
199  log_info("COMM_setup",*) 'Setup'
200 
201  comm_vsize_max = max( 10 + qa*2, 25 )
202  comm_vsize_max_pc = 50 + qa*2
203 
204 #ifdef _OPENACC
205  comm_use_mpi_onesided = .false.
206 #endif
207 
208  !--- read namelist
209  rewind(io_fid_conf)
210  read(io_fid_conf,nml=param_comm_cartesc,iostat=ierr)
211  if( ierr < 0 ) then !--- missing
212  log_info("COMM_setup",*) 'Not found namelist. Default used.'
213  elseif( ierr > 0 ) then !--- fatal error
214  log_error("COMM_setup",*) 'Not appropriate names in namelist PARAM_COMM_CARTESC. Check!'
215  call prc_abort
216  endif
217  log_nml(param_comm_cartesc)
218 
219  if ( prc_has_n .AND. prc_has_s .AND. prc_has_w .AND. prc_has_e ) then
220  comm_isallperiodic = .true.
221  else
222  comm_isallperiodic = .false.
223  endif
224 
225  if ( rp == kind(0.d0) ) then
226  comm_datatype = mpi_double_precision
227  elseif( rp == kind(0.0) ) then
228  comm_datatype = mpi_real
229  else
230  log_error("COMM_setup",*) 'precision is not supportd'
231  call prc_abort
232  endif
233 
234  comm_world = prc_local_comm_world
235  comm_gid = 0
236 
237 #ifdef _OPENACC
238  if ( comm_use_mpi_onesided ) then
239  log_warn("COMM_setup",*) "Open MPI does not support one-sided APIs with CUDA-aware UCX"
240  end if
241 #endif
242 
243  if ( comm_use_mpi_onesided ) then
244 
245  comm_use_mpi_pc = .false.
246 
247  call mpi_comm_group( comm_world, group, ierr )
248 
249  n = 0
250  if ( prc_has_s ) then
251  n = 1
252  ranks(n) = prc_next(prc_s)
253  end if
254  if ( prc_has_n ) then
255  do m = 1, n
256  if ( ranks(m) == prc_next(prc_n) ) exit
257  end do
258  if ( m == n + 1 ) then
259  n = n + 1
260  ranks(n) = prc_next(prc_n)
261  end if
262  end if
263  if ( prc_has_n .and. prc_has_w ) then
264  do m = 1, n
265  if ( ranks(m) == prc_next(prc_nw) ) exit
266  end do
267  if ( m == n + 1 ) then
268  n = n + 1
269  ranks(n) = prc_next(prc_nw)
270  end if
271  else if ( prc_has_n ) then
272  do m = 1, n
273  if ( ranks(m) == prc_next(prc_n) ) exit
274  end do
275  if ( m == n + 1 ) then
276  n = n + 1
277  ranks(n) = prc_next(prc_n)
278  end if
279  else if ( prc_has_w ) then
280  do m = 1, n
281  if ( ranks(m) == prc_next(prc_w) ) exit
282  end do
283  if ( m == n + 1 ) then
284  n = n + 1
285  ranks(n) = prc_next(prc_w)
286  end if
287  end if
288  if ( prc_has_n .and. prc_has_e ) then
289  do m = 1, n
290  if ( ranks(m) == prc_next(prc_ne) ) exit
291  end do
292  if ( m == n + 1 ) then
293  n = n + 1
294  ranks(n) = prc_next(prc_ne)
295  end if
296  else if ( prc_has_n ) then
297  do m = 1, n
298  if ( ranks(m) == prc_next(prc_n) ) exit
299  end do
300  if ( m == n + 1 ) then
301  n = n + 1
302  ranks(n) = prc_next(prc_n)
303  end if
304  else if ( prc_has_e ) then
305  do m = 1, n
306  if ( ranks(m) == prc_next(prc_e) ) exit
307  end do
308  if ( m == n + 1 ) then
309  n = n + 1
310  ranks(n) = prc_next(prc_e)
311  end if
312  end if
313  if ( prc_has_s .and. prc_has_w ) then
314  do m = 1, n
315  if ( ranks(m) == prc_next(prc_sw) ) exit
316  end do
317  if ( m == n + 1 ) then
318  n = n + 1
319  ranks(n) = prc_next(prc_sw)
320  end if
321  else if ( prc_has_s ) then
322  do m = 1, n
323  if ( ranks(m) == prc_next(prc_s) ) exit
324  end do
325  if ( m == n + 1 ) then
326  n = n + 1
327  ranks(n) = prc_next(prc_s)
328  end if
329  else if ( prc_has_w ) then
330  do m = 1, n
331  if ( ranks(m) == prc_next(prc_w) ) exit
332  end do
333  if ( m == n + 1 ) then
334  n = n + 1
335  ranks(n) = prc_next(prc_w)
336  end if
337  end if
338  if ( prc_has_s .and. prc_has_e ) then
339  do m = 1, n
340  if ( ranks(m) == prc_next(prc_se) ) exit
341  end do
342  if ( m == n + 1 ) then
343  n = n + 1
344  ranks(n) = prc_next(prc_se)
345  end if
346  else if ( prc_has_s ) then
347  do m = 1, n
348  if ( ranks(m) == prc_next(prc_s) ) exit
349  end do
350  if ( m == n + 1 ) then
351  n = n + 1
352  ranks(n) = prc_next(prc_s)
353  end if
354  else if ( prc_has_e ) then
355  do m = 1, n
356  if ( ranks(m) == prc_next(prc_e) ) exit
357  end do
358  if ( m == n + 1 ) then
359  n = n + 1
360  ranks(n) = prc_next(prc_e)
361  end if
362  end if
363  if ( n > 0 ) then
364  call mpi_group_incl( group, n, ranks, group_packns, ierr )
365  group_packns_created = .true.
366  else
367  group_packns_created = .false.
368  end if
369 
370  n = 0
371  if ( .not. prc_twod ) then
372  if ( prc_has_w ) then
373  n = 1
374  ranks(n) = prc_next(prc_w)
375  end if
376  if ( prc_has_e ) then
377  if ( n == 0 .or. ranks(1) .ne. prc_next(prc_e) ) then
378  n = n + 1
379  ranks(n) = prc_next(prc_e)
380  end if
381  end if
382  end if
383  if ( n > 0 ) then
384  call mpi_group_incl( group, n, ranks, group_packwe, ierr )
385  group_packwe_created = .true.
386  else
387  group_packwe_created = .false.
388  end if
389 
390  call mpi_group_free( group, ierr )
391  end if
392 
393  log_newline
394  log_info("COMM_setup",*) 'Communication information'
395  log_info_cont(*) 'Maximum number of vars for one communication: ', comm_vsize_max
396  log_info_cont(*) 'All side is periodic? : ', comm_isallperiodic
397 
398 
399  initialized = .true.
400 
401  return

References comm_datatype, comm_world, scale_io::io_fid_conf, scale_prc::prc_local_comm_world, scale_prc_cartesc::prc_twod, scale_tracer::qa, and scale_precision::rp.

Referenced by mod_rm_driver::rm_driver(), mod_rm_prep::rm_prep(), and scale_statistics::statistics_setup().

Here is the caller graph for this function:

◆ comm_regist()

subroutine, public scale_comm_cartesc::comm_regist ( integer, intent(in)  KA,
integer, intent(in)  IA,
integer, intent(in)  JA,
integer, intent(in)  IHALO,
integer, intent(in)  JHALO,
integer, intent(out)  gid 
)

Regist grid.

Definition at line 409 of file scale_comm_cartesC.F90.

409  implicit none
410 
411  integer, intent(in) :: KA, IA, JA, IHALO, JHALO
412  integer, intent(out) :: gid
413 
414  integer :: IMAX, JMAX
415  integer :: nreq_NS, nreq_WE, nreq_4C
416 
417  integer :: win_info
418  integer(kind=MPI_ADDRESS_KIND) :: size
419 
420  integer :: ierr
421  integer :: n
422 
423  if ( .not. initialized ) then
424  log_error("COMM_regist",*) 'COMM_setup must be called before calling COMM_regist'
425  call prc_abort
426  end if
427 
428  comm_gid = comm_gid + 1
429  if ( comm_gid > comm_gid_max ) then
430  log_error("COMM_regist",*) 'number of registed grid size exceeds the limit'
431  call prc_abort
432  end if
433  gid = comm_gid
434 
435  if ( ia < ihalo * 3 ) then
436  log_error("COMM_regist",*) 'IA must be >= IHALO * 3'
437  call prc_abort
438  end if
439  if ( ja < jhalo * 3 ) then
440  log_error("COMM_regist",*) 'JA must be >= JHALO * 3'
441  call prc_abort
442  end if
443 
444  imax = ia - ihalo * 2
445  jmax = ja - jhalo * 2
446 
447  ginfo(gid)%KA = ka
448  ginfo(gid)%IA = ia
449  ginfo(gid)%IS = ihalo + 1
450  ginfo(gid)%IE = ia - ihalo
451  ginfo(gid)%IHALO = ihalo
452  ginfo(gid)%JA = ja
453  ginfo(gid)%JS = jhalo + 1
454  ginfo(gid)%JE = ja - jhalo
455  ginfo(gid)%JHALO = jhalo
456 
457  nreq_ns = 2 * jhalo !--- send x JHALO, recv x JHALO
458  nreq_we = 2 !--- send x 1 , recv x 1
459  nreq_4c = 2 * jhalo !--- send x JHALO, recv x JHALO
460 
461  if ( comm_use_mpi_pc ) then
462  ginfo(gid)%nreq_MAX = 2 * nreq_ns + 2 * nreq_we + 4 * nreq_4c + 1
463  else
464  ginfo(gid)%nreq_MAX = 2 * nreq_ns + 2 * nreq_we + 4 * nreq_4c
465  end if
466 
467  ginfo(gid)%size2D_NS4 = ia * jhalo
468  ginfo(gid)%size2D_NS8 = imax
469  ginfo(gid)%size2D_WE = jmax * ihalo
470  ginfo(gid)%size2D_4C = ihalo
471 
472  allocate( ginfo(gid)%sendpack_P2WE(ginfo(gid)%size2D_WE * ka, 2, comm_vsize_max) )
473  !$acc enter data create(ginfo(gid)%sendpack_P2WE)
474 
475 #ifdef DEBUG
476  allocate( ginfo(gid)%use_packbuf(comm_vsize_max) )
477  ginfo(gid)%use_packbuf(:) = .false.
478 #endif
479 
480 #ifdef _OPENACC
481  allocate( ginfo(gid)%device_alloc(comm_vsize_max+comm_vsize_max_pc) )
482  allocate( ginfo(gid)%device_ptr(comm_vsize_max+1:comm_vsize_max_pc) )
483  ginfo(gid)%device_alloc(:) = .false.
484 #endif
485 
486  if ( comm_use_mpi_onesided ) then
487 
488  allocate( ginfo(gid)%recvbuf_WE(comm_vsize_max) )
489  allocate( ginfo(gid)%recvbuf_NS(comm_vsize_max) )
490 
491  allocate( ginfo(gid)%win_packWE(comm_vsize_max) )
492  allocate( ginfo(gid)%win_packNS(comm_vsize_max) )
493 
494  call mpi_info_create(win_info, ierr)
495  call mpi_info_set(win_info, "no_locks", "true", ierr)
496  call mpi_info_set(win_info, "same_size", "true", ierr)
497  call mpi_info_set(win_info, "same_disp_unit", "true", ierr)
498 
499  do n = 1, comm_vsize_max
500  size = ginfo(gid)%size2D_WE * ka * 2 * rp
501 #ifdef _OPENACC
502  block
503  real(RP), pointer :: pack(:)
504  call mpi_alloc_mem(size, mpi_info_null, ginfo(gid)%recvbuf_WE(n), ierr)
505  call c_f_pointer(ginfo(gid)%recvbuf_WE(n), pack, (/ size/rp /))
506  !$acc enter data create(pack)
507  !$acc host_data use_device(pack)
508  call mpi_win_create(pack, size, ginfo(gid)%size2D_WE*ka*rp, &
509  win_info, comm_world, &
510  ginfo(gid)%win_packWE(n), ierr)
511  !$acc end host_data
512  end block
513 #else
514  call mpi_win_allocate(size, ginfo(gid)%size2D_WE*ka*rp, &
515  win_info, comm_world, &
516  ginfo(gid)%recvbuf_WE(n), ginfo(gid)%win_packWE(n), ierr)
517 #endif
518  size = ginfo(gid)%size2D_NS4 * ka * 2 * rp
519 #ifdef _OPENACC
520  block
521  real(RP), pointer :: pack(:)
522  call mpi_alloc_mem(size, mpi_info_null, ginfo(gid)%recvbuf_NS(n), ierr)
523  call c_f_pointer(ginfo(gid)%recvbuf_NS(n), pack, (/ size/rp /))
524  !$acc enter data create(pack)
525  !$acc host_data use_device(pack)
526  call mpi_win_create(pack, size, rp, &
527  win_info, comm_world, &
528  ginfo(gid)%win_packNS(n), ierr)
529  !$acc end host_data
530  end block
531 #else
532  call mpi_win_allocate(size, rp, &
533  win_info, comm_world, &
534  ginfo(gid)%recvbuf_NS(n), ginfo(gid)%win_packNS(n), ierr)
535 #endif
536  end do
537 
538  call mpi_info_free(win_info, ierr)
539 
540  do n = 1, comm_vsize_max
541  call mpi_win_post( group_packwe, mpi_mode_nostore, ginfo(gid)%win_packWE(n), ierr )
542  call mpi_win_post( group_packns, mpi_mode_nostore, ginfo(gid)%win_packNS(n), ierr )
543  end do
544 
545  ginfo(gid)%vars_num = 0
546  allocate( ginfo(gid)%packid(comm_vsize_max_pc) )
547 
548  else
549 
550  allocate( ginfo(gid)%recvpack_WE2P(ginfo(gid)%size2D_WE * ka, 2, comm_vsize_max) )
551  !$acc enter data create(ginfo(gid)%recvpack_WE2P)
552 
553  allocate( ginfo(gid)%req_cnt ( comm_vsize_max) )
554  allocate( ginfo(gid)%req_list(ginfo(gid)%nreq_MAX, comm_vsize_max) )
555  ginfo(gid)%req_cnt (:) = -1
556  ginfo(gid)%req_list(:,:) = mpi_request_null
557 
558  if ( comm_use_mpi_pc ) then
559  ginfo(gid)%vars_num = 0
560  allocate( ginfo(gid)%packid(comm_vsize_max_pc) )
561  allocate( ginfo(gid)%preq_cnt ( comm_vsize_max_pc) )
562  allocate( ginfo(gid)%preq_list(ginfo(gid)%nreq_MAX+1,comm_vsize_max_pc) )
563  ginfo(gid)%preq_cnt (:) = -1
564  ginfo(gid)%preq_list(:,:) = mpi_request_null
565  end if
566 
567  end if
568 
569 
570  log_newline
571  log_info("COMM_regist",*) 'Register grid: id=', gid
572  log_info_cont(*) 'Data size of var (3D,including halo) [byte] : ', rp*ka*ia*ja
573  log_info_cont(*) 'Data size of halo [byte] : ', rp*ka*(2*ia*jhalo+2*jmax*ihalo)
574  log_info_cont(*) 'Ratio of halo against the whole 3D grid : ', real(2*ia*jhalo+2*jmax*ihalo) / real(ia*ja)
575 
576  return

References comm_world, scale_prc::prc_abort(), and scale_precision::rp.

Referenced by mod_rm_driver::rm_driver(), and mod_rm_prep::rm_prep().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ comm_finalize()

subroutine, public scale_comm_cartesc::comm_finalize

Finalize.

Definition at line 582 of file scale_comm_cartesC.F90.

582  use mpi
583  implicit none
584 
585  integer :: gid
586  integer :: i, j, ierr
587  !---------------------------------------------------------------------------
588 
589  do gid = 1, comm_gid
590 
591  if ( comm_use_mpi_onesided ) then
592 
593  do i = 1, comm_vsize_max
594  call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(i), ierr )
595  call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(i), ierr )
596  end do
597 
598  do i = 1, comm_vsize_max
599  call mpi_win_complete( ginfo(gid)%win_packWE(i), ierr )
600  call mpi_win_complete( ginfo(gid)%win_packNS(i), ierr )
601  end do
602 
603  do i = 1, comm_vsize_max
604  call mpi_win_wait( ginfo(gid)%win_packWE(i), ierr )
605  call mpi_win_wait( ginfo(gid)%win_packNS(i), ierr )
606  end do
607 
608  do i = 1, comm_vsize_max
609  call mpi_win_free(ginfo(gid)%win_packWE(i), ierr)
610  call mpi_win_free(ginfo(gid)%win_packNS(i), ierr)
611 #ifdef _OPENACC
612  block
613  real(RP), pointer :: pack(:)
614  integer :: KA
615  ka = ginfo(gid)%KA
616  call c_f_pointer( ginfo(gid)%recvbuf_WE(i), pack, (/ginfo(gid)%size2D_WE*ka*2/) )
617  !$acc exit data delete(pack)
618  call c_f_pointer( ginfo(gid)%recvbuf_NS(i), pack, (/ginfo(gid)%size2D_NS4*ka*2/) )
619  !$acc exit data delete(pack)
620  end block
621  call mpi_free_mem(ginfo(gid)%recvbuf_WE(i), ierr)
622  call mpi_free_mem(ginfo(gid)%recvbuf_NS(i), ierr)
623 #endif
624  end do
625 
626  deallocate( ginfo(gid)%packid )
627  ginfo(gid)%vars_num = 0
628 
629  deallocate( ginfo(gid)%win_packWE )
630  deallocate( ginfo(gid)%win_packNS )
631 
632  deallocate( ginfo(gid)%recvbuf_WE )
633  deallocate( ginfo(gid)%recvbuf_NS )
634 
635  else
636 
637  if ( comm_use_mpi_pc ) then
638 
639  do j = 1, comm_vsize_max_pc
640  do i = 1, ginfo(gid)%nreq_MAX+1
641  if (ginfo(gid)%preq_list(i,j) .NE. mpi_request_null) &
642  call mpi_request_free(ginfo(gid)%preq_list(i,j), ierr)
643  enddo
644 #ifdef _OPENACC
645  if ( ginfo(gid)%device_alloc(j+comm_vsize_max) ) then
646  !$acc exit data delete(ginfo(gid)%device_ptr(j+COMM_vsize_max)%ptr)
647  end if
648 #endif
649  enddo
650  deallocate( ginfo(gid)%preq_cnt )
651  deallocate( ginfo(gid)%preq_list )
652  deallocate( ginfo(gid)%packid )
653  ginfo(gid)%vars_num = 0
654 
655  end if
656 
657  deallocate( ginfo(gid)%req_cnt )
658  deallocate( ginfo(gid)%req_list )
659 
660  !$acc exit data delete(ginfo(gid)%recvpack_WE2P)
661  deallocate( ginfo(gid)%recvpack_WE2P )
662 
663  end if
664 
665  !$acc exit data delete(ginfo(gid)%sendpack_P2WE)
666  deallocate( ginfo(gid)%sendpack_P2WE )
667 #ifdef DEBUG
668  deallocate( ginfo(gid)%use_packbuf )
669 #endif
670 
671  end do
672 
673  if ( comm_use_mpi_onesided ) then
674  if ( group_packwe_created ) then
675  call mpi_group_free(group_packwe, ierr)
676  group_packwe_created = .false.
677  end if
678  if ( group_packns_created ) then
679  call mpi_group_free(group_packns, ierr)
680  group_packns_created = .false.
681  end if
682  end if
683 
684 
685  comm_gid = 0
686 
687  initialized = .false.
688 
689  return

Referenced by mod_rm_driver::rm_driver(), and mod_rm_prep::rm_prep().

Here is the caller graph for this function:

◆ comm_vars_init()

subroutine, public scale_comm_cartesc::comm_vars_init ( character(len=*), intent(in)  varname,
real(rp), dimension(:,:,:), intent(inout), target  var,
integer, intent(inout)  vid,
integer, intent(in), optional  gid 
)

Register variables.

Parameters
[in]varnamevariable name
[in,out]varvariable array for register
[in,out]vidvariable ID

Definition at line 699 of file scale_comm_cartesC.F90.

699  implicit none
700 
701  character(len=*), intent(in) :: varname
702  real(RP), target, intent(inout) :: var(:,:,:)
703  integer, intent(inout) :: vid
704 
705  integer, intent(in), optional :: gid
706 
707  integer :: gid_
708  integer :: vars_id
709  !---------------------------------------------------------------------------
710 
711  if ( .not. comm_use_mpi_pc ) return
712 #ifdef _OPENACC
713  if ( .not. acc_is_present(var) ) return
714 #endif
715 
716  call prof_rapstart('COMM_init_pers', 2)
717 
718  gid_ = 1
719  if ( present(gid) ) gid_ = gid
720  if ( gid_ > comm_gid_max ) then
721  log_error("COMM_vars_init",*) 'gid is invalid', gid_, comm_gid_max
722  call prc_abort
723  end if
724 
725  if ( vid > comm_vsize_max ) then
726  log_error("COMM_vars_init",*) 'vid exceeds max', vid, comm_vsize_max, gid
727  call prc_abort
728  end if
729 
730  ginfo(gid_)%vars_num = ginfo(gid_)%vars_num + 1
731  if ( ginfo(gid_)%vars_num > comm_vsize_max_pc ) then
732  log_error("COMM_vars_init",*) 'number of variable for MPI PC exceeds max', ginfo(gid_)%vars_num, comm_vsize_max_pc
733  call prc_abort
734  end if
735 
736  vars_id = ginfo(gid_)%vars_num
737  ginfo(gid_)%packid(vars_id) = vid
738 
739 #ifdef _OPENACC
740  if ( .not. acc_is_present(var) ) then
741  ginfo(gid_)%device_alloc(vars_id+comm_vsize_max) = .true.
742  ginfo(gid_)%device_ptr(vars_id*comm_vsize_max)%ptr => var
743  !$acc enter data copyin(var)
744  end if
745 #endif
746 
747  call vars_init_mpi_pc(var, gid_, vars_id, vid)
748 
749  vid = vars_id + comm_vsize_max
750 
751  log_info("COMM_vars_init",'(1x,A,I3.3,A,I3.3,2A)') 'Initialize variable (grid ID = ', gid_, '): ID = ', vid, &
752  ', name = ', trim(varname)
753 
754  call prof_rapend ('COMM_init_pers', 2)
755 
756  return

References vars_init_mpi_pc().

Here is the call graph for this function:

◆ comm_vars8_init()

subroutine, public scale_comm_cartesc::comm_vars8_init ( character(len=*), intent(in)  varname,
real(rp), dimension(:,:,:), intent(inout), target  var,
integer, intent(inout)  vid,
integer, intent(in), optional  gid 
)

Register variables.

Parameters
[in]varnamevariable name
[in,out]varvariable array for register
[in,out]vidvariable ID

Definition at line 766 of file scale_comm_cartesC.F90.

766  implicit none
767 
768  character(len=*), intent(in) :: varname
769 
770  real(RP), target, intent(inout) :: var(:,:,:)
771  integer, intent(inout) :: vid
772 
773  integer, intent(in), optional :: gid
774 
775  integer :: gid_
776  integer :: vars_id
777  !---------------------------------------------------------------------------
778 
779  if ( .not. comm_use_mpi_pc ) return
780 #ifdef _OPENACC
781  if ( .not. acc_is_present(var) ) return
782 #endif
783 
784  call prof_rapstart('COMM_init_pers', 2)
785 
786  gid_ = 1
787  if ( present(gid) ) gid_ = gid
788  if ( gid_ > comm_gid_max ) then
789  log_error("COMM_vars8_init",*) 'gid is invalid', gid_, comm_gid_max
790  call prc_abort
791  end if
792 
793  if ( vid > comm_vsize_max ) then
794  log_error("COMM_vars8_init",*) 'vid exceeds max', vid, comm_vsize_max
795  call prc_abort
796  end if
797 
798  ginfo(gid_)%vars_num = ginfo(gid_)%vars_num + 1
799  if ( ginfo(gid_)%vars_num > comm_vsize_max_pc ) then
800  log_error("COMM_vars8_init",*) 'number of variable for MPI PC exceeds max', ginfo(gid_)%vars_num, comm_vsize_max_pc
801  call prc_abort
802  end if
803 
804  vars_id = ginfo(gid_)%vars_num
805  ginfo(gid_)%packid(vars_id) = vid
806 
807 #ifdef _OPENACC
808  if ( .not. acc_is_present(var) ) then
809  ginfo(gid_)%device_alloc(vars_id+comm_vsize_max) = .true.
810  ginfo(gid_)%device_ptr(vars_id+comm_vsize_max)%ptr => var
811  !$acc enter data copyin(var)
812  end if
813 #endif
814 
815  call vars8_init_mpi_pc(var, gid_, vars_id, vid)
816 
817  vid = vars_id + comm_vsize_max
818 
819  log_info("COMM_vars8_init",'(1x,A,I3.3,A,I3.3,2A)') 'Initialize variable (grid ID = ', gid_, '): ID = ', vid, &
820  ', name = ', trim(varname)
821 
822  call prof_rapend ('COMM_init_pers', 2)
823 
824  return

References comm_world, scale_const::const_undef, copy_boundary_2d(), vars8_2d_mpi(), vars8_2d_mpi_onesided(), vars8_3d_mpi(), vars8_3d_mpi_onesided(), vars8_init_mpi_pc(), vars_2d_mpi(), vars_2d_mpi_onesided(), vars_3d_mpi(), vars_3d_mpi_onesided(), vars_3d_mpi_pc(), wait_2d_mpi(), wait_2d_mpi_onesided(), wait_3d_mpi(), wait_3d_mpi_onesided(), and wait_3d_mpi_pc().

Referenced by scale_atmos_dyn_fvm_numfilter::atmos_dyn_fvm_numfilter_setup(), scale_atmos_dyn::atmos_dyn_setup(), scale_atmos_dyn_tinteg_rkcommon::atmos_dyn_tinteg_rkcommon_setup(), scale_atmos_dyn_tinteg_short_rk11s8o::atmos_dyn_tinteg_short_rk11s8o_setup(), scale_atmos_dyn_tinteg_short_rk3::atmos_dyn_tinteg_short_rk3_setup(), scale_atmos_dyn_tinteg_short_rk4::atmos_dyn_tinteg_short_rk4_setup(), scale_atmos_dyn_tinteg_short_rk7s6o::atmos_dyn_tinteg_short_rk7s6o_setup(), scale_atmos_dyn_tinteg_tracer_linrk::atmos_dyn_tinteg_tracer_linrk_setup(), scale_atmos_dyn_tinteg_tracer_rk3::atmos_dyn_tinteg_tracer_rk3_setup(), and scale_atmos_dyn_tstep_large_fvm_heve::atmos_dyn_tstep_large_fvm_heve_setup().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ comm_horizontal_mean_3d()

subroutine scale_comm_cartesc::comm_horizontal_mean_3d ( integer, intent(in)  KA,
integer, intent(in)  IA,
integer, intent(in)  IS,
integer, intent(in)  IE,
integer, intent(in)  JA,
integer, intent(in)  JS,
integer, intent(in)  JE,
real(rp), dimension(ka,ia,ja), intent(in)  var,
real(rp), dimension(ka), intent(out)  varmean 
)

calculate horizontal mean (global total with communication) 3D

Parameters
[in]var3D value
[out]varmeanhorizontal mean

Definition at line 1122 of file scale_comm_cartesC.F90.

1122  use scale_const, only: &
1123  const_undef
1124  implicit none
1125 
1126  integer, intent(in) :: KA
1127  integer, intent(in) :: IA, IS, IE
1128  integer, intent(in) :: JA, JS, JE
1129  real(RP), intent(in) :: var(KA,IA,JA)
1130 
1131  real(RP), intent(out) :: varmean(KA)
1132 
1133  real(DP) :: stat (KA,2)
1134  real(DP) :: allstat(KA,2)
1135  real(DP) :: zerosw
1136 
1137  integer :: ierr
1138  integer :: k, i, j
1139 #ifdef _OPENACC
1140  logical :: flag_device
1141 #endif
1142  !---------------------------------------------------------------------------
1143 
1144 #ifdef _OPENACC
1145  flag_device = acc_is_present(var)
1146 #endif
1147 
1148  !$acc data create(stat, allstat) if(flag_device)
1149 
1150  !$acc kernels if(flag_device)
1151  stat(:,:) = 0.0_dp
1152  !$acc end kernels
1153  !$acc kernels if(flag_device)
1154  !$acc loop independent
1155  do j = js, je
1156  !$acc loop independent
1157  do i = is, ie
1158  do k = 1, ka
1159  if ( abs(var(k,i,j)) < abs(const_undef) ) then
1160  !$acc atomic update
1161  stat(k,1) = stat(k,1) + var(k,i,j)
1162  !$acc end atomic
1163  !$acc atomic update
1164  stat(k,2) = stat(k,2) + 1.0_dp
1165  !$acc end atomic
1166  endif
1167  enddo
1168  enddo
1169  enddo
1170  !$acc end kernels
1171 
1172 
1173  ! All reduce
1174  ! [NOTE] always communicate globally
1175  call prof_rapstart('COMM_Allreduce', 2)
1176  !$acc host_data use_device(stat, allstat) if(flag_device)
1177  call mpi_allreduce( stat, &
1178  allstat, &
1179  ka * 2, &
1180  mpi_double_precision, &
1181  mpi_sum, &
1182  comm_world, &
1183  ierr )
1184  !$acc end host_data
1185  call prof_rapend ('COMM_Allreduce', 2)
1186 
1187  !$acc kernels if(flag_device)
1188  do k = 1, ka
1189  zerosw = 0.5_dp - sign(0.5_dp, allstat(k,2) - 1.e-12_dp )
1190  varmean(k) = allstat(k,1) / ( allstat(k,2) + zerosw ) * ( 1.0_dp - zerosw )
1191  !LOG_INFO("COMM_horizontal_mean_3D",*) k, varmean(k), allstatval(k), allstatcnt(k)
1192  enddo
1193  !$acc end kernels
1194 
1195  !$acc end data
1196 
1197  return

References comm_world, and scale_const::const_undef.

◆ comm_gather_2d()

subroutine scale_comm_cartesc::comm_gather_2d ( integer, intent(in)  IA,
integer, intent(in)  JA,
real(rp), dimension(ia,ja), intent(in)  send,
real(rp), dimension(:,:,:), intent(out)  recv 
)

Get data from whole process value in 2D field.

Parameters
[in]jadimension size
[in]sendsend buffer
[out]recvreceive buffer (IA,JA,nprcs)

Definition at line 1206 of file scale_comm_cartesC.F90.

1206  use scale_prc, only: &
1208  implicit none
1209 
1210  integer, intent(in) :: IA, JA
1211  real(RP), intent(in) :: send(IA,JA)
1212 
1213  real(RP), intent(out) :: recv(:,:,:)
1214 
1215  integer :: sendcounts, recvcounts
1216  integer :: ierr
1217  !---------------------------------------------------------------------------
1218 
1219  sendcounts = ia * ja
1220  recvcounts = ia * ja
1221 
1222  !$acc host_data use_device(send, recv) if(acc_is_present(send))
1223  call mpi_gather( send(:,:), &
1224  sendcounts, &
1225  comm_datatype, &
1226  recv(:,:,:), &
1227  recvcounts, &
1228  comm_datatype, &
1229  prc_masterrank, &
1230  comm_world, &
1231  ierr )
1232  !$acc end host_data
1233 
1234  return

References comm_datatype, comm_world, and scale_prc::prc_masterrank.

◆ comm_gather_3d()

subroutine scale_comm_cartesc::comm_gather_3d ( integer, intent(in)  KA,
integer, intent(in)  IA,
integer, intent(in)  JA,
real(rp), dimension(ka,ia,ja), intent(in)  send,
real(rp), dimension(:,:,:,:), intent(out)  recv 
)

Get data from whole process value in 3D field.

Parameters
[in]jadimension size
[in]sendsend buffer
[out]recvreceive buffer(KA,IA,JA,nprcs)

Definition at line 1243 of file scale_comm_cartesC.F90.

1243  use scale_prc, only: &
1245  implicit none
1246 
1247  integer, intent(in) :: KA, IA, JA
1248  real(RP), intent(in) :: send(KA,IA,JA)
1249 
1250  real(RP), intent(out) :: recv(:,:,:,:)
1251 
1252  integer :: sendcounts, recvcounts
1253  integer :: ierr
1254  !---------------------------------------------------------------------------
1255 
1256  sendcounts = ka * ia * ja
1257  recvcounts = ka * ia * ja
1258 
1259  !$acc host_data use_device(send, recv) if(acc_is_present(send))
1260  call mpi_gather( send(:,:,:), &
1261  sendcounts, &
1262  comm_datatype, &
1263  recv(:,:,:,:), &
1264  recvcounts, &
1265  comm_datatype, &
1266  prc_masterrank, &
1267  comm_world, &
1268  ierr )
1269  !$acc end host_data
1270 
1271  return

References comm_datatype, comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_scr_sp()

subroutine scale_comm_cartesc::comm_bcast_scr_sp ( real(sp), intent(inout)  var)

Broadcast data for whole process value in scalar field.

Parameters
[in,out]varbroadcast buffer

Definition at line 1277 of file scale_comm_cartesC.F90.

1277  use scale_prc, only: &
1279  implicit none
1280 
1281  real(SP), intent(inout) :: var
1282 
1283  integer :: counts
1284  integer :: ierr
1285  !---------------------------------------------------------------------------
1286 
1287  call prof_rapstart('COMM_Bcast', 2)
1288 
1289  counts = 1
1290 
1291  call mpi_bcast( var, &
1292  counts, &
1293  mpi_real, &
1294  prc_masterrank, &
1295  comm_world, &
1296  ierr )
1297 
1298  call prof_rapend('COMM_Bcast', 2)
1299 
1300  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_scr_dp()

subroutine scale_comm_cartesc::comm_bcast_scr_dp ( real(dp), intent(inout)  var)
Parameters
[in,out]varbroadcast buffer

Definition at line 1303 of file scale_comm_cartesC.F90.

1303  use scale_prc, only: &
1305  implicit none
1306 
1307  real(DP), intent(inout) :: var
1308 
1309  integer :: counts
1310  integer :: ierr
1311  !---------------------------------------------------------------------------
1312 
1313  call prof_rapstart('COMM_Bcast', 2)
1314 
1315  counts = 1
1316 
1317  call mpi_bcast( var, &
1318  counts, &
1319  mpi_double_precision, &
1320  prc_masterrank, &
1321  comm_world, &
1322  ierr )
1323 
1324  call prof_rapend('COMM_Bcast', 2)
1325 
1326  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_1d_sp()

subroutine scale_comm_cartesc::comm_bcast_1d_sp ( integer, intent(in)  IA,
real(sp), dimension(ia), intent(inout)  var 
)

Broadcast data for whole process value in 1D field.

Parameters
[in]iadimension size
[in,out]varbroadcast buffer

Definition at line 1332 of file scale_comm_cartesC.F90.

1332  use scale_prc, only: &
1334  implicit none
1335 
1336  integer, intent(in) :: IA
1337 
1338  real(SP), intent(inout) :: var(IA)
1339 
1340  integer :: counts
1341  integer :: ierr
1342  !---------------------------------------------------------------------------
1343 
1344  call prof_rapstart('COMM_Bcast', 2)
1345 
1346  counts = ia
1347 
1348  !$acc host_data use_device(var) if(acc_is_present(var))
1349  call mpi_bcast( var(:), &
1350  counts, &
1351  mpi_real, &
1352  prc_masterrank, &
1353  comm_world, &
1354  ierr )
1355  !$acc end host_data
1356 
1357  call prof_rapend('COMM_Bcast', 2)
1358 
1359  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_1d_dp()

subroutine scale_comm_cartesc::comm_bcast_1d_dp ( integer, intent(in)  IA,
real(dp), dimension(ia), intent(inout)  var 
)
Parameters
[in]iadimension size
[in,out]varbroadcast buffer

Definition at line 1362 of file scale_comm_cartesC.F90.

1362  use scale_prc, only: &
1364  implicit none
1365 
1366  integer, intent(in) :: IA
1367 
1368  real(DP), intent(inout) :: var(IA)
1369 
1370  integer :: counts
1371  integer :: ierr
1372  !---------------------------------------------------------------------------
1373 
1374  call prof_rapstart('COMM_Bcast', 2)
1375 
1376  counts = ia
1377 
1378  !$acc host_data use_device(var) if(acc_is_present(var))
1379  call mpi_bcast( var(:), &
1380  counts, &
1381  mpi_double_precision, &
1382  prc_masterrank, &
1383  comm_world, &
1384  ierr )
1385  !$acc end host_data
1386 
1387  call prof_rapend('COMM_Bcast', 2)
1388 
1389  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_2d_sp()

subroutine scale_comm_cartesc::comm_bcast_2d_sp ( integer, intent(in)  IA,
integer, intent(in)  JA,
real(sp), dimension(ia,ja), intent(inout)  var 
)

Broadcast data for whole process value in 2D field.

Parameters
[in]jadimension size
[in,out]varbroadcast buffer

Definition at line 1395 of file scale_comm_cartesC.F90.

1395  use scale_prc, only: &
1397  implicit none
1398 
1399  integer, intent(in) :: IA, JA
1400 
1401  real(SP), intent(inout) :: var(IA,JA)
1402 
1403  integer :: counts
1404  integer :: ierr
1405  !---------------------------------------------------------------------------
1406 
1407  call prof_rapstart('COMM_Bcast', 2)
1408 
1409  counts = ia * ja
1410 
1411  !$acc host_data use_device(var) if(acc_is_present(var))
1412  call mpi_bcast( var(:,:), &
1413  counts, &
1414  mpi_real, &
1415  prc_masterrank, &
1416  comm_world, &
1417  ierr )
1418  !$acc end host_data
1419 
1420  call prof_rapend('COMM_Bcast', 2)
1421 
1422  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_2d_dp()

subroutine scale_comm_cartesc::comm_bcast_2d_dp ( integer, intent(in)  IA,
integer, intent(in)  JA,
real(dp), dimension(ia,ja), intent(inout)  var 
)
Parameters
[in]jadimension size
[in,out]varbroadcast buffer

Definition at line 1425 of file scale_comm_cartesC.F90.

1425  use scale_prc, only: &
1427  implicit none
1428 
1429  integer, intent(in) :: IA, JA
1430 
1431  real(DP), intent(inout) :: var(IA,JA)
1432 
1433  integer :: counts
1434  integer :: ierr
1435  !---------------------------------------------------------------------------
1436 
1437  call prof_rapstart('COMM_Bcast', 2)
1438 
1439  counts = ia * ja
1440 
1441  !$acc host_data use_device(var) if(acc_is_present(var))
1442  call mpi_bcast( var(:,:), &
1443  counts, &
1444  mpi_double_precision, &
1445  prc_masterrank, &
1446  comm_world, &
1447  ierr )
1448  !$acc end host_data
1449 
1450  call prof_rapend('COMM_Bcast', 2)
1451 
1452  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_3d_sp()

subroutine scale_comm_cartesc::comm_bcast_3d_sp ( integer, intent(in)  KA,
integer, intent(in)  IA,
integer, intent(in)  JA,
real(sp), dimension(ka,ia,ja), intent(inout)  var 
)

Broadcast data for whole process value in 3D field.

Parameters
[in]jadimension size
[in,out]varbroadcast buffer

Definition at line 1458 of file scale_comm_cartesC.F90.

1458  use scale_prc, only: &
1460  implicit none
1461 
1462  integer, intent(in) :: KA, IA, JA
1463 
1464  real(SP), intent(inout) :: var(KA,IA,JA)
1465 
1466  integer :: counts
1467  integer :: ierr
1468  !---------------------------------------------------------------------------
1469 
1470  call prof_rapstart('COMM_Bcast', 2)
1471 
1472  counts = ka * ia * ja
1473 
1474  !$acc host_data use_device(var) if(acc_is_present(var))
1475  call mpi_bcast( var(:,:,:), &
1476  counts, &
1477  mpi_real, &
1478  prc_masterrank, &
1479  comm_world, &
1480  ierr )
1481  !$acc end host_data
1482 
1483  call prof_rapend('COMM_Bcast', 2)
1484 
1485  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_3d_dp()

subroutine scale_comm_cartesc::comm_bcast_3d_dp ( integer, intent(in)  KA,
integer, intent(in)  IA,
integer, intent(in)  JA,
real(dp), dimension(ka,ia,ja), intent(inout)  var 
)
Parameters
[in]jadimension size
[in,out]varbroadcast buffer

Definition at line 1488 of file scale_comm_cartesC.F90.

1488  use scale_prc, only: &
1490  implicit none
1491 
1492  integer, intent(in) :: KA, IA, JA
1493 
1494  real(DP), intent(inout) :: var(KA,IA,JA)
1495 
1496  integer :: counts
1497  integer :: ierr
1498  !---------------------------------------------------------------------------
1499 
1500  call prof_rapstart('COMM_Bcast', 2)
1501 
1502  counts = ka * ia * ja
1503 
1504  !$acc host_data use_device(var) if(acc_is_present(var))
1505  call mpi_bcast( var(:,:,:), &
1506  counts, &
1507  mpi_double_precision, &
1508  prc_masterrank, &
1509  comm_world, &
1510  ierr )
1511  !$acc end host_data
1512 
1513  call prof_rapend('COMM_Bcast', 2)
1514 
1515  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_4d_sp()

subroutine scale_comm_cartesc::comm_bcast_4d_sp ( integer, intent(in)  KA,
integer, intent(in)  IA,
integer, intent(in)  JA,
integer, intent(in)  NT,
real(sp), dimension(ka,ia,ja,nt), intent(inout)  var 
)

Broadcast data for whole process value in 4D field.

Parameters
[in]ntdimension size
[in,out]varbroadcast buffer

Definition at line 1521 of file scale_comm_cartesC.F90.

1521  use scale_prc, only: &
1523  implicit none
1524 
1525  integer, intent(in) :: KA, IA, JA, NT
1526 
1527  real(SP), intent(inout) :: var(KA,IA,JA,NT)
1528 
1529  integer :: counts
1530  integer :: ierr
1531  !---------------------------------------------------------------------------
1532 
1533  call prof_rapstart('COMM_Bcast', 2)
1534 
1535  counts = ka * ia * ja * nt
1536  if ( ka>0 .AND. ia>0 .AND. ja>0 .AND. nt>0 .AND. &
1537  counts < 0 ) then
1538  log_error("COMM_bcast_4D",*) 'counts overflow'
1539  call prc_abort
1540  end if
1541 
1542  !$acc host_data use_device(var) if(acc_is_present(var))
1543  call mpi_bcast( var(:,:,:,:), &
1544  counts, &
1545  mpi_real, &
1546  prc_masterrank, &
1547  comm_world, &
1548  ierr )
1549  !$acc end host_data
1550 
1551  call prof_rapend('COMM_Bcast', 2)
1552 
1553  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_4d_dp()

subroutine scale_comm_cartesc::comm_bcast_4d_dp ( integer, intent(in)  KA,
integer, intent(in)  IA,
integer, intent(in)  JA,
integer, intent(in)  NT,
real(dp), dimension(ka,ia,ja,nt), intent(inout)  var 
)
Parameters
[in]ntdimension size
[in,out]varbroadcast buffer

Definition at line 1556 of file scale_comm_cartesC.F90.

1556  use scale_prc, only: &
1558  implicit none
1559 
1560  integer, intent(in) :: KA, IA, JA, NT
1561 
1562  real(DP), intent(inout) :: var(KA,IA,JA,NT)
1563 
1564  integer :: counts
1565  integer :: ierr
1566  !---------------------------------------------------------------------------
1567 
1568  call prof_rapstart('COMM_Bcast', 2)
1569 
1570  counts = ka * ia * ja * nt
1571  if ( ka>0 .AND. ia>0 .AND. ja>0 .AND. nt>0 .AND. &
1572  counts < 0 ) then
1573  log_error("COMM_bcast_4D",*) 'counts overflow'
1574  call prc_abort
1575  end if
1576 
1577  !$acc host_data use_device(var) if(acc_is_present(var))
1578  call mpi_bcast( var(:,:,:,:), &
1579  counts, &
1580  mpi_double_precision, &
1581  prc_masterrank, &
1582  comm_world, &
1583  ierr )
1584  !$acc end host_data
1585 
1586  call prof_rapend('COMM_Bcast', 2)
1587 
1588  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_int_scr()

subroutine scale_comm_cartesc::comm_bcast_int_scr ( integer, intent(inout)  var)

Broadcast data for whole process value in scalar (integer)

Parameters
[in,out]varbroadcast buffer

Definition at line 1594 of file scale_comm_cartesC.F90.

1594  use scale_prc, only: &
1596  implicit none
1597 
1598  integer, intent(inout) :: var
1599 
1600  integer :: counts
1601  integer :: ierr
1602  !---------------------------------------------------------------------------
1603 
1604  call prof_rapstart('COMM_Bcast', 2)
1605 
1606  counts = 1
1607 
1608  call mpi_bcast( var, &
1609  counts, &
1610  mpi_integer, &
1611  prc_masterrank, &
1612  comm_world, &
1613  ierr )
1614 
1615  call prof_rapend('COMM_Bcast', 2)
1616 
1617  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_int_1d()

subroutine scale_comm_cartesc::comm_bcast_int_1d ( integer, intent(in)  IA,
integer, dimension(ia), intent(inout)  var 
)

Broadcast data for whole process value in 1D field (integer)

Parameters
[in]iadimension size
[in,out]varbroadcast buffer

Definition at line 1623 of file scale_comm_cartesC.F90.

1623  use scale_prc, only: &
1625  implicit none
1626 
1627  integer, intent(in) :: IA
1628  integer, intent(inout) :: var(IA)
1629 
1630  integer :: counts
1631  integer :: ierr
1632  !---------------------------------------------------------------------------
1633 
1634  call prof_rapstart('COMM_Bcast', 2)
1635 
1636  counts = ia
1637 
1638  call mpi_bcast( var(:), &
1639  counts, &
1640  mpi_integer, &
1641  prc_masterrank, &
1642  comm_world, &
1643  ierr )
1644 
1645  call prof_rapend('COMM_Bcast', 2)
1646 
1647  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_int_2d()

subroutine scale_comm_cartesc::comm_bcast_int_2d ( integer, intent(in)  IA,
integer, intent(in)  JA,
integer, dimension(ia,ja), intent(inout)  var 
)

Broadcast data for whole process value in 2D field (integer)

Parameters
[in]jadimension size
[in,out]varbroadcast buffer

Definition at line 1653 of file scale_comm_cartesC.F90.

1653  use scale_prc, only: &
1655  implicit none
1656 
1657  integer, intent(in) :: IA, JA
1658 
1659  integer, intent(inout) :: var(IA,JA)
1660 
1661  integer :: counts
1662  integer :: ierr
1663  !---------------------------------------------------------------------------
1664 
1665  call prof_rapstart('COMM_Bcast', 2)
1666 
1667  counts = ia * ja
1668 
1669  !$acc host_data use_device(var) if(acc_is_present(var))
1670  call mpi_bcast( var(:,:), &
1671  counts, &
1672  mpi_integer, &
1673  prc_masterrank, &
1674  comm_world, &
1675  ierr )
1676  !$acc end host_data
1677 
1678  call prof_rapend('COMM_Bcast', 2)
1679 
1680  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_logical_scr()

subroutine scale_comm_cartesc::comm_bcast_logical_scr ( logical, intent(inout)  var)

Broadcast data for whole process value in scalar (logical)

Parameters
[in,out]varbroadcast buffer

Definition at line 1686 of file scale_comm_cartesC.F90.

1686  use scale_prc, only: &
1688  implicit none
1689 
1690  logical, intent(inout) :: var
1691 
1692  integer :: counts
1693  integer :: ierr
1694  !---------------------------------------------------------------------------
1695 
1696  call prof_rapstart('COMM_Bcast', 2)
1697 
1698  counts = 1
1699 
1700  call mpi_bcast( var, &
1701  counts, &
1702  mpi_logical, &
1703  prc_masterrank, &
1704  comm_world, &
1705  ierr )
1706 
1707  call prof_rapend('COMM_Bcast', 2)
1708 
1709  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_logical_1d()

subroutine scale_comm_cartesc::comm_bcast_logical_1d ( integer, intent(in)  IA,
logical, dimension(ia), intent(inout)  var 
)

Broadcast data for whole process value in 1D (logical)

Parameters
[in]iadimension size
[in,out]varbroadcast buffer

Definition at line 1715 of file scale_comm_cartesC.F90.

1715  use scale_prc, only: &
1717  implicit none
1718 
1719  integer, intent(in) :: IA
1720  logical, intent(inout) :: var(IA)
1721 
1722  integer :: counts
1723  integer :: ierr
1724  !---------------------------------------------------------------------------
1725 
1726  call prof_rapstart('COMM_Bcast', 2)
1727 
1728  counts = ia
1729 
1730  !$acc host_data use_device(var) if(acc_is_present(var))
1731  call mpi_bcast( var(:), &
1732  counts, &
1733  mpi_logical, &
1734  prc_masterrank, &
1735  comm_world, &
1736  ierr )
1737  !$acc end host_data
1738 
1739  call prof_rapend('COMM_Bcast', 2)
1740 
1741  return

References comm_world, and scale_prc::prc_masterrank.

◆ comm_bcast_character()

subroutine scale_comm_cartesc::comm_bcast_character ( character(len=*), intent(inout)  var)

Broadcast data for whole process value in character.

Parameters
[in,out]varbroadcast buffer

Definition at line 1747 of file scale_comm_cartesC.F90.

1747  use scale_prc, only: &
1749  implicit none
1750 
1751  character(len=*), intent(inout) :: var
1752 
1753  integer :: counts
1754  integer :: ierr
1755  !---------------------------------------------------------------------------
1756 
1757  call prof_rapstart('COMM_Bcast', 2)
1758 
1759  counts = len(var)
1760 
1761  call mpi_bcast( var, &
1762  counts, &
1763  mpi_character, &
1764  prc_masterrank, &
1765  comm_world, &
1766  ierr )
1767 
1768  call prof_rapend('COMM_Bcast', 2)
1769 
1770  return

References comm_world, and scale_prc::prc_masterrank.

◆ vars_init_mpi_pc()

subroutine scale_comm_cartesc::vars_init_mpi_pc ( real(rp), dimension(:,:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid,
integer, intent(in)  seqid 
)

Definition at line 1777 of file scale_comm_cartesC.F90.

1777  use scale_prc_cartesc, only: &
1778  prc_twod
1779  implicit none
1780 
1781  real(RP), intent(inout) :: var(:,:,:)
1782  integer, intent(in) :: gid
1783  integer, intent(in) :: vid
1784  integer, intent(in) :: seqid
1785 
1786  integer :: ireq, tag, ierr
1787  logical :: flag
1788 
1789  integer :: KA
1790  integer :: JA, JS, JE, JHALO
1791 
1792  integer :: nreq
1793  integer :: i
1794 
1795 #ifdef _OPENACC
1796  real(RP), pointer :: ptr(:,:)
1797 #endif
1798 
1799  tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
1800  ireq = 1
1801 
1802  ka = ginfo(gid)%KA
1803  ja = ginfo(gid)%JA
1804  js = ginfo(gid)%JS
1805  je = ginfo(gid)%JE
1806  jhalo = ginfo(gid)%JHALO
1807 
1808  !$acc host_data use_device(var)
1809 
1810  ! register whole array to inner table of MPI and/or lower library
1811  ! otherwise a lot of sub small segments would be registered
1812  call mpi_send_init( var(:,:,:), size(var), comm_datatype, &
1813  mpi_proc_null, tag+ginfo(gid)%nreq_max+1, comm_world, &
1814  ginfo(gid)%preq_list(ginfo(gid)%nreq_max+1,vid), ierr )
1815 
1816  !--- From 4-Direction HALO communicate
1817  ! From S
1818  if ( prc_has_s ) then
1819  call mpi_recv_init( var(:,:,1:js-1), ginfo(gid)%size2D_NS4*ka, comm_datatype, &
1820  prc_next(prc_s), tag+1, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1821  ireq = ireq + 1
1822  end if
1823  ! From N
1824  if ( prc_has_n ) then
1825  call mpi_recv_init( var(:,:,je+1:ja), ginfo(gid)%size2D_NS4*ka, comm_datatype, &
1826  prc_next(prc_n), tag+2, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1827  ireq = ireq + 1
1828  end if
1829  if ( .not. prc_twod ) then
1830 #ifdef _OPENACC
1831  ptr => ginfo(gid)%recvpack_WE2P(:,:,seqid)
1832  !$acc host_data use_device(ptr)
1833 #endif
1834 
1835  ! From E
1836  if ( prc_has_e ) then
1837 #ifdef _OPENACC
1838  call mpi_recv_init( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
1839 #else
1840  call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,2,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
1841 #endif
1842  prc_next(prc_e), tag+3, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1843  ireq = ireq + 1
1844  end if
1845  ! From W
1846  if ( prc_has_w ) then
1847 #ifdef _OPENACC
1848  call mpi_recv_init( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
1849 #else
1850  call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,1,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
1851 #endif
1852  prc_next(prc_w), tag+4, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1853  ireq = ireq + 1
1854  end if
1855  !$acc end host_data
1856  end if
1857 
1858  !--- To 4-Direction HALO communicate
1859  if ( .not. prc_twod ) then
1860 #ifdef _OPENACC
1861  ptr => ginfo(gid)%sendpack_P2WE(:,:,seqid)
1862  !$acc host_data use_device(ptr)
1863 #endif
1864  ! To W HALO
1865  if ( prc_has_w ) then
1866 #ifdef _OPENACC
1867  call mpi_send_init( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
1868 #else
1869  call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,1,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
1870 #endif
1871  prc_next(prc_w), tag+3, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1872  ireq = ireq + 1
1873  end if
1874  ! To E HALO
1875  if ( prc_has_e ) then
1876 #ifdef _OPENACC
1877  call mpi_send_init( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
1878 #else
1879  call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,2,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
1880 #endif
1881  prc_next(prc_e), tag+4, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1882  ireq = ireq + 1
1883  end if
1884  !$acc end host_data
1885  end if
1886  ! To N HALO
1887  if ( prc_has_n ) then
1888  call mpi_send_init( var(:,:,je-jhalo+1:je), ginfo(gid)%size2D_NS4*ka, comm_datatype, &
1889  prc_next(prc_n), tag+1, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1890  ireq = ireq + 1
1891  end if
1892  ! To S HALO
1893  if ( prc_has_s ) then
1894  call mpi_send_init( var(:,:,js:js+jhalo-1), ginfo(gid)%size2D_NS4*ka, comm_datatype, &
1895  prc_next(prc_s), tag+2, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1896  ireq = ireq + 1
1897  end if
1898 
1899  ginfo(gid)%preq_cnt(vid) = ireq - 1
1900 
1901  ! to finish initial processes of MPI
1902  nreq = ginfo(gid)%preq_cnt(vid)
1903  do i = 1, 32
1904  call mpi_testall( nreq, ginfo(gid)%preq_list(1:nreq,vid), &
1905  flag, mpi_statuses_ignore, ierr )
1906  enddo
1907 
1908  !$acc end host_data
1909 
1910  return

References comm_datatype, comm_world, and scale_prc_cartesc::prc_twod.

Referenced by comm_vars_init().

Here is the caller graph for this function:

◆ vars8_init_mpi_pc()

subroutine scale_comm_cartesc::vars8_init_mpi_pc ( real(rp), dimension(:,:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid,
integer, intent(in)  seqid 
)

Definition at line 1914 of file scale_comm_cartesC.F90.

1914  use scale_prc_cartesc, only: &
1915  prc_twod
1916  implicit none
1917 
1918  real(RP), intent(inout) :: var(:,:,:)
1919  integer, intent(in) :: gid
1920  integer, intent(in) :: vid
1921  integer, intent(in) :: seqid
1922 
1923  integer :: ireq, tag, tagc
1924  integer :: ierr
1925  logical :: flag
1926 
1927  integer :: KA
1928  integer :: IS, IE, IHALO
1929  integer :: JA, JS, JE, JHALO
1930 
1931  integer :: nreq
1932  integer :: i, j
1933 
1934 #ifdef _OPENACC
1935  real(RP), pointer :: ptr(:,:)
1936 #endif
1937 
1938  ka = ginfo(gid)%KA
1939  is = ginfo(gid)%IS
1940  ie = ginfo(gid)%IE
1941  ihalo = ginfo(gid)%IHALO
1942  ja = ginfo(gid)%JA
1943  js = ginfo(gid)%JS
1944  je = ginfo(gid)%JE
1945  jhalo = ginfo(gid)%JHALO
1946 
1947  tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
1948  ireq = 1
1949 
1950  !$acc host_data use_device(var)
1951 
1952  ! register whole array to inner table of MPI and/or lower library
1953  ! otherwise a lot of sub small segments would be registered
1954  call mpi_send_init( var(:,:,:), size(var), comm_datatype, &
1955  mpi_proc_null, tag+ginfo(gid)%nreq_max+1, comm_world, &
1956  ginfo(gid)%preq_list(ginfo(gid)%nreq_max+1,vid), ierr )
1957 
1958 
1959  if ( comm_isallperiodic ) then ! periodic condition
1960 
1961  !--- From 8-Direction HALO communicate
1962  if ( .not. prc_twod ) then
1963  ! From SE
1964  tagc = 0
1965  do j = 1, js-1
1966  call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
1967  prc_next(prc_se), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1968  ireq = ireq + 1
1969  tagc = tagc + 1
1970  enddo
1971  ! From SW
1972  tagc = 10
1973  do j = 1, js-1
1974  call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
1975  prc_next(prc_sw), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1976  ireq = ireq + 1
1977  tagc = tagc + 1
1978  enddo
1979  ! From NE
1980  tagc = 20
1981  do j = je+1, ja
1982  call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
1983  prc_next(prc_ne), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1984  ireq = ireq + 1
1985  tagc = tagc + 1
1986  enddo
1987  ! From NW
1988  tagc = 30
1989  do j = je+1, je+jhalo
1990  call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
1991  prc_next(prc_nw), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
1992  ireq = ireq + 1
1993  tagc = tagc + 1
1994  enddo
1995  ! From E
1996  tagc = 60
1997 #ifdef _OPENACC
1998  ptr => ginfo(gid)%recvpack_WE2P(:,:,seqid)
1999  !$acc host_data use_device(ptr)
2000  call mpi_recv_init( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2001 #else
2002  call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,2,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2003 #endif
2004  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2005  ireq = ireq + 1
2006  ! From W
2007  tagc = 70
2008 #ifdef _OPENACC
2009  call mpi_recv_init( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2010 #else
2011  call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,1,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2012 #endif
2013  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2014  !$acc end host_data
2015  ireq = ireq + 1
2016  end if
2017  ! From S
2018  tagc = 40
2019  do j = 1, js-1
2020  call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
2021  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2022  ireq = ireq + 1
2023  tagc = tagc + 1
2024  enddo
2025  ! From N
2026  tagc = 50
2027  do j = je+1, ja
2028  call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
2029  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2030  ireq = ireq + 1
2031  tagc = tagc + 1
2032  enddo
2033 
2034  !--- To 8-Direction HALO communicate
2035  ! To N HALO
2036  tagc = 40
2037  do j = je-jhalo+1, je
2038  call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
2039  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2040  ireq = ireq + 1
2041  tagc = tagc + 1
2042  enddo
2043  ! To S HALO
2044  tagc = 50
2045  do j = js, js+jhalo-1
2046  call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
2047  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2048  ireq = ireq + 1
2049  tagc = tagc + 1
2050  enddo
2051  if ( .not. prc_twod ) then
2052  ! To W HALO
2053  tagc = 60
2054 #ifdef _OPENACC
2055  ptr => ginfo(gid)%sendpack_P2WE(:,:,seqid)
2056  !$acc host_data use_device(ptr)
2057  call mpi_send_init( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2058 #else
2059  call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,1,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2060 #endif
2061  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2062  ireq = ireq + 1
2063  ! To E HALO
2064  tagc = 70
2065 #ifdef _OPENACC
2066  call mpi_send_init( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2067 #else
2068  call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,2,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2069 #endif
2070  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2071  !$acc end host_data
2072  ireq = ireq + 1
2073  ! To NW HALO
2074  tagc = 0
2075  do j = je-jhalo+1, je
2076  call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2077  prc_next(prc_nw), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2078  ireq = ireq + 1
2079  tagc = tagc + 1
2080  enddo
2081  ! To NE HALO
2082  tagc = 10
2083  do j = je-jhalo+1, je
2084  call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2085  prc_next(prc_ne), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2086  ireq = ireq + 1
2087  tagc = tagc + 1
2088  enddo
2089  ! To SW HALO
2090  tagc = 20
2091  do j = js, js+jhalo-1
2092  call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2093  prc_next(prc_sw), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2094  ireq = ireq + 1
2095  tagc = tagc + 1
2096  enddo
2097  ! To SE HALO
2098  tagc = 30
2099  do j = js, js+jhalo-1
2100  call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2101  prc_next(prc_se), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2102  ireq = ireq + 1
2103  tagc = tagc + 1
2104  enddo
2105  end if
2106 
2107  else ! non-periodic condition
2108 
2109  !--- From 8-Direction HALO communicate
2110  if ( .not. prc_twod ) then
2111  ! From SE
2112  if ( prc_has_s .AND. prc_has_e ) then
2113  tagc = 0
2114  do j = 1, js-1
2115  call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2116  prc_next(prc_se), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2117  ireq = ireq + 1
2118  tagc = tagc + 1
2119  enddo
2120  else if ( prc_has_s ) then
2121  tagc = 0
2122  do j = 1, js-1
2123  call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2124  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2125  ireq = ireq + 1
2126  tagc = tagc + 1
2127  enddo
2128  else if ( prc_has_e ) then
2129  tagc = 0
2130  do j = 1, js-1
2131  call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2132  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2133  ireq = ireq + 1
2134  tagc = tagc + 1
2135  enddo
2136  endif
2137  ! From SW
2138  if ( prc_has_s .AND. prc_has_w ) then
2139  tagc = 10
2140  do j = 1, js-1
2141  call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2142  prc_next(prc_sw), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2143  ireq = ireq + 1
2144  tagc = tagc + 1
2145  enddo
2146  else if ( prc_has_s ) then
2147  tagc = 10
2148  do j = 1, js-1
2149  call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2150  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2151  ireq = ireq + 1
2152  tagc = tagc + 1
2153  enddo
2154  else if ( prc_has_w ) then
2155  tagc = 10
2156  do j = 1, js-1
2157  call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2158  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2159  ireq = ireq + 1
2160  tagc = tagc + 1
2161  enddo
2162  endif
2163  ! From NE
2164  if ( prc_has_n .AND. prc_has_e ) then
2165  tagc = 20
2166  do j = je+1, ja
2167  call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2168  prc_next(prc_ne), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2169  ireq = ireq + 1
2170  tagc = tagc + 1
2171  enddo
2172  else if ( prc_has_n ) then
2173  tagc = 20
2174  do j = je+1, ja
2175  call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2176  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2177  ireq = ireq + 1
2178  tagc = tagc + 1
2179  enddo
2180  else if ( prc_has_e ) then
2181  tagc = 20
2182  do j = je+1, ja
2183  call mpi_recv_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2184  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2185  ireq = ireq + 1
2186  tagc = tagc + 1
2187  enddo
2188  endif
2189  ! From NW
2190  if ( prc_has_n .AND. prc_has_w ) then
2191  tagc = 30
2192  do j = je+1, ja
2193  call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2194  prc_next(prc_nw), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2195  ireq = ireq + 1
2196  tagc = tagc + 1
2197  enddo
2198  else if ( prc_has_n ) then
2199  tagc = 30
2200  do j = je+1, ja
2201  call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2202  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2203  ireq = ireq + 1
2204  tagc = tagc + 1
2205  enddo
2206  else if ( prc_has_w ) then
2207  tagc = 30
2208  do j = je+1, ja
2209  call mpi_recv_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2210  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2211  ireq = ireq + 1
2212  tagc = tagc + 1
2213  enddo
2214  endif
2215 #ifdef _OPENACC
2216  ptr => ginfo(gid)%recvpack_WE2P(:,:,seqid)
2217  !$acc host_data use_device(ptr)
2218 #endif
2219  ! From E
2220  if ( prc_has_e ) then
2221  tagc = 60
2222 #ifdef _OPENACC
2223  call mpi_recv_init( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2224 #else
2225  call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,2,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2226 #endif
2227  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2228  ireq = ireq + 1
2229  endif
2230  ! From W
2231  if ( prc_has_w ) then
2232  tagc = 70
2233 #ifdef _OPENACC
2234  call mpi_recv_init( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2235 #else
2236  call mpi_recv_init( ginfo(gid)%recvpack_WE2P(:,1,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2237 #endif
2238  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2239  ireq = ireq + 1
2240  endif
2241  !$acc end host_data
2242  end if
2243  ! From S
2244  if ( prc_has_s ) then
2245  tagc = 40
2246  do j = 1, js-1
2247  call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
2248  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2249  ireq = ireq + 1
2250  tagc = tagc + 1
2251  enddo
2252  endif
2253  ! From N
2254  if ( prc_has_n ) then
2255  tagc = 50
2256  do j = je+1, ja
2257  call mpi_recv_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
2258  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2259  ireq = ireq + 1
2260  tagc = tagc + 1
2261  enddo
2262  endif
2263 
2264  !--- To 8-Direction HALO communicate
2265  ! To N HALO
2266  if ( prc_has_n ) then
2267  tagc = 40
2268  do j = je-jhalo+1, je
2269  call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
2270  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2271  ireq = ireq + 1
2272  tagc = tagc + 1
2273  enddo
2274  endif
2275  ! To S HALO
2276  if ( prc_has_s ) then
2277  tagc = 50
2278  do j = js, js+jhalo-1
2279  call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
2280  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2281  ireq = ireq + 1
2282  tagc = tagc + 1
2283  enddo
2284  endif
2285  if ( .not. prc_twod ) then
2286 #ifdef _OPENACC
2287  ptr => ginfo(gid)%sendpack_P2WE(:,:,seqid)
2288  !$acc host_data use_device(ptr)
2289 #endif
2290  ! To W HALO
2291  if ( prc_has_w ) then
2292  tagc = 60
2293 #ifdef _OPENACC
2294  call mpi_send_init( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2295 #else
2296  call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,1,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2297 #endif
2298  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2299  ireq = ireq + 1
2300  endif
2301  ! To E HALO
2302  if ( prc_has_e ) then
2303  tagc = 70
2304 #ifdef _OPENACC
2305  call mpi_send_init( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2306 #else
2307  call mpi_send_init( ginfo(gid)%sendpack_P2WE(:,2,seqid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2308 #endif
2309  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2310  ireq = ireq + 1
2311  endif
2312  !$acc end host_data
2313  ! To NW HALO
2314  if ( prc_has_n .AND. prc_has_w ) then
2315  tagc = 0
2316  do j = je-jhalo+1, je
2317  call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2318  prc_next(prc_nw), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2319  ireq = ireq + 1
2320  tagc = tagc + 1
2321  enddo
2322  else if ( prc_has_n ) then
2323  tagc = 10
2324  do j = je-jhalo+1, je
2325  call mpi_send_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2326  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2327  ireq = ireq + 1
2328  tagc = tagc + 1
2329  enddo
2330  else if ( prc_has_w ) then
2331  tagc = 20
2332  do j = je+1, ja
2333  call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2334  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2335  ireq = ireq + 1
2336  tagc = tagc + 1
2337  enddo
2338  endif
2339  ! To NE HALO
2340  if ( prc_has_n .AND. prc_has_e ) then
2341  tagc = 10
2342  do j = je-jhalo+1, je
2343  call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2344  prc_next(prc_ne), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2345  ireq = ireq + 1
2346  tagc = tagc + 1
2347  enddo
2348  else if ( prc_has_n ) then
2349  tagc = 0
2350  do j = je-jhalo+1, je
2351  call mpi_send_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2352  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2353  ireq = ireq + 1
2354  tagc = tagc + 1
2355  enddo
2356  else if ( prc_has_e ) then
2357  tagc = 30
2358  do j = je+1, ja
2359  call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2360  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2361  ireq = ireq + 1
2362  tagc = tagc + 1
2363  enddo
2364  endif
2365  ! To SW HALO
2366  if ( prc_has_s .AND. prc_has_w ) then
2367  tagc = 20
2368  do j = js, js+jhalo-1
2369  call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2370  prc_next(prc_sw), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2371  ireq = ireq + 1
2372  tagc = tagc + 1
2373  enddo
2374  else if ( prc_has_s ) then
2375  tagc = 30
2376  do j = js, js+jhalo-1
2377  call mpi_send_init( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2378  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2379  ireq = ireq + 1
2380  tagc = tagc + 1
2381  enddo
2382  else if ( prc_has_w ) then
2383  tagc = 0
2384  do j = 1, js-1
2385  call mpi_send_init( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2386  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2387  ireq = ireq + 1
2388  tagc = tagc + 1
2389  enddo
2390  endif
2391  ! To SE HALO
2392  if ( prc_has_s .AND. prc_has_e ) then
2393  tagc = 30
2394  do j = js, js+jhalo-1
2395  call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2396  prc_next(prc_se), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2397  ireq = ireq + 1
2398  tagc = tagc + 1
2399  enddo
2400  else if ( prc_has_s ) then
2401  tagc = 20
2402  do j = js, js+jhalo-1
2403  call mpi_send_init( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2404  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2405  ireq = ireq + 1
2406  tagc = tagc + 1
2407  enddo
2408  else if ( prc_has_e ) then
2409  tagc = 10
2410  do j = 1, js-1
2411  call mpi_send_init( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2412  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%preq_list(ireq,vid), ierr )
2413  ireq = ireq + 1
2414  tagc = tagc + 1
2415  enddo
2416  endif
2417  end if
2418 
2419  endif
2420 
2421  ginfo(gid)%preq_cnt(vid) = ireq - 1
2422 
2423  ! to finish initial processes of MPI
2424  nreq = ginfo(gid)%preq_cnt(vid)
2425  do i = 1, 32
2426  call mpi_testall( nreq, ginfo(gid)%preq_list(1:nreq,vid), &
2427  flag, mpi_statuses_ignore, ierr )
2428  enddo
2429 
2430  !$acc end host_data
2431 
2432  return

References comm_datatype, comm_world, and scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the caller graph for this function:

◆ vars_3d_mpi()

subroutine scale_comm_cartesc::vars_3d_mpi ( real(rp), dimension(:,:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)
Parameters
[in,out]varatmospheric 3D variable to communication
[in]gidgrid ID
[in]vidrequest ID

Definition at line 2436 of file scale_comm_cartesC.F90.

2436  use scale_prc, only: &
2437  prc_abort
2438  use scale_prc_cartesc, only: &
2439  prc_twod
2440  implicit none
2441 
2442  real(RP), intent(inout) :: var(:,:,:)
2443  integer, intent(in) :: gid
2444  integer, intent(in) :: vid
2445 
2446 
2447  integer :: ireq, tag
2448 
2449  integer :: KA
2450  integer :: IA, IS, IE
2451  integer :: JA, JS, JE
2452  integer :: IHALO, JHALO
2453 
2454  integer :: ierr
2455 #ifdef _OPENACC
2456  real(RP), pointer :: ptr(:,:)
2457  logical :: flag_device
2458 #endif
2459  !---------------------------------------------------------------------------
2460 
2461  tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
2462  ireq = 1
2463 
2464  ka = ginfo(gid)%KA
2465  ia = ginfo(gid)%IA
2466  is = ginfo(gid)%IS
2467  ie = ginfo(gid)%IE
2468  ja = ginfo(gid)%JA
2469  js = ginfo(gid)%JS
2470  je = ginfo(gid)%JE
2471  ihalo = ginfo(gid)%IHALO
2472  jhalo = ginfo(gid)%JHALO
2473 
2474 #ifdef DEBUG
2475  if ( ginfo(gid)%use_packbuf(vid) ) then
2476  log_error("vars_3D_mpi",*) 'packing buffer is already used', vid
2477  call prc_abort
2478  end if
2479  ginfo(gid)%use_packbuf(vid) = .true.
2480 #endif
2481 
2482 #ifdef _OPENACC
2483  flag_device = acc_is_present(var)
2484 #endif
2485 
2486  !$acc host_data use_device(var) if(flag_device)
2487 
2488  !--- From 4-Direction HALO communicate
2489  ! From S
2490  if ( prc_has_s ) then
2491  call mpi_irecv( var(:,:,1:js-1), ginfo(gid)%size2D_NS4*ka, comm_datatype, &
2492  prc_next(prc_s), tag+1, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2493  ireq = ireq + 1
2494  endif
2495  ! From N
2496  if ( prc_has_n ) then
2497  call mpi_irecv( var(:,:,je+1:ja), ginfo(gid)%size2D_NS4*ka, comm_datatype, &
2498  prc_next(prc_n), tag+2, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2499  ireq = ireq + 1
2500  endif
2501  if ( .not. prc_twod ) then
2502 #ifdef _OPENACC
2503  ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
2504  !$acc host_data use_device(ptr) if(flag_device)
2505 #endif
2506  ! From E
2507  if ( prc_has_e ) then
2508 #ifdef _OPENACC
2509  call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2510 #else
2511  call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2512 #endif
2513  prc_next(prc_e), tag+3, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2514  ireq = ireq + 1
2515  endif
2516  ! From W
2517  if ( prc_has_w ) then
2518 #ifdef _OPENACC
2519  call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2520 #else
2521  call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2522 #endif
2523  prc_next(prc_w), tag+4, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2524  ireq = ireq + 1
2525  endif
2526  !$acc end host_data
2527  end if
2528 
2529  !$acc end host_data
2530 
2531  !--- To 4-Direction HALO communicate
2532  if ( .not. prc_twod ) then
2533  call packwe_3d( ka, ia, is, ie, ja, js, je, &
2534  ihalo, &
2535  var, gid, vid)
2536  end if
2537 
2538  !$acc host_data use_device(var) if(flag_device)
2539 
2540  ! To N HALO
2541  if ( prc_has_n ) then
2542  call mpi_isend( var(:,:,je-jhalo+1:je), ginfo(gid)%size2D_NS4*ka, comm_datatype, &
2543  prc_next(prc_n), tag+1, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2544  ireq = ireq + 1
2545  endif
2546  ! To S HALO
2547  if ( prc_has_s ) then
2548  call mpi_isend( var(:,:,js:js+jhalo-1), ginfo(gid)%size2D_NS4*ka, comm_datatype, &
2549  prc_next(prc_s), tag+2, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2550  ireq = ireq + 1
2551  endif
2552 
2553  !$acc end host_data
2554 
2555  if ( .not. prc_twod ) then
2556 #ifdef _OPENACC
2557  ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
2558  !$acc wait
2559  !$acc host_data use_device(ptr) if(flag_device)
2560 #endif
2561  ! To W HALO
2562  if ( prc_has_w ) then
2563 #ifdef _OPENACC
2564  call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2565 #else
2566  call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2567 #endif
2568  prc_next(prc_w), tag+3, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2569  ireq = ireq + 1
2570  endif
2571  ! To E HALO
2572  if ( prc_has_e ) then
2573 #ifdef _OPENACC
2574  call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2575 #else
2576  call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2577 #endif
2578  prc_next(prc_e), tag+4, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2579  ireq = ireq + 1
2580  endif
2581 
2582  !$acc end host_data
2583  end if
2584 
2585  ginfo(gid)%req_cnt(vid) = ireq - 1
2586 
2587  return

References comm_datatype, comm_world, packwe_3d(), scale_prc::prc_abort(), and scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ vars_3d_mpi_onesided()

subroutine scale_comm_cartesc::vars_3d_mpi_onesided ( real(rp), dimension(:,:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)
Parameters
[in,out]varatmospheric 3D variable to communication
[in]gidgrid ID
[in]vidrequest ID

Definition at line 2591 of file scale_comm_cartesC.F90.

2591  use scale_prc, only: &
2592  prc_abort
2593  use scale_prc_cartesc, only: &
2594  prc_twod
2595  implicit none
2596 
2597  real(RP), intent(inout) :: var(:,:,:)
2598  integer, intent(in) :: gid
2599  integer, intent(in) :: vid
2600 
2601  integer :: KA
2602  integer :: IA, IS, IE
2603  integer :: JA, JS, JE
2604  integer :: IHALO, JHALO
2605 
2606  integer(kind=MPI_ADDRESS_KIND) :: disp
2607 
2608  integer :: ierr
2609 #ifdef _OPENACC
2610  real(RP), pointer :: ptr(:,:)
2611 #endif
2612  !---------------------------------------------------------------------------
2613 
2614  ka = ginfo(gid)%KA
2615  ia = ginfo(gid)%IA
2616  is = ginfo(gid)%IS
2617  ie = ginfo(gid)%IE
2618  ja = ginfo(gid)%JA
2619  js = ginfo(gid)%JS
2620  je = ginfo(gid)%JE
2621  ihalo = ginfo(gid)%IHALO
2622  jhalo = ginfo(gid)%JHALO
2623 
2624  !$acc data copyin(var)
2625 
2626  call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
2627  call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
2628 
2629  !--- To 4-Direction HALO communicate
2630  if ( .not. prc_twod ) then
2631  call packwe_3d( ka, ia, is, ie, ja, js, je, &
2632  ihalo, &
2633  var, gid, vid)
2634  end if
2635 
2636  !$acc host_data use_device(var)
2637 
2638  ! To N HALO
2639  if ( prc_has_n ) then
2640  disp = 0
2641  call mpi_put( var(:,:,je-jhalo+1:je), ginfo(gid)%size2D_NS4*ka, comm_datatype, &
2642  prc_next(prc_n), disp, ginfo(gid)%size2D_NS4*ka, comm_datatype, &
2643  ginfo(gid)%win_packNS(vid), ierr )
2644  endif
2645  ! To S HALO
2646  if ( prc_has_s ) then
2647  disp = ka * ia * jhalo
2648  call mpi_put( var(:,:,js:js+jhalo-1), ginfo(gid)%size2D_NS4*ka, comm_datatype, &
2649  prc_next(prc_s), disp, ginfo(gid)%size2D_NS4*ka, comm_datatype, &
2650  ginfo(gid)%win_packNS(vid), ierr )
2651  endif
2652 
2653  !$acc end host_data
2654 
2655  if ( .not. prc_twod ) then
2656 #ifdef _OPENACC
2657  ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
2658  !$acc wait
2659  !$acc host_data use_device(ptr)
2660 #endif
2661 
2662  ! To W HALO
2663  if ( prc_has_w ) then
2664  disp = 1
2665 #ifdef _OPENACC
2666  call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2667 #else
2668  call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2669 #endif
2670  prc_next(prc_w), disp, ginfo(gid)%size2D_WE*ka, comm_datatype, &
2671  ginfo(gid)%win_packWE(vid), ierr )
2672  endif
2673  ! To E HALO
2674  if ( prc_has_e ) then
2675  disp = 0
2676 #ifdef _OPENACC
2677  call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2678 #else
2679  call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2680 #endif
2681  prc_next(prc_e), disp, ginfo(gid)%size2D_WE*ka, comm_datatype, &
2682  ginfo(gid)%win_packWE(vid), ierr )
2683  endif
2684 
2685  !$acc end host_data
2686  end if
2687 
2688  call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
2689  call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
2690 
2691  !$acc end data
2692 
2693  return

References comm_datatype, packwe_3d(), scale_prc::prc_abort(), and scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ vars8_3d_mpi()

subroutine scale_comm_cartesc::vars8_3d_mpi ( real(rp), dimension(:,:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 2697 of file scale_comm_cartesC.F90.

2697  use scale_prc, only: &
2698  prc_abort
2699  use scale_prc_cartesc, only: &
2700  prc_twod
2701  implicit none
2702 
2703  real(RP), intent(inout) :: var(:,:,:)
2704  integer, intent(in) :: gid
2705  integer, intent(in) :: vid
2706 
2707  integer :: ireq, tag, tagc
2708 
2709  integer :: KA
2710  integer :: IA, IS, IE
2711  integer :: JA, JS, JE
2712  integer :: IHALO, JHALO
2713 
2714  integer :: ierr
2715  integer :: j
2716 #ifdef _OPENACC
2717  real(RP), pointer :: ptr(:,:)
2718  logical :: flag_device
2719 #endif
2720  !---------------------------------------------------------------------------
2721 
2722  tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
2723  tag = vid * 100
2724  ireq = 1
2725 
2726  ka = ginfo(gid)%KA
2727  ia = ginfo(gid)%IA
2728  is = ginfo(gid)%IS
2729  ie = ginfo(gid)%IE
2730  ja = ginfo(gid)%JA
2731  js = ginfo(gid)%JS
2732  je = ginfo(gid)%JE
2733  ihalo = ginfo(gid)%IHALO
2734  jhalo = ginfo(gid)%JHALO
2735 
2736 #ifdef DEBUG
2737  if ( ginfo(gid)%use_packbuf(vid) ) then
2738  log_error("vars8_3D_mpi",*) 'packing buffer is already used', vid
2739  call prc_abort
2740  end if
2741  ginfo(gid)%use_packbuf(vid) = .true.
2742 #endif
2743 
2744 #ifdef _OPENACC
2745  flag_device = acc_is_present(var)
2746 #endif
2747 
2748  if ( comm_isallperiodic ) then ! periodic condition
2749 
2750  !$acc host_data use_device(var) if(flag_device)
2751 
2752  !--- From 8-Direction HALO communicate
2753  if ( .not. prc_twod ) then
2754  ! From SE
2755  tagc = 0
2756  do j = 1, js-1
2757  call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2758  prc_next(prc_se), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2759  ireq = ireq + 1
2760  tagc = tagc + 1
2761  enddo
2762  ! From SW
2763  tagc = 10
2764  do j = 1, js-1
2765  call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2766  prc_next(prc_sw), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2767  ireq = ireq + 1
2768  tagc = tagc + 1
2769  enddo
2770  ! From NE
2771  tagc = 20
2772  do j = je+1, ja
2773  call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2774  prc_next(prc_ne), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2775  ireq = ireq + 1
2776  tagc = tagc + 1
2777  enddo
2778  ! From NW
2779  tagc = 30
2780  do j = je+1, ja
2781  call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2782  prc_next(prc_nw), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2783  ireq = ireq + 1
2784  tagc = tagc + 1
2785  enddo
2786 #ifdef _OPENACC
2787  ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
2788  !$acc host_data use_device(ptr) if(flag_device)
2789 #endif
2790  ! From E
2791  tagc = 60
2792 #ifdef _OPENACC
2793  call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2794 #else
2795  call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2796 #endif
2797  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2798  ireq = ireq + 1
2799  ! From W
2800  tagc = 70
2801 #ifdef _OPENACC
2802  call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2803 #else
2804  call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2805 #endif
2806  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2807  ireq = ireq + 1
2808  !$acc end host_data
2809  end if
2810  ! From S
2811  tagc = 40
2812  do j = 1, js-1
2813  call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
2814  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2815  ireq = ireq + 1
2816  tagc = tagc + 1
2817  enddo
2818  ! From N
2819  tagc = 50
2820  do j = je+1, ja
2821  call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
2822  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2823  ireq = ireq + 1
2824  tagc = tagc + 1
2825  enddo
2826 
2827  !--- To 8-Direction HALO communicate
2828  ! To N HALO
2829  tagc = 40
2830  do j = je-jhalo+1, je
2831  call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
2832  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2833  ireq = ireq + 1
2834  tagc = tagc + 1
2835  enddo
2836  ! To S HALO
2837  tagc = 50
2838  do j = js, js+jhalo-1
2839  call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
2840  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2841  ireq = ireq + 1
2842  tagc = tagc + 1
2843  enddo
2844 
2845  !$acc end host_data
2846 
2847  if ( .not. prc_twod ) then
2848 
2849  call packwe_3d( ka, ia, is, ie, ja, js, je, &
2850  ihalo, &
2851  var, gid, vid)
2852 
2853  !$acc host_data use_device(var) if(flag_device)
2854 
2855  ! To NW HALO
2856  tagc = 0
2857  do j = je-jhalo+1, je
2858  call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2859  prc_next(prc_nw), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2860  ireq = ireq + 1
2861  tagc = tagc + 1
2862  enddo
2863  ! To NE HALO
2864  tagc = 10
2865  do j = je-jhalo+1, je
2866  call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2867  prc_next(prc_ne), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2868  ireq = ireq + 1
2869  tagc = tagc + 1
2870  enddo
2871  ! To SW HALO
2872  tagc = 20
2873  do j = js, js+jhalo-1
2874  call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2875  prc_next(prc_sw), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2876  ireq = ireq + 1
2877  tagc = tagc + 1
2878  enddo
2879  ! To SE HALO
2880  tagc = 30
2881  do j = js, js+jhalo-1
2882  call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2883  prc_next(prc_se), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2884  ireq = ireq + 1
2885  tagc = tagc + 1
2886  enddo
2887 
2888  !$acc end host_data
2889 
2890 #ifdef _OPENACC
2891  ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
2892  !$acc wait
2893  !$acc host_data use_device(ptr) if(flag_device)
2894 #endif
2895  ! To W HALO
2896  tagc = 60
2897 #ifdef _OPENACC
2898  call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2899 #else
2900  call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2901 #endif
2902  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2903  ireq = ireq + 1
2904  ! To E HALO
2905  tagc = 70
2906 #ifdef _OPENACC
2907  call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2908 #else
2909  call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
2910 #endif
2911  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2912  !$acc end host_data
2913  ireq = ireq + 1
2914 
2915  end if
2916 
2917  else ! non-periodic condition
2918 
2919  !$acc host_data use_device(var) if(flag_device)
2920 
2921  !--- From 8-Direction HALO communicate
2922  if ( .not. prc_twod ) then
2923  ! From SE
2924  if ( prc_has_s .AND. prc_has_e ) then
2925  tagc = 0
2926  do j = 1, js-1
2927  call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2928  prc_next(prc_se), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2929  ireq = ireq + 1
2930  tagc = tagc + 1
2931  enddo
2932  else if ( prc_has_s ) then
2933  tagc = 0
2934  do j = 1, js-1
2935  call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2936  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2937  ireq = ireq + 1
2938  tagc = tagc + 1
2939  enddo
2940  else if ( prc_has_e ) then
2941  tagc = 0
2942  do j = 1, js-1
2943  call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2944  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2945  ireq = ireq + 1
2946  tagc = tagc + 1
2947  enddo
2948  endif
2949  ! From SW
2950  if ( prc_has_s .AND. prc_has_w ) then
2951  tagc = 10
2952  do j = 1, js-1
2953  call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2954  prc_next(prc_sw), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2955  ireq = ireq + 1
2956  tagc = tagc + 1
2957  enddo
2958  else if ( prc_has_s ) then
2959  tagc = 10
2960  do j = 1, js-1
2961  call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2962  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2963  ireq = ireq + 1
2964  tagc = tagc + 1
2965  enddo
2966  else if ( prc_has_w ) then
2967  tagc = 10
2968  do j = 1, js-1
2969  call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2970  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2971  ireq = ireq + 1
2972  tagc = tagc + 1
2973  enddo
2974  endif
2975  ! From NE
2976  if ( prc_has_n .AND. prc_has_e ) then
2977  tagc = 20
2978  do j = je+1, ja
2979  call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2980  prc_next(prc_ne), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2981  ireq = ireq + 1
2982  tagc = tagc + 1
2983  enddo
2984  else if ( prc_has_n ) then
2985  tagc = 20
2986  do j = je+1, ja
2987  call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2988  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2989  ireq = ireq + 1
2990  tagc = tagc + 1
2991  enddo
2992  else if ( prc_has_e ) then
2993  tagc = 20
2994  do j = je+1, ja
2995  call mpi_irecv( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
2996  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
2997  ireq = ireq + 1
2998  tagc = tagc + 1
2999  enddo
3000  endif
3001  ! From NW
3002  if ( prc_has_n .AND. prc_has_w ) then
3003  tagc = 30
3004  do j = je+1, ja
3005  call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3006  prc_next(prc_nw), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3007  ireq = ireq + 1
3008  tagc = tagc + 1
3009  enddo
3010  else if ( prc_has_n ) then
3011  tagc = 30
3012  do j = je+1, ja
3013  call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3014  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3015  ireq = ireq + 1
3016  tagc = tagc + 1
3017  enddo
3018  else if ( prc_has_w ) then
3019  tagc = 30
3020  do j = je+1, ja
3021  call mpi_irecv( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3022  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3023  ireq = ireq + 1
3024  tagc = tagc + 1
3025  enddo
3026  endif
3027 #ifdef _OPENACC
3028  ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
3029  !$acc host_data use_device(ptr) if(flag_device)
3030 #endif
3031  ! From E
3032  if ( prc_has_e ) then
3033  tagc = 60
3034 #ifdef _OPENACC
3035  call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3036 #else
3037  call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3038 #endif
3039  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3040  ireq = ireq + 1
3041  endif
3042  ! From W
3043  if ( prc_has_w ) then
3044  tagc = 70
3045 #ifdef _OPENACC
3046  call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3047 #else
3048  call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3049 #endif
3050  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3051  ireq = ireq + 1
3052  endif
3053  !$acc end host_data
3054  end if
3055  ! From S
3056  if ( prc_has_s ) then
3057  tagc = 40
3058  do j = 1, js-1
3059  call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
3060  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3061  ireq = ireq + 1
3062  tagc = tagc + 1
3063  enddo
3064  endif
3065  ! From N
3066  if ( prc_has_n ) then
3067  tagc = 50
3068  do j = je+1, ja
3069  call mpi_irecv( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
3070  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3071  ireq = ireq + 1
3072  tagc = tagc + 1
3073  enddo
3074  endif
3075 
3076  !--- To 8-Direction HALO communicate
3077  ! To N HALO
3078  if ( prc_has_n ) then
3079  tagc = 40
3080  do j = je-jhalo+1, je
3081  call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
3082  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3083  ireq = ireq + 1
3084  tagc = tagc + 1
3085  enddo
3086  endif
3087  ! To S HALO
3088  if ( prc_has_s ) then
3089  tagc = 50
3090  do j = js, js+jhalo-1
3091  call mpi_isend( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
3092  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3093  ireq = ireq + 1
3094  tagc = tagc + 1
3095  enddo
3096  endif
3097 
3098  !$acc end host_data
3099 
3100  if ( .not. prc_twod ) then
3101 
3102  call packwe_3d( ka, ia, is, ie, ja, js, je, &
3103  ihalo, &
3104  var, gid, vid)
3105 
3106  !$acc host_data use_device(var) if(flag_device)
3107 
3108  ! To NW HALO
3109  if ( prc_has_n .AND. prc_has_w ) then
3110  tagc = 0
3111  do j = je-jhalo+1, je
3112  call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3113  prc_next(prc_nw), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3114  ireq = ireq + 1
3115  tagc = tagc + 1
3116  enddo
3117  else if ( prc_has_n ) then
3118  tagc = 10
3119  do j = je-jhalo+1, je
3120  call mpi_isend( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3121  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3122  ireq = ireq + 1
3123  tagc = tagc + 1
3124  enddo
3125  else if ( prc_has_w ) then
3126  tagc = 20
3127  do j = je+1, ja
3128  call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3129  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3130  ireq = ireq + 1
3131  tagc = tagc + 1
3132  enddo
3133  endif
3134  ! To NE HALO
3135  if ( prc_has_n .AND. prc_has_e ) then
3136  tagc = 10
3137  do j = je-jhalo+1, je
3138  call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3139  prc_next(prc_ne), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3140  ireq = ireq + 1
3141  tagc = tagc + 1
3142  enddo
3143  else if ( prc_has_n ) then
3144  tagc = 0
3145  do j = je-jhalo+1, je
3146  call mpi_isend( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3147  prc_next(prc_n), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3148  ireq = ireq + 1
3149  tagc = tagc + 1
3150  enddo
3151  else if ( prc_has_e ) then
3152  tagc = 30
3153  do j = je+1, ja
3154  call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3155  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3156  ireq = ireq + 1
3157  tagc = tagc + 1
3158  enddo
3159  endif
3160  ! To SW HALO
3161  if ( prc_has_s .AND. prc_has_w ) then
3162  tagc = 20
3163  do j = js, js+jhalo-1
3164  call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3165  prc_next(prc_sw), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3166  ireq = ireq + 1
3167  tagc = tagc + 1
3168  enddo
3169  else if ( prc_has_s ) then
3170  tagc = 30
3171  do j = js, js+jhalo-1
3172  call mpi_isend( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3173  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3174  ireq = ireq + 1
3175  tagc = tagc + 1
3176  enddo
3177  else if ( prc_has_w ) then
3178  tagc = 0
3179  do j = 1, js-1
3180  call mpi_isend( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3181  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3182  ireq = ireq + 1
3183  tagc = tagc + 1
3184  enddo
3185  endif
3186  ! To SE HALO
3187  if ( prc_has_s .AND. prc_has_e ) then
3188  tagc = 30
3189  do j = js, js+jhalo-1
3190  call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3191  prc_next(prc_se), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3192  ireq = ireq + 1
3193  tagc = tagc + 1
3194  enddo
3195  else if ( prc_has_s ) then
3196  tagc = 20
3197  do j = js, js+jhalo-1
3198  call mpi_isend( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3199  prc_next(prc_s), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3200  ireq = ireq + 1
3201  tagc = tagc + 1
3202  enddo
3203  else if ( prc_has_e ) then
3204  tagc = 10
3205  do j = 1, js-1
3206  call mpi_isend( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3207  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3208  ireq = ireq + 1
3209  tagc = tagc + 1
3210  enddo
3211  endif
3212 
3213  !$acc end host_data
3214 
3215 #ifdef _OPENACC
3216  ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3217  !$acc wait
3218  !$acc host_data use_device(ptr) if(flag_device)
3219 #endif
3220 
3221  ! To W HALO
3222  if ( prc_has_w ) then
3223  tagc = 60
3224 #ifdef _OPENACC
3225  call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3226 #else
3227  call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3228 #endif
3229  prc_next(prc_w), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3230  ireq = ireq + 1
3231  endif
3232  ! To E HALO
3233  if ( prc_has_e ) then
3234  tagc = 70
3235 #ifdef _OPENACC
3236  call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3237 #else
3238  call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3239 #endif
3240  prc_next(prc_e), tag+tagc, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3241  ireq = ireq + 1
3242  endif
3243  !$acc end host_data
3244 
3245  end if
3246 
3247  endif
3248 
3249  ginfo(gid)%req_cnt(vid) = ireq - 1
3250 
3251  return

References comm_datatype, comm_world, packwe_3d(), scale_prc::prc_abort(), and scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ vars8_3d_mpi_onesided()

subroutine scale_comm_cartesc::vars8_3d_mpi_onesided ( real(rp), dimension(:,:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 3255 of file scale_comm_cartesC.F90.

3255  use scale_prc, only: &
3256  prc_abort
3257  use scale_prc_cartesc, only: &
3258  prc_twod
3259  implicit none
3260 
3261  real(RP), intent(inout) :: var(:,:,:)
3262  integer, intent(in) :: gid
3263  integer, intent(in) :: vid
3264 
3265  integer :: KA
3266  integer :: IA, IS, IE
3267  integer :: JA, JS, JE
3268  integer :: IHALO, JHALO
3269 
3270  integer(kind=MPI_ADDRESS_KIND) :: disp
3271 
3272  integer :: ierr
3273  integer :: j
3274 #ifdef _OPENACC
3275  real(RP), pointer :: ptr(:,:)
3276 #endif
3277  !---------------------------------------------------------------------------
3278 
3279  ka = ginfo(gid)%KA
3280  ia = ginfo(gid)%IA
3281  is = ginfo(gid)%IS
3282  ie = ginfo(gid)%IE
3283  ja = ginfo(gid)%JA
3284  js = ginfo(gid)%JS
3285  je = ginfo(gid)%JE
3286  ihalo = ginfo(gid)%IHALO
3287  jhalo = ginfo(gid)%JHALO
3288 
3289  !$acc data copyin(var)
3290  call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
3291  call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
3292 
3293  if ( comm_isallperiodic ) then ! periodic condition
3294 
3295  !$acc host_data use_device(var)
3296 
3297  !--- To 8-Direction HALO communicate
3298  ! To N HALO
3299  do j = je-jhalo+1, je
3300  disp = ka * ( ihalo + ia * ( j - je+jhalo-1 ) )
3301  call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
3302  prc_next(prc_n), disp, ginfo(gid)%size2D_NS8*ka, comm_datatype, &
3303  ginfo(gid)%win_packNS(vid), ierr )
3304  enddo
3305  ! To S HALO
3306  do j = js, js+jhalo-1
3307  disp = ka * ( ihalo + ia * ( j - js + jhalo ) )
3308  call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
3309  prc_next(prc_s), disp, ginfo(gid)%size2D_NS8*ka, comm_datatype, &
3310  ginfo(gid)%win_packNS(vid), ierr )
3311  enddo
3312 
3313  !$acc end host_data
3314 
3315  if ( .not. prc_twod ) then
3316 
3317  call packwe_3d( ka, ia, is, ie, ja, js, je, &
3318  ihalo, &
3319  var, gid, vid)
3320 
3321  !$acc host_data use_device(var)
3322  ! To NW HALO
3323  do j = je-jhalo+1, je
3324  disp = ka * ( ie + ia * ( j - je+jhalo-1 ) )
3325  call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3326  prc_next(prc_nw), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3327  ginfo(gid)%win_packNS(vid), ierr )
3328  enddo
3329  ! To NE HALO
3330  do j = je-jhalo+1, je
3331  disp = ka * ( ia * ( j - je+jhalo-1 ) )
3332  call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3333  prc_next(prc_ne), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3334  ginfo(gid)%win_packNS(vid), ierr )
3335  enddo
3336  ! To SW HALO
3337  do j = js, js+jhalo-1
3338  disp = ka * ( ie + ia * ( j - js + jhalo ) )
3339  call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3340  prc_next(prc_sw), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3341  ginfo(gid)%win_packNS(vid), ierr )
3342  enddo
3343  ! To SE HALO
3344  do j = js, js+jhalo-1
3345  disp = ka * ( ia * ( j - js + jhalo ) )
3346  call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3347  prc_next(prc_se), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3348  ginfo(gid)%win_packNS(vid), ierr )
3349  enddo
3350 
3351  !$acc end host_data
3352 
3353 #ifdef _OPENACC
3354  ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3355  !$acc wait
3356  !$acc host_data use_device(ptr)
3357 #endif
3358  ! To W HALO
3359  disp = 1
3360 #ifdef _OPENACC
3361  call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3362 #else
3363  call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3364 #endif
3365  prc_next(prc_w), disp, ginfo(gid)%size2D_WE*ka, comm_datatype, &
3366  ginfo(gid)%win_packWE(vid), ierr )
3367  ! To E HALO
3368  disp = 0
3369 #ifdef _OPENACC
3370  call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3371 #else
3372  call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3373 #endif
3374  prc_next(prc_e), disp, ginfo(gid)%size2D_WE*ka, comm_datatype, &
3375  ginfo(gid)%win_packWE(vid), ierr )
3376  !$acc end host_data
3377 
3378  end if
3379 
3380  else ! non-periodic condition
3381 
3382  !$acc host_data use_device(var)
3383 
3384  !--- To 8-Direction HALO communicate
3385  ! To N HALO
3386  if ( prc_has_n ) then
3387  do j = je-jhalo+1, je
3388  disp = ka * ( ihalo + ia * ( j - je+jhalo-1 ) )
3389  call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
3390  prc_next(prc_n), disp, ginfo(gid)%size2D_NS8*ka, comm_datatype, &
3391  ginfo(gid)%win_packNS(vid), ierr )
3392  enddo
3393  endif
3394  ! To S HALO
3395  if ( prc_has_s ) then
3396  do j = js, js+jhalo-1
3397  disp = ka * ( ihalo + ia * ( j - js + jhalo ) )
3398  call mpi_put( var(1,is,j), ginfo(gid)%size2D_NS8*ka, comm_datatype, &
3399  prc_next(prc_s), disp, ginfo(gid)%size2D_NS8*ka, comm_datatype, &
3400  ginfo(gid)%win_packNS(vid), ierr )
3401  enddo
3402  endif
3403 
3404  !$acc end host_data
3405 
3406  if ( .not. prc_twod ) then
3407 
3408  call packwe_3d( ka, ia, is, ie, ja, js, je, &
3409  ihalo, &
3410  var, gid, vid)
3411 
3412  !$acc host_data use_device(var)
3413 
3414  ! To NW HALO
3415  if ( prc_has_n .AND. prc_has_w ) then
3416  do j = je-jhalo+1, je
3417  disp = ka * ( ie + ia * ( j - je+jhalo-1 ) )
3418  call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3419  prc_next(prc_nw), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3420  ginfo(gid)%win_packNS(vid), ierr )
3421  enddo
3422  else if ( prc_has_n ) then
3423  do j = je-jhalo+1, je
3424  disp = ka * ( ia * ( j - je+jhalo-1 ) )
3425  call mpi_put( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3426  prc_next(prc_n), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3427  ginfo(gid)%win_packNS(vid), ierr )
3428  enddo
3429  else if ( prc_has_w ) then
3430  do j = je+1, ja
3431  disp = ka * ( ie + ia * ( j - je-1 + jhalo ) )
3432  call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3433  prc_next(prc_w), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3434  ginfo(gid)%win_packNS(vid), ierr )
3435  enddo
3436  endif
3437  ! To NE HALO
3438  if ( prc_has_n .AND. prc_has_e ) then
3439  do j = je-jhalo+1, je
3440  disp = ka * ( ia * ( j - je+jhalo-1 ) )
3441  call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3442  prc_next(prc_ne), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3443  ginfo(gid)%win_packNS(vid), ierr )
3444  enddo
3445  else if ( prc_has_n ) then
3446  do j = je-jhalo+1, je
3447  disp = ka * ( ie + ia * ( j - je+jhalo-1 ) )
3448  call mpi_put( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3449  prc_next(prc_n), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3450  ginfo(gid)%win_packNS(vid), ierr )
3451  enddo
3452  else if ( prc_has_e ) then
3453  do j = je+1, ja
3454  disp = ka * ia * ( j - je-1 + jhalo )
3455  call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3456  prc_next(prc_e), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3457  ginfo(gid)%win_packNS(vid), ierr )
3458  enddo
3459  endif
3460  ! To SW HALO
3461  if ( prc_has_s .AND. prc_has_w ) then
3462  do j = js, js+jhalo-1
3463  disp = ka * ( ie + ia * ( j - js + jhalo ) )
3464  call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3465  prc_next(prc_sw), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3466  ginfo(gid)%win_packNS(vid), ierr )
3467  enddo
3468  else if ( prc_has_s ) then
3469  do j = js, js+jhalo-1
3470  disp = ka * ( ia * ( j - js + jhalo ) )
3471  call mpi_put( var(1,1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3472  prc_next(prc_s), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3473  ginfo(gid)%win_packNS(vid), ierr )
3474  enddo
3475  else if ( prc_has_w ) then
3476  do j = 1, js-1
3477  disp = ka * ( ie + ia * (j-1) )
3478  call mpi_put( var(1,is,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3479  prc_next(prc_w), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3480  ginfo(gid)%win_packNS(vid), ierr )
3481  enddo
3482  endif
3483  ! To SE HALO
3484  if ( prc_has_s .AND. prc_has_e ) then
3485  do j = js, js+jhalo-1
3486  disp = ka * ( ia * ( j - js + jhalo ) )
3487  call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3488  prc_next(prc_se), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3489  ginfo(gid)%win_packNS(vid), ierr )
3490  enddo
3491  else if ( prc_has_s ) then
3492  do j = js, js+jhalo-1
3493  disp = ka * ( ie + ia * ( j - js + jhalo ) )
3494  call mpi_put( var(1,ie+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3495  prc_next(prc_s), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3496  ginfo(gid)%win_packNS(vid), ierr )
3497  enddo
3498  else if ( prc_has_e ) then
3499  do j = 1, js-1
3500  disp = ka * ( ia * ( j - 1 ) )
3501  call mpi_put( var(1,ie-ihalo+1,j), ginfo(gid)%size2D_4C*ka, comm_datatype, &
3502  prc_next(prc_e), disp, ginfo(gid)%size2D_4C*ka, comm_datatype, &
3503  ginfo(gid)%win_packNS(vid), ierr )
3504  enddo
3505  endif
3506 
3507  !$acc end host_data
3508 
3509 #ifdef _OPENACC
3510  ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3511  !$acc wait
3512  !$acc host_data use_device(ptr)
3513 #endif
3514 
3515  ! To W HALO
3516  if ( prc_has_w ) then
3517  disp = 1
3518 #ifdef _OPENACC
3519  call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3520 #else
3521  call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3522 #endif
3523  prc_next(prc_w), disp, ginfo(gid)%size2D_WE*ka, comm_datatype, &
3524  ginfo(gid)%win_packWE(vid), ierr )
3525  endif
3526  ! To E HALO
3527  if ( prc_has_e ) then
3528  disp = 0
3529 #ifdef _OPENACC
3530  call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3531 #else
3532  call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE*ka, comm_datatype, &
3533 #endif
3534  prc_next(prc_e), disp, ginfo(gid)%size2D_WE*ka, comm_datatype, &
3535  ginfo(gid)%win_packWE(vid), ierr )
3536  endif
3537  !$acc end host_data
3538 
3539  end if
3540 
3541  endif
3542 
3543  call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
3544  call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
3545 
3546  !$acc end data
3547 
3548  return

References comm_datatype, packwe_3d(), scale_prc::prc_abort(), and scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ vars_2d_mpi()

subroutine scale_comm_cartesc::vars_2d_mpi ( real(rp), dimension(:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 3552 of file scale_comm_cartesC.F90.

3552  use scale_prc, only: &
3553  prc_abort
3554  use scale_prc_cartesc, only: &
3555  prc_twod
3556  implicit none
3557 
3558  real(RP), intent(inout) :: var(:,:)
3559  integer, intent(in) :: gid
3560  integer, intent(in) :: vid
3561 
3562  integer :: IA, IS, IE
3563  integer :: JA, JS, JE
3564  integer :: IHALO, JHALO
3565 
3566  integer :: ireq, tag
3567  integer :: ierr
3568 #ifdef _OPENACC
3569  real(RP), pointer :: ptr(:,:)
3570  logical :: flag_device
3571 #endif
3572  !---------------------------------------------------------------------------
3573 
3574  ia = ginfo(gid)%IA
3575  is = ginfo(gid)%IS
3576  ie = ginfo(gid)%IE
3577  ja = ginfo(gid)%JA
3578  js = ginfo(gid)%JS
3579  je = ginfo(gid)%JE
3580  ihalo = ginfo(gid)%IHALO
3581  jhalo = ginfo(gid)%JHALO
3582 
3583  tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
3584  ireq = 1
3585 
3586 #ifdef DEBUG
3587  if ( ginfo(gid)%use_packbuf(vid) ) then
3588  log_error("vars_2D_mpi",*) 'packing buffer is already used', vid
3589  call prc_abort
3590  end if
3591  ginfo(gid)%use_packbuf(vid) = .true.
3592 #endif
3593 
3594 #ifdef _OPENACC
3595  flag_device = acc_is_present(var)
3596 #endif
3597 
3598  !$acc host_data use_device(var) if(flag_device)
3599 
3600  !--- From 4-Direction HALO communicate
3601  ! From S
3602  if ( prc_has_s ) then
3603  call mpi_irecv( var(:,1:js-1), ginfo(gid)%size2D_NS4, comm_datatype, &
3604  prc_next(prc_s), tag+1, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3605  ireq = ireq + 1
3606  endif
3607  ! From N
3608  if ( prc_has_n ) then
3609  call mpi_irecv( var(:,je+1:ja), ginfo(gid)%size2D_NS4, comm_datatype, &
3610  prc_next(prc_n), tag+2, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3611  ireq = ireq + 1
3612  endif
3613 
3614  if ( .not. prc_twod ) then
3615 #ifdef _OPENACC
3616  ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
3617  !$acc host_data use_device(ptr) if(flag_device)
3618 #endif
3619  ! From E
3620  if ( prc_has_e ) then
3621 #ifdef _OPENACC
3622  call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE, comm_datatype, &
3623 #else
3624  call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE, comm_datatype, &
3625 #endif
3626  prc_next(prc_e), tag+3, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3627  ireq = ireq + 1
3628  endif
3629  ! From W
3630  if ( prc_has_w ) then
3631 #ifdef _OPENACC
3632  call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE, comm_datatype, &
3633 #else
3634  call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE, comm_datatype, &
3635 #endif
3636  prc_next(prc_w), tag+4, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3637  ireq = ireq + 1
3638  endif
3639  !$acc end host_data
3640  end if
3641 
3642  !$acc end host_data
3643 
3644  !--- To 4-Direction HALO communicate
3645  if ( .not. prc_twod ) then
3646 
3647  call packwe_2d( ia, is, ie, ja, js, je, &
3648  ihalo, &
3649  var, gid, vid)
3650 
3651 #ifdef _OPENACC
3652  ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3653  !$acc host_data use_device(ptr) if(flag_device)
3654 #endif
3655 
3656  ! To W HALO communicate
3657  if ( prc_has_w ) then
3658 #ifdef _OPENACC
3659  call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE, comm_datatype, &
3660 #else
3661  call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, comm_datatype, &
3662 #endif
3663  prc_next(prc_w), tag+3, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3664  ireq = ireq + 1
3665  endif
3666  ! To E HALO communicate
3667  if ( prc_has_e ) then
3668 #ifdef _OPENACC
3669  call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE, comm_datatype, &
3670 #else
3671  call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, comm_datatype, &
3672 #endif
3673  prc_next(prc_e), tag+4, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3674  ireq = ireq + 1
3675  endif
3676 
3677  !$acc end host_data
3678 
3679  end if
3680 
3681  !$acc host_data use_device(var) if(flag_device)
3682 
3683  ! To N HALO communicate
3684  if ( prc_has_n ) then
3685  call mpi_isend( var(:,je-jhalo+1:je), ginfo(gid)%size2D_NS4, comm_datatype, &
3686  prc_next(prc_n), tag+1, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3687  ireq = ireq + 1
3688  endif
3689  ! To S HALO communicate
3690  if ( prc_has_s ) then
3691  call mpi_isend( var(:,js:js+jhalo-1), ginfo(gid)%size2D_NS4, comm_datatype, &
3692  prc_next(prc_s), tag+2, comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3693  ireq = ireq + 1
3694  endif
3695 
3696  !$acc end host_data
3697 
3698  ginfo(gid)%req_cnt(vid) = ireq - 1
3699 
3700  return

References comm_datatype, comm_world, scale_prc::prc_abort(), and scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ vars_2d_mpi_onesided()

subroutine scale_comm_cartesc::vars_2d_mpi_onesided ( real(rp), dimension(:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 3704 of file scale_comm_cartesC.F90.

3704  use scale_prc, only: &
3705  prc_abort
3706  use scale_prc_cartesc, only: &
3707  prc_twod
3708  implicit none
3709 
3710  real(RP), intent(inout) :: var(:,:)
3711  integer, intent(in) :: gid
3712  integer, intent(in) :: vid
3713 
3714  integer :: IA, IS, IE
3715  integer :: JA, JS, JE
3716  integer :: IHALO, JHALO
3717 
3718  integer(kind=MPI_ADDRESS_KIND) :: disp
3719 
3720  integer :: ierr
3721 #ifdef _OPENACC
3722  real(RP), pointer :: ptr(:,:)
3723 #endif
3724  !---------------------------------------------------------------------------
3725 
3726  ia = ginfo(gid)%IA
3727  is = ginfo(gid)%IS
3728  ie = ginfo(gid)%IE
3729  ja = ginfo(gid)%JA
3730  js = ginfo(gid)%JS
3731  je = ginfo(gid)%JE
3732  ihalo = ginfo(gid)%IHALO
3733  jhalo = ginfo(gid)%JHALO
3734 
3735  !$acc data copyin(var)
3736 
3737  call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
3738  call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
3739 
3740  !--- To 4-Direction HALO communicate
3741 
3742  if ( .not. prc_twod ) then
3743 
3744  call packwe_2d( ia, is, ie, ja, js, je, &
3745  ihalo, &
3746  var, gid, vid)
3747 
3748 #ifdef _OPENACC
3749  ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3750  !$acc host_data use_device(ptr)
3751 #endif
3752 
3753  ! To W HALO communicate
3754  if ( prc_has_w ) then
3755  disp = 1
3756 #ifdef _OPENACC
3757  call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE, comm_datatype, &
3758 #else
3759  call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, comm_datatype, &
3760 #endif
3761  prc_next(prc_w), disp, ginfo(gid)%size2D_WE, comm_datatype, &
3762  ginfo(gid)%win_packWE(vid), ierr )
3763  endif
3764  ! To E HALO communicate
3765  if ( prc_has_e ) then
3766  disp = 0
3767 #ifdef _OPENACC
3768  call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE, comm_datatype, &
3769 #else
3770  call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, comm_datatype, &
3771 #endif
3772  prc_next(prc_e), disp, ginfo(gid)%size2D_WE, comm_datatype, &
3773  ginfo(gid)%win_packWE(vid), ierr )
3774  endif
3775 
3776  !$acc end host_data
3777 
3778  end if
3779 
3780  !$acc host_data use_device(var)
3781 
3782  ! To N HALO communicate
3783  if ( prc_has_n ) then
3784  disp = 0
3785  call mpi_put( var(:,je-jhalo+1:je), ginfo(gid)%size2D_NS4, comm_datatype, &
3786  prc_next(prc_n), disp, ginfo(gid)%size2D_NS4, comm_datatype, &
3787  ginfo(gid)%win_packNS(vid), ierr )
3788  endif
3789  ! To S HALO communicate
3790  if ( prc_has_s ) then
3791  disp = ia * jhalo
3792  call mpi_put( var(:,js:js+jhalo-1), ginfo(gid)%size2D_NS4, comm_datatype, &
3793  prc_next(prc_s), disp, ginfo(gid)%size2D_NS4, comm_datatype, &
3794  ginfo(gid)%win_packNS(vid), ierr )
3795  endif
3796 
3797  !$acc end host_data
3798 
3799  call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
3800  call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
3801 
3802  !$acc end data
3803 
3804  return

References comm_datatype, scale_prc::prc_abort(), and scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ vars8_2d_mpi()

subroutine scale_comm_cartesc::vars8_2d_mpi ( real(rp), dimension(:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 3808 of file scale_comm_cartesC.F90.

3808  use scale_prc, only: &
3809  prc_abort
3810  use scale_prc_cartesc, only: &
3811  prc_twod
3812  implicit none
3813 
3814  real(RP), intent(inout) :: var(:,:)
3815  integer, intent(in) :: gid
3816  integer, intent(in) :: vid
3817 
3818  integer :: IA, IS, IE
3819  integer :: JA, JS, JE
3820  integer :: IHALO, JHALO
3821 
3822  integer :: ireq, tag, tagc
3823 
3824  integer :: ierr
3825  integer :: j
3826 #ifdef _OPENACC
3827  real(RP), pointer :: ptr(:,:)
3828  logical :: flag_device
3829 #endif
3830  !---------------------------------------------------------------------------
3831 
3832  ia = ginfo(gid)%IA
3833  is = ginfo(gid)%IS
3834  ie = ginfo(gid)%IE
3835  ja = ginfo(gid)%JA
3836  js = ginfo(gid)%JS
3837  je = ginfo(gid)%JE
3838  ihalo = ginfo(gid)%IHALO
3839  jhalo = ginfo(gid)%JHALO
3840 
3841  tag = ( (gid - 1) * comm_vsize_max + vid ) * 100
3842  ireq = 1
3843 
3844 #ifdef DEBUG
3845  if ( ginfo(gid)%use_packbuf(vid) ) then
3846  log_error("vars8_2D_mpi",*) 'packing buffer is already used', vid
3847  call prc_abort
3848  end if
3849  ginfo(gid)%use_packbuf(vid) = .true.
3850 #endif
3851 
3852 #ifdef _OPENACC
3853  flag_device = acc_is_present(var)
3854 #endif
3855 
3856  if ( comm_isallperiodic ) then
3857  !--- periodic condition
3858  !--- From 8-Direction HALO communicate
3859  !$acc host_data use_device(var) if(flag_device)
3860 
3861  if ( .not. prc_twod ) then
3862  ! From SE
3863  tagc = 0
3864  do j = 1, js-1
3865  call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
3866  comm_datatype, prc_next(prc_se), tag+tagc, &
3867  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3868  ireq = ireq + 1
3869  tagc = tagc + 1
3870  enddo
3871  ! From SW
3872  tagc = 10
3873  do j = 1, js-1
3874  call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
3875  comm_datatype, prc_next(prc_sw), tag+tagc, &
3876  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3877  ireq = ireq + 1
3878  tagc = tagc + 1
3879  enddo
3880  ! From NE
3881  tagc = 20
3882  do j = je+1, ja
3883  call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
3884  comm_datatype, prc_next(prc_ne), tag+tagc, &
3885  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3886  ireq = ireq + 1
3887  tagc = tagc + 1
3888  enddo
3889  ! From NW
3890  tagc = 30
3891  do j = je+1, ja
3892  call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
3893  comm_datatype, prc_next(prc_nw), tag+tagc, &
3894  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3895  ireq = ireq + 1
3896  tagc = tagc + 1
3897  enddo
3898 #ifdef _OPENACC
3899  ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
3900  !$acc host_data use_device(ptr) if(flag_device)
3901 #endif
3902  ! From E
3903 #ifdef _OPENACC
3904  call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE, &
3905 #else
3906  call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE, &
3907 #endif
3908  comm_datatype, prc_next(prc_e), tag+60, &
3909  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3910  ireq = ireq + 1
3911  ! From W
3912 #ifdef _OPENACC
3913  call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE, &
3914 #else
3915  call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE, &
3916 #endif
3917  comm_datatype, prc_next(prc_w), tag+70, &
3918  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3919  ireq = ireq + 1
3920  !$acc end host_data
3921  end if
3922  ! From S
3923  tagc = 40
3924  do j = 1, js-1
3925  call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
3926  comm_datatype, prc_next(prc_s), tag+tagc, &
3927  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3928  ireq = ireq + 1
3929  tagc = tagc + 1
3930  enddo
3931  ! From N
3932  tagc = 50
3933  do j = je+1, ja
3934  call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
3935  comm_datatype, prc_next(prc_n), tag+tagc, &
3936  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3937  ireq = ireq + 1
3938  tagc = tagc + 1
3939  enddo
3940 
3941 
3942  !--- To 8-Direction HALO communicate
3943 
3944  ! To N HALO communicate
3945  tagc = 40
3946  do j = je-jhalo+1, je
3947  call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
3948  comm_datatype, prc_next(prc_n), tag+tagc, &
3949  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3950  ireq = ireq + 1
3951  tagc = tagc + 1
3952  enddo
3953 
3954  ! To S HALO communicate
3955  tagc = 50
3956  do j = js, js+jhalo-1
3957  call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
3958  comm_datatype, prc_next(prc_s), tag+tagc, &
3959  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3960  ireq = ireq + 1
3961  tagc = tagc + 1
3962  enddo
3963 
3964  !$acc end host_data
3965 
3966  if ( .not. prc_twod ) then
3967 
3968  call packwe_2d( ia, is, ie, ja, js, je, &
3969  ihalo, &
3970  var, gid, vid)
3971 
3972  !$acc host_data use_device(var) if(flag_device)
3973 #ifdef _OPENACC
3974  ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
3975  !$acc host_data use_device(ptr) if(flag_device)
3976 #endif
3977 
3978  ! To W HALO communicate
3979 #ifdef _OPENACC
3980  call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE, &
3981 #else
3982  call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, &
3983 #endif
3984  comm_datatype, prc_next(prc_w), tag+60, &
3985  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3986  ireq = ireq + 1
3987 
3988  ! To E HALO communicate
3989 #ifdef _OPENACC
3990  call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE, &
3991 #else
3992  call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, &
3993 #endif
3994  comm_datatype, prc_next(prc_e), tag+70, &
3995  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
3996  ireq = ireq + 1
3997  !$acc end host_data
3998 
3999  ! To NW HALO communicate
4000  tagc = 0
4001  do j = je-jhalo+1, je
4002  call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4003  comm_datatype, prc_next(prc_nw), tag+tagc, &
4004  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4005  ireq = ireq + 1
4006  tagc = tagc + 1
4007  enddo
4008 
4009  ! To NE HALO communicate
4010  tagc = 10
4011  do j = je-jhalo+1, je
4012  call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4013  comm_datatype, prc_next(prc_ne), tag+tagc, &
4014  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4015  ireq = ireq + 1
4016  tagc = tagc + 1
4017  enddo
4018 
4019  ! To SW HALO communicate
4020  tagc = 20
4021  do j = js, js+jhalo-1
4022  call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4023  comm_datatype, prc_next(prc_sw), tag+tagc, &
4024  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4025  ireq = ireq + 1
4026  tagc = tagc + 1
4027  enddo
4028 
4029  ! To SE HALO communicate
4030  tagc = 30
4031  do j = js, js+jhalo-1
4032  call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4033  comm_datatype, prc_next(prc_se), tag+tagc, &
4034  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4035  ireq = ireq + 1
4036  tagc = tagc + 1
4037  enddo
4038 
4039  !$acc end host_data
4040 
4041  end if
4042 
4043  else
4044  !--- non-periodic condition
4045  !--- From 8-Direction HALO communicate
4046 
4047  !$acc host_data use_device(var) if(flag_device)
4048 
4049  if ( .not. prc_twod ) then
4050  ! From SE
4051  if ( prc_has_s .AND. prc_has_e ) then
4052  tagc = 0
4053  do j = 1, js-1
4054  call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4055  comm_datatype, prc_next(prc_se), tag+tagc, &
4056  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4057  ireq = ireq + 1
4058  tagc = tagc + 1
4059  enddo
4060  else if ( prc_has_s ) then
4061  tagc = 0
4062  do j = 1, js-1
4063  call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4064  comm_datatype, prc_next(prc_s), tag+tagc, &
4065  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4066  ireq = ireq + 1
4067  tagc = tagc + 1
4068  enddo
4069  else if ( prc_has_e ) then
4070  tagc = 0
4071  do j = 1, js-1
4072  call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4073  comm_datatype, prc_next(prc_e), tag+tagc, &
4074  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4075  ireq = ireq + 1
4076  tagc = tagc + 1
4077  enddo
4078  endif
4079 
4080  ! From SW
4081  if ( prc_has_s .AND. prc_has_w ) then
4082  tagc = 10
4083  do j = 1, js-1
4084  call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4085  comm_datatype, prc_next(prc_sw), tag+tagc, &
4086  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4087  ireq = ireq + 1
4088  tagc = tagc + 1
4089  enddo
4090  else if ( prc_has_s ) then
4091  tagc = 10
4092  do j = 1, js-1
4093  call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4094  comm_datatype, prc_next(prc_s), tag+tagc, &
4095  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4096  ireq = ireq + 1
4097  tagc = tagc + 1
4098  enddo
4099  else if ( prc_has_w ) then
4100  tagc = 10
4101  do j = 1, js-1
4102  call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4103  comm_datatype, prc_next(prc_w), tag+tagc, &
4104  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4105  ireq = ireq + 1
4106  tagc = tagc + 1
4107  enddo
4108  endif
4109 
4110  ! From NE
4111  if ( prc_has_n .AND. prc_has_e ) then
4112  tagc = 20
4113  do j = je+1, je+jhalo
4114  call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4115  comm_datatype, prc_next(prc_ne), tag+tagc, &
4116  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4117  ireq = ireq + 1
4118  tagc = tagc + 1
4119  enddo
4120  else if ( prc_has_n ) then
4121  tagc = 20
4122  do j = je+1, ja
4123  call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4124  comm_datatype, prc_next(prc_n), tag+tagc, &
4125  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4126  ireq = ireq + 1
4127  tagc = tagc + 1
4128  enddo
4129  else if ( prc_has_e ) then
4130  tagc = 20
4131  do j = je+1, ja
4132  call mpi_irecv( var(ie+1,j), ginfo(gid)%size2D_4C, &
4133  comm_datatype, prc_next(prc_e), tag+tagc, &
4134  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4135  ireq = ireq + 1
4136  tagc = tagc + 1
4137  enddo
4138  endif
4139 
4140  ! From NW
4141  if ( prc_has_n .AND. prc_has_w ) then
4142  tagc = 30
4143  do j = je+1, ja
4144  call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4145  comm_datatype, prc_next(prc_nw), tag+tagc, &
4146  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4147  ireq = ireq + 1
4148  tagc = tagc + 1
4149  enddo
4150  else if ( prc_has_n ) then
4151  tagc = 30
4152  do j = je+1, ja
4153  call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4154  comm_datatype, prc_next(prc_n), tag+tagc, &
4155  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4156  ireq = ireq + 1
4157  tagc = tagc + 1
4158  enddo
4159  else if ( prc_has_w ) then
4160  tagc = 30
4161  do j = je+1, ja
4162  call mpi_irecv( var(1,j), ginfo(gid)%size2D_4C, &
4163  comm_datatype, prc_next(prc_w), tag+tagc, &
4164  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4165  ireq = ireq + 1
4166  tagc = tagc + 1
4167  enddo
4168  endif
4169 
4170 #ifdef _OPENACC
4171  ptr => ginfo(gid)%recvpack_WE2P(:,:,vid)
4172  !$acc host_data use_device(ptr) if(flag_device)
4173 #endif
4174  ! From E
4175  if ( prc_has_e ) then
4176 #ifdef _OPENACC
4177  call mpi_irecv( ptr(:,2), ginfo(gid)%size2D_WE, &
4178 #else
4179  call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,2,vid), ginfo(gid)%size2D_WE, &
4180 #endif
4181  comm_datatype, prc_next(prc_e), tag+60, &
4182  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4183  ireq = ireq + 1
4184  endif
4185 
4186  ! From W
4187  if ( prc_has_w ) then
4188 #ifdef _OPENACC
4189  call mpi_irecv( ptr(:,1), ginfo(gid)%size2D_WE, &
4190 #else
4191  call mpi_irecv( ginfo(gid)%recvpack_WE2P(:,1,vid), ginfo(gid)%size2D_WE, &
4192 #endif
4193  comm_datatype, prc_next(prc_w), tag+70, &
4194  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4195  ireq = ireq + 1
4196  endif
4197  !$acc end host_data
4198 
4199  end if
4200 
4201  ! From S
4202  if ( prc_has_s ) then
4203  tagc = 40
4204  do j = 1, js-1
4205  call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
4206  comm_datatype, prc_next(prc_s), tag+tagc, &
4207  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4208  ireq = ireq + 1
4209  tagc = tagc + 1
4210  enddo
4211  endif
4212 
4213  ! From N
4214  if ( prc_has_n ) then
4215  tagc = 50
4216  do j = je+1, ja
4217  call mpi_irecv( var(is,j), ginfo(gid)%size2D_NS8, &
4218  comm_datatype, prc_next(prc_n), tag+tagc, &
4219  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4220  ireq = ireq + 1
4221  tagc = tagc + 1
4222  enddo
4223  endif
4224 
4225 
4226  !! RECEIVE
4227 
4228  ! To N HALO communicate
4229  if ( prc_has_n ) then
4230  tagc = 40
4231  do j = je-jhalo+1, je
4232  call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
4233  comm_datatype, prc_next(prc_n), tag+tagc, &
4234  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4235  ireq = ireq + 1
4236  tagc = tagc + 1
4237  enddo
4238  endif
4239 
4240  ! To S HALO communicate
4241  if ( prc_has_s ) then
4242  tagc = 50
4243  do j = js, js+jhalo-1
4244  call mpi_isend( var(is,j), ginfo(gid)%size2D_NS8, &
4245  comm_datatype, prc_next(prc_s), tag+tagc, &
4246  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4247  ireq = ireq + 1
4248  tagc = tagc + 1
4249  enddo
4250  endif
4251 
4252  !$acc end host_data
4253 
4254  if ( .not. prc_twod ) then
4255 
4256  call packwe_2d( ia, is, ie, ja, js, je, &
4257  ihalo, &
4258  var, gid, vid)
4259 
4260  !$acc host_data use_device(var) if(flag_device)
4261 #ifdef _OPENACC
4262  ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4263  !$acc host_data use_device(ptr) if(flag_device)
4264 #endif
4265 
4266  ! To W HALO communicate
4267  if ( prc_has_w ) then
4268 #ifdef _OPENACC
4269  call mpi_isend( ptr(:,1), ginfo(gid)%size2D_WE, &
4270 #else
4271  call mpi_isend( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, &
4272 #endif
4273  comm_datatype, prc_next(prc_w), tag+60, &
4274  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4275  ireq = ireq + 1
4276  endif
4277 
4278  ! To E HALO communicate
4279  if ( prc_has_e ) then
4280 #ifdef _OPENACC
4281  call mpi_isend( ptr(:,2), ginfo(gid)%size2D_WE, &
4282 #else
4283  call mpi_isend( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, &
4284 #endif
4285  comm_datatype, prc_next(prc_e), tag+70, &
4286  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4287  ireq = ireq + 1
4288  endif
4289  !$acc end host_data
4290 
4291  ! To NW HALO communicate
4292  if ( prc_has_n .AND. prc_has_w ) then
4293  tagc = 0
4294  do j = je-jhalo+1, je
4295  call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4296  comm_datatype, prc_next(prc_nw), tag+tagc, &
4297  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4298  ireq = ireq + 1
4299  tagc = tagc + 1
4300  enddo
4301  else if ( prc_has_n ) then
4302  tagc = 10
4303  do j = je-jhalo+1, je
4304  call mpi_isend( var(1,j), ginfo(gid)%size2D_4C, &
4305  comm_datatype, prc_next(prc_n), tag+tagc, &
4306  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4307  ireq = ireq + 1
4308  tagc = tagc + 1
4309  enddo
4310  else if ( prc_has_w ) then
4311  tagc = 20
4312  do j = je+1, ja
4313  call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4314  comm_datatype, prc_next(prc_w), tag+tagc, &
4315  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4316  ireq = ireq + 1
4317  tagc = tagc + 1
4318  enddo
4319  endif
4320 
4321  ! To NE HALO communicate
4322  if ( prc_has_n .AND. prc_has_e ) then
4323  tagc = 10
4324  do j = je-jhalo+1, je
4325  call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4326  comm_datatype, prc_next(prc_ne), tag+tagc, &
4327  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4328  ireq = ireq + 1
4329  tagc = tagc + 1
4330  enddo
4331  else if ( prc_has_n ) then
4332  tagc = 0
4333  do j = je-jhalo+1, je
4334  call mpi_isend( var(ie+1,j), ginfo(gid)%size2D_4C, &
4335  comm_datatype, prc_next(prc_n), tag+tagc, &
4336  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4337  ireq = ireq + 1
4338  tagc = tagc + 1
4339  enddo
4340  else if ( prc_has_e ) then
4341  tagc = 30
4342  do j = je+1, ja
4343  call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4344  comm_datatype, prc_next(prc_e), tag+tagc, &
4345  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4346  ireq = ireq + 1
4347  tagc = tagc + 1
4348  enddo
4349  endif
4350 
4351  ! To SW HALO communicate
4352  if ( prc_has_s .AND. prc_has_w ) then
4353  tagc = 20
4354  do j = js, js+jhalo-1
4355  call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4356  comm_datatype, prc_next(prc_sw), tag+tagc, &
4357  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4358  ireq = ireq + 1
4359  tagc = tagc + 1
4360  enddo
4361  else if ( prc_has_s ) then
4362  tagc = 30
4363  do j = js, js+jhalo-1
4364  call mpi_isend( var(1,j), ginfo(gid)%size2D_4C, &
4365  comm_datatype, prc_next(prc_s), tag+tagc, &
4366  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4367  ireq = ireq + 1
4368  tagc = tagc + 1
4369  enddo
4370  else if ( prc_has_w ) then
4371  tagc = 0
4372  do j = 1, js-1
4373  call mpi_isend( var(is,j), ginfo(gid)%size2D_4C, &
4374  comm_datatype, prc_next(prc_w), tag+tagc, &
4375  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4376  ireq = ireq + 1
4377  tagc = tagc + 1
4378  enddo
4379  endif
4380 
4381  ! To SE HALO communicate
4382  if ( prc_has_s .AND. prc_has_e ) then
4383  tagc = 30
4384  do j = js, js+jhalo-1
4385  call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4386  comm_datatype, prc_next(prc_se), tag+tagc, &
4387  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4388  ireq = ireq + 1
4389  tagc = tagc + 1
4390  enddo
4391  else if ( prc_has_s ) then
4392  tagc = 20
4393  do j = js, js+jhalo-1
4394  call mpi_isend( var(ie+1,j), ginfo(gid)%size2D_4C, &
4395  comm_datatype, prc_next(prc_s), tag+tagc, &
4396  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4397  ireq = ireq + 1
4398  tagc = tagc + 1
4399  enddo
4400  else if ( prc_has_e ) then
4401  tagc = 10
4402  do j = 1, js-1
4403  call mpi_isend( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, &
4404  comm_datatype, prc_next(prc_e), tag+tagc, &
4405  comm_world, ginfo(gid)%req_list(ireq,vid), ierr )
4406  ireq = ireq + 1
4407  tagc = tagc + 1
4408  enddo
4409  endif
4410 
4411  !$acc end host_data
4412 
4413  end if
4414 
4415  endif
4416 
4417  ginfo(gid)%req_cnt(vid) = ireq - 1
4418 
4419  return

References comm_datatype, comm_world, scale_prc::prc_abort(), and scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ vars8_2d_mpi_onesided()

subroutine scale_comm_cartesc::vars8_2d_mpi_onesided ( real(rp), dimension(:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 4423 of file scale_comm_cartesC.F90.

4423  use scale_prc, only: &
4424  prc_abort
4425  use scale_prc_cartesc, only: &
4426  prc_twod
4427  implicit none
4428 
4429  real(RP), intent(inout) :: var(:,:)
4430  integer, intent(in) :: gid
4431  integer, intent(in) :: vid
4432 
4433  integer :: IA, IS, IE, IHALO
4434  integer :: JA, JS, JE, JHALO
4435 
4436  integer(kind=MPI_ADDRESS_KIND) :: disp
4437 
4438  integer :: ierr
4439  integer :: j
4440 #ifdef _OPENACC
4441  real(RP), pointer :: ptr(:,:)
4442 #endif
4443  !---------------------------------------------------------------------------
4444 
4445  ia = ginfo(gid)%IA
4446  is = ginfo(gid)%IS
4447  ie = ginfo(gid)%IE
4448  ihalo = ginfo(gid)%IHALO
4449  ja = ginfo(gid)%JA
4450  js = ginfo(gid)%JS
4451  je = ginfo(gid)%JE
4452  jhalo = ginfo(gid)%JHALO
4453 
4454  !$acc data copyin(var)
4455 
4456  call mpi_win_start( group_packwe, 0, ginfo(gid)%win_packWE(vid), ierr )
4457  call mpi_win_start( group_packns, 0, ginfo(gid)%win_packNS(vid), ierr )
4458 
4459  if ( comm_isallperiodic ) then
4460  !--- periodic condition
4461 
4462  !--- To 8-Direction HALO communicate
4463 
4464  !$acc host_data use_device(var)
4465 
4466  ! To N HALO communicate
4467  do j = je-jhalo+1, je
4468  disp = ihalo + ia * ( j - je+jhalo-1 )
4469  call mpi_put( var(is,j), ginfo(gid)%size2D_NS8, comm_datatype, &
4470  prc_next(prc_n), disp, ginfo(gid)%size2D_NS8, comm_datatype, &
4471  ginfo(gid)%win_packNS(vid), ierr )
4472  enddo
4473  ! To S HALO communicate
4474  do j = js, js+jhalo-1
4475  disp = ihalo + ia * ( j - js + jhalo )
4476  call mpi_put( var(is,j), ginfo(gid)%size2D_NS8, comm_datatype, &
4477  prc_next(prc_s), disp, ginfo(gid)%size2D_NS8, comm_datatype, &
4478  ginfo(gid)%win_packNS(vid), ierr )
4479  enddo
4480 
4481  !$acc end host_data
4482 
4483  if ( .not. prc_twod ) then
4484 
4485  call packwe_2d( ia, is, ie, ja, js, je, &
4486  ihalo, &
4487  var, gid, vid)
4488 
4489  !$acc host_data use_device(var)
4490 #ifdef _OPENACC
4491  ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4492  !$acc host_data use_device(ptr)
4493 #endif
4494 
4495  ! To W HALO communicate
4496  disp = 1
4497 #ifdef _OPENACC
4498  call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE, comm_datatype, &
4499 #else
4500  call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, comm_datatype, &
4501 #endif
4502  prc_next(prc_w), disp, ginfo(gid)%size2D_WE, comm_datatype, &
4503  ginfo(gid)%win_packWE(vid), ierr )
4504  ! To E HALO communicate
4505  disp = 0
4506 #ifdef _OPENACC
4507  call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE, comm_datatype, &
4508 #else
4509  call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, comm_datatype, &
4510 #endif
4511  prc_next(prc_e), disp, ginfo(gid)%size2D_WE, comm_datatype, &
4512  ginfo(gid)%win_packWE(vid), ierr )
4513  !$acc end host_data
4514  ! To NW HALO communicate
4515  do j = je-jhalo+1, je
4516  disp = ie + ia * ( j - je+jhalo-1 )
4517  call mpi_put( var(is,j), ginfo(gid)%size2D_4C, comm_datatype, &
4518  prc_next(prc_nw), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4519  ginfo(gid)%win_packNS(vid), ierr )
4520  enddo
4521  ! To NE HALO communicate
4522  do j = je-jhalo+1, je
4523  disp = ia * ( j - je+jhalo-1 )
4524  call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, comm_datatype, &
4525  prc_next(prc_ne), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4526  ginfo(gid)%win_packNS(vid), ierr )
4527  enddo
4528  ! To SW HALO communicate
4529  do j = js, js+jhalo-1
4530  disp = ie + ia * ( j - js + jhalo )
4531  call mpi_put( var(is,j), ginfo(gid)%size2D_4C, comm_datatype, &
4532  prc_next(prc_sw), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4533  ginfo(gid)%win_packNS(vid), ierr )
4534  enddo
4535  ! To SE HALO communicate
4536  do j = js, js+jhalo-1
4537  disp = ia * ( j - js + jhalo )
4538  call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, comm_datatype, &
4539  prc_next(prc_se), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4540  ginfo(gid)%win_packNS(vid), ierr )
4541  enddo
4542 
4543  !$acc end host_data
4544 
4545  end if
4546  else
4547  !--- non-periodic condition
4548 
4549  !$acc host_data use_device(var)
4550 
4551  ! To N HALO communicate
4552  if ( prc_has_n ) then
4553  do j = je-jhalo+1, je
4554  disp = ihalo + ia * ( j - je+jhalo-1 )
4555  call mpi_put( var(is,j), ginfo(gid)%size2D_NS8, comm_datatype, &
4556  prc_next(prc_n), disp, ginfo(gid)%size2D_NS8, comm_datatype, &
4557  ginfo(gid)%win_packNS(vid), ierr )
4558  enddo
4559  endif
4560  ! To S HALO communicate
4561  if ( prc_has_s ) then
4562  do j = js, js+jhalo-1
4563  disp = ihalo + ia * ( j - js + jhalo )
4564  call mpi_put( var(is,j), ginfo(gid)%size2D_NS8, comm_datatype, &
4565  prc_next(prc_s), disp, ginfo(gid)%size2D_NS8, comm_datatype, &
4566  ginfo(gid)%win_packNS(vid), ierr )
4567  enddo
4568  endif
4569 
4570  !$acc end host_data
4571 
4572  if ( .not. prc_twod ) then
4573 
4574  call packwe_2d( ia, is, ie, ja, js, je, &
4575  ihalo, &
4576  var, gid, vid)
4577 
4578  !$acc host_data use_device(var)
4579 #ifdef _OPENACC
4580  ptr => ginfo(gid)%sendpack_P2WE(:,:,vid)
4581  !$acc host_data use_device(ptr)
4582 #endif
4583 
4584  ! To W HALO communicate
4585  if ( prc_has_w ) then
4586  disp = 1
4587 #ifdef _OPENACC
4588  call mpi_put( ptr(:,1), ginfo(gid)%size2D_WE, comm_datatype, &
4589 #else
4590  call mpi_put( ginfo(gid)%sendpack_P2WE(:,1,vid), ginfo(gid)%size2D_WE, comm_datatype, &
4591 #endif
4592  prc_next(prc_w), disp, ginfo(gid)%size2D_WE, comm_datatype, &
4593  ginfo(gid)%win_packWE(vid), ierr )
4594  endif
4595  ! To E HALO communicate
4596  if ( prc_has_e ) then
4597  disp = 0
4598 #ifdef _OPENACC
4599  call mpi_put( ptr(:,2), ginfo(gid)%size2D_WE, comm_datatype, &
4600 #else
4601  call mpi_put( ginfo(gid)%sendpack_P2WE(:,2,vid), ginfo(gid)%size2D_WE, comm_datatype, &
4602 #endif
4603  prc_next(prc_e), disp, ginfo(gid)%size2D_WE, comm_datatype, &
4604  ginfo(gid)%win_packWE(vid), ierr )
4605  endif
4606  !$acc end host_data
4607  ! To NW HALO communicate
4608  if ( prc_has_n .AND. prc_has_w ) then
4609  do j = je-jhalo+1, je
4610  disp = ie + ia * ( j - je+jhalo-1 )
4611  call mpi_put( var(is,j), ginfo(gid)%size2D_4C, comm_datatype, &
4612  prc_next(prc_nw), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4613  ginfo(gid)%win_packNS(vid), ierr )
4614  enddo
4615  else if ( prc_has_n ) then
4616  do j = je-jhalo+1, je
4617  disp = ia * ( j - je+jhalo-1 )
4618  call mpi_put( var(1,j), ginfo(gid)%size2D_4C, comm_datatype, &
4619  prc_next(prc_n), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4620  ginfo(gid)%win_packNS(vid), ierr )
4621  enddo
4622  else if ( prc_has_w ) then
4623  do j = je+1, ja
4624  disp = ie + ia * ( j - je-1 + jhalo )
4625  call mpi_put( var(is,j), ginfo(gid)%size2D_4C, comm_datatype, &
4626  prc_next(prc_w), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4627  ginfo(gid)%win_packNS(vid), ierr )
4628  enddo
4629  endif
4630  ! To NE HALO communicate
4631  if ( prc_has_n .AND. prc_has_e ) then
4632  do j = je-jhalo+1, je
4633  disp = ia * ( j - je+jhalo-1 )
4634  call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, comm_datatype, &
4635  prc_next(prc_ne), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4636  ginfo(gid)%win_packNS(vid), ierr )
4637  enddo
4638  else if ( prc_has_n ) then
4639  do j = je-jhalo+1, je
4640  disp = ie + ia * ( j - je+jhalo-1 )
4641  call mpi_put( var(ie+1,j), ginfo(gid)%size2D_4C, comm_datatype, &
4642  prc_next(prc_n), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4643  ginfo(gid)%win_packNS(vid), ierr )
4644  enddo
4645  else if ( prc_has_e ) then
4646  do j = je+1, ja
4647  disp = ia * ( j - je-1 + jhalo )
4648  call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, comm_datatype, &
4649  prc_next(prc_e), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4650  ginfo(gid)%win_packNS(vid), ierr )
4651  enddo
4652  endif
4653  ! To SW HALO communicate
4654  if ( prc_has_s .AND. prc_has_w ) then
4655  do j = js, js+jhalo-1
4656  disp = ie + ia * ( j - js + jhalo )
4657  call mpi_put( var(is,j), ginfo(gid)%size2D_4C, comm_datatype, &
4658  prc_next(prc_sw), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4659  ginfo(gid)%win_packNS(vid), ierr )
4660  enddo
4661  else if ( prc_has_s ) then
4662  do j = js, js+jhalo-1
4663  disp = ia * ( j - js + jhalo )
4664  call mpi_put( var(1,j), ginfo(gid)%size2D_4C, comm_datatype, &
4665  prc_next(prc_s), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4666  ginfo(gid)%win_packNS(vid), ierr )
4667  enddo
4668  else if ( prc_has_w ) then
4669  do j = 1, js-1
4670  disp = ie + ia * ( j - 1 )
4671  call mpi_put( var(is,j), ginfo(gid)%size2D_4C, comm_datatype, &
4672  prc_next(prc_w), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4673  ginfo(gid)%win_packNS(vid), ierr )
4674  enddo
4675  endif
4676  ! To SE HALO communicate
4677  if ( prc_has_s .AND. prc_has_e ) then
4678  do j = js, js+jhalo-1
4679  disp = ia * ( j - js + jhalo )
4680  call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, comm_datatype, &
4681  prc_next(prc_se), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4682  ginfo(gid)%win_packNS(vid), ierr )
4683  enddo
4684  else if ( prc_has_s ) then
4685  do j = js, js+jhalo-1
4686  disp = ie + ia * ( j - js + jhalo )
4687  call mpi_put( var(ie+1,j), ginfo(gid)%size2D_4C, comm_datatype, &
4688  prc_next(prc_s), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4689  ginfo(gid)%win_packNS(vid), ierr )
4690  enddo
4691  else if ( prc_has_e ) then
4692  do j = 1, js-1
4693  disp = ia * ( j - 1 )
4694  call mpi_put( var(ie-ihalo+1,j), ginfo(gid)%size2D_4C, comm_datatype, &
4695  prc_next(prc_e), disp, ginfo(gid)%size2D_4C, comm_datatype, &
4696  ginfo(gid)%win_packNS(vid), ierr )
4697  enddo
4698  endif
4699 
4700  !$acc end host_data
4701  end if
4702 
4703  endif
4704 
4705  call mpi_win_complete( ginfo(gid)%win_packWE(vid), ierr )
4706  call mpi_win_complete( ginfo(gid)%win_packNS(vid), ierr )
4707 
4708  !$acc end data
4709 
4710  return

References comm_datatype, scale_prc::prc_abort(), and scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ vars_3d_mpi_pc()

subroutine scale_comm_cartesc::vars_3d_mpi_pc ( real(rp), dimension(:,:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 4714 of file scale_comm_cartesC.F90.

4714  use scale_prc, only: &
4715  prc_abort
4716  use scale_prc_cartesc, only: &
4717  prc_twod
4718  implicit none
4719  real(RP), intent(inout) :: var(:,:,:)
4720  integer, intent(in) :: gid
4721  integer, intent(in) :: vid
4722 
4723  integer :: KA
4724  integer :: IA, IS, IE
4725  integer :: JA, JS, JE
4726  integer :: IHALO
4727 
4728  integer :: ierr
4729  !---------------------------------------------------------------------------
4730 
4731 #ifdef DEBUG
4732  if ( ginfo(gid)%use_packbuf(ginfo(gid)%packid(vid)) ) then
4733  log_error("vars_3D_mpi_pc",*) 'packing buffer is already used', vid, ginfo(gid)%packid(vid)
4734  call prc_abort
4735  end if
4736  ginfo(gid)%use_packbuf(ginfo(gid)%packid(vid)) = .true.
4737 #endif
4738 
4739 #ifdef _OPENACC
4740  if ( ginfo(gid)%device_alloc(vid+comm_vsize_max) ) then
4741  !$acc update device(var)
4742  end if
4743 #endif
4744 
4745  if ( .not. prc_twod ) then
4746  ka = ginfo(gid)%KA
4747  ia = ginfo(gid)%IA
4748  is = ginfo(gid)%IS
4749  ie = ginfo(gid)%IE
4750  ja = ginfo(gid)%JA
4751  js = ginfo(gid)%JS
4752  je = ginfo(gid)%JE
4753  ihalo = ginfo(gid)%IHALO
4754  call packwe_3d( ka, ia, is, ie, ja, js, je, &
4755  ihalo, &
4756  var, gid, ginfo(gid)%packid(vid))
4757  !$acc wait
4758  end if
4759 
4760  call mpi_startall(ginfo(gid)%preq_cnt(vid), ginfo(gid)%preq_list(1:ginfo(gid)%preq_cnt(vid),vid), ierr)
4761 
4762  return

References packwe_3d(), scale_prc::prc_abort(), and scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ wait_3d_mpi()

subroutine scale_comm_cartesc::wait_3d_mpi ( real(rp), dimension(:,:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 4766 of file scale_comm_cartesC.F90.

4766  use scale_prc_cartesc, only: &
4767  prc_twod
4768  implicit none
4769  real(RP), intent(inout) :: var(:,:,:)
4770  integer, intent(in) :: gid
4771  integer, intent(in) :: vid
4772 
4773  integer :: KA
4774  integer :: IA, IS, IE
4775  integer :: JA, JS, JE
4776  integer :: IHALO
4777 
4778  integer :: ierr
4779  !---------------------------------------------------------------------------
4780 
4781  !--- wait packets
4782  call mpi_waitall( ginfo(gid)%req_cnt (vid), &
4783  ginfo(gid)%req_list(1:ginfo(gid)%req_cnt(vid),vid), &
4784  mpi_statuses_ignore, &
4785  ierr )
4786  if ( .not. prc_twod ) then
4787  ka = ginfo(gid)%KA
4788  ia = ginfo(gid)%IA
4789  is = ginfo(gid)%IS
4790  ie = ginfo(gid)%IE
4791  ja = ginfo(gid)%JA
4792  js = ginfo(gid)%JS
4793  je = ginfo(gid)%JE
4794  ihalo = ginfo(gid)%IHALO
4795  call unpackwe_3d( ka, ia, is, ie, ja, js, je, &
4796  ihalo, &
4797  var, ginfo(gid)%recvpack_WE2P(:,:,vid) )
4798  !$acc wait
4799  end if
4800 
4801 #ifdef DEBUG
4802  ginfo(gid)%use_packbuf(vid) = .false.
4803 #endif
4804 
4805  return

References scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the caller graph for this function:

◆ wait_3d_mpi_onesided()

subroutine scale_comm_cartesc::wait_3d_mpi_onesided ( real(rp), dimension(:,:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 4809 of file scale_comm_cartesC.F90.

4809  use scale_prc_cartesc, only: &
4810  prc_twod
4811  implicit none
4812  real(RP), intent(inout) :: var(:,:,:)
4813  integer, intent(in) :: gid
4814  integer, intent(in) :: vid
4815 
4816  integer :: KA
4817  integer :: IA, IS, IE
4818  integer :: JA, JS, JE
4819  integer :: IHALO, JHALO
4820 
4821  real(RP), pointer :: pack(:)
4822 
4823  integer :: ierr
4824  !---------------------------------------------------------------------------
4825 
4826  ka = ginfo(gid)%KA
4827  ia = ginfo(gid)%IA
4828  is = ginfo(gid)%IS
4829  ie = ginfo(gid)%IE
4830  ja = ginfo(gid)%JA
4831  js = ginfo(gid)%JS
4832  je = ginfo(gid)%JE
4833  ihalo = ginfo(gid)%IHALO
4834  jhalo = ginfo(gid)%JHALO
4835 
4836  call mpi_win_wait( ginfo(gid)%win_packWE(vid), ierr )
4837  if ( .not. prc_twod ) then
4838  call c_f_pointer( ginfo(gid)%recvbuf_WE(vid), pack, (/ginfo(gid)%size2D_WE*ka*2/) )
4839  call unpackwe_3d( ka, ia, is, ie, ja, js, je, &
4840  ihalo, &
4841  var, pack )
4842  end if
4843 
4844  call mpi_win_wait( ginfo(gid)%win_packNS(vid), ierr )
4845  call c_f_pointer( ginfo(gid)%recvbuf_NS(vid), pack, (/ginfo(gid)%size2D_NS4*ka*2/) )
4846  call unpackns_3d( ka, ia, is, ie, ja, js, je, &
4847  jhalo, &
4848  var, pack )
4849 
4850  !$acc wait
4851 
4852  call mpi_win_post( group_packwe, mpi_mode_nostore, ginfo(gid)%win_packWE(vid), ierr )
4853  call mpi_win_post( group_packns, mpi_mode_nostore, ginfo(gid)%win_packNS(vid), ierr )
4854 
4855  return

References scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the caller graph for this function:

◆ wait_2d_mpi()

subroutine scale_comm_cartesc::wait_2d_mpi ( real(rp), dimension(:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 4859 of file scale_comm_cartesC.F90.

4859  use scale_prc_cartesc, only: &
4860  prc_twod
4861  implicit none
4862  real(RP), intent(inout) :: var(:,:)
4863  integer, intent(in) :: gid
4864  integer, intent(in) :: vid
4865 
4866  integer :: KA
4867  integer :: IA, IS, IE
4868  integer :: JA, JS, JE
4869  integer :: IHALO
4870 
4871  integer :: ierr
4872  !---------------------------------------------------------------------------
4873 
4874  !--- wait packets
4875  call mpi_waitall( ginfo(gid)%req_cnt(vid), &
4876  ginfo(gid)%req_list(1:ginfo(gid)%req_cnt(vid),vid), &
4877  mpi_statuses_ignore, &
4878  ierr )
4879  if ( .not. prc_twod ) then
4880  ka = ginfo(gid)%KA
4881  ia = ginfo(gid)%IA
4882  is = ginfo(gid)%IS
4883  ie = ginfo(gid)%IE
4884  ja = ginfo(gid)%JA
4885  js = ginfo(gid)%JS
4886  je = ginfo(gid)%JE
4887  ihalo = ginfo(gid)%IHALO
4888  call unpackwe_2d( ka, ia, is, ie, ja, js, je, &
4889  ihalo, &
4890  var, ginfo(gid)%recvpack_WE2P(:,:,vid) )
4891  end if
4892 
4893 #ifdef DEBUG
4894  ginfo(gid)%use_packbuf(vid) = .false.
4895 #endif
4896 
4897  return

References scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the caller graph for this function:

◆ wait_2d_mpi_onesided()

subroutine scale_comm_cartesc::wait_2d_mpi_onesided ( real(rp), dimension(:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 4901 of file scale_comm_cartesC.F90.

4901  use scale_prc_cartesc, only: &
4902  prc_twod
4903  implicit none
4904  real(RP), intent(inout) :: var(:,:)
4905  integer, intent(in) :: gid
4906  integer, intent(in) :: vid
4907 
4908  integer :: KA
4909  integer :: IA, IS, IE
4910  integer :: JA, JS, JE
4911  integer :: IHALO, JHALO
4912 
4913  real(RP), pointer :: pack(:)
4914 
4915  integer :: ierr
4916  !---------------------------------------------------------------------------
4917 
4918  ka = ginfo(gid)%KA
4919  ia = ginfo(gid)%IA
4920  is = ginfo(gid)%IS
4921  ie = ginfo(gid)%IE
4922  ja = ginfo(gid)%JA
4923  js = ginfo(gid)%JS
4924  je = ginfo(gid)%JE
4925  ihalo = ginfo(gid)%IHALO
4926  jhalo = ginfo(gid)%JHALO
4927 
4928  call mpi_win_wait( ginfo(gid)%win_packWE(vid), ierr )
4929  if ( .not. prc_twod ) then
4930  call c_f_pointer( ginfo(gid)%recvbuf_WE(vid), pack, (/ginfo(gid)%size2D_WE*ka*2/) )
4931  call unpackwe_2d( ka, ia, is, ie, ja, js, je, &
4932  ihalo, &
4933  var, pack )
4934  end if
4935 
4936  call mpi_win_wait( ginfo(gid)%win_packNS(vid), ierr )
4937  call c_f_pointer( ginfo(gid)%recvbuf_NS(vid), pack, (/ginfo(gid)%size2D_NS4*ka*2/) )
4938  call unpackns_2d( ia, is, ie, ja, js, je, &
4939  jhalo, &
4940  var, pack )
4941 
4942  call mpi_win_post( group_packwe, mpi_mode_nostore, ginfo(gid)%win_packWE(vid), ierr )
4943  call mpi_win_post( group_packns, mpi_mode_nostore, ginfo(gid)%win_packNS(vid), ierr )
4944 
4945  return

References scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the caller graph for this function:

◆ wait_3d_mpi_pc()

subroutine scale_comm_cartesc::wait_3d_mpi_pc ( real(rp), dimension(:,:,:), intent(inout)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 4949 of file scale_comm_cartesC.F90.

4949  use scale_prc_cartesc, only: &
4950  prc_twod
4951  implicit none
4952  real(RP), intent(inout) :: var(:,:,:)
4953  integer, intent(in) :: gid
4954  integer, intent(in) :: vid
4955 
4956  integer :: KA
4957  integer :: IA, IS, IE
4958  integer :: JA, JS, JE
4959  integer :: IHALO
4960 
4961  integer :: pid
4962  integer :: ierr
4963 
4964  !--- wait packets
4965  call mpi_waitall( ginfo(gid)%preq_cnt (vid), &
4966  ginfo(gid)%preq_list(1:ginfo(gid)%preq_cnt(vid),vid), &
4967  mpi_statuses_ignore, &
4968  ierr )
4969  if ( .not. prc_twod ) then
4970  ka = ginfo(gid)%KA
4971  ia = ginfo(gid)%IA
4972  is = ginfo(gid)%IS
4973  ie = ginfo(gid)%IE
4974  ja = ginfo(gid)%JA
4975  js = ginfo(gid)%JS
4976  je = ginfo(gid)%JE
4977  ihalo = ginfo(gid)%IHALO
4978  pid = ginfo(gid)%packid(vid)
4979  call unpackwe_3d( ka, ia, is, ie, ja, js, je, &
4980  ihalo, &
4981  var, ginfo(gid)%recvpack_WE2P(:,:,pid) )
4982  !$acc wait
4983  end if
4984 
4985 #ifdef DEBUG
4986  ginfo(gid)%use_packbuf(ginfo(gid)%packid(vid)) = .false.
4987 #endif
4988 
4989 #ifdef _OPENACC
4990  if ( ginfo(gid)%device_alloc(vid+comm_vsize_max) ) then
4991  !$acc update host(var)
4992  end if
4993 #endif
4994 
4995  return

References scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the caller graph for this function:

◆ packwe_3d()

subroutine scale_comm_cartesc::packwe_3d ( integer, intent(in)  KA,
integer, intent(in)  IA,
integer, intent(in)  IS,
integer, intent(in)  IE,
integer, intent(in)  JA,
integer, intent(in)  JS,
integer, intent(in)  JE,
integer, intent(in)  IHALO,
real(rp), dimension(ka,ia,ja), intent(in)  var,
integer, intent(in)  gid,
integer, intent(in)  vid 
)

Definition at line 5001 of file scale_comm_cartesC.F90.

5001  implicit none
5002  integer, intent(in) :: KA
5003  integer, intent(in) :: IA, IS, IE
5004  integer, intent(in) :: JA, JS, JE
5005  integer, intent(in) :: IHALO
5006  real(RP), intent(in) :: var(KA,IA,JA)
5007  integer, intent(in) :: gid
5008  integer, intent(in) :: vid
5009 
5010  integer :: k, i, j, n
5011 
5012 #ifdef _OPENACC
5013  real(RP), pointer :: ptr(:,:,:)
5014  ptr => ginfo(gid)%sendpack_P2WE
5015 #endif
5016 
5017  !$acc data copyin(var) if(acc_is_present(var))
5018 
5019  call prof_rapstart('COMM_pack', 3)
5020 
5021  if ( prc_has_w ) then
5022  !--- packing packets to West
5023  !$omp parallel do private(i,j,k,n) OMP_SCHEDULE_ collapse(2)
5024  !$acc parallel if(acc_is_present(var)) async
5025  !$acc loop collapse(2) gang
5026  do j = js, je
5027  do i = is, is+ihalo-1
5028  !$acc loop independent vector
5029  do k = 1, ka
5030  n = (j-js) * ka * ihalo &
5031  + (i-is) * ka &
5032  + k
5033 #ifdef _OPENACC
5034  ptr(n,1,vid) = var(k,i,j)
5035 #else
5036  ginfo(gid)%sendpack_P2WE(n,1,vid) = var(k,i,j)
5037 #endif
5038  enddo
5039  enddo
5040  enddo
5041  !$acc end parallel
5042  end if
5043 
5044  if ( prc_has_e ) then
5045  !--- packing packets to East
5046  !$omp parallel do private(i,j,k,n) OMP_SCHEDULE_ collapse(2)
5047  !$acc parallel if(acc_is_present(var)) async
5048  !$acc loop collapse(2) gang
5049  do j = js, je
5050  do i = ie-ihalo+1, ie
5051  !$acc loop independent vector
5052  do k = 1, ka
5053  n = (j-js) * ka * ihalo &
5054  + (i-ie+ihalo-1) * ka &
5055  + k
5056 #ifdef _OPENACC
5057  ptr(n,2,vid) = var(k,i,j)
5058 #else
5059  ginfo(gid)%sendpack_P2WE(n,2,vid) = var(k,i,j)
5060 #endif
5061  enddo
5062  enddo
5063  enddo
5064  !$acc end parallel
5065  end if
5066 
5067  call prof_rapend('COMM_pack', 3)
5068 
5069  !$acc end data
5070 
5071  return

References scale_prc_cartesc::prc_twod.

Referenced by vars8_3d_mpi(), vars8_3d_mpi_onesided(), vars_3d_mpi(), vars_3d_mpi_onesided(), and vars_3d_mpi_pc().

Here is the caller graph for this function:

◆ copy_boundary_2d()

subroutine scale_comm_cartesc::copy_boundary_2d ( real(rp), dimension(:,:), intent(inout)  var,
integer, intent(in)  gid 
)

Definition at line 5702 of file scale_comm_cartesC.F90.

5702  use scale_prc_cartesc, only: &
5703  prc_twod
5704  implicit none
5705 
5706  real(RP), intent(inout) :: var(:,:)
5707  integer, intent(in) :: gid
5708 
5709  integer :: IS, IE, IHALO
5710  integer :: JS, JE, JHALO
5711 
5712  integer :: i, j
5713  !---------------------------------------------------------------------------
5714 
5715  !$acc data copy(var)
5716 
5717  is = ginfo(gid)%IS
5718  ie = ginfo(gid)%IE
5719  ihalo = ginfo(gid)%IHALO
5720  js = ginfo(gid)%JS
5721  je = ginfo(gid)%JE
5722  jhalo = ginfo(gid)%JHALO
5723 
5724  !$omp parallel
5725 
5726  !--- copy inner data to HALO(North)
5727  if( .NOT. prc_has_n ) then
5728  !$acc kernels async
5729  do j = je+1, je+jhalo
5730  !$omp do
5731  do i = is, ie
5732  var(i,j) = var(i,je)
5733  enddo
5734  !$omp end do nowait
5735  enddo
5736  !$acc end kernels
5737  endif
5738 
5739  !--- copy inner data to HALO(South)
5740  if( .NOT. prc_has_s ) then
5741  !$acc kernels async
5742  !$acc loop independent
5743  do j = js-jhalo, js-1
5744  !$omp do
5745  do i = is, ie
5746  var(i,j) = var(i,js)
5747  enddo
5748  !$omp end do nowait
5749  enddo
5750  !$acc end kernels
5751  endif
5752 
5753  if ( .not. prc_twod ) then
5754 
5755  if( .NOT. prc_has_e ) then
5756  !$omp do
5757  !$acc kernels async
5758  do j = js, je
5759  do i = ie+1, ie+ihalo
5760  var(i,j) = var(ie,j)
5761  enddo
5762  enddo
5763  !$acc end kernels
5764  !$omp end do nowait
5765  endif
5766 
5767  if( .NOT. prc_has_w ) then
5768  !$omp do
5769  !$acc kernels async
5770  do j = js, je
5771  !$acc loop independent
5772  do i = is-ihalo, is-1
5773  var(i,j) = var(is,j)
5774  enddo
5775  enddo
5776  !$acc end kernels
5777  !$omp end do nowait
5778  endif
5779 
5780  !--- copy inner data to HALO(NorthWest)
5781  if( .NOT. prc_has_n .AND. .NOT. prc_has_w ) then
5782  !$acc kernels async
5783  do j = je+1, je+jhalo
5784  !$acc loop independent
5785  do i = is-ihalo, is-1
5786  var(i,j) = var(is,je)
5787  enddo
5788  enddo
5789  !$acc end kernels
5790  elseif( .NOT. prc_has_n ) then
5791  !$acc kernels async
5792  do j = je+1, je+jhalo
5793  do i = is-ihalo, is-1
5794  var(i,j) = var(i,je)
5795  enddo
5796  enddo
5797  !$acc end kernels
5798  elseif( .NOT. prc_has_w ) then
5799  !$acc kernels async
5800  do j = je+1, je+jhalo
5801  !$acc loop independent
5802  do i = is-ihalo, is-1
5803  var(i,j) = var(is,j)
5804  enddo
5805  enddo
5806  !$acc end kernels
5807  endif
5808 
5809  !--- copy inner data to HALO(SouthWest)
5810  if( .NOT. prc_has_s .AND. .NOT. prc_has_w ) then
5811  !$acc kernels async
5812  !$acc loop independent
5813  do j = js-jhalo, js-1
5814  !$acc loop independent
5815  do i = is-ihalo, is-1
5816  var(i,j) = var(is,js)
5817  enddo
5818  enddo
5819  !$acc end kernels
5820  elseif( .NOT. prc_has_s ) then
5821  !$acc kernels async
5822  !$acc loop independent
5823  do j = js-jhalo, js-1
5824  do i = is-ihalo, is-1
5825  var(i,j) = var(i,js)
5826  enddo
5827  enddo
5828  !$acc end kernels
5829  elseif( .NOT. prc_has_w ) then
5830  !$acc kernels async
5831  do j = js-jhalo, js-1
5832  !$acc loop independent
5833  do i = is-ihalo, is-1
5834  var(i,j) = var(is,j)
5835  enddo
5836  enddo
5837  !$acc end kernels
5838  endif
5839 
5840  !--- copy inner data to HALO(NorthEast)
5841  if( .NOT. prc_has_n .AND. .NOT. prc_has_e ) then
5842  !$acc kernels async
5843  do j = je+1, je+jhalo
5844  do i = ie+1, ie+ihalo
5845  var(i,j) = var(ie,je)
5846  enddo
5847  enddo
5848  !$acc end kernels
5849  elseif( .NOT. prc_has_n ) then
5850  !$acc kernels async
5851  do j = je+1, je+jhalo
5852  do i = ie+1, ie+ihalo
5853  var(i,j) = var(i,je)
5854  enddo
5855  enddo
5856  !$acc end kernels
5857  elseif( .NOT. prc_has_e ) then
5858  !$acc kernels async
5859  do j = je+1, je+jhalo
5860  do i = ie+1, ie+ihalo
5861  var(i,j) = var(ie,j)
5862  enddo
5863  enddo
5864  !$acc end kernels
5865  endif
5866 
5867  !--- copy inner data to HALO(SouthEast)
5868  if( .NOT. prc_has_s .AND. .NOT. prc_has_e ) then
5869  !$acc kernels async
5870  do j = js-jhalo, js-1
5871  do i = ie+1, ie+ihalo
5872  var(i,j) = var(ie,js)
5873  enddo
5874  enddo
5875  !$acc end kernels
5876  elseif( .NOT. prc_has_s ) then
5877  !$acc kernels async
5878  !$acc loop independent
5879  do j = js-jhalo, js-1
5880  do i = ie+1, ie+ihalo
5881  var(i,j) = var(i,js)
5882  enddo
5883  enddo
5884  !$acc end kernels
5885  elseif( .NOT. prc_has_e ) then
5886  !$acc kernels async
5887  do j = js-jhalo, js-1
5888  do i = ie+1, ie+ihalo
5889  var(i,j) = var(ie,j)
5890  enddo
5891  enddo
5892  !$acc end kernels
5893  endif
5894 
5895  end if
5896 
5897  !$omp end parallel
5898 
5899  !$acc wait
5900 
5901  !$acc end data
5902 
5903  return

References scale_prc_cartesc::prc_twod.

Referenced by comm_vars8_init().

Here is the caller graph for this function:

Variable Documentation

◆ comm_datatype

integer, public scale_comm_cartesc::comm_datatype

◆ comm_world

integer, public scale_comm_cartesc::comm_world
scale_prc::prc_abort
subroutine, public prc_abort
Abort Process.
Definition: scale_prc.F90:349
scale_atmos_grid_cartesc_index::ihalo
integer, public ihalo
Definition: scale_atmos_grid_cartesC_index.F90:44
scale_atmos_grid_cartesc_index::ka
integer, public ka
Definition: scale_atmos_grid_cartesC_index.F90:47
scale_prc::prc_local_comm_world
integer, public prc_local_comm_world
local communicator
Definition: scale_prc.F90:88
scale_prc
module PROCESS
Definition: scale_prc.F90:11
scale_precision::rp
integer, parameter, public rp
Definition: scale_precision.F90:41
scale_atmos_grid_cartesc_index::ie
integer, public ie
end point of inner domain: x, local
Definition: scale_atmos_grid_cartesC_index.F90:54
scale_prc::prc_masterrank
integer, parameter, public prc_masterrank
master process in each communicator
Definition: scale_prc.F90:66
scale_const
module CONSTANT
Definition: scale_const.F90:11
scale_atmos_grid_cartesc_index::ia
integer, public ia
Definition: scale_atmos_grid_cartesC_index.F90:48
scale_prc_cartesc
module process / cartesC
Definition: scale_prc_cartesC.F90:11
scale_atmos_grid_cartesc_index::is
integer, public is
start point of inner domain: x, local
Definition: scale_atmos_grid_cartesC_index.F90:53
scale_atmos_grid_cartesc_index::jhalo
integer, public jhalo
Definition: scale_atmos_grid_cartesC_index.F90:45
scale_atmos_grid_cartesc_index::ja
integer, public ja
Definition: scale_atmos_grid_cartesC_index.F90:49
scale_comm_cartesc::comm_world
integer, public comm_world
communication world ID
Definition: scale_comm_cartesC.F90:104
scale_atmos_grid_cartesc_index::jmax
integer, public jmax
Definition: scale_atmos_grid_cartesC_index.F90:38
scale_atmos_grid_cartesc_index::js
integer, public js
start point of inner domain: y, local
Definition: scale_atmos_grid_cartesC_index.F90:55
scale_const::const_undef
real(rp), public const_undef
Definition: scale_const.F90:43
scale_atmos_grid_cartesc_index::je
integer, public je
end point of inner domain: y, local
Definition: scale_atmos_grid_cartesC_index.F90:56
scale_prc_cartesc::prc_twod
logical, public prc_twod
2D experiment
Definition: scale_prc_cartesC.F90:56