39#include "./base/base_uses.f90"
44 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
45 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'input_cp2k_resp'
62 cpassert(.NOT.
ASSOCIATED(section))
64 description=
"Requests a restrained electrostatic potential (RESP) fit of atomic charges. "// &
65 "When using a periodic "// &
66 "Poisson solver and a periodic cell, the periodic RESP routines are "// &
67 "used. If the Hartree potential matches with the one of an isolated "// &
68 "system (i.e. isolated Poisson solver and big, nonperiodic cells), "// &
69 "the nonperiodic RESP routines are automatically used. All restraints "// &
71 n_keywords=2, n_subsections=2, repeats=.false., citations=[
golze2015])
73 NULLIFY (keyword, subsection)
76 description=
"The stride (X,Y,Z) used to write the cube file "// &
77 "(larger values result in smaller cube files). You can provide "// &
78 "3 numbers (for X,Y,Z) or 1 number valid for all components.", &
79 usage=
"STRIDE 2 2 2", n_var=-1, default_i_vals=[2, 2, 2], type_of_var=
integer_t)
83 CALL keyword_create(keyword, __location__, name=
"INTEGER_TOTAL_CHARGE", &
84 description=
"Forces the total charge to be integer", &
85 usage=
"INTEGER_TOTAL_CHARGE TRUE", &
90 CALL keyword_create(keyword, __location__, name=
"RESTRAIN_HEAVIES_TO_ZERO", &
91 description=
"Restrain non-hydrogen atoms to zero.", &
92 usage=
"RESTRAIN_HEAVIES_TO_ZERO FALSE", &
93 default_l_val=.true., lone_keyword_l_val=.true.)
97 CALL keyword_create(keyword, __location__, name=
"RESTRAIN_HEAVIES_STRENGTH", &
98 description=
"If defined, enforce the restraint of non-hydrogen "// &
99 "atoms to zero. Its value is the strength of the restraint on "// &
100 "the heavy atoms.", &
101 usage=
"RESTRAIN_HEAVIES_STRENGTH 0.0001 ", &
102 default_r_val=1.0e-6_dp)
107 description=
"Specifies the value of the width of the Gaussian "// &
108 "charge distribution carried by each atom. Needs only "// &
109 "to be specified when using a periodic Poisson solver.", &
110 usage=
"WIDTH <real> ", n_var=1, type_of_var=
real_t, &
111 default_r_val=
cp_unit_to_cp2k(
value=11.249_dp, unit_str=
"angstrom^-2"), &
112 unit_str=
"angstrom^-2")
116 CALL keyword_create(keyword, __location__, name=
"USE_REPEAT_METHOD", &
117 description=
"Fits the variance of the potential, i.e. the deviation "// &
118 "from the mean value of the potential within the selected "// &
119 "range. The evaluation of the potentials is still treated "// &
120 "within the GPW approach as described in [Golze2015]. "// &
121 "When used in conjunction with INTEGER_TOTAL_CHARGE = T "// &
122 "and SPHERE_SAMPLING, the results will be very similar to "// &
123 "the REPEAT charges given in [Campana2009]. In most "// &
124 "cases switching on this option gives reasonable "// &
125 "atomic charges without the need to define any "// &
126 "restraints. Note that by switching on this option, "// &
127 "RESTRAIN_HEAVIES_TO_ZERO will be switched off. ", &
128 usage=
"USE_REPEAT_METHOD", &
129 default_l_val=.false., lone_keyword_l_val=.true., &
134 CALL create_constraint_section(subsection)
138 CALL create_restraint_section(subsection)
142 CALL create_sphere_sampling_section(subsection)
146 CALL create_slab_sampling_section(subsection)
150 CALL create_print_resp_section(subsection)
161 SUBROUTINE create_constraint_section(section)
166 cpassert(.NOT.
ASSOCIATED(section))
168 description=
"specifies a linear constraint on the fitted charges. "// &
169 "This can be used to give equal values to equivalent atoms. "// &
170 "sum over atom_list c_i * q_i = t", &
171 n_keywords=1, n_subsections=0, repeats=.true.)
176 description=
"the target value for the constraint", &
177 usage=
"TARGET 0.0", &
178 n_var=1, default_r_val=0.0_dp)
182 CALL keyword_create(keyword, __location__, name=
"EQUAL_CHARGES", &
183 description=
"All atoms in ATOM_LIST are constrained to have the "// &
184 "same charges. When using this keyword, TARGET and ATOM_COEF do "// &
185 "not need to be set and will be ignored. Instead of using this "// &
186 "keyword, the constraint section could be repeated.", &
187 usage=
"EQUAL_CHARGES", &
188 default_l_val=.false., lone_keyword_l_val=.true.)
193 description=
"Defines the list of atoms involved in this constraint", &
194 usage=
"ATOM_LIST 3 4", &
195 type_of_var=
integer_t, n_var=-1, repeats=.true.)
200 description=
"Defines the coefficient of the atom in this "// &
201 "linear constraint", &
202 usage=
"ATOM_COEF 1.0 -1.0", &
203 type_of_var=
real_t, n_var=-1)
207 END SUBROUTINE create_constraint_section
214 SUBROUTINE create_restraint_section(section)
219 cpassert(.NOT.
ASSOCIATED(section))
221 description=
"specifies a restraint on the fitted charges. "// &
222 "This can be used to restrain values to zero. "// &
223 "s*(sum over atom_list q_i - t)**2", &
224 n_keywords=1, n_subsections=0, repeats=.true.)
229 description=
"the target value for the restraint", &
230 usage=
"TARGET 0.0", &
231 n_var=1, default_r_val=0.0_dp)
236 description=
"the target value for the constraint", &
237 usage=
"STRENGTH 0.001", &
238 n_var=1, default_r_val=0.001_dp)
243 description=
"Defines the list of atoms involved in this restraint", &
244 usage=
"ATOM_LIST 3 4", &
245 type_of_var=
integer_t, n_var=-1, repeats=.true.)
250 description=
"Defines the coefficient of the atom in this "// &
251 "linear restraint. If given, the restraint will be: "// &
252 "s*(sum over atom_list c_i * q_i - t)**2 ", &
253 usage=
"ATOM_COEF 1.0 -1.0", &
254 type_of_var=
real_t, n_var=-1)
258 END SUBROUTINE create_restraint_section
266 SUBROUTINE create_sphere_sampling_section(section)
271 cpassert(.NOT.
ASSOCIATED(section))
272 CALL section_create(section, __location__, name=
"SPHERE_SAMPLING", &
273 description=
"Specifies the parameter for sampling the RESP fitting points "// &
274 "for molecular structures, i.e. systems that do not involve "// &
275 "surfaces. Fitting points are sampled in spheres around the "// &
276 "atom. All grid points in the shell defined by rmin and rmax "// &
277 "are accepted for fitting. Default is that rmin is the vdW "// &
278 "radius and rmax=100.0*vdW_radius, which can be overwritten "// &
279 "by the keywords below.", &
280 n_keywords=1, n_subsections=0, repeats=.false.)
285 description=
"Specifies the lower boundary of the box along X used to "// &
286 "sample the potential. Only valid for nonperiodic RESP fitting.", &
287 usage=
"X_LOW -15.", type_of_var=
real_t, n_var=1, unit_str=
'angstrom')
292 description=
"Specifies the upper boundary of the box along X used to "// &
293 "sample the potential. Only valid for nonperiodic RESP fitting.", &
294 usage=
"X_HI 5.", type_of_var=
real_t, n_var=1, unit_str=
'angstrom')
299 description=
"Specifies the lower boundary of the box along Y used to "// &
300 "sample the potential. Only valid for nonperiodic RESP fitting.", &
301 usage=
"Y_LOW -15.", type_of_var=
real_t, n_var=1, unit_str=
'angstrom')
306 description=
"Specifies the upper boundary of the box along Y used to "// &
307 "sample the potential. Only valid for nonperiodic RESP fitting.", &
308 usage=
"Y_HI 5.", type_of_var=
real_t, n_var=1, unit_str=
'angstrom')
313 description=
"Specifies the lower boundary of the box along Z used to "// &
314 "sample the potential. Only valid for nonperiodic RESP fitting.", &
315 usage=
"Z_LOW -15.", type_of_var=
real_t, n_var=1, unit_str=
'angstrom')
320 description=
"Specifies the upper boundary of the box along Z used to "// &
321 "sample the potential. Only valid for nonperiodic RESP fitting.", &
322 usage=
"Z_HI 5.", type_of_var=
real_t, n_var=1, unit_str=
'angstrom')
326 CALL keyword_create(keyword, __location__, name=
"AUTO_VDW_RADII_TABLE", &
327 description=
"Select which vdW radii table to use for automatic "// &
328 "determination of RMIN_KIND and RMAX_KIND if those "// &
329 "are not declared explicitly", &
330 usage=
"AUTO_VDW_RADII_TABLE UFF", &
332 enum_c_vals=
s2a(
"CAMBRIDGE", &
334 enum_desc=
s2a(
"Cambridge Structural Database", &
335 "Universal Force Field: "// &
336 "Rappe et al. J. Am. Chem. Soc. 114, 10024 (1992)"), &
343 CALL keyword_create(keyword, __location__, name=
"AUTO_RMAX_SCALE", &
344 description=
"IF RMAX or RMAX_KIND keywords are not present, defines the "// &
345 "maximumn distance a fit point is away from an atom based on "// &
346 "the formula: rmax(kind) = AUTO_RMAX_SCALE * vdW_radius(kind). "// &
347 "The van der Waals radiii of the elements are based on data from "// &
348 "table chosen by AUTO_VDW_RADII_TABLE.", &
349 usage=
"AUTO_RMAX_SCALE 60.0", &
350 default_r_val=100.0_dp)
354 CALL keyword_create(keyword, __location__, name=
"AUTO_RMIN_SCALE", &
355 description=
"IF RMIN or RMIN_KIND keywords are not present, defines the "// &
356 "minimum distance a fit point is away from an atom based on "// &
357 "the formula: rmin(kind) = AUTO_RMIN_SCALE * vdW_radius(kind). "// &
358 "The van der Waals radii of the elements are based on data from "// &
359 "table chosen by AUTO_VDW_RADII_TABLE.", &
360 usage=
"AUTO_RMIN_SCALE 1.5", &
361 default_r_val=1.0_dp)
366 description=
"Specifies the maximum distance a fit point is away from an atom. "// &
367 "Valid for all atomic kinds for which no RMAX_KIND are specified.", &
375 description=
"Specifies the minimum distance a fit point is away from an atom. "// &
376 "Valid for all atomic kinds for which no RMIN_KIND are specified.", &
384 description=
"Specifies the maximum distance a fit point is away from an atom "// &
386 usage=
"RMAX_KIND 2.5 Br", repeats=.true., &
387 n_var=-1, type_of_var=
char_t)
392 description=
"Specifies the minimum distance a fit point is away from an atom "// &
394 usage=
"RMIN_KIND 2.1 Br", repeats=.true., &
395 n_var=-1, type_of_var=
char_t)
399 END SUBROUTINE create_sphere_sampling_section
407 SUBROUTINE create_slab_sampling_section(section)
412 cpassert(.NOT.
ASSOCIATED(section))
413 CALL section_create(section, __location__, name=
"SLAB_SAMPLING", &
414 description=
"Specifies the parameter for sampling the RESP fitting "// &
415 "points for slab-like periodic systems, i.e. systems that "// &
416 "involve surfaces. This section can only be used with periodic "// &
417 "Poisson solver and cell. To see, which grid points were "// &
418 "used, switch on COORD_FIT_POINTS in the PRINT section.", &
419 n_keywords=1, n_subsections=0, repeats=.true.)
424 description=
"Specifies the list of indexes of atoms used to define "// &
425 "the region for the RESP fitting. The list should "// &
426 "contain indexes of atoms of the first surface layer.", &
427 usage=
"ATOM_LIST 1 2 3 or 1..3", &
428 type_of_var=
integer_t, n_var=-1, repeats=.true.)
433 description=
"Range where the fitting points are sampled. A range of "// &
434 "3 to 5 Angstroms means that the fitting points are sampled in the region "// &
435 "of 3 to 5 Angstroms above the surface which is defined by atom indexes given "// &
437 usage=
"RANGE <real> <real>", unit_str=
"angstrom", n_var=2, type_of_var=
real_t)
442 description=
"Length of the sampling box, i.e. a box of this length and "// &
443 "the height specified by RANGE is defined above each surface atom given "// &
444 "in ATOM_LIST. The grid points in the boxes are accepted as fitting point. "// &
445 "Should be in the range of the nearest neighbour distance (a bit larger to be "// &
446 "on the safe side). Allows for a refined sampling of grid points in case of "// &
447 "corrugated surfaces.", &
448 usage=
"LENGTH <real> ", unit_str=
"angstrom", n_var=1, type_of_var=
real_t, &
453 CALL keyword_create(keyword, __location__, name=
"SURF_DIRECTION", &
454 description=
"Specifies what above the surface means. Defines the direction.", &
455 usage=
"SURF_DIRECTION Z", &
456 enum_c_vals=
s2a(
"X",
"Y",
"Z",
"-X",
"-Y",
"-Z"), &
459 enum_desc=
s2a(
"surface layers are piled up in x-direction", &
460 "surface layers are piled up in y-direction", &
461 "surface layers are piled up in z-direction", &
462 "surface layers are piled up in -x-direction", &
463 "surface layers are piled up in -y-direction", &
464 "surface layers are piled up in -z-direction"), &
469 END SUBROUTINE create_slab_sampling_section
476 SUBROUTINE create_print_resp_section(section)
482 cpassert(.NOT.
ASSOCIATED(section))
483 NULLIFY (print_key, keyword)
485 description=
"Section of possible print options specific for the RESP code.", &
486 n_keywords=0, n_subsections=1, repeats=.false.)
489 description=
"Controls the printing of information regarding the run.", &
495 description=
"Controls the printing of the coordinates of the "// &
496 "grid points used for periodic RESP fitting. This section "// &
497 "is intended to be only used for testing (you can get large files).", &
499 filename=
"RESP_FIT_POINTS", &
500 common_iter_levels=3)
505 description=
"Controls the printing of the RESP charges "// &
508 filename=
"RESP_CHARGES", &
509 common_iter_levels=3)
514 description=
"Controls the printing of the potential generated "// &
515 "by the RESP CHARGES to a cube file. Prints the relative "// &
516 "root-mean-square (RRMS) and root-mean-square (RMS) errors.", &
518 filename=
"RESP_POTENTIAL", &
519 common_iter_levels=3)
521 description=
"The stride (X,Y,Z) used to write the cube file "// &
522 "(larger values result in smaller cube files). You can provide 3 numbers (for X,Y,Z) or"// &
523 " 1 number valid for all components.", &
524 usage=
"STRIDE 2 2 2", n_var=-1, default_i_vals=[2, 2, 2], type_of_var=
integer_t)
528 description=
"append the cube files when they already exist", &
529 default_l_val=.false., lone_keyword_l_val=.true.)
534 END SUBROUTINE create_print_resp_section
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public golze2015
integer, save, public rappe1992
integer, save, public campana2009
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer, parameter, public low_print_level
integer, parameter, public high_print_level
integer, parameter, public add_last_numeric
subroutine, public cp_print_key_section_create(print_key_section, location, name, description, print_level, each_iter_names, each_iter_values, add_last, filename, common_iter_levels, citations, unit_str)
creates a print_key section
real(kind=dp) function, public cp_unit_to_cp2k(value, unit_str, defaults, power)
converts to the internal cp2k units to the given unit
Defines the basic variable types.
integer, parameter, public dp
Utilities for string manipulations.