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