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 function that build the dft section of the input
10 : !> \par History
11 : !> 10.2005 moved out of input_cp2k [fawzi]
12 : !> \author fawzi
13 : ! **************************************************************************************************
14 : MODULE input_cp2k_ec
15 : USE bibliography, ONLY: Niklasson2003,&
16 : VandeVondele2012,&
17 : brehm2018
18 : USE cp_output_handling, ONLY: cp_print_key_section_create,&
19 : debug_print_level,&
20 : high_print_level
21 : USE input_constants, ONLY: &
22 : bqb_opt_exhaustive, bqb_opt_normal, bqb_opt_off, bqb_opt_patient, bqb_opt_quick, &
23 : ec_diagonalization, ec_functional_dc, ec_functional_ext, ec_functional_harris, &
24 : ec_ls_solver, ec_matrix_sign, ec_matrix_tc2, ec_matrix_trs4, ec_mo_solver, ec_ot_atomic, &
25 : ec_ot_diag, ec_ot_gs, kg_cholesky, ls_cluster_atomic, ls_cluster_molecular, &
26 : ls_s_inversion_hotelling, ls_s_inversion_sign_sqrt, ls_s_preconditioner_atomic, &
27 : ls_s_preconditioner_molecular, ls_s_preconditioner_none, ls_s_sqrt_ns, ls_s_sqrt_proot, &
28 : ls_scf_sign_ns, ls_scf_sign_proot, ot_precond_full_all, ot_precond_full_kinetic, &
29 : ot_precond_full_single, ot_precond_full_single_inverse, ot_precond_none, &
30 : ot_precond_s_inverse, precond_mlp
31 : USE input_cp2k_mm, ONLY: create_dipoles_section
32 : USE input_cp2k_voronoi, ONLY: create_print_voronoi_section
33 : USE input_cp2k_xc, ONLY: create_xc_section
34 : USE input_keyword_types, ONLY: keyword_create,&
35 : keyword_release,&
36 : keyword_type
37 : USE input_section_types, ONLY: section_add_keyword,&
38 : section_add_subsection,&
39 : section_create,&
40 : section_release,&
41 : section_type
42 : USE input_val_types, ONLY: char_t,&
43 : integer_t
44 : USE kinds, ONLY: dp
45 : USE string_utilities, ONLY: s2a
46 : #include "./base/base_uses.f90"
47 :
48 : IMPLICIT NONE
49 : PRIVATE
50 :
51 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'input_cp2k_ec'
52 :
53 : PUBLIC :: create_ec_section
54 :
55 : CONTAINS
56 :
57 : ! **************************************************************************************************
58 : !> \brief creates the ENERGY CORRECTION section
59 : !> \param section ...
60 : !> \author JGH
61 : ! **************************************************************************************************
62 9220 : SUBROUTINE create_ec_section(section)
63 : TYPE(section_type), POINTER :: section
64 :
65 : TYPE(keyword_type), POINTER :: keyword
66 : TYPE(section_type), POINTER :: subsection
67 :
68 9220 : CPASSERT(.NOT. ASSOCIATED(section))
69 :
70 9220 : NULLIFY (keyword)
71 : CALL section_create(section, __LOCATION__, name="ENERGY_CORRECTION", &
72 : description="Sets the various options for the Energy Correction", &
73 9220 : n_keywords=0, n_subsections=2, repeats=.FALSE.)
74 :
75 : CALL keyword_create(keyword, __LOCATION__, name="_SECTION_PARAMETERS_", &
76 : description="Controls the activation of the energy_correction", &
77 : usage="&ENERGY_CORRECTION T", &
78 : default_l_val=.FALSE., &
79 9220 : lone_keyword_l_val=.TRUE.)
80 9220 : CALL section_add_keyword(section, keyword)
81 9220 : CALL keyword_release(keyword)
82 :
83 : ! add a special XC section
84 9220 : NULLIFY (subsection)
85 9220 : CALL create_xc_section(subsection)
86 9220 : CALL section_add_subsection(section, subsection)
87 9220 : CALL section_release(subsection)
88 :
89 : ! add a section for solver keywords
90 9220 : NULLIFY (subsection)
91 9220 : CALL create_ec_solver_section(subsection)
92 9220 : CALL section_add_subsection(section, subsection)
93 9220 : CALL section_release(subsection)
94 :
95 : ! add a print section for properties
96 9220 : NULLIFY (subsection)
97 9220 : CALL create_ec_print_section(subsection)
98 9220 : CALL section_add_subsection(section, subsection)
99 9220 : CALL section_release(subsection)
100 :
101 : CALL keyword_create(keyword, __LOCATION__, name="ENERGY_FUNCTIONAL", &
102 : description="Functional used in energy correction", &
103 : usage="ENERGY_FUNCTIONAL HARRIS", &
104 : default_i_val=ec_functional_harris, &
105 : enum_c_vals=s2a("HARRIS", "DCDFT", "EXTERNAL"), &
106 : enum_desc=s2a("Harris functional", &
107 : "Density-corrected DFT", &
108 : "External calculated energy"), &
109 9220 : enum_i_vals=(/ec_functional_harris, ec_functional_dc, ec_functional_ext/))
110 9220 : CALL section_add_keyword(section, keyword)
111 9220 : CALL keyword_release(keyword)
112 :
113 : CALL keyword_create(keyword, __LOCATION__, name="HARRIS_BASIS", &
114 : description="Specifies the type of basis to be used for the KG energy correction. "// &
115 : "Options are: (1) the default orbital basis (ORBITAL); "// &
116 : "(2) the primitive functions of the default orbital basis (PRIMITIVE); "// &
117 : "(3) the basis set labeled in Kind section (HARRIS)", &
118 : usage="HARRIS_BASIS ORBITAL", &
119 9220 : type_of_var=char_t, default_c_val="ORBITAL", n_var=-1)
120 9220 : CALL section_add_keyword(section, keyword)
121 9220 : CALL keyword_release(keyword)
122 :
123 : CALL keyword_create(keyword, __LOCATION__, name="DEBUG_FORCES", &
124 : description="Additional output to debug energy correction forces.", &
125 9220 : usage="DEBUG_FORCES T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
126 9220 : CALL section_add_keyword(section, keyword)
127 9220 : CALL keyword_release(keyword)
128 : CALL keyword_create(keyword, __LOCATION__, name="DEBUG_STRESS", &
129 : description="Additional output to debug energy correction forces.", &
130 9220 : usage="DEBUG_STRESS T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
131 9220 : CALL section_add_keyword(section, keyword)
132 9220 : CALL keyword_release(keyword)
133 : CALL keyword_create(keyword, __LOCATION__, name="DEBUG_EXTERNAL_METHOD", &
134 : description="Uses an internal pseudo-energy to test EXTERNAL energy method.", &
135 9220 : usage="DEBUG_EXTERNAL_METHOD T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
136 9220 : CALL section_add_keyword(section, keyword)
137 9220 : CALL keyword_release(keyword)
138 :
139 : CALL keyword_create(keyword, __LOCATION__, name="SKIP_EC", &
140 : description="Skip EC calculation if ground-state calculation has not converged.", &
141 9220 : usage="SKIP_EC T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
142 9220 : CALL section_add_keyword(section, keyword)
143 9220 : CALL keyword_release(keyword)
144 :
145 : CALL keyword_create(keyword, __LOCATION__, name="MAO", &
146 : description="Use modified atomic orbitals (MAO) to solve Harris equation", &
147 9220 : usage="MAO T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
148 9220 : CALL section_add_keyword(section, keyword)
149 9220 : CALL keyword_release(keyword)
150 :
151 : CALL keyword_create(keyword, __LOCATION__, name="MAO_MAX_ITER", &
152 : description="Maximum iterations in MAO optimization. ", &
153 9220 : usage="MAO_MAX_ITER 100 ", default_i_val=0)
154 9220 : CALL section_add_keyword(section, keyword)
155 9220 : CALL keyword_release(keyword)
156 :
157 : CALL keyword_create(keyword, __LOCATION__, name="MAO_EPS_GRAD", &
158 : description="Threshold used for MAO iterations. ", &
159 9220 : usage="MAO_EPS_GRAD 1.0E-4 ", default_r_val=1.0E-5_dp)
160 9220 : CALL section_add_keyword(section, keyword)
161 9220 : CALL keyword_release(keyword)
162 :
163 : CALL keyword_create(keyword, __LOCATION__, name="MAO_EPS1", &
164 : description="Occupation threshold used to determine number of MAOs."// &
165 : " KIND section MAO keyword sets the minimum.", &
166 9220 : usage="MAO_EPS1 0.001 ", default_r_val=1000.0_dp)
167 9220 : CALL section_add_keyword(section, keyword)
168 9220 : CALL keyword_release(keyword)
169 :
170 : CALL keyword_create(keyword, __LOCATION__, name="MAO_IOLEVEL", &
171 : description="Verbosity of MAO output: (0) no output ... (3) fully verbose", &
172 9220 : usage="MAO_IOLEVEL 0 ", default_i_val=1)
173 9220 : CALL section_add_keyword(section, keyword)
174 9220 : CALL keyword_release(keyword)
175 :
176 : CALL keyword_create(keyword, __LOCATION__, name="ALGORITHM", &
177 : description="Algorithm used to solve KS equation", &
178 : usage="ALGORITHM DIAGONALIZATION", &
179 : default_i_val=ec_diagonalization, &
180 : enum_c_vals=s2a("DIAGONALIZATION", "MATRIX_SIGN", &
181 : "TRS4", "TC2", "OT_DIAG"), &
182 : enum_desc=s2a("Diagonalization of KS matrix.", &
183 : "Matrix Sign algorithm", &
184 : "Trace resetting trs4 algorithm", &
185 : "Trace resetting tc2 algorithm", &
186 : "OT diagonalization"), &
187 : enum_i_vals=(/ec_diagonalization, ec_matrix_sign, &
188 9220 : ec_matrix_trs4, ec_matrix_tc2, ec_ot_diag/))
189 9220 : CALL section_add_keyword(section, keyword)
190 9220 : CALL keyword_release(keyword)
191 :
192 : CALL keyword_create(keyword, __LOCATION__, name="FACTORIZATION", &
193 : description="Algorithm used to calculate factorization of overlap matrix", &
194 : usage="FACTORIZATION CHOLESKY", &
195 : default_i_val=kg_cholesky, &
196 : enum_c_vals=s2a("CHOLESKY"), &
197 : enum_desc=s2a("Cholesky factorization of overlap matrix"), &
198 9220 : enum_i_vals=(/kg_cholesky/))
199 9220 : CALL section_add_keyword(section, keyword)
200 9220 : CALL keyword_release(keyword)
201 :
202 : CALL keyword_create(keyword, __LOCATION__, name="EPS_DEFAULT", &
203 : description="Threshold used for accuracy estimates within energy correction. ", &
204 9220 : usage="EPS_DEFAULT 1.0E-7 ", default_r_val=1.0E-7_dp)
205 9220 : CALL section_add_keyword(section, keyword)
206 9220 : CALL keyword_release(keyword)
207 :
208 : ! Keywords for LS solver of Harris functional
209 : CALL keyword_create(keyword, __LOCATION__, name="EPS_FILTER", &
210 : description="Threshold used for filtering matrix operations.", &
211 9220 : usage="EPS_FILTER 1.0E-12", default_r_val=1.0E-12_dp)
212 9220 : CALL section_add_keyword(section, keyword)
213 9220 : CALL keyword_release(keyword)
214 :
215 : CALL keyword_create(keyword, __LOCATION__, name="EPS_LANCZOS", &
216 : description="Threshold used for lanczos estimates.", &
217 9220 : usage="EPS_LANCZOS 1.0E-4", default_r_val=1.0E-3_dp)
218 9220 : CALL section_add_keyword(section, keyword)
219 9220 : CALL keyword_release(keyword)
220 :
221 : CALL keyword_create(keyword, __LOCATION__, name="MAX_ITER_LANCZOS", &
222 : description="Maximum number of lanczos iterations.", &
223 9220 : usage="MAX_ITER_LANCZOS ", default_i_val=128)
224 9220 : CALL section_add_keyword(section, keyword)
225 9220 : CALL keyword_release(keyword)
226 :
227 : CALL keyword_create(keyword, __LOCATION__, name="MU", &
228 : description="Value (or initial guess) for the chemical potential,"// &
229 : " i.e. some suitable energy between HOMO and LUMO energy.", &
230 9220 : usage="MU 0.0", default_r_val=-0.1_dp)
231 9220 : CALL section_add_keyword(section, keyword)
232 9220 : CALL keyword_release(keyword)
233 :
234 : CALL keyword_create(keyword, __LOCATION__, name="FIXED_MU", &
235 : description="Should the calculation be performed at fixed chemical potential,"// &
236 : " or should it be found fixing the number of electrons", &
237 9220 : usage="FIXED_MU .TRUE.", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
238 9220 : CALL section_add_keyword(section, keyword)
239 9220 : CALL keyword_release(keyword)
240 :
241 : CALL keyword_create(keyword, __LOCATION__, name="S_PRECONDITIONER", &
242 : description="Preconditions S with some appropriate form.", &
243 : usage="S_PRECONDITIONER MOLECULAR", &
244 : default_i_val=ls_s_preconditioner_atomic, &
245 : enum_c_vals=s2a("NONE", "ATOMIC", "MOLECULAR"), &
246 : enum_desc=s2a("No preconditioner", &
247 : "Using atomic blocks", &
248 : "Using molecular sub-blocks. Recommended if molecules are defined and not too large."), &
249 9220 : enum_i_vals=(/ls_s_preconditioner_none, ls_s_preconditioner_atomic, ls_s_preconditioner_molecular/))
250 9220 : CALL section_add_keyword(section, keyword)
251 9220 : CALL keyword_release(keyword)
252 :
253 : CALL keyword_create(keyword, __LOCATION__, name="S_SQRT_METHOD", &
254 : description="Method for the caclulation of the sqrt of S.", &
255 : usage="S_SQRT_METHOD NEWTONSCHULZ", &
256 : default_i_val=ls_s_sqrt_ns, &
257 : enum_c_vals=s2a("NEWTONSCHULZ", "PROOT"), &
258 : enum_desc=s2a("Using a Newton-Schulz-like iteration", &
259 : "Using the p-th root method."), &
260 9220 : enum_i_vals=(/ls_s_sqrt_ns, ls_s_sqrt_proot/))
261 9220 : CALL section_add_keyword(section, keyword)
262 9220 : CALL keyword_release(keyword)
263 :
264 : CALL keyword_create(keyword, __LOCATION__, name="S_SQRT_ORDER", &
265 : variants=s2a("SIGN_SQRT_ORDER"), &
266 : description="Order of the iteration method for the calculation of the sqrt of S.", &
267 9220 : usage="S_SQRT_ORDER 3", default_i_val=3)
268 9220 : CALL section_add_keyword(section, keyword)
269 9220 : CALL keyword_release(keyword)
270 :
271 : CALL keyword_create(keyword, __LOCATION__, name="SIGN_METHOD", &
272 : description="Method used for the computation of the sign matrix.", &
273 : usage="SIGN_METHOD NEWTONSCHULZ", &
274 : default_i_val=ls_scf_sign_ns, &
275 : citations=(/VandeVondele2012, Niklasson2003/), &
276 : enum_c_vals=s2a("NEWTONSCHULZ", "PROOT"), &
277 : enum_desc=s2a("Newton-Schulz iteration.", &
278 : "p-th order root iteration"), &
279 27660 : enum_i_vals=(/ls_scf_sign_ns, ls_scf_sign_proot/))
280 9220 : CALL section_add_keyword(section, keyword)
281 9220 : CALL keyword_release(keyword)
282 :
283 : CALL keyword_create(keyword, __LOCATION__, name="SIGN_ORDER", &
284 : description="Order of the method used for the computation of the sign matrix.", &
285 : usage="SIGN_ORDER 2", &
286 9220 : default_i_val=2)
287 9220 : CALL section_add_keyword(section, keyword)
288 9220 : CALL keyword_release(keyword)
289 :
290 : CALL keyword_create(keyword, __LOCATION__, name="DYNAMIC_THRESHOLD", &
291 : description="Should the threshold for the purification be chosen dynamically", &
292 9220 : usage="DYNAMIC_THRESHOLD .TRUE.", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
293 9220 : CALL section_add_keyword(section, keyword)
294 9220 : CALL keyword_release(keyword)
295 :
296 : CALL keyword_create(keyword, __LOCATION__, name="NON_MONOTONIC", &
297 : description="Should the purification be performed non-monotonically. Relevant for TC2 only.", &
298 9220 : usage="NON_MONOTONIC .TRUE.", default_l_val=.TRUE., lone_keyword_l_val=.TRUE.)
299 9220 : CALL section_add_keyword(section, keyword)
300 9220 : CALL keyword_release(keyword)
301 :
302 : CALL keyword_create( &
303 : keyword, __LOCATION__, name="MATRIX_CLUSTER_TYPE", &
304 : description="Specify how atomic blocks should be clustered in the used matrices, in order to improve flop rate, "// &
305 : "and possibly speedup the matrix multiply. Note that the atomic s_preconditioner can not be used. "// &
306 : "Furthermore, since screening is on matrix blocks, "// &
307 : "slightly more accurate results can be expected with molecular.", &
308 : usage="MATRIX_CLUSTER_TYPE MOLECULAR", &
309 : default_i_val=ls_cluster_atomic, &
310 : enum_c_vals=s2a("ATOMIC", "MOLECULAR"), &
311 : enum_desc=s2a("Using atomic blocks", &
312 : "Using molecular blocks."), &
313 9220 : enum_i_vals=(/ls_cluster_atomic, ls_cluster_molecular/))
314 9220 : CALL section_add_keyword(section, keyword)
315 9220 : CALL keyword_release(keyword)
316 :
317 : CALL keyword_create(keyword, __LOCATION__, name="S_INVERSION", &
318 : description="Method used to compute the inverse of S.", &
319 : usage="S_PRECONDITIONER MOLECULAR", &
320 : default_i_val=ls_s_inversion_sign_sqrt, &
321 : enum_c_vals=s2a("SIGN_SQRT", "HOTELLING"), &
322 : enum_desc=s2a("Using the inverse sqrt as obtained from sign function iterations.", &
323 : "Using the Hotellign iteration."), &
324 9220 : enum_i_vals=(/ls_s_inversion_sign_sqrt, ls_s_inversion_hotelling/))
325 9220 : CALL section_add_keyword(section, keyword)
326 9220 : CALL keyword_release(keyword)
327 :
328 : CALL keyword_create(keyword, __LOCATION__, name="REPORT_ALL_SPARSITIES", &
329 : description="Run the sparsity report at the end of the SCF", &
330 9220 : usage="REPORT_ALL_SPARSITIES", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
331 9220 : CALL section_add_keyword(section, keyword)
332 9220 : CALL keyword_release(keyword)
333 :
334 : CALL keyword_create(keyword, __LOCATION__, name="CHECK_S_INV", &
335 : description="Perform an accuracy check on the inverse/sqrt of the s matrix.", &
336 9220 : usage="CHECK_S_INV", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
337 9220 : CALL section_add_keyword(section, keyword)
338 9220 : CALL keyword_release(keyword)
339 :
340 : CALL keyword_create(keyword, __LOCATION__, name="OT_INITIAL_GUESS", &
341 : description="Initial guess of density matrix used for OT Diagonalization", &
342 : usage="OT_INITIAL_GUESS ATOMIC", &
343 : default_i_val=ec_ot_atomic, &
344 : enum_c_vals=s2a("ATOMIC", "GROUND_STATE"), &
345 : enum_desc=s2a("Generate an atomic density using the atomic code", &
346 : "Using the ground-state density."), &
347 9220 : enum_i_vals=(/ec_ot_atomic, ec_ot_gs/))
348 9220 : CALL section_add_keyword(section, keyword)
349 9220 : CALL keyword_release(keyword)
350 :
351 : CALL keyword_create( &
352 : keyword, __LOCATION__, &
353 : name="ADMM", &
354 : description="Decide whether to perform ADMM in the exact exchange calc. for DC-DFT. "// &
355 : "The ADMM XC correction is governed by the AUXILIARY_DENSITY_MATRIX_METHOD section in &DFT. "// &
356 : "In most cases, the Hartree-Fock exchange is not too expensive and there is no need for ADMM, "// &
357 : "ADMM can however provide significant speedup and memory savings in case of diffuse basis sets. ", &
358 : usage="ADMM", &
359 : default_l_val=.FALSE., &
360 9220 : lone_keyword_l_val=.TRUE.)
361 9220 : CALL section_add_keyword(section, keyword)
362 9220 : CALL keyword_release(keyword)
363 :
364 : CALL keyword_create(keyword, __LOCATION__, name="EXTERNAL_RESPONSE_FILENAME", &
365 : description="Name of the file that contains response information.", &
366 : usage="EXTERNAL_RESPONSE_FILENAME <FILENAME>", &
367 9220 : default_c_val="TREXIO")
368 9220 : CALL section_add_keyword(section, keyword)
369 9220 : CALL keyword_release(keyword)
370 :
371 : CALL keyword_create(keyword, __LOCATION__, name="EXTERNAL_RESULT_FILENAME", &
372 : description="Name of the file that contains results from external response calculation.", &
373 : usage="EXTERNAL_RESULT_FILENAME <FILENAME>", &
374 9220 : default_c_val="CP2K_EXRESP.result")
375 9220 : CALL section_add_keyword(section, keyword)
376 9220 : CALL keyword_release(keyword)
377 :
378 : CALL keyword_create( &
379 : keyword, __LOCATION__, &
380 : name="ERROR_ESTIMATION", &
381 : description="Perform an error estimation for the response forces/stress. "// &
382 : "Requires error estimates for the RHS of the response equation from input. ", &
383 : usage="ERROR_ESTIMATION", &
384 : default_l_val=.FALSE., &
385 9220 : lone_keyword_l_val=.TRUE.)
386 9220 : CALL section_add_keyword(section, keyword)
387 9220 : CALL keyword_release(keyword)
388 :
389 9220 : END SUBROUTINE create_ec_section
390 :
391 : ! **************************************************************************************************
392 : !> \brief creates the linear scaling solver section
393 : !> \param section ...
394 : !> \author Joost VandeVondele [2010-10], JGH [2019-12]
395 : ! **************************************************************************************************
396 9220 : SUBROUTINE create_ec_solver_section(section)
397 : TYPE(section_type), POINTER :: section
398 :
399 : TYPE(keyword_type), POINTER :: keyword
400 :
401 9220 : CPASSERT(.NOT. ASSOCIATED(section))
402 : CALL section_create(section, __LOCATION__, name="RESPONSE_SOLVER", &
403 : description="Specifies the parameters of the linear scaling solver routines", &
404 : n_keywords=24, n_subsections=3, repeats=.FALSE., &
405 18440 : citations=(/VandeVondele2012/))
406 :
407 9220 : NULLIFY (keyword)
408 :
409 : CALL keyword_create(keyword, __LOCATION__, name="EPS", &
410 : description="Target accuracy for the convergence of the conjugate gradient.", &
411 9220 : usage="EPS 1.e-10", default_r_val=1.e-12_dp)
412 9220 : CALL section_add_keyword(section, keyword)
413 9220 : CALL keyword_release(keyword)
414 :
415 : CALL keyword_create(keyword, __LOCATION__, name="EPS_FILTER", &
416 : description="Threshold used for filtering matrix operations.", &
417 9220 : usage="EPS_FILTER 1.0E-10", default_r_val=1.0E-10_dp)
418 9220 : CALL section_add_keyword(section, keyword)
419 9220 : CALL keyword_release(keyword)
420 :
421 : CALL keyword_create(keyword, __LOCATION__, name="EPS_LANCZOS", &
422 : description="Threshold used for lanczos estimates.", &
423 9220 : usage="EPS_LANCZOS 1.0E-4", default_r_val=1.0E-3_dp)
424 9220 : CALL section_add_keyword(section, keyword)
425 9220 : CALL keyword_release(keyword)
426 :
427 : CALL keyword_create(keyword, __LOCATION__, name="MAX_ITER", &
428 : description="Maximum number of conjugate gradient iteration "// &
429 : "to be performed for one optimization.", &
430 9220 : usage="MAX_ITER 200", default_i_val=50)
431 9220 : CALL section_add_keyword(section, keyword)
432 9220 : CALL keyword_release(keyword)
433 :
434 : CALL keyword_create(keyword, __LOCATION__, name="MAX_ITER_LANCZOS", &
435 : description="Maximum number of lanczos iterations.", &
436 9220 : usage="MAX_ITER_LANCZOS 128", default_i_val=128)
437 9220 : CALL section_add_keyword(section, keyword)
438 9220 : CALL keyword_release(keyword)
439 :
440 : CALL keyword_create(keyword, __LOCATION__, name="METHOD", &
441 : description="Algorithm used to solve response equation. "// &
442 : "Both solver are conjugate gradient based, but use either a vector (MO-coefficient) "// &
443 : "or density matrix formalism in the orthonormal AO-basis to obtain response density", &
444 : usage="METHOD SOLVER", &
445 : default_i_val=ec_ls_solver, &
446 : enum_c_vals=s2a("MO_SOLVER", "AO_ORTHO"), &
447 : enum_desc=s2a("Solver based on MO (vector) formalism", &
448 : "Solver based on density matrix formalism"), &
449 9220 : enum_i_vals=(/ec_mo_solver, ec_ls_solver/))
450 9220 : CALL section_add_keyword(section, keyword)
451 9220 : CALL keyword_release(keyword)
452 :
453 : CALL keyword_create( &
454 : keyword, __LOCATION__, name="PRECONDITIONER", &
455 : description="Type of preconditioner to be used with MO conjugate gradient solver. "// &
456 : "They differ in effectiveness, cost of construction, cost of application. "// &
457 : "Properly preconditioned minimization can be orders of magnitude faster than doing nothing. "// &
458 : "Only multi-level conjugate gradient preconditioner (MULTI_LEVEL) available for AO response solver (AO_ORTHO). ", &
459 : usage="PRECONDITIONER FULL_ALL", &
460 : default_i_val=precond_mlp, &
461 : enum_c_vals=s2a("FULL_ALL", "FULL_SINGLE_INVERSE", "FULL_SINGLE", "FULL_KINETIC", "FULL_S_INVERSE", &
462 : "MULTI_LEVEL", "NONE"), &
463 : enum_desc=s2a("Most effective state selective preconditioner based on diagonalization, "// &
464 : "requires the ENERGY_GAP parameter to be an underestimate of the HOMO-LUMO gap. "// &
465 : "This preconditioner is recommended for almost all systems, except very large systems where "// &
466 : "make_preconditioner would dominate the total computational cost.", &
467 : "Based on H-eS cholesky inversion, similar to FULL_SINGLE in preconditioning efficiency "// &
468 : "but cheaper to construct, "// &
469 : "might be somewhat less robust. Recommended for large systems.", &
470 : "Based on H-eS diagonalisation, not as good as FULL_ALL, but somewhat cheaper to apply. ", &
471 : "Cholesky inversion of S and T, fast construction, robust, and relatively good, "// &
472 : "use for very large systems.", &
473 : "Cholesky inversion of S, not as good as FULL_KINETIC, yet equally expensive.", &
474 : "Based on same CG as AO-solver itself, but uses cheaper linear transformation", &
475 : "skip preconditioning"), &
476 : enum_i_vals=(/ot_precond_full_all, ot_precond_full_single_inverse, ot_precond_full_single, &
477 9220 : ot_precond_full_kinetic, ot_precond_s_inverse, precond_mlp, ot_precond_none/))
478 9220 : CALL section_add_keyword(section, keyword)
479 9220 : CALL keyword_release(keyword)
480 :
481 : CALL keyword_create(keyword, __LOCATION__, name="S_PRECONDITIONER", &
482 : description="Preconditions S with some appropriate form.", &
483 : usage="S_PRECONDITIONER MOLECULAR", &
484 : default_i_val=ls_s_preconditioner_atomic, &
485 : enum_c_vals=s2a("NONE", "ATOMIC", "MOLECULAR"), &
486 : enum_desc=s2a("No preconditioner", &
487 : "Using atomic blocks", &
488 : "Using molecular sub-blocks. Recommended if molecules are defined and not too large."), &
489 9220 : enum_i_vals=(/ls_s_preconditioner_none, ls_s_preconditioner_atomic, ls_s_preconditioner_molecular/))
490 9220 : CALL section_add_keyword(section, keyword)
491 9220 : CALL keyword_release(keyword)
492 :
493 : CALL keyword_create(keyword, __LOCATION__, name="S_SQRT_METHOD", &
494 : description="Method for the caclulation of the sqrt of S.", &
495 : usage="S_SQRT_METHOD NEWTONSCHULZ", &
496 : default_i_val=ls_s_sqrt_ns, &
497 : enum_c_vals=s2a("NEWTONSCHULZ", "PROOT"), &
498 : enum_desc=s2a("Using a Newton-Schulz-like iteration", &
499 : "Using the p-th root method."), &
500 9220 : enum_i_vals=(/ls_s_sqrt_ns, ls_s_sqrt_proot/))
501 9220 : CALL section_add_keyword(section, keyword)
502 9220 : CALL keyword_release(keyword)
503 :
504 : CALL keyword_create(keyword, __LOCATION__, name="S_SQRT_ORDER", &
505 : variants=s2a("SIGN_SQRT_ORDER"), &
506 : description="Order of the iteration method for the calculation of the sqrt of S.", &
507 9220 : usage="S_SQRT_ORDER 3", default_i_val=3)
508 9220 : CALL section_add_keyword(section, keyword)
509 9220 : CALL keyword_release(keyword)
510 :
511 : CALL keyword_create( &
512 : keyword, __LOCATION__, name="MATRIX_CLUSTER_TYPE", &
513 : description="Specify how atomic blocks should be clustered in the used matrices, in order to improve flop rate, "// &
514 : "and possibly speedup the matrix multiply. Note that the atomic s_preconditioner can not be used. "// &
515 : "Furthermore, since screening is on matrix blocks, "// &
516 : "slightly more accurate results can be expected with molecular.", &
517 : usage="MATRIX_CLUSTER_TYPE MOLECULAR", &
518 : default_i_val=ls_cluster_atomic, &
519 : enum_c_vals=s2a("ATOMIC", "MOLECULAR"), &
520 : enum_desc=s2a("Using atomic blocks", &
521 : "Using molecular blocks."), &
522 9220 : enum_i_vals=(/ls_cluster_atomic, ls_cluster_molecular/))
523 9220 : CALL section_add_keyword(section, keyword)
524 9220 : CALL keyword_release(keyword)
525 :
526 : CALL keyword_create(keyword, __LOCATION__, name="S_INVERSION", &
527 : description="Method used to compute the inverse of S.", &
528 : usage="S_PRECONDITIONER MOLECULAR", &
529 : default_i_val=ls_s_inversion_sign_sqrt, &
530 : enum_c_vals=s2a("SIGN_SQRT", "HOTELLING"), &
531 : enum_desc=s2a("Using the inverse sqrt as obtained from sign function iterations.", &
532 : "Using the Hotellign iteration."), &
533 9220 : enum_i_vals=(/ls_s_inversion_sign_sqrt, ls_s_inversion_hotelling/))
534 9220 : CALL section_add_keyword(section, keyword)
535 9220 : CALL keyword_release(keyword)
536 :
537 : CALL keyword_create(keyword, __LOCATION__, name="RESTART", &
538 : description="Restart the response calculation if the restart file exists", &
539 : usage="RESTART", &
540 9220 : default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
541 9220 : CALL section_add_keyword(section, keyword)
542 9220 : CALL keyword_release(keyword)
543 :
544 : CALL keyword_create(keyword, __LOCATION__, name="RESTART_EVERY", &
545 : description="Restart the conjugate gradient after the specified number of iterations.", &
546 9220 : usage="RESTART_EVERY 50", default_i_val=50)
547 9220 : CALL section_add_keyword(section, keyword)
548 9220 : CALL keyword_release(keyword)
549 :
550 9220 : END SUBROUTINE create_ec_solver_section
551 :
552 : ! **************************************************************************************************
553 : !> \brief Create the print dft section
554 : !> \param section the section to create
555 : !> \author fbelle - from create_print_dft_section
556 : ! **************************************************************************************************
557 9220 : SUBROUTINE create_ec_print_section(section)
558 : TYPE(section_type), POINTER :: section
559 :
560 : TYPE(keyword_type), POINTER :: keyword
561 : TYPE(section_type), POINTER :: print_key
562 :
563 9220 : CPASSERT(.NOT. ASSOCIATED(section))
564 : CALL section_create(section, __LOCATION__, name="PRINT", &
565 : description="Section of possible print options in EC code.", &
566 9220 : n_keywords=0, n_subsections=1, repeats=.FALSE.)
567 :
568 9220 : NULLIFY (print_key, keyword)
569 :
570 : ! Output of BQB volumetric files
571 : CALL cp_print_key_section_create(print_key, __LOCATION__, name="E_DENSITY_BQB", &
572 : description="Controls the output of the electron density to the losslessly"// &
573 : " compressed BQB file format, see [Brehm2018]"// &
574 : " (via LibBQB see <https://brehm-research.de/bqb>)."// &
575 : " Currently does not work with changing cell vector (NpT ensemble).", &
576 : print_level=debug_print_level + 1, filename="", &
577 18440 : citations=(/Brehm2018/))
578 :
579 : CALL keyword_create(keyword, __LOCATION__, name="SKIP_FIRST", &
580 : description="Skips the first step of a MD run (avoids duplicate step if restarted).", &
581 9220 : usage="SKIP_FIRST T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
582 9220 : CALL section_add_keyword(print_key, keyword)
583 9220 : CALL keyword_release(keyword)
584 :
585 : CALL keyword_create(keyword, __LOCATION__, name="STORE_STEP_NUMBER", &
586 : description="Stores the step number and simulation time in the comment line of each BQB"// &
587 : " frame. Switch it off for binary compatibility with original CP2k CUBE files.", &
588 9220 : usage="STORE_STEP_NUMBER F", default_l_val=.TRUE., lone_keyword_l_val=.TRUE.)
589 9220 : CALL section_add_keyword(print_key, keyword)
590 9220 : CALL keyword_release(keyword)
591 :
592 : CALL keyword_create(keyword, __LOCATION__, name="CHECK", &
593 : description="Performs an on-the-fly decompression of each compressed BQB frame to check"// &
594 : " whether the volumetric data exactly matches, and aborts the run if not so.", &
595 9220 : usage="CHECK T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
596 9220 : CALL section_add_keyword(print_key, keyword)
597 9220 : CALL keyword_release(keyword)
598 :
599 : CALL keyword_create(keyword, __LOCATION__, name="OVERWRITE", &
600 : description="Specify this keyword to overwrite the output BQB file if"// &
601 : " it already exists. By default, the data is appended to an existing file.", &
602 9220 : usage="OVERWRITE T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
603 9220 : CALL section_add_keyword(print_key, keyword)
604 9220 : CALL keyword_release(keyword)
605 :
606 : CALL keyword_create(keyword, __LOCATION__, name="HISTORY", &
607 : description="Controls how many previous steps are taken into account for extrapolation in"// &
608 : " compression. Use a value of 1 to compress the frames independently.", &
609 9220 : usage="HISTORY 10", n_var=1, default_i_val=10, type_of_var=integer_t)
610 9220 : CALL section_add_keyword(print_key, keyword)
611 9220 : CALL keyword_release(keyword)
612 :
613 : CALL keyword_create(keyword, __LOCATION__, name="PARAMETER_KEY", &
614 : description="Allows to supply previously optimized compression parameters via a"// &
615 : " parameter key (alphanumeric character sequence starting with 'at')."// &
616 : " Just leave away the 'at' sign here, because CP2k will otherwise"// &
617 : " assume it is a variable name in the input", &
618 9220 : usage="PARAMETER_KEY <KEY>", n_var=1, default_c_val="", type_of_var=char_t)
619 9220 : CALL section_add_keyword(print_key, keyword)
620 9220 : CALL keyword_release(keyword)
621 :
622 : CALL keyword_create(keyword, __LOCATION__, name="OPTIMIZE", &
623 : description="Controls the time spent to optimize the parameters for compression efficiency.", &
624 : usage="OPTIMIZE {OFF,QUICK,NORMAL,PATIENT,EXHAUSTIVE}", repeats=.FALSE., n_var=1, &
625 : default_i_val=bqb_opt_quick, &
626 : enum_c_vals=s2a("OFF", "QUICK", "NORMAL", "PATIENT", "EXHAUSTIVE"), &
627 : enum_desc=s2a("No optimization (use defaults)", "Quick optimization", &
628 : "Standard optimization", "Precise optimization", "Exhaustive optimization"), &
629 9220 : enum_i_vals=(/bqb_opt_off, bqb_opt_quick, bqb_opt_normal, bqb_opt_patient, bqb_opt_exhaustive/))
630 9220 : CALL section_add_keyword(print_key, keyword)
631 9220 : CALL keyword_release(keyword)
632 :
633 9220 : CALL section_add_subsection(section, print_key)
634 9220 : CALL section_release(print_key)
635 :
636 : ! Voronoi Integration via LibVori
637 9220 : NULLIFY (print_key)
638 9220 : CALL create_print_voronoi_section(print_key)
639 9220 : CALL section_add_subsection(section, print_key)
640 9220 : CALL section_release(print_key)
641 :
642 : !Printing of Moments
643 9220 : CALL create_dipoles_section(print_key, "MOMENTS", high_print_level)
644 : CALL keyword_create( &
645 : keyword, __LOCATION__, &
646 : name="MAX_MOMENT", &
647 : description="Maximum moment to be calculated. Values higher than 1 not implemented under periodic boundaries.", &
648 : usage="MAX_MOMENT {integer}", &
649 : repeats=.FALSE., &
650 : n_var=1, &
651 : type_of_var=integer_t, &
652 9220 : default_i_val=1)
653 9220 : CALL section_add_keyword(print_key, keyword)
654 9220 : CALL keyword_release(keyword)
655 : CALL keyword_create(keyword, __LOCATION__, &
656 : name="MAGNETIC", &
657 : description="Calculate also magnetic moments, only implemented without periodic boundaries", &
658 : usage="MAGNETIC yes", &
659 : repeats=.FALSE., &
660 : n_var=1, &
661 : default_l_val=.FALSE., &
662 9220 : lone_keyword_l_val=.TRUE.)
663 9220 : CALL section_add_keyword(print_key, keyword)
664 9220 : CALL keyword_release(keyword)
665 9220 : CALL section_add_subsection(section, print_key)
666 9220 : CALL section_release(print_key)
667 :
668 9220 : END SUBROUTINE create_ec_print_section
669 :
670 : END MODULE input_cp2k_ec
|