Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief builds the input structure for optimize_basis
10 : !> \par History
11 : !> 03.2012 created [Florian Schiffmann]
12 : !> \author Florian Schiffmann
13 : ! **************************************************************************************************
14 : MODULE input_optimize_basis
15 :
16 : USE input_constants, ONLY: do_opt_all,&
17 : do_opt_coeff,&
18 : do_opt_exps,&
19 : do_opt_none
20 : USE input_keyword_types, ONLY: keyword_create,&
21 : keyword_release,&
22 : keyword_type
23 : USE input_section_types, ONLY: section_add_keyword,&
24 : section_add_subsection,&
25 : section_create,&
26 : section_release,&
27 : section_type
28 : USE input_val_types, ONLY: char_t,&
29 : integer_t,&
30 : real_t
31 : USE kinds, ONLY: dp
32 : USE string_utilities, ONLY: s2a
33 : #include "./base/base_uses.f90"
34 :
35 : IMPLICIT NONE
36 : PRIVATE
37 :
38 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'input_optimize_basis'
39 : PUBLIC :: create_optimize_basis_section
40 :
41 : CONTAINS
42 :
43 : ! **************************************************************************************************
44 : !> \brief creates the optimize_basis section
45 : !> \param section ...
46 : !> \author Florian Schiffmann
47 : ! **************************************************************************************************
48 8530 : SUBROUTINE create_optimize_basis_section(section)
49 : TYPE(section_type), POINTER :: section
50 :
51 : TYPE(keyword_type), POINTER :: keyword
52 : TYPE(section_type), POINTER :: subsection
53 :
54 8530 : CPASSERT(.NOT. ASSOCIATED(section))
55 : CALL section_create(section, __LOCATION__, name="OPTIMIZE_BASIS", &
56 : description="describes a basis optimization job, in which an ADMM like approach is used to"// &
57 : " find the best exponents and/or coefficients to match a given training set.", &
58 8530 : repeats=.FALSE.)
59 8530 : NULLIFY (keyword, subsection)
60 :
61 : CALL keyword_create(keyword, __LOCATION__, name="BASIS_TEMPLATE_FILE", &
62 : description="Name of the basis set file, containing the structure of the new basis set", &
63 : usage="BASIS_TEMPLATE_FILE <FILENAME>", &
64 : type_of_var=char_t, repeats=.FALSE., &
65 8530 : default_c_val="BASIS_SET", n_var=-1)
66 8530 : CALL section_add_keyword(section, keyword)
67 8530 : CALL keyword_release(keyword)
68 :
69 : CALL keyword_create(keyword, __LOCATION__, name="BASIS_WORK_FILE", &
70 : description="Name of the basis set file which is created to be read as initial guess", &
71 : usage="BASIS_WORK_FILE <FILENAME>", &
72 : type_of_var=char_t, repeats=.FALSE., &
73 8530 : default_c_val="BASIS_WORK_FILE", n_var=-1)
74 8530 : CALL section_add_keyword(section, keyword)
75 8530 : CALL keyword_release(keyword)
76 :
77 : CALL keyword_create(keyword, __LOCATION__, name="BASIS_OUTPUT_FILE", &
78 : description="Name of the basis set file containing the optimized basis", &
79 : usage="BASIS_OUTPUT_FILE <FILENAME>", &
80 : type_of_var=char_t, repeats=.FALSE., &
81 8530 : default_c_val="BASIS_OUTPUT_FILE", n_var=-1)
82 8530 : CALL section_add_keyword(section, keyword)
83 8530 : CALL keyword_release(keyword)
84 :
85 : CALL keyword_create(keyword, __LOCATION__, name="WRITE_FREQUENCY", &
86 : description="Frequency at which the intermediate results should be written", &
87 : usage="WRITE_FREQUENCY 1000", &
88 8530 : default_i_val=5000)
89 8530 : CALL section_add_keyword(section, keyword)
90 8530 : CALL keyword_release(keyword)
91 :
92 : CALL keyword_create(keyword, __LOCATION__, name="USE_CONDITION_NUMBER", &
93 : description="Determines whether condition number should be part of optimization or not", &
94 : usage="USE_CONDITION_NUMBER", &
95 8530 : default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
96 8530 : CALL section_add_keyword(section, keyword)
97 8530 : CALL keyword_release(keyword)
98 :
99 : CALL keyword_create( &
100 : keyword, __LOCATION__, name="BASIS_COMBINATIONS", &
101 : description="If multiple atomic kinds are fitted at the same time, this keyword "// &
102 : "allows to specify which basis sets should be used together in optimization (underived set ID=0). "// &
103 : "If skipped all combinations are used. The order is taken as the kinds and sets are specified in the input", &
104 : repeats=.TRUE., &
105 8530 : usage="BASIS_COMBINATIONS SET_ID(KIND1) SET_ID(KIND2) ... ", type_of_var=integer_t, n_var=-1)
106 8530 : CALL section_add_keyword(section, keyword)
107 8530 : CALL keyword_release(keyword)
108 :
109 : CALL keyword_create( &
110 : keyword, __LOCATION__, name="RESIDUUM_WEIGHT", &
111 : description="This keyword allows to give different weight factors to the "// &
112 : "residuum of the different basis combinations. "// &
113 : "The first entry corresponds to the original basis sets. Every further value is assigned to the combinations "// &
114 : "in the order given for BASIS_COMBINATIONS.", &
115 : repeats=.TRUE., &
116 8530 : usage="RESIDUUM_WEIGHT REAL ", default_r_val=1.0_dp)
117 8530 : CALL section_add_keyword(section, keyword)
118 8530 : CALL keyword_release(keyword)
119 :
120 : CALL keyword_create( &
121 : keyword, __LOCATION__, name="CONDITION_WEIGHT", &
122 : description="This keyword allows to give different weight factors to the "// &
123 : "condition number of different basis combinations (LOG(cond) is used). "// &
124 : "The first entry corresponds to the original basis sets. Every further value is assigned to the combinations "// &
125 : "in the order given for BASIS_COMBINATIONS.", &
126 : repeats=.TRUE., &
127 8530 : usage="CONTITION_WEIGHT REAL ", default_r_val=1.0_dp)
128 8530 : CALL section_add_keyword(section, keyword)
129 8530 : CALL keyword_release(keyword)
130 :
131 : CALL keyword_create(keyword, __LOCATION__, name="GROUP_PARTITION", &
132 : description="Allows the specification of the group mpi group sizes in parallel "// &
133 : "runs. If less Groups than tasks are speciefied, consecutive calculations "// &
134 : "Will be assigned to one group (derived basis sets and then training sets) "// &
135 : "If keyword is skipped, equal group sizes will be generated trying to fit all calculations.", &
136 : repeats=.TRUE., &
137 8530 : usage="GROUP_PARTITION INT INT ... ", type_of_var=integer_t, n_var=-1)
138 8530 : CALL section_add_keyword(section, keyword)
139 8530 : CALL keyword_release(keyword)
140 :
141 8530 : CALL create_fit_kinds_section(subsection)
142 8530 : CALL section_add_subsection(section, subsection)
143 8530 : CALL section_release(subsection)
144 :
145 8530 : CALL create_training_section(subsection)
146 8530 : CALL section_add_subsection(section, subsection)
147 8530 : CALL section_release(subsection)
148 :
149 8530 : CALL create_powell_section(subsection)
150 8530 : CALL section_add_subsection(section, subsection)
151 8530 : CALL section_release(subsection)
152 :
153 8530 : END SUBROUTINE create_optimize_basis_section
154 :
155 : ! **************************************************************************************************
156 : !> \brief ...
157 : !> \param section ...
158 : ! **************************************************************************************************
159 8530 : SUBROUTINE create_fit_kinds_section(section)
160 : TYPE(section_type), POINTER :: section
161 :
162 : TYPE(keyword_type), POINTER :: keyword
163 : TYPE(section_type), POINTER :: subsection
164 :
165 8530 : NULLIFY (keyword, subsection)
166 8530 : CPASSERT(.NOT. ASSOCIATED(section))
167 : CALL section_create(section, __LOCATION__, name="FIT_KIND", &
168 : description="specicifies the atomic kinds to be fitted and the basis"// &
169 : " sets associated with the kind.", &
170 8530 : repeats=.TRUE.)
171 :
172 : CALL keyword_create(keyword, __LOCATION__, name="_SECTION_PARAMETERS_", &
173 : description="The name of the kind described in this section.", &
174 8530 : usage="H", default_c_val="DEFAULT")
175 8530 : CALL section_add_keyword(section, keyword)
176 8530 : CALL keyword_release(keyword)
177 :
178 : CALL keyword_create(keyword, __LOCATION__, name="BASIS_SET", &
179 : description="The name of the basis set for the kind. Has to be specified in BASIS_TEMPLATE_FILE.", &
180 8530 : usage="H", default_c_val="DEFAULT")
181 8530 : CALL section_add_keyword(section, keyword)
182 8530 : CALL keyword_release(keyword)
183 :
184 : CALL keyword_create(keyword, __LOCATION__, name="INITIAL_DEGREES_OF_FREEDOM", &
185 : description="Specifies the initial degrees of freedom in the basis optimization. "// &
186 : "This can be used to make further specifications easier", &
187 : usage="INITIAL_DEGREES_OF_FREEDOM ALL", &
188 : enum_c_vals=s2a("ALL", "NONE", "COEFFICIENTS", "EXPONENTS"), &
189 : enum_desc=s2a("Set all parameters in the basis to be variable.", &
190 : "Set all parameters in the basis to be fixed.", &
191 : "Set all coefficients in the basis set to be variable.", &
192 : "Set all exponents in the basis to be variable."), &
193 : enum_i_vals=(/do_opt_all, do_opt_none, do_opt_coeff, do_opt_exps/), &
194 8530 : default_i_val=do_opt_coeff)
195 8530 : CALL section_add_keyword(section, keyword)
196 8530 : CALL keyword_release(keyword)
197 :
198 : CALL keyword_create(keyword, __LOCATION__, name="SWITCH_COEFF_STATE", &
199 : description="Allows to switch the state of a given coefficient from current state "// &
200 : "(varibale/fixed)) to the opposite state. The three integers indicate "// &
201 : "the set number, the angular momentum i'th contraction and i'th coefficient", repeats=.TRUE., &
202 8530 : usage="SWITCH_COEFF_STATE SET L CONTRACTION IPGF", type_of_var=integer_t, n_var=4)
203 8530 : CALL section_add_keyword(section, keyword)
204 8530 : CALL keyword_release(keyword)
205 :
206 : CALL keyword_create(keyword, __LOCATION__, name="SWITCH_CONTRACTION_STATE", &
207 : description="Allows to switch the state of a given contraction from current state "// &
208 : "(varibale/fixed)) to the opposite state. The three integers indicate "// &
209 : "the set number, the angular momentum and i'th contraction ", repeats=.TRUE., &
210 8530 : usage="SWITCH_CONTRACTION_STATE SET L CONTRACTION ", type_of_var=integer_t, n_var=3)
211 8530 : CALL section_add_keyword(section, keyword)
212 8530 : CALL keyword_release(keyword)
213 :
214 : CALL keyword_create(keyword, __LOCATION__, name="SWITCH_EXP_STATE", &
215 : description="Allows to switch the state of a given exponent from current state "// &
216 : "(varibale/fixed)) to the opposite state. The two integers indicate "// &
217 : "the set number and i'th exponent", repeats=.TRUE., &
218 8530 : usage="SWITCH_EXP_STATE SET IEXP", type_of_var=integer_t, n_var=2)
219 8530 : CALL section_add_keyword(section, keyword)
220 8530 : CALL keyword_release(keyword)
221 :
222 : CALL keyword_create(keyword, __LOCATION__, name="SWITCH_SET_STATE", &
223 : description="Allows to switch the states of in a set from current state "// &
224 : "(varibale/fixed)) to the opposite state. The two integers indicate "// &
225 : "the affected part (0=ALL,1=EXPS,2=COEFF) and i'th set", repeats=.TRUE., &
226 8530 : usage="SWITCH_SET_STATE SET IEXP", type_of_var=integer_t, n_var=2)
227 8530 : CALL section_add_keyword(section, keyword)
228 8530 : CALL keyword_release(keyword)
229 :
230 8530 : CALL create_constrain_exp_section(subsection)
231 8530 : CALL section_add_subsection(section, subsection)
232 8530 : CALL section_release(subsection)
233 :
234 8530 : CALL create_derived_sets_section(subsection)
235 8530 : CALL section_add_subsection(section, subsection)
236 8530 : CALL section_release(subsection)
237 :
238 8530 : END SUBROUTINE create_fit_kinds_section
239 :
240 : ! **************************************************************************************************
241 : !> \brief ...
242 : !> \param section ...
243 : ! **************************************************************************************************
244 8530 : SUBROUTINE create_derived_sets_section(section)
245 : TYPE(section_type), POINTER :: section
246 :
247 : TYPE(keyword_type), POINTER :: keyword
248 :
249 8530 : NULLIFY (keyword)
250 8530 : CPASSERT(.NOT. ASSOCIATED(section))
251 : CALL section_create(section, __LOCATION__, name="DERIVED_BASIS_SETS", &
252 : description="This section can be used to create subsets of a basis"// &
253 : " which will be fitted at the same time. This is especially useful if connected"// &
254 : " bsis sets e.g. TZVP, DZVP, SZV should be fitted.", &
255 8530 : repeats=.TRUE.)
256 :
257 : CALL keyword_create(keyword, __LOCATION__, name="BASIS_SET_NAME", &
258 : description="Defines the name of the derived basis set, which will be "// &
259 : "automatically generated otherwise.", &
260 : usage="BASIS_SET_NAME {word}", &
261 : type_of_var=char_t, &
262 : repeats=.FALSE., &
263 8530 : default_c_val="")
264 8530 : CALL section_add_keyword(section, keyword)
265 8530 : CALL keyword_release(keyword)
266 :
267 : CALL keyword_create(keyword, __LOCATION__, name="REFERENCE_SET", &
268 : description="Specifies the reference basis ID which is used as template to create the new set. "// &
269 : "The original basis has ID 0. All following sets are counted in order as specified in the Input."// &
270 : " The descriptors always assume the structure of the input basis set.", &
271 8530 : repeats=.FALSE., usage="REFERNCE_SET INTEGER", default_i_val=0)
272 8530 : CALL section_add_keyword(section, keyword)
273 8530 : CALL keyword_release(keyword)
274 :
275 : CALL keyword_create(keyword, __LOCATION__, name="REMOVE_CONTRACTION", &
276 : description="Can be used to remove a contraction from the reference basis set. "// &
277 : "The contraction is speciefied by set number, angular momentum and number of contraction."// &
278 : " The descriptors always assume the structure of the input basis set.", &
279 8530 : repeats=.TRUE., usage="REMOVE_CONTRACTION SET L ICONTRACTION", type_of_var=integer_t, n_var=3)
280 8530 : CALL section_add_keyword(section, keyword)
281 8530 : CALL keyword_release(keyword)
282 :
283 : CALL keyword_create(keyword, __LOCATION__, name="REMOVE_SET", &
284 : description="Can be used to remove a set from the reference basis set. ", &
285 8530 : repeats=.TRUE., usage="REMOVE_SET SET", type_of_var=integer_t, n_var=1)
286 8530 : CALL section_add_keyword(section, keyword)
287 8530 : CALL keyword_release(keyword)
288 :
289 8530 : END SUBROUTINE create_derived_sets_section
290 :
291 : ! **************************************************************************************************
292 : !> \brief ...
293 : !> \param section ...
294 : ! **************************************************************************************************
295 8530 : SUBROUTINE create_constrain_exp_section(section)
296 : TYPE(section_type), POINTER :: section
297 :
298 : TYPE(keyword_type), POINTER :: keyword
299 :
300 8530 : NULLIFY (keyword)
301 8530 : CPASSERT(.NOT. ASSOCIATED(section))
302 : CALL section_create(section, __LOCATION__, name="CONSTRAIN_EXPONENTS", &
303 : description="specicifies constraints for the exponents to be fitted."// &
304 : " Only a single constraint can be applied to an exponent", &
305 8530 : repeats=.TRUE.)
306 :
307 : CALL keyword_create(keyword, __LOCATION__, name="USE_EXP", &
308 : description="Defines the exponent to be constraint. The two integers indicate "// &
309 : "the set number and i'th exponent. The value -1 can be used to mark all sets/exponents in a set.", &
310 8530 : repeats=.FALSE., usage="USE_EXP SET IEXP", type_of_var=integer_t, n_var=2)
311 8530 : CALL section_add_keyword(section, keyword)
312 8530 : CALL keyword_release(keyword)
313 :
314 : CALL keyword_create(keyword, __LOCATION__, name="BOUNDARIES", &
315 : description="Defines the boundaries to which the optimization is restricted."// &
316 : " First value is the lower bound, second value is the upper bound.", &
317 8530 : repeats=.FALSE., usage="BOUNDARIES LOWER UPPER", type_of_var=real_t, n_var=2)
318 8530 : CALL section_add_keyword(section, keyword)
319 8530 : CALL keyword_release(keyword)
320 :
321 : CALL keyword_create(keyword, __LOCATION__, name="MAX_VAR_FRACTION", &
322 : description="Defines the maximum fractionr by which the exponent is allowed to vary."// &
323 : " e.g. 0.5 allows the exp to vary by 0.5*exp in both directions.", &
324 8530 : repeats=.FALSE., usage="MAX_VAR_FRACTION REAL", type_of_var=real_t, n_var=1)
325 8530 : CALL section_add_keyword(section, keyword)
326 8530 : CALL keyword_release(keyword)
327 :
328 8530 : END SUBROUTINE create_constrain_exp_section
329 :
330 : ! **************************************************************************************************
331 : !> \brief ...
332 : !> \param section ...
333 : ! **************************************************************************************************
334 8530 : SUBROUTINE create_training_section(section)
335 : TYPE(section_type), POINTER :: section
336 :
337 : TYPE(keyword_type), POINTER :: keyword
338 :
339 8530 : NULLIFY (keyword)
340 8530 : CPASSERT(.NOT. ASSOCIATED(section))
341 : CALL section_create(section, __LOCATION__, name="TRAINING_FILES", &
342 : description="specicifies the location in which the files necessary for"// &
343 : " fitting procedure are located. Each Training set needs a repetition of this section.", &
344 8530 : repeats=.TRUE.)
345 :
346 : CALL keyword_create(keyword, __LOCATION__, name="DIRECTORY", &
347 : description="the directory in which the files are placed", &
348 : usage="DIRECTORY /my/path", &
349 8530 : default_lc_val=".")
350 8530 : CALL section_add_keyword(section, keyword)
351 8530 : CALL keyword_release(keyword)
352 :
353 : CALL keyword_create(keyword, __LOCATION__, name="INPUT_FILE_NAME", &
354 : description="the filename of the input file used to run the original calculation", &
355 : usage="INPUT_FILE_NAME my_input.inp", &
356 8530 : default_lc_val="input.inp")
357 8530 : CALL section_add_keyword(section, keyword)
358 8530 : CALL keyword_release(keyword)
359 :
360 8530 : END SUBROUTINE create_training_section
361 :
362 : ! **************************************************************************************************
363 : !> \brief ...
364 : !> \param section ...
365 : ! **************************************************************************************************
366 8530 : SUBROUTINE create_powell_section(section)
367 : TYPE(section_type), POINTER :: section
368 :
369 : TYPE(keyword_type), POINTER :: keyword
370 :
371 8530 : NULLIFY (keyword)
372 8530 : CPASSERT(.NOT. ASSOCIATED(section))
373 : CALL section_create(section, __LOCATION__, name="OPTIMIZATION", &
374 : description="sets the parameters for optimizition, output frequency and restarts", &
375 8530 : repeats=.FALSE.)
376 :
377 : CALL keyword_create(keyword, __LOCATION__, name="ACCURACY", &
378 : description="Final accuracy requested in optimization (RHOEND)", &
379 : usage="ACCURACY 0.00001", &
380 8530 : default_r_val=1.e-5_dp)
381 8530 : CALL section_add_keyword(section, keyword)
382 8530 : CALL keyword_release(keyword)
383 :
384 : CALL keyword_create(keyword, __LOCATION__, name="STEP_SIZE", &
385 : description="Initial step size for search algorithm (RHOBEG)", &
386 : usage="STEP_SIZE 0.005", &
387 8530 : default_r_val=0.1_dp)
388 8530 : CALL section_add_keyword(section, keyword)
389 8530 : CALL keyword_release(keyword)
390 :
391 : CALL keyword_create(keyword, __LOCATION__, name="MAX_FUN", &
392 : description="Maximum number of function evaluations", &
393 : usage="MAX_FUN 1000", &
394 8530 : default_i_val=5000)
395 8530 : CALL section_add_keyword(section, keyword)
396 8530 : CALL keyword_release(keyword)
397 :
398 8530 : END SUBROUTINE create_powell_section
399 :
400 : END MODULE input_optimize_basis
|