Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Sets up and terminates the global environment variables
10 : !> \par History
11 : !> - Merged with Quickstep MODULE start_program_run (17.01.2002,MK)
12 : !> - Compile information added (16.01.2002,MK)
13 : !> - Merged with MODULE cp2k_input, some rearrangements (30.10.2002,MK)
14 : !> - Update seed input (24.10.2016,MK)
15 : !> \author JGH,MK
16 : ! **************************************************************************************************
17 : MODULE environment
18 : USE bibliography, ONLY: Frigo2005,&
19 : Marek2014,&
20 : Solca2024,&
21 : cite_reference
22 : USE cp2k_info, ONLY: &
23 : compile_arch, compile_date, compile_host, compile_revision, cp2k_flags, cp2k_home, &
24 : cp2k_version, cp2k_year, get_runtime_info, r_host_name, r_pid, r_user_name
25 : USE cp_error_handling, ONLY: warning_counter
26 : USE cp_files, ONLY: close_file,&
27 : get_data_dir,&
28 : open_file
29 : USE cp_fm_cholesky, ONLY: FM_CHOLESKY_TYPE_DLAF,&
30 : FM_CHOLESKY_TYPE_SCALAPACK,&
31 : cholesky_type,&
32 : dlaf_cholesky_n_min
33 : USE cp_fm_diag, ONLY: FM_DIAG_TYPE_CUSOLVER,&
34 : FM_DIAG_TYPE_DLAF,&
35 : FM_DIAG_TYPE_ELPA,&
36 : FM_DIAG_TYPE_SCALAPACK,&
37 : diag_finalize,&
38 : diag_init,&
39 : eps_check_diag_default
40 : USE cp_fm_diag_utils, ONLY: cp_fm_redistribute_init
41 : USE cp_fm_struct, ONLY: cp_fm_struct_config
42 : USE cp_fm_types, ONLY: cp_fm_get_mm_type,&
43 : cp_fm_setup
44 : USE cp_log_handling, ONLY: &
45 : cp_add_default_logger, cp_get_default_logger, cp_logger_create, &
46 : cp_logger_get_default_unit_nr, cp_logger_release, cp_logger_set, cp_logger_type, &
47 : cp_rm_default_logger, cp_to_string
48 : USE cp_output_handling, ONLY: cp_mpi_io_set,&
49 : cp_print_key_finished_output,&
50 : cp_print_key_unit_nr,&
51 : debug_print_level,&
52 : high_print_level,&
53 : low_print_level,&
54 : medium_print_level,&
55 : silent_print_level
56 : USE fft_tools, ONLY: FWFFT,&
57 : fft3d,&
58 : finalize_fft,&
59 : init_fft
60 : USE force_env_types, ONLY: multiple_fe_list
61 : USE gamma, ONLY: deallocate_md_ftable
62 : USE global_types, ONLY: global_environment_type
63 : USE grid_api, ONLY: GRID_BACKEND_AUTO,&
64 : GRID_BACKEND_CPU,&
65 : GRID_BACKEND_DGEMM,&
66 : GRID_BACKEND_GPU,&
67 : GRID_BACKEND_HIP,&
68 : GRID_BACKEND_REF
69 : USE header, ONLY: cp2k_footer,&
70 : cp2k_header
71 : USE input_constants, ONLY: &
72 : callgraph_all, callgraph_none, do_cosma, do_cp2k, do_dgemm_blas, do_dgemm_spla, do_eip, &
73 : do_farming, do_fft_fftw3, do_fft_sg, do_fist, do_qs, do_scalapack, do_sirius, do_test, &
74 : energy_run, mol_dyn_run, none_run
75 : USE input_cp2k_global, ONLY: create_global_section
76 : USE input_enumeration_types, ONLY: enum_i2c,&
77 : enumeration_type
78 : USE input_keyword_types, ONLY: keyword_get,&
79 : keyword_type
80 : USE input_section_types, ONLY: &
81 : section_get_ival, section_get_keyword, section_get_lval, section_get_rval, &
82 : section_release, section_type, section_vals_get, section_vals_get_subs_vals, &
83 : section_vals_get_subs_vals3, section_vals_type, section_vals_val_get, section_vals_val_set
84 : USE kinds, ONLY: default_path_length,&
85 : default_string_length,&
86 : dp,&
87 : int_8,&
88 : print_kind_info
89 : USE local_gemm_api, ONLY: local_gemm_set_library
90 : USE machine, ONLY: &
91 : flush_should_flush, m_cpuid, m_cpuid_name, m_cpuid_static, m_cpuid_vlen, m_cpuinfo, &
92 : m_energy, m_memory_details, m_omp_get_stacksize, m_omp_trace_issues, m_procrun
93 : USE message_passing, ONLY: mp_collect_timings,&
94 : mp_para_env_type
95 : USE mp_perf_env, ONLY: add_mp_perf_env,&
96 : describe_mp_perf_env,&
97 : rm_mp_perf_env
98 : USE orbital_pointers, ONLY: deallocate_orbital_pointers,&
99 : init_orbital_pointers
100 : USE orbital_transformation_matrices, ONLY: deallocate_spherical_harmonics,&
101 : init_spherical_harmonics
102 : USE parallel_rng_types, ONLY: GAUSSIAN,&
103 : check_rng,&
104 : rng_stream_type,&
105 : write_rng_matrices
106 : USE physcon, ONLY: write_physcon
107 : USE reference_manager, ONLY: collect_citations_from_ranks,&
108 : print_cited_references
109 : USE string_utilities, ONLY: ascii_to_string,&
110 : integer_to_string,&
111 : string_to_ascii
112 : USE timings, ONLY: add_timer_env,&
113 : global_timings_level,&
114 : rm_timer_env,&
115 : root_cp2k_name,&
116 : timings_setup_tracing
117 : USE timings_report, ONLY: cost_type_energy,&
118 : cost_type_time,&
119 : timings_report_callgraph,&
120 : timings_report_print
121 : USE voronoi_interface, ONLY: finalize_libvori
122 :
123 : !$ USE OMP_LIB, ONLY: omp_get_max_threads, omp_get_thread_num, omp_get_num_threads
124 : #include "./base/base_uses.f90"
125 :
126 : IMPLICIT NONE
127 :
128 : PRIVATE
129 :
130 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'environment'
131 :
132 : ! Public subroutines
133 :
134 : PUBLIC :: cp2k_finalize, cp2k_init, cp2k_read, cp2k_setup, cp2k_get_walltime
135 :
136 : CONTAINS
137 :
138 : ! **************************************************************************************************
139 : !> \brief Initializes a CP2K run (setting of the global environment variables)
140 : !> \param para_env ...
141 : !> \param output_unit ...
142 : !> \param globenv ...
143 : !> \param input_file_name ...
144 : !> \param wdir ...
145 : !> \par History
146 : !> JGH (28.11.2001) : default for pp_library_path
147 : !> - print keys added (17.01.2002, MK)
148 : !> - merged with cp2k_input (30.10.2002,MK)
149 : !> \author JGH,MK
150 : ! **************************************************************************************************
151 9881 : SUBROUTINE cp2k_init(para_env, output_unit, globenv, input_file_name, wdir)
152 :
153 : TYPE(mp_para_env_type), POINTER :: para_env
154 : INTEGER :: output_unit
155 : TYPE(global_environment_type), POINTER :: globenv
156 : CHARACTER(LEN=*) :: input_file_name
157 : CHARACTER(LEN=*), OPTIONAL :: wdir
158 :
159 : CHARACTER(LEN=10*default_string_length) :: cp_flags
160 : INTEGER :: i, ilen, my_output_unit
161 : TYPE(cp_logger_type), POINTER :: logger
162 :
163 : ! create a timer_env
164 :
165 9881 : CALL add_timer_env()
166 :
167 : ! Message passing performance
168 9881 : CALL add_mp_perf_env()
169 :
170 : ! Init the default logger
171 9881 : IF (para_env%is_source()) THEN
172 5044 : my_output_unit = output_unit
173 : ELSE
174 4837 : my_output_unit = -1
175 : END IF
176 9881 : NULLIFY (logger)
177 : CALL cp_logger_create(logger, para_env=para_env, &
178 : default_global_unit_nr=output_unit, &
179 9881 : close_global_unit_on_dealloc=.FALSE.)
180 9881 : CALL cp_add_default_logger(logger)
181 9881 : CALL cp_logger_release(logger)
182 :
183 : ! Initialize timing
184 9881 : CALL timeset(root_cp2k_name, globenv%handle)
185 :
186 : ! Print header
187 10403 : CALL cp2k_header(my_output_unit, wdir)
188 :
189 9881 : IF (my_output_unit > 0) THEN
190 : WRITE (UNIT=my_output_unit, FMT="(/,T2,A,T31,A50)") &
191 5044 : "CP2K| version string: ", ADJUSTR(TRIM(cp2k_version))
192 : WRITE (UNIT=my_output_unit, FMT="(T2,A,T41,A40)") &
193 5044 : "CP2K| source code revision number:", &
194 10088 : ADJUSTR(compile_revision)
195 5044 : cp_flags = cp2k_flags()
196 5044 : ilen = LEN_TRIM(cp_flags)
197 : WRITE (UNIT=my_output_unit, FMT="(T2,A)") &
198 5044 : "CP2K| "//cp_flags(1:73)
199 5044 : IF (ilen > 73) THEN
200 20176 : DO i = 0, (ilen - 75)/61
201 : WRITE (UNIT=my_output_unit, FMT="(T2,A)") &
202 20176 : "CP2K| "//TRIM(cp_flags(74 + i*61:MIN(74 + (i + 1)*61, ilen)))
203 : END DO
204 : END IF
205 : WRITE (UNIT=my_output_unit, FMT="(T2,A,T41,A40)") &
206 5044 : "CP2K| is freely available from ", &
207 10088 : ADJUSTR(TRIM(cp2k_home))
208 : WRITE (UNIT=my_output_unit, FMT="(T2,A,T31,A50)") &
209 5044 : "CP2K| Program compiled at", &
210 10088 : ADJUSTR(compile_date(1:MIN(50, LEN(compile_date))))
211 : WRITE (UNIT=my_output_unit, FMT="(T2,A,T31,A50)") &
212 5044 : "CP2K| Program compiled on", &
213 10088 : ADJUSTR(compile_host(1:MIN(50, LEN(compile_host))))
214 : WRITE (UNIT=my_output_unit, FMT="(T2,A,T31,A50)") &
215 5044 : "CP2K| Program compiled for", &
216 10088 : ADJUSTR(compile_arch(1:MIN(50, LEN(compile_arch))))
217 : WRITE (UNIT=my_output_unit, FMT="(T2,A,T31,A50)") &
218 5044 : "CP2K| Data directory path", &
219 10088 : ADJUSTR(TRIM(get_data_dir()))
220 : WRITE (UNIT=my_output_unit, FMT="(T2,A,T31,A50)") &
221 5044 : "CP2K| Input file name", &
222 10088 : ADJUSTR(TRIM(input_file_name))
223 5044 : FLUSH (my_output_unit) ! ignore &GLOBAL / FLUSH_SHOULD_FLUSH
224 : END IF
225 :
226 : #if defined(__FAST_MATH__)
227 : CALL cp_warn(__LOCATION__, &
228 : "During compilation one of the following flags was active:"// &
229 : " `-ffast-math` (GCC)"// &
230 : " `-hfpN` (Cray, N > 0, default N=2)"// &
231 : " This can lead to wrong results and numerical instabilities"// &
232 : " and is therefore no longer supported.")
233 :
234 : #if !defined(__FORCE_USE_FAST_MATH)
235 : #error "-ffast-math (GCC) or -hfpN (N>0, Cray) can lead to wrong results and numerical instabilities and are therefore no longer supported"
236 : #endif
237 : #endif
238 :
239 : #if defined(NDEBUG)
240 : #error "Please do not build CP2K with NDEBUG. There is no performance advantage and asserts will save your neck."
241 : #endif
242 :
243 9881 : END SUBROUTINE cp2k_init
244 :
245 : ! **************************************************************************************************
246 : !> \brief echoes the list of host names and pids
247 : !> \param para_env ...
248 : !> \param output_unit ...
249 : ! **************************************************************************************************
250 2 : SUBROUTINE echo_all_hosts(para_env, output_unit)
251 : TYPE(mp_para_env_type), POINTER :: para_env
252 : INTEGER, INTENT(IN) :: output_unit
253 :
254 : CHARACTER(LEN=default_string_length) :: string
255 : INTEGER :: ipe
256 2 : INTEGER, ALLOCATABLE, DIMENSION(:) :: all_pid
257 : INTEGER, ALLOCATABLE, DIMENSION(:, :) :: all_host
258 :
259 : ! Print a list of all started processes
260 :
261 10 : ALLOCATE (all_pid(para_env%num_pe), SOURCE=0)
262 2 : all_pid(para_env%mepos + 1) = r_pid
263 :
264 2 : CALL para_env%sum(all_pid)
265 130 : ALLOCATE (all_host(30, para_env%num_pe), SOURCE=0)
266 :
267 2 : CALL string_to_ascii(r_host_name, all_host(:, para_env%mepos + 1))
268 2 : CALL para_env%sum(all_host)
269 2 : IF (output_unit > 0) THEN
270 1 : WRITE (UNIT=output_unit, FMT="(T2,A)") ""
271 3 : DO ipe = 1, para_env%num_pe
272 2 : CALL ascii_to_string(all_host(:, ipe), string)
273 : WRITE (UNIT=output_unit, FMT="(T2,A,T63,I8,T71,I10)") &
274 : TRIM(r_user_name)//"@"//TRIM(string)// &
275 3 : " has created rank and process ", ipe - 1, all_pid(ipe)
276 : END DO
277 : END IF
278 :
279 2 : DEALLOCATE (all_pid)
280 2 : DEALLOCATE (all_host)
281 :
282 2 : END SUBROUTINE echo_all_hosts
283 :
284 : ! **************************************************************************************************
285 : !> \brief echoes the list the number of process per host
286 : !> \param para_env ...
287 : !> \param output_unit ...
288 : !> \param node_count Count number of distributed systems (nodes)
289 : ! **************************************************************************************************
290 9881 : SUBROUTINE echo_all_process_host(para_env, output_unit, node_count)
291 : TYPE(mp_para_env_type), POINTER :: para_env
292 : INTEGER, INTENT(IN) :: output_unit
293 : INTEGER, INTENT(OUT), OPTIONAL :: node_count
294 :
295 : CHARACTER(LEN=default_string_length) :: string, string_sec
296 : INTEGER :: ipe, jpe, nr_dist, nr_occu
297 9881 : INTEGER, ALLOCATABLE, DIMENSION(:) :: all_pid
298 : INTEGER, ALLOCATABLE, DIMENSION(:, :) :: all_host
299 :
300 635848 : ALLOCATE (all_host(30, para_env%num_pe), SOURCE=0)
301 49198 : ALLOCATE (all_pid(para_env%num_pe), SOURCE=0)
302 :
303 9881 : IF (m_procrun(r_pid) == 1) THEN
304 9881 : CALL string_to_ascii(r_host_name, all_host(:, para_env%mepos + 1))
305 9881 : CALL para_env%sum(all_host)
306 : END IF
307 :
308 9881 : nr_dist = 0
309 9881 : IF (output_unit > 0) WRITE (UNIT=output_unit, FMT="(T2,A)") ""
310 29436 : DO ipe = 1, para_env%num_pe
311 19555 : nr_occu = 0
312 29436 : IF (all_pid(ipe) /= -1) THEN
313 9881 : CALL ascii_to_string(all_host(:, ipe), string)
314 29436 : DO jpe = 1, para_env%num_pe
315 19555 : CALL ascii_to_string(all_host(:, jpe), string_sec)
316 29436 : IF (string == string_sec) THEN
317 19555 : nr_occu = nr_occu + 1
318 19555 : all_pid(jpe) = -1
319 : END IF
320 : END DO
321 9881 : IF (output_unit > 0) THEN
322 : WRITE (UNIT=output_unit, FMT="(T2,A,T63,I8,A)") &
323 : TRIM(r_user_name)//"@"//TRIM(string)// &
324 1 : " is running ", nr_occu, " processes"
325 : END IF
326 9881 : nr_dist = nr_dist + 1
327 : END IF
328 : END DO
329 :
330 9881 : DEALLOCATE (all_pid)
331 9881 : DEALLOCATE (all_host)
332 :
333 9881 : CPASSERT(0 < nr_dist)
334 9881 : IF (PRESENT(node_count)) node_count = nr_dist
335 :
336 9881 : END SUBROUTINE echo_all_process_host
337 :
338 : ! **************************************************************************************************
339 : !> \brief read part of cp2k_init
340 : !> \param root_section ...
341 : !> \param para_env ...
342 : !> \param globenv the globenv
343 : !> \author fawzi
344 : !> \note
345 : !> The following routines need to be synchronized wrt. adding/removing
346 : !> of the default environments (logging, performance,error):
347 : !> environment:cp2k_init, environment:cp2k_finalize,
348 : !> f77_interface:f_env_add_defaults, f77_interface:f_env_rm_defaults,
349 : !> f77_interface:create_force_env, f77_interface:destroy_force_env
350 : ! **************************************************************************************************
351 9881 : SUBROUTINE cp2k_read(root_section, para_env, globenv)
352 :
353 : TYPE(section_vals_type), POINTER :: root_section
354 : TYPE(mp_para_env_type), POINTER :: para_env
355 : TYPE(global_environment_type), POINTER :: globenv
356 :
357 : CHARACTER(LEN=3*default_string_length) :: message
358 : CHARACTER(LEN=default_string_length) :: c_val
359 : INTEGER :: i, iw
360 : TYPE(cp_logger_type), POINTER :: logger
361 :
362 : ! Read the input/output section
363 :
364 9881 : logger => cp_get_default_logger()
365 :
366 : ! try to use better names for the local log if it is not too late
367 : CALL section_vals_val_get(root_section, "GLOBAL%OUTPUT_FILE_NAME", &
368 9881 : c_val=c_val)
369 9881 : IF (c_val /= "") THEN
370 : CALL cp_logger_set(logger, &
371 144 : local_filename=TRIM(c_val)//"_localLog")
372 : END IF
373 :
374 : ! Process project name
375 9881 : CALL section_vals_val_get(root_section, "GLOBAL%PROJECT", c_val=c_val)
376 9881 : IF (INDEX(c_val(:LEN_TRIM(c_val)), " ") > 0) THEN
377 : message = "Project name <"//TRIM(c_val)// &
378 2 : "> contains spaces which will be replaced with underscores"
379 2 : CPWARN(TRIM(message))
380 24 : DO i = 1, LEN_TRIM(c_val)
381 : ! Replace space with underscore
382 24 : IF (c_val(i:i) == " ") c_val(i:i) = "_"
383 : END DO
384 2 : CALL section_vals_val_set(root_section, "GLOBAL%PROJECT", c_val=TRIM(c_val))
385 : END IF
386 9881 : IF (c_val /= "") THEN
387 9881 : CALL cp_logger_set(logger, local_filename=TRIM(c_val)//"_localLog")
388 : END IF
389 9881 : logger%iter_info%project_name = c_val
390 :
391 9881 : CALL section_vals_val_get(root_section, "GLOBAL%PRINT_LEVEL", i_val=logger%iter_info%print_level)
392 :
393 : ! Read the CP2K section
394 9881 : CALL read_cp2k_section(root_section, para_env, globenv)
395 :
396 : iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%PRINT/BASIC_DATA_TYPES", &
397 9881 : extension=".Log")
398 9881 : IF (iw > 0) CALL print_kind_info(iw)
399 : CALL cp_print_key_finished_output(iw, logger, root_section, &
400 9881 : "GLOBAL%PRINT/BASIC_DATA_TYPES")
401 :
402 : iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%PRINT/PHYSCON", &
403 9881 : extension=".Log")
404 9881 : IF (iw > 0) CALL write_physcon(iw)
405 : CALL cp_print_key_finished_output(iw, logger, root_section, &
406 9881 : "GLOBAL%PRINT/PHYSCON")
407 :
408 9881 : END SUBROUTINE cp2k_read
409 :
410 : ! **************************************************************************************************
411 : !> \brief globenv initializations that need the input and error
412 : !> \param root_section ...
413 : !> \param para_env ...
414 : !> \param globenv the global environment to initialize
415 : !> \author fawzi
416 : !> \note
417 : !> if possible do the initializations here as the environment
418 : !> (error,...) is setup, instead of cp2k_init
419 : ! **************************************************************************************************
420 19762 : SUBROUTINE cp2k_setup(root_section, para_env, globenv)
421 :
422 : TYPE(section_vals_type), POINTER :: root_section
423 : TYPE(mp_para_env_type), POINTER :: para_env
424 : TYPE(global_environment_type), POINTER :: globenv
425 :
426 : INTEGER :: iw, maxl
427 9881 : INTEGER, DIMENSION(:), POINTER :: seed_vals
428 : REAL(KIND=dp), DIMENSION(3, 2) :: initial_seed
429 : TYPE(cp_logger_type), POINTER :: logger
430 :
431 9881 : NULLIFY (logger)
432 19762 : logger => cp_get_default_logger()
433 :
434 : ! Initialize the parallel random number generator
435 :
436 : iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%PRINT/RNG_MATRICES", &
437 9881 : extension=".Log")
438 9881 : IF (iw > 0) THEN
439 1 : CALL write_rng_matrices(iw)
440 : END IF
441 :
442 : CALL cp_print_key_finished_output(iw, logger, root_section, &
443 9881 : "GLOBAL%PRINT/RNG_MATRICES")
444 :
445 : ! Initialize a global normally Gaussian distributed (pseudo)random number stream
446 :
447 9881 : CALL section_vals_val_get(root_section, "GLOBAL%SEED", i_vals=seed_vals)
448 9881 : IF (SIZE(seed_vals) == 1) THEN
449 88929 : initial_seed(:, :) = REAL(seed_vals(1), KIND=dp)
450 0 : ELSE IF (SIZE(seed_vals) == 6) THEN
451 0 : initial_seed(1:3, 1:2) = RESHAPE(REAL(seed_vals(:), KIND=dp), [3, 2])
452 : ELSE
453 0 : CPABORT("Supply exactly 1 or 6 arguments for SEED in &GLOBAL only!")
454 : END IF
455 :
456 : globenv%gaussian_rng_stream = rng_stream_type( &
457 : name="Global Gaussian random numbers", &
458 : distribution_type=GAUSSIAN, &
459 : seed=initial_seed, &
460 9881 : extended_precision=.TRUE.)
461 :
462 : iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%PRINT/RNG_CHECK", &
463 9881 : extension=".Log")
464 9881 : IF (iw > 0) THEN
465 1 : CALL check_rng(iw, para_env%is_source())
466 : END IF
467 :
468 : CALL cp_print_key_finished_output(iw, logger, root_section, &
469 9881 : "GLOBAL%PRINT/RNG_CHECK")
470 :
471 : iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%PRINT/GLOBAL_GAUSSIAN_RNG", &
472 9881 : extension=".Log")
473 9881 : IF (iw > 0) &
474 1 : CALL globenv%gaussian_rng_stream%write(iw, write_all=.TRUE.)
475 :
476 : CALL cp_print_key_finished_output(iw, logger, root_section, &
477 9881 : "GLOBAL%PRINT/GLOBAL_GAUSSIAN_RNG")
478 :
479 9881 : CALL section_vals_val_get(root_section, "GLOBAL%PRINT%SPHERICAL_HARMONICS", i_val=maxl)
480 9881 : IF (maxl >= 0) THEN
481 : iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%PRINT", &
482 2 : extension=".Log")
483 2 : CALL init_orbital_pointers(maxl)
484 2 : CALL init_spherical_harmonics(maxl, iw)
485 2 : CALL deallocate_spherical_harmonics()
486 2 : CALL deallocate_orbital_pointers()
487 : CALL cp_print_key_finished_output(iw, logger, root_section, &
488 2 : "GLOBAL%PRINT")
489 : END IF
490 :
491 9881 : END SUBROUTINE cp2k_setup
492 :
493 : ! **************************************************************************************************
494 : !> \brief read the global section of new input
495 : !> \param root_section ...
496 : !> \param para_env ...
497 : !> \param globenv ...
498 : !> \par History
499 : !> 06-2005 [created]
500 : !> \author MI
501 : !> \note
502 : !> Should not be required anymore once everything is converted
503 : !> to get information directly from the input structure
504 : ! **************************************************************************************************
505 148215 : SUBROUTINE read_global_section(root_section, para_env, globenv)
506 :
507 : TYPE(section_vals_type), POINTER :: root_section
508 : TYPE(mp_para_env_type), POINTER :: para_env
509 : TYPE(global_environment_type), POINTER :: globenv
510 :
511 : CHARACTER(LEN=6), PARAMETER :: start_section_label = "GLOBAL"
512 :
513 : CHARACTER(LEN=13) :: omp_stacksize, tracing_string
514 : CHARACTER(LEN=6) :: print_level_string
515 : CHARACTER(LEN=default_path_length) :: basis_set_file_name, coord_file_name, &
516 : mm_potential_file_name, &
517 : potential_file_name
518 : CHARACTER(LEN=default_string_length) :: env_num, model_name, project_name
519 : CHARACTER(LEN=default_string_length), &
520 9881 : DIMENSION(:), POINTER :: trace_routines
521 : INTEGER :: cpuid, cpuid_static, i_cholesky, i_dgemm, i_diag, i_fft, i_grid_backend, &
522 : iforce_eval, method_name_id, n_rep_val, nforce_eval, node_count, num_threads, &
523 : output_unit, print_level, trace_max, unit_nr
524 : INTEGER(kind=int_8) :: Buffers, Buffers_avr, Buffers_max, Buffers_min, Cached, Cached_avr, &
525 : Cached_max, Cached_min, MemFree, MemFree_avr, MemFree_max, MemFree_min, MemLikelyFree, &
526 : MemLikelyFree_avr, MemLikelyFree_max, MemLikelyFree_min, MemTotal, MemTotal_avr, &
527 : MemTotal_max, MemTotal_min, Slab, Slab_avr, Slab_max, Slab_min, SReclaimable, &
528 : SReclaimable_avr, SReclaimable_max, SReclaimable_min
529 9881 : INTEGER, DIMENSION(:), POINTER :: i_force_eval
530 : LOGICAL :: ata, do_echo_all_hosts, efl, explicit, &
531 : flag, report_maxloc, trace, &
532 : trace_master
533 : TYPE(cp_logger_type), POINTER :: logger
534 : TYPE(enumeration_type), POINTER :: enum1, enum2
535 : TYPE(keyword_type), POINTER :: keyword
536 : TYPE(section_type), POINTER :: section
537 : TYPE(section_vals_type), POINTER :: dft_section, force_env_sections, &
538 : global_section, qmmm_section, &
539 : subsys_section
540 :
541 9881 : NULLIFY (dft_section, global_section, i_force_eval)
542 :
543 19762 : logger => cp_get_default_logger()
544 9881 : global_section => section_vals_get_subs_vals(root_section, "GLOBAL")
545 9881 : CALL section_vals_val_get(global_section, "BLACS_GRID", i_val=globenv%blacs_grid_layout)
546 9881 : CALL section_vals_val_get(global_section, "BLACS_REPEATABLE", l_val=globenv%blacs_repeatable)
547 9881 : CALL section_vals_val_get(global_section, "PREFERRED_DIAG_LIBRARY", i_val=i_diag)
548 9881 : CALL section_vals_val_get(global_section, "PREFERRED_CHOLESKY_LIBRARY", i_val=i_cholesky)
549 9881 : CALL section_vals_val_get(global_section, "PREFERRED_DGEMM_LIBRARY", i_val=i_dgemm)
550 9881 : CALL section_vals_val_get(global_section, "EPS_CHECK_DIAG", r_val=globenv%eps_check_diag)
551 9881 : CALL section_vals_val_get(global_section, "ENABLE_MPI_IO", l_val=flag)
552 9881 : CALL cp_mpi_io_set(flag)
553 9881 : CALL section_vals_val_get(global_section, "ELPA_KERNEL", i_val=globenv%k_elpa)
554 9881 : CALL section_vals_val_get(global_section, "ELPA_NEIGVEC_MIN", i_val=globenv%elpa_neigvec_min)
555 9881 : CALL section_vals_val_get(global_section, "ELPA_QR", l_val=globenv%elpa_qr)
556 9881 : CALL section_vals_val_get(global_section, "ELPA_QR_UNSAFE", l_val=globenv%elpa_qr_unsafe)
557 9881 : unit_nr = cp_print_key_unit_nr(logger, global_section, "PRINT_ELPA", extension=".Log")
558 9881 : IF (unit_nr > 0) globenv%elpa_print = .TRUE.
559 9881 : CALL cp_print_key_finished_output(unit_nr, logger, global_section, "PRINT_ELPA")
560 9881 : CALL section_vals_val_get(global_section, "DLAF_NEIGVEC_MIN", i_val=globenv%dlaf_neigvec_min)
561 9881 : CALL section_vals_val_get(global_section, "DLAF_CHOLESKY_N_MIN", i_val=globenv%dlaf_cholesky_n_min)
562 9881 : CALL section_vals_val_get(global_section, "PREFERRED_FFT_LIBRARY", i_val=i_fft)
563 9881 : CALL section_vals_val_get(global_section, "PRINT_LEVEL", i_val=print_level)
564 9881 : CALL section_vals_val_get(global_section, "PROGRAM_NAME", i_val=globenv%prog_name_id)
565 9881 : CALL section_vals_val_get(global_section, "FFT_POOL_SCRATCH_LIMIT", i_val=globenv%fft_pool_scratch_limit)
566 9881 : CALL section_vals_val_get(global_section, "FFTW_PLAN_TYPE", i_val=globenv%fftw_plan_type)
567 9881 : CALL section_vals_val_get(global_section, "PROJECT_NAME", c_val=project_name)
568 9881 : CALL section_vals_val_get(global_section, "FFTW_WISDOM_FILE_NAME", c_val=globenv%fftw_wisdom_file_name)
569 9881 : CALL section_vals_val_get(global_section, "RUN_TYPE", i_val=globenv%run_type_id)
570 : CALL cp2k_get_walltime(section=global_section, keyword_name="WALLTIME", &
571 9881 : walltime=globenv%cp2k_target_time)
572 9881 : CALL section_vals_val_get(global_section, "TRACE", l_val=trace)
573 9881 : CALL section_vals_val_get(global_section, "TRACE_MASTER", l_val=trace_MASTER)
574 9881 : CALL section_vals_val_get(global_section, "TRACE_MAX", i_val=trace_max)
575 9881 : CALL section_vals_val_get(global_section, "TRACE_ROUTINES", explicit=explicit)
576 9881 : IF (explicit) THEN
577 0 : CALL section_vals_val_get(global_section, "TRACE_ROUTINES", c_vals=trace_routines)
578 : ELSE
579 9881 : NULLIFY (trace_routines)
580 : END IF
581 9881 : CALL section_vals_val_get(global_section, "FLUSH_SHOULD_FLUSH", l_val=flush_should_flush)
582 9881 : CALL section_vals_val_get(global_section, "ECHO_ALL_HOSTS", l_val=do_echo_all_hosts)
583 9881 : report_maxloc = section_get_lval(global_section, "TIMINGS%REPORT_MAXLOC")
584 9881 : global_timings_level = section_get_ival(global_section, "TIMINGS%TIMINGS_LEVEL")
585 9881 : do_echo_all_hosts = do_echo_all_hosts .OR. report_maxloc
586 9881 : force_env_sections => section_vals_get_subs_vals(root_section, "FORCE_EVAL")
587 9881 : CALL section_vals_get(force_env_sections, n_repetition=nforce_eval)
588 : output_unit = cp_print_key_unit_nr(logger, global_section, "PROGRAM_RUN_INFO", &
589 9881 : extension=".log")
590 :
591 9881 : CALL fm_setup(global_section)
592 9881 : CALL fm_diag_rules_setup(global_section)
593 9881 : CALL dgemm_setup(global_section)
594 :
595 9881 : IF (trace .AND. (.NOT. trace_master .OR. para_env%mepos == 0)) THEN
596 0 : unit_nr = -1
597 0 : IF (logger%para_env%is_source() .OR. .NOT. trace_master) &
598 0 : unit_nr = cp_logger_get_default_unit_nr(logger, local=.TRUE.)
599 0 : WRITE (tracing_string, "(I6.6,A1,I6.6)") para_env%mepos, ":", para_env%num_pe
600 0 : IF (ASSOCIATED(trace_routines)) THEN
601 0 : CALL timings_setup_tracing(trace_max, unit_nr, tracing_string, trace_routines)
602 : ELSE
603 0 : CALL timings_setup_tracing(trace_max, unit_nr, tracing_string)
604 : END IF
605 : END IF
606 :
607 9881 : CALL section_vals_val_get(global_section, "TIMINGS%TIME_MPI", l_val=mp_collect_timings)
608 :
609 194 : SELECT CASE (i_diag)
610 : CASE (FM_DIAG_TYPE_SCALAPACK)
611 194 : globenv%diag_library = "ScaLAPACK"
612 : CASE (FM_DIAG_TYPE_ELPA)
613 9687 : globenv%diag_library = "ELPA"
614 9687 : CALL cite_reference(Marek2014)
615 : CASE (FM_DIAG_TYPE_CUSOLVER)
616 0 : globenv%diag_library = "cuSOLVER"
617 : CASE (FM_DIAG_TYPE_DLAF)
618 0 : globenv%diag_library = "DLAF"
619 0 : CALL cite_reference(Solca2024)
620 : CASE DEFAULT
621 9881 : CPABORT("Unknown diagonalization library specified")
622 : END SELECT
623 :
624 9881 : SELECT CASE (i_cholesky)
625 : CASE (FM_CHOLESKY_TYPE_SCALAPACK)
626 9881 : globenv%cholesky_library = "ScaLAPACK"
627 9881 : cholesky_type = FM_CHOLESKY_TYPE_SCALAPACK
628 : CASE (FM_CHOLESKY_TYPE_DLAF)
629 0 : globenv%cholesky_library = "DLAF"
630 0 : cholesky_type = FM_CHOLESKY_TYPE_DLAF
631 0 : dlaf_cholesky_n_min = globenv%dlaf_cholesky_n_min
632 0 : CALL cite_reference(Solca2024)
633 : CASE DEFAULT
634 9881 : CPABORT("Unknown Cholesky decomposition library specified")
635 : END SELECT
636 :
637 10 : SELECT CASE (i_fft)
638 : CASE (do_fft_sg)
639 10 : globenv%default_fft_library = "FFTSG"
640 : CASE (do_fft_fftw3)
641 9871 : globenv%default_fft_library = "FFTW3"
642 9871 : CALL cite_reference(Frigo2005)
643 : CASE DEFAULT
644 9881 : CPABORT("Unknown FFT library specified")
645 : END SELECT
646 :
647 0 : SELECT CASE (i_dgemm)
648 : CASE (do_dgemm_spla)
649 0 : globenv%default_dgemm_library = "SPLA"
650 : CASE (do_dgemm_blas)
651 9881 : globenv%default_dgemm_library = "BLAS"
652 : CASE DEFAULT
653 9881 : CPABORT("Unknown DGEMM library specified")
654 : END SELECT
655 :
656 9881 : IF (globenv%run_type_id == 0) THEN
657 0 : SELECT CASE (globenv%prog_name_id)
658 : CASE (do_farming, do_test)
659 0 : globenv%run_type_id = none_run
660 : CASE (do_cp2k)
661 0 : IF (nforce_eval /= 1) THEN
662 : ! multiple force_eval corresponds at the moment to RESPA calculations only
663 : ! default MD
664 0 : globenv%run_type_id = mol_dyn_run
665 : ELSE
666 0 : CALL section_vals_val_get(force_env_sections, "METHOD", i_val=method_name_id)
667 0 : SELECT CASE (method_name_id)
668 : CASE (do_fist)
669 0 : globenv%run_type_id = mol_dyn_run
670 : CASE (do_eip)
671 0 : globenv%run_type_id = mol_dyn_run
672 : CASE (do_qs)
673 0 : globenv%run_type_id = energy_run
674 : CASE (do_sirius)
675 0 : globenv%run_type_id = energy_run
676 : END SELECT
677 : END IF
678 : END SELECT
679 : END IF
680 :
681 9881 : IF (globenv%prog_name_id == do_farming .AND. globenv%run_type_id /= none_run) THEN
682 0 : CPABORT("FARMING program supports only NONE as run type")
683 : END IF
684 :
685 9881 : IF (globenv%prog_name_id == do_test .AND. globenv%run_type_id /= none_run) &
686 0 : CPABORT("TEST program supports only NONE as run type")
687 :
688 9881 : CALL m_memory_details(MemTotal, MemFree, Buffers, Cached, Slab, SReclaimable, MemLikelyFree)
689 9881 : MemTotal_avr = MemTotal
690 9881 : MemFree_avr = MemFree
691 9881 : Buffers_avr = Buffers
692 9881 : Cached_avr = Cached
693 9881 : Slab_avr = Slab
694 9881 : SReclaimable_avr = SReclaimable
695 9881 : MemLikelyFree_avr = MemLikelyFree
696 9881 : CALL para_env%sum(MemTotal_avr); MemTotal_avr = MemTotal_avr/para_env%num_pe/1024
697 9881 : CALL para_env%sum(MemFree_avr); MemFree_avr = MemFree_avr/para_env%num_pe/1024
698 9881 : CALL para_env%sum(Buffers_avr); Buffers_avr = Buffers_avr/para_env%num_pe/1024
699 9881 : CALL para_env%sum(Cached_avr); Cached_avr = Cached_avr/para_env%num_pe/1024
700 9881 : CALL para_env%sum(Slab_avr); Slab_avr = Slab_avr/para_env%num_pe/1024
701 9881 : CALL para_env%sum(SReclaimable_avr); SReclaimable_avr = SReclaimable_avr/para_env%num_pe/1024
702 9881 : CALL para_env%sum(MemLikelyFree_avr); MemLikelyFree_avr = MemLikelyFree_avr/para_env%num_pe/1024
703 :
704 9881 : MemTotal_min = -MemTotal
705 9881 : MemFree_min = -MemFree
706 9881 : Buffers_min = -Buffers
707 9881 : Cached_min = -Cached
708 9881 : Slab_min = -Slab
709 9881 : SReclaimable_min = -SReclaimable
710 9881 : MemLikelyFree_min = -MemLikelyFree
711 9881 : CALL para_env%max(MemTotal_min); MemTotal_min = -MemTotal_min/1024
712 9881 : CALL para_env%max(MemFree_min); MemFree_min = -MemFree_min/1024
713 9881 : CALL para_env%max(Buffers_min); Buffers_min = -Buffers_min/1024
714 9881 : CALL para_env%max(Cached_min); Cached_min = -Cached_min/1024
715 9881 : CALL para_env%max(Slab_min); Slab_min = -Slab_min/1024
716 9881 : CALL para_env%max(SReclaimable_min); SReclaimable_min = -SReclaimable_min/1024
717 9881 : CALL para_env%max(MemLikelyFree_min); MemLikelyFree_min = -MemLikelyFree_min/1024
718 :
719 9881 : MemTotal_max = MemTotal
720 9881 : MemFree_max = MemFree
721 9881 : Buffers_max = Buffers
722 9881 : Cached_max = Cached
723 9881 : Slab_max = Slab
724 9881 : SReclaimable_max = SReclaimable
725 9881 : MemLikelyFree_max = MemLikelyFree
726 9881 : CALL para_env%max(MemTotal_max); MemTotal_max = MemTotal_max/1024
727 9881 : CALL para_env%max(MemFree_max); MemFree_max = MemFree_max/1024
728 9881 : CALL para_env%max(Buffers_max); Buffers_max = Buffers_max/1024
729 9881 : CALL para_env%max(Cached_max); Cached_max = Cached_max/1024
730 9881 : CALL para_env%max(Slab_max); Slab_max = Slab_max/1024
731 9881 : CALL para_env%max(SReclaimable_max); SReclaimable_max = SReclaimable_max/1024
732 9881 : CALL para_env%max(MemLikelyFree_max); MemLikelyFree_max = MemLikelyFree_max/1024
733 :
734 9881 : MemTotal = MemTotal/1024
735 9881 : MemFree = MemFree/1024
736 9881 : Buffers = Buffers/1024
737 9881 : Cached = Cached/1024
738 9881 : Slab = Slab/1024
739 9881 : SReclaimable = SReclaimable/1024
740 9881 : MemLikelyFree = MemLikelyFree/1024
741 :
742 9881 : node_count = 1
743 : ! Print a list of all started processes
744 9881 : IF (do_echo_all_hosts) THEN
745 2 : CALL echo_all_hosts(para_env, output_unit)
746 :
747 : ! Print the number of processes per host
748 2 : CALL echo_all_process_host(para_env, output_unit, node_count)
749 : ELSE ! no echo
750 9879 : CALL echo_all_process_host(para_env, 0, node_count)
751 : END IF
752 :
753 9881 : num_threads = 1
754 9881 : !$ num_threads = omp_get_max_threads()
755 9881 : IF (output_unit > 0) THEN
756 5044 : WRITE (UNIT=output_unit, FMT=*)
757 5044 : CALL multiple_fe_list(force_env_sections, root_section, i_force_eval, nforce_eval)
758 10029 : DO iforce_eval = 1, nforce_eval
759 : dft_section => section_vals_get_subs_vals3(force_env_sections, "DFT", &
760 4985 : i_rep_section=i_force_eval(iforce_eval))
761 : qmmm_section => section_vals_get_subs_vals3(force_env_sections, "QMMM", &
762 4985 : i_rep_section=i_force_eval(iforce_eval))
763 : CALL section_vals_val_get(dft_section, "BASIS_SET_FILE_NAME", &
764 4985 : c_val=basis_set_file_name)
765 : CALL section_vals_val_get(dft_section, "POTENTIAL_FILE_NAME", &
766 4985 : c_val=potential_file_name)
767 :
768 : CALL section_vals_val_get(qmmm_section, "MM_POTENTIAL_FILE_NAME", &
769 4985 : c_val=mm_potential_file_name)
770 : ! SUBSYS - If any
771 : subsys_section => section_vals_get_subs_vals3(force_env_sections, "SUBSYS", &
772 4985 : i_rep_section=i_force_eval(iforce_eval))
773 4985 : CALL section_vals_get(subsys_section, explicit=explicit)
774 4985 : coord_file_name = "__STD_INPUT__"
775 4985 : IF (explicit) THEN
776 : CALL section_vals_val_get(subsys_section, "TOPOLOGY%COORD_FILE_NAME", &
777 4878 : n_rep_val=n_rep_val)
778 4878 : IF (n_rep_val == 1) THEN
779 : CALL section_vals_val_get(subsys_section, "TOPOLOGY%COORD_FILE_NAME", &
780 914 : c_val=coord_file_name)
781 : END IF
782 : END IF
783 4985 : CALL integer_to_string(i_force_eval(iforce_eval), env_num)
784 :
785 : WRITE (UNIT=output_unit, FMT="(T2,A,T41,A)") &
786 4985 : start_section_label//"| Force Environment number", &
787 4985 : ADJUSTR(env_num(:40)), &
788 4985 : start_section_label//"| Basis set file name", &
789 4985 : ADJUSTR(basis_set_file_name(:40)), &
790 4985 : start_section_label//"| Potential file name", &
791 4985 : ADJUSTR(potential_file_name(:40)), &
792 4985 : start_section_label//"| MM Potential file name", &
793 4985 : ADJUSTR(mm_potential_file_name(:40)), &
794 4985 : start_section_label//"| Coordinate file name", &
795 19999 : ADJUSTR(coord_file_name(:40))
796 : END DO
797 5044 : DEALLOCATE (i_force_eval)
798 :
799 5044 : NULLIFY (enum1, enum2, keyword, section)
800 5044 : CALL create_global_section(section)
801 5044 : keyword => section_get_keyword(section, "PROGRAM_NAME")
802 5044 : CALL keyword_get(keyword, enum=enum1)
803 5044 : keyword => section_get_keyword(section, "RUN_TYPE")
804 5044 : CALL keyword_get(keyword, enum=enum2)
805 :
806 : WRITE (UNIT=output_unit, FMT="(T2,A,T41,A40)") &
807 5044 : start_section_label//"| Method name", &
808 5044 : ADJUSTR(TRIM(enum_i2c(enum1, globenv%prog_name_id))), &
809 5044 : start_section_label//"| Project name", &
810 5044 : ADJUSTR(project_name(:40)), &
811 5044 : start_section_label//"| Run type", &
812 5044 : ADJUSTR(TRIM(enum_i2c(enum2, globenv%run_type_id))), &
813 5044 : start_section_label//"| FFT library", &
814 5044 : ADJUSTR(globenv%default_fft_library(:40)), &
815 5044 : start_section_label//"| Diagonalization library", &
816 5044 : ADJUSTR(globenv%diag_library(:40)), &
817 5044 : start_section_label//"| Cholesky decomposition library", &
818 5044 : ADJUSTR(globenv%cholesky_library(:40)), &
819 5044 : start_section_label//"| DGEMM library", &
820 10088 : ADJUSTR(globenv%default_dgemm_library(:40))
821 :
822 5044 : IF (globenv%diag_library == "ELPA") THEN
823 : WRITE (UNIT=output_unit, FMT="(T2,A,T71,I10)") &
824 4946 : start_section_label//"| Minimum number of eigenvectors for ELPA usage", &
825 9892 : globenv%elpa_neigvec_min
826 : END IF
827 :
828 5044 : IF (globenv%diag_library == "DLAF") THEN
829 : WRITE (UNIT=output_unit, FMT="(T2,A,T71,I10)") &
830 0 : start_section_label//"| Minimum number of eigenvectors for DLAF usage", &
831 0 : globenv%dlaf_neigvec_min
832 : END IF
833 :
834 5044 : IF (globenv%cholesky_library == "DLAF") THEN
835 : WRITE (UNIT=output_unit, FMT="(T2,A,T71,I10)") &
836 0 : start_section_label//"| Minimum matrix size for Cholesky decomposition with DLAF", &
837 0 : globenv%dlaf_cholesky_n_min
838 : END IF
839 :
840 : #if defined(__CHECK_DIAG)
841 : ! Perform default check if no threshold value has been specified explicitly
842 : IF (globenv%eps_check_diag < 0.0_dp) THEN
843 : WRITE (UNIT=output_unit, FMT="(T2,A,T71,ES10.3)") &
844 : start_section_label//"| Orthonormality check for eigenvectors enabled", &
845 : eps_check_diag_default
846 : ELSE
847 : WRITE (UNIT=output_unit, FMT="(T2,A,T71,ES10.3)") &
848 : start_section_label//"| Orthonormality check for eigenvectors enabled", &
849 : globenv%eps_check_diag
850 : END IF
851 : #else
852 5044 : IF (globenv%eps_check_diag < 0.0_dp) THEN
853 : WRITE (UNIT=output_unit, FMT="(T2,A,T73,A)") &
854 5040 : start_section_label//"| Orthonormality check for eigenvectors", &
855 10080 : "DISABLED"
856 : ELSE
857 : WRITE (UNIT=output_unit, FMT="(T2,A,T71,ES10.3)") &
858 4 : start_section_label//"| Orthonormality check for eigenvectors enabled", &
859 8 : globenv%eps_check_diag
860 : END IF
861 : #endif
862 5044 : CALL section_release(section)
863 :
864 0 : SELECT CASE (cp_fm_get_mm_type())
865 : CASE (do_scalapack)
866 : WRITE (UNIT=output_unit, FMT="(T2,A,T72,A)") &
867 0 : start_section_label//"| Matrix multiplication library", "ScaLAPACK"
868 : CASE (do_cosma)
869 : WRITE (UNIT=output_unit, FMT="(T2,A,T76,A)") &
870 5044 : start_section_label//"| Matrix multiplication library", "COSMA"
871 : END SELECT
872 :
873 5044 : CALL section_vals_val_get(global_section, "ALLTOALL_SGL", l_val=ata)
874 : WRITE (UNIT=output_unit, FMT="(T2,A,T80,L1)") &
875 5044 : start_section_label//"| All-to-all communication in single precision", ata
876 5044 : CALL section_vals_val_get(global_section, "EXTENDED_FFT_LENGTHS", l_val=efl)
877 : WRITE (UNIT=output_unit, FMT="(T2,A,T80,L1)") &
878 5044 : start_section_label//"| FFTs using library dependent lengths", efl
879 :
880 135 : SELECT CASE (print_level)
881 : CASE (silent_print_level)
882 135 : print_level_string = "SILENT"
883 : CASE (low_print_level)
884 2380 : print_level_string = " LOW"
885 : CASE (medium_print_level)
886 2478 : print_level_string = "MEDIUM"
887 : CASE (high_print_level)
888 26 : print_level_string = " HIGH"
889 : CASE (debug_print_level)
890 25 : print_level_string = " DEBUG"
891 : CASE DEFAULT
892 5044 : CPABORT("Unknown print_level")
893 : END SELECT
894 :
895 5044 : CALL section_vals_val_get(global_section, "GRID%BACKEND", i_val=i_grid_backend)
896 5034 : SELECT CASE (i_grid_backend)
897 : CASE (GRID_BACKEND_AUTO)
898 : WRITE (UNIT=output_unit, FMT="(T2,A,T75,A6)") &
899 5034 : start_section_label//"| Grid backend", "AUTO"
900 : CASE (GRID_BACKEND_CPU)
901 : WRITE (UNIT=output_unit, FMT="(T2,A,T75,A6)") &
902 4 : start_section_label//"| Grid backend", "CPU"
903 : CASE (GRID_BACKEND_DGEMM)
904 : WRITE (UNIT=output_unit, FMT="(T2,A,T75,A6)") &
905 4 : start_section_label//"| Grid backend", "DGEMM"
906 : CASE (GRID_BACKEND_GPU)
907 : WRITE (UNIT=output_unit, FMT="(T2,A,T75,A6)") &
908 0 : start_section_label//"| Grid backend", "GPU"
909 : CASE (GRID_BACKEND_HIP)
910 : WRITE (UNIT=output_unit, FMT="(T2,A,T75,A6)") &
911 0 : start_section_label//"| Grid backend", "HIP"
912 : CASE (GRID_BACKEND_REF)
913 : WRITE (UNIT=output_unit, FMT="(T2,A,T75,A6)") &
914 5044 : start_section_label//"| Grid backend", "REF"
915 : END SELECT
916 :
917 : WRITE (UNIT=output_unit, FMT="(T2,A,T75,A6)") &
918 5044 : start_section_label//"| Global print level", print_level_string
919 : WRITE (UNIT=output_unit, FMT="(T2,A,T75,L6)") &
920 5044 : start_section_label//"| MPI I/O enabled", flag
921 : WRITE (UNIT=output_unit, FMT="(T2,A,T75,I6)") &
922 5044 : start_section_label//"| Total number of message passing processes", &
923 5044 : para_env%num_pe, &
924 5044 : start_section_label//"| Number of distributed systems (nodes)", &
925 5044 : node_count, &
926 5044 : start_section_label//"| Number of threads for this process", &
927 5044 : num_threads, &
928 10088 : start_section_label//"| This output is from process", para_env%mepos
929 :
930 5044 : CALL m_omp_get_stacksize(omp_stacksize)
931 : WRITE (UNIT=output_unit, FMT="(T2,A,T68,A13)") &
932 5044 : start_section_label//"| OpenMP stack size per thread (OMP_STACKSIZE)", &
933 10088 : ADJUSTR(omp_stacksize)
934 :
935 5044 : IF (0 <= m_omp_trace_issues()) THEN ! only show in header if enabled
936 : WRITE (UNIT=output_unit, FMT="(T2,A,T68,A13)") &
937 0 : start_section_label//"| OpenMP issue trace (CP2K_OMP_TRACE)", &
938 0 : "enabled"
939 : END IF
940 :
941 5044 : CALL m_cpuinfo(model_name)
942 : WRITE (UNIT=output_unit, FMT="(T2,A,T30,A51)") &
943 5044 : start_section_label//"| CPU model name", ADJUSTR(TRIM(model_name))
944 :
945 5044 : cpuid = m_cpuid()
946 5044 : cpuid_static = m_cpuid_static()
947 :
948 5044 : IF ((cpuid > 0) .OR. (cpuid_static > 0)) THEN
949 : WRITE (UNIT=output_unit, FMT="(T2,A,T75,I6)") &
950 5044 : start_section_label//"| CPUID", cpuid
951 5044 : IF (cpuid /= cpuid_static) THEN
952 : WRITE (UNIT=output_unit, FMT="(T2,A,T75,I6)") &
953 0 : start_section_label//"| Compiled for CPUID", cpuid_static
954 : END IF
955 : END IF
956 :
957 : ! filter cpuids by vlen to show more relevant information
958 5044 : IF (m_cpuid_vlen(cpuid_static) < m_cpuid_vlen(cpuid)) THEN
959 : ! base/machine_cpuid.c relies on the (same) target flags as the Fortran code
960 : CALL cp_hint(__LOCATION__, "The compiler target flags ("// &
961 : TRIM(m_cpuid_name(cpuid_static))//") used to build this binary cannot exploit "// &
962 : "all extensions of this CPU model ("//TRIM(m_cpuid_name(cpuid))//"). "// &
963 0 : "Consider compiler target flags as part of FCFLAGS and CFLAGS (ARCH file).")
964 : END IF
965 :
966 5044 : WRITE (UNIT=output_unit, FMT="()")
967 5044 : WRITE (UNIT=output_unit, FMT="(T2,A)") "MEMORY| system memory details [Kb]"
968 5044 : WRITE (UNIT=output_unit, FMT="(T2,A23,4A14)") "MEMORY| ", "rank 0", "min", "max", "average"
969 5044 : WRITE (UNIT=output_unit, FMT="(T2,A23,4I14)") "MEMORY| MemTotal ", memtotal, memtotal_min, memtotal_max, memtotal_avr
970 5044 : WRITE (UNIT=output_unit, FMT="(T2,A23,4I14)") "MEMORY| MemFree ", memFree, memfree_min, memfree_max, memfree_avr
971 5044 : WRITE (UNIT=output_unit, FMT="(T2,A23,4I14)") "MEMORY| Buffers ", Buffers, Buffers_min, Buffers_max, Buffers_avr
972 5044 : WRITE (UNIT=output_unit, FMT="(T2,A23,4I14)") "MEMORY| Cached ", Cached, Cached_min, Cached_max, Cached_avr
973 5044 : WRITE (UNIT=output_unit, FMT="(T2,A23,4I14)") "MEMORY| Slab ", Slab, Slab_min, Slab_max, Slab_avr
974 : WRITE (UNIT=output_unit, FMT="(T2,A23,4I14)") &
975 5044 : "MEMORY| SReclaimable ", SReclaimable, SReclaimable_min, SReclaimable_max, &
976 10088 : SReclaimable_avr
977 : WRITE (UNIT=output_unit, FMT="(T2,A23,4I14)") &
978 5044 : "MEMORY| MemLikelyFree ", MemLikelyFree, MemLikelyFree_min, MemLikelyFree_max, &
979 10088 : MemLikelyFree_avr
980 5044 : WRITE (UNIT=output_unit, FMT='()')
981 :
982 : END IF
983 :
984 : CALL cp_print_key_finished_output(output_unit, logger, global_section, &
985 9881 : "PROGRAM_RUN_INFO")
986 :
987 9881 : END SUBROUTINE read_global_section
988 :
989 : ! **************************************************************************************************
990 : !> \brief ...
991 : !> \param root_section ...
992 : !> \param para_env ...
993 : !> \param globenv ...
994 : !> \par History
995 : !> 2-Dec-2000 (JGH) added default fft library
996 : !> \author JGH,MK
997 : ! **************************************************************************************************
998 9881 : SUBROUTINE read_cp2k_section(root_section, para_env, globenv)
999 :
1000 : TYPE(section_vals_type), POINTER :: root_section
1001 : TYPE(mp_para_env_type), POINTER :: para_env
1002 : TYPE(global_environment_type), POINTER :: globenv
1003 :
1004 : INTEGER :: output_unit
1005 : TYPE(cp_logger_type), POINTER :: logger
1006 : TYPE(section_vals_type), POINTER :: global_section
1007 :
1008 9881 : global_section => section_vals_get_subs_vals(root_section, "GLOBAL")
1009 9881 : CALL read_global_section(root_section, para_env, globenv)
1010 9881 : logger => cp_get_default_logger()
1011 : output_unit = cp_print_key_unit_nr(logger, global_section, "PROGRAM_RUN_INFO", &
1012 9881 : extension=".log")
1013 :
1014 9881 : CALL fft_setup_library(globenv, global_section)
1015 9881 : CALL diag_setup_library(globenv)
1016 :
1017 : CALL cp_print_key_finished_output(output_unit, logger, global_section, &
1018 9881 : "PROGRAM_RUN_INFO")
1019 :
1020 9881 : END SUBROUTINE read_cp2k_section
1021 :
1022 : ! **************************************************************************************************
1023 : !> \brief check FFT preferred library availability, if not switch
1024 : !> \param globenv ...
1025 : !> \param global_section ...
1026 : !> \par History
1027 : !> 2-Dec-2000 (JGH) added default fft library
1028 : !> Nov-2013 (MI) refactoring
1029 : !> \author JGH,MK
1030 : ! **************************************************************************************************
1031 9881 : SUBROUTINE fft_setup_library(globenv, global_section)
1032 :
1033 : TYPE(global_environment_type), POINTER :: globenv
1034 : TYPE(section_vals_type), POINTER :: global_section
1035 :
1036 : CHARACTER(LEN=3*default_string_length) :: message
1037 : COMPLEX(KIND=dp), DIMENSION(4, 4, 4) :: zz
1038 : INTEGER :: stat
1039 : INTEGER, DIMENSION(3) :: n
1040 : LOGICAL :: try_fftw
1041 :
1042 39524 : n(:) = 4
1043 9881 : zz(:, :, :) = 0.0_dp
1044 :
1045 : ! Setup the FFT library
1046 : ! If the user has specified PREFERRED_FFT_LIBRARY try that first (default FFTW3)
1047 : ! If that one is not available, try FFTW3 (unless it has been tried already)
1048 : ! If FFTW3 is not available use FFTSG
1049 :
1050 9881 : IF (globenv%default_fft_library == "FFTW3") THEN
1051 : try_fftw = .FALSE.
1052 : ELSE
1053 10 : try_fftw = .TRUE.
1054 : END IF
1055 :
1056 : ! Initialize FFT library with the user's preferred FFT library
1057 : CALL init_fft(fftlib=TRIM(globenv%default_fft_library), &
1058 : alltoall=section_get_lval(global_section, "ALLTOALL_SGL"), &
1059 : fftsg_sizes=.NOT. section_get_lval(global_section, "EXTENDED_FFT_LENGTHS"), &
1060 : pool_limit=globenv%fft_pool_scratch_limit, &
1061 : wisdom_file=globenv%fftw_wisdom_file_name, &
1062 9881 : plan_style=globenv%fftw_plan_type)
1063 :
1064 : ! Check for FFT library
1065 9881 : CALL fft3d(FWFFT, n, zz, status=stat)
1066 9881 : IF (stat /= 0) THEN
1067 0 : IF (try_fftw) THEN
1068 : message = "FFT library "//TRIM(globenv%default_fft_library)// &
1069 0 : " is not available. Trying FFT library FFTW3."
1070 0 : CPWARN(TRIM(message))
1071 0 : globenv%default_fft_library = "FFTW3"
1072 : CALL init_fft(fftlib=TRIM(globenv%default_fft_library), &
1073 : alltoall=section_get_lval(global_section, "ALLTOALL_SGL"), &
1074 : fftsg_sizes=.NOT. section_get_lval(global_section, "EXTENDED_FFT_LENGTHS"), &
1075 : pool_limit=globenv%fft_pool_scratch_limit, &
1076 : wisdom_file=globenv%fftw_wisdom_file_name, &
1077 0 : plan_style=globenv%fftw_plan_type)
1078 :
1079 0 : CALL fft3d(FWFFT, n, zz, status=stat)
1080 : END IF
1081 0 : IF (stat /= 0) THEN
1082 : message = "FFT library "//TRIM(globenv%default_fft_library)// &
1083 0 : " is not available. Trying FFT library FFTSG."
1084 0 : CPWARN(TRIM(message))
1085 0 : globenv%default_fft_library = "FFTSG"
1086 : CALL init_fft(fftlib=TRIM(globenv%default_fft_library), &
1087 : alltoall=section_get_lval(global_section, "ALLTOALL_SGL"), &
1088 : fftsg_sizes=.NOT. section_get_lval(global_section, "EXTENDED_FFT_LENGTHS"), &
1089 : pool_limit=globenv%fft_pool_scratch_limit, &
1090 : wisdom_file=globenv%fftw_wisdom_file_name, &
1091 0 : plan_style=globenv%fftw_plan_type)
1092 :
1093 0 : CALL fft3d(FWFFT, n, zz, status=stat)
1094 0 : IF (stat /= 0) THEN
1095 0 : CPABORT("FFT library FFTSG does not work. No FFT library available.")
1096 : END IF
1097 : END IF
1098 : END IF
1099 :
1100 9881 : END SUBROUTINE fft_setup_library
1101 :
1102 : ! **************************************************************************************************
1103 : !> \brief availability diagonalizatioon library
1104 : !>
1105 : !> \param globenv ...
1106 : !> \author MI
1107 : ! **************************************************************************************************
1108 9881 : SUBROUTINE diag_setup_library(globenv)
1109 : TYPE(global_environment_type), POINTER :: globenv
1110 :
1111 : CHARACTER(LEN=3*default_string_length) :: message
1112 : LOGICAL :: fallback_applied
1113 :
1114 : CALL diag_init(diag_lib=TRIM(globenv%diag_library), &
1115 : fallback_applied=fallback_applied, &
1116 : elpa_kernel=globenv%k_elpa, &
1117 : elpa_neigvec_min_input=globenv%elpa_neigvec_min, &
1118 : elpa_qr=globenv%elpa_qr, &
1119 : elpa_print=globenv%elpa_print, &
1120 : elpa_qr_unsafe=globenv%elpa_qr_unsafe, &
1121 : dlaf_neigvec_min_input=globenv%dlaf_neigvec_min, &
1122 9881 : eps_check_diag_input=globenv%eps_check_diag)
1123 :
1124 9881 : IF (fallback_applied) THEN
1125 : message = "Diagonalization library "//TRIM(globenv%diag_library)// &
1126 0 : " is not available. The ScaLAPACK library is used as fallback."
1127 0 : CPWARN(TRIM(message))
1128 : END IF
1129 :
1130 9881 : END SUBROUTINE diag_setup_library
1131 :
1132 : ! **************************************************************************************************
1133 : !> \brief ...
1134 : !> \param glob_section ...
1135 : ! **************************************************************************************************
1136 49405 : SUBROUTINE fm_setup(glob_section)
1137 : TYPE(section_vals_type), POINTER :: glob_section
1138 :
1139 : INTEGER :: mm_type, ncb, nrb
1140 : LOGICAL :: force_me
1141 : TYPE(section_vals_type), POINTER :: fm_section
1142 :
1143 9881 : fm_section => section_vals_get_subs_vals(glob_section, "FM")
1144 :
1145 9881 : CALL section_vals_val_get(fm_section, "NROW_BLOCKS", i_val=nrb)
1146 9881 : CALL section_vals_val_get(fm_section, "NCOL_BLOCKS", i_val=ncb)
1147 9881 : CALL section_vals_val_get(fm_section, "FORCE_BLOCK_SIZE", l_val=force_me)
1148 9881 : CALL cp_fm_struct_config(nrow_block=nrb, ncol_block=ncb, force_block=force_me)
1149 :
1150 9881 : CALL section_vals_val_get(fm_section, "TYPE_OF_MATRIX_MULTIPLICATION", i_val=mm_type)
1151 9881 : CALL cp_fm_setup(mm_type)
1152 :
1153 9881 : END SUBROUTINE fm_setup
1154 :
1155 : ! **************************************************************************************************
1156 : !> \brief ...
1157 : !> \param glob_section ...
1158 : ! **************************************************************************************************
1159 9881 : SUBROUTINE dgemm_setup(glob_section)
1160 : TYPE(section_vals_type), POINTER :: glob_section
1161 :
1162 : INTEGER :: dgemm_type
1163 :
1164 9881 : CALL section_vals_val_get(glob_section, "PREFERRED_DGEMM_LIBRARY", i_val=dgemm_type)
1165 :
1166 9881 : CALL local_gemm_set_library(dgemm_type)
1167 :
1168 9881 : END SUBROUTINE dgemm_setup
1169 :
1170 : ! **************************************************************************************************
1171 : !> \brief Parses the input section used to define the heuristic rules which determine if
1172 : !> a FM matrix should be redistributed before diagonalizing it.
1173 : !> \param glob_section the global input section
1174 : !> \author Nico Holmberg [01.2018]
1175 : ! **************************************************************************************************
1176 49405 : SUBROUTINE fm_diag_rules_setup(glob_section)
1177 : TYPE(section_vals_type), POINTER :: glob_section
1178 :
1179 : INTEGER :: a, x
1180 : LOGICAL :: elpa_force_redistribute, should_print
1181 : TYPE(section_vals_type), POINTER :: section
1182 :
1183 9881 : section => section_vals_get_subs_vals(glob_section, "FM_DIAG_SETTINGS")
1184 :
1185 9881 : CALL section_vals_val_get(section, "PARAMETER_A", i_val=a)
1186 9881 : CALL section_vals_val_get(section, "PARAMETER_X", i_val=x)
1187 9881 : CALL section_vals_val_get(section, "PRINT_FM_REDISTRIBUTE", l_val=should_print)
1188 9881 : CALL section_vals_val_get(section, "ELPA_FORCE_REDISTRIBUTE", l_val=elpa_force_redistribute)
1189 :
1190 9881 : CALL cp_fm_redistribute_init(a, x, should_print, elpa_force_redistribute)
1191 :
1192 9881 : END SUBROUTINE fm_diag_rules_setup
1193 : ! **************************************************************************************************
1194 : !> \brief reads the Walltime also in format HH:MM:SS
1195 : !> \param section ...
1196 : !> \param keyword_name ...
1197 : !> \param walltime ...
1198 : !> \par History
1199 : !> none
1200 : !> \author Mandes
1201 : ! **************************************************************************************************
1202 9901 : SUBROUTINE cp2k_get_walltime(section, keyword_name, walltime)
1203 : TYPE(section_vals_type), POINTER :: section
1204 : CHARACTER(LEN=*), INTENT(in) :: keyword_name
1205 : REAL(KIND=dp), INTENT(out) :: walltime
1206 :
1207 : CHARACTER(LEN=1) :: c1, c2
1208 : CHARACTER(LEN=100) :: txt
1209 : INTEGER :: hours, ierr, minutes, n, seconds
1210 :
1211 9901 : CALL section_vals_val_get(section, keyword_name, c_val=txt)
1212 9901 : n = LEN_TRIM(txt)
1213 :
1214 9901 : IF (n == 0) THEN
1215 9660 : walltime = -1.0_dp
1216 241 : ELSE IF (INDEX(txt, ":") == 0) THEN
1217 189 : READ (txt(1:n), FMT=*, IOSTAT=ierr) walltime
1218 189 : IF (ierr /= 0) CPABORT('Could not parse WALLTIME: "'//txt(1:n)//'"')
1219 : ELSE
1220 52 : READ (txt(1:n), FMT="(I2,A1,I2,A1,I2)", IOSTAT=ierr) hours, c1, minutes, c2, seconds
1221 52 : IF (n /= 8 .OR. ierr /= 0 .OR. c1 /= ":" .OR. c2 /= ":") &
1222 0 : CPABORT('Could not parse WALLTIME: "'//txt(1:n)//'"')
1223 52 : walltime = 3600.0_dp*REAL(hours, dp) + 60.0_dp*REAL(minutes, dp) + REAL(seconds, dp)
1224 : END IF
1225 9901 : END SUBROUTINE cp2k_get_walltime
1226 :
1227 : ! **************************************************************************************************
1228 : !> \brief Writes final timings and banner for CP2K
1229 : !> \param root_section ...
1230 : !> \param para_env ...
1231 : !> \param globenv ...
1232 : !> \param wdir ...
1233 : !> \param q_finalize ...
1234 : !> \par History
1235 : !> none
1236 : !> \author JGH,MK
1237 : !> \note
1238 : !> The following routines need to be synchronized wrt. adding/removing
1239 : !> of the default environments (logging, performance,error):
1240 : !> environment:cp2k_init, environment:cp2k_finalize,
1241 : !> f77_interface:f_env_add_defaults, f77_interface:f_env_rm_defaults,
1242 : !> f77_interface:create_force_env, f77_interface:destroy_force_env
1243 : ! **************************************************************************************************
1244 19762 : SUBROUTINE cp2k_finalize(root_section, para_env, globenv, wdir, q_finalize)
1245 :
1246 : TYPE(section_vals_type), POINTER :: root_section
1247 : TYPE(mp_para_env_type), POINTER :: para_env
1248 : TYPE(global_environment_type), POINTER :: globenv
1249 : CHARACTER(LEN=*), OPTIONAL :: wdir
1250 : LOGICAL, INTENT(IN), OPTIONAL :: q_finalize
1251 :
1252 : CHARACTER(LEN=default_path_length) :: cg_filename
1253 : INTEGER :: cg_mode, iw, unit_exit
1254 : LOGICAL :: delete_it, do_finalize, report_maxloc, &
1255 : sort_by_self_time
1256 : REAL(KIND=dp) :: r_timings
1257 : TYPE(cp_logger_type), POINTER :: logger
1258 :
1259 : ! Look if we inherited a failure, more care is needed if so
1260 : ! i.e. the input is most likely not available
1261 : ! Set flag if this is a development version
1262 :
1263 9881 : do_finalize = .TRUE.
1264 9881 : IF (PRESENT(q_finalize)) do_finalize = q_finalize
1265 : ! Clean up
1266 9881 : NULLIFY (logger)
1267 9881 : logger => cp_get_default_logger()
1268 9881 : IF (do_finalize) THEN
1269 9671 : CALL deallocate_spherical_harmonics()
1270 9671 : CALL deallocate_orbital_pointers()
1271 9671 : CALL deallocate_md_ftable()
1272 9671 : CALL diag_finalize()
1273 : ! finalize the fft (i.e. writes the wisdom if FFTW3 )
1274 9671 : CALL finalize_fft(para_env, globenv%fftw_wisdom_file_name)
1275 9671 : CALL finalize_libvori()
1276 : END IF
1277 :
1278 : ! Write message passing performance info
1279 :
1280 : iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%PROGRAM_RUN_INFO", &
1281 9881 : extension=".log")
1282 9881 : CALL describe_mp_perf_env(iw)
1283 : CALL cp_print_key_finished_output(iw, logger, root_section, &
1284 9881 : "GLOBAL%PROGRAM_RUN_INFO")
1285 :
1286 9881 : CALL collect_citations_from_ranks(para_env)
1287 : iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%REFERENCES", &
1288 9881 : extension=".Log")
1289 9881 : IF (iw > 0) THEN
1290 5036 : WRITE (UNIT=iw, FMT="(/,T2,A)") REPEAT("-", 79)
1291 5036 : WRITE (UNIT=iw, FMT="(T2,A,T80,A)") "-", "-"
1292 5036 : WRITE (UNIT=iw, FMT="(T2,A,T30,A,T80,A)") "-", "R E F E R E N C E S", "-"
1293 5036 : WRITE (UNIT=iw, FMT="(T2,A,T80,A)") "-", "-"
1294 5036 : WRITE (UNIT=iw, FMT="(T2,A)") REPEAT("-", 79)
1295 5036 : WRITE (UNIT=iw, FMT="(T2,A)") ""
1296 5036 : WRITE (UNIT=iw, FMT="(T2,A)") TRIM(cp2k_version)//", the CP2K developers group ("//TRIM(cp2k_year)//")."
1297 5036 : WRITE (UNIT=iw, FMT="(T2,A)") "CP2K is freely available from "//TRIM(cp2k_home)//" ."
1298 5036 : WRITE (UNIT=iw, FMT="(T2,A)") ""
1299 5036 : CALL print_cited_references(unit=iw)
1300 : END IF
1301 : CALL cp_print_key_finished_output(iw, logger, root_section, &
1302 9881 : "GLOBAL%REFERENCES")
1303 :
1304 9881 : CALL timestop(globenv%handle) ! corresponding the "CP2K" in cp2k_init
1305 :
1306 : iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%TIMINGS", &
1307 9881 : extension=".Log")
1308 9881 : r_timings = section_get_rval(root_section, "GLOBAL%TIMINGS%THRESHOLD")
1309 9881 : sort_by_self_time = section_get_lval(root_section, "GLOBAL%TIMINGS%SORT_BY_SELF_TIME")
1310 9881 : report_maxloc = section_get_lval(root_section, "GLOBAL%TIMINGS%REPORT_MAXLOC")
1311 9881 : IF (m_energy() /= 0.0_dp) THEN
1312 0 : CALL timings_report_print(iw, r_timings, sort_by_self_time, cost_type_energy, report_maxloc, para_env)
1313 : END IF
1314 9881 : CALL timings_report_print(iw, r_timings, sort_by_self_time, cost_type_time, report_maxloc, para_env)
1315 :
1316 : ! Write the callgraph, if desired by user
1317 9881 : CALL section_vals_val_get(root_section, "GLOBAL%CALLGRAPH", i_val=cg_mode)
1318 9881 : IF (cg_mode /= CALLGRAPH_NONE) THEN
1319 2 : CALL section_vals_val_get(root_section, "GLOBAL%CALLGRAPH_FILE_NAME", c_val=cg_filename)
1320 2 : IF (LEN_TRIM(cg_filename) == 0) cg_filename = TRIM(logger%iter_info%project_name)
1321 2 : IF (cg_mode == CALLGRAPH_ALL) & !incorporate mpi-rank into filename
1322 0 : cg_filename = TRIM(cg_filename)//"_"//TRIM(ADJUSTL(cp_to_string(para_env%mepos)))
1323 2 : IF (iw > 0) THEN
1324 1 : WRITE (UNIT=iw, FMT="(T2,3X,A)") "Writing callgraph to: "//TRIM(cg_filename)//".callgraph"
1325 1 : WRITE (UNIT=iw, FMT="()")
1326 1 : WRITE (UNIT=iw, FMT="(T2,A)") "-------------------------------------------------------------------------------"
1327 : END IF
1328 2 : IF (cg_mode == CALLGRAPH_ALL .OR. para_env%is_source()) &
1329 1 : CALL timings_report_callgraph(TRIM(cg_filename)//".callgraph")
1330 : END IF
1331 :
1332 : CALL cp_print_key_finished_output(iw, logger, root_section, &
1333 9881 : "GLOBAL%TIMINGS")
1334 :
1335 9881 : CALL rm_mp_perf_env()
1336 9881 : CALL rm_timer_env()
1337 :
1338 9881 : IF (para_env%is_source()) THEN
1339 : iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%PROGRAM_RUN_INFO", &
1340 5044 : extension=".log")
1341 :
1342 : ! Deleting (if existing) the external EXIT files
1343 5044 : delete_it = .FALSE.
1344 5044 : INQUIRE (FILE="EXIT", EXIST=delete_it)
1345 5044 : IF (delete_it) THEN
1346 0 : CALL open_file(file_name="EXIT", unit_number=unit_exit)
1347 0 : CALL close_file(unit_number=unit_exit, file_status="DELETE")
1348 : END IF
1349 :
1350 5044 : delete_it = .FALSE.
1351 5044 : INQUIRE (FILE=TRIM(logger%iter_info%project_name)//".EXIT", EXIST=delete_it)
1352 5044 : IF (delete_it) THEN
1353 0 : CALL open_file(file_name=TRIM(logger%iter_info%project_name)//".EXIT", unit_number=unit_exit)
1354 0 : CALL close_file(unit_number=unit_exit, file_status="DELETE")
1355 : END IF
1356 :
1357 : ! Print OpenMP issue counter and number of warnings for this workload
1358 5044 : IF (iw > 0) THEN
1359 5044 : IF (0 <= m_omp_trace_issues()) THEN
1360 0 : WRITE (iw, "(T2,A,I0)") "The number of traced issues for OpenMP : ", m_omp_trace_issues()
1361 : END IF
1362 5044 : WRITE (iw, "(T2,A,I0)") "The number of warnings for this run is : ", warning_counter
1363 5044 : WRITE (iw, *) ""
1364 5044 : WRITE (UNIT=iw, FMT="(T2,A)") REPEAT("-", 79)
1365 : END IF
1366 :
1367 : ! Update the runtime environment variables
1368 5044 : CALL get_runtime_info()
1369 :
1370 : ! Just a choice, do not print the CP2K footer if there is a failure
1371 5305 : CALL cp2k_footer(iw, wdir)
1372 5044 : IF (iw > 0) FLUSH (iw) ! ignore &GLOBAL / FLUSH_SHOULD_FLUSH
1373 :
1374 : CALL cp_print_key_finished_output(iw, logger, root_section, &
1375 5044 : "GLOBAL%PROGRAM_RUN_INFO")
1376 : END IF
1377 :
1378 : ! Release message passing environment
1379 9881 : CALL cp_rm_default_logger()
1380 :
1381 9881 : END SUBROUTINE cp2k_finalize
1382 :
1383 : END MODULE environment
|