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...
 
logical, public prc_twod = .false.
 2D experiment 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 70 of file scale_prc_cartesC.F90.

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

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().

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.

32  integer, public, parameter :: PRC_W = 1

Referenced by scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_f2013(), scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_mg2001(), and prc_cartesc_setup().

◆ prc_n

integer, parameter, public scale_prc_cartesc::prc_n = 2

[node direction] north

Definition at line 33 of file scale_prc_cartesC.F90.

33  integer, public, parameter :: PRC_N = 2

Referenced by scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_f2013(), scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_mg2001(), and prc_cartesc_setup().

◆ prc_e

integer, parameter, public scale_prc_cartesc::prc_e = 3

[node direction] east

Definition at line 34 of file scale_prc_cartesC.F90.

34  integer, public, parameter :: PRC_E = 3

Referenced by scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_f2013(), scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_mg2001(), and prc_cartesc_setup().

◆ prc_s

integer, parameter, public scale_prc_cartesc::prc_s = 4

[node direction] south

Definition at line 35 of file scale_prc_cartesC.F90.

35  integer, public, parameter :: PRC_S = 4

Referenced by scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_f2013(), scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_mg2001(), and prc_cartesc_setup().

◆ prc_nw

integer, parameter, public scale_prc_cartesc::prc_nw = 5

[node direction] northwest

Definition at line 36 of file scale_prc_cartesC.F90.

36  integer, public, parameter :: PRC_NW = 5

Referenced by scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_f2013(), scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_mg2001(), and prc_cartesc_setup().

◆ prc_ne

integer, parameter, public scale_prc_cartesc::prc_ne = 6

[node direction] northeast

Definition at line 37 of file scale_prc_cartesC.F90.

37  integer, public, parameter :: PRC_NE = 6

Referenced by scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_f2013(), scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_mg2001(), and prc_cartesc_setup().

◆ prc_sw

integer, parameter, public scale_prc_cartesc::prc_sw = 7

[node direction] southwest

Definition at line 38 of file scale_prc_cartesC.F90.

38  integer, public, parameter :: PRC_SW = 7

Referenced by scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_f2013(), scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_mg2001(), and prc_cartesc_setup().

◆ prc_se

integer, parameter, public scale_prc_cartesc::prc_se = 8

[node direction] southeast

Definition at line 39 of file scale_prc_cartesC.F90.

39  integer, public, parameter :: PRC_SE = 8

Referenced by scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_f2013(), scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_mg2001(), and prc_cartesc_setup().

◆ 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.

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

Referenced by scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_f2013(), scale_atmos_phy_lt_sato2019::atmos_phy_lt_neutralization_mg2001(), and prc_cartesc_setup().

◆ 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.

◆ prc_twod

logical, public scale_prc_cartesc::prc_twod = .false.

2D experiment

Definition at line 55 of file scale_prc_cartesC.F90.

55  logical, public :: PRC_TwoD = .false.

Referenced by scale_atmos_diagnostic_cartesc::atmos_diagnostic_cartesc_get_vel(), scale_atmos_dyn::atmos_dyn(), mod_atmos_dyn_driver::atmos_dyn_driver(), scale_atmos_dyn_fvm_flux::atmos_dyn_fvm_flux_setup(), scale_atmos_dyn_fvm_numfilter::atmos_dyn_fvm_numfilter_setup(), scale_atmos_dyn::atmos_dyn_setup(), scale_atmos_dyn_tstep_large_fvm_heve::atmos_dyn_tstep_large_fvm_heve_setup(), scale_atmos_grid_cartesc_index::atmos_grid_cartesc_index_setup(), scale_atmos_grid_cartesc_index::atmos_grid_cartesc_index_setup_main(), scale_atmos_grid_cartesc_metric::atmos_grid_cartesc_metric_rotcoef(), scale_atmos_grid_cartesc_metric::atmos_grid_cartesc_metric_setup(), scale_atmos_grid_cartesc_real::atmos_grid_cartesc_real_calc_areavol(), mod_atmos_vars::atmos_vars_check(), mod_atmos_vars::atmos_vars_get_diagnostic_3d(), scale_comm_cartesc::copy_boundary_2d(), scale_file_cartesc::file_cartesc_def_var(), scale_file_history_cartesc::file_history_cartesc_setup(), scale_file_history_cartesc::file_history_cartesc_truncate_3d(), scale_mapprojection::mapprojection_setup(), scale_monitor_cartesc::monitor_cartesc_setup(), scale_comm_cartesc::pack_3d(), scale_topography::topography_calc_tan_slope(), scale_comm_cartesc::vars8_2d_mpi(), scale_comm_cartesc::vars8_3d_mpi(), scale_comm_cartesc::vars8_init_mpi_pc(), scale_comm_cartesc::vars_2d_mpi(), scale_comm_cartesc::vars_3d_mpi(), scale_comm_cartesc::vars_3d_mpi_pc(), scale_comm_cartesc::vars_init_mpi_pc(), scale_comm_cartesc::wait_2d_mpi(), scale_comm_cartesc::wait_3d_mpi(), and scale_comm_cartesc::wait_3d_mpi_pc().

scale_prc::prc_abort
subroutine, public prc_abort
Abort Process.
Definition: scale_prc.F90:342
scale_prc
module PROCESS
Definition: scale_prc.F90:11