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