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

            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 Utilities to set up the control types
      10              : ! **************************************************************************************************
      11              : MODULE cp_control_utils
      12              :    USE bibliography,                    ONLY: &
      13              :         Andreussi2012, Andreussi2019, Chai2025a, Dewar1977, Dewar1985, Elstner1998, Fattebert2002, &
      14              :         Grimme2017, Hu2007, Katbashev2025, Krack2000, Lippert1997, Lippert1999, Porezag1995, &
      15              :         Pracht2019, Repasky2002, Rocha2006, Schenter2008, Seifert1996, Souza2002, Stengel2009, &
      16              :         Stewart1989, Stewart2007, Thiel1992, Umari2002, VanVoorhis2015, VandeVondele2005a, &
      17              :         VandeVondele2005b, Yin2017, Zhechkov2005, cite_reference
      18              :    USE cell_types,                      ONLY: cell_transform_input_cartesian,&
      19              :                                               cell_type
      20              :    USE cp_control_types,                ONLY: &
      21              :         admm_control_create, admm_control_type, ddapc_control_create, ddapc_restraint_type, &
      22              :         dft_control_create, dft_control_type, efield_type, expot_control_create, &
      23              :         fde_control_create, maxwell_control_create, qs_control_type, rixs_control_type, &
      24              :         tddfpt2_control_type, xtb_control_type, xtb_reference_cli_type
      25              :    USE cp_files,                        ONLY: close_file,&
      26              :                                               open_file
      27              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      28              :                                               cp_logger_type
      29              :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      30              :                                               cp_print_key_unit_nr
      31              :    USE cp_parser_methods,               ONLY: parser_read_line
      32              :    USE cp_parser_types,                 ONLY: cp_parser_type,&
      33              :                                               parser_create,&
      34              :                                               parser_release,&
      35              :                                               parser_reset
      36              :    USE cp_spline_utils,                 ONLY: pw_interp
      37              :    USE cp_units,                        ONLY: cp_unit_from_cp2k,&
      38              :                                               cp_unit_to_cp2k
      39              :    USE eeq_input,                       ONLY: read_eeq_param
      40              :    USE force_fields_input,              ONLY: read_gp_section
      41              :    USE input_constants,                 ONLY: &
      42              :         admm1_type, admm2_type, admmp_type, admmq_type, admms_type, constant_env, custom_env, &
      43              :         do_admm_aux_exch_func_bee, do_admm_aux_exch_func_bee_libxc, do_admm_aux_exch_func_default, &
      44              :         do_admm_aux_exch_func_default_libxc, do_admm_aux_exch_func_none, &
      45              :         do_admm_aux_exch_func_opt, do_admm_aux_exch_func_opt_libxc, do_admm_aux_exch_func_pbex, &
      46              :         do_admm_aux_exch_func_pbex_libxc, do_admm_aux_exch_func_sx_libxc, &
      47              :         do_admm_basis_projection, do_admm_blocked_projection, do_admm_blocking_purify_full, &
      48              :         do_admm_charge_constrained_projection, do_admm_exch_scaling_merlot, &
      49              :         do_admm_exch_scaling_none, do_admm_purify_cauchy, do_admm_purify_cauchy_subspace, &
      50              :         do_admm_purify_mcweeny, do_admm_purify_mo_diag, do_admm_purify_mo_no_diag, &
      51              :         do_admm_purify_none, do_admm_purify_none_dm, do_ddapc_constraint, do_ddapc_restraint, &
      52              :         do_method_am1, do_method_dftb, do_method_gapw, do_method_gapw_xc, do_method_gpw, &
      53              :         do_method_lrigpw, do_method_mndo, do_method_mndod, do_method_ofgpw, do_method_pdg, &
      54              :         do_method_pm3, do_method_pm6, do_method_pm6fm, do_method_pnnl, do_method_rigpw, &
      55              :         do_method_rm1, do_method_xtb, do_pwgrid_ns_fullspace, do_pwgrid_ns_halfspace, &
      56              :         do_pwgrid_spherical, do_s2_constraint, do_s2_restraint, do_se_is_kdso, do_se_is_kdso_d, &
      57              :         do_se_is_slater, do_se_lr_ewald, do_se_lr_ewald_gks, do_se_lr_ewald_r3, do_se_lr_none, &
      58              :         gapw_1c_large, gapw_1c_medium, gapw_1c_orb, gapw_1c_small, gapw_1c_very_large, &
      59              :         gaussian_env, gfn1xtb, gfn_tblite, kg_tnadd_embed, kg_tnadd_embed_ri, no_admm_type, &
      60              :         numerical, ramp_env, real_time_propagation, rtp_method_bse, rtp_method_bse_linearized, &
      61              :         sccs_andreussi, sccs_derivative_cd3, sccs_derivative_cd5, sccs_derivative_cd7, &
      62              :         sccs_derivative_fft, sccs_fattebert_gygi, sccs_saa_andreussi, sic_ad, sic_eo, &
      63              :         sic_list_all, sic_list_unpaired, sic_mauri_spz, sic_mauri_us, sic_none, slater, &
      64              :         tblite_cli_born_kernel_auto, tblite_cli_solution_state_gsolv, tblite_cli_solvation_alpb, &
      65              :         tblite_cli_solvation_cpcm, tblite_cli_solvation_gb, tblite_cli_solvation_gbe, &
      66              :         tblite_cli_solvation_gbsa, tblite_guess_ceh, tblite_mixer_memory_inherit, &
      67              :         tblite_scc_mixer_auto, tblite_scc_mixer_cp2k, tblite_scc_mixer_none, &
      68              :         tblite_scc_mixer_tblite, tblite_solver_gvd, tblite_solver_gvr, tddfpt_dipole_length, &
      69              :         tddfpt_kernel_stda, use_mom_ref_user, xtb_vdw_type_d3, xtb_vdw_type_d4, xtb_vdw_type_none
      70              :    USE input_cp2k_check,                ONLY: xc_functionals_expand
      71              :    USE input_cp2k_dft,                  ONLY: create_dft_section
      72              :    USE input_enumeration_types,         ONLY: enum_i2c,&
      73              :                                               enumeration_type
      74              :    USE input_keyword_types,             ONLY: keyword_get,&
      75              :                                               keyword_type
      76              :    USE input_section_types,             ONLY: &
      77              :         section_get_ival, section_get_keyword, section_release, section_type, section_vals_get, &
      78              :         section_vals_get_subs_vals, section_vals_type, section_vals_val_get, section_vals_val_set
      79              :    USE kinds,                           ONLY: default_path_length,&
      80              :                                               default_string_length,&
      81              :                                               dp
      82              :    USE mathconstants,                   ONLY: fourpi
      83              :    USE pair_potential_types,            ONLY: pair_potential_reallocate
      84              :    USE periodic_table,                  ONLY: get_ptable_info
      85              :    USE qs_cdft_utils,                   ONLY: read_cdft_control_section
      86              :    USE smeagol_control_types,           ONLY: read_smeagol_control
      87              :    USE string_utilities,                ONLY: uppercase
      88              :    USE util,                            ONLY: sort
      89              :    USE xas_tdp_types,                   ONLY: read_xas_tdp_control
      90              :    USE xc,                              ONLY: xc_uses_kinetic_energy_density,&
      91              :                                               xc_uses_norm_drho
      92              :    USE xc_input_constants,              ONLY: xc_deriv_collocate
      93              :    USE xc_write_output,                 ONLY: xc_write
      94              : #include "./base/base_uses.f90"
      95              : 
      96              :    IMPLICIT NONE
      97              : 
      98              :    PRIVATE
      99              : 
     100              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'cp_control_utils'
     101              : 
     102              :    PUBLIC :: read_dft_control, &
     103              :              read_rixs_control, &
     104              :              read_mgrid_section, &
     105              :              read_qs_section, &
     106              :              read_tddfpt2_control, &
     107              :              write_dft_control, &
     108              :              write_qs_control, &
     109              :              write_admm_control, &
     110              :              read_ddapc_section
     111              : CONTAINS
     112              : 
     113              : ! **************************************************************************************************
     114              : !> \brief ...
     115              : !> \param dft_control ...
     116              : !> \param dft_section ...
     117              : !> \param cell ...
     118              : ! **************************************************************************************************
     119       177156 :    SUBROUTINE read_dft_control(dft_control, dft_section, cell)
     120              :       TYPE(dft_control_type), POINTER                    :: dft_control
     121              :       TYPE(section_vals_type), POINTER                   :: dft_section
     122              :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell
     123              : 
     124              :       CHARACTER(len=default_path_length)                 :: basis_set_file_name, gauxc_model_name, &
     125              :                                                             intensities_file_name, &
     126              :                                                             potential_file_name
     127              :       CHARACTER(LEN=default_string_length)               :: line
     128              :       CHARACTER(LEN=default_string_length), &
     129         9324 :          DIMENSION(:), POINTER                           :: tmpstringlist
     130              :       INTEGER                                            :: admmtype, i_rep, ios, irep, isize, &
     131              :                                                             kg_tnadd_method, method_id, n_rep, &
     132              :                                                             nrep, xc_deriv_method_id
     133              :       LOGICAL :: at_end, do_hfx, do_ot, do_rpa_admm, do_rtp, exopt1, exopt2, exopt3, explicit, &
     134              :          is_present, l_param, local_moment_possible, native_skala_grid, not_SE, was_present
     135              :       REAL(KIND=dp)                                      :: density_cut, gradient_cut, tau_cut
     136         9324 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: pol
     137              :       TYPE(cp_logger_type), POINTER                      :: logger
     138              :       TYPE(cp_parser_type)                               :: parser
     139              :       TYPE(section_vals_type), POINTER :: hairy_probes_section, hfx_section, kg_xc_fun_section, &
     140              :          kg_xc_section, maxwell_section, sccs_section, scf_section, tmp_section, xc_fun_section, &
     141              :          xc_gauxc_subsection, xc_section
     142              : 
     143         9324 :       was_present = .FALSE.
     144              : 
     145         9324 :       logger => cp_get_default_logger()
     146              : 
     147         9324 :       NULLIFY (kg_xc_fun_section, kg_xc_section, tmp_section, xc_fun_section, xc_section, xc_gauxc_subsection)
     148        46620 :       ALLOCATE (dft_control)
     149         9324 :       CALL dft_control_create(dft_control)
     150              :       ! determine wheather this is a semiempirical or DFTB run
     151              :       ! --> (no XC section needs to be provided)
     152         9324 :       not_SE = .TRUE.
     153         9324 :       CALL section_vals_val_get(dft_section, "QS%METHOD", i_val=method_id)
     154         2528 :       SELECT CASE (method_id)
     155              :       CASE (do_method_dftb, do_method_xtb, do_method_mndo, do_method_am1, do_method_pm3, do_method_pnnl, &
     156              :             do_method_pm6, do_method_pm6fm, do_method_pdg, do_method_rm1, do_method_mndod)
     157         9324 :          not_SE = .FALSE.
     158              :       END SELECT
     159              :       ! Check for XC section and XC_FUNCTIONAL section
     160         9324 :       xc_section => section_vals_get_subs_vals(dft_section, "XC")
     161         9324 :       CALL section_vals_get(xc_section, explicit=is_present)
     162         9324 :       IF (.NOT. is_present .AND. not_SE) THEN
     163            0 :          CPABORT("XC section missing.")
     164              :       END IF
     165         9324 :       IF (is_present) THEN
     166         6812 :          CALL section_vals_val_get(xc_section, "density_cutoff", r_val=density_cut)
     167         6812 :          CALL section_vals_val_get(xc_section, "gradient_cutoff", r_val=gradient_cut)
     168         6812 :          CALL section_vals_val_get(xc_section, "tau_cutoff", r_val=tau_cut)
     169              :          ! Perform numerical stability checks and possibly correct the issues
     170         6812 :          IF (density_cut <= EPSILON(0.0_dp)*100.0_dp) THEN
     171              :             CALL cp_warn(__LOCATION__, &
     172              :                          "DENSITY_CUTOFF lower than 100*EPSILON, where EPSILON is the machine precision. "// &
     173            0 :                          "This may lead to numerical problems. Setting up shake_tol to 100*EPSILON! ")
     174              :          END IF
     175         6812 :          density_cut = MAX(EPSILON(0.0_dp)*100.0_dp, density_cut)
     176         6812 :          IF (gradient_cut <= EPSILON(0.0_dp)*100.0_dp) THEN
     177              :             CALL cp_warn(__LOCATION__, &
     178              :                          "GRADIENT_CUTOFF lower than 100*EPSILON, where EPSILON is the machine precision. "// &
     179            0 :                          "This may lead to numerical problems. Setting up shake_tol to 100*EPSILON! ")
     180              :          END IF
     181         6812 :          gradient_cut = MAX(EPSILON(0.0_dp)*100.0_dp, gradient_cut)
     182         6812 :          IF (tau_cut <= EPSILON(0.0_dp)*100.0_dp) THEN
     183              :             CALL cp_warn(__LOCATION__, &
     184              :                          "TAU_CUTOFF lower than 100*EPSILON, where EPSILON is the machine precision. "// &
     185            0 :                          "This may lead to numerical problems. Setting up shake_tol to 100*EPSILON! ")
     186              :          END IF
     187         6812 :          tau_cut = MAX(EPSILON(0.0_dp)*100.0_dp, tau_cut)
     188         6812 :          CALL section_vals_val_set(xc_section, "density_cutoff", r_val=density_cut)
     189         6812 :          CALL section_vals_val_set(xc_section, "gradient_cutoff", r_val=gradient_cut)
     190         6812 :          CALL section_vals_val_set(xc_section, "tau_cutoff", r_val=tau_cut)
     191              :       END IF
     192         9324 :       xc_fun_section => section_vals_get_subs_vals(xc_section, "XC_FUNCTIONAL")
     193         9324 :       CALL section_vals_get(xc_fun_section, explicit=is_present)
     194         9324 :       IF (.NOT. is_present .AND. not_SE) THEN
     195            0 :          CPABORT("XC_FUNCTIONAL section missing.")
     196              :       END IF
     197              : 
     198         9324 :       dft_control%use_gauxc = .FALSE.
     199         9324 :       IF (is_present) THEN
     200         6812 :          xc_gauxc_subsection => section_vals_get_subs_vals(xc_fun_section, "GAUXC")
     201         6812 :          CALL section_vals_get(xc_gauxc_subsection, explicit=dft_control%use_gauxc)
     202              :       END IF
     203              : 
     204         9324 :       scf_section => section_vals_get_subs_vals(dft_section, "SCF")
     205         9324 :       CALL section_vals_val_get(dft_section, "UKS", l_val=dft_control%uks)
     206         9324 :       CALL section_vals_val_get(dft_section, "ROKS", l_val=dft_control%roks)
     207         9324 :       IF (dft_control%uks .OR. dft_control%roks) THEN
     208         1971 :          dft_control%nspins = 2
     209              :       ELSE
     210         7353 :          dft_control%nspins = 1
     211              :       END IF
     212              : 
     213         9324 :       dft_control%lsd = (dft_control%nspins > 1)
     214         9324 :       dft_control%use_kinetic_energy_density = xc_uses_kinetic_energy_density(xc_fun_section, dft_control%lsd)
     215         9324 :       IF (dft_control%use_gauxc) THEN
     216              :          native_skala_grid = .FALSE.
     217          148 :          CALL section_vals_val_get(xc_gauxc_subsection, "NATIVE_GRID", l_val=native_skala_grid)
     218          148 :          CALL section_vals_val_get(xc_gauxc_subsection, "MODEL", c_val=gauxc_model_name)
     219          148 :          gauxc_model_name = ADJUSTL(gauxc_model_name)
     220          148 :          CALL uppercase(gauxc_model_name)
     221          148 :          IF (native_skala_grid .OR. &
     222              :              (TRIM(gauxc_model_name) /= "" .AND. TRIM(gauxc_model_name) /= "NONE")) THEN
     223          136 :             dft_control%use_kinetic_energy_density = .TRUE.
     224              :          END IF
     225              :       END IF
     226         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "KG_METHOD")
     227         9324 :       CALL section_vals_get(tmp_section, explicit=explicit)
     228         9324 :       IF (explicit) THEN
     229           84 :          CALL section_vals_val_get(tmp_section, "TNADD_METHOD", i_val=kg_tnadd_method)
     230           84 :          IF (kg_tnadd_method == kg_tnadd_embed .OR. kg_tnadd_method == kg_tnadd_embed_ri) THEN
     231           66 :             kg_xc_section => section_vals_get_subs_vals(tmp_section, "XC")
     232           66 :             kg_xc_fun_section => section_vals_get_subs_vals(kg_xc_section, "XC_FUNCTIONAL")
     233           66 :             CALL section_vals_get(kg_xc_fun_section, explicit=is_present)
     234           66 :             IF (is_present) THEN
     235              :                dft_control%use_kinetic_energy_density = dft_control%use_kinetic_energy_density .OR. &
     236              :                                                         xc_uses_kinetic_energy_density(kg_xc_fun_section, &
     237           70 :                                                                                        dft_control%lsd)
     238              :             END IF
     239              :          END IF
     240              :       END IF
     241              : 
     242         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "FDE")
     243         9324 :       CALL section_vals_get(tmp_section, explicit=explicit)
     244         9324 :       IF (explicit) THEN
     245            2 :          CALL section_vals_val_get(tmp_section, "_SECTION_PARAMETERS_", l_val=dft_control%do_fde)
     246              :       END IF
     247         9324 :       IF (dft_control%do_fde) THEN
     248            2 :          CALL fde_control_create(dft_control%fde_control)
     249              :          ASSOCIATE (fde => dft_control%fde_control)
     250            2 :             CALL section_vals_val_get(tmp_section, "FREEZE_AND_THAW", l_val=fde%freeze_and_thaw)
     251            2 :             CALL section_vals_val_get(tmp_section, "MAX_FT_ITER", i_val=fde%max_ft_iter)
     252            2 :             CALL section_vals_val_get(tmp_section, "EPS_FT_DENSITY", r_val=fde%eps_ft_density)
     253            2 :             CALL section_vals_val_get(tmp_section, "EPS_FT_ENERGY", r_val=fde%eps_ft_energy)
     254            2 :             CALL section_vals_val_get(tmp_section, "DENSITY_MIXING", r_val=fde%density_mixing)
     255            2 :             CALL section_vals_val_get(tmp_section, "COMMAND", c_val=fde%command)
     256            2 :             CALL section_vals_val_get(tmp_section, "PROJECT", c_val=fde%project)
     257            2 :             CALL section_vals_val_get(tmp_section, "WORKDIR", c_val=fde%workdir)
     258            2 :             CALL section_vals_val_get(tmp_section, "MOLCAS_INPUT_TEMPLATE", c_val=fde%molcas_input_template)
     259            2 :             CALL section_vals_val_get(tmp_section, "POT_FILE", c_val=fde%pot_file)
     260            2 :             CALL section_vals_val_get(tmp_section, "GRID_FILE", c_val=fde%grid_file)
     261            2 :             CALL section_vals_val_get(tmp_section, "RHO_FILE", c_val=fde%rho_file)
     262            4 :             CALL section_vals_val_get(tmp_section, "RESULT_FILE", c_val=fde%result_file)
     263              :          END ASSOCIATE
     264              :       END IF
     265              : 
     266         9324 :       xc_deriv_method_id = section_get_ival(xc_section, "XC_GRID%XC_DERIV")
     267              :       dft_control%drho_by_collocation = (xc_uses_norm_drho(xc_fun_section, dft_control%lsd) &
     268         9324 :                                          .AND. (xc_deriv_method_id == xc_deriv_collocate))
     269         9324 :       IF (dft_control%drho_by_collocation) THEN
     270            0 :          CPABORT("derivatives by collocation not implemented")
     271              :       END IF
     272              : 
     273              :       ! Automatic auxiliary basis set generation
     274         9324 :       CALL section_vals_val_get(dft_section, "AUTO_BASIS", n_rep_val=nrep)
     275        18648 :       DO irep = 1, nrep
     276         9324 :          CALL section_vals_val_get(dft_section, "AUTO_BASIS", i_rep_val=irep, c_vals=tmpstringlist)
     277        18648 :          IF (SIZE(tmpstringlist) == 2) THEN
     278         9324 :             CALL uppercase(tmpstringlist(2))
     279        18488 :             SELECT CASE (tmpstringlist(2))
     280              :             CASE ("X")
     281         9164 :                SELECT CASE (tmpstringlist(1))
     282              :                CASE ("X")
     283              :                   ! Do nothing
     284              :                CASE DEFAULT
     285              :                   CALL cp_abort(__LOCATION__, &
     286              :                                 "AUTO_BASIS: the size <X> is invalid for the "// &
     287              :                                 "type <"//TRIM(ADJUSTL(tmpstringlist(1)))//">; "// &
     288              :                                 "use one of SMALL, MEDIUM, LARGE, HUGE for "// &
     289              :                                 "the size. The syntax AUTO_BASIS X X is a "// &
     290              :                                 "reserved case for using NO automatically "// &
     291         9164 :                                 "generated basis sets.")
     292              :                END SELECT
     293              :             CASE ("SMALL")
     294           54 :                isize = 0
     295              :             CASE ("MEDIUM")
     296           54 :                isize = 1
     297              :             CASE ("LARGE")
     298            0 :                isize = 2
     299              :             CASE ("HUGE")
     300            8 :                isize = 3
     301              :             CASE DEFAULT
     302         9324 :                CPWARN("Unknown basis size in AUTO_BASIS keyword:"//TRIM(tmpstringlist(1)))
     303              :             END SELECT
     304              :             !
     305         9326 :             SELECT CASE (tmpstringlist(1))
     306              :             CASE ("X")
     307              :             CASE ("RI_AUX")
     308            2 :                dft_control%auto_basis_ri_aux = isize
     309              :             CASE ("AUX_FIT")
     310            0 :                dft_control%auto_basis_aux_fit = isize
     311              :             CASE ("LRI_AUX")
     312            0 :                dft_control%auto_basis_lri_aux = isize
     313              :             CASE ("P_LRI_AUX")
     314            0 :                dft_control%auto_basis_p_lri_aux = isize
     315              :             CASE ("RI_HXC")
     316            0 :                dft_control%auto_basis_ri_hxc = isize
     317              :             CASE ("RI_XAS")
     318           64 :                dft_control%auto_basis_ri_xas = isize
     319              :             CASE ("RI_HFX")
     320           94 :                dft_control%auto_basis_ri_hfx = isize
     321              :             CASE DEFAULT
     322         9324 :                CPWARN("Unknown basis type in AUTO_BASIS keyword:"//TRIM(tmpstringlist(1)))
     323              :             END SELECT
     324              :          ELSE
     325              :             CALL cp_abort(__LOCATION__, &
     326            0 :                           "AUTO_BASIS keyword in &DFT section has a wrong number of arguments.")
     327              :          END IF
     328              :       END DO
     329              : 
     330              :       !! check if we do wavefunction fitting
     331         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD")
     332         9324 :       CALL section_vals_get(tmp_section, explicit=is_present)
     333              :       !
     334         9324 :       hfx_section => section_vals_get_subs_vals(xc_section, "HF")
     335         9324 :       CALL section_vals_get(hfx_section, explicit=do_hfx)
     336         9324 :       CALL section_vals_val_get(xc_section, "WF_CORRELATION%RI_RPA%ADMM", l_val=do_rpa_admm)
     337         9324 :       is_present = is_present .AND. (do_hfx .OR. do_rpa_admm)
     338              :       !
     339         9324 :       dft_control%do_admm = is_present
     340         9324 :       dft_control%do_admm_mo = .FALSE.
     341         9324 :       dft_control%do_admm_dm = .FALSE.
     342         9324 :       IF (is_present) THEN
     343              :          do_ot = .FALSE.
     344          532 :          CALL section_vals_val_get(scf_section, "OT%_SECTION_PARAMETERS_", l_val=do_ot)
     345          532 :          CALL admm_control_create(dft_control%admm_control)
     346              : 
     347          532 :          CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%ADMM_TYPE", i_val=admmtype)
     348          532 :          CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%ADMM_PURIFICATION_METHOD", explicit=exopt1)
     349          532 :          CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%METHOD", explicit=exopt2)
     350          532 :          CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%EXCH_SCALING_MODEL", explicit=exopt3)
     351          532 :          dft_control%admm_control%admm_type = admmtype
     352          514 :          SELECT CASE (admmtype)
     353              :          CASE (no_admm_type)
     354          514 :             CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%ADMM_PURIFICATION_METHOD", i_val=method_id)
     355          514 :             dft_control%admm_control%purification_method = method_id
     356          514 :             CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%METHOD", i_val=method_id)
     357          514 :             dft_control%admm_control%method = method_id
     358          514 :             CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%EXCH_SCALING_MODEL", i_val=method_id)
     359          514 :             dft_control%admm_control%scaling_model = method_id
     360              :          CASE (admm1_type)
     361              :             ! METHOD BASIS_PROJECTION
     362              :             ! ADMM_PURIFICATION_METHOD choose
     363              :             ! EXCH_SCALING_MODEL NONE
     364            4 :             CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%ADMM_PURIFICATION_METHOD", i_val=method_id)
     365            4 :             dft_control%admm_control%purification_method = method_id
     366            4 :             dft_control%admm_control%method = do_admm_basis_projection
     367            4 :             dft_control%admm_control%scaling_model = do_admm_exch_scaling_none
     368              :          CASE (admm2_type)
     369              :             ! METHOD BASIS_PROJECTION
     370              :             ! ADMM_PURIFICATION_METHOD NONE
     371              :             ! EXCH_SCALING_MODEL NONE
     372            2 :             dft_control%admm_control%purification_method = do_admm_purify_none
     373            2 :             dft_control%admm_control%method = do_admm_basis_projection
     374            2 :             dft_control%admm_control%scaling_model = do_admm_exch_scaling_none
     375              :          CASE (admms_type)
     376              :             ! ADMM_PURIFICATION_METHOD NONE
     377              :             ! METHOD CHARGE_CONSTRAINED_PROJECTION
     378              :             ! EXCH_SCALING_MODEL MERLOT
     379            8 :             dft_control%admm_control%purification_method = do_admm_purify_none
     380            8 :             dft_control%admm_control%method = do_admm_charge_constrained_projection
     381            8 :             dft_control%admm_control%scaling_model = do_admm_exch_scaling_merlot
     382              :          CASE (admmp_type)
     383              :             ! ADMM_PURIFICATION_METHOD NONE
     384              :             ! METHOD BASIS_PROJECTION
     385              :             ! EXCH_SCALING_MODEL MERLOT
     386            2 :             dft_control%admm_control%purification_method = do_admm_purify_none
     387            2 :             dft_control%admm_control%method = do_admm_basis_projection
     388            2 :             dft_control%admm_control%scaling_model = do_admm_exch_scaling_merlot
     389              :          CASE (admmq_type)
     390              :             ! ADMM_PURIFICATION_METHOD NONE
     391              :             ! METHOD CHARGE_CONSTRAINED_PROJECTION
     392              :             ! EXCH_SCALING_MODEL NONE
     393            2 :             dft_control%admm_control%purification_method = do_admm_purify_none
     394            2 :             dft_control%admm_control%method = do_admm_charge_constrained_projection
     395            2 :             dft_control%admm_control%scaling_model = do_admm_exch_scaling_none
     396              :          CASE DEFAULT
     397              :             CALL cp_abort(__LOCATION__, &
     398          532 :                           "ADMM_TYPE keyword in &AUXILIARY_DENSITY_MATRIX_METHOD section has a wrong value.")
     399              :          END SELECT
     400              : 
     401              :          CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%EPS_FILTER", &
     402          532 :                                    r_val=dft_control%admm_control%eps_filter)
     403              : 
     404          532 :          CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%EXCH_CORRECTION_FUNC", i_val=method_id)
     405          532 :          dft_control%admm_control%aux_exch_func = method_id
     406              : 
     407              :          ! parameters for X functional
     408          532 :          dft_control%admm_control%aux_exch_func_param = .FALSE.
     409              :          CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%OPTX_A1", explicit=explicit, &
     410          532 :                                    r_val=dft_control%admm_control%aux_x_param(1))
     411          532 :          IF (explicit) dft_control%admm_control%aux_exch_func_param = .TRUE.
     412              :          CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%OPTX_A2", explicit=explicit, &
     413          532 :                                    r_val=dft_control%admm_control%aux_x_param(2))
     414          532 :          IF (explicit) dft_control%admm_control%aux_exch_func_param = .TRUE.
     415              :          CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%OPTX_GAMMA", explicit=explicit, &
     416          532 :                                    r_val=dft_control%admm_control%aux_x_param(3))
     417          532 :          IF (explicit) dft_control%admm_control%aux_exch_func_param = .TRUE.
     418              : 
     419          532 :          CALL read_admm_block_list(dft_control%admm_control, dft_section)
     420              : 
     421              :          ! check for double assignments
     422            2 :          SELECT CASE (admmtype)
     423              :          CASE (admm2_type)
     424            2 :             IF (exopt2) CALL cp_warn(__LOCATION__, &
     425            0 :                                      "Value of ADMM_PURIFICATION_METHOD keyword will be overwritten with ADMM_TYPE selections.")
     426            2 :             IF (exopt3) CALL cp_warn(__LOCATION__, &
     427            0 :                                      "Value of EXCH_SCALING_MODEL keyword will be overwritten with ADMM_TYPE selections.")
     428              :          CASE (admm1_type, admms_type, admmp_type, admmq_type)
     429           16 :             IF (exopt1) CALL cp_warn(__LOCATION__, &
     430            2 :                                      "Value of METHOD keyword will be overwritten with ADMM_TYPE selections.")
     431           16 :             IF (exopt2) CALL cp_warn(__LOCATION__, &
     432            2 :                                      "Value of METHOD keyword will be overwritten with ADMM_TYPE selections.")
     433           16 :             IF (exopt3) CALL cp_warn(__LOCATION__, &
     434          532 :                                      "Value of EXCH_SCALING_MODEL keyword will be overwritten with ADMM_TYPE selections.")
     435              :          END SELECT
     436              : 
     437              :          !    In the case of charge-constrained projection (e.g. according to Merlot),
     438              :          !    there is no purification needed and hence, do_admm_purify_none has to be set.
     439              : 
     440              :          IF ((dft_control%admm_control%method == do_admm_blocking_purify_full .OR. &
     441              :               dft_control%admm_control%method == do_admm_blocked_projection) &
     442          532 :              .AND. dft_control%admm_control%scaling_model == do_admm_exch_scaling_merlot) THEN
     443            0 :             CPABORT("ADMM: Blocking and Merlot scaling are mutually exclusive.")
     444              :          END IF
     445              : 
     446          532 :          IF (dft_control%admm_control%method == do_admm_charge_constrained_projection .AND. &
     447              :              dft_control%admm_control%purification_method /= do_admm_purify_none) THEN
     448              :             CALL cp_abort(__LOCATION__, &
     449              :                           "ADMM: In the case of METHOD=CHARGE_CONSTRAINED_PROJECTION, "// &
     450            0 :                           "ADMM_PURIFICATION_METHOD=NONE has to be set.")
     451              :          END IF
     452              : 
     453          532 :          IF (dft_control%admm_control%purification_method == do_admm_purify_mo_diag .OR. &
     454              :              dft_control%admm_control%purification_method == do_admm_purify_mo_no_diag) THEN
     455           64 :             IF (dft_control%admm_control%method /= do_admm_basis_projection) THEN
     456            0 :                CPABORT("ADMM: Chosen purification requires BASIS_PROJECTION")
     457              :             END IF
     458              : 
     459           64 :             IF (.NOT. do_ot) CPABORT("ADMM: MO-based purification requires OT.")
     460              :          END IF
     461              : 
     462          532 :          IF (dft_control%admm_control%purification_method == do_admm_purify_none_dm .OR. &
     463              :              dft_control%admm_control%purification_method == do_admm_purify_mcweeny) THEN
     464           14 :             dft_control%do_admm_dm = .TRUE.
     465              :          ELSE
     466          518 :             dft_control%do_admm_mo = .TRUE.
     467              :          END IF
     468              :       END IF
     469              : 
     470              :       ! Set restricted to true, if both OT and ROKS are requested
     471              :       !MK in principle dft_control%restricted could be dropped completely like the
     472              :       !MK input key by using only dft_control%roks now
     473         9324 :       CALL section_vals_val_get(scf_section, "OT%_SECTION_PARAMETERS_", l_val=l_param)
     474         9324 :       dft_control%restricted = (dft_control%roks .AND. l_param)
     475              : 
     476         9324 :       CALL section_vals_val_get(dft_section, "CHARGE", i_val=dft_control%charge)
     477         9324 :       CALL section_vals_val_get(dft_section, "MULTIPLICITY", i_val=dft_control%multiplicity)
     478         9324 :       CALL section_vals_val_get(dft_section, "RELAX_MULTIPLICITY", r_val=dft_control%relax_multiplicity)
     479         9324 :       IF (dft_control%relax_multiplicity > 0.0_dp) THEN
     480           10 :          IF (.NOT. dft_control%uks) THEN
     481              :             CALL cp_abort(__LOCATION__, "The option RELAX_MULTIPLICITY is only valid for "// &
     482            0 :                           "unrestricted Kohn-Sham (UKS) calculations")
     483              :          END IF
     484              :       END IF
     485              : 
     486              :       !Read the HAIR PROBES input section if present
     487         9324 :       hairy_probes_section => section_vals_get_subs_vals(dft_section, "HAIRY_PROBES")
     488         9324 :       CALL section_vals_get(hairy_probes_section, n_repetition=nrep, explicit=is_present)
     489              : 
     490         9324 :       IF (is_present) THEN
     491            4 :          dft_control%hairy_probes = .TRUE.
     492           20 :          ALLOCATE (dft_control%probe(nrep))
     493            4 :          CALL read_hairy_probes_sections(dft_control, hairy_probes_section)
     494              :       END IF
     495              : 
     496              :       ! check for the presence of the low spin roks section
     497         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "LOW_SPIN_ROKS")
     498         9324 :       CALL section_vals_get(tmp_section, explicit=dft_control%low_spin_roks)
     499              : 
     500         9324 :       dft_control%sic_method_id = sic_none
     501         9324 :       dft_control%sic_scaling_a = 1.0_dp
     502         9324 :       dft_control%sic_scaling_b = 1.0_dp
     503              : 
     504              :       ! DFT+U
     505         9324 :       dft_control%dft_plus_u = .FALSE.
     506         9324 :       CALL section_vals_val_get(dft_section, "PLUS_U_METHOD", i_val=method_id)
     507         9324 :       dft_control%plus_u_method_id = method_id
     508              : 
     509              :       ! Minimum tracking linear response U and J
     510         9324 :       CALL section_vals_val_get(dft_section, "EPS_U_J_LOOP", r_val=dft_control%eps_u_j_loop)
     511         9324 :       CALL section_vals_val_get(dft_section, "MAX_MTLR_LOOP", i_val=dft_control%max_mtlr_iter)
     512              :       CALL section_vals_val_get(dft_section, "MTLR_REFERENCE_SCF", &
     513         9324 :                                 explicit=dft_control%mtlr_reference_scf_explicit)
     514         9324 :       IF (dft_control%mtlr_reference_scf_explicit) THEN
     515              :          CALL section_vals_val_get(dft_section, "MTLR_REFERENCE_SCF", &
     516           10 :                                    l_val=dft_control%mtlr_reference_scf)
     517              :       END IF
     518              : 
     519              :       ! Smearing in use
     520         9324 :       dft_control%smear = .FALSE.
     521              : 
     522              :       ! Surface dipole correction
     523         9324 :       dft_control%correct_surf_dip = .FALSE.
     524         9324 :       CALL section_vals_val_get(dft_section, "SURFACE_DIPOLE_CORRECTION", l_val=dft_control%correct_surf_dip)
     525         9324 :       CALL section_vals_val_get(dft_section, "SURF_DIP_DIR", i_val=dft_control%dir_surf_dip)
     526         9324 :       dft_control%pos_dir_surf_dip = -1.0_dp
     527         9324 :       CALL section_vals_val_get(dft_section, "SURF_DIP_POS", r_val=dft_control%pos_dir_surf_dip)
     528              :       ! another logical variable, surf_dip_correct_switch, is introduced for
     529              :       ! implementation of "SURF_DIP_SWITCH" [SGh]
     530         9324 :       dft_control%switch_surf_dip = .FALSE.
     531         9324 :       dft_control%surf_dip_correct_switch = dft_control%correct_surf_dip
     532         9324 :       CALL section_vals_val_get(dft_section, "SURF_DIP_SWITCH", l_val=dft_control%switch_surf_dip)
     533         9324 :       dft_control%correct_el_density_dip = .FALSE.
     534         9324 :       CALL section_vals_val_get(dft_section, "CORE_CORR_DIP", l_val=dft_control%correct_el_density_dip)
     535         9324 :       IF (dft_control%correct_el_density_dip) THEN
     536            4 :          IF (dft_control%correct_surf_dip) THEN
     537              :             ! Do nothing, move on
     538              :          ELSE
     539            0 :             dft_control%correct_el_density_dip = .FALSE.
     540            0 :             CPWARN("CORE_CORR_DIP keyword is activated only if SURFACE_DIPOLE_CORRECTION is TRUE")
     541              :          END IF
     542              :       END IF
     543              : 
     544              :       CALL section_vals_val_get(dft_section, "BASIS_SET_FILE_NAME", &
     545         9324 :                                 c_val=basis_set_file_name)
     546              :       CALL section_vals_val_get(dft_section, "POTENTIAL_FILE_NAME", &
     547         9324 :                                 c_val=potential_file_name)
     548              : 
     549              :       ! Read the input section
     550         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "sic")
     551              :       CALL section_vals_val_get(tmp_section, "SIC_METHOD", &
     552         9324 :                                 i_val=dft_control%sic_method_id)
     553              :       CALL section_vals_val_get(tmp_section, "ORBITAL_SET", &
     554         9324 :                                 i_val=dft_control%sic_list_id)
     555              :       CALL section_vals_val_get(tmp_section, "SIC_SCALING_A", &
     556         9324 :                                 r_val=dft_control%sic_scaling_a)
     557              :       CALL section_vals_val_get(tmp_section, "SIC_SCALING_B", &
     558         9324 :                                 r_val=dft_control%sic_scaling_b)
     559              : 
     560         9324 :       do_rtp = .FALSE.
     561         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "REAL_TIME_PROPAGATION")
     562         9324 :       CALL section_vals_get(tmp_section, explicit=is_present)
     563         9324 :       IF (is_present) THEN
     564          324 :          CALL read_rtp_section(dft_control, tmp_section)
     565          324 :          do_rtp = .TRUE.
     566              :       END IF
     567              : 
     568              :       ! Read the input section
     569         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "XAS")
     570         9324 :       CALL section_vals_get(tmp_section, explicit=dft_control%do_xas_calculation)
     571         9324 :       IF (dft_control%do_xas_calculation) THEN
     572              :          ! Override with section parameter
     573              :          CALL section_vals_val_get(tmp_section, "_SECTION_PARAMETERS_", &
     574           42 :                                    l_val=dft_control%do_xas_calculation)
     575              :       END IF
     576              : 
     577         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "XAS_TDP")
     578         9324 :       CALL section_vals_get(tmp_section, explicit=dft_control%do_xas_tdp_calculation)
     579         9324 :       IF (dft_control%do_xas_tdp_calculation) THEN
     580              :          ! Override with section parameter
     581              :          CALL section_vals_val_get(tmp_section, "_SECTION_PARAMETERS_", &
     582           52 :                                    l_val=dft_control%do_xas_tdp_calculation)
     583              :       END IF
     584              : 
     585              :       ! Read the finite field input section
     586         9324 :       dft_control%apply_efield = .FALSE.
     587         9324 :       dft_control%apply_efield_field = .FALSE. !this is for RTP
     588         9324 :       dft_control%apply_vector_potential = .FALSE. !this is for RTP
     589         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "EFIELD")
     590         9324 :       CALL section_vals_get(tmp_section, n_repetition=nrep, explicit=is_present)
     591         9324 :       IF (is_present) THEN
     592         1376 :          ALLOCATE (dft_control%efield_fields(nrep))
     593          344 :          CALL read_efield_sections(dft_control, tmp_section, cell)
     594          344 :          IF (do_rtp) THEN
     595           30 :             IF (.NOT. dft_control%rtp_control%velocity_gauge) THEN
     596           20 :                dft_control%apply_efield_field = .TRUE.
     597              :             ELSE
     598           10 :                dft_control%apply_vector_potential = .TRUE.
     599              :                ! Use this input value of vector potential to (re)start RTP
     600           40 :                dft_control%rtp_control%vec_pot = dft_control%efield_fields(1)%efield%vec_pot_initial
     601              :             END IF
     602              :          ELSE
     603          314 :             dft_control%apply_efield = .TRUE.
     604          314 :             CPASSERT(nrep == 1)
     605              :          END IF
     606              :       END IF
     607              : 
     608              :       ! Now, can try to guess polarisation in rtp
     609         9324 :       IF (do_rtp) THEN
     610              :          ! tmp_section => section_vals_get_subs_vals(dft_section, "REAL_TIME_PROPAGATION%PRINT%POLARIZABILITY")
     611              :          ! CALL section_vals_get(tmp_section, explicit=is_present)
     612              :          local_moment_possible = (dft_control%rtp_control%rtp_method == rtp_method_bse .OR. &
     613              :                                   dft_control%rtp_control%rtp_method == rtp_method_bse_linearized) .OR. &
     614          324 :                                  ((.NOT. dft_control%rtp_control%periodic) .AND. dft_control%rtp_control%linear_scaling)
     615           90 :          IF (local_moment_possible .AND. (.NOT. ASSOCIATED(dft_control%rtp_control%print_pol_elements))) THEN
     616           90 :             tmp_section => section_vals_get_subs_vals(dft_section, "REAL_TIME_PROPAGATION")
     617              :             CALL guess_pol_elements(dft_control, &
     618           90 :                                     dft_control%rtp_control%print_pol_elements)
     619              :          END IF
     620              :       END IF
     621              : 
     622              :       ! Read the finite field input section for periodic fields
     623         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "PERIODIC_EFIELD")
     624         9324 :       CALL section_vals_get(tmp_section, explicit=dft_control%apply_period_efield)
     625         9324 :       IF (dft_control%apply_period_efield) THEN
     626          518 :          ALLOCATE (dft_control%period_efield)
     627           74 :          CALL section_vals_val_get(tmp_section, "POLARISATION", r_vals=pol)
     628          518 :          dft_control%period_efield%polarisation(1:3) = pol(1:3)
     629           74 :          IF (PRESENT(cell)) THEN
     630           74 :             IF (ASSOCIATED(cell)) THEN
     631           74 :                CALL cell_transform_input_cartesian(cell, dft_control%period_efield%polarisation(1:3))
     632              :             END IF
     633              :          END IF
     634           74 :          CALL section_vals_val_get(tmp_section, "D_FILTER", r_vals=pol)
     635          518 :          dft_control%period_efield%d_filter(1:3) = pol(1:3)
     636           74 :          IF (PRESENT(cell)) THEN
     637           74 :             IF (ASSOCIATED(cell)) CALL cell_transform_input_cartesian(cell, dft_control%period_efield%d_filter(1:3))
     638              :          END IF
     639              :          CALL section_vals_val_get(tmp_section, "INTENSITY", &
     640           74 :                                    r_val=dft_control%period_efield%strength)
     641           74 :          dft_control%period_efield%displacement_field = .FALSE.
     642              :          CALL section_vals_val_get(tmp_section, "DISPLACEMENT_FIELD", &
     643           74 :                                    l_val=dft_control%period_efield%displacement_field)
     644              : 
     645           74 :          CALL section_vals_val_get(tmp_section, "INTENSITY_LIST", r_vals=pol)
     646              : 
     647           74 :          CALL section_vals_val_get(tmp_section, "INTENSITIES_FILE_NAME", c_val=intensities_file_name)
     648              : 
     649           74 :          IF (SIZE(pol) > 1 .OR. pol(1) /= 0.0_dp) THEN
     650              :             ! if INTENSITY_LIST is present, INTENSITY and INTENSITIES_FILE_NAME must not be present
     651            2 :             IF (dft_control%period_efield%strength /= 0.0_dp .OR. intensities_file_name /= "") THEN
     652              :                CALL cp_abort(__LOCATION__, "[PERIODIC FIELD] Only one of INTENSITY, INTENSITY_LIST "// &
     653            0 :                              "or INTENSITIES_FILE_NAME can be specified.")
     654              :             END IF
     655              : 
     656            6 :             ALLOCATE (dft_control%period_efield%strength_list(SIZE(pol)))
     657           50 :             dft_control%period_efield%strength_list(1:SIZE(pol)) = pol(1:SIZE(pol))
     658              :          END IF
     659              : 
     660           74 :          IF (intensities_file_name /= "") THEN
     661              :             ! if INTENSITIES_FILE_NAME is present, INTENSITY must not be present
     662            2 :             IF (dft_control%period_efield%strength /= 0.0_dp) THEN
     663              :                CALL cp_abort(__LOCATION__, "[PERIODIC FIELD] Only one of INTENSITY, INTENSITY_LIST "// &
     664            0 :                              "or INTENSITIES_FILE_NAME can be specified.")
     665              :             END IF
     666              : 
     667            2 :             CALL parser_create(parser, intensities_file_name)
     668              : 
     669            2 :             nrep = 0
     670           24 :             DO WHILE (.TRUE.)
     671           26 :                CALL parser_read_line(parser, 1, at_end)
     672           26 :                IF (at_end) EXIT
     673           24 :                nrep = nrep + 1
     674              :             END DO
     675              : 
     676            2 :             IF (nrep == 0) THEN
     677            0 :                CPABORT("[PERIODIC FIELD] No intensities found in INTENSITIES_FILE_NAME")
     678              :             END IF
     679              : 
     680            6 :             ALLOCATE (dft_control%period_efield%strength_list(nrep))
     681              : 
     682            2 :             CALL parser_reset(parser)
     683           26 :             DO irep = 1, nrep
     684           24 :                CALL parser_read_line(parser, 1)
     685           26 :                READ (parser%input_line, *) dft_control%period_efield%strength_list(irep)
     686              :             END DO
     687              : 
     688            4 :             CALL parser_release(parser)
     689              :          END IF
     690              : 
     691              :          CALL section_vals_val_get(tmp_section, "START_FRAME", &
     692           74 :                                    i_val=dft_control%period_efield%start_frame)
     693              :          CALL section_vals_val_get(tmp_section, "END_FRAME", &
     694           74 :                                    i_val=dft_control%period_efield%end_frame)
     695              : 
     696           74 :          IF (dft_control%period_efield%end_frame /= -1) THEN
     697              :             ! check if valid bounds are given
     698              :             ! if an end frame is given, the number of active frames must be a
     699              :             ! multiple of the number of intensities
     700            4 :             IF (dft_control%period_efield%start_frame > dft_control%period_efield%end_frame) THEN
     701            0 :                CPABORT("[PERIODIC FIELD] START_FRAME > END_FRAME")
     702            4 :             ELSE IF (dft_control%period_efield%start_frame < 1) THEN
     703            0 :                CPABORT("[PERIODIC FIELD] START_FRAME < 1")
     704            4 :             ELSE IF (MOD(dft_control%period_efield%end_frame - &
     705              :                          dft_control%period_efield%start_frame + 1, SIZE(pol)) /= 0) THEN
     706              :                CALL cp_abort(__LOCATION__, &
     707            0 :                              "[PERIODIC FIELD] Number of active frames must be a multiple of the number of intensities")
     708              :             END IF
     709              :          END IF
     710              : 
     711              :          ! periodic fields don't work with RTP
     712           74 :          IF (do_rtp) THEN
     713              :             CALL cp_abort(__LOCATION__, &
     714              :                           "Periodic efield cannot be used with RTP. When restarting a "// &
     715              :                           "run with periodic efield, set RESTART_RTP under &EXT_RESTART "// &
     716            0 :                           "section to .FALSE. explicitly if RESTART_DEFAULT is .TRUE.")
     717              :          END IF
     718           74 :          IF (dft_control%period_efield%displacement_field) THEN
     719           16 :             CALL cite_reference(Stengel2009)
     720              :          ELSE
     721           58 :             CALL cite_reference(Souza2002)
     722           58 :             CALL cite_reference(Umari2002)
     723              :          END IF
     724              :       END IF
     725              : 
     726              :       ! Read the external potential input section
     727         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "EXTERNAL_POTENTIAL")
     728         9324 :       CALL section_vals_get(tmp_section, explicit=dft_control%apply_external_potential)
     729         9324 :       IF (dft_control%apply_external_potential) THEN
     730           16 :          CALL expot_control_create(dft_control%expot_control)
     731              :          CALL section_vals_val_get(tmp_section, "READ_FROM_CUBE", &
     732           16 :                                    l_val=dft_control%expot_control%read_from_cube)
     733              :          CALL section_vals_val_get(tmp_section, "STATIC", &
     734           16 :                                    l_val=dft_control%expot_control%static)
     735              :          CALL section_vals_val_get(tmp_section, "SCALING_FACTOR", &
     736           16 :                                    r_val=dft_control%expot_control%scaling_factor)
     737              :          ! External potential using Maxwell equation
     738           16 :          maxwell_section => section_vals_get_subs_vals(tmp_section, "MAXWELL")
     739           16 :          CALL section_vals_get(maxwell_section, explicit=is_present)
     740           16 :          IF (is_present) THEN
     741            0 :             dft_control%expot_control%maxwell_solver = .TRUE.
     742            0 :             CALL maxwell_control_create(dft_control%maxwell_control)
     743              :             ! read the input values from Maxwell section
     744              :             CALL section_vals_val_get(maxwell_section, "TEST_REAL", &
     745            0 :                                       r_val=dft_control%maxwell_control%real_test)
     746              :             CALL section_vals_val_get(maxwell_section, "TEST_INTEGER", &
     747            0 :                                       i_val=dft_control%maxwell_control%int_test)
     748              :             CALL section_vals_val_get(maxwell_section, "TEST_LOGICAL", &
     749            0 :                                       l_val=dft_control%maxwell_control%log_test)
     750              :          ELSE
     751           16 :             dft_control%expot_control%maxwell_solver = .FALSE.
     752              :          END IF
     753              :       END IF
     754              : 
     755              :       ! Read the SCCS input section if present
     756         9324 :       sccs_section => section_vals_get_subs_vals(dft_section, "SCCS")
     757         9324 :       CALL section_vals_get(sccs_section, explicit=is_present)
     758         9324 :       IF (is_present) THEN
     759              :          ! Check section parameter if SCCS is activated
     760              :          CALL section_vals_val_get(sccs_section, "_SECTION_PARAMETERS_", &
     761           16 :                                    l_val=dft_control%do_sccs)
     762           16 :          IF (dft_control%do_sccs) THEN
     763           16 :             ALLOCATE (dft_control%sccs_control)
     764              :             CALL section_vals_val_get(sccs_section, "RELATIVE_PERMITTIVITY", &
     765           16 :                                       r_val=dft_control%sccs_control%epsilon_solvent)
     766              :             CALL section_vals_val_get(sccs_section, "ALPHA", &
     767           16 :                                       r_val=dft_control%sccs_control%alpha_solvent)
     768              :             CALL section_vals_val_get(sccs_section, "BETA", &
     769           16 :                                       r_val=dft_control%sccs_control%beta_solvent)
     770              :             CALL section_vals_val_get(sccs_section, "DELTA_RHO", &
     771           16 :                                       r_val=dft_control%sccs_control%delta_rho)
     772              :             CALL section_vals_val_get(sccs_section, "DERIVATIVE_METHOD", &
     773           16 :                                       i_val=dft_control%sccs_control%derivative_method)
     774              :             CALL section_vals_val_get(sccs_section, "METHOD", &
     775           16 :                                       i_val=dft_control%sccs_control%method_id)
     776              :             CALL section_vals_val_get(sccs_section, "EPS_SCCS", &
     777           16 :                                       r_val=dft_control%sccs_control%eps_sccs)
     778              :             CALL section_vals_val_get(sccs_section, "EPS_SCF", &
     779           16 :                                       r_val=dft_control%sccs_control%eps_scf)
     780              :             CALL section_vals_val_get(sccs_section, "GAMMA", &
     781           16 :                                       r_val=dft_control%sccs_control%gamma_solvent)
     782              :             CALL section_vals_val_get(sccs_section, "MAX_ITER", &
     783           16 :                                       i_val=dft_control%sccs_control%max_iter)
     784              :             CALL section_vals_val_get(sccs_section, "MIXING", &
     785           16 :                                       r_val=dft_control%sccs_control%mixing)
     786              :             CALL section_vals_val_get(sccs_section, "CORE_FILL", &
     787           16 :                                       l_val=dft_control%sccs_control%core_fill)
     788              :             CALL section_vals_val_get(sccs_section, "CORE_FILL_SPREAD", &
     789           16 :                                       r_val=dft_control%sccs_control%core_fill_spread)
     790           16 :             tmp_section => section_vals_get_subs_vals(sccs_section, "CORE_FILL_KIND")
     791           16 :             CALL section_vals_val_get(tmp_section, "_DEFAULT_KEYWORD_", n_rep_val=n_rep)
     792           34 :             ALLOCATE (dft_control%sccs_control%core_fill_kind_label(n_rep))
     793           34 :             ALLOCATE (dft_control%sccs_control%core_fill_kind_spread(n_rep))
     794           20 :             DO i_rep = 1, n_rep
     795            4 :                CALL section_vals_val_get(tmp_section, "_DEFAULT_KEYWORD_", i_rep_val=i_rep, c_val=line)
     796            4 :                READ (line, *, IOSTAT=ios) dft_control%sccs_control%core_fill_kind_label(i_rep), &
     797            8 :                   dft_control%sccs_control%core_fill_kind_spread(i_rep)
     798            4 :                IF (ios /= 0) THEN
     799              :                   CALL cp_abort(__LOCATION__, &
     800              :                                 "SCCS| Invalid line in CORE_FILL_KIND (expected <kind label> <spread in bohr>): "// &
     801            0 :                                 TRIM(line))
     802              :                END IF
     803           20 :                CALL uppercase(dft_control%sccs_control%core_fill_kind_label(i_rep))
     804              :             END DO
     805           28 :             SELECT CASE (dft_control%sccs_control%method_id)
     806              :             CASE (sccs_andreussi)
     807           12 :                tmp_section => section_vals_get_subs_vals(sccs_section, "ANDREUSSI")
     808              :                CALL section_vals_val_get(tmp_section, "RHO_MAX", &
     809           12 :                                          r_val=dft_control%sccs_control%rho_max)
     810              :                CALL section_vals_val_get(tmp_section, "RHO_MIN", &
     811           12 :                                          r_val=dft_control%sccs_control%rho_min)
     812           12 :                IF (dft_control%sccs_control%rho_max < dft_control%sccs_control%rho_min) THEN
     813              :                   CALL cp_abort(__LOCATION__, &
     814              :                                 "The SCCS parameter RHO_MAX is smaller than RHO_MIN. "// &
     815            0 :                                 "Please, check your input!")
     816              :                END IF
     817           12 :                CALL cite_reference(Andreussi2012)
     818              :             CASE (sccs_fattebert_gygi)
     819            4 :                tmp_section => section_vals_get_subs_vals(sccs_section, "FATTEBERT-GYGI")
     820              :                CALL section_vals_val_get(tmp_section, "BETA", &
     821            4 :                                          r_val=dft_control%sccs_control%beta)
     822            4 :                IF (dft_control%sccs_control%beta < 0.5_dp) THEN
     823              :                   CALL cp_abort(__LOCATION__, &
     824              :                                 "A value smaller than 0.5 for the SCCS parameter beta "// &
     825            0 :                                 "causes numerical problems. Please, check your input!")
     826              :                END IF
     827              :                CALL section_vals_val_get(tmp_section, "RHO_ZERO", &
     828            4 :                                          r_val=dft_control%sccs_control%rho_zero)
     829            4 :                CALL cite_reference(Fattebert2002)
     830              :             CASE (sccs_saa_andreussi)
     831            0 :                tmp_section => section_vals_get_subs_vals(sccs_section, "SAA_ANDREUSSI")
     832            0 :                CALL section_vals_get(tmp_section, explicit=is_present)
     833            0 :                IF (.NOT. is_present) THEN
     834              :                   CALL cp_abort(__LOCATION__, &
     835              :                                 "SCCS method SAA_ANDREUSSI requires the "// &
     836            0 :                                 "SAA_ANDREUSSI section.")
     837              :                END IF
     838            0 :                IF (.NOT. ALL(cell%perd == 1)) THEN
     839              :                   CALL cp_abort(__LOCATION__, &
     840              :                                 "SCCS method SAA_ANDREUSSI is only implemented for "// &
     841            0 :                                 "3D periodic calculations.")
     842              :                END IF
     843              :                CALL section_vals_val_get(tmp_section, "RHO_MAX", &
     844            0 :                                          r_val=dft_control%sccs_control%rho_max)
     845              :                CALL section_vals_val_get(tmp_section, "RHO_MIN", &
     846            0 :                                          r_val=dft_control%sccs_control%rho_min)
     847            0 :                IF (dft_control%sccs_control%rho_max < dft_control%sccs_control%rho_min) THEN
     848              :                   CALL cp_abort(__LOCATION__, &
     849              :                                 "The SCCS parameter RHO_MAX is smaller than RHO_MIN. "// &
     850            0 :                                 "Please, check your input!")
     851              :                END IF
     852              :                CALL section_vals_val_get(tmp_section, "F0", &
     853            0 :                                          r_val=dft_control%sccs_control%f0)
     854              :                CALL section_vals_val_get(tmp_section, "DELTA_ETA", &
     855            0 :                                          r_val=dft_control%sccs_control%delta_eta)
     856              :                CALL section_vals_val_get(tmp_section, "DELTA_ZETA", &
     857            0 :                                          r_val=dft_control%sccs_control%delta_zeta)
     858              :                CALL section_vals_val_get(tmp_section, "R_SOLV", &
     859            0 :                                          r_val=dft_control%sccs_control%r_solv)
     860              :                CALL section_vals_val_get(tmp_section, "ALPHA_ZETA", &
     861            0 :                                          r_val=dft_control%sccs_control%alpha_zeta)
     862            0 :                CALL cite_reference(Andreussi2019)
     863            0 :                CALL cite_reference(Chai2025a)
     864              :             CASE DEFAULT
     865           16 :                CPABORT("Invalid SCCS model specified. Please, check your input!")
     866              :             END SELECT
     867           32 :             CALL cite_reference(Yin2017)
     868              :          END IF
     869              :       END IF
     870              : 
     871              :       ! Read the planar counter charge section
     872         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "PLANAR_COUNTER_CHARGE")
     873         9324 :       CALL section_vals_get(tmp_section, explicit=is_present)
     874         9324 :       IF (is_present) THEN
     875              :          ! Check section parameter if planar counter charge is activated
     876              :          CALL section_vals_val_get(tmp_section, "_SECTION_PARAMETERS_", &
     877           12 :                                    l_val=dft_control%do_pcc)
     878           12 :          IF (dft_control%do_pcc) THEN
     879           12 :             ALLOCATE (dft_control%pcc_control)
     880              :             CALL section_vals_val_get(tmp_section, "DIST_EDGE", &
     881           12 :                                       r_val=dft_control%pcc_control%dist_edge)
     882              :             CALL section_vals_val_get(tmp_section, "GAU_C", &
     883           12 :                                       r_val=dft_control%pcc_control%gau_c)
     884              :             CALL section_vals_val_get(tmp_section, "PARALLEL_PLANE", &
     885           12 :                                       i_val=dft_control%pcc_control%surf_normal)
     886              :          END IF
     887              :       END IF
     888              : 
     889              :       ! Read the planar averaged Hartree potential section
     890         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "PLANAR_AVERAGED_V_HARTREE")
     891         9324 :       CALL section_vals_get(tmp_section, explicit=is_present)
     892         9324 :       IF (is_present) THEN
     893              :          ! Check section parameter if the planar-averaged potential is activated
     894              :          CALL section_vals_val_get(tmp_section, "_SECTION_PARAMETERS_", &
     895            2 :                                    l_val=dft_control%do_paep)
     896            2 :          IF (dft_control%do_paep) THEN
     897            2 :             ALLOCATE (dft_control%paep_control)
     898              :             CALL section_vals_val_get(tmp_section, "PARALLEL_PLANE", &
     899            2 :                                       i_val=dft_control%paep_control%surf_normal)
     900              :          END IF
     901              :       END IF
     902              : 
     903              :       ! ZMP added input sections
     904              :       ! Read the external density input section
     905         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "EXTERNAL_DENSITY")
     906         9324 :       CALL section_vals_get(tmp_section, explicit=dft_control%apply_external_density)
     907              : 
     908              :       ! Read the external vxc input section
     909         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "EXTERNAL_VXC")
     910         9324 :       CALL section_vals_get(tmp_section, explicit=dft_control%apply_external_vxc)
     911              : 
     912         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "LOCALIZE")
     913         9324 :       CALL section_vals_val_get(tmp_section, "EACH", i_val=dft_control%localize_each)
     914              : 
     915              :       ! SMEAGOL interface
     916         9324 :       tmp_section => section_vals_get_subs_vals(dft_section, "SMEAGOL")
     917         9324 :       CALL read_smeagol_control(dft_control%smeagol_control, tmp_section)
     918              : 
     919        27972 :    END SUBROUTINE read_dft_control
     920              : 
     921              : ! **************************************************************************************************
     922              : !> \brief Reads the input and stores in the rixs_control_type
     923              : !> \param rixs_control ...
     924              : !> \param rixs_section ...
     925              : !> \param qs_control ...
     926              : ! **************************************************************************************************
     927           32 :    SUBROUTINE read_rixs_control(rixs_control, rixs_section, qs_control)
     928              :       TYPE(rixs_control_type), POINTER                   :: rixs_control
     929              :       TYPE(section_vals_type), POINTER                   :: rixs_section
     930              :       TYPE(qs_control_type), POINTER                     :: qs_control
     931              : 
     932              :       TYPE(section_vals_type), POINTER                   :: td_section, xas_section
     933              : 
     934           32 :       CALL section_vals_val_get(rixs_section, "_SECTION_PARAMETERS_", l_val=rixs_control%enabled)
     935              : 
     936           32 :       CALL section_vals_val_get(rixs_section, "CORE_STATES", i_val=rixs_control%core_states)
     937           32 :       CALL section_vals_val_get(rixs_section, "VALENCE_STATES", i_val=rixs_control%valence_states)
     938              : 
     939           32 :       td_section => section_vals_get_subs_vals(rixs_section, "TDDFPT")
     940           32 :       CALL read_tddfpt2_control(rixs_control%tddfpt2_control, td_section, qs_control)
     941              : 
     942           32 :       xas_section => section_vals_get_subs_vals(rixs_section, "XAS_TDP")
     943           32 :       CALL read_xas_tdp_control(rixs_control%xas_tdp_control, xas_section)
     944              : 
     945           32 :    END SUBROUTINE read_rixs_control
     946              : 
     947              : ! **************************************************************************************************
     948              : !> \brief ...
     949              : !> \param qs_control ...
     950              : !> \param dft_section ...
     951              : ! **************************************************************************************************
     952         9324 :    SUBROUTINE read_mgrid_section(qs_control, dft_section)
     953              : 
     954              :       TYPE(qs_control_type), INTENT(INOUT)               :: qs_control
     955              :       TYPE(section_vals_type), POINTER                   :: dft_section
     956              : 
     957              :       CHARACTER(len=*), PARAMETER :: routineN = 'read_mgrid_section'
     958              : 
     959              :       INTEGER                                            :: handle, igrid_level, interp_kind, &
     960              :                                                             ngrid_level
     961              :       LOGICAL                                            :: explicit, multigrid_set
     962              :       REAL(dp)                                           :: cutoff
     963         9324 :       REAL(dp), DIMENSION(:), POINTER                    :: cutofflist
     964              :       TYPE(section_vals_type), POINTER                   :: interp_section, mgrid_section
     965              : 
     966         9324 :       CALL timeset(routineN, handle)
     967              : 
     968         9324 :       NULLIFY (interp_section, mgrid_section, cutofflist)
     969         9324 :       mgrid_section => section_vals_get_subs_vals(dft_section, "MGRID")
     970         9324 :       interp_section => section_vals_get_subs_vals(mgrid_section, "INTERPOLATOR")
     971              : 
     972         9324 :       CALL section_vals_val_get(mgrid_section, "NGRIDS", i_val=ngrid_level)
     973         9324 :       CALL section_vals_val_get(mgrid_section, "MULTIGRID_SET", l_val=multigrid_set)
     974         9324 :       CALL section_vals_val_get(mgrid_section, "CUTOFF", r_val=cutoff)
     975         9324 :       CALL section_vals_val_get(mgrid_section, "PROGRESSION_FACTOR", r_val=qs_control%progression_factor)
     976         9324 :       CALL section_vals_val_get(mgrid_section, "COMMENSURATE", l_val=qs_control%commensurate_mgrids)
     977         9324 :       CALL section_vals_val_get(interp_section, "KIND", i_val=interp_kind)
     978         9324 :       IF (interp_kind /= pw_interp) qs_control%commensurate_mgrids = .TRUE.
     979         9324 :       CALL section_vals_val_get(mgrid_section, "REALSPACE", l_val=qs_control%realspace_mgrids)
     980         9324 :       CALL section_vals_val_get(mgrid_section, "REL_CUTOFF", r_val=qs_control%relative_cutoff)
     981              :       CALL section_vals_val_get(mgrid_section, "SKIP_LOAD_BALANCE_DISTRIBUTED", &
     982         9324 :                                 l_val=qs_control%skip_load_balance_distributed)
     983              : 
     984              :       ! For SE and DFTB possibly override with new defaults
     985         9324 :       IF (qs_control%semi_empirical .OR. qs_control%dftb .OR. qs_control%xtb) THEN
     986         2528 :          ngrid_level = 1
     987         2528 :          multigrid_set = .FALSE.
     988              :          ! Override default cutoff value unless user specified an explicit argument..
     989         2528 :          CALL section_vals_val_get(mgrid_section, "CUTOFF", explicit=explicit, r_val=cutoff)
     990         2528 :          IF (.NOT. explicit) cutoff = 1.0_dp
     991              :       END IF
     992              : 
     993        27972 :       ALLOCATE (qs_control%e_cutoff(ngrid_level))
     994         9324 :       qs_control%cutoff = cutoff
     995              : 
     996         9324 :       IF (multigrid_set) THEN
     997              :          ! Read the values from input
     998            4 :          IF (qs_control%commensurate_mgrids) THEN
     999            0 :             CPABORT("Do not specify cutoffs for the commensurate grids (NYI)")
    1000              :          END IF
    1001              : 
    1002            4 :          CALL section_vals_val_get(mgrid_section, "MULTIGRID_CUTOFF", r_vals=cutofflist)
    1003            4 :          IF (ASSOCIATED(cutofflist)) THEN
    1004            4 :             IF (SIZE(cutofflist, 1) /= ngrid_level) THEN
    1005            0 :                CPABORT("Number of multi-grids requested and number of cutoff values do not match")
    1006              :             END IF
    1007           20 :             DO igrid_level = 1, ngrid_level
    1008           20 :                qs_control%e_cutoff(igrid_level) = cutofflist(igrid_level)
    1009              :             END DO
    1010              :          END IF
    1011              :          ! set cutoff to smallest value in multgrid available with >= cutoff
    1012           20 :          DO igrid_level = ngrid_level, 1, -1
    1013           16 :             IF (qs_control%cutoff <= qs_control%e_cutoff(igrid_level)) THEN
    1014            0 :                qs_control%cutoff = qs_control%e_cutoff(igrid_level)
    1015            0 :                EXIT
    1016              :             END IF
    1017              :             ! set largest grid value to cutoff
    1018           20 :             IF (igrid_level == 1) THEN
    1019            4 :                qs_control%cutoff = qs_control%e_cutoff(1)
    1020              :             END IF
    1021              :          END DO
    1022              :       ELSE
    1023         9320 :          IF (qs_control%commensurate_mgrids) qs_control%progression_factor = 4.0_dp
    1024         9320 :          qs_control%e_cutoff(1) = qs_control%cutoff
    1025        29330 :          DO igrid_level = 2, ngrid_level
    1026              :             qs_control%e_cutoff(igrid_level) = qs_control%e_cutoff(igrid_level - 1)/ &
    1027        29330 :                                                qs_control%progression_factor
    1028              :          END DO
    1029              :       END IF
    1030              :       ! check that multigrids are ordered
    1031        29346 :       DO igrid_level = 2, ngrid_level
    1032        29346 :          IF (qs_control%e_cutoff(igrid_level) > qs_control%e_cutoff(igrid_level - 1)) THEN
    1033            0 :             CPABORT("The cutoff values for the multi-grids are not ordered from large to small")
    1034        20022 :          ELSE IF (qs_control%e_cutoff(igrid_level) == qs_control%e_cutoff(igrid_level - 1)) THEN
    1035            0 :             CPABORT("The same cutoff value was specified for two multi-grids")
    1036              :          END IF
    1037              :       END DO
    1038         9324 :       CALL timestop(handle)
    1039        27972 :    END SUBROUTINE read_mgrid_section
    1040              : 
    1041              : ! **************************************************************************************************
    1042              : !> \brief ...
    1043              : !> \param qs_control ...
    1044              : !> \param qs_section ...
    1045              : !> \param cell optional cell used to transform Cartesian input vectors
    1046              : ! **************************************************************************************************
    1047       149184 :    SUBROUTINE read_qs_section(qs_control, qs_section, cell)
    1048              : 
    1049              :       TYPE(qs_control_type), INTENT(INOUT)               :: qs_control
    1050              :       TYPE(section_vals_type), POINTER                   :: qs_section
    1051              :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell
    1052              : 
    1053              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'read_qs_section'
    1054              : 
    1055              :       CHARACTER(LEN=2)                                   :: element_symbol
    1056              :       CHARACTER(LEN=default_string_length)               :: cval
    1057              :       CHARACTER(LEN=default_string_length), &
    1058         9324 :          DIMENSION(:), POINTER                           :: clist
    1059              :       INTEGER                                            :: handle, itmp, j, jj, k, n_rep, n_var, &
    1060              :                                                             ngauss, ngp, nrep, znum
    1061         9324 :       INTEGER, DIMENSION(:), POINTER                     :: tmplist
    1062              :       LOGICAL :: dftb_scc_mixer_explicit, dftb_tblite_mixer_explicit, explicit, &
    1063              :          tblite_reference_cli, tblite_reference_cli_section, tblite_section_active, was_present, &
    1064              :          xtb_scc_mixer_explicit, xtb_tblite_mixer_explicit
    1065              :       REAL(dp)                                           :: tmp, tmpsqrt, value
    1066         9324 :       REAL(dp), POINTER                                  :: scal(:)
    1067              :       TYPE(section_vals_type), POINTER :: cdft_control_section, ddapc_restraint_section, &
    1068              :          dftb_parameter, dftb_section, dftb_tblite_mixer, eeq_section, genpot_section, &
    1069              :          lri_optbas_section, mull_section, nonbonded_section, s2_restraint_section, se_section, &
    1070              :          xtb_parameter, xtb_section, xtb_tblite, xtb_tblite_mixer, xtb_tblite_ref_cli
    1071              : 
    1072         9324 :       CALL timeset(routineN, handle)
    1073              : 
    1074         9324 :       was_present = .FALSE.
    1075         9324 :       NULLIFY (mull_section, ddapc_restraint_section, s2_restraint_section, &
    1076         9324 :                se_section, dftb_section, xtb_section, dftb_parameter, xtb_parameter, lri_optbas_section, &
    1077         9324 :                cdft_control_section, genpot_section, eeq_section, dftb_tblite_mixer, &
    1078         9324 :                xtb_tblite_mixer, xtb_tblite_ref_cli)
    1079              : 
    1080         9324 :       mull_section => section_vals_get_subs_vals(qs_section, "MULLIKEN_RESTRAINT")
    1081         9324 :       ddapc_restraint_section => section_vals_get_subs_vals(qs_section, "DDAPC_RESTRAINT")
    1082         9324 :       s2_restraint_section => section_vals_get_subs_vals(qs_section, "S2_RESTRAINT")
    1083         9324 :       se_section => section_vals_get_subs_vals(qs_section, "SE")
    1084         9324 :       dftb_section => section_vals_get_subs_vals(qs_section, "DFTB")
    1085         9324 :       xtb_section => section_vals_get_subs_vals(qs_section, "xTB")
    1086         9324 :       dftb_parameter => section_vals_get_subs_vals(dftb_section, "PARAMETER")
    1087         9324 :       dftb_tblite_mixer => section_vals_get_subs_vals(dftb_section, "TBLITE_MIXER")
    1088         9324 :       xtb_parameter => section_vals_get_subs_vals(xtb_section, "PARAMETER")
    1089         9324 :       eeq_section => section_vals_get_subs_vals(xtb_section, "EEQ")
    1090         9324 :       lri_optbas_section => section_vals_get_subs_vals(qs_section, "OPTIMIZE_LRI_BASIS")
    1091         9324 :       cdft_control_section => section_vals_get_subs_vals(qs_section, "CDFT")
    1092         9324 :       nonbonded_section => section_vals_get_subs_vals(xtb_section, "NONBONDED")
    1093         9324 :       genpot_section => section_vals_get_subs_vals(nonbonded_section, "GENPOT")
    1094         9324 :       xtb_tblite_mixer => section_vals_get_subs_vals(xtb_section, "TBLITE_MIXER")
    1095         9324 :       xtb_tblite => section_vals_get_subs_vals(xtb_section, "TBLITE")
    1096         9324 :       xtb_tblite_ref_cli => section_vals_get_subs_vals(xtb_tblite, "REFERENCE_CLI")
    1097              : 
    1098              :       ! Setup all defaults values and overwrite input parameters
    1099              :       ! EPS_DEFAULT should set the target accuracy in the total energy (~per electron) or a closely related value
    1100         9324 :       CALL section_vals_val_get(qs_section, "EPS_DEFAULT", r_val=value)
    1101         9324 :       tmpsqrt = SQRT(value) ! a trick to work around a NAG 5.1 optimizer bug
    1102              : 
    1103              :       ! random choice ?
    1104         9324 :       qs_control%eps_core_charge = value/100.0_dp
    1105              :       ! correct if all Gaussians would have the same radius (overlap will be smaller than eps_pgf_orb**2).
    1106              :       ! Can be significantly in error if not... requires fully new screening/pairlist procedures
    1107         9324 :       qs_control%eps_pgf_orb = tmpsqrt
    1108         9324 :       qs_control%eps_kg_orb = qs_control%eps_pgf_orb
    1109              :       ! consistent since also a kind of overlap
    1110         9324 :       qs_control%eps_ppnl = qs_control%eps_pgf_orb/100.0_dp
    1111              :       ! accuracy is basically set by the overlap, this sets an empirical shift
    1112         9324 :       qs_control%eps_ppl = 1.0E-2_dp
    1113              :       !
    1114         9324 :       qs_control%gapw_control%eps_cpc = value
    1115              :       ! expexted error in the density
    1116         9324 :       qs_control%eps_rho_gspace = value
    1117         9324 :       qs_control%eps_rho_rspace = value
    1118              :       ! error in the gradient, can be the sqrt of the error in the energy, ignored if map_consistent
    1119         9324 :       qs_control%eps_gvg_rspace = tmpsqrt
    1120              :       !
    1121         9324 :       CALL section_vals_val_get(qs_section, "EPS_CORE_CHARGE", n_rep_val=n_rep)
    1122         9324 :       IF (n_rep /= 0) THEN
    1123            0 :          CALL section_vals_val_get(qs_section, "EPS_CORE_CHARGE", r_val=qs_control%eps_core_charge)
    1124              :       END IF
    1125         9324 :       CALL section_vals_val_get(qs_section, "EPS_GVG_RSPACE", n_rep_val=n_rep)
    1126         9324 :       IF (n_rep /= 0) THEN
    1127          166 :          CALL section_vals_val_get(qs_section, "EPS_GVG_RSPACE", r_val=qs_control%eps_gvg_rspace)
    1128              :       END IF
    1129         9324 :       CALL section_vals_val_get(qs_section, "EPS_PGF_ORB", n_rep_val=n_rep)
    1130         9324 :       IF (n_rep /= 0) THEN
    1131          722 :          CALL section_vals_val_get(qs_section, "EPS_PGF_ORB", r_val=qs_control%eps_pgf_orb)
    1132              :       END IF
    1133         9324 :       CALL section_vals_val_get(qs_section, "EPS_KG_ORB", n_rep_val=n_rep)
    1134         9324 :       IF (n_rep /= 0) THEN
    1135           66 :          CALL section_vals_val_get(qs_section, "EPS_KG_ORB", r_val=tmp)
    1136           66 :          qs_control%eps_kg_orb = SQRT(tmp)
    1137              :       END IF
    1138         9324 :       CALL section_vals_val_get(qs_section, "EPS_PPL", n_rep_val=n_rep)
    1139         9324 :       IF (n_rep /= 0) THEN
    1140         9324 :          CALL section_vals_val_get(qs_section, "EPS_PPL", r_val=qs_control%eps_ppl)
    1141              :       END IF
    1142         9324 :       CALL section_vals_val_get(qs_section, "EPS_PPNL", n_rep_val=n_rep)
    1143         9324 :       IF (n_rep /= 0) THEN
    1144           72 :          CALL section_vals_val_get(qs_section, "EPS_PPNL", r_val=qs_control%eps_ppnl)
    1145              :       END IF
    1146         9324 :       CALL section_vals_val_get(qs_section, "EPS_RHO", n_rep_val=n_rep)
    1147         9324 :       IF (n_rep /= 0) THEN
    1148           30 :          CALL section_vals_val_get(qs_section, "EPS_RHO", r_val=qs_control%eps_rho_gspace)
    1149           30 :          qs_control%eps_rho_rspace = qs_control%eps_rho_gspace
    1150              :       END IF
    1151         9324 :       CALL section_vals_val_get(qs_section, "EPS_RHO_RSPACE", n_rep_val=n_rep)
    1152         9324 :       IF (n_rep /= 0) THEN
    1153            2 :          CALL section_vals_val_get(qs_section, "EPS_RHO_RSPACE", r_val=qs_control%eps_rho_rspace)
    1154              :       END IF
    1155         9324 :       CALL section_vals_val_get(qs_section, "EPS_RHO_GSPACE", n_rep_val=n_rep)
    1156         9324 :       IF (n_rep /= 0) THEN
    1157            2 :          CALL section_vals_val_get(qs_section, "EPS_RHO_GSPACE", r_val=qs_control%eps_rho_gspace)
    1158              :       END IF
    1159         9324 :       CALL section_vals_val_get(qs_section, "EPS_FILTER_MATRIX", n_rep_val=n_rep)
    1160         9324 :       IF (n_rep /= 0) THEN
    1161         9324 :          CALL section_vals_val_get(qs_section, "EPS_FILTER_MATRIX", r_val=qs_control%eps_filter_matrix)
    1162              :       END IF
    1163         9324 :       CALL section_vals_val_get(qs_section, "EPS_CPC", n_rep_val=n_rep)
    1164         9324 :       IF (n_rep /= 0) THEN
    1165            0 :          CALL section_vals_val_get(qs_section, "EPS_CPC", r_val=qs_control%gapw_control%eps_cpc)
    1166              :       END IF
    1167              : 
    1168         9324 :       CALL section_vals_val_get(qs_section, "EPSFIT", r_val=qs_control%gapw_control%eps_fit)
    1169         9324 :       CALL section_vals_val_get(qs_section, "EPSISO", r_val=qs_control%gapw_control%eps_iso)
    1170         9324 :       CALL section_vals_val_get(qs_section, "EPSSVD", r_val=qs_control%gapw_control%eps_svd)
    1171         9324 :       CALL section_vals_val_get(qs_section, "EPSRHO0", r_val=qs_control%gapw_control%eps_Vrho0)
    1172         9324 :       CALL section_vals_val_get(qs_section, "ALPHA0_HARD", r_val=qs_control%gapw_control%alpha0_hard)
    1173         9324 :       qs_control%gapw_control%alpha0_hard_from_input = .FALSE.
    1174         9324 :       IF (qs_control%gapw_control%alpha0_hard /= 0.0_dp) qs_control%gapw_control%alpha0_hard_from_input = .TRUE.
    1175         9324 :       CALL section_vals_val_get(qs_section, "FORCE_PAW", l_val=qs_control%gapw_control%force_paw)
    1176         9324 :       CALL section_vals_val_get(qs_section, "MAX_RAD_LOCAL", r_val=qs_control%gapw_control%max_rad_local)
    1177              : 
    1178         9324 :       CALL section_vals_val_get(qs_section, "MIN_PAIR_LIST_RADIUS", r_val=qs_control%pairlist_radius)
    1179              : 
    1180         9324 :       CALL section_vals_val_get(qs_section, "LS_SCF", l_val=qs_control%do_ls_scf)
    1181         9324 :       CALL section_vals_val_get(qs_section, "ALMO_SCF", l_val=qs_control%do_almo_scf)
    1182         9324 :       CALL section_vals_val_get(qs_section, "KG_METHOD", l_val=qs_control%do_kg)
    1183              : 
    1184              :       ! Logicals
    1185         9324 :       CALL section_vals_val_get(qs_section, "REF_EMBED_SUBSYS", l_val=qs_control%ref_embed_subsys)
    1186         9324 :       CALL section_vals_val_get(qs_section, "CLUSTER_EMBED_SUBSYS", l_val=qs_control%cluster_embed_subsys)
    1187         9324 :       CALL section_vals_val_get(qs_section, "HIGH_LEVEL_EMBED_SUBSYS", l_val=qs_control%high_level_embed_subsys)
    1188         9324 :       CALL section_vals_val_get(qs_section, "DFET_EMBEDDED", l_val=qs_control%dfet_embedded)
    1189         9324 :       CALL section_vals_val_get(qs_section, "DMFET_EMBEDDED", l_val=qs_control%dmfet_embedded)
    1190              : 
    1191              :       ! Integers gapw
    1192         9324 :       CALL section_vals_val_get(qs_section, "LMAXN1", i_val=qs_control%gapw_control%lmax_sphere)
    1193         9324 :       CALL section_vals_val_get(qs_section, "LMAXN0", i_val=qs_control%gapw_control%lmax_rho0)
    1194         9324 :       CALL section_vals_val_get(qs_section, "LADDN0", i_val=qs_control%gapw_control%ladd_rho0)
    1195         9324 :       CALL section_vals_val_get(qs_section, "QUADRATURE", i_val=qs_control%gapw_control%quadrature)
    1196              :       ! GAPW 1c basis
    1197         9324 :       CALL section_vals_val_get(qs_section, "GAPW_1C_BASIS", i_val=qs_control%gapw_control%basis_1c)
    1198         9324 :       IF (qs_control%gapw_control%basis_1c /= gapw_1c_orb) THEN
    1199          106 :          qs_control%gapw_control%eps_svd = MAX(qs_control%gapw_control%eps_svd, 1.E-12_dp)
    1200              :       END IF
    1201              :       ! GAPW accurate integration
    1202         9324 :       CALL section_vals_val_get(qs_section, "GAPW_ACCURATE_XCINT", l_val=qs_control%gapw_control%accurate_xcint)
    1203         9324 :       CALL section_vals_val_get(qs_section, "ALPHA_WEIGHTS", r_val=qs_control%gapw_control%aweights)
    1204         9324 :       CALL section_vals_val_get(qs_section, "ORDER_WEIGHTS", i_val=qs_control%gapw_control%oweights)
    1205              : 
    1206              :       ! Integers grids
    1207         9324 :       CALL section_vals_val_get(qs_section, "PW_GRID", i_val=itmp)
    1208            0 :       SELECT CASE (itmp)
    1209              :       CASE (do_pwgrid_spherical)
    1210            0 :          qs_control%pw_grid_opt%spherical = .TRUE.
    1211            0 :          qs_control%pw_grid_opt%fullspace = .FALSE.
    1212              :       CASE (do_pwgrid_ns_fullspace)
    1213         9324 :          qs_control%pw_grid_opt%spherical = .FALSE.
    1214         9324 :          qs_control%pw_grid_opt%fullspace = .TRUE.
    1215              :       CASE (do_pwgrid_ns_halfspace)
    1216            0 :          qs_control%pw_grid_opt%spherical = .FALSE.
    1217         9324 :          qs_control%pw_grid_opt%fullspace = .FALSE.
    1218              :       END SELECT
    1219              : 
    1220              :       !   Method for PPL calculation
    1221         9324 :       CALL section_vals_val_get(qs_section, "CORE_PPL", i_val=itmp)
    1222         9324 :       qs_control%do_ppl_method = itmp
    1223              : 
    1224         9324 :       CALL section_vals_val_get(qs_section, "PW_GRID_LAYOUT", i_vals=tmplist)
    1225        27972 :       qs_control%pw_grid_opt%distribution_layout = tmplist
    1226         9324 :       CALL section_vals_val_get(qs_section, "PW_GRID_BLOCKED", i_val=qs_control%pw_grid_opt%blocked)
    1227              : 
    1228              :       !Integers extrapolation
    1229         9324 :       CALL section_vals_val_get(qs_section, "EXTRAPOLATION", i_val=qs_control%wf_interpolation_method_nr)
    1230         9324 :       CALL section_vals_val_get(qs_section, "EXTRAPOLATION_ORDER", i_val=qs_control%wf_extrapolation_order)
    1231              : 
    1232              :       !Method
    1233         9324 :       CALL section_vals_val_get(qs_section, "METHOD", i_val=qs_control%method_id)
    1234         9324 :       qs_control%gapw = .FALSE.
    1235         9324 :       qs_control%gapw_xc = .FALSE.
    1236         9324 :       qs_control%gpw = .FALSE.
    1237         9324 :       qs_control%pao = .FALSE.
    1238         9324 :       qs_control%dftb = .FALSE.
    1239         9324 :       qs_control%xtb = .FALSE.
    1240         9324 :       qs_control%semi_empirical = .FALSE.
    1241         9324 :       qs_control%ofgpw = .FALSE.
    1242         9324 :       qs_control%lrigpw = .FALSE.
    1243         9324 :       qs_control%rigpw = .FALSE.
    1244        10684 :       SELECT CASE (qs_control%method_id)
    1245              :       CASE (do_method_gapw)
    1246         1360 :          CALL cite_reference(Lippert1999)
    1247         1360 :          CALL cite_reference(Krack2000)
    1248         1360 :          qs_control%gapw = .TRUE.
    1249              :       CASE (do_method_gapw_xc)
    1250          190 :          qs_control%gapw_xc = .TRUE.
    1251              :       CASE (do_method_gpw)
    1252         5202 :          CALL cite_reference(Lippert1997)
    1253         5202 :          CALL cite_reference(VandeVondele2005a)
    1254         5202 :          qs_control%gpw = .TRUE.
    1255              :       CASE (do_method_ofgpw)
    1256            0 :          qs_control%ofgpw = .TRUE.
    1257              :       CASE (do_method_lrigpw)
    1258           42 :          qs_control%lrigpw = .TRUE.
    1259              :       CASE (do_method_rigpw)
    1260            2 :          qs_control%rigpw = .TRUE.
    1261              :       CASE (do_method_dftb)
    1262          298 :          qs_control%dftb = .TRUE.
    1263          298 :          CALL cite_reference(Porezag1995)
    1264          298 :          CALL cite_reference(Seifert1996)
    1265              :       CASE (do_method_xtb)
    1266         1232 :          qs_control%xtb = .TRUE.
    1267         1232 :          CALL cite_reference(Grimme2017)
    1268         1232 :          CALL cite_reference(Pracht2019)
    1269              :       CASE (do_method_mndo)
    1270           52 :          CALL cite_reference(Dewar1977)
    1271           52 :          qs_control%semi_empirical = .TRUE.
    1272              :       CASE (do_method_am1)
    1273          112 :          CALL cite_reference(Dewar1985)
    1274          112 :          qs_control%semi_empirical = .TRUE.
    1275              :       CASE (do_method_pm3)
    1276           48 :          CALL cite_reference(Stewart1989)
    1277           48 :          qs_control%semi_empirical = .TRUE.
    1278              :       CASE (do_method_pnnl)
    1279           14 :          CALL cite_reference(Schenter2008)
    1280           14 :          qs_control%semi_empirical = .TRUE.
    1281              :       CASE (do_method_pm6)
    1282          752 :          CALL cite_reference(Stewart2007)
    1283          752 :          qs_control%semi_empirical = .TRUE.
    1284              :       CASE (do_method_pm6fm)
    1285            0 :          CALL cite_reference(VanVoorhis2015)
    1286            0 :          qs_control%semi_empirical = .TRUE.
    1287              :       CASE (do_method_pdg)
    1288            2 :          CALL cite_reference(Repasky2002)
    1289            2 :          qs_control%semi_empirical = .TRUE.
    1290              :       CASE (do_method_rm1)
    1291            2 :          CALL cite_reference(Rocha2006)
    1292            2 :          qs_control%semi_empirical = .TRUE.
    1293              :       CASE (do_method_mndod)
    1294           16 :          CALL cite_reference(Dewar1977)
    1295           16 :          CALL cite_reference(Thiel1992)
    1296         9340 :          qs_control%semi_empirical = .TRUE.
    1297              :       END SELECT
    1298              : 
    1299         9324 :       CALL section_vals_get(mull_section, explicit=qs_control%mulliken_restraint)
    1300              : 
    1301         9324 :       IF (qs_control%mulliken_restraint) THEN
    1302            2 :          CALL section_vals_val_get(mull_section, "STRENGTH", r_val=qs_control%mulliken_restraint_control%strength)
    1303            2 :          CALL section_vals_val_get(mull_section, "TARGET", r_val=qs_control%mulliken_restraint_control%target)
    1304            2 :          CALL section_vals_val_get(mull_section, "ATOMS", n_rep_val=n_rep)
    1305            2 :          jj = 0
    1306            4 :          DO k = 1, n_rep
    1307            2 :             CALL section_vals_val_get(mull_section, "ATOMS", i_rep_val=k, i_vals=tmplist)
    1308            4 :             jj = jj + SIZE(tmplist)
    1309              :          END DO
    1310            2 :          qs_control%mulliken_restraint_control%natoms = jj
    1311            2 :          IF (qs_control%mulliken_restraint_control%natoms < 1) THEN
    1312            0 :             CPABORT("Need at least 1 atom to use mulliken constraints")
    1313              :          END IF
    1314            6 :          ALLOCATE (qs_control%mulliken_restraint_control%atoms(qs_control%mulliken_restraint_control%natoms))
    1315            2 :          jj = 0
    1316            6 :          DO k = 1, n_rep
    1317            2 :             CALL section_vals_val_get(mull_section, "ATOMS", i_rep_val=k, i_vals=tmplist)
    1318            6 :             DO j = 1, SIZE(tmplist)
    1319            2 :                jj = jj + 1
    1320            4 :                qs_control%mulliken_restraint_control%atoms(jj) = tmplist(j)
    1321              :             END DO
    1322              :          END DO
    1323              :       END IF
    1324         9324 :       CALL section_vals_get(ddapc_restraint_section, n_repetition=nrep, explicit=qs_control%ddapc_restraint)
    1325         9324 :       IF (qs_control%ddapc_restraint) THEN
    1326           60 :          ALLOCATE (qs_control%ddapc_restraint_control(nrep))
    1327           14 :          CALL read_ddapc_section(qs_control, qs_section=qs_section)
    1328           14 :          qs_control%ddapc_restraint_is_spin = .FALSE.
    1329           14 :          qs_control%ddapc_explicit_potential = .FALSE.
    1330              :       END IF
    1331              : 
    1332         9324 :       CALL section_vals_get(s2_restraint_section, explicit=qs_control%s2_restraint)
    1333         9324 :       IF (qs_control%s2_restraint) THEN
    1334              :          CALL section_vals_val_get(s2_restraint_section, "STRENGTH", &
    1335            0 :                                    r_val=qs_control%s2_restraint_control%strength)
    1336              :          CALL section_vals_val_get(s2_restraint_section, "TARGET", &
    1337            0 :                                    r_val=qs_control%s2_restraint_control%target)
    1338              :          CALL section_vals_val_get(s2_restraint_section, "FUNCTIONAL_FORM", &
    1339            0 :                                    i_val=qs_control%s2_restraint_control%functional_form)
    1340              :       END IF
    1341              : 
    1342         9324 :       CALL section_vals_get(cdft_control_section, explicit=qs_control%cdft)
    1343         9324 :       IF (qs_control%cdft) THEN
    1344          300 :          CALL read_cdft_control_section(qs_control, cdft_control_section)
    1345              :       END IF
    1346              : 
    1347              :       ! Semi-empirical code
    1348         9324 :       IF (qs_control%semi_empirical) THEN
    1349              :          CALL section_vals_val_get(se_section, "ORTHOGONAL_BASIS", &
    1350          998 :                                    l_val=qs_control%se_control%orthogonal_basis)
    1351              :          CALL section_vals_val_get(se_section, "DELTA", &
    1352          998 :                                    r_val=qs_control%se_control%delta)
    1353              :          CALL section_vals_val_get(se_section, "ANALYTICAL_GRADIENTS", &
    1354          998 :                                    l_val=qs_control%se_control%analytical_gradients)
    1355              :          CALL section_vals_val_get(se_section, "FORCE_KDSO-D_EXCHANGE", &
    1356          998 :                                    l_val=qs_control%se_control%force_kdsod_EX)
    1357              :          ! Integral Screening
    1358              :          CALL section_vals_val_get(se_section, "INTEGRAL_SCREENING", &
    1359          998 :                                    i_val=qs_control%se_control%integral_screening)
    1360          998 :          IF (qs_control%method_id == do_method_pnnl) THEN
    1361           14 :             IF (qs_control%se_control%integral_screening /= do_se_IS_slater) THEN
    1362              :                CALL cp_warn(__LOCATION__, &
    1363              :                             "PNNL semi-empirical parameterization supports only the Slater type "// &
    1364            0 :                             "integral scheme. Revert to Slater and continue the calculation.")
    1365              :             END IF
    1366           14 :             qs_control%se_control%integral_screening = do_se_IS_slater
    1367              :          END IF
    1368              :          ! Global Arrays variable
    1369              :          CALL section_vals_val_get(se_section, "GA%NCELLS", &
    1370          998 :                                    i_val=qs_control%se_control%ga_ncells)
    1371              :          ! Long-Range correction
    1372              :          CALL section_vals_val_get(se_section, "LR_CORRECTION%CUTOFF", &
    1373          998 :                                    r_val=qs_control%se_control%cutoff_lrc)
    1374          998 :          qs_control%se_control%taper_lrc = qs_control%se_control%cutoff_lrc
    1375              :          CALL section_vals_val_get(se_section, "LR_CORRECTION%RC_TAPER", &
    1376          998 :                                    explicit=explicit)
    1377          998 :          IF (explicit) THEN
    1378              :             CALL section_vals_val_get(se_section, "LR_CORRECTION%RC_TAPER", &
    1379            0 :                                       r_val=qs_control%se_control%taper_lrc)
    1380              :          END IF
    1381              :          CALL section_vals_val_get(se_section, "LR_CORRECTION%RC_RANGE", &
    1382          998 :                                    r_val=qs_control%se_control%range_lrc)
    1383              :          ! Coulomb
    1384              :          CALL section_vals_val_get(se_section, "COULOMB%CUTOFF", &
    1385          998 :                                    r_val=qs_control%se_control%cutoff_cou)
    1386          998 :          qs_control%se_control%taper_cou = qs_control%se_control%cutoff_cou
    1387              :          CALL section_vals_val_get(se_section, "COULOMB%RC_TAPER", &
    1388          998 :                                    explicit=explicit)
    1389          998 :          IF (explicit) THEN
    1390              :             CALL section_vals_val_get(se_section, "COULOMB%RC_TAPER", &
    1391            0 :                                       r_val=qs_control%se_control%taper_cou)
    1392              :          END IF
    1393              :          CALL section_vals_val_get(se_section, "COULOMB%RC_RANGE", &
    1394          998 :                                    r_val=qs_control%se_control%range_cou)
    1395              :          ! Exchange
    1396              :          CALL section_vals_val_get(se_section, "EXCHANGE%CUTOFF", &
    1397          998 :                                    r_val=qs_control%se_control%cutoff_exc)
    1398          998 :          qs_control%se_control%taper_exc = qs_control%se_control%cutoff_exc
    1399              :          CALL section_vals_val_get(se_section, "EXCHANGE%RC_TAPER", &
    1400          998 :                                    explicit=explicit)
    1401          998 :          IF (explicit) THEN
    1402              :             CALL section_vals_val_get(se_section, "EXCHANGE%RC_TAPER", &
    1403           38 :                                       r_val=qs_control%se_control%taper_exc)
    1404              :          END IF
    1405              :          CALL section_vals_val_get(se_section, "EXCHANGE%RC_RANGE", &
    1406          998 :                                    r_val=qs_control%se_control%range_exc)
    1407              :          ! Screening (only if the integral scheme is of dumped type)
    1408          998 :          IF (qs_control%se_control%integral_screening == do_se_IS_kdso_d) THEN
    1409              :             CALL section_vals_val_get(se_section, "SCREENING%RC_TAPER", &
    1410           14 :                                       r_val=qs_control%se_control%taper_scr)
    1411              :             CALL section_vals_val_get(se_section, "SCREENING%RC_RANGE", &
    1412           14 :                                       r_val=qs_control%se_control%range_scr)
    1413              :          END IF
    1414              :          ! Periodic Type Calculation
    1415              :          CALL section_vals_val_get(se_section, "PERIODIC", &
    1416          998 :                                    i_val=qs_control%se_control%periodic_type)
    1417         1964 :          SELECT CASE (qs_control%se_control%periodic_type)
    1418              :          CASE (do_se_lr_none)
    1419          966 :             qs_control%se_control%do_ewald = .FALSE.
    1420          966 :             qs_control%se_control%do_ewald_r3 = .FALSE.
    1421          966 :             qs_control%se_control%do_ewald_gks = .FALSE.
    1422              :          CASE (do_se_lr_ewald)
    1423           30 :             qs_control%se_control%do_ewald = .TRUE.
    1424           30 :             qs_control%se_control%do_ewald_r3 = .FALSE.
    1425           30 :             qs_control%se_control%do_ewald_gks = .FALSE.
    1426              :          CASE (do_se_lr_ewald_gks)
    1427            2 :             qs_control%se_control%do_ewald = .FALSE.
    1428            2 :             qs_control%se_control%do_ewald_r3 = .FALSE.
    1429            2 :             qs_control%se_control%do_ewald_gks = .TRUE.
    1430            2 :             IF (qs_control%method_id /= do_method_pnnl) THEN
    1431              :                CALL cp_abort(__LOCATION__, &
    1432              :                              "A periodic semi-empirical calculation was requested with a long-range  "// &
    1433              :                              "summation on the single integral evaluation. This scheme is supported  "// &
    1434            0 :                              "only by the PNNL parameterization.")
    1435              :             END IF
    1436              :          CASE (do_se_lr_ewald_r3)
    1437            0 :             qs_control%se_control%do_ewald = .TRUE.
    1438            0 :             qs_control%se_control%do_ewald_r3 = .TRUE.
    1439            0 :             qs_control%se_control%do_ewald_gks = .FALSE.
    1440          998 :             IF (qs_control%se_control%integral_screening /= do_se_IS_kdso) THEN
    1441              :                CALL cp_abort(__LOCATION__, &
    1442              :                              "A periodic semi-empirical calculation was requested with a long-range  "// &
    1443              :                              "summation for the slowly convergent part 1/R^3, which is not congruent "// &
    1444              :                              "with the integral screening chosen. The only integral screening supported "// &
    1445            0 :                              "by this periodic type calculation is the standard Klopman-Dewar-Sabelli-Ohno.")
    1446              :             END IF
    1447              :          END SELECT
    1448              : 
    1449              :          ! dispersion pair potentials
    1450              :          CALL section_vals_val_get(se_section, "DISPERSION", &
    1451          998 :                                    l_val=qs_control%se_control%dispersion)
    1452              :          CALL section_vals_val_get(se_section, "DISPERSION_RADIUS", &
    1453          998 :                                    r_val=qs_control%se_control%rcdisp)
    1454              :          CALL section_vals_val_get(se_section, "COORDINATION_CUTOFF", &
    1455          998 :                                    r_val=qs_control%se_control%epscn)
    1456          998 :          CALL section_vals_val_get(se_section, "D3_SCALING", r_vals=scal)
    1457          998 :          qs_control%se_control%sd3(1) = scal(1)
    1458          998 :          qs_control%se_control%sd3(2) = scal(2)
    1459          998 :          qs_control%se_control%sd3(3) = scal(3)
    1460              :          CALL section_vals_val_get(se_section, "DISPERSION_PARAMETER_FILE", &
    1461          998 :                                    c_val=qs_control%se_control%dispersion_parameter_file)
    1462              : 
    1463              :          ! Stop the execution for non-implemented features
    1464          998 :          IF (qs_control%se_control%periodic_type == do_se_lr_ewald_r3) THEN
    1465            0 :             CPABORT("EWALD_R3 not implemented yet!")
    1466              :          END IF
    1467              : 
    1468              :          IF (qs_control%method_id == do_method_mndo .OR. &
    1469              :              qs_control%method_id == do_method_am1 .OR. &
    1470              :              qs_control%method_id == do_method_mndod .OR. &
    1471              :              qs_control%method_id == do_method_pdg .OR. &
    1472              :              qs_control%method_id == do_method_pm3 .OR. &
    1473              :              qs_control%method_id == do_method_pm6 .OR. &
    1474              :              qs_control%method_id == do_method_pm6fm .OR. &
    1475          998 :              qs_control%method_id == do_method_pnnl .OR. &
    1476              :              qs_control%method_id == do_method_rm1) THEN
    1477          998 :             qs_control%se_control%orthogonal_basis = .TRUE.
    1478              :          END IF
    1479              :       END IF
    1480              : 
    1481              :       ! DFTB code
    1482         9324 :       IF (qs_control%dftb) THEN
    1483              :          CALL section_vals_val_get(dftb_section, "ORTHOGONAL_BASIS", &
    1484          298 :                                    l_val=qs_control%dftb_control%orthogonal_basis)
    1485              :          CALL section_vals_val_get(dftb_section, "SELF_CONSISTENT", &
    1486          298 :                                    l_val=qs_control%dftb_control%self_consistent)
    1487              :          CALL section_vals_val_get(dftb_section, "DISPERSION", &
    1488          298 :                                    l_val=qs_control%dftb_control%dispersion)
    1489              :          CALL section_vals_val_get(dftb_section, "DIAGONAL_DFTB3", &
    1490          298 :                                    l_val=qs_control%dftb_control%dftb3_diagonal)
    1491              :          CALL section_vals_val_get(dftb_section, "HB_SR_GAMMA", &
    1492          298 :                                    l_val=qs_control%dftb_control%hb_sr_damp)
    1493              :          CALL section_vals_val_get(dftb_section, "SCC_MIXER", &
    1494          298 :                                    explicit=dftb_scc_mixer_explicit)
    1495              :          CALL section_vals_val_get(dftb_section, "SCC_MIXER", &
    1496          298 :                                    i_val=qs_control%dftb_control%tblite_scc_mixer)
    1497          298 :          CALL section_vals_get(dftb_tblite_mixer, explicit=dftb_tblite_mixer_explicit)
    1498              :          CALL read_tblite_mixer_section(dftb_tblite_mixer, &
    1499              :                                         qs_control%dftb_control%tblite_mixer_iterations, &
    1500              :                                         qs_control%dftb_control%tblite_mixer_memory, &
    1501              :                                         qs_control%dftb_control%tblite_mixer_solver, &
    1502              :                                         qs_control%dftb_control%tblite_mixer_damping, &
    1503              :                                         qs_control%dftb_control%tblite_mixer_omega0, &
    1504              :                                         qs_control%dftb_control%tblite_mixer_min_weight, &
    1505              :                                         qs_control%dftb_control%tblite_mixer_max_weight, &
    1506              :                                         qs_control%dftb_control%tblite_mixer_weight_factor, &
    1507          298 :                                         "DFTB/TBLITE_MIXER")
    1508          298 :          IF (qs_control%do_ls_scf) THEN
    1509           44 :             IF (dftb_scc_mixer_explicit .AND. &
    1510              :                 qs_control%dftb_control%tblite_scc_mixer /= tblite_scc_mixer_none) THEN
    1511              :                CALL cp_warn(__LOCATION__, &
    1512              :                             "DFTB/SCC_MIXER is reset to NONE with QS/LS_SCF; LS_SCF optimizes "// &
    1513            2 :                             "the density matrix directly.")
    1514              :             END IF
    1515           44 :             IF (dftb_tblite_mixer_explicit) THEN
    1516              :                CALL cp_warn(__LOCATION__, &
    1517              :                             "DFTB/TBLITE_MIXER settings are ignored with QS/LS_SCF; LS_SCF controls "// &
    1518            0 :                             "the density-matrix optimization.")
    1519              :             END IF
    1520           44 :             qs_control%dftb_control%tblite_scc_mixer = tblite_scc_mixer_none
    1521              :          END IF
    1522          298 :          IF (qs_control%dftb_control%tblite_mixer_damping <= 0.0_dp) THEN
    1523            0 :             CPABORT("DFTB/TBLITE_MIXER/DAMPING must be positive")
    1524              :          END IF
    1525              :          CALL section_vals_val_get(dftb_section, "EPS_DISP", &
    1526          298 :                                    r_val=qs_control%dftb_control%eps_disp)
    1527          298 :          CALL section_vals_val_get(dftb_section, "DO_EWALD", explicit=explicit)
    1528          298 :          IF (explicit) THEN
    1529              :             CALL section_vals_val_get(dftb_section, "DO_EWALD", &
    1530          206 :                                       l_val=qs_control%dftb_control%do_ewald)
    1531              :          ELSE
    1532           92 :             qs_control%dftb_control%do_ewald = (qs_control%periodicity /= 0)
    1533              :          END IF
    1534              :          CALL section_vals_val_get(dftb_parameter, "PARAM_FILE_PATH", &
    1535          298 :                                    c_val=qs_control%dftb_control%sk_file_path)
    1536              :          CALL section_vals_val_get(dftb_parameter, "PARAM_FILE_NAME", &
    1537          298 :                                    c_val=qs_control%dftb_control%sk_file_list)
    1538              :          CALL section_vals_val_get(dftb_parameter, "HB_SR_PARAM", &
    1539          298 :                                    r_val=qs_control%dftb_control%hb_sr_para)
    1540          298 :          CALL section_vals_val_get(dftb_parameter, "SK_FILE", n_rep_val=n_var)
    1541          644 :          ALLOCATE (qs_control%dftb_control%sk_pair_list(3, n_var))
    1542          394 :          DO k = 1, n_var
    1543              :             CALL section_vals_val_get(dftb_parameter, "SK_FILE", i_rep_val=k, &
    1544           96 :                                       c_vals=clist)
    1545          682 :             qs_control%dftb_control%sk_pair_list(1:3, k) = clist(1:3)
    1546              :          END DO
    1547              :          ! Dispersion type
    1548              :          CALL section_vals_val_get(dftb_parameter, "DISPERSION_TYPE", &
    1549          298 :                                    i_val=qs_control%dftb_control%dispersion_type)
    1550              :          CALL section_vals_val_get(dftb_parameter, "UFF_FORCE_FIELD", &
    1551          298 :                                    c_val=qs_control%dftb_control%uff_force_field)
    1552              :          ! D3 Dispersion
    1553              :          CALL section_vals_val_get(dftb_parameter, "DISPERSION_RADIUS", &
    1554          298 :                                    r_val=qs_control%dftb_control%rcdisp)
    1555              :          CALL section_vals_val_get(dftb_parameter, "COORDINATION_CUTOFF", &
    1556          298 :                                    r_val=qs_control%dftb_control%epscn)
    1557              :          CALL section_vals_val_get(dftb_parameter, "D2_EXP_PRE", &
    1558          298 :                                    r_val=qs_control%dftb_control%exp_pre)
    1559              :          CALL section_vals_val_get(dftb_parameter, "D2_SCALING", &
    1560          298 :                                    r_val=qs_control%dftb_control%scaling)
    1561          298 :          CALL section_vals_val_get(dftb_parameter, "D3_SCALING", r_vals=scal)
    1562          298 :          qs_control%dftb_control%sd3(1) = scal(1)
    1563          298 :          qs_control%dftb_control%sd3(2) = scal(2)
    1564          298 :          qs_control%dftb_control%sd3(3) = scal(3)
    1565          298 :          CALL section_vals_val_get(dftb_parameter, "D3BJ_SCALING", r_vals=scal)
    1566          298 :          qs_control%dftb_control%sd3bj(1) = scal(1)
    1567          298 :          qs_control%dftb_control%sd3bj(2) = scal(2)
    1568          298 :          qs_control%dftb_control%sd3bj(3) = scal(3)
    1569          298 :          qs_control%dftb_control%sd3bj(4) = scal(4)
    1570              :          CALL section_vals_val_get(dftb_parameter, "DISPERSION_PARAMETER_FILE", &
    1571          298 :                                    c_val=qs_control%dftb_control%dispersion_parameter_file)
    1572              : 
    1573          298 :          IF (qs_control%dftb_control%dispersion) CALL cite_reference(Zhechkov2005)
    1574          298 :          IF (qs_control%dftb_control%self_consistent) CALL cite_reference(Elstner1998)
    1575         1490 :          IF (qs_control%dftb_control%hb_sr_damp) CALL cite_reference(Hu2007)
    1576              :       END IF
    1577              : 
    1578              :       ! xTB code
    1579         9324 :       IF (qs_control%xtb) THEN
    1580         1232 :          CALL section_vals_val_get(xtb_section, "GFN_TYPE", i_val=qs_control%xtb_control%gfn_type)
    1581         1232 :          CALL section_vals_val_get(xtb_tblite, "_SECTION_PARAMETERS_", l_val=tblite_section_active)
    1582         1232 :          qs_control%xtb_control%do_tblite = (qs_control%xtb_control%gfn_type == gfn_tblite)
    1583         1232 :          IF (qs_control%xtb_control%do_tblite) THEN
    1584          198 :             IF (.NOT. tblite_section_active) THEN
    1585            0 :                CPABORT("XTB/GFN_TYPE TBLITE requires an XTB/TBLITE section")
    1586              :             END IF
    1587              :             ! The CP2K-internal GFN1 defaults are still used to initialize shared xTB fields.
    1588          198 :             qs_control%xtb_control%gfn_type = gfn1xtb
    1589         1034 :          ELSE IF (tblite_section_active) THEN
    1590            0 :             CPABORT("The XTB/TBLITE section requires XTB/GFN_TYPE TBLITE")
    1591              :          END IF
    1592              :          CALL section_vals_val_get(xtb_section, "SCC_MIXER", &
    1593         1232 :                                    explicit=xtb_scc_mixer_explicit)
    1594              :          CALL section_vals_val_get(xtb_section, "SCC_MIXER", &
    1595         1232 :                                    i_val=qs_control%xtb_control%tblite_scc_mixer)
    1596         1232 :          CALL section_vals_get(xtb_tblite_mixer, explicit=xtb_tblite_mixer_explicit)
    1597              :          CALL read_tblite_mixer_section(xtb_tblite_mixer, &
    1598              :                                         qs_control%xtb_control%tblite_mixer_iterations, &
    1599              :                                         qs_control%xtb_control%tblite_mixer_memory, &
    1600              :                                         qs_control%xtb_control%tblite_mixer_solver, &
    1601              :                                         qs_control%xtb_control%tblite_mixer_damping, &
    1602              :                                         qs_control%xtb_control%tblite_mixer_omega0, &
    1603              :                                         qs_control%xtb_control%tblite_mixer_min_weight, &
    1604              :                                         qs_control%xtb_control%tblite_mixer_max_weight, &
    1605              :                                         qs_control%xtb_control%tblite_mixer_weight_factor, &
    1606         1232 :                                         "XTB/TBLITE_MIXER")
    1607         1232 :          IF (xtb_tblite_mixer_explicit) THEN
    1608              :             CALL section_vals_val_get(xtb_tblite_mixer, "DAMPING", &
    1609            4 :                                       explicit=qs_control%xtb_control%tblite_mixer_damping_explicit)
    1610              :          END IF
    1611         1232 :          IF ((.NOT. qs_control%xtb_control%do_tblite) .AND. &
    1612              :              qs_control%xtb_control%gfn_type == 0) THEN
    1613              :             IF (xtb_scc_mixer_explicit .AND. &
    1614          694 :                 qs_control%xtb_control%tblite_scc_mixer /= tblite_scc_mixer_auto .AND. &
    1615              :                 qs_control%xtb_control%tblite_scc_mixer /= tblite_scc_mixer_none) THEN
    1616              :                CALL cp_warn(__LOCATION__, &
    1617              :                             "XTB/SCC_MIXER is reset to NONE for CP2K-internal GFN0-xTB; "// &
    1618            0 :                             "GFN0-xTB has no SCC variables to mix.")
    1619              :             END IF
    1620          694 :             IF (xtb_tblite_mixer_explicit) THEN
    1621              :                CALL cp_warn(__LOCATION__, &
    1622              :                             "XTB/TBLITE_MIXER settings are ignored for CP2K-internal GFN0-xTB; "// &
    1623            0 :                             "GFN0-xTB has no SCC variables to mix.")
    1624              :             END IF
    1625          694 :             qs_control%xtb_control%tblite_scc_mixer = tblite_scc_mixer_none
    1626              :          END IF
    1627         1232 :          IF (qs_control%do_ls_scf) THEN
    1628           36 :             IF (xtb_scc_mixer_explicit .AND. &
    1629              :                 qs_control%xtb_control%tblite_scc_mixer /= tblite_scc_mixer_none) THEN
    1630              :                CALL cp_warn(__LOCATION__, &
    1631              :                             "XTB/SCC_MIXER is reset to NONE with QS/LS_SCF; LS_SCF optimizes "// &
    1632            4 :                             "the density matrix directly.")
    1633              :             END IF
    1634           36 :             IF (xtb_tblite_mixer_explicit) THEN
    1635              :                CALL cp_warn(__LOCATION__, &
    1636              :                             "XTB/TBLITE_MIXER settings are ignored with QS/LS_SCF; LS_SCF controls "// &
    1637            0 :                             "the density-matrix optimization.")
    1638              :             END IF
    1639           36 :             qs_control%xtb_control%tblite_scc_mixer = tblite_scc_mixer_none
    1640              :          END IF
    1641         1232 :          IF (qs_control%xtb_control%tblite_mixer_damping <= 0.0_dp) THEN
    1642            0 :             CPABORT("XTB/TBLITE_MIXER/DAMPING must be positive")
    1643              :          END IF
    1644         1232 :          CALL section_vals_val_get(xtb_section, "DO_EWALD", explicit=explicit)
    1645         1232 :          IF (explicit) THEN
    1646              :             CALL section_vals_val_get(xtb_section, "DO_EWALD", &
    1647          776 :                                       l_val=qs_control%xtb_control%do_ewald)
    1648              :          ELSE
    1649          456 :             qs_control%xtb_control%do_ewald = (qs_control%periodicity /= 0)
    1650              :          END IF
    1651              :          ! Spin Polarisation
    1652              :          CALL section_vals_val_get(xtb_section, "SPIN_POLARISATION", &
    1653         1232 :                                    l_val=qs_control%xtb_control%do_spinpol)
    1654              :          ! vdW
    1655         1232 :          CALL section_vals_val_get(xtb_section, "VDW_POTENTIAL", explicit=explicit)
    1656         1232 :          IF (explicit) THEN
    1657          686 :             CALL section_vals_val_get(xtb_section, "VDW_POTENTIAL", c_val=cval)
    1658          686 :             CALL uppercase(cval)
    1659            2 :             SELECT CASE (cval)
    1660              :             CASE ("NONE")
    1661            2 :                qs_control%xtb_control%vdw_type = xtb_vdw_type_none
    1662              :             CASE ("DFTD3")
    1663           56 :                qs_control%xtb_control%vdw_type = xtb_vdw_type_d3
    1664              :             CASE ("DFTD4")
    1665          628 :                qs_control%xtb_control%vdw_type = xtb_vdw_type_d4
    1666              :             CASE DEFAULT
    1667          686 :                CPABORT("vdW type")
    1668              :             END SELECT
    1669              :          ELSE
    1670          562 :             SELECT CASE (qs_control%xtb_control%gfn_type)
    1671              :             CASE (0)
    1672           16 :                qs_control%xtb_control%vdw_type = xtb_vdw_type_d4
    1673              :             CASE (1)
    1674          530 :                qs_control%xtb_control%vdw_type = xtb_vdw_type_d3
    1675              :             CASE (2)
    1676            0 :                qs_control%xtb_control%vdw_type = xtb_vdw_type_d4
    1677            0 :                CPABORT("gfn2-xtb tbd")
    1678              :             CASE DEFAULT
    1679          546 :                CPABORT("GFN type")
    1680              :             END SELECT
    1681              :          END IF
    1682              :          !
    1683         1232 :          CALL section_vals_val_get(xtb_section, "STO_NG", i_val=ngauss)
    1684         1232 :          qs_control%xtb_control%sto_ng = ngauss
    1685         1232 :          CALL section_vals_val_get(xtb_section, "HYDROGEN_STO_NG", i_val=ngauss)
    1686         1232 :          qs_control%xtb_control%h_sto_ng = ngauss
    1687         1232 :          CALL section_vals_val_get(xtb_section, "STO_FLEX", explicit=explicit)
    1688         1232 :          IF (explicit) THEN
    1689              :             CALL section_vals_val_get(xtb_section, "STO_FLEX", &
    1690            6 :                                       l_val=qs_control%xtb_control%sto_flex)
    1691              :          ELSE
    1692         1226 :             qs_control%xtb_control%sto_flex = .FALSE.
    1693              :          END IF
    1694              :          CALL section_vals_val_get(xtb_parameter, "PARAM_FILE_PATH", &
    1695         1232 :                                    c_val=qs_control%xtb_control%parameter_file_path)
    1696         1232 :          CALL section_vals_val_get(xtb_parameter, "PARAM_FILE_NAME", explicit=explicit)
    1697         1232 :          IF (explicit) THEN
    1698              :             CALL section_vals_val_get(xtb_parameter, "PARAM_FILE_NAME", &
    1699            0 :                                       c_val=qs_control%xtb_control%parameter_file_name)
    1700              :          ELSE
    1701         1926 :             SELECT CASE (qs_control%xtb_control%gfn_type)
    1702              :             CASE (0)
    1703          694 :                qs_control%xtb_control%parameter_file_name = "xTB0_parameters"
    1704              :             CASE (1)
    1705          538 :                qs_control%xtb_control%parameter_file_name = "xTB1_parameters"
    1706              :             CASE (2)
    1707            0 :                CPABORT("gfn2-xtb tbd")
    1708              :             CASE DEFAULT
    1709         1232 :                CPABORT("GFN type")
    1710              :             END SELECT
    1711              :          END IF
    1712              :          !
    1713              :          CALL section_vals_val_get(xtb_parameter, "SPINPOL_PARAM_FILE_NAME", &
    1714         1232 :                                    c_val=qs_control%xtb_control%spinpol_param_file_name)
    1715              :          ! D3 Dispersion
    1716              :          CALL section_vals_val_get(xtb_parameter, "DISPERSION_RADIUS", &
    1717         1232 :                                    r_val=qs_control%xtb_control%rcdisp)
    1718              :          CALL section_vals_val_get(xtb_parameter, "COORDINATION_CUTOFF", &
    1719         1232 :                                    r_val=qs_control%xtb_control%epscn)
    1720         1232 :          CALL section_vals_val_get(xtb_parameter, "D3BJ_SCALING", explicit=explicit)
    1721         1232 :          IF (explicit) THEN
    1722            0 :             CALL section_vals_val_get(xtb_parameter, "D3BJ_SCALING", r_vals=scal)
    1723            0 :             qs_control%xtb_control%s6 = scal(1)
    1724            0 :             qs_control%xtb_control%s8 = scal(2)
    1725              :          ELSE
    1726         1926 :             SELECT CASE (qs_control%xtb_control%gfn_type)
    1727              :             CASE (0)
    1728          694 :                qs_control%xtb_control%s6 = 1.00_dp
    1729          694 :                qs_control%xtb_control%s8 = 2.85_dp
    1730              :             CASE (1)
    1731          538 :                qs_control%xtb_control%s6 = 1.00_dp
    1732          538 :                qs_control%xtb_control%s8 = 2.40_dp
    1733              :             CASE (2)
    1734            0 :                CPABORT("gfn2-xtb tbd")
    1735              :             CASE DEFAULT
    1736         1232 :                CPABORT("GFN type")
    1737              :             END SELECT
    1738              :          END IF
    1739         1232 :          CALL section_vals_val_get(xtb_parameter, "D3BJ_PARAM", explicit=explicit)
    1740         1232 :          IF (explicit) THEN
    1741            0 :             CALL section_vals_val_get(xtb_parameter, "D3BJ_PARAM", r_vals=scal)
    1742            0 :             qs_control%xtb_control%a1 = scal(1)
    1743            0 :             qs_control%xtb_control%a2 = scal(2)
    1744              :          ELSE
    1745         1926 :             SELECT CASE (qs_control%xtb_control%gfn_type)
    1746              :             CASE (0)
    1747          694 :                qs_control%xtb_control%a1 = 0.80_dp
    1748          694 :                qs_control%xtb_control%a2 = 4.60_dp
    1749              :             CASE (1)
    1750          538 :                qs_control%xtb_control%a1 = 0.63_dp
    1751          538 :                qs_control%xtb_control%a2 = 5.00_dp
    1752              :             CASE (2)
    1753            0 :                CPABORT("gfn2-xtb tbd")
    1754              :             CASE DEFAULT
    1755         1232 :                CPABORT("GFN type")
    1756              :             END SELECT
    1757              :          END IF
    1758              :          CALL section_vals_val_get(xtb_parameter, "DISPERSION_PARAMETER_FILE", &
    1759         1232 :                                    c_val=qs_control%xtb_control%dispersion_parameter_file)
    1760              :          ! global parameters
    1761         1232 :          CALL section_vals_val_get(xtb_parameter, "HUCKEL_CONSTANTS", explicit=explicit)
    1762         1232 :          IF (explicit) THEN
    1763            0 :             CALL section_vals_val_get(xtb_parameter, "HUCKEL_CONSTANTS", r_vals=scal)
    1764            0 :             qs_control%xtb_control%ks = scal(1)
    1765            0 :             qs_control%xtb_control%kp = scal(2)
    1766            0 :             qs_control%xtb_control%kd = scal(3)
    1767            0 :             qs_control%xtb_control%ksp = scal(4)
    1768            0 :             qs_control%xtb_control%k2sh = scal(5)
    1769            0 :             IF (qs_control%xtb_control%gfn_type == 0) THEN
    1770              :                ! enforce ksp for gfn0
    1771            0 :                qs_control%xtb_control%ksp = 0.5_dp*(scal(1) + scal(2))
    1772              :             END IF
    1773              :          ELSE
    1774         1926 :             SELECT CASE (qs_control%xtb_control%gfn_type)
    1775              :             CASE (0)
    1776          694 :                qs_control%xtb_control%ks = 2.00_dp
    1777          694 :                qs_control%xtb_control%kp = 2.4868_dp
    1778          694 :                qs_control%xtb_control%kd = 2.27_dp
    1779          694 :                qs_control%xtb_control%ksp = 2.2434_dp
    1780          694 :                qs_control%xtb_control%k2sh = 1.1241_dp
    1781              :             CASE (1)
    1782          538 :                qs_control%xtb_control%ks = 1.85_dp
    1783          538 :                qs_control%xtb_control%kp = 2.25_dp
    1784          538 :                qs_control%xtb_control%kd = 2.00_dp
    1785          538 :                qs_control%xtb_control%ksp = 2.08_dp
    1786          538 :                qs_control%xtb_control%k2sh = 2.85_dp
    1787              :             CASE (2)
    1788            0 :                CPABORT("gfn2-xtb tbd")
    1789              :             CASE DEFAULT
    1790         1232 :                CPABORT("GFN type")
    1791              :             END SELECT
    1792              :          END IF
    1793         1232 :          CALL section_vals_val_get(xtb_parameter, "COULOMB_CONSTANTS", explicit=explicit)
    1794         1232 :          IF (explicit) THEN
    1795            0 :             CALL section_vals_val_get(xtb_parameter, "COULOMB_CONSTANTS", r_vals=scal)
    1796            0 :             qs_control%xtb_control%kg = scal(1)
    1797            0 :             qs_control%xtb_control%kf = scal(2)
    1798              :          ELSE
    1799         1926 :             SELECT CASE (qs_control%xtb_control%gfn_type)
    1800              :             CASE (0)
    1801          694 :                qs_control%xtb_control%kg = 2.00_dp
    1802          694 :                qs_control%xtb_control%kf = 1.50_dp
    1803              :             CASE (1)
    1804          538 :                qs_control%xtb_control%kg = 2.00_dp
    1805          538 :                qs_control%xtb_control%kf = 1.50_dp
    1806              :             CASE (2)
    1807            0 :                CPABORT("gfn2-xtb tbd")
    1808              :             CASE DEFAULT
    1809         1232 :                CPABORT("GFN type")
    1810              :             END SELECT
    1811              :          END IF
    1812         1232 :          CALL section_vals_val_get(xtb_parameter, "CN_CONSTANTS", r_vals=scal)
    1813         1232 :          qs_control%xtb_control%kcns = scal(1)
    1814         1232 :          qs_control%xtb_control%kcnp = scal(2)
    1815         1232 :          qs_control%xtb_control%kcnd = scal(3)
    1816              :          !
    1817         1232 :          CALL section_vals_val_get(xtb_parameter, "EN_CONSTANTS", explicit=explicit)
    1818         1232 :          IF (explicit) THEN
    1819            0 :             CALL section_vals_val_get(xtb_parameter, "EN_CONSTANTS", r_vals=scal)
    1820            0 :             SELECT CASE (qs_control%xtb_control%gfn_type)
    1821              :             CASE (0)
    1822            0 :                qs_control%xtb_control%ksen = scal(1)
    1823            0 :                qs_control%xtb_control%kpen = scal(2)
    1824            0 :                qs_control%xtb_control%kden = scal(3)
    1825              :             CASE (1)
    1826            0 :                qs_control%xtb_control%ken = scal(1)
    1827              :             CASE (2)
    1828            0 :                CPABORT("gfn2-xtb tbd")
    1829              :             CASE DEFAULT
    1830            0 :                CPABORT("GFN type")
    1831              :             END SELECT
    1832              :          ELSE
    1833         1926 :             SELECT CASE (qs_control%xtb_control%gfn_type)
    1834              :             CASE (0)
    1835          694 :                qs_control%xtb_control%ksen = 0.006_dp
    1836          694 :                qs_control%xtb_control%kpen = -0.001_dp
    1837          694 :                qs_control%xtb_control%kden = -0.002_dp
    1838              :             CASE (1)
    1839          538 :                qs_control%xtb_control%ken = -0.007_dp
    1840              :             CASE (2)
    1841            0 :                CPABORT("gfn2-xtb tbd")
    1842              :             CASE DEFAULT
    1843         1232 :                CPABORT("GFN type")
    1844              :             END SELECT
    1845              :          END IF
    1846              :          ! ben
    1847         1232 :          CALL section_vals_val_get(xtb_parameter, "BEN_CONSTANT", r_vals=scal)
    1848         1232 :          qs_control%xtb_control%ben = scal(1)
    1849              :          ! enscale (hidden parameter in repulsion
    1850         1232 :          CALL section_vals_val_get(xtb_parameter, "ENSCALE", explicit=explicit)
    1851         1232 :          IF (explicit) THEN
    1852              :             CALL section_vals_val_get(xtb_parameter, "ENSCALE", &
    1853            0 :                                       r_val=qs_control%xtb_control%enscale)
    1854              :          ELSE
    1855         1926 :             SELECT CASE (qs_control%xtb_control%gfn_type)
    1856              :             CASE (0)
    1857          694 :                qs_control%xtb_control%enscale = -0.09_dp
    1858              :             CASE (1)
    1859          538 :                qs_control%xtb_control%enscale = 0._dp
    1860              :             CASE (2)
    1861            0 :                CPABORT("gfn2-xtb tbd")
    1862              :             CASE DEFAULT
    1863         1232 :                CPABORT("GFN type")
    1864              :             END SELECT
    1865              :          END IF
    1866              :          ! XB
    1867              :          CALL section_vals_val_get(xtb_section, "USE_HALOGEN_CORRECTION", &
    1868         1232 :                                    l_val=qs_control%xtb_control%xb_interaction)
    1869         1232 :          CALL section_vals_val_get(xtb_parameter, "HALOGEN_BINDING", r_vals=scal)
    1870         1232 :          qs_control%xtb_control%kxr = scal(1)
    1871         1232 :          qs_control%xtb_control%kx2 = scal(2)
    1872              :          ! NONBONDED interactions
    1873              :          CALL section_vals_val_get(xtb_section, "DO_NONBONDED", &
    1874         1232 :                                    l_val=qs_control%xtb_control%do_nonbonded)
    1875         1232 :          CALL section_vals_get(nonbonded_section, explicit=explicit)
    1876         1232 :          IF (explicit .AND. qs_control%xtb_control%do_nonbonded) THEN
    1877            6 :             CALL section_vals_get(genpot_section, explicit=explicit, n_repetition=ngp)
    1878            6 :             IF (explicit) THEN
    1879            6 :                CALL pair_potential_reallocate(qs_control%xtb_control%nonbonded, 1, ngp, gp=.TRUE.)
    1880            6 :                CALL read_gp_section(qs_control%xtb_control%nonbonded, genpot_section, 0)
    1881              :             END IF
    1882              :          END IF !nonbonded
    1883              :          CALL section_vals_val_get(xtb_section, "EPS_PAIRPOTENTIAL", &
    1884         1232 :                                    r_val=qs_control%xtb_control%eps_pair)
    1885              :          ! SR Coulomb
    1886         1232 :          CALL section_vals_val_get(xtb_parameter, "COULOMB_SR_CUT", r_vals=scal)
    1887         1232 :          qs_control%xtb_control%coulomb_sr_cut = scal(1)
    1888         1232 :          CALL section_vals_val_get(xtb_parameter, "COULOMB_SR_EPS", r_vals=scal)
    1889         1232 :          qs_control%xtb_control%coulomb_sr_eps = scal(1)
    1890              :          ! XB_radius
    1891         1232 :          CALL section_vals_val_get(xtb_parameter, "XB_RADIUS", r_val=qs_control%xtb_control%xb_radius)
    1892              :          ! Kab
    1893         1232 :          CALL section_vals_val_get(xtb_parameter, "KAB_PARAM", n_rep_val=n_rep)
    1894              :          ! Coulomb
    1895         1926 :          SELECT CASE (qs_control%xtb_control%gfn_type)
    1896              :          CASE (0)
    1897          694 :             qs_control%xtb_control%coulomb_interaction = .FALSE.
    1898          694 :             qs_control%xtb_control%coulomb_lr = .FALSE.
    1899          694 :             qs_control%xtb_control%tb3_interaction = .FALSE.
    1900          694 :             qs_control%xtb_control%check_atomic_charges = .FALSE.
    1901              :             CALL section_vals_val_get(xtb_section, "VARIATIONAL_DIPOLE", &
    1902          694 :                                       l_val=qs_control%xtb_control%var_dipole)
    1903              :          CASE (1)
    1904              :             ! For debugging purposes
    1905              :             CALL section_vals_val_get(xtb_section, "COULOMB_INTERACTION", &
    1906          538 :                                       l_val=qs_control%xtb_control%coulomb_interaction)
    1907              :             CALL section_vals_val_get(xtb_section, "COULOMB_LR", &
    1908          538 :                                       l_val=qs_control%xtb_control%coulomb_lr)
    1909              :             CALL section_vals_val_get(xtb_section, "TB3_INTERACTION", &
    1910          538 :                                       l_val=qs_control%xtb_control%tb3_interaction)
    1911              :             ! Check for bad atomic charges
    1912              :             CALL section_vals_val_get(xtb_section, "CHECK_ATOMIC_CHARGES", &
    1913          538 :                                       l_val=qs_control%xtb_control%check_atomic_charges)
    1914          538 :             qs_control%xtb_control%var_dipole = .FALSE.
    1915              :          CASE (2)
    1916            0 :             CPABORT("gfn2-xtb tbd")
    1917              :          CASE DEFAULT
    1918         1232 :             CPABORT("GFN type")
    1919              :          END SELECT
    1920         1232 :          qs_control%xtb_control%kab_nval = n_rep
    1921         1232 :          IF (n_rep > 0) THEN
    1922            6 :             ALLOCATE (qs_control%xtb_control%kab_param(3, n_rep))
    1923            6 :             ALLOCATE (qs_control%xtb_control%kab_types(2, n_rep))
    1924            6 :             ALLOCATE (qs_control%xtb_control%kab_vals(n_rep))
    1925            4 :             DO j = 1, n_rep
    1926            2 :                CALL section_vals_val_get(xtb_parameter, "KAB_PARAM", i_rep_val=j, c_vals=clist)
    1927            2 :                qs_control%xtb_control%kab_param(1, j) = clist(1)
    1928              :                CALL get_ptable_info(clist(1) (1:2), &
    1929            2 :                                     ielement=qs_control%xtb_control%kab_types(1, j))
    1930            2 :                qs_control%xtb_control%kab_param(2, j) = clist(2)
    1931              :                CALL get_ptable_info(clist(2) (1:2), &
    1932            2 :                                     ielement=qs_control%xtb_control%kab_types(2, j))
    1933            2 :                qs_control%xtb_control%kab_param(3, j) = clist(3)
    1934            4 :                READ (clist(3), '(F10.0)') qs_control%xtb_control%kab_vals(j)
    1935              :             END DO
    1936              :          END IF
    1937              : 
    1938              :          ! Spin Polarisation
    1939         1232 :          CALL section_vals_val_get(xtb_parameter, "SPIN_POL_PARAM", n_rep_val=n_rep)
    1940         1232 :          IF (n_rep > 0) THEN
    1941            6 :             ALLOCATE (qs_control%xtb_control%spinpol_type(n_rep))
    1942            6 :             ALLOCATE (qs_control%xtb_control%spinpol_vals(6, n_rep))
    1943            8 :             DO j = 1, n_rep
    1944            6 :                CALL section_vals_val_get(xtb_parameter, "SPIN_POL_PARAM", i_rep_val=j, c_vals=clist)
    1945            6 :                READ (clist(1), '(A)') cval
    1946            6 :                element_symbol = ADJUSTL(TRIM(cval))
    1947            6 :                CALL get_ptable_info(element_symbol, znum)
    1948            6 :                qs_control%xtb_control%spinpol_type(j) = znum
    1949            6 :                READ (clist(2), '(F20.8)') qs_control%xtb_control%spinpol_vals(1, j)
    1950            6 :                READ (clist(3), '(F20.8)') qs_control%xtb_control%spinpol_vals(2, j)
    1951            6 :                READ (clist(4), '(F20.8)') qs_control%xtb_control%spinpol_vals(3, j)
    1952            6 :                READ (clist(5), '(F20.8)') qs_control%xtb_control%spinpol_vals(4, j)
    1953            6 :                READ (clist(6), '(F20.8)') qs_control%xtb_control%spinpol_vals(5, j)
    1954           14 :                READ (clist(7), '(F20.8)') qs_control%xtb_control%spinpol_vals(6, j)
    1955              :             END DO
    1956              :          END IF
    1957              : 
    1958         1232 :          IF (qs_control%xtb_control%gfn_type == 0) THEN
    1959          694 :             CALL section_vals_val_get(xtb_parameter, "SRB_PARAMETER", r_vals=scal)
    1960          694 :             qs_control%xtb_control%ksrb = scal(1)
    1961          694 :             qs_control%xtb_control%esrb = scal(2)
    1962          694 :             qs_control%xtb_control%gscal = scal(3)
    1963          694 :             qs_control%xtb_control%c1srb = scal(4)
    1964          694 :             qs_control%xtb_control%c2srb = scal(5)
    1965          694 :             qs_control%xtb_control%shift = scal(6)
    1966              :          END IF
    1967              : 
    1968         1232 :          CALL section_vals_val_get(xtb_section, "EN_SHIFT_TYPE", c_val=cval)
    1969         1232 :          CALL uppercase(cval)
    1970         1232 :          SELECT CASE (TRIM(cval))
    1971              :          CASE ("SELECT")
    1972            0 :             qs_control%xtb_control%enshift_type = 0
    1973              :          CASE ("MOLECULE")
    1974         1232 :             qs_control%xtb_control%enshift_type = 1
    1975              :          CASE ("CRYSTAL")
    1976            0 :             qs_control%xtb_control%enshift_type = 2
    1977              :          CASE DEFAULT
    1978         1232 :             CPABORT("Unknown value for EN_SHIFT_TYPE")
    1979              :          END SELECT
    1980              : 
    1981              :          ! EEQ solver params
    1982         1232 :          CALL read_eeq_param(eeq_section, qs_control%xtb_control%eeq_sparam)
    1983              :       END IF
    1984              : 
    1985              :       ! Optimize LRI basis set
    1986         9324 :       CALL section_vals_get(lri_optbas_section, explicit=qs_control%lri_optbas)
    1987              : 
    1988              :       ! Use tblite if selected through XTB/GFN_TYPE TBLITE.
    1989         9324 :       IF (qs_control%xtb_control%do_tblite) THEN
    1990              :          CALL section_vals_val_get(xtb_tblite, "METHOD", &
    1991          198 :                                    i_val=qs_control%xtb_control%tblite_method)
    1992              :          CALL section_vals_val_get(xtb_tblite, "PARAM", &
    1993          198 :                                    c_val=qs_control%xtb_control%tblite_param_file)
    1994              :          CALL section_vals_val_get(xtb_tblite, "ACCURACY", &
    1995          198 :                                    r_val=qs_control%xtb_control%tblite_accuracy)
    1996          198 :          IF (qs_control%xtb_control%tblite_accuracy <= 0.0_dp) THEN
    1997            0 :             CPABORT("XTB/TBLITE/ACCURACY must be positive")
    1998              :          END IF
    1999          198 :          IF (qs_control%xtb_control%tblite_mixer_damping <= 0.0_dp) THEN
    2000            0 :             CPABORT("XTB/TBLITE_MIXER/DAMPING must be positive")
    2001              :          END IF
    2002          198 :          CALL section_vals_val_get(xtb_tblite, "REFERENCE_CLI", l_val=tblite_reference_cli)
    2003          198 :          CALL section_vals_get(xtb_tblite_ref_cli, explicit=tblite_reference_cli_section)
    2004          198 :          IF (tblite_reference_cli .AND. (.NOT. tblite_reference_cli_section)) THEN
    2005            0 :             CPABORT("XTB/TBLITE/REFERENCE_CLI keyword requires an XTB/TBLITE/REFERENCE_CLI section")
    2006              :          END IF
    2007          198 :          IF (tblite_reference_cli .OR. tblite_reference_cli_section) THEN
    2008            2 :             CALL read_xtb_reference_cli_section(xtb_tblite_ref_cli, qs_control%xtb_control%reference_cli, cell)
    2009            2 :             qs_control%xtb_control%reference_cli%enabled = .TRUE.
    2010              :          END IF
    2011          198 :          CALL cite_reference(Katbashev2025)
    2012              :          ! tblite handles periodic long-range terms internally from the CP2K cell periodicity.
    2013              :          ! Keep xtb_control%do_ewald as read above from XTB/DO_EWALD or SUBSYS/CELL/PERIODIC,
    2014              :          ! matching the DFTB and CP2K-internal xTB setup.
    2015              :       END IF
    2016              : 
    2017         9324 :       CALL timestop(handle)
    2018         9324 :    END SUBROUTINE read_qs_section
    2019              : 
    2020              : ! **************************************************************************************************
    2021              : !> \brief Read a TBLITE_MIXER section.
    2022              : !> \param mixer_section input section
    2023              : !> \param iterations tblite SCC iteration limit
    2024              : !> \param memory Broyden history length
    2025              : !> \param solver native tblite electronic solver id
    2026              : !> \param damping mixer damping parameter
    2027              : !> \param omega0 Broyden regularization weight
    2028              : !> \param min_weight minimum dynamic Broyden weight
    2029              : !> \param max_weight maximum dynamic Broyden weight
    2030              : !> \param weight_factor residual-to-weight scaling factor
    2031              : !> \param section_name diagnostic section name
    2032              : ! **************************************************************************************************
    2033         1578 :    SUBROUTINE read_tblite_mixer_section(mixer_section, iterations, memory, solver, damping, omega0, min_weight, &
    2034              :                                         max_weight, weight_factor, section_name)
    2035              :       TYPE(section_vals_type), POINTER                   :: mixer_section
    2036              :       INTEGER, INTENT(INOUT)                             :: iterations, memory, solver
    2037              :       REAL(KIND=dp), INTENT(INOUT)                       :: damping, omega0, min_weight, max_weight, &
    2038              :                                                             weight_factor
    2039              :       CHARACTER(LEN=*), INTENT(IN)                       :: section_name
    2040              : 
    2041              :       LOGICAL                                            :: explicit, memory_explicit
    2042              : 
    2043         1530 :       CALL section_vals_get(mixer_section, explicit=explicit)
    2044         1530 :       IF (.NOT. explicit) RETURN
    2045              : 
    2046            6 :       CALL section_vals_val_get(mixer_section, "ITERATIONS", i_val=iterations)
    2047            6 :       CALL section_vals_val_get(mixer_section, "MEMORY", explicit=memory_explicit)
    2048            6 :       IF (memory_explicit) CALL section_vals_val_get(mixer_section, "MEMORY", i_val=memory)
    2049            6 :       IF (.NOT. memory_explicit .OR. memory == tblite_mixer_memory_inherit) THEN
    2050            2 :          memory = iterations
    2051              :       END IF
    2052            6 :       CALL section_vals_val_get(mixer_section, "SOLVER", i_val=solver)
    2053            6 :       CALL section_vals_val_get(mixer_section, "DAMPING", r_val=damping)
    2054            6 :       CALL section_vals_val_get(mixer_section, "OMEGA0", r_val=omega0)
    2055            6 :       CALL section_vals_val_get(mixer_section, "MIN_WEIGHT", r_val=min_weight)
    2056            6 :       CALL section_vals_val_get(mixer_section, "MAX_WEIGHT", r_val=max_weight)
    2057            6 :       CALL section_vals_val_get(mixer_section, "WEIGHT_FACTOR", r_val=weight_factor)
    2058              : 
    2059            6 :       IF (iterations < 1) CPABORT(TRIM(section_name)//"/ITERATIONS must be positive")
    2060            6 :       IF (memory < 1) CPABORT(TRIM(section_name)//"/MEMORY must be positive")
    2061            6 :       SELECT CASE (solver)
    2062              :       CASE (tblite_solver_gvd, tblite_solver_gvr)
    2063              :       CASE DEFAULT
    2064            6 :          CPABORT(TRIM(section_name)//"/SOLVER must be GVD or GVR")
    2065              :       END SELECT
    2066            6 :       IF (damping <= 0.0_dp) CPABORT(TRIM(section_name)//"/DAMPING must be positive")
    2067            6 :       IF (omega0 <= 0.0_dp) CPABORT(TRIM(section_name)//"/OMEGA0 must be positive")
    2068            6 :       IF (min_weight <= 0.0_dp) CPABORT(TRIM(section_name)//"/MIN_WEIGHT must be positive")
    2069            6 :       IF (max_weight <= 0.0_dp) CPABORT(TRIM(section_name)//"/MAX_WEIGHT must be positive")
    2070            6 :       IF (max_weight < min_weight) THEN
    2071            0 :          CPABORT(TRIM(section_name)//"/MAX_WEIGHT must not be smaller than MIN_WEIGHT")
    2072              :       END IF
    2073            6 :       IF (weight_factor <= 0.0_dp) CPABORT(TRIM(section_name)//"/WEIGHT_FACTOR must be positive")
    2074              : 
    2075              :    END SUBROUTINE read_tblite_mixer_section
    2076              : 
    2077              : ! **************************************************************************************************
    2078              : !> \brief Read native tblite CLI reference options.
    2079              : !> \param ref_cli_section input section
    2080              : !> \param ref_cli reference CLI control data
    2081              : !> \param cell optional cell used to transform Cartesian input vectors
    2082              : ! **************************************************************************************************
    2083            2 :    SUBROUTINE read_xtb_reference_cli_section(ref_cli_section, ref_cli, cell)
    2084              :       TYPE(section_vals_type), POINTER                   :: ref_cli_section
    2085              :       TYPE(xtb_reference_cli_type), INTENT(INOUT)        :: ref_cli
    2086              :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell
    2087              : 
    2088            2 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: efield
    2089              :       TYPE(section_vals_type), POINTER                   :: fit_section, guess_section, &
    2090              :                                                             param_section, solvation_section, &
    2091              :                                                             tagdiff_section
    2092              : 
    2093            2 :       CALL section_vals_val_get(ref_cli_section, "_SECTION_PARAMETERS_", l_val=ref_cli%enabled)
    2094            2 :       CALL section_vals_val_get(ref_cli_section, "PROGRAM_NAME", c_val=ref_cli%program_name)
    2095            2 :       CALL section_vals_val_get(ref_cli_section, "GUESS", i_val=ref_cli%guess)
    2096            2 :       CALL section_vals_val_get(ref_cli_section, "WORK_DIRECTORY", c_val=ref_cli%work_directory)
    2097            2 :       CALL section_vals_val_get(ref_cli_section, "PREFIX", c_val=ref_cli%prefix)
    2098            2 :       CALL section_vals_val_get(ref_cli_section, "INPUT_FORMAT", c_val=ref_cli%input_format)
    2099            2 :       CALL section_vals_val_get(ref_cli_section, "RESTART", c_val=ref_cli%restart_file)
    2100            2 :       CALL section_vals_val_get(ref_cli_section, "GRAD", c_val=ref_cli%grad_file)
    2101            2 :       CALL section_vals_val_get(ref_cli_section, "JSON", c_val=ref_cli%json_file)
    2102            2 :       CALL section_vals_val_get(ref_cli_section, "POST_PROCESSING", c_val=ref_cli%post_processing)
    2103              :       CALL section_vals_val_get(ref_cli_section, "POST_PROCESSING_OUTPUT", &
    2104            2 :                                 c_val=ref_cli%post_processing_output_file)
    2105            2 :       CALL section_vals_val_get(ref_cli_section, "EFIELD", explicit=ref_cli%efield_active)
    2106            2 :       IF (ref_cli%efield_active) THEN
    2107            2 :          NULLIFY (efield)
    2108            2 :          CALL section_vals_val_get(ref_cli_section, "EFIELD", r_vals=efield)
    2109            8 :          ref_cli%efield = efield(1:3)
    2110            2 :          IF (PRESENT(cell)) THEN
    2111            2 :             IF (ASSOCIATED(cell)) CALL cell_transform_input_cartesian(cell, ref_cli%efield)
    2112              :          END IF
    2113              :       END IF
    2114            2 :       solvation_section => section_vals_get_subs_vals(ref_cli_section, "IMPLICIT_SOLVATION")
    2115            2 :       CALL section_vals_get(solvation_section, explicit=ref_cli%solvation_active)
    2116            2 :       IF (ref_cli%solvation_active) THEN
    2117            2 :          CALL section_vals_val_get(solvation_section, "MODEL", i_val=ref_cli%solvation_model)
    2118            2 :          CALL section_vals_val_get(solvation_section, "SOLVENT", c_val=ref_cli%solvation_solvent)
    2119            2 :          CALL section_vals_val_get(solvation_section, "BORN_KERNEL", i_val=ref_cli%solvation_born_kernel)
    2120            2 :          CALL section_vals_val_get(solvation_section, "SOLUTION_STATE", i_val=ref_cli%solvation_state)
    2121            2 :          IF (LEN_TRIM(ref_cli%solvation_solvent) == 0) THEN
    2122            0 :             CPABORT("REFERENCE_CLI implicit solvation needs SOLVENT")
    2123              :          END IF
    2124            2 :          IF (ref_cli%solvation_model == tblite_cli_solvation_cpcm .AND. &
    2125              :              ref_cli%solvation_born_kernel /= tblite_cli_born_kernel_auto) THEN
    2126            0 :             CPABORT("BORN_KERNEL is invalid with MODEL CPCM")
    2127              :          END IF
    2128            2 :          IF (ref_cli%solvation_state /= tblite_cli_solution_state_gsolv) THEN
    2129            2 :             SELECT CASE (ref_cli%solvation_model)
    2130              :             CASE (tblite_cli_solvation_alpb, tblite_cli_solvation_gbsa)
    2131              :                ! Native tblite supports solution-state shifts for parametrized named-solvent ALPB/GBSA.
    2132              :             CASE (tblite_cli_solvation_gbe, tblite_cli_solvation_gb, tblite_cli_solvation_cpcm)
    2133            2 :                CPABORT("SOLUTION_STATE is valid only for ALPB/GBSA")
    2134              :             END SELECT
    2135              :          END IF
    2136              :       END IF
    2137              :       CALL section_vals_val_get(ref_cli_section, "ELECTRONIC_TEMPERATURE_GUESS", &
    2138            2 :                                 r_val=ref_cli%electronic_temperature_guess)
    2139            2 :       IF (ref_cli%electronic_temperature_guess < 0.0_dp) THEN
    2140            0 :          CPABORT("XTB/TBLITE/REFERENCE_CLI/ELECTRONIC_TEMPERATURE_GUESS must not be negative")
    2141              :       END IF
    2142            2 :       IF (ref_cli%electronic_temperature_guess > 0.0_dp .AND. ref_cli%guess /= tblite_guess_ceh) THEN
    2143            0 :          CPABORT("XTB/TBLITE/REFERENCE_CLI/ELECTRONIC_TEMPERATURE_GUESS requires GUESS CEH")
    2144              :       END IF
    2145            2 :       guess_section => section_vals_get_subs_vals(ref_cli_section, "GUESS_CLI")
    2146            2 :       CALL section_vals_get(guess_section, explicit=ref_cli%guess_cli%enabled)
    2147            2 :       IF (ref_cli%guess_cli%enabled) THEN
    2148            0 :          CALL section_vals_val_get(guess_section, "METHOD", i_val=ref_cli%guess_cli%method)
    2149              :          CALL section_vals_val_get(guess_section, "ELECTRONIC_TEMPERATURE_GUESS", &
    2150            0 :                                    r_val=ref_cli%guess_cli%electronic_temperature_guess)
    2151            0 :          IF (ref_cli%guess_cli%electronic_temperature_guess < 0.0_dp) THEN
    2152            0 :             CPABORT("REFERENCE_CLI/GUESS_CLI/ELECTRONIC_TEMPERATURE_GUESS must not be negative")
    2153              :          END IF
    2154            0 :          CALL section_vals_val_get(guess_section, "SOLVER", i_val=ref_cli%guess_cli%solver)
    2155            0 :          CALL section_vals_val_get(guess_section, "EFIELD", explicit=ref_cli%guess_cli%efield_active)
    2156            0 :          IF (ref_cli%guess_cli%efield_active) THEN
    2157            0 :             NULLIFY (efield)
    2158            0 :             CALL section_vals_val_get(guess_section, "EFIELD", r_vals=efield)
    2159            0 :             ref_cli%guess_cli%efield = efield(1:3)
    2160            0 :             IF (PRESENT(cell)) THEN
    2161            0 :                IF (ASSOCIATED(cell)) CALL cell_transform_input_cartesian(cell, ref_cli%guess_cli%efield)
    2162              :             END IF
    2163              :          END IF
    2164            0 :          CALL section_vals_val_get(guess_section, "GRAD", l_val=ref_cli%guess_cli%grad)
    2165            0 :          CALL section_vals_val_get(guess_section, "JSON", c_val=ref_cli%guess_cli%json_file)
    2166            0 :          CALL section_vals_val_get(guess_section, "INPUT_FORMAT", c_val=ref_cli%guess_cli%input_format)
    2167            0 :          CALL section_vals_val_get(guess_section, "INPUT_FILE", c_val=ref_cli%guess_cli%input_file)
    2168              :       END IF
    2169            2 :       param_section => section_vals_get_subs_vals(ref_cli_section, "PARAM_CLI")
    2170            2 :       CALL section_vals_get(param_section, explicit=ref_cli%param_cli%enabled)
    2171            2 :       IF (ref_cli%param_cli%enabled) THEN
    2172              :          CALL section_vals_val_get(param_section, "METHOD", explicit=ref_cli%param_cli%method_explicit, &
    2173            0 :                                    i_val=ref_cli%param_cli%method)
    2174            0 :          CALL section_vals_val_get(param_section, "OUTPUT", c_val=ref_cli%param_cli%output_file)
    2175            0 :          CALL section_vals_val_get(param_section, "INPUT_FILE", c_val=ref_cli%param_cli%input_file)
    2176              :       END IF
    2177            2 :       fit_section => section_vals_get_subs_vals(ref_cli_section, "FIT_CLI")
    2178            2 :       CALL section_vals_get(fit_section, explicit=ref_cli%fit_cli%enabled)
    2179            2 :       IF (ref_cli%fit_cli%enabled) THEN
    2180            0 :          CALL section_vals_val_get(fit_section, "PARAM_FILE", c_val=ref_cli%fit_cli%param_file)
    2181            0 :          CALL section_vals_val_get(fit_section, "INPUT_FILE", c_val=ref_cli%fit_cli%input_file)
    2182            0 :          CALL section_vals_val_get(fit_section, "DRY_RUN", l_val=ref_cli%fit_cli%dry_run)
    2183            0 :          CALL section_vals_val_get(fit_section, "COPY", c_val=ref_cli%fit_cli%copy_file)
    2184            0 :          IF (LEN_TRIM(ref_cli%fit_cli%param_file) == 0) THEN
    2185            0 :             CPABORT("XTB/TBLITE/REFERENCE_CLI/FIT_CLI needs PARAM_FILE")
    2186              :          END IF
    2187            0 :          IF (LEN_TRIM(ref_cli%fit_cli%input_file) == 0) THEN
    2188            0 :             CPABORT("XTB/TBLITE/REFERENCE_CLI/FIT_CLI needs INPUT_FILE")
    2189              :          END IF
    2190              :       END IF
    2191            2 :       tagdiff_section => section_vals_get_subs_vals(ref_cli_section, "TAGDIFF_CLI")
    2192            2 :       CALL section_vals_get(tagdiff_section, explicit=ref_cli%tagdiff_cli%enabled)
    2193            2 :       IF (ref_cli%tagdiff_cli%enabled) THEN
    2194            0 :          CALL section_vals_val_get(tagdiff_section, "ACTUAL", c_val=ref_cli%tagdiff_cli%actual_file)
    2195            0 :          CALL section_vals_val_get(tagdiff_section, "REFERENCE", c_val=ref_cli%tagdiff_cli%reference_file)
    2196            0 :          CALL section_vals_val_get(tagdiff_section, "FIT", l_val=ref_cli%tagdiff_cli%fit)
    2197            0 :          IF (LEN_TRIM(ref_cli%tagdiff_cli%actual_file) == 0) THEN
    2198            0 :             CPABORT("XTB/TBLITE/REFERENCE_CLI/TAGDIFF_CLI needs ACTUAL")
    2199              :          END IF
    2200            0 :          IF (LEN_TRIM(ref_cli%tagdiff_cli%reference_file) == 0) THEN
    2201            0 :             CPABORT("XTB/TBLITE/REFERENCE_CLI/TAGDIFF_CLI needs REFERENCE")
    2202              :          END IF
    2203              :       END IF
    2204            2 :       CALL section_vals_val_get(ref_cli_section, "KEEP_FILES", l_val=ref_cli%keep_files)
    2205            2 :       CALL section_vals_val_get(ref_cli_section, "ERROR_LIMIT", r_val=ref_cli%error_limit)
    2206            2 :       CALL section_vals_val_get(ref_cli_section, "STOP_ON_ERROR", l_val=ref_cli%stop_on_error)
    2207            2 :       CALL section_vals_val_get(ref_cli_section, "CHECK_ENERGY", l_val=ref_cli%check_energy)
    2208            2 :       CALL section_vals_val_get(ref_cli_section, "CHECK_FORCES", l_val=ref_cli%check_forces)
    2209            2 :       CALL section_vals_val_get(ref_cli_section, "CHECK_VIRIAL", l_val=ref_cli%check_virial)
    2210              : 
    2211            2 :    END SUBROUTINE read_xtb_reference_cli_section
    2212              : 
    2213              : ! **************************************************************************************************
    2214              : !> \brief Read TDDFPT-related input parameters.
    2215              : !> \param t_control  TDDFPT control parameters
    2216              : !> \param t_section  TDDFPT input section
    2217              : !> \param qs_control Quickstep control parameters
    2218              : ! **************************************************************************************************
    2219         9356 :    SUBROUTINE read_tddfpt2_control(t_control, t_section, qs_control)
    2220              :       TYPE(tddfpt2_control_type), POINTER                :: t_control
    2221              :       TYPE(section_vals_type), POINTER                   :: t_section
    2222              :       TYPE(qs_control_type), POINTER                     :: qs_control
    2223              : 
    2224              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'read_tddfpt2_control'
    2225              : 
    2226              :       CHARACTER(LEN=default_string_length), &
    2227         9356 :          DIMENSION(:), POINTER                           :: tmpstringlist
    2228              :       INTEGER                                            :: handle, irep, isize, nrep
    2229         9356 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: inds
    2230              :       LOGICAL                                            :: do_ewald, do_exchange, expl, explicit, &
    2231              :                                                             multigrid_set
    2232              :       REAL(KIND=dp)                                      :: filter, fval, hfx
    2233              :       TYPE(section_vals_type), POINTER                   :: dipole_section, mgrid_section, &
    2234              :                                                             soc_section, stda_section, xc_func, &
    2235              :                                                             xc_section
    2236              : 
    2237         9356 :       CALL timeset(routineN, handle)
    2238              : 
    2239         9356 :       CALL section_vals_val_get(t_section, "_SECTION_PARAMETERS_", l_val=t_control%enabled)
    2240              : 
    2241         9356 :       CALL section_vals_val_get(t_section, "NSTATES", i_val=t_control%nstates)
    2242         9356 :       CALL section_vals_val_get(t_section, "MAX_ITER", i_val=t_control%niters)
    2243         9356 :       CALL section_vals_val_get(t_section, "MAX_KV", i_val=t_control%nkvs)
    2244         9356 :       CALL section_vals_val_get(t_section, "NLUMO", i_val=t_control%nlumo)
    2245         9356 :       CALL section_vals_val_get(t_section, "NPROC_STATE", i_val=t_control%nprocs)
    2246         9356 :       CALL section_vals_val_get(t_section, "KERNEL", i_val=t_control%kernel)
    2247         9356 :       CALL section_vals_val_get(t_section, "SPINFLIP", i_val=t_control%spinflip)
    2248         9356 :       CALL section_vals_val_get(t_section, "OE_CORR", i_val=t_control%oe_corr)
    2249         9356 :       CALL section_vals_val_get(t_section, "EV_SHIFT", r_val=t_control%ev_shift)
    2250         9356 :       CALL section_vals_val_get(t_section, "EOS_SHIFT", r_val=t_control%eos_shift)
    2251              : 
    2252         9356 :       CALL section_vals_val_get(t_section, "CONVERGENCE", r_val=t_control%conv)
    2253         9356 :       CALL section_vals_val_get(t_section, "MIN_AMPLITUDE", r_val=t_control%min_excitation_amplitude)
    2254         9356 :       CALL section_vals_val_get(t_section, "ORTHOGONAL_EPS", r_val=t_control%orthogonal_eps)
    2255              : 
    2256         9356 :       CALL section_vals_val_get(t_section, "RESTART", l_val=t_control%is_restart)
    2257         9356 :       CALL section_vals_val_get(t_section, "RKS_TRIPLETS", l_val=t_control%rks_triplets)
    2258         9356 :       CALL section_vals_val_get(t_section, "DO_LRIGPW", l_val=t_control%do_lrigpw)
    2259         9356 :       CALL section_vals_val_get(t_section, "DO_SMEARING", l_val=t_control%do_smearing)
    2260         9356 :       CALL section_vals_val_get(t_section, "DO_BSE", l_val=t_control%do_bse)
    2261         9356 :       CALL section_vals_val_get(t_section, "DO_BSE_W_ONLY", l_val=t_control%do_bse_w_only)
    2262         9356 :       CALL section_vals_val_get(t_section, "DO_BSE_GW_ONLY", l_val=t_control%do_bse_gw_only)
    2263         9356 :       CALL section_vals_val_get(t_section, "ADMM_KERNEL_CORRECTION_SYMMETRIC", l_val=t_control%admm_symm)
    2264         9356 :       CALL section_vals_val_get(t_section, "ADMM_KERNEL_XC_CORRECTION", l_val=t_control%admm_xc_correction)
    2265         9356 :       CALL section_vals_val_get(t_section, "EXCITON_DESCRIPTORS", l_val=t_control%do_exciton_descriptors)
    2266         9356 :       CALL section_vals_val_get(t_section, "DIRECTIONAL_EXCITON_DESCRIPTORS", l_val=t_control%do_directional_exciton_descriptors)
    2267              :       CALL section_vals_val_get(t_section, "DIRECTIONAL_EXCITON_CROSSCORRELATION", &
    2268         9356 :                                 l_val=t_control%do_directional_exciton_crosscorrelation, explicit=explicit)
    2269         9356 :       IF (explicit .AND. t_control%do_directional_exciton_crosscorrelation .AND. &
    2270              :           .NOT. t_control%do_directional_exciton_descriptors) THEN
    2271              :          CALL cp_warn(__LOCATION__, &
    2272            0 :                       "DIRECTIONAL_EXCITON_CROSSCORRELATION has no effect without DIRECTIONAL_EXCITON_DESCRIPTORS.")
    2273              :       END IF
    2274              : 
    2275              :       ! read automatically generated auxiliary basis for LRI
    2276         9356 :       CALL section_vals_val_get(t_section, "AUTO_BASIS", n_rep_val=nrep)
    2277        18712 :       DO irep = 1, nrep
    2278         9356 :          CALL section_vals_val_get(t_section, "AUTO_BASIS", i_rep_val=irep, c_vals=tmpstringlist)
    2279        18712 :          IF (SIZE(tmpstringlist) == 2) THEN
    2280         9356 :             CALL uppercase(tmpstringlist(2))
    2281        18712 :             SELECT CASE (tmpstringlist(2))
    2282              :             CASE ("X")
    2283         9356 :                SELECT CASE (tmpstringlist(1))
    2284              :                CASE ("X")
    2285              :                   ! Do nothing
    2286              :                CASE DEFAULT
    2287              :                   CALL cp_abort(__LOCATION__, &
    2288              :                                 "AUTO_BASIS: the size <X> is invalid for the "// &
    2289              :                                 "type <"//TRIM(ADJUSTL(tmpstringlist(1)))//">; "// &
    2290              :                                 "use one of SMALL, MEDIUM, LARGE, HUGE for "// &
    2291              :                                 "the size. The syntax AUTO_BASIS X X is a "// &
    2292              :                                 "reserved case for using NO automatically "// &
    2293         9356 :                                 "generated basis sets.")
    2294              :                END SELECT
    2295              :             CASE ("SMALL")
    2296            0 :                isize = 0
    2297              :             CASE ("MEDIUM")
    2298            0 :                isize = 1
    2299              :             CASE ("LARGE")
    2300            0 :                isize = 2
    2301              :             CASE ("HUGE")
    2302            0 :                isize = 3
    2303              :             CASE DEFAULT
    2304         9356 :                CPABORT("Unknown basis size in AUTO_BASIS keyword:"//TRIM(tmpstringlist(1)))
    2305              :             END SELECT
    2306              :             !
    2307         9356 :             SELECT CASE (tmpstringlist(1))
    2308              :             CASE ("X")
    2309              :             CASE ("P_LRI_AUX")
    2310            0 :                t_control%auto_basis_p_lri_aux = isize
    2311              :             CASE DEFAULT
    2312         9356 :                CPABORT("Unknown basis type in AUTO_BASIS keyword:"//TRIM(tmpstringlist(1)))
    2313              :             END SELECT
    2314              :          ELSE
    2315              :             CALL cp_abort(__LOCATION__, &
    2316            0 :                           "AUTO_BASIS keyword in &PROPERTIES &TDDFT section has a wrong number of arguments.")
    2317              :          END IF
    2318              :       END DO
    2319              : 
    2320         9356 :       IF (t_control%conv < 0) THEN
    2321            0 :          t_control%conv = ABS(t_control%conv)
    2322              :       END IF
    2323              : 
    2324              :       ! DIPOLE_MOMENTS subsection
    2325         9356 :       dipole_section => section_vals_get_subs_vals(t_section, "DIPOLE_MOMENTS")
    2326         9356 :       CALL section_vals_val_get(dipole_section, "DIPOLE_FORM", explicit=explicit)
    2327         9356 :       IF (explicit) THEN
    2328           36 :          CALL section_vals_val_get(dipole_section, "DIPOLE_FORM", i_val=t_control%dipole_form)
    2329              :       ELSE
    2330         9320 :          t_control%dipole_form = 0
    2331              :       END IF
    2332         9356 :       CALL section_vals_val_get(dipole_section, "REFERENCE", i_val=t_control%dipole_reference)
    2333         9356 :       CALL section_vals_val_get(dipole_section, "REFERENCE_POINT", explicit=explicit)
    2334         9356 :       IF (explicit) THEN
    2335            0 :          CALL section_vals_val_get(dipole_section, "REFERENCE_POINT", r_vals=t_control%dipole_ref_point)
    2336              :       ELSE
    2337         9356 :          NULLIFY (t_control%dipole_ref_point)
    2338         9356 :          IF (t_control%dipole_form == tddfpt_dipole_length .AND. t_control%dipole_reference == use_mom_ref_user) THEN
    2339            0 :             CPABORT("User-defined reference point should be given explicitly")
    2340              :          END IF
    2341              :       END IF
    2342              : 
    2343              :       !SOC subsection
    2344         9356 :       soc_section => section_vals_get_subs_vals(t_section, "SOC")
    2345         9356 :       CALL section_vals_get(soc_section, explicit=explicit)
    2346         9356 :       IF (explicit) THEN
    2347           10 :          t_control%do_soc = .TRUE.
    2348              :       END IF
    2349              : 
    2350              :       ! MGRID subsection
    2351         9356 :       mgrid_section => section_vals_get_subs_vals(t_section, "MGRID")
    2352         9356 :       CALL section_vals_get(mgrid_section, explicit=t_control%mgrid_is_explicit)
    2353              : 
    2354         9356 :       IF (t_control%mgrid_is_explicit) THEN
    2355           10 :          CALL section_vals_val_get(mgrid_section, "NGRIDS", i_val=t_control%mgrid_ngrids, explicit=explicit)
    2356           10 :          IF (.NOT. explicit) t_control%mgrid_ngrids = SIZE(qs_control%e_cutoff)
    2357              : 
    2358           10 :          CALL section_vals_val_get(mgrid_section, "CUTOFF", r_val=t_control%mgrid_cutoff, explicit=explicit)
    2359           10 :          IF (.NOT. explicit) t_control%mgrid_cutoff = qs_control%cutoff
    2360              : 
    2361              :          CALL section_vals_val_get(mgrid_section, "PROGRESSION_FACTOR", &
    2362           10 :                                    r_val=t_control%mgrid_progression_factor, explicit=explicit)
    2363           10 :          IF (explicit) THEN
    2364            0 :             IF (t_control%mgrid_progression_factor <= 1.0_dp) THEN
    2365              :                CALL cp_abort(__LOCATION__, &
    2366            0 :                              "Progression factor should be greater then 1.0 to ensure multi-grid ordering")
    2367              :             END IF
    2368              :          ELSE
    2369           10 :             t_control%mgrid_progression_factor = qs_control%progression_factor
    2370              :          END IF
    2371              : 
    2372           10 :          CALL section_vals_val_get(mgrid_section, "COMMENSURATE", l_val=t_control%mgrid_commensurate_mgrids, explicit=explicit)
    2373           10 :          IF (.NOT. explicit) t_control%mgrid_commensurate_mgrids = qs_control%commensurate_mgrids
    2374           10 :          IF (t_control%mgrid_commensurate_mgrids) THEN
    2375            0 :             IF (explicit) THEN
    2376            0 :                t_control%mgrid_progression_factor = 4.0_dp
    2377              :             ELSE
    2378            0 :                t_control%mgrid_progression_factor = qs_control%progression_factor
    2379              :             END IF
    2380              :          END IF
    2381              : 
    2382           10 :          CALL section_vals_val_get(mgrid_section, "REL_CUTOFF", r_val=t_control%mgrid_relative_cutoff, explicit=explicit)
    2383           10 :          IF (.NOT. explicit) t_control%mgrid_relative_cutoff = qs_control%relative_cutoff
    2384              : 
    2385           10 :          CALL section_vals_val_get(mgrid_section, "MULTIGRID_SET", l_val=multigrid_set, explicit=explicit)
    2386           10 :          IF (.NOT. explicit) multigrid_set = .FALSE.
    2387           10 :          IF (multigrid_set) THEN
    2388            0 :             CALL section_vals_val_get(mgrid_section, "MULTIGRID_CUTOFF", r_vals=t_control%mgrid_e_cutoff)
    2389              :          ELSE
    2390           10 :             NULLIFY (t_control%mgrid_e_cutoff)
    2391              :          END IF
    2392              : 
    2393           10 :          CALL section_vals_val_get(mgrid_section, "REALSPACE", l_val=t_control%mgrid_realspace_mgrids, explicit=explicit)
    2394           10 :          IF (.NOT. explicit) t_control%mgrid_realspace_mgrids = qs_control%realspace_mgrids
    2395              : 
    2396              :          CALL section_vals_val_get(mgrid_section, "SKIP_LOAD_BALANCE_DISTRIBUTED", &
    2397           10 :                                    l_val=t_control%mgrid_skip_load_balance, explicit=explicit)
    2398           10 :          IF (.NOT. explicit) t_control%mgrid_skip_load_balance = qs_control%skip_load_balance_distributed
    2399              : 
    2400           10 :          IF (ASSOCIATED(t_control%mgrid_e_cutoff)) THEN
    2401            0 :             IF (SIZE(t_control%mgrid_e_cutoff) /= t_control%mgrid_ngrids) THEN
    2402            0 :                CPABORT("Inconsistent values for number of multi-grids")
    2403              :             END IF
    2404              : 
    2405              :             ! sort multi-grids in descending order according to their cutoff values
    2406            0 :             t_control%mgrid_e_cutoff = -t_control%mgrid_e_cutoff
    2407            0 :             ALLOCATE (inds(t_control%mgrid_ngrids))
    2408            0 :             CALL sort(t_control%mgrid_e_cutoff, t_control%mgrid_ngrids, inds)
    2409            0 :             DEALLOCATE (inds)
    2410            0 :             t_control%mgrid_e_cutoff = -t_control%mgrid_e_cutoff
    2411              :          END IF
    2412              :       END IF
    2413              : 
    2414              :       ! expand XC subsection (if given explicitly)
    2415         9356 :       xc_section => section_vals_get_subs_vals(t_section, "XC")
    2416         9356 :       xc_func => section_vals_get_subs_vals(xc_section, "XC_FUNCTIONAL")
    2417         9356 :       CALL section_vals_get(xc_func, explicit=explicit)
    2418         9356 :       IF (explicit) THEN
    2419          296 :          CALL xc_functionals_expand(xc_func, xc_section)
    2420              :       END IF
    2421              : 
    2422              :       ! sTDA subsection
    2423         9356 :       stda_section => section_vals_get_subs_vals(t_section, "STDA")
    2424         9356 :       IF (t_control%kernel == tddfpt_kernel_stda) THEN
    2425          130 :          t_control%stda_control%hfx_fraction = 0.0_dp
    2426          130 :          t_control%stda_control%do_exchange = .TRUE.
    2427          130 :          t_control%stda_control%eps_td_filter = 1.e-10_dp
    2428          130 :          t_control%stda_control%mn_alpha = -99.0_dp
    2429          130 :          t_control%stda_control%mn_beta = -99.0_dp
    2430              :          ! set default for Ewald method (on/off) dependent on periodicity
    2431          232 :          SELECT CASE (qs_control%periodicity)
    2432              :          CASE (0)
    2433          102 :             t_control%stda_control%do_ewald = .FALSE.
    2434              :          CASE (1)
    2435            0 :             t_control%stda_control%do_ewald = .TRUE.
    2436              :          CASE (2)
    2437            0 :             t_control%stda_control%do_ewald = .TRUE.
    2438              :          CASE (3)
    2439           28 :             t_control%stda_control%do_ewald = .TRUE.
    2440              :          CASE DEFAULT
    2441          130 :             CPABORT("Illegal value for periodiciy")
    2442              :          END SELECT
    2443          130 :          CALL section_vals_get(stda_section, explicit=explicit)
    2444          130 :          IF (explicit) THEN
    2445          116 :             CALL section_vals_val_get(stda_section, "HFX_FRACTION", r_val=hfx, explicit=expl)
    2446          116 :             IF (expl) t_control%stda_control%hfx_fraction = hfx
    2447          116 :             CALL section_vals_val_get(stda_section, "EPS_TD_FILTER", r_val=filter, explicit=expl)
    2448          116 :             IF (expl) t_control%stda_control%eps_td_filter = filter
    2449          116 :             CALL section_vals_val_get(stda_section, "DO_EWALD", l_val=do_ewald, explicit=expl)
    2450          116 :             IF (expl) t_control%stda_control%do_ewald = do_ewald
    2451          116 :             CALL section_vals_val_get(stda_section, "DO_EXCHANGE", l_val=do_exchange, explicit=expl)
    2452          116 :             IF (expl) t_control%stda_control%do_exchange = do_exchange
    2453          116 :             CALL section_vals_val_get(stda_section, "MATAGA_NISHIMOTO_CEXP", r_val=fval)
    2454          116 :             t_control%stda_control%mn_alpha = fval
    2455          116 :             CALL section_vals_val_get(stda_section, "MATAGA_NISHIMOTO_XEXP", r_val=fval)
    2456          116 :             t_control%stda_control%mn_beta = fval
    2457              :          END IF
    2458          130 :          CALL section_vals_val_get(stda_section, "COULOMB_SR_CUT", r_val=fval)
    2459          130 :          t_control%stda_control%coulomb_sr_cut = fval
    2460          130 :          CALL section_vals_val_get(stda_section, "COULOMB_SR_EPS", r_val=fval)
    2461          130 :          t_control%stda_control%coulomb_sr_eps = fval
    2462              :       END IF
    2463              : 
    2464         9356 :       CALL timestop(handle)
    2465         9356 :    END SUBROUTINE read_tddfpt2_control
    2466              : 
    2467              : ! **************************************************************************************************
    2468              : !> \brief Write the DFT control parameters to the output unit.
    2469              : !> \param dft_control ...
    2470              : !> \param dft_section ...
    2471              : ! **************************************************************************************************
    2472        16068 :    SUBROUTINE write_dft_control(dft_control, dft_section)
    2473              :       TYPE(dft_control_type), POINTER                    :: dft_control
    2474              :       TYPE(section_vals_type), POINTER                   :: dft_section
    2475              : 
    2476              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'write_dft_control'
    2477              : 
    2478              :       CHARACTER(LEN=20)                                  :: tmpStr
    2479              :       INTEGER                                            :: handle, i, i_rep, max_mtlr_iter, n_rep, &
    2480              :                                                             output_unit
    2481              :       REAL(kind=dp)                                      :: density_cut, density_smooth_cut_range, &
    2482              :                                                             eps_u_j_loop, gradient_cut, tau_cut
    2483              :       TYPE(cp_logger_type), POINTER                      :: logger
    2484              :       TYPE(enumeration_type), POINTER                    :: enum
    2485              :       TYPE(keyword_type), POINTER                        :: keyword
    2486              :       TYPE(section_type), POINTER                        :: section
    2487              :       TYPE(section_vals_type), POINTER                   :: xc_section
    2488              : 
    2489        10822 :       IF (dft_control%qs_control%semi_empirical) RETURN
    2490         8298 :       IF (dft_control%qs_control%dftb) RETURN
    2491         8000 :       IF (dft_control%qs_control%xtb) THEN
    2492         1228 :          CALL write_xtb_control(dft_control%qs_control%xtb_control, dft_section)
    2493         1228 :          RETURN
    2494              :       END IF
    2495         6772 :       CALL timeset(routineN, handle)
    2496              : 
    2497         6772 :       NULLIFY (logger)
    2498         6772 :       logger => cp_get_default_logger()
    2499              : 
    2500              :       output_unit = cp_print_key_unit_nr(logger, dft_section, &
    2501         6772 :                                          "PRINT%DFT_CONTROL_PARAMETERS", extension=".Log")
    2502              : 
    2503         6772 :       IF (output_unit > 0) THEN
    2504              : 
    2505         1534 :          xc_section => section_vals_get_subs_vals(dft_section, "XC")
    2506              : 
    2507         1534 :          IF (dft_control%uks) THEN
    2508              :             WRITE (UNIT=output_unit, FMT="(/,T2,A,T78,A)") &
    2509          442 :                "DFT| Spin unrestricted (spin-polarized) Kohn-Sham calculation", "UKS"
    2510         1092 :          ELSE IF (dft_control%roks) THEN
    2511              :             WRITE (UNIT=output_unit, FMT="(/,T2,A,T77,A)") &
    2512            7 :                "DFT| Spin restricted open Kohn-Sham calculation", "ROKS"
    2513              :          ELSE
    2514              :             WRITE (UNIT=output_unit, FMT="(/,T2,A,T78,A)") &
    2515         1085 :                "DFT| Spin restricted Kohn-Sham (RKS) calculation", "RKS"
    2516              :          END IF
    2517              : 
    2518              :          WRITE (UNIT=output_unit, FMT="(T2,A,T76,I5)") &
    2519         1534 :             "DFT| Multiplicity", dft_control%multiplicity
    2520              :          WRITE (UNIT=output_unit, FMT="(T2,A,T76,I5)") &
    2521         1534 :             "DFT| Number of spin states", dft_control%nspins
    2522              : 
    2523              :          WRITE (UNIT=output_unit, FMT="(T2,A,T76,I5)") &
    2524         1534 :             "DFT| Charge", dft_control%charge
    2525              : 
    2526         1534 :          IF (dft_control%sic_method_id /= sic_none) CALL cite_reference(VandeVondele2005b)
    2527         3065 :          SELECT CASE (dft_control%sic_method_id)
    2528              :          CASE (sic_none)
    2529         1531 :             tmpstr = "NO"
    2530              :          CASE (sic_mauri_spz)
    2531            3 :             tmpstr = "SPZ/MAURI SIC"
    2532              :          CASE (sic_mauri_us)
    2533            0 :             tmpstr = "US/MAURI SIC"
    2534              :          CASE (sic_ad)
    2535            0 :             tmpstr = "AD SIC"
    2536              :          CASE (sic_eo)
    2537            0 :             tmpstr = "Explicit Orbital SIC"
    2538              :          CASE DEFAULT
    2539              :             ! fix throughout the cp2k for this option
    2540         1534 :             CPABORT("SIC option unknown")
    2541              :          END SELECT
    2542              : 
    2543              :          WRITE (UNIT=output_unit, FMT="(T2,A,T61,A20)") &
    2544         1534 :             "DFT| Self-interaction correction (SIC)", ADJUSTR(TRIM(tmpstr))
    2545              : 
    2546         1534 :          IF (dft_control%sic_method_id /= sic_none) THEN
    2547              :             WRITE (UNIT=output_unit, FMT="(T2,A,T66,ES15.6)") &
    2548            3 :                "DFT| SIC scaling parameter a", dft_control%sic_scaling_a, &
    2549            6 :                "DFT| SIC scaling parameter b", dft_control%sic_scaling_b
    2550              :          END IF
    2551              : 
    2552         1534 :          IF (dft_control%sic_method_id == sic_eo) THEN
    2553            0 :             IF (dft_control%sic_list_id == sic_list_all) THEN
    2554              :                WRITE (UNIT=output_unit, FMT="(T2,A,T66,A)") &
    2555            0 :                   "DFT| SIC orbitals", "ALL"
    2556              :             END IF
    2557            0 :             IF (dft_control%sic_list_id == sic_list_unpaired) THEN
    2558              :                WRITE (UNIT=output_unit, FMT="(T2,A,T66,A)") &
    2559            0 :                   "DFT| SIC orbitals", "UNPAIRED"
    2560              :             END IF
    2561              :          END IF
    2562              : 
    2563         1534 :          CALL section_vals_val_get(xc_section, "density_cutoff", r_val=density_cut)
    2564         1534 :          CALL section_vals_val_get(xc_section, "gradient_cutoff", r_val=gradient_cut)
    2565         1534 :          CALL section_vals_val_get(xc_section, "tau_cutoff", r_val=tau_cut)
    2566         1534 :          CALL section_vals_val_get(xc_section, "density_smooth_cutoff_range", r_val=density_smooth_cut_range)
    2567              : 
    2568              :          WRITE (UNIT=output_unit, FMT="(T2,A,T66,ES15.6)") &
    2569         1534 :             "DFT| Cutoffs: density ", density_cut, &
    2570         1534 :             "DFT|          gradient", gradient_cut, &
    2571         1534 :             "DFT|          tau     ", tau_cut, &
    2572         3068 :             "DFT|          cutoff_smoothing_range", density_smooth_cut_range
    2573              :          CALL section_vals_val_get(xc_section, "XC_GRID%XC_SMOOTH_RHO", &
    2574         1534 :                                    c_val=tmpStr)
    2575              :          WRITE (output_unit, '( A, T61, A )') &
    2576         1534 :             " DFT| XC density smoothing ", ADJUSTR(tmpStr)
    2577              :          CALL section_vals_val_get(xc_section, "XC_GRID%XC_DERIV", &
    2578         1534 :                                    c_val=tmpStr)
    2579              :          WRITE (output_unit, '( A, T61, A )') &
    2580         1534 :             " DFT| XC derivatives ", ADJUSTR(tmpStr)
    2581         1534 :          IF (dft_control%dft_plus_u) THEN
    2582           19 :             NULLIFY (enum, keyword, section)
    2583           19 :             CALL create_dft_section(section)
    2584           19 :             keyword => section_get_keyword(section, "PLUS_U_METHOD")
    2585           19 :             CALL keyword_get(keyword, enum=enum)
    2586              :             WRITE (UNIT=output_unit, FMT="(/,T2,A,T41,A40)") &
    2587           19 :                "DFT+U| Method", ADJUSTR(TRIM(enum_i2c(enum, dft_control%plus_u_method_id)))
    2588              :             WRITE (UNIT=output_unit, FMT="(T2,A)") &
    2589           19 :                "DFT+U| Check atomic kind information for details"
    2590           19 :             IF (dft_control%mtlr_u_j) THEN
    2591            0 :                CALL section_vals_val_get(dft_section, "EPS_U_J_LOOP", r_val=eps_u_j_loop)
    2592              :                WRITE (UNIT=output_unit, FMT="(T2,A,T67,ES14.7E3)") &
    2593            0 :                   "MTLR U J| EPS_U_J_LOOP", eps_u_j_loop
    2594            0 :                CALL section_vals_val_get(dft_section, "MAX_MTLR_LOOP", i_val=max_mtlr_iter)
    2595              :                WRITE (UNIT=output_unit, FMT="(T2,A,T67,I10)") &
    2596            0 :                   "MTLR U J| MAX_MTLR_LOOP", max_mtlr_iter
    2597              :             END IF
    2598           19 :             CALL section_release(section)
    2599              :          END IF
    2600              : 
    2601         1534 :          WRITE (UNIT=output_unit, FMT="(A)") ""
    2602         1534 :          CALL xc_write(output_unit, xc_section, dft_control%lsd)
    2603              : 
    2604         1534 :          IF (dft_control%apply_period_efield) THEN
    2605            6 :             WRITE (UNIT=output_unit, FMT="(A)") ""
    2606            6 :             IF (dft_control%period_efield%displacement_field) THEN
    2607              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    2608            0 :                   "PERIODIC_EFIELD| Use displacement field formulation"
    2609              :                WRITE (UNIT=output_unit, FMT="(T2,A,T66,1X,ES14.6)") &
    2610            0 :                   "PERIODIC_EFIELD| Displacement field filter: x", &
    2611            0 :                   dft_control%period_efield%d_filter(1), &
    2612            0 :                   "PERIODIC_EFIELD|                            y", &
    2613            0 :                   dft_control%period_efield%d_filter(2), &
    2614            0 :                   "PERIODIC_EFIELD|                            z", &
    2615            0 :                   dft_control%period_efield%d_filter(3)
    2616              :             END IF
    2617              :             WRITE (UNIT=output_unit, FMT="(T2,A,T66,1X,ES14.6)") &
    2618            6 :                "PERIODIC_EFIELD| Polarisation vector:       x", &
    2619            6 :                dft_control%period_efield%polarisation(1), &
    2620            6 :                "PERIODIC_EFIELD|                            y", &
    2621            6 :                dft_control%period_efield%polarisation(2), &
    2622            6 :                "PERIODIC_EFIELD|                            z", &
    2623           12 :                dft_control%period_efield%polarisation(3)
    2624              : 
    2625              :             WRITE (UNIT=output_unit, FMT="(T2,A,T66,1X,I14)") &
    2626            6 :                "PERIODIC_EFIELD| Start Frame:", &
    2627            6 :                dft_control%period_efield%start_frame, &
    2628            6 :                "PERIODIC_EFIELD| End Frame:", &
    2629           12 :                dft_control%period_efield%end_frame
    2630              : 
    2631            6 :             IF (ALLOCATED(dft_control%period_efield%strength_list)) THEN
    2632              :                WRITE (UNIT=output_unit, FMT="(T2,A,T66,1X,I14)") &
    2633            2 :                   "PERIODIC_EFIELD| Number of Intensities:", &
    2634            4 :                   SIZE(dft_control%period_efield%strength_list)
    2635              :                WRITE (UNIT=output_unit, FMT="(T2,A,I10,T66,1X,ES14.6)") &
    2636            2 :                   "PERIODIC_EFIELD| Intensity List [a.u.] ", &
    2637            4 :                   1, dft_control%period_efield%strength_list(1)
    2638           24 :                DO i = 2, SIZE(dft_control%period_efield%strength_list)
    2639              :                   WRITE (UNIT=output_unit, FMT="(T2,A,I10,T66,1X,ES14.6)") &
    2640           22 :                      "PERIODIC_EFIELD|                       ", &
    2641           46 :                      i, dft_control%period_efield%strength_list(i)
    2642              :                END DO
    2643              :             ELSE
    2644              :                WRITE (UNIT=output_unit, FMT="(T2,A,T66,1X,ES14.6)") &
    2645            4 :                   "PERIODIC_EFIELD| Intensity [a.u.]:", &
    2646            8 :                   dft_control%period_efield%strength
    2647              :             END IF
    2648              : 
    2649           24 :             IF (NORM2(dft_control%period_efield%polarisation) < EPSILON(0.0_dp)) THEN
    2650            0 :                CPABORT("Invalid (too small) polarisation vector specified for PERIODIC_EFIELD")
    2651              :             END IF
    2652              :          END IF
    2653              : 
    2654         1534 :          IF (dft_control%do_sccs) THEN
    2655              :             WRITE (UNIT=output_unit, FMT="(/,T2,A)") &
    2656            5 :                "SCCS| Self-consistent continuum solvation model"
    2657              :             WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.6)") &
    2658            5 :                "SCCS| Relative permittivity of the solvent (medium)", &
    2659            5 :                dft_control%sccs_control%epsilon_solvent, &
    2660            5 :                "SCCS| Absolute permittivity [a.u.]", &
    2661           10 :                dft_control%sccs_control%epsilon_solvent/fourpi
    2662            9 :             SELECT CASE (dft_control%sccs_control%method_id)
    2663              :             CASE (sccs_andreussi)
    2664              :                WRITE (UNIT=output_unit, FMT="(T2,A,/,(T2,A,T61,ES20.6))") &
    2665            4 :                   "SCCS| Dielectric function proposed by Andreussi et al.", &
    2666            4 :                   "SCCS|  rho_max", dft_control%sccs_control%rho_max, &
    2667            8 :                   "SCCS|  rho_min", dft_control%sccs_control%rho_min
    2668              :             CASE (sccs_fattebert_gygi)
    2669              :                WRITE (UNIT=output_unit, FMT="(T2,A,/,(T2,A,T61,ES20.6))") &
    2670            1 :                   "SCCS| Dielectric function proposed by Fattebert and Gygi", &
    2671            1 :                   "SCCS|  beta", dft_control%sccs_control%beta, &
    2672            2 :                   "SCCS|  rho_zero", dft_control%sccs_control%rho_zero
    2673              :             CASE (sccs_saa_andreussi)
    2674              :                WRITE (UNIT=output_unit, FMT="(T2,A,/,A,/,(T2,A,T61,ES20.6))") &
    2675            0 :                   "SCCS| Dielectric function of the solvent aware algorithm", &
    2676            0 :                   "SCCS| proposed by Andreussi et al.", &
    2677            0 :                   "SCCS|  rho_max", dft_control%sccs_control%rho_max, &
    2678            0 :                   "SCCS|  rho_min", dft_control%sccs_control%rho_min, &
    2679            0 :                   "SCCS|  f0", dft_control%sccs_control%f0, &
    2680            0 :                   "SCCS|  delta_eta", dft_control%sccs_control%delta_eta, &
    2681            0 :                   "SCCS|  alpha_zeta", dft_control%sccs_control%alpha_zeta, &
    2682            0 :                   "SCCS|  delta_zeta", dft_control%sccs_control%delta_zeta, &
    2683            0 :                   "SCCS|  R_solv", dft_control%sccs_control%R_solv
    2684              :             CASE DEFAULT
    2685            5 :                CPABORT("Invalid SCCS model specified. Please, check your input!")
    2686              :             END SELECT
    2687            6 :             SELECT CASE (dft_control%sccs_control%derivative_method)
    2688              :             CASE (sccs_derivative_fft)
    2689              :                WRITE (UNIT=output_unit, FMT="(T2,A,T46,A35)") &
    2690            1 :                   "SCCS| Numerical derivative calculation", &
    2691            2 :                   ADJUSTR("FFT")
    2692              :             CASE (sccs_derivative_cd3)
    2693              :                WRITE (UNIT=output_unit, FMT="(T2,A,T46,A35)") &
    2694            0 :                   "SCCS| Numerical derivative calculation", &
    2695            0 :                   ADJUSTR("3-point stencil central differences")
    2696              :             CASE (sccs_derivative_cd5)
    2697              :                WRITE (UNIT=output_unit, FMT="(T2,A,T46,A35)") &
    2698            4 :                   "SCCS| Numerical derivative calculation", &
    2699            8 :                   ADJUSTR("5-point stencil central differences")
    2700              :             CASE (sccs_derivative_cd7)
    2701              :                WRITE (UNIT=output_unit, FMT="(T2,A,T46,A35)") &
    2702            0 :                   "SCCS| Numerical derivative calculation", &
    2703            0 :                   ADJUSTR("7-point stencil central differences")
    2704              :             CASE DEFAULT
    2705              :                CALL cp_abort(__LOCATION__, &
    2706              :                              "Invalid derivative method specified for SCCS model. "// &
    2707            5 :                              "Please, check your input!")
    2708              :             END SELECT
    2709              :             WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.6)") &
    2710            5 :                "SCCS| Repulsion parameter alpha [mN/m] = [dyn/cm]", &
    2711           10 :                cp_unit_from_cp2k(dft_control%sccs_control%alpha_solvent, "mN/m")
    2712              :             WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.6)") &
    2713            5 :                "SCCS| Dispersion parameter beta [GPa]", &
    2714           10 :                cp_unit_from_cp2k(dft_control%sccs_control%beta_solvent, "GPa")
    2715              :             WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.6)") &
    2716            5 :                "SCCS| Surface tension gamma [mN/m] = [dyn/cm]", &
    2717           10 :                cp_unit_from_cp2k(dft_control%sccs_control%gamma_solvent, "mN/m")
    2718              :             WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.6)") &
    2719            5 :                "SCCS| Mixing parameter applied during the iteration cycle", &
    2720           10 :                dft_control%sccs_control%mixing
    2721              :             WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.6)") &
    2722            5 :                "SCCS| Tolerance for the convergence of the SCCS iteration cycle", &
    2723           10 :                dft_control%sccs_control%eps_sccs
    2724              :             WRITE (UNIT=output_unit, FMT="(T2,A,T61,I20)") &
    2725            5 :                "SCCS| Maximum number of iteration steps", &
    2726           10 :                dft_control%sccs_control%max_iter
    2727              :             WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.6)") &
    2728            5 :                "SCCS| SCF convergence threshold for starting the SCCS iteration", &
    2729           10 :                dft_control%sccs_control%eps_scf
    2730              :             WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.6)") &
    2731            5 :                "SCCS| Numerical increment for the cavity surface calculation", &
    2732           10 :                dft_control%sccs_control%delta_rho
    2733              :          END IF
    2734              : 
    2735         1534 :          WRITE (UNIT=output_unit, FMT="(A)") ""
    2736              : 
    2737              :       END IF
    2738              : 
    2739         6772 :       IF (dft_control%hairy_probes .EQV. .TRUE.) THEN
    2740            4 :          n_rep = SIZE(dft_control%probe)
    2741            4 :          IF (output_unit > 0) THEN
    2742            6 :             DO i_rep = 1, n_rep
    2743              :                WRITE (UNIT=output_unit, FMT="(T2,A,I5)") &
    2744            4 :                   "HP | hair probe set", i_rep
    2745              :                WRITE (UNIT=output_unit, FMT="(T2,A,T61,*(I5))") &
    2746            4 :                   "HP| atom indexes", &
    2747           12 :                   (dft_control%probe(i_rep)%atom_ids(i), i=1, dft_control%probe(i_rep)%natoms)
    2748              :                WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.6)") &
    2749            4 :                   "HP| potential", dft_control%probe(i_rep)%mu
    2750              :                WRITE (UNIT=output_unit, FMT="(T2,A,T61,F20.2)") &
    2751            4 :                   "HP| temperature", dft_control%probe(i_rep)%T
    2752              :                WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.6)") &
    2753            6 :                   "HP| eps_hp", dft_control%probe(i_rep)%eps_hp
    2754              :             END DO
    2755              :          END IF
    2756              :       END IF
    2757              : 
    2758              :       CALL cp_print_key_finished_output(output_unit, logger, dft_section, &
    2759         6772 :                                         "PRINT%DFT_CONTROL_PARAMETERS")
    2760              : 
    2761         6772 :       CALL timestop(handle)
    2762              : 
    2763              :    END SUBROUTINE write_dft_control
    2764              : 
    2765              : ! **************************************************************************************************
    2766              : !> \brief Write the ADMM control parameters to the output unit.
    2767              : !> \param admm_control ...
    2768              : !> \param dft_section ...
    2769              : ! **************************************************************************************************
    2770          532 :    SUBROUTINE write_admm_control(admm_control, dft_section)
    2771              :       TYPE(admm_control_type), POINTER                   :: admm_control
    2772              :       TYPE(section_vals_type), POINTER                   :: dft_section
    2773              : 
    2774              :       INTEGER                                            :: iounit
    2775              :       TYPE(cp_logger_type), POINTER                      :: logger
    2776              : 
    2777          532 :       NULLIFY (logger)
    2778          532 :       logger => cp_get_default_logger()
    2779              : 
    2780              :       iounit = cp_print_key_unit_nr(logger, dft_section, &
    2781          532 :                                     "PRINT%DFT_CONTROL_PARAMETERS", extension=".Log")
    2782              : 
    2783          532 :       IF (iounit > 0) THEN
    2784              : 
    2785          259 :          SELECT CASE (admm_control%admm_type)
    2786              :          CASE (no_admm_type)
    2787          125 :             WRITE (UNIT=iounit, FMT="(/,T2,A,T77,A)") "ADMM| Specific ADMM type specified", "NONE"
    2788              :          CASE (admm1_type)
    2789            2 :             WRITE (UNIT=iounit, FMT="(/,T2,A,T76,A)") "ADMM| Specific ADMM type specified", "ADMM1"
    2790              :          CASE (admm2_type)
    2791            1 :             WRITE (UNIT=iounit, FMT="(/,T2,A,T76,A)") "ADMM| Specific ADMM type specified", "ADMM2"
    2792              :          CASE (admms_type)
    2793            4 :             WRITE (UNIT=iounit, FMT="(/,T2,A,T76,A)") "ADMM| Specific ADMM type specified", "ADMMS"
    2794              :          CASE (admmp_type)
    2795            1 :             WRITE (UNIT=iounit, FMT="(/,T2,A,T76,A)") "ADMM| Specific ADMM type specified", "ADMMP"
    2796              :          CASE (admmq_type)
    2797            1 :             WRITE (UNIT=iounit, FMT="(/,T2,A,T76,A)") "ADMM| Specific ADMM type specified", "ADMMQ"
    2798              :          CASE DEFAULT
    2799          134 :             CPABORT("admm_type")
    2800              :          END SELECT
    2801              : 
    2802          218 :          SELECT CASE (admm_control%purification_method)
    2803              :          CASE (do_admm_purify_none)
    2804           84 :             WRITE (UNIT=iounit, FMT="(T2,A,T77,A)") "ADMM| Density matrix purification method", "NONE"
    2805              :          CASE (do_admm_purify_cauchy)
    2806            9 :             WRITE (UNIT=iounit, FMT="(T2,A,T75,A)") "ADMM| Density matrix purification method", "Cauchy"
    2807              :          CASE (do_admm_purify_cauchy_subspace)
    2808            5 :             WRITE (UNIT=iounit, FMT="(T2,A,T66,A)") "ADMM| Density matrix purification method", "Cauchy subspace"
    2809              :          CASE (do_admm_purify_mo_diag)
    2810           26 :             WRITE (UNIT=iounit, FMT="(T2,A,T63,A)") "ADMM| Density matrix purification method", "MO diagonalization"
    2811              :          CASE (do_admm_purify_mo_no_diag)
    2812            3 :             WRITE (UNIT=iounit, FMT="(T2,A,T71,A)") "ADMM| Density matrix purification method", "MO no diag"
    2813              :          CASE (do_admm_purify_mcweeny)
    2814            1 :             WRITE (UNIT=iounit, FMT="(T2,A,T74,A)") "ADMM| Density matrix purification method", "McWeeny"
    2815              :          CASE (do_admm_purify_none_dm)
    2816            6 :             WRITE (UNIT=iounit, FMT="(T2,A,T73,A)") "ADMM| Density matrix purification method", "NONE(DM)"
    2817              :          CASE DEFAULT
    2818          134 :             CPABORT("admm_purification_method")
    2819              :          END SELECT
    2820              : 
    2821          240 :          SELECT CASE (admm_control%method)
    2822              :          CASE (do_admm_basis_projection)
    2823          106 :             WRITE (UNIT=iounit, FMT="(T2,A)") "ADMM| Orbital projection on ADMM basis"
    2824              :          CASE (do_admm_blocking_purify_full)
    2825            3 :             WRITE (UNIT=iounit, FMT="(T2,A)") "ADMM| Blocked Fock matrix projection with full purification"
    2826              :          CASE (do_admm_blocked_projection)
    2827            6 :             WRITE (UNIT=iounit, FMT="(T2,A)") "ADMM| Blocked Fock matrix projection"
    2828              :          CASE (do_admm_charge_constrained_projection)
    2829           19 :             WRITE (UNIT=iounit, FMT="(T2,A)") "ADMM| Orbital projection with charge constrain"
    2830              :          CASE DEFAULT
    2831          134 :             CPABORT("admm method")
    2832              :          END SELECT
    2833              : 
    2834          155 :          SELECT CASE (admm_control%scaling_model)
    2835              :          CASE (do_admm_exch_scaling_none)
    2836              :          CASE (do_admm_exch_scaling_merlot)
    2837           21 :             WRITE (UNIT=iounit, FMT="(T2,A)") "ADMM| Use Merlot (2014) scaling model"
    2838              :          CASE DEFAULT
    2839          134 :             CPABORT("admm scaling_model")
    2840              :          END SELECT
    2841              : 
    2842          134 :          WRITE (UNIT=iounit, FMT="(T2,A,T61,G20.10)") "ADMM| eps_filter", admm_control%eps_filter
    2843              : 
    2844          146 :          SELECT CASE (admm_control%aux_exch_func)
    2845              :          CASE (do_admm_aux_exch_func_none)
    2846           12 :             WRITE (UNIT=iounit, FMT="(T2,A)") "ADMM| No exchange functional correction term used"
    2847              :          CASE (do_admm_aux_exch_func_default, do_admm_aux_exch_func_default_libxc)
    2848           90 :             WRITE (UNIT=iounit, FMT="(T2,A,T74,A)") "ADMM| Exchange functional in correction term", "(W)PBEX"
    2849              :          CASE (do_admm_aux_exch_func_pbex, do_admm_aux_exch_func_pbex_libxc)
    2850           23 :             WRITE (UNIT=iounit, FMT="(T2,A,T77,A)") "ADMM| Exchange functional in correction term", "PBEX"
    2851              :          CASE (do_admm_aux_exch_func_opt, do_admm_aux_exch_func_opt_libxc)
    2852            8 :             WRITE (UNIT=iounit, FMT="(T2,A,T77,A)") "ADMM| Exchange functional in correction term", "OPTX"
    2853              :          CASE (do_admm_aux_exch_func_bee, do_admm_aux_exch_func_bee_libxc)
    2854            1 :             WRITE (UNIT=iounit, FMT="(T2,A,T74,A)") "ADMM| Exchange functional in correction term", "Becke88"
    2855              :          CASE (do_admm_aux_exch_func_sx_libxc)
    2856            0 :             WRITE (UNIT=iounit, FMT="(T2,A,T74,A)") "ADMM| Exchange functional in correction term", "SlaterX"
    2857              :          CASE DEFAULT
    2858          134 :             CPABORT("admm aux_exch_func")
    2859              :          END SELECT
    2860              : 
    2861          134 :          WRITE (UNIT=iounit, FMT="(A)") ""
    2862              : 
    2863              :       END IF
    2864              : 
    2865              :       CALL cp_print_key_finished_output(iounit, logger, dft_section, &
    2866          532 :                                         "PRINT%DFT_CONTROL_PARAMETERS")
    2867          532 :    END SUBROUTINE write_admm_control
    2868              : 
    2869              : ! **************************************************************************************************
    2870              : !> \brief Write the xTB control parameters to the output unit.
    2871              : !> \param xtb_control ...
    2872              : !> \param dft_section ...
    2873              : ! **************************************************************************************************
    2874         1228 :    SUBROUTINE write_xtb_control(xtb_control, dft_section)
    2875              :       TYPE(xtb_control_type), POINTER                    :: xtb_control
    2876              :       TYPE(section_vals_type), POINTER                   :: dft_section
    2877              : 
    2878              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'write_xtb_control'
    2879              : 
    2880              :       CHARACTER(LEN=16)                                  :: scc_mixer_name, solver_name
    2881              :       INTEGER                                            :: handle, output_unit
    2882              :       TYPE(cp_logger_type), POINTER                      :: logger
    2883              : 
    2884         1228 :       CALL timeset(routineN, handle)
    2885         1228 :       NULLIFY (logger)
    2886         1228 :       logger => cp_get_default_logger()
    2887              : 
    2888              :       output_unit = cp_print_key_unit_nr(logger, dft_section, &
    2889         1228 :                                          "PRINT%DFT_CONTROL_PARAMETERS", extension=".Log")
    2890              : 
    2891         1228 :       IF (output_unit > 0) THEN
    2892              : 
    2893              :          WRITE (UNIT=output_unit, FMT="(/,T2,A,T31,A50)") &
    2894          121 :             "xTB| Parameter file", ADJUSTR(TRIM(xtb_control%parameter_file_name))
    2895              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,I10)") &
    2896          121 :             "xTB| Basis expansion STO-NG", xtb_control%sto_ng
    2897              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,I10)") &
    2898          121 :             "xTB| Basis expansion STO-NG for Hydrogen", xtb_control%h_sto_ng
    2899              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,E10.4)") &
    2900          121 :             "xTB| Repulsive pair potential accuracy", xtb_control%eps_pair
    2901              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.6)") &
    2902          121 :             "xTB| Repulsive enhancement factor", xtb_control%enscale
    2903              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,L10)") &
    2904          121 :             "xTB| Halogen interaction potential", xtb_control%xb_interaction
    2905              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.3)") &
    2906          121 :             "xTB| Halogen interaction potential cutoff radius", xtb_control%xb_radius
    2907              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,L10)") &
    2908          121 :             "xTB| Nonbonded interactions", xtb_control%do_nonbonded
    2909          121 :          SELECT CASE (xtb_control%vdw_type)
    2910              :          CASE (xtb_vdw_type_none)
    2911            0 :             WRITE (UNIT=output_unit, FMT="(T2,A)") "xTB| No vdW potential selected"
    2912              :          CASE (xtb_vdw_type_d3)
    2913          119 :             WRITE (UNIT=output_unit, FMT="(T2,A,T72,A)") "xTB| vdW potential type:", "DFTD3(BJ)"
    2914              :             WRITE (UNIT=output_unit, FMT="(T2,A,T31,A50)") &
    2915          119 :                "xTB| D3 Dispersion: Parameter file", ADJUSTR(TRIM(xtb_control%dispersion_parameter_file))
    2916              :          CASE (xtb_vdw_type_d4)
    2917            2 :             WRITE (UNIT=output_unit, FMT="(T2,A,T76,A)") "xTB| vdW potential type:", "DFTD4"
    2918              :             WRITE (UNIT=output_unit, FMT="(T2,A,T31,A50)") &
    2919            2 :                "xTB| D4 Dispersion: Parameter file", ADJUSTR(TRIM(xtb_control%dispersion_parameter_file))
    2920              :          CASE DEFAULT
    2921          121 :             CPABORT("vdw type")
    2922              :          END SELECT
    2923              :          WRITE (UNIT=output_unit, FMT="(T2,A,T51,3F10.3)") &
    2924          121 :             "xTB| Huckel constants ks kp kd", xtb_control%ks, xtb_control%kp, xtb_control%kd
    2925              :          WRITE (UNIT=output_unit, FMT="(T2,A,T61,2F10.3)") &
    2926          121 :             "xTB| Huckel constants ksp k2sh", xtb_control%ksp, xtb_control%k2sh
    2927              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.3)") &
    2928          121 :             "xTB| Mataga-Nishimoto exponent", xtb_control%kg
    2929              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.3)") &
    2930          121 :             "xTB| Repulsion potential exponent", xtb_control%kf
    2931              :          WRITE (UNIT=output_unit, FMT="(T2,A,T51,3F10.3)") &
    2932          121 :             "xTB| Coordination number scaling kcn(s) kcn(p) kcn(d)", &
    2933          242 :             xtb_control%kcns, xtb_control%kcnp, xtb_control%kcnd
    2934              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.3)") &
    2935          121 :             "xTB| Electronegativity scaling", xtb_control%ken
    2936              :          WRITE (UNIT=output_unit, FMT="(T2,A,T61,2F10.3)") &
    2937          121 :             "xTB| Halogen potential scaling kxr kx2", xtb_control%kxr, xtb_control%kx2
    2938          209 :          SELECT CASE (xtb_control%tblite_scc_mixer)
    2939              :          CASE (tblite_scc_mixer_auto)
    2940           88 :             scc_mixer_name = "AUTO"
    2941              :          CASE (tblite_scc_mixer_tblite)
    2942           11 :             scc_mixer_name = "TBLITE"
    2943              :          CASE (tblite_scc_mixer_cp2k)
    2944            4 :             scc_mixer_name = "CP2K"
    2945              :          CASE (tblite_scc_mixer_none)
    2946           18 :             scc_mixer_name = "NONE"
    2947              :          CASE DEFAULT
    2948          121 :             CPABORT("Unknown tblite SCC mixer")
    2949              :          END SELECT
    2950          242 :          SELECT CASE (xtb_control%tblite_mixer_solver)
    2951              :          CASE (tblite_solver_gvd)
    2952          121 :             solver_name = "GVD"
    2953              :          CASE (tblite_solver_gvr)
    2954            0 :             solver_name = "GVR"
    2955              :          CASE DEFAULT
    2956          121 :             CPABORT("Unknown tblite SCC mixer solver")
    2957              :          END SELECT
    2958              :          WRITE (UNIT=output_unit, FMT="(T2,A,T72,A)") &
    2959          121 :             "xTB| SCC mixer:", TRIM(scc_mixer_name)
    2960              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,ES10.3)") &
    2961          121 :             "xTB| tblite accuracy:", xtb_control%tblite_accuracy
    2962          121 :          IF (LEN_TRIM(xtb_control%tblite_param_file) > 0) THEN
    2963              :             WRITE (UNIT=output_unit, FMT="(T2,A,T33,A)") &
    2964            0 :                "xTB| tblite parameter file:", TRIM(xtb_control%tblite_param_file)
    2965              :          END IF
    2966              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.3)") &
    2967          121 :             "xTB| tblite SCC mixer damping:", xtb_control%tblite_mixer_damping
    2968              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,I10)") &
    2969          121 :             "xTB| tblite SCC mixer iterations:", xtb_control%tblite_mixer_iterations
    2970              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,I10)") &
    2971          121 :             "xTB| tblite SCC mixer memory:", xtb_control%tblite_mixer_memory
    2972              :          WRITE (UNIT=output_unit, FMT="(T2,A,T72,A)") &
    2973          121 :             "xTB| tblite SCC mixer solver:", TRIM(solver_name)
    2974              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,ES10.3)") &
    2975          121 :             "xTB| tblite SCC mixer omega0:", xtb_control%tblite_mixer_omega0
    2976              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,ES10.3)") &
    2977          121 :             "xTB| tblite SCC mixer min weight:", xtb_control%tblite_mixer_min_weight
    2978              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,ES10.3)") &
    2979          121 :             "xTB| tblite SCC mixer max weight:", xtb_control%tblite_mixer_max_weight
    2980              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,ES10.3)") &
    2981          121 :             "xTB| tblite SCC mixer weight factor:", xtb_control%tblite_mixer_weight_factor
    2982          121 :          WRITE (UNIT=output_unit, FMT="(/)")
    2983              : 
    2984              :       END IF
    2985              : 
    2986              :       CALL cp_print_key_finished_output(output_unit, logger, dft_section, &
    2987         1228 :                                         "PRINT%DFT_CONTROL_PARAMETERS")
    2988              : 
    2989         1228 :       CALL timestop(handle)
    2990              : 
    2991         1228 :    END SUBROUTINE write_xtb_control
    2992              : 
    2993              : ! **************************************************************************************************
    2994              : !> \brief Purpose: Write the QS control parameters to the output unit.
    2995              : !> \param qs_control ...
    2996              : !> \param dft_section ...
    2997              : ! **************************************************************************************************
    2998        16068 :    SUBROUTINE write_qs_control(qs_control, dft_section)
    2999              :       TYPE(qs_control_type), INTENT(IN)                  :: qs_control
    3000              :       TYPE(section_vals_type), POINTER                   :: dft_section
    3001              : 
    3002              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'write_qs_control'
    3003              : 
    3004              :       CHARACTER(len=20)                                  :: method, quadrature
    3005              :       INTEGER                                            :: handle, i, igrid_level, ngrid_level, &
    3006              :                                                             output_unit
    3007              :       TYPE(cp_logger_type), POINTER                      :: logger
    3008              :       TYPE(ddapc_restraint_type), POINTER                :: ddapc_restraint_control
    3009              :       TYPE(enumeration_type), POINTER                    :: enum
    3010              :       TYPE(keyword_type), POINTER                        :: keyword
    3011              :       TYPE(section_type), POINTER                        :: qs_section
    3012              :       TYPE(section_vals_type), POINTER                   :: print_section_vals, qs_section_vals
    3013              : 
    3014        10822 :       IF (qs_control%semi_empirical) RETURN
    3015         8298 :       IF (qs_control%dftb) RETURN
    3016         8000 :       IF (qs_control%xtb) RETURN
    3017         6772 :       CALL timeset(routineN, handle)
    3018         6772 :       NULLIFY (logger, print_section_vals, qs_section, qs_section_vals)
    3019         6772 :       logger => cp_get_default_logger()
    3020         6772 :       print_section_vals => section_vals_get_subs_vals(dft_section, "PRINT")
    3021         6772 :       qs_section_vals => section_vals_get_subs_vals(dft_section, "QS")
    3022         6772 :       CALL section_vals_get(qs_section_vals, section=qs_section)
    3023              : 
    3024         6772 :       NULLIFY (enum, keyword)
    3025         6772 :       keyword => section_get_keyword(qs_section, "METHOD")
    3026         6772 :       CALL keyword_get(keyword, enum=enum)
    3027         6772 :       method = TRIM(enum_i2c(enum, qs_control%method_id))
    3028              : 
    3029         6772 :       NULLIFY (enum, keyword)
    3030         6772 :       keyword => section_get_keyword(qs_section, "QUADRATURE")
    3031         6772 :       CALL keyword_get(keyword, enum=enum)
    3032         6772 :       quadrature = TRIM(enum_i2c(enum, qs_control%gapw_control%quadrature))
    3033              : 
    3034              :       output_unit = cp_print_key_unit_nr(logger, print_section_vals, &
    3035         6772 :                                          "DFT_CONTROL_PARAMETERS", extension=".Log")
    3036         6772 :       IF (output_unit > 0) THEN
    3037         1534 :          ngrid_level = SIZE(qs_control%e_cutoff)
    3038              :          WRITE (UNIT=output_unit, FMT="(/,T2,A,T61,A20)") &
    3039         1534 :             "QS| Method:", ADJUSTR(method)
    3040         1534 :          IF (qs_control%pw_grid_opt%spherical) THEN
    3041              :             WRITE (UNIT=output_unit, FMT="(T2,A,T61,A)") &
    3042            0 :                "QS| Density plane wave grid type", " SPHERICAL HALFSPACE"
    3043         1534 :          ELSE IF (qs_control%pw_grid_opt%fullspace) THEN
    3044              :             WRITE (UNIT=output_unit, FMT="(T2,A,T57,A)") &
    3045         1534 :                "QS| Density plane wave grid type", " NON-SPHERICAL FULLSPACE"
    3046              :          ELSE
    3047              :             WRITE (UNIT=output_unit, FMT="(T2,A,T57,A)") &
    3048            0 :                "QS| Density plane wave grid type", " NON-SPHERICAL HALFSPACE"
    3049              :          END IF
    3050              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,I10)") &
    3051         1534 :             "QS| Number of grid levels:", SIZE(qs_control%e_cutoff)
    3052         1534 :          IF (ngrid_level == 1) THEN
    3053              :             WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.1)") &
    3054           80 :                "QS| Density cutoff [a.u.]:", qs_control%e_cutoff(1)
    3055              :          ELSE
    3056              :             WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.1)") &
    3057         1454 :                "QS| Density cutoff [a.u.]:", qs_control%cutoff
    3058         1454 :             IF (qs_control%commensurate_mgrids) THEN
    3059          132 :                WRITE (UNIT=output_unit, FMT="(T2,A)") "QS| Using commensurate multigrids"
    3060              :             END IF
    3061              :             WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.1)") &
    3062         1454 :                "QS| Multi grid cutoff [a.u.]: 1) grid level", qs_control%e_cutoff(1)
    3063              :             WRITE (UNIT=output_unit, FMT="(T2,A,I3,A,T71,F10.1)") &
    3064         4533 :                ("QS|                         ", igrid_level, ") grid level", &
    3065         5987 :                 qs_control%e_cutoff(igrid_level), &
    3066         7441 :                 igrid_level=2, SIZE(qs_control%e_cutoff))
    3067              :          END IF
    3068         1534 :          IF (qs_control%pao) THEN
    3069            0 :             WRITE (UNIT=output_unit, FMT="(T2,A)") "QS| PAO active"
    3070              :          END IF
    3071              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.1)") &
    3072         1534 :             "QS| Grid level progression factor:", qs_control%progression_factor
    3073              :          WRITE (UNIT=output_unit, FMT="(T2,A,T71,F10.1)") &
    3074         1534 :             "QS| Relative density cutoff [a.u.]:", qs_control%relative_cutoff
    3075              :          WRITE (UNIT=output_unit, FMT="(T2,A,T73,ES8.1)") &
    3076         1534 :             "QS| Interaction thresholds: eps_pgf_orb:", &
    3077         1534 :             qs_control%eps_pgf_orb, &
    3078         1534 :             "QS|                         eps_filter_matrix:", &
    3079         1534 :             qs_control%eps_filter_matrix, &
    3080         1534 :             "QS|                         eps_core_charge:", &
    3081         1534 :             qs_control%eps_core_charge, &
    3082         1534 :             "QS|                         eps_rho_gspace:", &
    3083         1534 :             qs_control%eps_rho_gspace, &
    3084         1534 :             "QS|                         eps_rho_rspace:", &
    3085         1534 :             qs_control%eps_rho_rspace, &
    3086         1534 :             "QS|                         eps_gvg_rspace:", &
    3087         1534 :             qs_control%eps_gvg_rspace, &
    3088         1534 :             "QS|                         eps_ppl:", &
    3089         1534 :             qs_control%eps_ppl, &
    3090         1534 :             "QS|                         eps_ppnl:", &
    3091         3068 :             qs_control%eps_ppnl
    3092         1534 :          IF (qs_control%gapw) THEN
    3093          297 :             IF (qs_control%gapw_control%accurate_xcint) THEN
    3094              :                WRITE (UNIT=output_unit, FMT="(T2,A,T79,I2)") &
    3095           47 :                   "QS| GAPW|      XC integration using accurate scheme: Polynomial order (2n) =", &
    3096           94 :                   qs_control%gapw_control%oweights
    3097              :                WRITE (UNIT=output_unit, FMT="(T2,A,T69,F12.6)") &
    3098           47 :                   "QS| GAPW|                                            Ref. exponent =", &
    3099           94 :                   qs_control%gapw_control%aweights
    3100              :             END IF
    3101              :             !
    3102          569 :             SELECT CASE (qs_control%gapw_control%basis_1c)
    3103              :             CASE (gapw_1c_orb)
    3104              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    3105          272 :                   "QS| GAPW|      One center basis from orbital basis primitives"
    3106              :             CASE (gapw_1c_small)
    3107              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    3108           21 :                   "QS| GAPW|      One center basis extended with primitives (small:s)"
    3109              :             CASE (gapw_1c_medium)
    3110              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    3111            1 :                   "QS| GAPW|      One center basis extended with primitives (medium:sp)"
    3112              :             CASE (gapw_1c_large)
    3113              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    3114            2 :                   "QS| GAPW|      One center basis extended with primitives (large:spd)"
    3115              :             CASE (gapw_1c_very_large)
    3116              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    3117            1 :                   "QS| GAPW|      One center basis extended with primitives (very large:spdf)"
    3118              :             CASE DEFAULT
    3119          297 :                CPABORT("basis_1c incorrect")
    3120              :             END SELECT
    3121              :             WRITE (UNIT=output_unit, FMT="(T2,A,T73,ES8.1)") &
    3122          297 :                "QS| GAPW|                   eps_fit:", &
    3123          297 :                qs_control%gapw_control%eps_fit, &
    3124          297 :                "QS| GAPW|                   eps_iso:", &
    3125          297 :                qs_control%gapw_control%eps_iso, &
    3126          297 :                "QS| GAPW|                   eps_svd:", &
    3127          297 :                qs_control%gapw_control%eps_svd, &
    3128          297 :                "QS| GAPW|                   eps_cpc:", &
    3129          594 :                qs_control%gapw_control%eps_cpc
    3130              :             WRITE (UNIT=output_unit, FMT="(T2,A,T61,A20)") &
    3131          297 :                "QS| GAPW|   atom-r-grid: quadrature:", &
    3132          594 :                ADJUSTR(quadrature)
    3133              :             WRITE (UNIT=output_unit, FMT="(T2,A,T71,I10)") &
    3134          297 :                "QS| GAPW|      atom-s-grid:  max l :", &
    3135          297 :                qs_control%gapw_control%lmax_sphere, &
    3136          297 :                "QS| GAPW|      max_l_rho0 :", &
    3137          594 :                qs_control%gapw_control%lmax_rho0
    3138          297 :             IF (qs_control%gapw_control%non_paw_atoms) THEN
    3139              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    3140           62 :                   "QS| GAPW|      At least one kind is NOT PAW, i.e. it has only soft AO "
    3141              :             END IF
    3142          297 :             IF (qs_control%gapw_control%nopaw_as_gpw) THEN
    3143              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    3144           62 :                   "QS| GAPW|      The NOT PAW atoms are treated fully GPW"
    3145              :             END IF
    3146              :          END IF
    3147         1534 :          IF (qs_control%gapw_xc) THEN
    3148           73 :             SELECT CASE (qs_control%gapw_control%basis_1c)
    3149              :             CASE (gapw_1c_orb)
    3150              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    3151           33 :                   "QS| GAPW_XC|      One center basis from orbital basis primitives"
    3152              :             CASE (gapw_1c_small)
    3153              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    3154            7 :                   "QS| GAPW_XC|      One center basis extended with primitives (small:s)"
    3155              :             CASE (gapw_1c_medium)
    3156              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    3157            0 :                   "QS| GAPW_XC|      One center basis extended with primitives (medium:sp)"
    3158              :             CASE (gapw_1c_large)
    3159              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    3160            0 :                   "QS| GAPW_XC|      One center basis extended with primitives (large:spd)"
    3161              :             CASE (gapw_1c_very_large)
    3162              :                WRITE (UNIT=output_unit, FMT="(T2,A)") &
    3163            0 :                   "QS| GAPW_XC|      One center basis extended with primitives (very large:spdf)"
    3164              :             CASE DEFAULT
    3165           40 :                CPABORT("basis_1c incorrect")
    3166              :             END SELECT
    3167              :             WRITE (UNIT=output_unit, FMT="(T2,A,T73,ES8.1)") &
    3168           40 :                "QS| GAPW_XC|                eps_fit:", &
    3169           40 :                qs_control%gapw_control%eps_fit, &
    3170           40 :                "QS| GAPW_XC|                eps_iso:", &
    3171           40 :                qs_control%gapw_control%eps_iso, &
    3172           40 :                "QS| GAPW_XC|                eps_svd:", &
    3173           80 :                qs_control%gapw_control%eps_svd
    3174              :             WRITE (UNIT=output_unit, FMT="(T2,A,T55,A30)") &
    3175           40 :                "QS| GAPW_XC|atom-r-grid: quadrature:", &
    3176           80 :                enum_i2c(enum, qs_control%gapw_control%quadrature)
    3177              :             WRITE (UNIT=output_unit, FMT="(T2,A,T71,I10)") &
    3178           40 :                "QS| GAPW_XC|   atom-s-grid:  max l :", &
    3179           80 :                qs_control%gapw_control%lmax_sphere
    3180              :          END IF
    3181         1534 :          IF (qs_control%mulliken_restraint) THEN
    3182              :             WRITE (UNIT=output_unit, FMT="(T2,A,T73,ES8.1)") &
    3183            1 :                "QS| Mulliken restraint target", qs_control%mulliken_restraint_control%target
    3184              :             WRITE (UNIT=output_unit, FMT="(T2,A,T73,ES8.1)") &
    3185            1 :                "QS| Mulliken restraint strength", qs_control%mulliken_restraint_control%strength
    3186              :             WRITE (UNIT=output_unit, FMT="(T2,A,T73,I8)") &
    3187            1 :                "QS| Mulliken restraint atoms: ", qs_control%mulliken_restraint_control%natoms
    3188            2 :             WRITE (UNIT=output_unit, FMT="(5I8)") qs_control%mulliken_restraint_control%atoms
    3189              :          END IF
    3190         1534 :          IF (qs_control%ddapc_restraint) THEN
    3191           14 :             DO i = 1, SIZE(qs_control%ddapc_restraint_control)
    3192            8 :                ddapc_restraint_control => qs_control%ddapc_restraint_control(i)
    3193            8 :                IF (SIZE(qs_control%ddapc_restraint_control) > 1) THEN
    3194              :                   WRITE (UNIT=output_unit, FMT="(T2,A,T3,I8)") &
    3195            3 :                      "QS| parameters for DDAPC restraint number", i
    3196              :                END IF
    3197              :                WRITE (UNIT=output_unit, FMT="(T2,A,T73,ES8.1)") &
    3198            8 :                   "QS| ddapc restraint target", ddapc_restraint_control%target
    3199              :                WRITE (UNIT=output_unit, FMT="(T2,A,T73,ES8.1)") &
    3200            8 :                   "QS| ddapc restraint strength", ddapc_restraint_control%strength
    3201              :                WRITE (UNIT=output_unit, FMT="(T2,A,T73,I8)") &
    3202            8 :                   "QS| ddapc restraint atoms: ", ddapc_restraint_control%natoms
    3203           17 :                WRITE (UNIT=output_unit, FMT="(5I8)") ddapc_restraint_control%atoms
    3204            8 :                WRITE (UNIT=output_unit, FMT="(T2,A)") "Coefficients:"
    3205           17 :                WRITE (UNIT=output_unit, FMT="(5F6.2)") ddapc_restraint_control%coeff
    3206            6 :                SELECT CASE (ddapc_restraint_control%functional_form)
    3207              :                CASE (do_ddapc_restraint)
    3208              :                   WRITE (UNIT=output_unit, FMT="(T2,A,T61,A20)") &
    3209            3 :                      "QS| ddapc restraint functional form :", "RESTRAINT"
    3210              :                CASE (do_ddapc_constraint)
    3211              :                   WRITE (UNIT=output_unit, FMT="(T2,A,T61,A20)") &
    3212            5 :                      "QS| ddapc restraint functional form :", "CONSTRAINT"
    3213              :                CASE DEFAULT
    3214            8 :                   CPABORT("Unknown ddapc restraint")
    3215              :                END SELECT
    3216              :             END DO
    3217              :          END IF
    3218         1534 :          IF (qs_control%s2_restraint) THEN
    3219              :             WRITE (UNIT=output_unit, FMT="(T2,A,T73,ES8.1)") &
    3220            0 :                "QS| s2 restraint target", qs_control%s2_restraint_control%target
    3221              :             WRITE (UNIT=output_unit, FMT="(T2,A,T73,ES8.1)") &
    3222            0 :                "QS| s2 restraint strength", qs_control%s2_restraint_control%strength
    3223            0 :             SELECT CASE (qs_control%s2_restraint_control%functional_form)
    3224              :             CASE (do_s2_restraint)
    3225              :                WRITE (UNIT=output_unit, FMT="(T2,A,T61,A20)") &
    3226            0 :                   "QS| s2 restraint functional form :", "RESTRAINT"
    3227            0 :                CPABORT("Not yet implemented")
    3228              :             CASE (do_s2_constraint)
    3229              :                WRITE (UNIT=output_unit, FMT="(T2,A,T61,A20)") &
    3230            0 :                   "QS| s2 restraint functional form :", "CONSTRAINT"
    3231              :             CASE DEFAULT
    3232            0 :                CPABORT("Unknown ddapc restraint")
    3233              :             END SELECT
    3234              :          END IF
    3235              :       END IF
    3236              :       CALL cp_print_key_finished_output(output_unit, logger, print_section_vals, &
    3237         6772 :                                         "DFT_CONTROL_PARAMETERS")
    3238              : 
    3239         6772 :       CALL timestop(handle)
    3240              : 
    3241              :    END SUBROUTINE write_qs_control
    3242              : 
    3243              : ! **************************************************************************************************
    3244              : !> \brief reads the input parameters needed for ddapc.
    3245              : !> \param qs_control ...
    3246              : !> \param qs_section ...
    3247              : !> \param ddapc_restraint_section ...
    3248              : !> \author fschiff
    3249              : !> \note
    3250              : !>      either reads DFT%QS%DDAPC_RESTRAINT or PROPERTIES%ET_coupling
    3251              : !>      if(qs_section is present the DFT part is read, if ddapc_restraint_section
    3252              : !>      is present ET_COUPLING is read. Avoid having both!!!
    3253              : ! **************************************************************************************************
    3254           14 :    SUBROUTINE read_ddapc_section(qs_control, qs_section, ddapc_restraint_section)
    3255              : 
    3256              :       TYPE(qs_control_type), INTENT(INOUT)               :: qs_control
    3257              :       TYPE(section_vals_type), OPTIONAL, POINTER         :: qs_section, ddapc_restraint_section
    3258              : 
    3259              :       INTEGER                                            :: i, j, jj, k, n_rep
    3260           14 :       INTEGER, DIMENSION(:), POINTER                     :: tmplist
    3261           14 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: rtmplist
    3262              :       TYPE(ddapc_restraint_type), POINTER                :: ddapc_restraint_control
    3263              :       TYPE(section_vals_type), POINTER                   :: ddapc_section
    3264              : 
    3265           14 :       IF (PRESENT(ddapc_restraint_section)) THEN
    3266            0 :          IF (ASSOCIATED(qs_control%ddapc_restraint_control)) THEN
    3267            0 :             IF (SIZE(qs_control%ddapc_restraint_control) >= 2) THEN
    3268            0 :                CPABORT("ET_COUPLING cannot be used in combination with a normal restraint")
    3269              :             END IF
    3270              :          ELSE
    3271            0 :             ddapc_section => ddapc_restraint_section
    3272            0 :             ALLOCATE (qs_control%ddapc_restraint_control(1))
    3273              :          END IF
    3274              :       END IF
    3275              : 
    3276           14 :       IF (PRESENT(qs_section)) THEN
    3277           14 :          NULLIFY (ddapc_section)
    3278              :          ddapc_section => section_vals_get_subs_vals(qs_section, &
    3279           14 :                                                      "DDAPC_RESTRAINT")
    3280              :       END IF
    3281              : 
    3282           32 :       DO i = 1, SIZE(qs_control%ddapc_restraint_control)
    3283              : 
    3284           18 :          CALL ddapc_control_create(qs_control%ddapc_restraint_control(i))
    3285           18 :          ddapc_restraint_control => qs_control%ddapc_restraint_control(i)
    3286              : 
    3287              :          CALL section_vals_val_get(ddapc_section, "STRENGTH", i_rep_section=i, &
    3288           18 :                                    r_val=ddapc_restraint_control%strength)
    3289              :          CALL section_vals_val_get(ddapc_section, "TARGET", i_rep_section=i, &
    3290           18 :                                    r_val=ddapc_restraint_control%target)
    3291              :          CALL section_vals_val_get(ddapc_section, "FUNCTIONAL_FORM", i_rep_section=i, &
    3292           18 :                                    i_val=ddapc_restraint_control%functional_form)
    3293              :          CALL section_vals_val_get(ddapc_section, "ATOMS", i_rep_section=i, &
    3294           18 :                                    n_rep_val=n_rep)
    3295              :          CALL section_vals_val_get(ddapc_section, "TYPE_OF_DENSITY", i_rep_section=i, &
    3296           18 :                                    i_val=ddapc_restraint_control%density_type)
    3297              : 
    3298           18 :          jj = 0
    3299           36 :          DO k = 1, n_rep
    3300              :             CALL section_vals_val_get(ddapc_section, "ATOMS", i_rep_section=i, &
    3301           18 :                                       i_rep_val=k, i_vals=tmplist)
    3302           56 :             DO j = 1, SIZE(tmplist)
    3303           38 :                jj = jj + 1
    3304              :             END DO
    3305              :          END DO
    3306           18 :          IF (jj < 1) CPABORT("Need at least 1 atom to use ddapc constraints")
    3307           18 :          ddapc_restraint_control%natoms = jj
    3308           18 :          IF (ASSOCIATED(ddapc_restraint_control%atoms)) THEN
    3309            0 :             DEALLOCATE (ddapc_restraint_control%atoms)
    3310              :          END IF
    3311           54 :          ALLOCATE (ddapc_restraint_control%atoms(ddapc_restraint_control%natoms))
    3312           18 :          jj = 0
    3313           36 :          DO k = 1, n_rep
    3314              :             CALL section_vals_val_get(ddapc_section, "ATOMS", i_rep_section=i, &
    3315           18 :                                       i_rep_val=k, i_vals=tmplist)
    3316           56 :             DO j = 1, SIZE(tmplist)
    3317           20 :                jj = jj + 1
    3318           38 :                ddapc_restraint_control%atoms(jj) = tmplist(j)
    3319              :             END DO
    3320              :          END DO
    3321              : 
    3322           18 :          IF (ASSOCIATED(ddapc_restraint_control%coeff)) THEN
    3323            0 :             DEALLOCATE (ddapc_restraint_control%coeff)
    3324              :          END IF
    3325           54 :          ALLOCATE (ddapc_restraint_control%coeff(ddapc_restraint_control%natoms))
    3326           38 :          ddapc_restraint_control%coeff = 1.0_dp
    3327              : 
    3328              :          CALL section_vals_val_get(ddapc_section, "COEFF", i_rep_section=i, &
    3329           18 :                                    n_rep_val=n_rep)
    3330           18 :          jj = 0
    3331           20 :          DO k = 1, n_rep
    3332              :             CALL section_vals_val_get(ddapc_section, "COEFF", i_rep_section=i, &
    3333            2 :                                       i_rep_val=k, r_vals=rtmplist)
    3334           22 :             DO j = 1, SIZE(rtmplist)
    3335            2 :                jj = jj + 1
    3336            2 :                IF (jj > ddapc_restraint_control%natoms) THEN
    3337            0 :                   CPABORT("Need the same number of coeff as there are atoms ")
    3338              :                END IF
    3339            4 :                ddapc_restraint_control%coeff(jj) = rtmplist(j)
    3340              :             END DO
    3341              :          END DO
    3342           68 :          IF (jj < ddapc_restraint_control%natoms .AND. jj /= 0) THEN
    3343            0 :             CPABORT("Need no or the same number of coeff as there are atoms.")
    3344              :          END IF
    3345              :       END DO
    3346           14 :       k = 0
    3347           32 :       DO i = 1, SIZE(qs_control%ddapc_restraint_control)
    3348           18 :          IF (qs_control%ddapc_restraint_control(i)%functional_form == &
    3349           24 :              do_ddapc_constraint) k = k + 1
    3350              :       END DO
    3351           14 :       IF (k == 2) CALL cp_abort(__LOCATION__, &
    3352            0 :                                 "Only a single constraint possible yet, try to use restraints instead ")
    3353              : 
    3354           14 :    END SUBROUTINE read_ddapc_section
    3355              : 
    3356              : ! **************************************************************************************************
    3357              : !> \brief ...
    3358              : !> \param dft_control ...
    3359              : !> \param efield_section ...
    3360              : !> \param cell ...
    3361              : ! **************************************************************************************************
    3362          344 :    SUBROUTINE read_efield_sections(dft_control, efield_section, cell)
    3363              :       TYPE(dft_control_type), POINTER                    :: dft_control
    3364              :       TYPE(section_vals_type), POINTER                   :: efield_section
    3365              :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell
    3366              : 
    3367              :       CHARACTER(len=default_path_length)                 :: file_name
    3368              :       INTEGER                                            :: i, io, j, n, unit_nr
    3369              :       LOGICAL                                            :: amplitude_explicit, intensity_explicit
    3370          344 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: tmp_vals
    3371              :       TYPE(efield_type), POINTER                         :: efield
    3372              :       TYPE(section_vals_type), POINTER                   :: tmp_section
    3373              : 
    3374          688 :       DO i = 1, SIZE(dft_control%efield_fields)
    3375          344 :          NULLIFY (dft_control%efield_fields(i)%efield)
    3376         1376 :          ALLOCATE (dft_control%efield_fields(i)%efield)
    3377          344 :          efield => dft_control%efield_fields(i)%efield
    3378          344 :          NULLIFY (efield%envelop_i_vars, efield%envelop_r_vars)
    3379              :          CALL section_vals_val_get(efield_section, "INTENSITY", i_rep_section=i, &
    3380          344 :                                    r_val=efield%strength, explicit=intensity_explicit)
    3381              :          CALL section_vals_val_get(efield_section, "AMPLITUDE", i_rep_section=i, &
    3382          344 :                                    r_val=efield%amplitude, explicit=amplitude_explicit)
    3383              : 
    3384          344 :          IF (intensity_explicit .AND. amplitude_explicit) THEN
    3385            0 :             CPABORT("Both INTENSITY and AMPLITUDE provided in EFIELD section.")
    3386              :          END IF
    3387              : 
    3388          344 :          IF (intensity_explicit) THEN
    3389           48 :             efield%amplitude = SQRT(efield%strength/(3.50944_dp*10.0_dp**16))
    3390              :          END IF
    3391              : 
    3392          344 :          IF (amplitude_explicit) THEN
    3393            0 :             efield%strength = (3.50944_dp*10.0_dp**16)*(efield%amplitude)**2
    3394              :          END IF
    3395              : 
    3396              :          CALL section_vals_val_get(efield_section, "POLARISATION", i_rep_section=i, &
    3397          344 :                                    r_vals=tmp_vals)
    3398         1032 :          ALLOCATE (efield%polarisation(SIZE(tmp_vals)))
    3399         2408 :          efield%polarisation = tmp_vals
    3400          344 :          IF (PRESENT(cell)) THEN
    3401          344 :             IF (ASSOCIATED(cell)) CALL cell_transform_input_cartesian(cell, efield%polarisation(1:3))
    3402              :          END IF
    3403              :          CALL section_vals_val_get(efield_section, "PHASE", i_rep_section=i, &
    3404          344 :                                    r_val=efield%phase_offset)
    3405              :          CALL section_vals_val_get(efield_section, "ENVELOP", i_rep_section=i, &
    3406          344 :                                    i_val=efield%envelop_id)
    3407              :          CALL section_vals_val_get(efield_section, "WAVELENGTH", i_rep_section=i, &
    3408          344 :                                    r_val=efield%wavelength)
    3409              :          CALL section_vals_val_get(efield_section, "VEC_POT_INITIAL", i_rep_section=i, &
    3410          344 :                                    r_vals=tmp_vals)
    3411         2408 :          efield%vec_pot_initial = tmp_vals
    3412          344 :          IF (PRESENT(cell)) THEN
    3413          344 :             IF (ASSOCIATED(cell)) CALL cell_transform_input_cartesian(cell, efield%vec_pot_initial(1:3))
    3414              :          END IF
    3415              : 
    3416         1032 :          IF (efield%envelop_id == constant_env) THEN
    3417          328 :             ALLOCATE (efield%envelop_i_vars(2))
    3418          328 :             tmp_section => section_vals_get_subs_vals(efield_section, "CONSTANT_ENV", i_rep_section=i)
    3419              :             CALL section_vals_val_get(tmp_section, "START_STEP", &
    3420          328 :                                       i_val=efield%envelop_i_vars(1))
    3421              :             CALL section_vals_val_get(tmp_section, "END_STEP", &
    3422          328 :                                       i_val=efield%envelop_i_vars(2))
    3423           16 :          ELSE IF (efield%envelop_id == gaussian_env) THEN
    3424           12 :             ALLOCATE (efield%envelop_r_vars(2))
    3425           12 :             tmp_section => section_vals_get_subs_vals(efield_section, "GAUSSIAN_ENV", i_rep_section=i)
    3426              :             CALL section_vals_val_get(tmp_section, "T0", &
    3427           12 :                                       r_val=efield%envelop_r_vars(1))
    3428              :             CALL section_vals_val_get(tmp_section, "SIGMA", &
    3429           12 :                                       r_val=efield%envelop_r_vars(2))
    3430            4 :          ELSE IF (efield%envelop_id == ramp_env) THEN
    3431            2 :             ALLOCATE (efield%envelop_i_vars(4))
    3432            2 :             tmp_section => section_vals_get_subs_vals(efield_section, "RAMP_ENV", i_rep_section=i)
    3433              :             CALL section_vals_val_get(tmp_section, "START_STEP_IN", &
    3434            2 :                                       i_val=efield%envelop_i_vars(1))
    3435              :             CALL section_vals_val_get(tmp_section, "END_STEP_IN", &
    3436            2 :                                       i_val=efield%envelop_i_vars(2))
    3437              :             CALL section_vals_val_get(tmp_section, "START_STEP_OUT", &
    3438            2 :                                       i_val=efield%envelop_i_vars(3))
    3439              :             CALL section_vals_val_get(tmp_section, "END_STEP_OUT", &
    3440            2 :                                       i_val=efield%envelop_i_vars(4))
    3441            2 :          ELSE IF (efield%envelop_id == custom_env) THEN
    3442            2 :             tmp_section => section_vals_get_subs_vals(efield_section, "CUSTOM_ENV", i_rep_section=i)
    3443            2 :             CALL section_vals_val_get(tmp_section, "EFIELD_FILE_NAME", c_val=file_name)
    3444            2 :             CALL open_file(file_name=TRIM(file_name), file_action="READ", file_status="OLD", unit_number=unit_nr)
    3445              :             !Determine the number of lines in file
    3446            2 :             n = 0
    3447           10 :             DO WHILE (.TRUE.)
    3448           12 :                READ (unit_nr, *, iostat=io)
    3449           12 :                IF (io /= 0) EXIT
    3450           10 :                n = n + 1
    3451              :             END DO
    3452            2 :             REWIND (unit_nr)
    3453            6 :             ALLOCATE (efield%envelop_r_vars(n + 1))
    3454              :             !Store the timestep of the list in the first entry of the r_vars
    3455            2 :             CALL section_vals_val_get(tmp_section, "TIMESTEP", r_val=efield%envelop_r_vars(1))
    3456              :             !Read the file
    3457           12 :             DO j = 2, n + 1
    3458           10 :                READ (unit_nr, *) efield%envelop_r_vars(j)
    3459           12 :                efield%envelop_r_vars(j) = cp_unit_to_cp2k(efield%envelop_r_vars(j), "volt/m")
    3460              :             END DO
    3461            2 :             CALL close_file(unit_nr)
    3462              :          END IF
    3463              :       END DO
    3464          344 :    END SUBROUTINE read_efield_sections
    3465              : 
    3466              : ! **************************************************************************************************
    3467              : !> \brief reads the input parameters needed real time propagation
    3468              : !> \param dft_control ...
    3469              : !> \param rtp_section ...
    3470              : !> \author fschiff
    3471              : ! **************************************************************************************************
    3472         2268 :    SUBROUTINE read_rtp_section(dft_control, rtp_section)
    3473              : 
    3474              :       TYPE(dft_control_type), INTENT(INOUT)              :: dft_control
    3475              :       TYPE(section_vals_type), POINTER                   :: rtp_section
    3476              : 
    3477              :       INTEGER                                            :: i, j, n_elems
    3478          324 :       INTEGER, DIMENSION(:), POINTER                     :: tmp
    3479              :       LOGICAL                                            :: is_present, linearize_bse_propagation, &
    3480              :                                                             local_moment_possible
    3481              :       TYPE(section_vals_type), POINTER                   :: proj_mo_section, subsection
    3482              : 
    3483         3888 :       ALLOCATE (dft_control%rtp_control)
    3484              :       CALL section_vals_val_get(rtp_section, "MAX_ITER", &
    3485          324 :                                 i_val=dft_control%rtp_control%max_iter)
    3486              :       CALL section_vals_val_get(rtp_section, "MAT_EXP", &
    3487          324 :                                 i_val=dft_control%rtp_control%mat_exp)
    3488              :       CALL section_vals_val_get(rtp_section, "ASPC_ORDER", &
    3489          324 :                                 i_val=dft_control%rtp_control%aspc_order)
    3490              :       CALL section_vals_val_get(rtp_section, "EXP_ACCURACY", &
    3491          324 :                                 r_val=dft_control%rtp_control%eps_exp)
    3492              :       CALL section_vals_val_get(rtp_section, "RTBSE%_SECTION_PARAMETERS_", &
    3493          324 :                                 i_val=dft_control%rtp_control%rtp_method)
    3494              :       CALL section_vals_val_get(rtp_section, "RTBSE%RTBSE_HAMILTONIAN", &
    3495          324 :                                 i_val=dft_control%rtp_control%rtbse_ham)
    3496              :       CALL section_vals_val_get(rtp_section, "RTBSE%LINEARIZED_BSE_PROPAGATION", &
    3497          324 :                                 l_val=linearize_bse_propagation)
    3498              :       ! Change rtp_method to linearized bse. The section parameter also feeds bs_env%rtp_method,
    3499              :       ! which gates the W(w=0) build in the GW step - TDDFT there would dispatch the linearized
    3500              :       ! propagator with no screened interaction to propagate with, so reject the combination.
    3501          324 :       IF (linearize_bse_propagation) THEN
    3502           58 :          IF (dft_control%rtp_control%rtp_method /= rtp_method_bse) THEN
    3503              :             CALL cp_abort(__LOCATION__, &
    3504              :                           "LINEARIZED_BSE_PROPAGATION requires the RTBSE section opened as "// &
    3505            0 :                           "'&RTBSE' or '&RTBSE RTBSE', not '&RTBSE TDDFT'.")
    3506              :          END IF
    3507           58 :          dft_control%rtp_control%rtp_method = rtp_method_bse_linearized
    3508              :       END IF
    3509              : 
    3510              :       CALL section_vals_val_get(rtp_section, "PROPAGATOR", &
    3511          324 :                                 i_val=dft_control%rtp_control%propagator)
    3512              :       CALL section_vals_val_get(rtp_section, "EPS_ITER", &
    3513          324 :                                 r_val=dft_control%rtp_control%eps_ener)
    3514              :       CALL section_vals_val_get(rtp_section, "INITIAL_WFN", &
    3515          324 :                                 i_val=dft_control%rtp_control%initial_wfn)
    3516              :       CALL section_vals_val_get(rtp_section, "HFX_BALANCE_IN_CORE", &
    3517          324 :                                 l_val=dft_control%rtp_control%hfx_redistribute)
    3518              :       CALL section_vals_val_get(rtp_section, "APPLY_WFN_MIX_INIT_RESTART", &
    3519          324 :                                 l_val=dft_control%rtp_control%apply_wfn_mix_init_restart)
    3520              :       CALL section_vals_val_get(rtp_section, "APPLY_DELTA_PULSE", &
    3521          324 :                                 l_val=dft_control%rtp_control%apply_delta_pulse)
    3522              :       CALL section_vals_val_get(rtp_section, "APPLY_DELTA_PULSE_MAG", &
    3523          324 :                                 l_val=dft_control%rtp_control%apply_delta_pulse_mag)
    3524              :       CALL section_vals_val_get(rtp_section, "VELOCITY_GAUGE", &
    3525          324 :                                 l_val=dft_control%rtp_control%velocity_gauge)
    3526              :       CALL section_vals_val_get(rtp_section, "VG_COM_NL", &
    3527          324 :                                 l_val=dft_control%rtp_control%nl_gauge_transform)
    3528              :       CALL section_vals_val_get(rtp_section, "PERIODIC", &
    3529          324 :                                 l_val=dft_control%rtp_control%periodic)
    3530              :       CALL section_vals_val_get(rtp_section, "DENSITY_PROPAGATION", &
    3531          324 :                                 l_val=dft_control%rtp_control%linear_scaling)
    3532              :       CALL section_vals_val_get(rtp_section, "MCWEENY_MAX_ITER", &
    3533          324 :                                 i_val=dft_control%rtp_control%mcweeny_max_iter)
    3534              :       CALL section_vals_val_get(rtp_section, "ACCURACY_REFINEMENT", &
    3535          324 :                                 i_val=dft_control%rtp_control%acc_ref)
    3536              :       CALL section_vals_val_get(rtp_section, "MCWEENY_EPS", &
    3537          324 :                                 r_val=dft_control%rtp_control%mcweeny_eps)
    3538              :       CALL section_vals_val_get(rtp_section, "DELTA_PULSE_SCALE", &
    3539          324 :                                 r_val=dft_control%rtp_control%delta_pulse_scale)
    3540              :       CALL section_vals_val_get(rtp_section, "DELTA_PULSE_DIRECTION", &
    3541          324 :                                 i_vals=tmp)
    3542         1296 :       dft_control%rtp_control%delta_pulse_direction = tmp
    3543              :       CALL section_vals_val_get(rtp_section, "SC_CHECK_START", &
    3544          324 :                                 i_val=dft_control%rtp_control%sc_check_start)
    3545          324 :       proj_mo_section => section_vals_get_subs_vals(rtp_section, "PRINT%PROJECTION_MO")
    3546          324 :       CALL section_vals_get(proj_mo_section, explicit=is_present)
    3547          324 :       IF (is_present) THEN
    3548            4 :          IF (dft_control%rtp_control%linear_scaling) THEN
    3549              :             CALL cp_abort(__LOCATION__, &
    3550              :                           "You have defined a time dependent projection of mos, but "// &
    3551              :                           "only the density matrix is propagated (DENSITY_PROPAGATION "// &
    3552              :                           ".TRUE.). Please either use MO-based real time DFT or do not "// &
    3553            0 :                           "define any PRINT%PROJECTION_MO section")
    3554              :          END IF
    3555            4 :          dft_control%rtp_control%is_proj_mo = .TRUE.
    3556              :       ELSE
    3557          320 :          dft_control%rtp_control%is_proj_mo = .FALSE.
    3558              :       END IF
    3559              :       ! Moment trace
    3560              :       local_moment_possible = (dft_control%rtp_control%rtp_method == rtp_method_bse .OR. &
    3561              :                                dft_control%rtp_control%rtp_method == rtp_method_bse_linearized) .OR. &
    3562          324 :                               ((.NOT. dft_control%rtp_control%periodic) .AND. dft_control%rtp_control%linear_scaling)
    3563              :       ! TODO : Implement for other moment operators
    3564          324 :       subsection => section_vals_get_subs_vals(rtp_section, "PRINT%MOMENTS")
    3565          324 :       CALL section_vals_get(subsection, explicit=is_present)
    3566              :       ! Trigger the flag
    3567              :       dft_control%rtp_control%save_local_moments = &
    3568          324 :          is_present .OR. dft_control%rtp_control%save_local_moments
    3569          324 :       IF (is_present .AND. (.NOT. local_moment_possible)) THEN
    3570              :          CALL cp_abort(__LOCATION__, "Moments trace printing only "// &
    3571              :                        "implemented in non-periodic systems in linear scaling. "// &
    3572            0 :                        "Please use DFT%PRINT%MOMENTS for other printing.")
    3573              :       END IF
    3574              :       CALL section_vals_val_get(rtp_section, "PRINT%MOMENTS%REFERENCE", &
    3575          324 :                                 i_val=dft_control%rtp_control%moment_trace_ref_type)
    3576              :       CALL section_vals_val_get(rtp_section, "PRINT%MOMENTS%REFERENCE_POINT", &
    3577          324 :                                 r_vals=dft_control%rtp_control%moment_trace_user_ref_point)
    3578              :       ! Moment Fourier transform
    3579          324 :       subsection => section_vals_get_subs_vals(rtp_section, "PRINT%MOMENTS_FT")
    3580          324 :       CALL section_vals_get(subsection, explicit=is_present)
    3581              :       ! Trigger the flag
    3582              :       dft_control%rtp_control%save_local_moments = &
    3583          324 :          is_present .OR. dft_control%rtp_control%save_local_moments
    3584          324 :       IF (is_present .AND. (.NOT. local_moment_possible)) THEN
    3585              :          ! Not implemented
    3586              :          CALL cp_abort(__LOCATION__, "Moments Fourier transform printing "// &
    3587            0 :                        "implemented only for non-periodic systems in linear scaling.")
    3588              :       END IF
    3589              :       ! General FT settings
    3590              :       CALL section_vals_val_get(rtp_section, "FT%DAMPING", &
    3591          324 :                                 r_val=dft_control%rtp_control%ft_damping)
    3592              :       CALL section_vals_val_get(rtp_section, "FT%START_TIME", &
    3593          324 :                                 r_val=dft_control%rtp_control%ft_t0)
    3594              :       ! Padé settings
    3595          324 :       subsection => section_vals_get_subs_vals(rtp_section, "FT%PADE")
    3596              :       CALL section_vals_val_get(subsection, "_SECTION_PARAMETERS_", &
    3597          324 :                                 l_val=dft_control%rtp_control%pade_requested)
    3598              :       CALL section_vals_val_get(subsection, "E_MIN", &
    3599          324 :                                 r_val=dft_control%rtp_control%pade_e_min)
    3600              :       CALL section_vals_val_get(subsection, "E_STEP", &
    3601          324 :                                 r_val=dft_control%rtp_control%pade_e_step)
    3602              :       CALL section_vals_val_get(subsection, "E_MAX", &
    3603          324 :                                 r_val=dft_control%rtp_control%pade_e_max)
    3604              :       CALL section_vals_val_get(subsection, "FIT_E_MIN", &
    3605          324 :                                 r_val=dft_control%rtp_control%pade_fit_e_min)
    3606              :       CALL section_vals_val_get(subsection, "FIT_E_MAX", &
    3607          324 :                                 r_val=dft_control%rtp_control%pade_fit_e_max)
    3608              :       ! If default settings used for fit_e_min/max, rewrite with appropriate values
    3609          324 :       IF (dft_control%rtp_control%pade_fit_e_min < 0) THEN
    3610          324 :          dft_control%rtp_control%pade_fit_e_min = dft_control%rtp_control%pade_e_min
    3611              :       END IF
    3612          324 :       IF (dft_control%rtp_control%pade_fit_e_max < 0) THEN
    3613          324 :          dft_control%rtp_control%pade_fit_e_max = dft_control%rtp_control%pade_e_max
    3614              :       END IF
    3615              :       ! Polarizability settings
    3616          324 :       subsection => section_vals_get_subs_vals(rtp_section, "PRINT%POLARIZABILITY")
    3617          324 :       CALL section_vals_get(subsection, explicit=is_present)
    3618              :       ! Trigger the flag
    3619              :       dft_control%rtp_control%save_local_moments = &
    3620          324 :          is_present .OR. dft_control%rtp_control%save_local_moments
    3621          324 :       IF (is_present .AND. (.NOT. local_moment_possible)) THEN
    3622              :          ! Not implemented
    3623              :          CALL cp_abort(__LOCATION__, "Polarizability printing "// &
    3624            0 :                        "implemented only for non-periodic systems.")
    3625              :       END IF
    3626          324 :       CALL section_vals_val_get(subsection, "ELEMENT", explicit=is_present, n_rep_val=n_elems)
    3627          324 :       NULLIFY (dft_control%rtp_control%print_pol_elements)
    3628          324 :       IF (is_present) THEN
    3629              :          ! Explicit list of elements
    3630              :          ! Allocate the array
    3631            0 :          ALLOCATE (dft_control%rtp_control%print_pol_elements(n_elems, 2))
    3632            0 :          DO i = 1, n_elems
    3633            0 :             CALL section_vals_val_get(subsection, "ELEMENT", i_vals=tmp, i_rep_val=i)
    3634            0 :             dft_control%rtp_control%print_pol_elements(i, :) = tmp(:)
    3635              :          END DO
    3636              :          ! Do basic sanity checks for pol_element
    3637            0 :          DO i = 1, n_elems
    3638            0 :             DO j = 1, 2
    3639            0 :                IF (dft_control%rtp_control%print_pol_elements(i, j) > 3 .OR. &
    3640            0 :                    dft_control%rtp_control%print_pol_elements(i, j) < 1) THEN
    3641            0 :                   CPABORT("Polarisation tensor element not 1,2 or 3 in at least one index")
    3642              :                END IF
    3643              :             END DO
    3644              :          END DO
    3645              :       END IF
    3646              : 
    3647              :       ! Finally, allow printing of FT observables also in the case when they are not explicitly
    3648              :       ! required, but they are available, i.e. non-periodic linear scaling calculation
    3649              :       dft_control%rtp_control%save_local_moments = &
    3650              :          dft_control%rtp_control%save_local_moments .OR. &
    3651          324 :          ((.NOT. dft_control%rtp_control%periodic) .AND. dft_control%rtp_control%linear_scaling)
    3652              : 
    3653          324 :    END SUBROUTINE read_rtp_section
    3654              : ! **************************************************************************************************
    3655              : !> \brief Tries to guess the elements of polarization to print
    3656              : !> \param dftc DFT parameters
    3657              : !> \param elems 2D array, where the guessed element indeces are stored
    3658              : !> \date 11.2025
    3659              : !> \author Stepan Marek
    3660              : ! **************************************************************************************************
    3661           90 :    SUBROUTINE guess_pol_elements(dftc, elems)
    3662              :       TYPE(dft_control_type)                             :: dftc
    3663              :       INTEGER, DIMENSION(:, :), POINTER                  :: elems
    3664              : 
    3665              :       INTEGER                                            :: i, i_nonzero, n_nonzero
    3666              :       LOGICAL                                            :: pol_vector_known
    3667              :       REAL(kind=dp), DIMENSION(3)                        :: pol_vector
    3668              : 
    3669           90 :       pol_vector_known = .FALSE.
    3670              : 
    3671              :       ! TODO : More relevant elements for magnetic pulse?
    3672           90 :       IF (dftc%rtp_control%apply_delta_pulse .OR. dftc%rtp_control%apply_delta_pulse_mag) THEN
    3673          336 :          pol_vector(:) = REAL(dftc%rtp_control%delta_pulse_direction(:), kind=dp)
    3674              :       ELSE
    3675              :          ! Maybe RT field is applied?
    3676           24 :          pol_vector(:) = dftc%efield_fields(1)%efield%polarisation(:)
    3677              :       END IF
    3678          360 :       IF (DOT_PRODUCT(pol_vector, pol_vector) > 0.0_dp) pol_vector_known = .TRUE.
    3679              : 
    3680              :       IF (.NOT. pol_vector_known) THEN
    3681            0 :          CPABORT("Cannot guess polarization elements - please specify!")
    3682              :       ELSE
    3683              :          ! Check whether just one element is non-zero
    3684              :          n_nonzero = 0
    3685          360 :          DO i = 1, 3
    3686          360 :             IF (pol_vector(i) /= 0.0_dp) THEN
    3687           90 :                n_nonzero = n_nonzero + 1
    3688           90 :                i_nonzero = i
    3689              :             END IF
    3690              :          END DO
    3691           90 :          IF (n_nonzero > 1) THEN
    3692              :             CALL cp_abort(__LOCATION__, &
    3693              :                           "More than one non-zero field elements - "// &
    3694            0 :                           "cannot guess polarizability elements - please specify!")
    3695           90 :          ELSE IF (n_nonzero == 0) THEN
    3696              :             CALL cp_abort(__LOCATION__, &
    3697              :                           "No non-zero field elements - "// &
    3698            0 :                           "cannot guess polarizability elements - please specify!")
    3699              :          ELSE
    3700              :             ! Clear guess can be made
    3701              :             NULLIFY (elems)
    3702           90 :             ALLOCATE (elems(3, 2))
    3703          360 :             DO i = 1, 3
    3704          270 :                elems(i, 1) = i
    3705          360 :                elems(i, 2) = i_nonzero
    3706              :             END DO
    3707              :          END IF
    3708              :       END IF
    3709           90 :    END SUBROUTINE guess_pol_elements
    3710              : 
    3711              : ! **************************************************************************************************
    3712              : !> \brief Parses the BLOCK_LIST keywords from the ADMM section
    3713              : !> \param admm_control ...
    3714              : !> \param dft_section ...
    3715              : ! **************************************************************************************************
    3716          532 :    SUBROUTINE read_admm_block_list(admm_control, dft_section)
    3717              :       TYPE(admm_control_type), POINTER                   :: admm_control
    3718              :       TYPE(section_vals_type), POINTER                   :: dft_section
    3719              : 
    3720              :       INTEGER                                            :: irep, list_size, n_rep
    3721          532 :       INTEGER, DIMENSION(:), POINTER                     :: tmplist
    3722              : 
    3723          532 :       NULLIFY (tmplist)
    3724              : 
    3725              :       CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%BLOCK_LIST", &
    3726          532 :                                 n_rep_val=n_rep)
    3727              : 
    3728         1118 :       ALLOCATE (admm_control%blocks(n_rep))
    3729              : 
    3730          568 :       DO irep = 1, n_rep
    3731              :          CALL section_vals_val_get(dft_section, "AUXILIARY_DENSITY_MATRIX_METHOD%BLOCK_LIST", &
    3732           36 :                                    i_rep_val=irep, i_vals=tmplist)
    3733           36 :          list_size = SIZE(tmplist)
    3734          108 :          ALLOCATE (admm_control%blocks(irep)%list(list_size))
    3735          740 :          admm_control%blocks(irep)%list(:) = tmplist(:)
    3736              :       END DO
    3737              : 
    3738          532 :    END SUBROUTINE read_admm_block_list
    3739              : 
    3740              : ! **************************************************************************************************
    3741              : !> \brief ...
    3742              : !> \param dft_control ...
    3743              : !> \param hairy_probes_section ...
    3744              : !> \param
    3745              : !> \param
    3746              : ! **************************************************************************************************
    3747            4 :    SUBROUTINE read_hairy_probes_sections(dft_control, hairy_probes_section)
    3748              :       TYPE(dft_control_type), POINTER                    :: dft_control
    3749              :       TYPE(section_vals_type), POINTER                   :: hairy_probes_section
    3750              : 
    3751              :       INTEGER                                            :: i, j, jj, kk, n_rep
    3752            4 :       INTEGER, DIMENSION(:), POINTER                     :: tmplist
    3753              : 
    3754           12 :       DO i = 1, SIZE(dft_control%probe)
    3755            8 :          NULLIFY (dft_control%probe(i)%atom_ids)
    3756              : 
    3757            8 :          CALL section_vals_val_get(hairy_probes_section, "ATOM_IDS", i_rep_section=i, n_rep_val=n_rep)
    3758            8 :          jj = 0
    3759           16 :          DO kk = 1, n_rep
    3760            8 :             CALL section_vals_val_get(hairy_probes_section, "ATOM_IDS", i_rep_section=i, i_rep_val=kk, i_vals=tmplist)
    3761           16 :             jj = jj + SIZE(tmplist)
    3762              :          END DO
    3763              : 
    3764            8 :          dft_control%probe(i)%natoms = jj
    3765            8 :          IF (dft_control%probe(i)%natoms < 1) THEN
    3766            0 :             CPABORT("Need at least 1 atom to use hair probes formalism")
    3767              :          END IF
    3768           24 :          ALLOCATE (dft_control%probe(i)%atom_ids(dft_control%probe(i)%natoms))
    3769              : 
    3770            8 :          jj = 0
    3771           16 :          DO kk = 1, n_rep
    3772            8 :             CALL section_vals_val_get(hairy_probes_section, "ATOM_IDS", i_rep_section=i, i_rep_val=kk, i_vals=tmplist)
    3773           24 :             DO j = 1, SIZE(tmplist)
    3774            8 :                jj = jj + 1
    3775           16 :                dft_control%probe(i)%atom_ids(jj) = tmplist(j)
    3776              :             END DO
    3777              :          END DO
    3778              : 
    3779            8 :          CALL section_vals_val_get(hairy_probes_section, "MU", i_rep_section=i, r_val=dft_control%probe(i)%mu)
    3780              : 
    3781            8 :          CALL section_vals_val_get(hairy_probes_section, "T", i_rep_section=i, r_val=dft_control%probe(i)%T)
    3782              : 
    3783            8 :          CALL section_vals_val_get(hairy_probes_section, "ALPHA", i_rep_section=i, r_val=dft_control%probe(i)%alpha)
    3784              : 
    3785           20 :          CALL section_vals_val_get(hairy_probes_section, "eps_hp", i_rep_section=i, r_val=dft_control%probe(i)%eps_hp)
    3786              :       END DO
    3787              : 
    3788            4 :    END SUBROUTINE read_hairy_probes_sections
    3789              : ! **************************************************************************************************
    3790              : 
    3791              : END MODULE cp_control_utils
        

Generated by: LCOV version 2.0-1