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 : MODULE pao_input
9 : USE bibliography, ONLY: Berghold2011,&
10 : Schuett2018,&
11 : Zhu2016
12 : USE cp_log_handling, ONLY: cp_get_default_logger,&
13 : cp_logger_type
14 : USE cp_output_handling, ONLY: add_last_numeric,&
15 : cp_print_key_section_create,&
16 : cp_print_key_unit_nr,&
17 : high_print_level,&
18 : low_print_level
19 : USE input_keyword_types, ONLY: keyword_create,&
20 : keyword_release,&
21 : keyword_type
22 : USE input_section_types, ONLY: section_add_keyword,&
23 : section_add_subsection,&
24 : section_create,&
25 : section_release,&
26 : section_type,&
27 : section_vals_get_subs_vals,&
28 : section_vals_type,&
29 : section_vals_val_get
30 : USE input_val_types, ONLY: lchar_t,&
31 : real_t
32 : USE kinds, ONLY: dp
33 : USE linesearch, ONLY: linesearch_create_section
34 : USE pao_types, ONLY: pao_env_type
35 : USE string_utilities, ONLY: s2a
36 : #include "./base/base_uses.f90"
37 :
38 : IMPLICIT NONE
39 : PRIVATE
40 :
41 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pao_input'
42 :
43 : PUBLIC :: create_pao_section, parse_pao_section, id2str
44 :
45 : INTEGER, PARAMETER, PUBLIC :: pao_rotinv_param = 101, &
46 : pao_fock_param = 102, &
47 : pao_exp_param = 103, &
48 : pao_gth_param = 104, &
49 : pao_equi_param = 105, &
50 : pao_opt_cg = 301, &
51 : pao_opt_bfgs = 302, &
52 : pao_ml_gp = 401, &
53 : pao_ml_nn = 402, &
54 : pao_ml_lazy = 403, &
55 : pao_ml_prior_zero = 501, &
56 : pao_ml_prior_mean = 502, &
57 : pao_ml_desc_pot = 601, &
58 : pao_ml_desc_overlap = 602, &
59 : pao_ml_desc_r12 = 603
60 :
61 : CONTAINS
62 :
63 : ! **************************************************************************************************
64 : !> \brief Declare the PAO input section
65 : !> \param pao ...
66 : !> \param input ...
67 : ! **************************************************************************************************
68 98 : SUBROUTINE parse_pao_section(pao, input)
69 : TYPE(pao_env_type), POINTER :: pao
70 : TYPE(section_vals_type), POINTER :: input
71 :
72 : INTEGER :: i, n_rep, ntrainfiles
73 : TYPE(cp_logger_type), POINTER :: logger
74 : TYPE(section_vals_type), POINTER :: pao_section, training_set_section
75 :
76 98 : pao_section => section_vals_get_subs_vals(input, "DFT%LS_SCF%PAO")
77 :
78 : ! open main logger
79 98 : logger => cp_get_default_logger()
80 98 : pao%iw = cp_print_key_unit_nr(logger, pao_section, "PRINT%RUN_INFO", extension=".paolog")
81 98 : pao%iw_atoms = cp_print_key_unit_nr(logger, pao_section, "PRINT%ATOM_INFO", extension=".paolog")
82 98 : pao%iw_gap = cp_print_key_unit_nr(logger, pao_section, "PRINT%FOCK_GAP", extension=".paolog")
83 98 : pao%iw_fockev = cp_print_key_unit_nr(logger, pao_section, "PRINT%FOCK_EIGENVALUES", extension=".paolog")
84 98 : pao%iw_opt = cp_print_key_unit_nr(logger, pao_section, "PRINT%OPT_INFO", extension=".paolog")
85 98 : pao%iw_mlvar = cp_print_key_unit_nr(logger, pao_section, "PRINT%ML_VARIANCE", extension=".paolog")
86 98 : pao%iw_mldata = cp_print_key_unit_nr(logger, pao_section, "PRINT%ML_TRAINING_DATA", extension=".paolog")
87 :
88 98 : IF (pao%iw > 0) WRITE (pao%iw, *) "" ! an empty separator line
89 :
90 : ! parse input and print
91 :
92 98 : CALL section_vals_val_get(pao_section, "EPS_PAO", r_val=pao%eps_pao)
93 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "EPS_PAO", pao%eps_pao
94 :
95 98 : CALL section_vals_val_get(pao_section, "MIXING", r_val=pao%mixing)
96 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "MIXING", pao%mixing
97 :
98 98 : CALL section_vals_val_get(pao_section, "MAX_PAO", i_val=pao%max_pao)
99 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,I11)") " PAO|", "MAX_PAO", pao%max_pao
100 :
101 98 : CALL section_vals_val_get(pao_section, "MAX_CYCLES", i_val=pao%max_cycles)
102 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,I11)") " PAO|", "MAX_CYCLES", pao%max_cycles
103 :
104 98 : CALL section_vals_val_get(pao_section, "IGNORE_CONVERGENCE_FAILURE", l_val=pao%ignore_convergence_failure)
105 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,L11)") " PAO|", "IGNORE_CONVERGENCE_FAILURE", pao%ignore_convergence_failure
106 :
107 98 : CALL section_vals_val_get(pao_section, "PARAMETERIZATION", i_val=pao%parameterization)
108 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A11)") " PAO|", "PARAMETERIZATION", id2str(pao%parameterization)
109 :
110 98 : CALL section_vals_val_get(pao_section, "PRECONDITION", l_val=pao%precondition)
111 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,L11)") " PAO|", "PRECONDITION", pao%precondition
112 :
113 98 : CALL section_vals_val_get(pao_section, "REGULARIZATION", r_val=pao%regularization)
114 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "REGULARIZATION", pao%regularization
115 98 : IF (pao%regularization < 0.0_dp) CPABORT("PAO: REGULARIZATION < 0")
116 :
117 98 : CALL section_vals_val_get(input, "DFT%QS%EPS_DEFAULT", r_val=pao%eps_pgf) ! default value
118 98 : CALL section_vals_val_get(pao_section, "EPS_PGF", n_rep_val=n_rep)
119 98 : IF (n_rep /= 0) CALL section_vals_val_get(pao_section, "EPS_PGF", r_val=pao%eps_pgf)
120 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "EPS_PGF", pao%eps_pgf
121 98 : IF (pao%eps_pgf < 0.0_dp) CPABORT("PAO: EPS_PGF < 0")
122 :
123 98 : CALL section_vals_val_get(pao_section, "PENALTY_DISTANCE", r_val=pao%penalty_dist)
124 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "PENALTY_DISTANCE", pao%penalty_dist
125 98 : IF (pao%penalty_dist < 0.0_dp) CPABORT("PAO: PENALTY_DISTANCE < 0")
126 :
127 98 : CALL section_vals_val_get(pao_section, "PENALTY_STRENGTH", r_val=pao%penalty_strength)
128 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "PENALTY_STRENGTH", pao%penalty_strength
129 98 : IF (pao%penalty_strength < 0.0_dp) CPABORT("PAO: PENALTY_STRENGTH < 0")
130 :
131 98 : CALL section_vals_val_get(pao_section, "LINPOT_PRECONDITION_DELTA", r_val=pao%linpot_precon_delta)
132 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "LINPOT_PRECONDITION_DELTA", pao%linpot_precon_delta
133 98 : IF (pao%linpot_precon_delta < 0.0_dp) CPABORT("PAO: LINPOT_PRECONDITION_DELTA < 0")
134 :
135 98 : CALL section_vals_val_get(pao_section, "LINPOT_INITGUESS_DELTA", r_val=pao%linpot_init_delta)
136 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "LINPOT_INITGUESS_DELT", pao%linpot_init_delta
137 98 : IF (pao%linpot_init_delta < 0.0_dp) CPABORT("PAO: LINPOT_INITGUESS_DELTA < 0")
138 :
139 98 : CALL section_vals_val_get(pao_section, "LINPOT_REGULARIZATION_DELTA", r_val=pao%linpot_regu_delta)
140 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "LINPOT_REGULARIZATION_DELTA", pao%linpot_regu_delta
141 98 : IF (pao%linpot_regu_delta < 0.0_dp) CPABORT("PAO: LINPOT_REGULARIZATION_DELTA < 0")
142 :
143 98 : CALL section_vals_val_get(pao_section, "LINPOT_REGULARIZATION_STRENGTH", r_val=pao%linpot_regu_strength)
144 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "LINPOT_REGULARIZATION_STRENGTH", pao%linpot_regu_strength
145 98 : IF (pao%linpot_regu_strength < 0.0_dp) CPABORT("PAO: LINPOT_REGULARIZATION_STRENGTH < 0")
146 :
147 98 : CALL section_vals_val_get(pao_section, "OPTIMIZER", i_val=pao%optimizer)
148 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A11)") " PAO|", "OPTIMIZER", id2str(pao%optimizer)
149 :
150 98 : CALL section_vals_val_get(pao_section, "CG_INIT_STEPS", i_val=pao%cg_init_steps)
151 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,I11)") " PAO|", "CG_INIT_STEPS", pao%cg_init_steps
152 98 : IF (pao%cg_init_steps < 1) CPABORT("PAO: CG_INIT_STEPS < 1")
153 :
154 98 : CALL section_vals_val_get(pao_section, "CG_RESET_LIMIT", r_val=pao%cg_reset_limit)
155 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "CG_RESET_LIMIT", pao%cg_reset_limit
156 98 : IF (pao%cg_reset_limit < 0.0_dp) CPABORT("PAO: CG_RESET_LIMIT < 0")
157 :
158 98 : CALL section_vals_val_get(pao_section, "CHECK_UNITARY_TOL", r_val=pao%check_unitary_tol)
159 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "CHECK_UNITARY_TOL", pao%check_unitary_tol
160 :
161 98 : CALL section_vals_val_get(pao_section, "CHECK_GRADIENT_TOL", r_val=pao%check_grad_tol)
162 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "CHECK_GRADIENT_TOL", pao%check_grad_tol
163 :
164 98 : CALL section_vals_val_get(pao_section, "NUM_GRADIENT_ORDER", i_val=pao%num_grad_order)
165 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,I11)") " PAO|", "NUM_GRADIENT_ORDER", pao%num_grad_order
166 :
167 98 : CALL section_vals_val_get(pao_section, "NUM_GRADIENT_EPS", r_val=pao%num_grad_eps)
168 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "NUM_GRADIENT_EPS", pao%num_grad_eps
169 98 : IF (pao%num_grad_eps < 0.0_dp) CPABORT("PAO: NUM_GRADIENT_EPS < 0")
170 :
171 98 : CALL section_vals_val_get(pao_section, "PRINT%RESTART%WRITE_CYCLES", i_val=pao%write_cycles)
172 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,I11)") " PAO|", "PRINT%RESTART%WRITE_CYCLES", pao%write_cycles
173 :
174 98 : CALL section_vals_val_get(pao_section, "RESTART_FILE", c_val=pao%restart_file)
175 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,A)") " PAO|", "RESTART_FILE ", TRIM(pao%restart_file)
176 :
177 98 : CALL section_vals_val_get(pao_section, "PREOPT_DM_FILE", c_val=pao%preopt_dm_file)
178 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,A)") " PAO|", "PREOPT_DM_FILE ", TRIM(pao%preopt_dm_file)
179 :
180 98 : CALL section_vals_val_get(pao_section, "MACHINE_LEARNING%METHOD", i_val=pao%ml_method)
181 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A11)") " PAO|", "MACHINE_LEARNING%METHOD", id2str(pao%ml_method)
182 :
183 98 : CALL section_vals_val_get(pao_section, "MACHINE_LEARNING%PRIOR", i_val=pao%ml_prior)
184 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A11)") " PAO|", "MACHINE_LEARNING%PRIOR", id2str(pao%ml_prior)
185 :
186 98 : CALL section_vals_val_get(pao_section, "MACHINE_LEARNING%DESCRIPTOR", i_val=pao%ml_descriptor)
187 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A11)") " PAO|", "MACHINE_LEARNING%DESCRIPTOR", id2str(pao%ml_descriptor)
188 :
189 98 : CALL section_vals_val_get(pao_section, "MACHINE_LEARNING%TOLERANCE", r_val=pao%ml_tolerance)
190 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "MACHINE_LEARNING%TOLERANCE", pao%ml_tolerance
191 :
192 98 : CALL section_vals_val_get(pao_section, "MACHINE_LEARNING%GP_NOISE_VAR", r_val=pao%gp_noise_var)
193 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "MACHINE_LEARNING%GP_NOISE_VAR", pao%gp_noise_var
194 :
195 98 : CALL section_vals_val_get(pao_section, "MACHINE_LEARNING%GP_SCALE", r_val=pao%gp_scale)
196 98 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,E11.1)") " PAO|", "MACHINE_LEARNING%GP_SCALE", pao%gp_scale
197 :
198 : ! parse MACHINE_LEARNING%TRAINING_SET section
199 98 : training_set_section => section_vals_get_subs_vals(pao_section, "MACHINE_LEARNING%TRAINING_SET")
200 98 : CALL section_vals_val_get(training_set_section, "_DEFAULT_KEYWORD_", n_rep_val=ntrainfiles)
201 248 : ALLOCATE (pao%ml_training_set(ntrainfiles))
202 132 : DO i = 1, ntrainfiles
203 : CALL section_vals_val_get(training_set_section, "_DEFAULT_KEYWORD_", &
204 34 : i_rep_val=i, c_val=pao%ml_training_set(i)%fn)
205 51 : IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A)") " PAO|", "MACHINE_LEARNING%TRAINING_SET", &
206 132 : TRIM(pao%ml_training_set(i)%fn)
207 : END DO
208 :
209 98 : IF (pao%iw > 0) WRITE (pao%iw, *) "" ! an empty separator line
210 :
211 196 : END SUBROUTINE parse_pao_section
212 :
213 : ! **************************************************************************************************
214 : !> \brief Helper routine
215 : !> \param id ...
216 : !> \return ...
217 : ! **************************************************************************************************
218 318 : FUNCTION id2str(id) RESULT(s)
219 : INTEGER :: id
220 : CHARACTER(LEN=20) :: s
221 :
222 323 : SELECT CASE (id)
223 : CASE (pao_gth_param)
224 5 : s = "GTH"
225 : CASE (pao_rotinv_param)
226 79 : s = "ROTINV"
227 : CASE (pao_fock_param)
228 8 : s = "FOCK"
229 : CASE (pao_exp_param)
230 18 : s = "EXP"
231 : CASE (pao_equi_param)
232 12 : s = "EQUIVARIANT"
233 : CASE (pao_opt_cg)
234 47 : s = "CG"
235 : CASE (pao_opt_bfgs)
236 2 : s = "BFGS"
237 : CASE (pao_ml_gp)
238 45 : s = "GAUSSIAN_PROCESS"
239 : CASE (pao_ml_nn)
240 2 : s = "NEURAL_NETWORK"
241 : CASE (pao_ml_lazy)
242 2 : s = "LAZY"
243 : CASE (pao_ml_prior_zero)
244 46 : s = "ZERO"
245 : CASE (pao_ml_prior_mean)
246 3 : s = "MEAN"
247 : CASE (pao_ml_desc_pot)
248 43 : s = "POTENTIAL"
249 : CASE (pao_ml_desc_overlap)
250 2 : s = "OVERLAP"
251 : CASE (pao_ml_desc_r12)
252 4 : s = "R12"
253 : CASE DEFAULT
254 318 : CPABORT("PAO: unknown id")
255 : END SELECT
256 318 : s = ADJUSTR(s)
257 318 : END FUNCTION id2str
258 :
259 : ! **************************************************************************************************
260 : !> \brief Creates the PAO subsection of the linear scaling section.
261 : !> \param section ...
262 : !> \author Ole Schuett
263 : ! **************************************************************************************************
264 9530 : SUBROUTINE create_pao_section(section)
265 : TYPE(section_type), POINTER :: section
266 :
267 : TYPE(keyword_type), POINTER :: keyword
268 : TYPE(section_type), POINTER :: printkey, subsection, subsubsection
269 :
270 9530 : NULLIFY (keyword, subsection, subsubsection, printkey)
271 :
272 9530 : CPASSERT(.NOT. ASSOCIATED(section))
273 : CALL section_create(section, __LOCATION__, name="PAO", repeats=.FALSE., &
274 : description="Polarized Atomic Orbital Method", &
275 28590 : citations=[Schuett2018, Berghold2011])
276 :
277 : ! Convergence Criteria *****************************************************
278 : CALL keyword_create(keyword, __LOCATION__, name="EPS_PAO", &
279 : description="Convergence criteria for PAO optimization.", &
280 9530 : default_r_val=1.e-5_dp)
281 9530 : CALL section_add_keyword(section, keyword)
282 9530 : CALL keyword_release(keyword)
283 :
284 : CALL keyword_create(keyword, __LOCATION__, name="MIXING", &
285 : description="Mixing fraction of new and old optimizied solutions.", &
286 9530 : default_r_val=0.5_dp)
287 9530 : CALL section_add_keyword(section, keyword)
288 9530 : CALL keyword_release(keyword)
289 :
290 : CALL keyword_create(keyword, __LOCATION__, name="MAX_PAO", &
291 : description="Maximum number of PAO basis optimization steps.", &
292 9530 : default_i_val=1000)
293 9530 : CALL section_add_keyword(section, keyword)
294 9530 : CALL keyword_release(keyword)
295 :
296 : CALL keyword_create(keyword, __LOCATION__, name="MAX_CYCLES", &
297 : description="Maximum number of PAO line search cycles for a given hamiltonian.", &
298 9530 : default_i_val=75)
299 9530 : CALL section_add_keyword(section, keyword)
300 9530 : CALL keyword_release(keyword)
301 :
302 : CALL keyword_create(keyword, __LOCATION__, name="IGNORE_CONVERGENCE_FAILURE", &
303 : description="If true, only a warning is issued if a PAO "// &
304 : "optimization has not converged. By default, a run is aborted "// &
305 : "if the required convergence criteria have not been achieved.", &
306 : usage="IGNORE_CONVERGENCE_FAILURE logical_value", &
307 9530 : default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
308 9530 : CALL section_add_keyword(section, keyword)
309 9530 : CALL keyword_release(keyword)
310 :
311 : ! Parametrization **********************************************************
312 : CALL keyword_create(keyword, __LOCATION__, name="PARAMETERIZATION", &
313 : description="Parametrization of the mapping between the primary and the PAO basis.", &
314 : enum_c_vals=s2a("ROTINV", "FOCK", "GTH", "EXP", "EQUIVARIANT"), &
315 : enum_i_vals=[pao_rotinv_param, pao_fock_param, pao_gth_param, pao_exp_param, pao_equi_param], &
316 : enum_desc=s2a("Rotational invariant parametrization (machine learnable)", &
317 : "Fock matrix parametrization", &
318 : "Parametrization based on GTH pseudo potentials", &
319 : "Original matrix exponential parametrization", &
320 : "Equivariant parametrization"), &
321 9530 : default_i_val=pao_rotinv_param)
322 9530 : CALL section_add_keyword(section, keyword)
323 9530 : CALL keyword_release(keyword)
324 :
325 : CALL keyword_create(keyword, __LOCATION__, name="REGULARIZATION", &
326 : description="Strength of regularization term which ensures parameters remain small.", &
327 9530 : default_r_val=0.0_dp)
328 9530 : CALL section_add_keyword(section, keyword)
329 9530 : CALL keyword_release(keyword)
330 :
331 : CALL keyword_create(keyword, __LOCATION__, name="PENALTY_DISTANCE", &
332 : description="Distance at which approaching eigenvalues are penalized to prevent degeneration.", &
333 9530 : default_r_val=0.1_dp)
334 9530 : CALL section_add_keyword(section, keyword)
335 9530 : CALL keyword_release(keyword)
336 :
337 : CALL keyword_create(keyword, __LOCATION__, name="PENALTY_STRENGTH", &
338 : description="Strength of the penalty term which prevents degenerate eigenvalues.", &
339 9530 : default_r_val=0.005_dp)
340 9530 : CALL section_add_keyword(section, keyword)
341 9530 : CALL keyword_release(keyword)
342 :
343 : CALL keyword_create(keyword, __LOCATION__, name="PRECONDITION", &
344 : description="Apply a preconditioner to the parametrization.", &
345 9530 : default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
346 9530 : CALL section_add_keyword(section, keyword)
347 9530 : CALL keyword_release(keyword)
348 :
349 : CALL keyword_create(keyword, __LOCATION__, name="EPS_PGF", &
350 : description="Sets precision for potential and descriptor matrix elements. "// &
351 9530 : "Overrides DFT/QS/EPS_DEFAULT value.", type_of_var=real_t)
352 9530 : CALL section_add_keyword(section, keyword)
353 9530 : CALL keyword_release(keyword)
354 :
355 : ! Preopt ******************************************************************
356 : CALL keyword_create(keyword, __LOCATION__, name="PREOPT_DM_FILE", &
357 : description="Read pre-optimized density matrix from given file.", &
358 9530 : repeats=.FALSE., default_c_val="")
359 9530 : CALL section_add_keyword(section, keyword)
360 9530 : CALL keyword_release(keyword)
361 :
362 : ! Misc ********************************************************************
363 : CALL keyword_create(keyword, __LOCATION__, name="RESTART_FILE", &
364 : description="Reads given files as restart for PAO basis", &
365 9530 : repeats=.FALSE., default_c_val="")
366 9530 : CALL section_add_keyword(section, keyword)
367 9530 : CALL keyword_release(keyword)
368 :
369 : CALL keyword_create(keyword, __LOCATION__, name="CHECK_GRADIENT_TOL", &
370 : description="Tolerance for check of full analytic gradient against the numeric one."// &
371 : " Negative values mean don't check at all.", &
372 9530 : default_r_val=-1.0_dp)
373 9530 : CALL section_add_keyword(section, keyword)
374 9530 : CALL keyword_release(keyword)
375 :
376 : CALL keyword_create(keyword, __LOCATION__, name="NUM_GRADIENT_EPS", &
377 : description="Step length used for the numeric derivative when checking the gradient.", &
378 9530 : default_r_val=1e-8_dp)
379 9530 : CALL section_add_keyword(section, keyword)
380 9530 : CALL keyword_release(keyword)
381 :
382 : CALL keyword_create(keyword, __LOCATION__, name="NUM_GRADIENT_ORDER", &
383 : description="Order of the numeric derivative when checking the gradient. "// &
384 : "Possible values are 2, 4, and 6.", &
385 9530 : default_i_val=2)
386 9530 : CALL section_add_keyword(section, keyword)
387 9530 : CALL keyword_release(keyword)
388 :
389 : CALL keyword_create(keyword, __LOCATION__, name="CHECK_UNITARY_TOL", &
390 : description="Check if rotation matrix is unitary."// &
391 : " Negative values mean don't check at all.", &
392 9530 : default_r_val=-1.0_dp)
393 9530 : CALL section_add_keyword(section, keyword)
394 9530 : CALL keyword_release(keyword)
395 :
396 : ! Linpot settings *********************************************************
397 : CALL keyword_create(keyword, __LOCATION__, name="LINPOT_PRECONDITION_DELTA", &
398 : description="Eigenvalue threshold used for preconditioning.", &
399 9530 : default_r_val=0.0_dp)
400 9530 : CALL section_add_keyword(section, keyword)
401 9530 : CALL keyword_release(keyword)
402 :
403 : CALL keyword_create(keyword, __LOCATION__, name="LINPOT_INITGUESS_DELTA", &
404 : description="Eigenvalue threshold used for calculating initial guess.", &
405 9530 : default_r_val=0.0_dp)
406 9530 : CALL section_add_keyword(section, keyword)
407 9530 : CALL keyword_release(keyword)
408 :
409 : CALL keyword_create(keyword, __LOCATION__, name="LINPOT_REGULARIZATION_DELTA", &
410 : description="Eigenvalue threshold used for regularization.", &
411 9530 : default_r_val=0.0_dp)
412 9530 : CALL section_add_keyword(section, keyword)
413 9530 : CALL keyword_release(keyword)
414 :
415 : CALL keyword_create(keyword, __LOCATION__, name="LINPOT_REGULARIZATION_STRENGTH", &
416 : description="Strength of regularization on linpot layer.", &
417 9530 : default_r_val=0.0_dp)
418 9530 : CALL section_add_keyword(section, keyword)
419 9530 : CALL keyword_release(keyword)
420 :
421 : ! Machine Learning *********************************************************
422 9530 : CALL section_create(subsection, __LOCATION__, name="MACHINE_LEARNING", description="Machine learning section")
423 :
424 : CALL keyword_create(keyword, __LOCATION__, name="METHOD", &
425 : description="Machine learning scheme used to predict PAO basis sets.", &
426 : enum_c_vals=s2a("GAUSSIAN_PROCESS", "NEURAL_NETWORK", "LAZY"), &
427 : enum_i_vals=[pao_ml_gp, pao_ml_nn, pao_ml_lazy], &
428 : enum_desc=s2a("Gaussian Process", "Neural Network", "Just rely on prior"), &
429 9530 : default_i_val=pao_ml_gp)
430 9530 : CALL section_add_keyword(subsection, keyword)
431 9530 : CALL keyword_release(keyword)
432 :
433 : CALL keyword_create(keyword, __LOCATION__, name="PRIOR", &
434 : description="Prior used for predictions.", &
435 : enum_c_vals=s2a("ZERO", "MEAN"), &
436 : enum_i_vals=[pao_ml_prior_zero, pao_ml_prior_mean], &
437 : enum_desc=s2a("Simply use zero", "Use average of training-set"), &
438 9530 : default_i_val=pao_ml_prior_zero)
439 9530 : CALL section_add_keyword(subsection, keyword)
440 9530 : CALL keyword_release(keyword)
441 :
442 : CALL keyword_create(keyword, __LOCATION__, name="DESCRIPTOR", &
443 : description="Descriptor used as input for machine learning.", &
444 : enum_c_vals=s2a("POTENTIAL", "OVERLAP", "R12"), &
445 : enum_i_vals=[pao_ml_desc_pot, pao_ml_desc_overlap, pao_ml_desc_r12], &
446 : enum_desc=s2a("Eigenvalues of local potential matrix", &
447 : "Eigenvalues of local overlap matrix", &
448 : "Distance between two atoms (just for testing)"), &
449 : citations=[Zhu2016], &
450 19060 : default_i_val=pao_ml_desc_pot)
451 9530 : CALL section_add_keyword(subsection, keyword)
452 9530 : CALL keyword_release(keyword)
453 :
454 : CALL keyword_create(keyword, __LOCATION__, name="TOLERANCE", &
455 : description="Maximum variance tolerated when making predictions.", &
456 9530 : default_r_val=1.0E-2_dp)
457 9530 : CALL section_add_keyword(subsection, keyword)
458 9530 : CALL keyword_release(keyword)
459 :
460 : CALL keyword_create(keyword, __LOCATION__, name="GP_NOISE_VAR", &
461 : description="Variance of noise used for Gaussian Process machine learning.", &
462 9530 : default_r_val=0.1_dp)
463 9530 : CALL section_add_keyword(subsection, keyword)
464 9530 : CALL keyword_release(keyword)
465 :
466 : CALL keyword_create(keyword, __LOCATION__, name="GP_SCALE", &
467 : description="Length scale used for Gaussian Process machine learning.", &
468 9530 : default_r_val=0.05_dp)
469 9530 : CALL section_add_keyword(subsection, keyword)
470 9530 : CALL keyword_release(keyword)
471 :
472 : ! special free-text section similar to SUBSYS%COORD
473 : CALL section_create(subsubsection, __LOCATION__, name="TRAINING_SET", &
474 9530 : description="Lists PAO-restart file used for training")
475 : CALL keyword_create(keyword, __LOCATION__, name="_DEFAULT_KEYWORD_", &
476 : description="One file name per line.", &
477 9530 : repeats=.TRUE., type_of_var=lchar_t)
478 9530 : CALL section_add_keyword(subsubsection, keyword)
479 9530 : CALL keyword_release(keyword)
480 9530 : CALL section_add_subsection(subsection, subsubsection)
481 9530 : CALL section_release(subsubsection)
482 :
483 9530 : CALL section_add_subsection(section, subsection)
484 9530 : CALL section_release(subsection)
485 :
486 : ! Output *******************************************************************
487 : CALL section_create(subsection, __LOCATION__, name="PRINT", &
488 : description="Printkey section", &
489 9530 : n_keywords=0, n_subsections=1, repeats=.TRUE.)
490 :
491 : CALL cp_print_key_section_create(printkey, __LOCATION__, "RUN_INFO", &
492 : description="Normal output by PAO", &
493 9530 : print_level=low_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
494 9530 : CALL section_add_subsection(subsection, printkey)
495 9530 : CALL section_release(printkey)
496 :
497 : CALL cp_print_key_section_create(printkey, __LOCATION__, "ATOM_INFO", &
498 : description="One line summary for each atom", &
499 9530 : print_level=high_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
500 9530 : CALL section_add_subsection(subsection, printkey)
501 9530 : CALL section_release(printkey)
502 :
503 : CALL cp_print_key_section_create(printkey, __LOCATION__, "FOCK_GAP", &
504 : description="Gap of the fock matrix for each atom", &
505 9530 : print_level=high_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
506 9530 : CALL section_add_subsection(subsection, printkey)
507 9530 : CALL section_release(printkey)
508 :
509 : CALL cp_print_key_section_create(printkey, __LOCATION__, "FOCK_EIGENVALUES", &
510 : description="Eigenvalues of the fock matrix for each atom", &
511 9530 : print_level=high_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
512 9530 : CALL section_add_subsection(subsection, printkey)
513 9530 : CALL section_release(printkey)
514 :
515 : CALL cp_print_key_section_create(printkey, __LOCATION__, "ML_VARIANCE", &
516 : description="Variances of machine learning predictions for each atom", &
517 9530 : print_level=high_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
518 9530 : CALL section_add_subsection(subsection, printkey)
519 9530 : CALL section_release(printkey)
520 :
521 : CALL cp_print_key_section_create(printkey, __LOCATION__, "ML_TRAINING_DATA", &
522 : description="Dumps training data used for machine learning", &
523 9530 : print_level=high_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
524 9530 : CALL section_add_subsection(subsection, printkey)
525 9530 : CALL section_release(printkey)
526 :
527 : CALL cp_print_key_section_create(printkey, __LOCATION__, "OPT_INFO", &
528 : description="Output by the optimizer", &
529 9530 : print_level=low_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
530 9530 : CALL section_add_subsection(subsection, printkey)
531 9530 : CALL section_release(printkey)
532 :
533 : CALL cp_print_key_section_create(printkey, __LOCATION__, "RESTART", &
534 : description="Restart file of PAO basis", &
535 9530 : print_level=high_print_level, add_last=add_last_numeric, filename="")
536 :
537 : CALL keyword_create(keyword, __LOCATION__, name="BACKUP_COPIES", &
538 : description="Specifies the maximum number of backup copies.", &
539 : usage="BACKUP_COPIES {int}", &
540 9530 : default_i_val=1)
541 9530 : CALL section_add_keyword(printkey, keyword)
542 9530 : CALL keyword_release(keyword)
543 :
544 : CALL keyword_create(keyword, __LOCATION__, name="WRITE_CYCLES", &
545 : description="Maximum number of PAO line search cycles until a restart is written.", &
546 9530 : default_i_val=100)
547 9530 : CALL section_add_keyword(printkey, keyword)
548 9530 : CALL keyword_release(keyword)
549 :
550 9530 : CALL section_add_subsection(subsection, printkey)
551 9530 : CALL section_release(printkey)
552 :
553 9530 : CALL section_add_subsection(section, subsection)
554 9530 : CALL section_release(subsection)
555 :
556 : ! OPT stuff ****************************************************************
557 : CALL keyword_create(keyword, __LOCATION__, name="OPTIMIZER", &
558 : description="Optimizer used to find PAO basis.", &
559 : enum_c_vals=s2a("CG", "BFGS"), &
560 : enum_i_vals=[pao_opt_cg, pao_opt_bfgs], &
561 : enum_desc=s2a("Conjugate gradient algorithm", &
562 : "Broyden-Fletcher-Goldfarb-Shanno algorithm"), &
563 9530 : default_i_val=pao_opt_cg)
564 9530 : CALL section_add_keyword(section, keyword)
565 9530 : CALL keyword_release(keyword)
566 :
567 : CALL keyword_create(keyword, __LOCATION__, name="CG_INIT_STEPS", &
568 : description="Number of steepest descent steps before starting the"// &
569 : " conjugate gradients optimization.", &
570 9530 : default_i_val=2)
571 9530 : CALL section_add_keyword(section, keyword)
572 9530 : CALL keyword_release(keyword)
573 :
574 : CALL keyword_create(keyword, __LOCATION__, name="CG_RESET_LIMIT", &
575 : description="The CG is reseted if the cosine of the angle between the last "// &
576 : "search direction and the new gradient is larger that the limit.", &
577 9530 : default_r_val=0.1_dp)
578 9530 : CALL section_add_keyword(section, keyword)
579 9530 : CALL keyword_release(keyword)
580 :
581 9530 : CALL linesearch_create_section(subsection)
582 9530 : CALL section_add_subsection(section, subsection)
583 :
584 9530 : CALL section_release(subsection)
585 9530 : END SUBROUTINE create_pao_section
586 :
587 : END MODULE pao_input
|