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