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