SCALE-RM
Functions/Subroutines | Variables
scale_prc_cartesc Module Reference

module process / cartesC More...

Functions/Subroutines

subroutine, public prc_cartesc_setup
 Setup Processor topology. More...
 

Variables

integer, parameter, public prc_w = 1
 [node direction] west More...
 
integer, parameter, public prc_n = 2
 [node direction] north More...
 
integer, parameter, public prc_e = 3
 [node direction] east More...
 
integer, parameter, public prc_s = 4
 [node direction] south More...
 
integer, parameter, public prc_nw = 5
 [node direction] northwest More...
 
integer, parameter, public prc_ne = 6
 [node direction] northeast More...
 
integer, parameter, public prc_sw = 7
 [node direction] southwest More...
 
integer, parameter, public prc_se = 8
 [node direction] southeast More...
 
integer, public prc_num_x = 1
 x length of 2D processor topology More...
 
integer, public prc_num_y = 1
 y length of 2D processor topology More...
 
integer, dimension(:,:), allocatable, public prc_2drank
 node index in 2D topology More...
 
integer, dimension(8), public prc_next = -1
 node ID of 8 neighbour process More...
 
logical, public prc_has_w
 
logical, public prc_has_n
 
logical, public prc_has_e
 
logical, public prc_has_s
 
logical, public prc_periodic_x = .true.
 periodic condition or not (X)? More...
 
logical, public prc_periodic_y = .true.
 periodic condition or not (Y)? More...
 

Detailed Description

module process / cartesC

Description
MPI process management module for Cartesian-C grid
Author
Team SCALE
NAMELIST
  • PARAM_PRC_CARTESC
    nametypedefault valuecomment
    PRC_NUM_X integer 1 x length of 2D processor topology
    PRC_NUM_Y integer 1 y length of 2D processor topology
    PRC_PERIODIC_X logical .true. periodic condition or not (X)?
    PRC_PERIODIC_Y logical .true. periodic condition or not (Y)?
    PRC_CART_REORDER logical .false. flag for rank reordering over the cartesian map

History Output
No history output

Function/Subroutine Documentation

◆ prc_cartesc_setup()

subroutine, public scale_prc_cartesc::prc_cartesc_setup ( )

Setup Processor topology.

Definition at line 68 of file scale_prc_cartesC.F90.

References scale_io::io_fid_conf, scale_io::io_fid_nml, scale_io::io_l, scale_io::io_nml, prc_2drank, scale_prc::prc_abort(), scale_prc::prc_abort_comm_world, prc_e, scale_prc::prc_global_comm_world, scale_prc::prc_global_ismaster, scale_prc::prc_global_myrank, scale_prc::prc_global_nprocs, prc_has_e, prc_has_n, prc_has_s, prc_has_w, scale_prc::prc_ismaster, scale_prc::prc_local_comm_world, scale_prc::prc_masterrank, scale_prc::prc_mpi_alive, scale_prc::prc_myrank, prc_n, prc_ne, prc_next, scale_prc::prc_nprocs, prc_num_x, prc_num_y, prc_nw, prc_periodic_x, prc_periodic_y, prc_s, prc_se, prc_sw, scale_prc::prc_universal_comm_world, scale_prc::prc_universal_ismaster, scale_prc::prc_universal_myrank, scale_prc::prc_universal_nprocs, and prc_w.

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

68  use scale_prc, only: &
69  prc_abort, &
71  prc_mpi_alive, &
82  prc_nprocs, &
83  prc_myrank, &
85  implicit none
86 
87  logical :: prc_cart_reorder = .false.
88 
89  namelist / param_prc_cartesc / &
90  prc_num_x, &
91  prc_num_y, &
94  prc_cart_reorder
95 
96  logical :: period (2)
97  integer :: divide (2)
98  integer :: coords_w (2)
99  integer :: coords_n (2)
100  integer :: coords_e (2)
101  integer :: coords_s (2)
102  integer :: next_coords(2)
103  integer :: iptbl
104  integer :: next(8)
105 
106  integer :: ierr
107  integer :: p
108  !---------------------------------------------------------------------------
109 
110  log_newline
111  log_info("PRC_CARTESC_setup",*) 'Setup'
112 
113  if ( io_l ) then
114  log_newline
115  log_progress(*) 'start MPI'
116  log_newline
117  log_info("PRC_CARTESC_setup",*) 'Process information '
118  log_info_cont('(1x,A,I12)') 'UNIVERSAL_COMM_WORLD : ', prc_universal_comm_world
119  log_info_cont('(1x,A,I12)') 'total process [UNIVERSAL] : ', prc_universal_nprocs
120  log_info_cont('(1x,A,I12)') 'my process ID [UNIVERSAL] : ', prc_universal_myrank
121  log_info_cont('(1x,A,L12)') 'master rank? [UNIVERSAL] : ', prc_universal_ismaster
122  log_info_cont('(1x,A,I12)') 'GLOBAL_COMM_WORLD : ', prc_global_comm_world
123  log_info_cont('(1x,A,I12)') 'total process [GLOBAL] : ', prc_global_nprocs
124  log_info_cont('(1x,A,I12)') 'my process ID [GLOBAL] : ', prc_global_myrank
125  log_info_cont('(1x,A,L12)') 'master rank? [GLOBAL] : ', prc_global_ismaster
126  log_info_cont('(1x,A,I12)') 'LOCAL_COMM_WORLD : ', prc_local_comm_world
127  log_info_cont('(1x,A,I12)') 'total process [LOCAL] : ', prc_nprocs
128  log_info_cont('(1x,A,I12)') 'my process ID [LOCAL] : ', prc_myrank
129  log_info_cont('(1x,A,L12)') 'master rank? [LOCAL] : ', prc_ismaster
130  log_info_cont('(1x,A,I12)') 'ABORT_COMM_WORLD : ', prc_abort_comm_world
131  log_info_cont('(1x,A,I12)') 'master rank ID [each world] : ', prc_masterrank
132  endif
133 
134  !--- read namelist
135  rewind(io_fid_conf)
136  read(io_fid_conf,nml=param_prc_cartesc,iostat=ierr)
137  if( ierr < 0 ) then !--- missing
138  log_info("PRC_CARTESC_setup",*) 'Not found namelist. Default used.'
139  elseif( ierr > 0 ) then !--- fatal error
140  log_error("PRC_CARTESC_setup",*) 'Not appropriate names in namelist PARAM_PRC_CARTESC. Check!'
141  call prc_abort
142  endif
143  if( io_nml ) write(io_fid_nml,nml=param_prc_cartesc)
144 
145  log_newline
146  log_info("PRC_CARTESC_setup",*) 'Process allocation '
147  log_info_cont(*) 'No. of Node :', prc_num_x," x ",prc_num_y
148 
149  if ( prc_num_x*prc_num_y /= prc_nprocs ) then
150  log_error("PRC_CARTESC_setup",*) 'total number of node does not match that requested. Check!'
151  call prc_abort
152  endif
153 
154  if ( mod(prc_nprocs,prc_num_x) /= 0 ) then
155  log_error("PRC_CARTESC_setup",*) 'number of requested node cannot devide to 2D. Check!'
156  call prc_abort
157  endif
158 
159  ! set communication topology
160  allocate( prc_2drank(-1:prc_nprocs-1,2) )
161  prc_2drank(:,:) = -1
162 
163  do p = 0, prc_nprocs-1
164  prc_2drank(p,1) = mod(p,prc_num_x)
165  prc_2drank(p,2) = (p-prc_2drank(p,1)) / prc_num_x
166  enddo
167 
168  divide(1) = prc_num_y
169  divide(2) = prc_num_x
170  period(1) = prc_periodic_y
171  period(2) = prc_periodic_x
172  if ( prc_mpi_alive ) then
173  call mpi_cart_create(prc_local_comm_world,2,divide,period,prc_cart_reorder,iptbl,ierr)
174  call mpi_cart_shift(iptbl,0,1,prc_next(prc_s),prc_next(prc_n),ierr) ! next rank search Down/Up
175  call mpi_cart_shift(iptbl,1,1,prc_next(prc_w),prc_next(prc_e),ierr) ! next rank search Left/Right
176 
177  ! get neighbor_coordinates
178  prc_has_w = prc_next(prc_w) /= mpi_proc_null
179  if( prc_has_w ) call mpi_cart_coords(iptbl,prc_next(prc_w),2,coords_w,ierr)
180  prc_has_n = prc_next(prc_n) /= mpi_proc_null
181  if( prc_has_n ) call mpi_cart_coords(iptbl,prc_next(prc_n),2,coords_n,ierr)
182  prc_has_e = prc_next(prc_e) /= mpi_proc_null
183  if( prc_has_e ) call mpi_cart_coords(iptbl,prc_next(prc_e),2,coords_e,ierr)
184  prc_has_s = prc_next(prc_s) /= mpi_proc_null
185  if( prc_has_s ) call mpi_cart_coords(iptbl,prc_next(prc_s),2,coords_s,ierr)
186  ! next rank search NorthWest
187  if ( .NOT. prc_has_n &
188  .OR. .NOT. prc_has_w ) then
189  prc_next(prc_nw) = mpi_proc_null
190  else
191  next_coords(1) = coords_n(1)
192  next_coords(2) = coords_w(2)
193  call mpi_cart_rank(iptbl, next_coords, prc_next(prc_nw), ierr)
194  endif
195  ! next rank search NorthEast
196  if ( .NOT. prc_has_n &
197  .OR. .NOT. prc_has_e ) then
198  prc_next(prc_ne) = mpi_proc_null
199  else
200  next_coords(1) = coords_n(1)
201  next_coords(2) = coords_e(2)
202  call mpi_cart_rank(iptbl, next_coords, prc_next(prc_ne), ierr)
203  endif
204  ! next rank search SouthWest
205  if ( .NOT. prc_has_s &
206  .OR. .NOT. prc_has_w ) then
207  prc_next(prc_sw) = mpi_proc_null
208  else
209  next_coords(1) = coords_s(1)
210  next_coords(2) = coords_w(2)
211  call mpi_cart_rank(iptbl, next_coords, prc_next(prc_sw), ierr)
212  endif
213  ! next rank search SouthEast
214  if ( .NOT. prc_has_s &
215  .OR. .NOT. prc_has_e ) then
216  prc_next(prc_se) = mpi_proc_null
217  else
218  next_coords(1) = coords_s(1)
219  next_coords(2) = coords_e(2)
220  call mpi_cart_rank(iptbl, next_coords, prc_next(prc_se), ierr)
221  endif
222  call mpi_comm_free(iptbl,ierr)
223  endif
224 
225  next(:) = max(prc_next(:),-1) ! avoid if MPI_PROC_NULL < -1
226 
227  log_info("PRC_CARTESC_setup",*) 'Node topology :'
228  log_info_cont('(1x,A,I5,A,I5,A,I5,A,A,I5,A,I5,A,I5,A,A,I5,A,I5,A,I5,A)') &
229  'NW(',next(prc_nw),',',prc_2drank(next(prc_nw),1),',',prc_2drank(next(prc_nw),2),')', &
230  ' - N(',next(prc_n) ,',',prc_2drank(next(prc_n) ,1),',',prc_2drank(next(prc_n) ,2),')', &
231  ' - NE(',next(prc_ne),',',prc_2drank(next(prc_ne),1),',',prc_2drank(next(prc_ne),2),')'
232  log_info_cont('(1x,A)') ' | | |'
233  log_info_cont('(1x,A,I5,A,I5,A,I5,A,A,I5,A,I5,A,I5,A,A,I5,A,I5,A,I5,A)') &
234  ' W(',next(prc_w),',',prc_2drank(next(prc_w),1),',',prc_2drank(next(prc_w),2),')', &
235  ' - P(',prc_myrank ,',',prc_2drank(prc_myrank, 1),',',prc_2drank(prc_myrank, 2),')', &
236  ' - E(',next(prc_e),',',prc_2drank(next(prc_e),1),',',prc_2drank(next(prc_e),2),')'
237  log_info_cont('(1x,A)') ' | | |'
238  log_info_cont('(1x,A,I5,A,I5,A,I5,A,A,I5,A,I5,A,I5,A,A,I5,A,I5,A,I5,A)') &
239  'SW(',next(prc_sw),',',prc_2drank(next(prc_sw),1),',',prc_2drank(next(prc_sw),2),')', &
240  ' - S(',next(prc_s) ,',',prc_2drank(next(prc_s) ,1),',',prc_2drank(next(prc_s) ,2),')', &
241  ' - SE(',next(prc_se),',',prc_2drank(next(prc_se),1),',',prc_2drank(next(prc_se),2),')'
242 
243  return
integer, public prc_universal_nprocs
process num in universal communicator
Definition: scale_prc.F90:72
logical, public prc_global_ismaster
master process in global communicator?
Definition: scale_prc.F90:81
integer, public io_fid_nml
Log file ID (only for output namelist)
Definition: scale_io.F90:57
integer, public prc_global_myrank
myrank in global communicator
Definition: scale_prc.F90:79
integer, public io_fid_conf
Config file ID.
Definition: scale_io.F90:55
logical, public prc_mpi_alive
MPI is alive?
Definition: scale_prc.F90:93
logical, public prc_has_s
logical, public prc_periodic_y
periodic condition or not (Y)?
integer, public prc_universal_comm_world
original communicator
Definition: scale_prc.F90:70
integer, public prc_nprocs
myrank in local communicator
Definition: scale_prc.F90:88
integer, public prc_universal_myrank
myrank in universal communicator
Definition: scale_prc.F90:71
logical, public prc_periodic_x
periodic condition or not (X)?
logical, public io_l
output log or not? (this process)
Definition: scale_io.F90:61
module PROCESS
Definition: scale_prc.F90:11
integer, parameter, public prc_masterrank
master process in each communicator
Definition: scale_prc.F90:65
integer, public prc_global_nprocs
process num in global communicator
Definition: scale_prc.F90:80
integer, public prc_myrank
process num in local communicator
Definition: scale_prc.F90:89
subroutine, public prc_abort
Abort Process.
Definition: scale_prc.F90:338
logical, public prc_ismaster
master process in local communicator?
Definition: scale_prc.F90:90
integer, public prc_global_comm_world
global communicator
Definition: scale_prc.F90:78
logical, public prc_universal_ismaster
master process in universal communicator?
Definition: scale_prc.F90:73
integer, public prc_local_comm_world
local communicator
Definition: scale_prc.F90:87
integer, public prc_abort_comm_world
communicator for aborting
Definition: scale_prc.F90:95
logical, public io_nml
output log or not? (for namelist, this process)
Definition: scale_io.F90:62
logical, public prc_has_w
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ prc_w

integer, parameter, public scale_prc_cartesc::prc_w = 1

[node direction] west

Definition at line 32 of file scale_prc_cartesC.F90.

Referenced by prc_cartesc_setup(), scale_comm_cartesc::vars8_2d_mpi(), scale_comm_cartesc::vars8_3d_mpi(), scale_comm_cartesc::vars_2d_mpi(), and scale_comm_cartesc::vars_init_mpi_pc().

32  integer, public, parameter :: prc_w = 1

◆ prc_n

integer, parameter, public scale_prc_cartesc::prc_n = 2

[node direction] north

Definition at line 33 of file scale_prc_cartesC.F90.

Referenced by prc_cartesc_setup(), scale_comm_cartesc::vars8_2d_mpi(), scale_comm_cartesc::vars8_3d_mpi(), scale_comm_cartesc::vars_2d_mpi(), and scale_comm_cartesc::vars_init_mpi_pc().

33  integer, public, parameter :: prc_n = 2

◆ prc_e

integer, parameter, public scale_prc_cartesc::prc_e = 3

[node direction] east

Definition at line 34 of file scale_prc_cartesC.F90.

Referenced by prc_cartesc_setup(), scale_comm_cartesc::vars8_2d_mpi(), scale_comm_cartesc::vars8_3d_mpi(), scale_comm_cartesc::vars_2d_mpi(), and scale_comm_cartesc::vars_init_mpi_pc().

34  integer, public, parameter :: prc_e = 3

◆ prc_s

integer, parameter, public scale_prc_cartesc::prc_s = 4

[node direction] south

Definition at line 35 of file scale_prc_cartesC.F90.

Referenced by prc_cartesc_setup(), scale_comm_cartesc::vars8_2d_mpi(), scale_comm_cartesc::vars8_3d_mpi(), scale_comm_cartesc::vars_2d_mpi(), and scale_comm_cartesc::vars_init_mpi_pc().

35  integer, public, parameter :: prc_s = 4

◆ prc_nw

integer, parameter, public scale_prc_cartesc::prc_nw = 5

[node direction] northwest

Definition at line 36 of file scale_prc_cartesC.F90.

Referenced by prc_cartesc_setup(), scale_comm_cartesc::vars8_2d_mpi(), scale_comm_cartesc::vars8_3d_mpi(), and scale_comm_cartesc::vars_init_mpi_pc().

36  integer, public, parameter :: prc_nw = 5

◆ prc_ne

integer, parameter, public scale_prc_cartesc::prc_ne = 6

[node direction] northeast

Definition at line 37 of file scale_prc_cartesC.F90.

Referenced by prc_cartesc_setup(), scale_comm_cartesc::vars8_2d_mpi(), scale_comm_cartesc::vars8_3d_mpi(), and scale_comm_cartesc::vars_init_mpi_pc().

37  integer, public, parameter :: prc_ne = 6

◆ prc_sw

integer, parameter, public scale_prc_cartesc::prc_sw = 7

[node direction] southwest

Definition at line 38 of file scale_prc_cartesC.F90.

Referenced by prc_cartesc_setup(), scale_comm_cartesc::vars8_2d_mpi(), scale_comm_cartesc::vars8_3d_mpi(), and scale_comm_cartesc::vars_init_mpi_pc().

38  integer, public, parameter :: prc_sw = 7

◆ prc_se

integer, parameter, public scale_prc_cartesc::prc_se = 8

[node direction] southeast

Definition at line 39 of file scale_prc_cartesC.F90.

Referenced by prc_cartesc_setup(), scale_comm_cartesc::vars8_2d_mpi(), scale_comm_cartesc::vars8_3d_mpi(), and scale_comm_cartesc::vars_init_mpi_pc().

39  integer, public, parameter :: prc_se = 8

◆ prc_num_x

integer, public scale_prc_cartesc::prc_num_x = 1

◆ prc_num_y

integer, public scale_prc_cartesc::prc_num_y = 1

◆ prc_2drank

integer, dimension(:,:), allocatable, public scale_prc_cartesc::prc_2drank

◆ prc_next

integer, dimension(8), public scale_prc_cartesc::prc_next = -1

node ID of 8 neighbour process

Definition at line 45 of file scale_prc_cartesC.F90.

Referenced by prc_cartesc_setup(), scale_comm_cartesc::vars8_2d_mpi(), scale_comm_cartesc::vars8_3d_mpi(), scale_comm_cartesc::vars_2d_mpi(), and scale_comm_cartesc::vars_init_mpi_pc().

45  integer, public :: prc_next(8) = -1

◆ prc_has_w

logical, public scale_prc_cartesc::prc_has_w

◆ prc_has_n

logical, public scale_prc_cartesc::prc_has_n

◆ prc_has_e

logical, public scale_prc_cartesc::prc_has_e

◆ prc_has_s

logical, public scale_prc_cartesc::prc_has_s

◆ prc_periodic_x

logical, public scale_prc_cartesc::prc_periodic_x = .true.

◆ prc_periodic_y

logical, public scale_prc_cartesc::prc_periodic_y = .true.