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