-
Notifications
You must be signed in to change notification settings - Fork 384
/
input_cp2k_vib.F
367 lines (317 loc) · 20.8 KB
/
input_cp2k_vib.F
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
!--------------------------------------------------------------------------------------------------!
! CP2K: A general program to perform molecular dynamics simulations !
! Copyright 2000-2021 CP2K developers group <https://cp2k.org> !
! !
! SPDX-License-Identifier: GPL-2.0-or-later !
!--------------------------------------------------------------------------------------------------!
! **************************************************************************************************
!> \brief builds the input structure for the VIBRATIONAL_ANALYSIS module
!> \par History
!> 01.2008 [tlaino] Teodoro Laino - University of Zurich
!> Creating an own module for vibrational analysis
!> \author [tlaino]
! **************************************************************************************************
MODULE input_cp2k_vib
USE cp_output_handling, ONLY: add_last_numeric,&
cp_print_key_section_create,&
debug_print_level,&
low_print_level,&
medium_print_level,&
silent_print_level
USE cp_units, ONLY: cp_unit_to_cp2k
USE input_constants, ONLY: do_rep_blocked,&
do_rep_interleaved,&
ms_guess_atomic,&
ms_guess_bfgs,&
ms_guess_molden,&
ms_guess_restart,&
ms_guess_restart_vec
USE input_keyword_types, ONLY: keyword_create,&
keyword_release,&
keyword_type
USE input_section_types, ONLY: section_add_keyword,&
section_add_subsection,&
section_create,&
section_release,&
section_type
USE input_val_types, ONLY: integer_t,&
real_t
USE kinds, ONLY: dp
USE string_utilities, ONLY: s2a
#include "../base/base_uses.f90"
IMPLICIT NONE
PRIVATE
LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'input_cp2k_vib'
PUBLIC :: create_vib_section
CONTAINS
! **************************************************************************************************
!> \brief Creates the exteranal restart section
!> \param section the section to create
!> \author tlaino
! **************************************************************************************************
SUBROUTINE create_vib_section(section)
TYPE(section_type), POINTER :: section
TYPE(keyword_type), POINTER :: keyword
TYPE(section_type), POINTER :: subsection
CPASSERT(.NOT. ASSOCIATED(section))
CALL section_create( &
section, __LOCATION__, name="VIBRATIONAL_ANALYSIS", &
description="Section to setup parameters to perform a Normal Modes, vibrational, or phonon analysis. "// &
"Vibrations are computed using finite differences, "// &
"which implies a very tight (e.g. 1E-8) threshold is needed for EPS_SCF to get accurate low frequencies. "// &
"The analysis assumes a stationary state (minimum or TS),"// &
" i.e. tight geometry optimization (MAX_FORCE) is needed as well.", &
n_keywords=1, n_subsections=0, repeats=.FALSE.)
NULLIFY (keyword, subsection)
CALL keyword_create(keyword, __LOCATION__, name="DX", &
description="Specify the increment to be used to construct the HESSIAN with "// &
"finite difference method", &
default_r_val=1.0E-2_dp, unit_str="bohr")
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="NPROC_REP", &
description="Specify the number of processors to be used per replica "// &
"environment (for parallel runs). "// &
"In case of mode selective calculations more than one replica will start"// &
" a block Davidson algorithm to track more than only one frequency", &
default_i_val=1)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="PROC_DIST_TYPE", &
description="Specify the topology of the mapping of processors into replicas.", &
usage="PROC_DIST_TYPE (INTERLEAVED|BLOCKED)", &
enum_c_vals=s2a("INTERLEAVED", &
"BLOCKED"), &
enum_desc=s2a("Interleaved distribution", &
"Blocked distribution"), &
enum_i_vals=(/do_rep_interleaved, do_rep_blocked/), &
default_i_val=do_rep_blocked)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="FULLY_PERIODIC", &
description="Avoids to clean rotations from the Hessian matrix.", &
default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="INTENSITIES", &
description="Calculation of the IR-Intensities. Calculation of dipoles has to be specified explicitly ", &
default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="THERMOCHEMISTRY", &
description="Calculation of the thermochemical data. Valid for molecules in the gas phase. ", &
default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="TC_TEMPERATURE", &
description="Temperature for the calculation of the thermochemical data ", &
usage="tc_temperature 325.0", default_r_val=cp_unit_to_cp2k(value=273.150_dp, unit_str="K"), &
unit_str="K")
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="TC_PRESSURE", &
description="Pressure for the calculation of the thermochemical data ", &
default_r_val=cp_unit_to_cp2k(value=101325.0_dp, unit_str="Pa"), unit_str="Pa")
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL create_mode_selective_section(subsection)
CALL section_add_subsection(section, subsection)
CALL section_release(subsection)
CALL create_print_vib_section(subsection)
CALL section_add_subsection(section, subsection)
CALL section_release(subsection)
END SUBROUTINE create_vib_section
! **************************************************************************************************
!> \brief Create the print section for VIB
!> \param section the section to create
!> \author Teodoro Laino [tlaino] - 10.2008
! **************************************************************************************************
SUBROUTINE create_print_vib_section(section)
TYPE(section_type), POINTER :: section
TYPE(keyword_type), POINTER :: keyword
TYPE(section_type), POINTER :: print_key
CPASSERT(.NOT. ASSOCIATED(section))
CALL section_create(section, __LOCATION__, name="PRINT", &
description="Section controlling the print information during a vibrational "// &
"analysis.", n_keywords=1, n_subsections=0, repeats=.FALSE.)
NULLIFY (keyword, print_key)
CALL cp_print_key_section_create(print_key, __LOCATION__, "BANNER", &
description="Controls the printing of the vibrational analysis banner", &
print_level=low_print_level, common_iter_levels=1, &
filename="__STD_OUT__")
CALL section_add_subsection(section, print_key)
CALL section_release(print_key)
CALL cp_print_key_section_create(print_key, __LOCATION__, "PROGRAM_RUN_INFO", &
description="Controls the printing basic info about the vibrational method", &
print_level=medium_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
CALL section_add_subsection(section, print_key)
CALL section_release(print_key)
CALL cp_print_key_section_create(print_key, __LOCATION__, "MOLDEN_VIB", &
description="Controls the printing for visualization in molden format", &
print_level=low_print_level, add_last=add_last_numeric, filename="VIBRATIONS")
CALL section_add_subsection(section, print_key)
CALL section_release(print_key)
CALL cp_print_key_section_create(print_key, __LOCATION__, "ROTATIONAL_INFO", &
description="Controls the printing basic info during the cleaning of the "// &
"rotational degrees of freedom.", &
print_level=debug_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
! Print_key keywords
CALL keyword_create(keyword, __LOCATION__, name="COORDINATES", &
description="Prints atomic coordinates after rotation", &
default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
CALL section_add_keyword(print_key, keyword)
CALL keyword_release(keyword)
CALL section_add_subsection(section, print_key)
CALL section_release(print_key)
CALL cp_print_key_section_create(print_key, __LOCATION__, "CARTESIAN_EIGS", &
description="Controls the printing of Cartesian "// &
"frequencies and eigenvectors of the Hessian used "// &
"for initializing ensemble for MD calculations. "// &
"This should always print to a file, and will not "// &
"effect the same frequencies and eigenvectors printed "// &
"in the main vibrational analysis output", &
print_level=low_print_level, &
add_last=add_last_numeric, &
filename="VIBRATIONS")
CALL keyword_create(keyword, __LOCATION__, name="BACKUP_COPIES", &
description="Specifies the maximum index of backup copies.", &
usage="BACKUP_COPIES {int}", &
default_i_val=3)
CALL section_add_keyword(print_key, keyword)
CALL keyword_release(keyword)
CALL section_add_subsection(section, print_key)
CALL section_release(print_key)
CALL cp_print_key_section_create(print_key, __LOCATION__, "HESSIAN", &
description="Write the Hessian matrix from a vibrational analysis calculation "// &
"into a binary file.", &
print_level=low_print_level, add_last=add_last_numeric, filename="Hessian")
CALL section_add_subsection(section, print_key)
CALL section_release(print_key)
END SUBROUTINE create_print_vib_section
! **************************************************************************************************
!> \brief Create the input section for MODE selective
!> \param section the section to create
!> \author fschiff
! **************************************************************************************************
SUBROUTINE create_mode_selective_section(section)
TYPE(section_type), POINTER :: section
TYPE(keyword_type), POINTER :: keyword
TYPE(section_type), POINTER :: print_key, subsection
NULLIFY (keyword, subsection, print_key)
CPASSERT(.NOT. ASSOCIATED(section))
CALL section_create(section, __LOCATION__, name="MODE_SELECTIVE", &
description="All parameters needed for to run a mode selective vibrational analysis. "// &
"The keywords FREQUENCY, RANGE, and the subsection INVOLVED_ATOMS are mutually exclusive.", &
n_keywords=8, n_subsections=1, repeats=.FALSE.)
CALL keyword_create(keyword, __LOCATION__, name="FREQUENCY", &
description="value close to the expected value of the frequency to look for. "// &
"If the block Davidson algorithm is applied, the nrep closest frequencies are tracked. ", &
usage="FREQUENCY {REAL}", default_r_val=-1._dp)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="RANGE", &
description="Track modes in a given range of frequencies. "// &
"No warranty that the set of frequencies is complete.", &
usage="RANGE {REAL} {REAL}", &
n_var=-1, type_of_var=real_t)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="LOWEST_FREQUENCY", &
description="Lowest frequency mode to include when writing output. "// &
"Use a negative value to print imaginary frequencies. "// &
"Useful for visualizing the imaginary frequency along a reaction path coordinate "// &
"Depending on accuracy settings, the output might include spurious low frequency "// &
" imaginary modes which should be visually checked (see MOLDEN_VIB).", &
usage="LOWEST_FREQUENCY <REAL>", default_r_val=0.0_dp)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="ATOMS", &
description="Specifies the list of atoms which should be displaced for the Initial guess", &
usage="ATOMS {integer} {integer} .. {integer}", &
n_var=-1, type_of_var=integer_t)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="EPS_MAX_VAL", &
description="Convergence criterion for the davidson algorithm. Specifies the maximal value in the "// &
"residuum vectors ", &
usage="EPS_MAX_VAL {REAL}", default_r_val=5.0E-7_dp)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create( &
keyword, __LOCATION__, name="EPS_NORM", &
description="Convergence criterion for the davidson algorithm. Specifies the maximal value of the norm "// &
"of the residuum vectors ", &
usage="EPS_NORM {REAL}", default_r_val=2.0E-6_dp)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create( &
keyword, __LOCATION__, name="INITIAL_GUESS", &
description="The type of initial guess for the normal modes", &
usage="INITIAL_GUESS BFGS_HESS", &
default_i_val=ms_guess_atomic, &
enum_c_vals=s2a("BFGS_HESS", "ATOMIC", "RESTART", "RESTART_VEC", "MOLDEN_RESTART"), &
enum_desc=s2a("get the first displacement vector out of the BFGS approximate Hessian", &
"use random displacements for a set of atoms specified", &
"use data from MS_RESTART as initial guess", &
"use a vector from MS_RESTART, useful if you want to increase accurcy by changing functionals or basis", &
"use the .mol file of a former run, to restart a vector"// &
"(similar to Restart_vec, but a different file FORMAT is used)"), &
enum_i_vals=(/ms_guess_bfgs, ms_guess_atomic, ms_guess_restart, ms_guess_restart_vec, ms_guess_molden/))
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="RESTART_FILE_NAME", &
description="Specifies the name of the file used to create the restarted vectors", &
usage="RESTART_FILE_NAME {filename}", &
default_lc_val="")
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL create_involved_atoms_section(subsection)
CALL section_add_subsection(section, subsection)
CALL section_release(subsection)
CALL section_create(subsection, __LOCATION__, name="PRINT", &
description="Controls the printing mode selective vibrational analysis", &
n_keywords=0, n_subsections=1, repeats=.TRUE.)
CALL cp_print_key_section_create(print_key, __LOCATION__, "MS_RESTART", &
description="Controls the printing of the Mode Selective Restart file.", &
print_level=silent_print_level, common_iter_levels=1, &
add_last=add_last_numeric, filename="")
CALL section_add_subsection(subsection, print_key)
CALL section_release(print_key)
CALL section_add_subsection(section, subsection)
CALL section_release(subsection)
END SUBROUTINE create_mode_selective_section
! **************************************************************************************************
!> \brief Create the input section for Ivolved_atoms keyword in mode selective
!> \param section the section to create
!> \author fschiff
! **************************************************************************************************
SUBROUTINE create_involved_atoms_section(section)
TYPE(section_type), POINTER :: section
TYPE(keyword_type), POINTER :: keyword
NULLIFY (keyword)
CPASSERT(.NOT. ASSOCIATED(section))
CALL section_create( &
section, __LOCATION__, name="INVOLVED_ATOMS", &
description="All parameters needed for the tracking of modes dominated by the motion of selected atoms. "// &
"Warning, if many atoms are involved, only low frequency modes are detected, "// &
"since they are more delocalized and match the tracked eigenvector.", &
n_keywords=2, n_subsections=0, repeats=.FALSE.)
CALL keyword_create( &
keyword, __LOCATION__, name="RANGE", &
description=" Specifies the range of wavenumbers in which the modes related to the ATOMS have to be tracked. "// &
" If not specified frequencies >400cm-1 will be used to avoid tracking of translational or rotational modes", &
usage="RANGE {REAL} {REAL}", &
n_var=-1, type_of_var=real_t)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create( &
keyword, __LOCATION__, name="INVOLVED_ATOMS", &
description="Specifies the list of atoms on which the tracked eigenvector should have the highest value "// &
"similar to looking for the vibration of a set of atoms", &
usage="INVOLVED_ATOMS {integer} {integer} .. {integer}", &
n_var=-1, type_of_var=integer_t)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
END SUBROUTINE create_involved_atoms_section
END MODULE input_cp2k_vib