44 use scale_prc,
only: &
52 prc_universal_setup, &
56 use scale_fpm,
only: &
64 logical,
intent(in) :: execute_preprocess
65 logical,
intent(in) :: execute_model
67 integer :: num_bulkjob = 1
68 integer :: num_bulkjob_once = 1
69 integer :: num_iteration_bulk = 1
70 integer :: bulkjob_start_dirnum = 0
71 logical :: add_bulkjob_path = .false.
72 integer :: num_domain = 1
73 integer :: num_fail_tolerance = 1
74 integer :: freq_fail_check = 5
75 integer :: prc_domains(prc_domain_nlim) = 0
76 character(len=H_LONG) :: conf_files (prc_domain_nlim) =
""
77 logical :: abort_all_jobs = .false.
78 logical :: log_split = .false.
79 logical :: color_reorder = .true.
80 logical :: failure_prc_manage = .false.
82 namelist / param_launcher / &
87 bulkjob_start_dirnum, &
99 integer :: universal_comm
100 integer :: universal_nprocs
101 integer :: universal_myrank
102 logical :: universal_master
103 character(len=H_LONG) :: universal_cnf_fname
105 integer :: global_comm
106 integer :: global_nprocs
107 integer :: prc_bulkjob(prc_domain_nlim) = 0
108 integer :: id_bulkjob
110 logical :: use_fpm = .false.
112 integer :: local_comm
114 integer :: intercomm_parent
115 integer :: intercomm_child
116 character(len=5) :: path
123 call prc_mpistart( universal_comm )
125 call prc_universal_setup( universal_comm, &
130 if( universal_master )
write(*,*)
'*** Start Launch System for SCALE-DG'
134 universal_cnf_fname = io_arg_getfname( universal_master )
136 fid = io_cnf_open( universal_cnf_fname, &
140 conf_files(1) = universal_cnf_fname
144 read(fid,nml=param_launcher,iostat=ierr)
147 elseif( ierr > 0 )
then
148 if( universal_master )
write(*,*)
'xxx Not appropriate names in namelist PARAM_LAUNCHER. Check!'
154 if ( execute_preprocess &
155 .OR. execute_model )
then
156 if( universal_master )
write(*,*)
"*** Execute preprocess? : ", execute_preprocess
157 if( universal_master )
write(*,*)
"*** Execute model? : ", execute_model
159 if( universal_master )
write(*,*)
'xxx No execution. please check PARAM_LAUNCHER. STOP'
165 global_nprocs = universal_nprocs
166 if ( num_bulkjob > 1 )
then
168 if ( num_bulkjob == 1 ) num_iteration_bulk = 1
169 num_bulkjob_once = ceiling( real(num_bulkjob) / num_iteration_bulk )
170 if ( mod(universal_nprocs,num_bulkjob_once) /= 0 )
then
171 if( universal_master )
write(*,*)
'xxx Total Num of Processes must be divisible by NUM_BULKJOB/NUM_ITERATION_BULK. Check!'
172 if( universal_master )
write(*,*)
'xxx Total Num of Processes = ', universal_nprocs
173 if( universal_master )
write(*,*)
'xxx NUM_BULKJOB = ', num_bulkjob
174 if( universal_master )
write(*,*)
'xxx NUM_ITERATION_BULK = ', num_iteration_bulk
175 if( universal_master )
write(*,*)
'xxx NUM_BULKJOB / NUM_ITERATION_BULK = ', num_bulkjob_once
179 global_nprocs = universal_nprocs / num_bulkjob_once
181 if( universal_master )
write(*,
'(1x,A,I5)')
"*** TOTAL # of BULK JOBS = ", num_bulkjob
182 if( universal_master )
write(*,
'(1x,A,I5)')
"*** # of BULK JOB for each iteration = ", num_bulkjob_once
183 if( universal_master )
write(*,
'(1x,A,I5)')
"*** Total # of PROCESS = ", universal_nprocs
184 if( universal_master )
write(*,
'(1x,A,I5)')
"*** # of PROCESS of each JOB = ", global_nprocs
186 if ( bulkjob_start_dirnum < 0 )
then
187 if( universal_master )
write(*,*)
'xxx BULKJOB_START_DIRNUM must >=0'
190 if ( bulkjob_start_dirnum + num_bulkjob -1 > 9999 )
then
191 if( universal_master )
write(*,*)
'xxx BULKJOB_START_DIRNUM + NUM_BULKJOB must <= 9999'
195 if ( failure_prc_manage )
then
196 if( universal_master )
write(*,
'(1x,A)')
"*** Available: Failure Process Management"
198 if ( num_fail_tolerance <= 0 )
then
199 if( universal_master )
write(*,*)
'xxx Num of Failure Processes must be positive number. Check!'
200 if( universal_master )
write(*,*)
'xxx NUM_FAIL_TOLERANCE = ', num_fail_tolerance
204 if ( num_fail_tolerance > num_bulkjob )
then
205 write(*,*)
'xxx NUM_FAIL_TOLERANCE is bigger than # of NUM_BLUKJOB'
206 write(*,*)
' set to be: NUM_FAIL_TOLERANCE <= NUM_BLUKJOB'
210 if ( num_domain > 1 )
then
211 if ( freq_fail_check >= 1 .or. num_fail_tolerance /= num_bulkjob )
then
212 write(*,*)
'xxx Full function of FPM is not available with online nesting.'
213 write(*,*)
' You can use this only to avoid job stop until all members finish.'
214 write(*,*)
' for this purpose, set: FREQ_FAIL_CHECK = 0'
215 write(*,*)
' NUM_FAIL_TOLERANCE == NUM_BULKJOB'
221 prc_bulkjob(1:num_bulkjob) = global_nprocs
224 call prc_mpisplit_bulk( universal_comm, &
231 call prc_global_setup( abort_all_jobs, &
236 if ( num_domain > 1 )
then
237 if( universal_master )
write(*,
'(1x,A,I5)')
"*** TOTAL DOMAIN NUMBER = ", num_domain
238 if( universal_master )
write(*,
'(1x,A,L5)')
"*** Flag of ABORT ALL JOBS = ", abort_all_jobs
242 call prc_mpisplit_nest( global_comm, &
251 call fpm_init( num_fail_tolerance, &
260 call prc_errhandler_setup( use_fpm, universal_master )
264 do itr = 1, num_iteration_bulk
266 if ( id_bulkjob > num_bulkjob )
exit
268 if( universal_master .and. num_iteration_bulk > 1 )
then
270 write(*,*)
'*** BULK ITERATION COUNT : ', itr,
'/', num_iteration_bulk
274 call io_set_universalrank( universal_myrank, &
278 if ( num_bulkjob > 1 )
then
279 write(path,
'(I4.4,A)') id_bulkjob + bulkjob_start_dirnum,
"/"
284 if ( execute_preprocess )
then
286 conf_files(id_domain), &
291 if ( execute_model )
then
293 conf_files(id_domain), &
298 id_bulkjob = id_bulkjob + num_bulkjob_once
305 if( universal_master )
write(*,*)
'*** End Launch System for SCALE-DG'