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