SCALE-RM
Functions/Subroutines | Variables
scale_rm_process Module Reference

module RM PROCESS More...

Functions/Subroutines

subroutine, public prc_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
 

Detailed Description

module RM PROCESS

Description
MPI process management module for regional model
Author
Team SCALE

Function/Subroutine Documentation

◆ prc_setup()

subroutine, public scale_rm_process::prc_setup ( )

Setup Processor topology.

Definition at line 67 of file scale_rm_process.F90.

References scale_stdio::io_fid_conf, scale_stdio::io_fid_log, scale_stdio::io_l, scale_stdio::io_lnml, prc_2drank, scale_process::prc_abort_comm_world, prc_e, scale_process::prc_global_comm_world, scale_process::prc_global_ismaster, scale_process::prc_global_myrank, scale_process::prc_global_nprocs, prc_has_e, prc_has_n, prc_has_s, prc_has_w, scale_process::prc_ismaster, scale_process::prc_local_comm_world, scale_process::prc_masterrank, scale_process::prc_mpi_alive, scale_process::prc_mpistop(), scale_process::prc_myrank, prc_n, prc_ne, prc_next, scale_process::prc_nprocs, prc_num_x, prc_num_y, prc_nw, prc_s, prc_se, prc_sw, scale_process::prc_universal_comm_world, scale_process::prc_universal_ismaster, scale_process::prc_universal_myrank, scale_process::prc_universal_nprocs, and prc_w.

Referenced by mod_rm_driver::scalerm(), and mod_rm_prep::scalerm_prep().

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

Variable Documentation

◆ prc_w

integer, parameter, public scale_rm_process::prc_w = 1

[node direction] west

Definition at line 34 of file scale_rm_process.F90.

Referenced by scale_comm::comm_setup(), prc_setup(), scale_comm::vars8_2d_mpi(), scale_comm::vars8_3d_mpi(), scale_comm::vars_2d_mpi(), and scale_comm::vars_init_mpi_pc().

34  integer, public, parameter :: prc_w = 1

◆ prc_n

integer, parameter, public scale_rm_process::prc_n = 2

[node direction] north

Definition at line 35 of file scale_rm_process.F90.

Referenced by scale_comm::comm_setup(), prc_setup(), scale_comm::vars8_2d_mpi(), scale_comm::vars8_3d_mpi(), scale_comm::vars_2d_mpi(), and scale_comm::vars_init_mpi_pc().

35  integer, public, parameter :: prc_n = 2

◆ prc_e

integer, parameter, public scale_rm_process::prc_e = 3

[node direction] east

Definition at line 36 of file scale_rm_process.F90.

Referenced by scale_comm::comm_setup(), prc_setup(), scale_comm::vars8_2d_mpi(), scale_comm::vars8_3d_mpi(), scale_comm::vars_2d_mpi(), and scale_comm::vars_init_mpi_pc().

36  integer, public, parameter :: prc_e = 3

◆ prc_s

integer, parameter, public scale_rm_process::prc_s = 4

[node direction] south

Definition at line 37 of file scale_rm_process.F90.

Referenced by scale_comm::comm_setup(), prc_setup(), scale_comm::vars8_2d_mpi(), scale_comm::vars8_3d_mpi(), scale_comm::vars_2d_mpi(), and scale_comm::vars_init_mpi_pc().

37  integer, public, parameter :: prc_s = 4

◆ prc_nw

integer, parameter, public scale_rm_process::prc_nw = 5

[node direction] northwest

Definition at line 38 of file scale_rm_process.F90.

Referenced by prc_setup(), scale_comm::vars8_2d_mpi(), scale_comm::vars8_3d_mpi(), and scale_comm::vars_init_mpi_pc().

38  integer, public, parameter :: prc_nw = 5

◆ prc_ne

integer, parameter, public scale_rm_process::prc_ne = 6

[node direction] northeast

Definition at line 39 of file scale_rm_process.F90.

Referenced by prc_setup(), scale_comm::vars8_2d_mpi(), scale_comm::vars8_3d_mpi(), and scale_comm::vars_init_mpi_pc().

39  integer, public, parameter :: prc_ne = 6

◆ prc_sw

integer, parameter, public scale_rm_process::prc_sw = 7

[node direction] southwest

Definition at line 40 of file scale_rm_process.F90.

Referenced by prc_setup(), scale_comm::vars8_2d_mpi(), scale_comm::vars8_3d_mpi(), and scale_comm::vars_init_mpi_pc().

40  integer, public, parameter :: prc_sw = 7

◆ prc_se

integer, parameter, public scale_rm_process::prc_se = 8

[node direction] southeast

Definition at line 41 of file scale_rm_process.F90.

Referenced by prc_setup(), scale_comm::vars8_2d_mpi(), scale_comm::vars8_3d_mpi(), and scale_comm::vars_init_mpi_pc().

41  integer, public, parameter :: prc_se = 8

◆ prc_num_x

integer, public scale_rm_process::prc_num_x = 1

◆ prc_num_y

integer, public scale_rm_process::prc_num_y = 1

y length of 2D processor topology

Definition at line 44 of file scale_rm_process.F90.

Referenced by mod_copytopo::copytopo(), scale_grid::grid_allocate(), scale_grid::grid_generate(), scale_grid_index::grid_index_setup(), scale_grid_nest::nest_domain_shape(), and prc_setup().

44  integer, public :: prc_num_y = 1

◆ prc_2drank

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

◆ prc_next

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

node ID of 8 neighbour process

Definition at line 47 of file scale_rm_process.F90.

Referenced by scale_comm::comm_setup(), prc_setup(), scale_comm::vars8_2d_mpi(), scale_comm::vars8_3d_mpi(), scale_comm::vars_2d_mpi(), and scale_comm::vars_init_mpi_pc().

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

◆ prc_has_w

logical, public scale_rm_process::prc_has_w

◆ prc_has_n

logical, public scale_rm_process::prc_has_n

◆ prc_has_e

logical, public scale_rm_process::prc_has_e

◆ prc_has_s

logical, public scale_rm_process::prc_has_s