Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief 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 9366 : 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 9366 : CPASSERT(.NOT. ASSOCIATED(section))
69 :
70 9366 : NULLIFY (keyword)
71 : CALL section_create(section, __LOCATION__, name="ENERGY_CORRECTION", &
72 : description="Sets the various options for the Energy Correction", &
73 9366 : 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 9366 : lone_keyword_l_val=.TRUE.)
80 9366 : CALL section_add_keyword(section, keyword)
81 9366 : CALL keyword_release(keyword)
82 :
83 : ! add a special XC section
84 9366 : NULLIFY (subsection)
85 9366 : CALL create_xc_section(subsection)
86 9366 : CALL section_add_subsection(section, subsection)
87 9366 : CALL section_release(subsection)
88 :
89 : ! add a section for solver keywords
90 9366 : NULLIFY (subsection)
91 9366 : CALL create_ec_solver_section(subsection)
92 9366 : CALL section_add_subsection(section, subsection)
93 9366 : CALL section_release(subsection)
94 :
95 : ! add a print section for properties
96 9366 : NULLIFY (subsection)
97 9366 : CALL create_ec_print_section(subsection)
98 9366 : CALL section_add_subsection(section, subsection)
99 9366 : 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 9366 : enum_i_vals=[ec_functional_harris, ec_functional_dc, ec_functional_ext])
110 9366 : CALL section_add_keyword(section, keyword)
111 9366 : 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 9366 : type_of_var=char_t, default_c_val="ORBITAL", n_var=-1)
120 9366 : CALL section_add_keyword(section, keyword)
121 9366 : CALL keyword_release(keyword)
122 :
123 : CALL keyword_create(keyword, __LOCATION__, name="DEBUG_FORCES", &
124 : description="Additional output to debug energy correction forces.", &
125 9366 : usage="DEBUG_FORCES T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
126 9366 : CALL section_add_keyword(section, keyword)
127 9366 : CALL keyword_release(keyword)
128 : CALL keyword_create(keyword, __LOCATION__, name="DEBUG_STRESS", &
129 : description="Additional output to debug energy correction forces.", &
130 9366 : usage="DEBUG_STRESS T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
131 9366 : CALL section_add_keyword(section, keyword)
132 9366 : 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 9366 : usage="DEBUG_EXTERNAL_METHOD T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
136 9366 : CALL section_add_keyword(section, keyword)
137 9366 : 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 9366 : usage="SKIP_EC T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
142 9366 : CALL section_add_keyword(section, keyword)
143 9366 : 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 9366 : usage="MAO T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
148 9366 : CALL section_add_keyword(section, keyword)
149 9366 : CALL keyword_release(keyword)
150 :
151 : CALL keyword_create(keyword, __LOCATION__, name="MAO_MAX_ITER", &
152 : description="Maximum iterations in MAO optimization. ", &
153 9366 : usage="MAO_MAX_ITER 100 ", default_i_val=0)
154 9366 : CALL section_add_keyword(section, keyword)
155 9366 : CALL keyword_release(keyword)
156 :
157 : CALL keyword_create(keyword, __LOCATION__, name="MAO_EPS_GRAD", &
158 : description="Threshold used for MAO iterations. ", &
159 9366 : usage="MAO_EPS_GRAD 1.0E-4 ", default_r_val=1.0E-5_dp)
160 9366 : CALL section_add_keyword(section, keyword)
161 9366 : 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 9366 : usage="MAO_EPS1 0.001 ", default_r_val=1000.0_dp)
167 9366 : CALL section_add_keyword(section, keyword)
168 9366 : 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 9366 : usage="MAO_IOLEVEL 0 ", default_i_val=1)
173 9366 : CALL section_add_keyword(section, keyword)
174 9366 : 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 9366 : ec_matrix_trs4, ec_matrix_tc2, ec_ot_diag])
189 9366 : CALL section_add_keyword(section, keyword)
190 9366 : 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 9366 : enum_i_vals=[kg_cholesky])
199 9366 : CALL section_add_keyword(section, keyword)
200 9366 : 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 9366 : usage="EPS_DEFAULT 1.0E-7 ", default_r_val=1.0E-7_dp)
205 9366 : CALL section_add_keyword(section, keyword)
206 9366 : 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 9366 : usage="EPS_FILTER 1.0E-12", default_r_val=1.0E-12_dp)
212 9366 : CALL section_add_keyword(section, keyword)
213 9366 : CALL keyword_release(keyword)
214 :
215 : CALL keyword_create(keyword, __LOCATION__, name="EPS_LANCZOS", &
216 : description="Threshold used for lanczos estimates.", &
217 9366 : usage="EPS_LANCZOS 1.0E-4", default_r_val=1.0E-3_dp)
218 9366 : CALL section_add_keyword(section, keyword)
219 9366 : CALL keyword_release(keyword)
220 :
221 : CALL keyword_create(keyword, __LOCATION__, name="MAX_ITER_LANCZOS", &
222 : description="Maximum number of lanczos iterations.", &
223 9366 : usage="MAX_ITER_LANCZOS ", default_i_val=128)
224 9366 : CALL section_add_keyword(section, keyword)
225 9366 : 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 9366 : usage="MU 0.0", default_r_val=-0.1_dp)
231 9366 : CALL section_add_keyword(section, keyword)
232 9366 : 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 9366 : usage="FIXED_MU .TRUE.", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
238 9366 : CALL section_add_keyword(section, keyword)
239 9366 : 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 9366 : enum_i_vals=[ls_s_preconditioner_none, ls_s_preconditioner_atomic, ls_s_preconditioner_molecular])
250 9366 : CALL section_add_keyword(section, keyword)
251 9366 : 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 9366 : enum_i_vals=[ls_s_sqrt_ns, ls_s_sqrt_proot])
261 9366 : CALL section_add_keyword(section, keyword)
262 9366 : 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 9366 : usage="S_SQRT_ORDER 3", default_i_val=3)
268 9366 : CALL section_add_keyword(section, keyword)
269 9366 : 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 28098 : enum_i_vals=[ls_scf_sign_ns, ls_scf_sign_proot])
280 9366 : CALL section_add_keyword(section, keyword)
281 9366 : 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 9366 : default_i_val=2)
287 9366 : CALL section_add_keyword(section, keyword)
288 9366 : 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 9366 : usage="DYNAMIC_THRESHOLD .TRUE.", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
293 9366 : CALL section_add_keyword(section, keyword)
294 9366 : 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 9366 : usage="NON_MONOTONIC .TRUE.", default_l_val=.TRUE., lone_keyword_l_val=.TRUE.)
299 9366 : CALL section_add_keyword(section, keyword)
300 9366 : 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 9366 : enum_i_vals=[ls_cluster_atomic, ls_cluster_molecular])
314 9366 : CALL section_add_keyword(section, keyword)
315 9366 : 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_INVERSION 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 9366 : enum_i_vals=[ls_s_inversion_sign_sqrt, ls_s_inversion_hotelling])
325 9366 : CALL section_add_keyword(section, keyword)
326 9366 : 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 9366 : usage="REPORT_ALL_SPARSITIES", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
331 9366 : CALL section_add_keyword(section, keyword)
332 9366 : 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 9366 : usage="CHECK_S_INV", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
337 9366 : CALL section_add_keyword(section, keyword)
338 9366 : 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 9366 : enum_i_vals=[ec_ot_atomic, ec_ot_gs])
348 9366 : CALL section_add_keyword(section, keyword)
349 9366 : 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 9366 : lone_keyword_l_val=.TRUE.)
361 9366 : CALL section_add_keyword(section, keyword)
362 9366 : 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 9366 : default_c_val="TREXIO")
368 9366 : CALL section_add_keyword(section, keyword)
369 9366 : CALL keyword_release(keyword)
370 :
371 : CALL keyword_create(keyword, __LOCATION__, name="EXTERNAL_RESPONSE_ERROR_FILENAME", &
372 : description="Name of the file that contains response error information.", &
373 : usage="EXTERNAL_RESPONSE_ERROR_FILENAME <FILENAME>", &
374 9366 : default_c_val="TREXIO")
375 9366 : CALL section_add_keyword(section, keyword)
376 9366 : CALL keyword_release(keyword)
377 :
378 : CALL keyword_create(keyword, __LOCATION__, name="EXTERNAL_RESULT_FILENAME", &
379 : description="Name of the file that contains results from external response calculation.", &
380 : usage="EXTERNAL_RESULT_FILENAME <FILENAME>", &
381 9366 : default_c_val="CP2K_EXRESP.result")
382 9366 : CALL section_add_keyword(section, keyword)
383 9366 : CALL keyword_release(keyword)
384 :
385 : CALL keyword_create( &
386 : keyword, __LOCATION__, &
387 : name="ERROR_ESTIMATION", &
388 : description="Perform an error estimation for the response forces/stress. "// &
389 : "Requires error estimates for the RHS of the response equation from input. ", &
390 : usage="ERROR_ESTIMATION", &
391 : default_l_val=.FALSE., &
392 9366 : lone_keyword_l_val=.TRUE.)
393 9366 : CALL section_add_keyword(section, keyword)
394 9366 : CALL keyword_release(keyword)
395 :
396 : CALL keyword_create(keyword, __LOCATION__, name="ERROR_ESTIMATION_METHOD", &
397 : description="Method used for error estimation: F(ull); D(ifferenc); E(xtrapolate).", &
398 : usage="ERROR_ESTIMATION_METHOD E", &
399 9366 : default_c_val="E")
400 9366 : CALL section_add_keyword(section, keyword)
401 9366 : CALL keyword_release(keyword)
402 :
403 : CALL keyword_create(keyword, __LOCATION__, name="ERROR_CUTOFF", &
404 : description="Cutoff value for error estimation.", &
405 : usage="ERROR_CUTOFF 1.E-6", &
406 9366 : default_r_val=1.E-5_dp)
407 9366 : CALL section_add_keyword(section, keyword)
408 9366 : CALL keyword_release(keyword)
409 :
410 : CALL keyword_create(keyword, __LOCATION__, name="ERROR_SUBSPACE_SIZE", &
411 : description="MAX. size of subspace for response vector extrapolation.", &
412 : usage="ERROR_SUBSPACE_SIZE 100", &
413 9366 : default_i_val=250)
414 9366 : CALL section_add_keyword(section, keyword)
415 9366 : CALL keyword_release(keyword)
416 :
417 9366 : END SUBROUTINE create_ec_section
418 :
419 : ! **************************************************************************************************
420 : !> \brief creates the linear scaling solver section
421 : !> \param section ...
422 : !> \author Joost VandeVondele [2010-10], JGH [2019-12]
423 : ! **************************************************************************************************
424 9366 : SUBROUTINE create_ec_solver_section(section)
425 : TYPE(section_type), POINTER :: section
426 :
427 : TYPE(keyword_type), POINTER :: keyword
428 :
429 9366 : CPASSERT(.NOT. ASSOCIATED(section))
430 : CALL section_create(section, __LOCATION__, name="RESPONSE_SOLVER", &
431 : description="Specifies the parameters of the linear scaling solver routines", &
432 : n_keywords=24, n_subsections=3, repeats=.FALSE., &
433 18732 : citations=[VandeVondele2012])
434 :
435 9366 : NULLIFY (keyword)
436 :
437 : CALL keyword_create(keyword, __LOCATION__, name="EPS", &
438 : description="Target accuracy for the convergence of the conjugate gradient.", &
439 9366 : usage="EPS 1.e-10", default_r_val=1.e-12_dp)
440 9366 : CALL section_add_keyword(section, keyword)
441 9366 : CALL keyword_release(keyword)
442 :
443 : CALL keyword_create(keyword, __LOCATION__, name="EPS_FILTER", &
444 : description="Threshold used for filtering matrix operations.", &
445 9366 : usage="EPS_FILTER 1.0E-10", default_r_val=1.0E-10_dp)
446 9366 : CALL section_add_keyword(section, keyword)
447 9366 : CALL keyword_release(keyword)
448 :
449 : CALL keyword_create(keyword, __LOCATION__, name="EPS_LANCZOS", &
450 : description="Threshold used for lanczos estimates.", &
451 9366 : usage="EPS_LANCZOS 1.0E-4", default_r_val=1.0E-3_dp)
452 9366 : CALL section_add_keyword(section, keyword)
453 9366 : CALL keyword_release(keyword)
454 :
455 : CALL keyword_create(keyword, __LOCATION__, name="MAX_ITER", &
456 : description="Maximum number of conjugate gradient iteration "// &
457 : "to be performed for one optimization.", &
458 9366 : usage="MAX_ITER 200", default_i_val=50)
459 9366 : CALL section_add_keyword(section, keyword)
460 9366 : CALL keyword_release(keyword)
461 :
462 : CALL keyword_create(keyword, __LOCATION__, name="MAX_ITER_LANCZOS", &
463 : description="Maximum number of lanczos iterations.", &
464 9366 : usage="MAX_ITER_LANCZOS 128", default_i_val=128)
465 9366 : CALL section_add_keyword(section, keyword)
466 9366 : CALL keyword_release(keyword)
467 :
468 : CALL keyword_create(keyword, __LOCATION__, name="METHOD", &
469 : description="Algorithm used to solve response equation. "// &
470 : "Both solver are conjugate gradient based, but use either a vector (MO-coefficient) "// &
471 : "or density matrix formalism in the orthonormal AO-basis to obtain response density", &
472 : usage="METHOD SOLVER", &
473 : default_i_val=ec_ls_solver, &
474 : enum_c_vals=s2a("MO_SOLVER", "AO_ORTHO"), &
475 : enum_desc=s2a("Solver based on MO (vector) formalism", &
476 : "Solver based on density matrix formalism"), &
477 9366 : enum_i_vals=[ec_mo_solver, ec_ls_solver])
478 9366 : CALL section_add_keyword(section, keyword)
479 9366 : CALL keyword_release(keyword)
480 :
481 : CALL keyword_create( &
482 : keyword, __LOCATION__, name="PRECONDITIONER", &
483 : description="Type of preconditioner to be used with MO conjugate gradient solver. "// &
484 : "They differ in effectiveness, cost of construction, cost of application. "// &
485 : "Properly preconditioned minimization can be orders of magnitude faster than doing nothing. "// &
486 : "Only multi-level conjugate gradient preconditioner (MULTI_LEVEL) available for AO response solver (AO_ORTHO). ", &
487 : usage="PRECONDITIONER FULL_ALL", &
488 : default_i_val=precond_mlp, &
489 : enum_c_vals=s2a("FULL_ALL", "FULL_SINGLE_INVERSE", "FULL_SINGLE", "FULL_KINETIC", "FULL_S_INVERSE", &
490 : "MULTI_LEVEL", "NONE"), &
491 : enum_desc=s2a("Most effective state selective preconditioner based on diagonalization, "// &
492 : "requires the ENERGY_GAP parameter to be an underestimate of the HOMO-LUMO gap. "// &
493 : "This preconditioner is recommended for almost all systems, except very large systems where "// &
494 : "make_preconditioner would dominate the total computational cost.", &
495 : "Based on H-eS cholesky inversion, similar to FULL_SINGLE in preconditioning efficiency "// &
496 : "but cheaper to construct, "// &
497 : "might be somewhat less robust. Recommended for large systems.", &
498 : "Based on H-eS diagonalisation, not as good as FULL_ALL, but somewhat cheaper to apply. ", &
499 : "Cholesky inversion of S and T, fast construction, robust, and relatively good, "// &
500 : "use for very large systems.", &
501 : "Cholesky inversion of S, not as good as FULL_KINETIC, yet equally expensive.", &
502 : "Based on same CG as AO-solver itself, but uses cheaper linear transformation", &
503 : "skip preconditioning"), &
504 : enum_i_vals=[ot_precond_full_all, ot_precond_full_single_inverse, ot_precond_full_single, &
505 9366 : ot_precond_full_kinetic, ot_precond_s_inverse, precond_mlp, ot_precond_none])
506 9366 : CALL section_add_keyword(section, keyword)
507 9366 : CALL keyword_release(keyword)
508 :
509 : CALL keyword_create(keyword, __LOCATION__, name="S_PRECONDITIONER", &
510 : description="Preconditions S with some appropriate form.", &
511 : usage="S_PRECONDITIONER MOLECULAR", &
512 : default_i_val=ls_s_preconditioner_atomic, &
513 : enum_c_vals=s2a("NONE", "ATOMIC", "MOLECULAR"), &
514 : enum_desc=s2a("No preconditioner", &
515 : "Using atomic blocks", &
516 : "Using molecular sub-blocks. Recommended if molecules are defined and not too large."), &
517 9366 : enum_i_vals=[ls_s_preconditioner_none, ls_s_preconditioner_atomic, ls_s_preconditioner_molecular])
518 9366 : CALL section_add_keyword(section, keyword)
519 9366 : CALL keyword_release(keyword)
520 :
521 : CALL keyword_create(keyword, __LOCATION__, name="S_SQRT_METHOD", &
522 : description="Method for the caclulation of the sqrt of S.", &
523 : usage="S_SQRT_METHOD NEWTONSCHULZ", &
524 : default_i_val=ls_s_sqrt_ns, &
525 : enum_c_vals=s2a("NEWTONSCHULZ", "PROOT"), &
526 : enum_desc=s2a("Using a Newton-Schulz-like iteration", &
527 : "Using the p-th root method."), &
528 9366 : enum_i_vals=[ls_s_sqrt_ns, ls_s_sqrt_proot])
529 9366 : CALL section_add_keyword(section, keyword)
530 9366 : CALL keyword_release(keyword)
531 :
532 : CALL keyword_create(keyword, __LOCATION__, name="S_SQRT_ORDER", &
533 : variants=s2a("SIGN_SQRT_ORDER"), &
534 : description="Order of the iteration method for the calculation of the sqrt of S.", &
535 9366 : usage="S_SQRT_ORDER 3", default_i_val=3)
536 9366 : CALL section_add_keyword(section, keyword)
537 9366 : CALL keyword_release(keyword)
538 :
539 : CALL keyword_create( &
540 : keyword, __LOCATION__, name="MATRIX_CLUSTER_TYPE", &
541 : description="Specify how atomic blocks should be clustered in the used matrices, in order to improve flop rate, "// &
542 : "and possibly speedup the matrix multiply. Note that the atomic s_preconditioner can not be used. "// &
543 : "Furthermore, since screening is on matrix blocks, "// &
544 : "slightly more accurate results can be expected with molecular.", &
545 : usage="MATRIX_CLUSTER_TYPE MOLECULAR", &
546 : default_i_val=ls_cluster_atomic, &
547 : enum_c_vals=s2a("ATOMIC", "MOLECULAR"), &
548 : enum_desc=s2a("Using atomic blocks", &
549 : "Using molecular blocks."), &
550 9366 : enum_i_vals=[ls_cluster_atomic, ls_cluster_molecular])
551 9366 : CALL section_add_keyword(section, keyword)
552 9366 : CALL keyword_release(keyword)
553 :
554 : CALL keyword_create(keyword, __LOCATION__, name="S_INVERSION", &
555 : description="Method used to compute the inverse of S.", &
556 : usage="S_INVERSION MOLECULAR", &
557 : default_i_val=ls_s_inversion_sign_sqrt, &
558 : enum_c_vals=s2a("SIGN_SQRT", "HOTELLING"), &
559 : enum_desc=s2a("Using the inverse sqrt as obtained from sign function iterations.", &
560 : "Using the Hotellign iteration."), &
561 9366 : enum_i_vals=[ls_s_inversion_sign_sqrt, ls_s_inversion_hotelling])
562 9366 : CALL section_add_keyword(section, keyword)
563 9366 : CALL keyword_release(keyword)
564 :
565 : CALL keyword_create(keyword, __LOCATION__, name="RESTART", &
566 : description="Restart the response calculation if the restart file exists", &
567 : usage="RESTART", &
568 9366 : default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
569 9366 : CALL section_add_keyword(section, keyword)
570 9366 : CALL keyword_release(keyword)
571 :
572 : CALL keyword_create(keyword, __LOCATION__, name="RESTART_EVERY", &
573 : description="Restart the conjugate gradient after the specified number of iterations.", &
574 9366 : usage="RESTART_EVERY 50", default_i_val=50)
575 9366 : CALL section_add_keyword(section, keyword)
576 9366 : CALL keyword_release(keyword)
577 :
578 9366 : END SUBROUTINE create_ec_solver_section
579 :
580 : ! **************************************************************************************************
581 : !> \brief Create the print dft section
582 : !> \param section the section to create
583 : !> \author fbelle - from create_print_dft_section
584 : ! **************************************************************************************************
585 9366 : SUBROUTINE create_ec_print_section(section)
586 : TYPE(section_type), POINTER :: section
587 :
588 : TYPE(keyword_type), POINTER :: keyword
589 : TYPE(section_type), POINTER :: print_key
590 :
591 9366 : CPASSERT(.NOT. ASSOCIATED(section))
592 : CALL section_create(section, __LOCATION__, name="PRINT", &
593 : description="Section of possible print options in EC code.", &
594 9366 : n_keywords=0, n_subsections=1, repeats=.FALSE.)
595 :
596 9366 : NULLIFY (print_key, keyword)
597 :
598 : ! Output of BQB volumetric files
599 : CALL cp_print_key_section_create(print_key, __LOCATION__, name="E_DENSITY_BQB", &
600 : description="Controls the output of the electron density to the losslessly"// &
601 : " compressed BQB file format, see [Brehm2018]"// &
602 : " (via LibBQB see <https://brehm-research.de/bqb>)."// &
603 : " Currently does not work with changing cell vector (NpT ensemble).", &
604 : print_level=debug_print_level + 1, filename="", &
605 18732 : citations=[Brehm2018])
606 :
607 : CALL keyword_create(keyword, __LOCATION__, name="SKIP_FIRST", &
608 : description="Skips the first step of a MD run (avoids duplicate step if restarted).", &
609 9366 : usage="SKIP_FIRST T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
610 9366 : CALL section_add_keyword(print_key, keyword)
611 9366 : CALL keyword_release(keyword)
612 :
613 : CALL keyword_create(keyword, __LOCATION__, name="STORE_STEP_NUMBER", &
614 : description="Stores the step number and simulation time in the comment line of each BQB"// &
615 : " frame. Switch it off for binary compatibility with original CP2k CUBE files.", &
616 9366 : usage="STORE_STEP_NUMBER F", default_l_val=.TRUE., lone_keyword_l_val=.TRUE.)
617 9366 : CALL section_add_keyword(print_key, keyword)
618 9366 : CALL keyword_release(keyword)
619 :
620 : CALL keyword_create(keyword, __LOCATION__, name="CHECK", &
621 : description="Performs an on-the-fly decompression of each compressed BQB frame to check"// &
622 : " whether the volumetric data exactly matches, and aborts the run if not so.", &
623 9366 : usage="CHECK T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
624 9366 : CALL section_add_keyword(print_key, keyword)
625 9366 : CALL keyword_release(keyword)
626 :
627 : CALL keyword_create(keyword, __LOCATION__, name="OVERWRITE", &
628 : description="Specify this keyword to overwrite the output BQB file if"// &
629 : " it already exists. By default, the data is appended to an existing file.", &
630 9366 : usage="OVERWRITE T", default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
631 9366 : CALL section_add_keyword(print_key, keyword)
632 9366 : CALL keyword_release(keyword)
633 :
634 : CALL keyword_create(keyword, __LOCATION__, name="HISTORY", &
635 : description="Controls how many previous steps are taken into account for extrapolation in"// &
636 : " compression. Use a value of 1 to compress the frames independently.", &
637 9366 : usage="HISTORY 10", n_var=1, default_i_val=10, type_of_var=integer_t)
638 9366 : CALL section_add_keyword(print_key, keyword)
639 9366 : CALL keyword_release(keyword)
640 :
641 : CALL keyword_create(keyword, __LOCATION__, name="PARAMETER_KEY", &
642 : description="Allows to supply previously optimized compression parameters via a"// &
643 : " parameter key (alphanumeric character sequence starting with 'at')."// &
644 : " Just leave away the 'at' sign here, because CP2k will otherwise"// &
645 : " assume it is a variable name in the input", &
646 9366 : usage="PARAMETER_KEY <KEY>", n_var=1, default_c_val="", type_of_var=char_t)
647 9366 : CALL section_add_keyword(print_key, keyword)
648 9366 : CALL keyword_release(keyword)
649 :
650 : CALL keyword_create(keyword, __LOCATION__, name="OPTIMIZE", &
651 : description="Controls the time spent to optimize the parameters for compression efficiency.", &
652 : usage="OPTIMIZE {OFF,QUICK,NORMAL,PATIENT,EXHAUSTIVE}", repeats=.FALSE., n_var=1, &
653 : default_i_val=bqb_opt_quick, &
654 : enum_c_vals=s2a("OFF", "QUICK", "NORMAL", "PATIENT", "EXHAUSTIVE"), &
655 : enum_desc=s2a("No optimization (use defaults)", "Quick optimization", &
656 : "Standard optimization", "Precise optimization", "Exhaustive optimization"), &
657 9366 : enum_i_vals=[bqb_opt_off, bqb_opt_quick, bqb_opt_normal, bqb_opt_patient, bqb_opt_exhaustive])
658 9366 : CALL section_add_keyword(print_key, keyword)
659 9366 : CALL keyword_release(keyword)
660 :
661 9366 : CALL section_add_subsection(section, print_key)
662 9366 : CALL section_release(print_key)
663 :
664 : ! Voronoi Integration via LibVori
665 9366 : NULLIFY (print_key)
666 9366 : CALL create_print_voronoi_section(print_key)
667 9366 : CALL section_add_subsection(section, print_key)
668 9366 : CALL section_release(print_key)
669 :
670 : !Printing of Moments
671 9366 : CALL create_dipoles_section(print_key, "MOMENTS", high_print_level)
672 : CALL keyword_create( &
673 : keyword, __LOCATION__, &
674 : name="MAX_MOMENT", &
675 : description="Maximum moment to be calculated. Values higher than 1 not implemented under periodic boundaries.", &
676 : usage="MAX_MOMENT {integer}", &
677 : repeats=.FALSE., &
678 : n_var=1, &
679 : type_of_var=integer_t, &
680 9366 : default_i_val=1)
681 9366 : CALL section_add_keyword(print_key, keyword)
682 9366 : CALL keyword_release(keyword)
683 : CALL keyword_create(keyword, __LOCATION__, &
684 : name="MAGNETIC", &
685 : description="Calculate also magnetic moments, only implemented without periodic boundaries", &
686 : usage="MAGNETIC yes", &
687 : repeats=.FALSE., &
688 : n_var=1, &
689 : default_l_val=.FALSE., &
690 9366 : lone_keyword_l_val=.TRUE.)
691 9366 : CALL section_add_keyword(print_key, keyword)
692 9366 : CALL keyword_release(keyword)
693 9366 : CALL section_add_subsection(section, print_key)
694 9366 : CALL section_release(print_key)
695 :
696 9366 : END SUBROUTINE create_ec_print_section
697 :
698 : END MODULE input_cp2k_ec
|