LCOV - code coverage report
Current view: top level - src - environment.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:123285f) Lines: 88.6 % 599 531
Test Date: 2026-11-04 00:58:17 Functions: 100.0 % 15 15

            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
        

Generated by: LCOV version 2.0-1