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 RESP fit of charges. When using a periodic "// &
65 "Poisson solver and a periodic cell, the periodic RESP routines are "// &
66 "used. If the Hartree potential matches with the one of an isolated "// &
67 "system (i.e. isolated Poisson solver and big, nonperiodic cells), "// &
68 "the nonperiodic RESP routines are automatically used. All restraints "// &
70 n_keywords=2, n_subsections=2, repeats=.false., citations=(/
golze2015/))
72 NULLIFY (keyword, subsection)
75 description=
"The stride (X,Y,Z) used to write the cube file "// &
76 "(larger values result in smaller cube files). You can provide "// &
77 "3 numbers (for X,Y,Z) or 1 number valid for all components.", &
78 usage=
"STRIDE 2 2 2", n_var=-1, default_i_vals=(/2, 2, 2/), type_of_var=
integer_t)
82 CALL keyword_create(keyword, __location__, name=
"INTEGER_TOTAL_CHARGE", &
83 description=
"Forces the total charge to be integer", &
84 usage=
"INTEGER_TOTAL_CHARGE TRUE", &
89 CALL keyword_create(keyword, __location__, name=
"RESTRAIN_HEAVIES_TO_ZERO", &
90 description=
"Restrain non-hydrogen atoms to zero.", &
91 usage=
"RESTRAIN_HEAVIES_TO_ZERO FALSE", &
92 default_l_val=.true., lone_keyword_l_val=.true.)
96 CALL keyword_create(keyword, __location__, name=
"RESTRAIN_HEAVIES_STRENGTH", &
97 description=
"If defined, enforce the restraint of non-hydrogen "// &
98 "atoms to zero. Its value is the strength of the restraint on "// &
100 usage=
"RESTRAIN_HEAVIES_STRENGTH 0.0001 ", &
101 default_r_val=1.0e-6_dp)
106 description=
"Specifies the value of the width of the Gaussian "// &
107 "charge distribution carried by each atom. Needs only "// &
108 "to be specified when using a periodic Poisson solver.", &
109 usage=
"WIDTH <real> ", n_var=1, type_of_var=
real_t, &
110 default_r_val=
cp_unit_to_cp2k(
value=11.249_dp, unit_str=
"angstrom^-2"), &
111 unit_str=
"angstrom^-2")
115 CALL keyword_create(keyword, __location__, name=
"USE_REPEAT_METHOD", &
116 description=
"Fits the variance of the potential, i.e. the deviation "// &
117 "from the mean value of the potential within the selected "// &
118 "range. The evaluation of the potentials is still treated "// &
119 "within the GPW approach as described in [Golze2015]. "// &
120 "When used in conjunction with INTEGER_TOTAL_CHARGE = T "// &
121 "and SPHERE_SAMPLING, the results will be very similar to "// &
122 "the REPEAT charges given in [Campana2009]. In most "// &
123 "cases switching on this option gives reasonable "// &
124 "atomic charges without the need to define any "// &
125 "restraints. Note that by switching on this option, "// &
126 "RESTRAIN_HEAVIES_TO_ZERO will be switched off. ", &
127 usage=
"USE_REPEAT_METHOD", &
128 default_l_val=.false., lone_keyword_l_val=.true., &
133 CALL create_constraint_section(subsection)
137 CALL create_restraint_section(subsection)
141 CALL create_sphere_sampling_section(subsection)
145 CALL create_slab_sampling_section(subsection)
149 CALL create_print_resp_section(subsection)
160 SUBROUTINE create_constraint_section(section)
165 cpassert(.NOT.
ASSOCIATED(section))
167 description=
"specifies a linear constraint on the fitted charges. "// &
168 "This can be used to give equal values to equivalent atoms. "// &
169 "sum over atom_list c_i * q_i = t", &
170 n_keywords=1, n_subsections=0, repeats=.true.)
175 description=
"the target value for the constraint", &
176 usage=
"TARGET 0.0", &
177 n_var=1, default_r_val=0.0_dp)
181 CALL keyword_create(keyword, __location__, name=
"EQUAL_CHARGES", &
182 description=
"All atoms in ATOM_LIST are constrained to have the "// &
183 "same charges. When using this keyword, TARGET and ATOM_COEF do "// &
184 "not need to be set and will be ignored. Instead of using this "// &
185 "keyword, the constraint section could be repeated.", &
186 usage=
"EQUAL_CHARGES", &
187 default_l_val=.false., lone_keyword_l_val=.true.)
192 description=
"Defines the list of atoms involved in this constraint", &
193 usage=
"ATOM_LIST 3 4", &
194 type_of_var=
integer_t, n_var=-1, repeats=.true.)
199 description=
"Defines the coefficient of the atom in this "// &
200 "linear constraint", &
201 usage=
"ATOM_COEF 1.0 -1.0", &
202 type_of_var=
real_t, n_var=-1)
206 END SUBROUTINE create_constraint_section
213 SUBROUTINE create_restraint_section(section)
218 cpassert(.NOT.
ASSOCIATED(section))
220 description=
"specifies a restraint on the fitted charges. "// &
221 "This can be used to restrain values to zero. "// &
222 "s*(sum over atom_list q_i - t)**2", &
223 n_keywords=1, n_subsections=0, repeats=.true.)
228 description=
"the target value for the restraint", &
229 usage=
"TARGET 0.0", &
230 n_var=1, default_r_val=0.0_dp)
235 description=
"the target value for the constraint", &
236 usage=
"STRENGTH 0.001", &
237 n_var=1, default_r_val=0.001_dp)
242 description=
"Defines the list of atoms involved in this restraint", &
243 usage=
"ATOM_LIST 3 4", &
244 type_of_var=
integer_t, n_var=-1, repeats=.true.)
249 description=
"Defines the coefficient of the atom in this "// &
250 "linear restraint. If given, the restraint will be: "// &
251 "s*(sum over atom_list c_i * q_i - t)**2 ", &
252 usage=
"ATOM_COEF 1.0 -1.0", &
253 type_of_var=
real_t, n_var=-1)
257 END SUBROUTINE create_restraint_section
265 SUBROUTINE create_sphere_sampling_section(section)
270 cpassert(.NOT.
ASSOCIATED(section))
271 CALL section_create(section, __location__, name=
"SPHERE_SAMPLING", &
272 description=
"Specifies the parameter for sampling the RESP fitting points "// &
273 "for molecular structures, i.e. systems that do not involve "// &
274 "surfaces. Fitting points are sampled in spheres around the "// &
275 "atom. All grid points in the shell defined by rmin and rmax "// &
276 "are accepted for fitting. Default is that rmin is the vdW "// &
277 "radius and rmax=100.0*vdW_radius, which can be overwritten "// &
278 "by the keywords below.", &
279 n_keywords=1, n_subsections=0, repeats=.false.)
284 description=
"Specifies the lower boundary of the box along X used to "// &
285 "sample the potential. Only valid for nonperiodic RESP fitting.", &
286 usage=
"X_LOW -15.", type_of_var=
real_t, n_var=1, unit_str=
'angstrom')
291 description=
"Specifies the upper boundary of the box along X used to "// &
292 "sample the potential. Only valid for nonperiodic RESP fitting.", &
293 usage=
"X_HI 5.", type_of_var=
real_t, n_var=1, unit_str=
'angstrom')
298 description=
"Specifies the lower boundary of the box along Y used to "// &
299 "sample the potential. Only valid for nonperiodic RESP fitting.", &
300 usage=
"Y_LOW -15.", type_of_var=
real_t, n_var=1, unit_str=
'angstrom')
305 description=
"Specifies the upper boundary of the box along Y used to "// &
306 "sample the potential. Only valid for nonperiodic RESP fitting.", &
307 usage=
"Y_HI 5.", type_of_var=
real_t, n_var=1, unit_str=
'angstrom')
312 description=
"Specifies the lower boundary of the box along Z used to "// &
313 "sample the potential. Only valid for nonperiodic RESP fitting.", &
314 usage=
"Z_LOW -15.", type_of_var=
real_t, n_var=1, unit_str=
'angstrom')
319 description=
"Specifies the upper boundary of the box along Z used to "// &
320 "sample the potential. Only valid for nonperiodic RESP fitting.", &
321 usage=
"Z_HI 5.", type_of_var=
real_t, n_var=1, unit_str=
'angstrom')
325 CALL keyword_create(keyword, __location__, name=
"AUTO_VDW_RADII_TABLE", &
326 description=
"Select which vdW radii table to use for automatic "// &
327 "determination of RMIN_KIND and RMAX_KIND if those "// &
328 "are not declared explicitly", &
329 usage=
"AUTO_VDW_RADII_TABLE UFF", &
331 enum_c_vals=
s2a(
"CAMBRIDGE", &
333 enum_desc=
s2a(
"Cambridge Structural Database", &
334 "Universal Force Field: "// &
335 "Rappe et al. J. Am. Chem. Soc. 114, 10024 (1992)"), &
342 CALL keyword_create(keyword, __location__, name=
"AUTO_RMAX_SCALE", &
343 description=
"IF RMAX or RMAX_KIND keywords are not present, defines the "// &
344 "maximumn distance a fit point is away from an atom based on "// &
345 "the formula: rmax(kind) = AUTO_RMAX_SCALE * vdW_radius(kind). "// &
346 "The van der Waals radiii of the elements are based on data from "// &
347 "table chosen by AUTO_VDW_RADII_TABLE.", &
348 usage=
"AUTO_RMAX_SCALE 60.0", &
349 default_r_val=100.0_dp)
353 CALL keyword_create(keyword, __location__, name=
"AUTO_RMIN_SCALE", &
354 description=
"IF RMIN or RMIN_KIND keywords are not present, defines the "// &
355 "minimum distance a fit point is away from an atom based on "// &
356 "the formula: rmin(kind) = AUTO_RMIN_SCALE * vdW_radius(kind). "// &
357 "The van der Waals radii of the elements are based on data from "// &
358 "table chosen by AUTO_VDW_RADII_TABLE.", &
359 usage=
"AUTO_RMIN_SCALE 1.5", &
360 default_r_val=1.0_dp)
365 description=
"Specifies the maximum distance a fit point is away from an atom. "// &
366 "Valid for all atomic kinds for which no RMAX_KIND are specified.", &
374 description=
"Specifies the minimum distance a fit point is away from an atom. "// &
375 "Valid for all atomic kinds for which no RMIN_KIND are specified.", &
383 description=
"Specifies the maximum distance a fit point is away from an atom "// &
385 usage=
"RMAX_KIND 2.5 Br", repeats=.true., &
386 n_var=-1, type_of_var=
char_t)
391 description=
"Specifies the minimum distance a fit point is away from an atom "// &
393 usage=
"RMIN_KIND 2.1 Br", repeats=.true., &
394 n_var=-1, type_of_var=
char_t)
398 END SUBROUTINE create_sphere_sampling_section
406 SUBROUTINE create_slab_sampling_section(section)
411 cpassert(.NOT.
ASSOCIATED(section))
412 CALL section_create(section, __location__, name=
"SLAB_SAMPLING", &
413 description=
"Specifies the parameter for sampling the RESP fitting "// &
414 "points for slab-like periodic systems, i.e. systems that "// &
415 "involve surfaces. This section can only be used with periodic "// &
416 "Poisson solver and cell. To see, which grid points were "// &
417 "used, switch on COORD_FIT_POINTS in the PRINT section.", &
418 n_keywords=1, n_subsections=0, repeats=.true.)
423 description=
"Specifies the list of indexes of atoms used to define "// &
424 "the region for the RESP fitting. The list should "// &
425 "contain indexes of atoms of the first surface layer.", &
426 usage=
"ATOM_LIST 1 2 3 or 1..3", &
427 type_of_var=
integer_t, n_var=-1, repeats=.true.)
432 description=
"Range where the fitting points are sampled. A range of "// &
433 "3 to 5 Angstroms means that the fitting points are sampled in the region "// &
434 "of 3 to 5 Angstroms above the surface which is defined by atom indexes given "// &
436 usage=
"RANGE <real> <real>", unit_str=
"angstrom", n_var=2, type_of_var=
real_t)
441 description=
"Length of the sampling box, i.e. a box of this length and "// &
442 "the height specified by RANGE is defined above each surface atom given "// &
443 "in ATOM_LIST. The grid points in the boxes are accepted as fitting point. "// &
444 "Should be in the range of the nearest neighbour distance (a bit larger to be "// &
445 "on the safe side). Allows for a refined sampling of grid points in case of "// &
446 "corrugated surfaces.", &
447 usage=
"LENGTH <real> ", unit_str=
"angstrom", n_var=1, type_of_var=
real_t, &
452 CALL keyword_create(keyword, __location__, name=
"SURF_DIRECTION", &
453 description=
"Specifies what above the surface means. Defines the direction.", &
454 usage=
"SURF_DIRECTION Z", &
455 enum_c_vals=
s2a(
"X",
"Y",
"Z",
"-X",
"-Y",
"-Z"), &
458 enum_desc=
s2a(
"surface layers are piled up in x-direction", &
459 "surface layers are piled up in y-direction", &
460 "surface layers are piled up in z-direction", &
461 "surface layers are piled up in -x-direction", &
462 "surface layers are piled up in -y-direction", &
463 "surface layers are piled up in -z-direction"), &
468 END SUBROUTINE create_slab_sampling_section
475 SUBROUTINE create_print_resp_section(section)
481 cpassert(.NOT.
ASSOCIATED(section))
482 NULLIFY (print_key, keyword)
484 description=
"Section of possible print options specific for the RESP code.", &
485 n_keywords=0, n_subsections=1, repeats=.false.)
488 description=
"Controls the printing of information regarding the run.", &
494 description=
"Controls the printing of the coordinates of the "// &
495 "grid points used for periodic RESP fitting. This section "// &
496 "is intended to be only used for testing (you can get large files).", &
498 filename=
"RESP_FIT_POINTS", &
499 common_iter_levels=3)
504 description=
"Controls the printing of the RESP charges "// &
507 filename=
"RESP_CHARGES", &
508 common_iter_levels=3)
513 description=
"Controls the printing of the potential generated "// &
514 "by the RESP CHARGES to a cube file. Prints the relative "// &
515 "root-mean-square (RRMS) and root-mean-square (RMS) errors.", &
517 filename=
"RESP_POTENTIAL", &
518 common_iter_levels=3)
520 description=
"The stride (X,Y,Z) used to write the cube file "// &
521 "(larger values result in smaller cube files). You can provide 3 numbers (for X,Y,Z) or"// &
522 " 1 number valid for all components.", &
523 usage=
"STRIDE 2 2 2", n_var=-1, default_i_vals=(/2, 2, 2/), type_of_var=
integer_t)
527 description=
"append the cube files when they already exist", &
528 default_l_val=.false., lone_keyword_l_val=.true.)
533 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.