(git:9aade48)
Loading...
Searching...
No Matches
input_cp2k_field.F
Go to the documentation of this file.
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! **************************************************************************************************
9!> \brief function that build the field section of the input
10!> \par History
11!> 02.2017 moved out of input_cp2k_dft [JHU]
12!> \author fawzi
13! **************************************************************************************************
15 USE bibliography, ONLY: souza2002, &
18 USE input_constants, ONLY: constant_env, &
19 custom_env, &
20 gaussian, &
31 USE input_val_types, ONLY: char_t, &
32 real_t
33 USE kinds, ONLY: dp
34 USE string_utilities, ONLY: s2a
35#include "./base/base_uses.f90"
36
37 IMPLICIT NONE
38 PRIVATE
39
40 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'input_cp2k_field'
41
43
44CONTAINS
45
46! **************************************************************************************************
47!> \brief creates the section for static periodic fields
48!> \param section ...
49!> \author Florian Schiffmann
50! **************************************************************************************************
51 SUBROUTINE create_per_efield_section(section)
52 TYPE(section_type), POINTER :: section
53
54 TYPE(keyword_type), POINTER :: keyword
55
56 cpassert(.NOT. ASSOCIATED(section))
57 CALL section_create(section, __location__, name="PERIODIC_EFIELD", &
58 description="parameters for finite periodic electric field computed using"// &
59 " the Berry phase approach. IMPORTANT: Can only be used in combination"// &
60 " with OT. Can not be used in combination with RTP or EMD,"// &
61 " e.g. RESTART_RTP has to be .FALSE. when restarting the job.", &
62 citations=[souza2002, umari2002], &
63 n_keywords=6, n_subsections=1, repeats=.true.)
64
65 NULLIFY (keyword)
66
67 CALL keyword_create(keyword, __location__, name="INTENSITY", &
68 description="Intensity of the electric field in a.u, "// &
69 "not allowed together with INTENSITY_LIST", &
70 usage="INTENSITY 0.001", &
71 default_r_val=0._dp)
72 CALL section_add_keyword(section, keyword)
73 CALL keyword_release(keyword)
74
75 CALL keyword_create(keyword, __location__, name="POLARISATION", &
76 description="Polarisation vector of electric field", &
77 usage="POLARISATION 0.0 0.0 1.0", &
78 repeats=.false., n_var=3, &
79 type_of_var=real_t, default_r_vals=[0.0_dp, 0.0_dp, 1.0_dp])
80 CALL section_add_keyword(section, keyword)
81 CALL keyword_release(keyword)
82
83 CALL keyword_create(keyword, __location__, name="DISPLACEMENT_FIELD", &
84 description="Use the displacement field formulation.", &
85 usage="DISPLACEMENT_FIELD T", &
86 citations=[stengel2009], &
87 default_l_val=.false., &
88 lone_keyword_l_val=.true.)
89 CALL section_add_keyword(section, keyword)
90 CALL keyword_release(keyword)
91
92 CALL keyword_create(keyword, __location__, name="D_FILTER", &
93 description="Filter for displacement field (x,y,z-direction)", &
94 usage="D_FILTER 1.0 0.0 0.0", &
95 repeats=.false., n_var=3, &
96 type_of_var=real_t, default_r_vals=[1.0_dp, 1.0_dp, 1.0_dp])
97 CALL section_add_keyword(section, keyword)
98 CALL keyword_release(keyword)
99
100 CALL keyword_create(keyword, __location__, name="INTENSITY_LIST", &
101 description="Intensities of the electric field in a.u. "// &
102 "They are applied sequentially, one per frame. "// &
103 "If the number of frames exceeds the number of values, "// &
104 "the list is cyclically repeated. Attention: not implemented for eeq.", &
105 usage="INTENSITY_LIST {real} {real} .. {real}", &
106 n_var=-1, type_of_var=real_t, default_r_vals=[0.0_dp])
107 CALL section_add_keyword(section, keyword)
108 CALL keyword_release(keyword)
109
110 CALL keyword_create(keyword, __location__, name="INTENSITIES_FILE_NAME", &
111 description="File containting a list of intensities, "// &
112 "one per line, in a.u. "// &
113 "They are applied sequentially, one per frame. "// &
114 "If the number of frames exceeds the number of values, "// &
115 "the list is cyclically repeated. Attention: not implemented for eeq.", &
116 usage="INTENSITIES_FILE_NAME filename", &
117 default_lc_val="")
118 CALL section_add_keyword(section, keyword)
119 CALL keyword_release(keyword)
120
121 CALL keyword_create(keyword, __location__, name="START_FRAME", &
122 description="First frame the field is applied. "// &
123 "(0: first frame) "// &
124 "Attention: ignored for eeq", &
125 usage="START_FRAME 0", &
126 default_i_val=0)
127 CALL section_add_keyword(section, keyword)
128 CALL keyword_release(keyword)
129
130 CALL keyword_create(keyword, __location__, name="END_FRAME", &
131 description="Last frame the field is applied. "// &
132 "If an end frame is specified, the number of active frames "// &
133 "must be a multiple of the number of "// &
134 "the given intensity values. (-1: no end) "// &
135 "Attention: ignored for eeq", &
136 usage="END_FRAME -1", &
137 default_i_val=-1)
138 CALL section_add_keyword(section, keyword)
139 CALL keyword_release(keyword)
140
141 END SUBROUTINE create_per_efield_section
142! **************************************************************************************************
143!> \brief creates the section for time dependent nonperiodic fields
144!> \param section ...
145!> \author Florian Schiffmann
146! **************************************************************************************************
147 SUBROUTINE create_efield_section(section)
148 TYPE(section_type), POINTER :: section
149
150 TYPE(keyword_type), POINTER :: keyword
151 TYPE(section_type), POINTER :: subsection
152
153 cpassert(.NOT. ASSOCIATED(section))
154 CALL section_create(section, __location__, name="EFIELD", &
155 description="Parameters for finite, time dependent electric fields. "// &
156 "For time dependent propagation in periodic systems, set "// &
157 "DFT%REAL_TIME_PROPAGATION%VELOCITY_GAUGE to true. "// &
158 "For static fields use EXTERNAL_POTENTIAL.", &
159 n_keywords=6, n_subsections=1, repeats=.true.)
160
161 NULLIFY (keyword, subsection)
162
163 CALL keyword_create(keyword, __location__, name="INTENSITY", &
164 description="Intensity of the electric field. "// &
165 "For real-time propagation (RTP) calculations, the intensity is in "// &
166 "$\mathrm{W/cm^2}$. The corresponding peak electric field amplitude "// &
167 "$E_0$ in atomic units ($E_H/a_B \approx 82.4\,\mathrm{V/nm}$) is "// &
168 "$E_0 = \sqrt{I\,[\mathrm{W/cm^2}]\;/\;(3.5094410 \cdot 10^{16})} "// &
169 "\cdot E_H/a_B$, "// &
170 "derived from the atomic unit of energy flux $I_0 = cE_H^2/(8\pi)$ "// &
171 "and the relation $I = E_0^2$ in atomic units. "// &
172 "For a constant local field in an isolated-system calculation, "// &
173 "units are in a.u. In place of intensity, AMPLITUDE can be provided.", &
174 usage="INTENSITY 0.001", &
175 default_r_val=0._dp)
176 CALL section_add_keyword(section, keyword)
177 CALL keyword_release(keyword)
178
179 CALL keyword_create(keyword, __location__, name="AMPLITUDE", &
180 description="Amplitude of the electric field of the light wave. "// &
181 "One can specify either INTENSITY or AMPLITUDE. An error will be "// &
182 "raised if both are specified.", &
183 usage="AMPLITUDE [Vnm-1] 1.06", unit_str="Vm-1", &
184 default_r_val=0._dp)
185 CALL section_add_keyword(section, keyword)
186 CALL keyword_release(keyword)
187
188 CALL keyword_create(keyword, __location__, name="POLARISATION", &
189 description="Polarisation vector of electric field", &
190 usage="POLARISATION 0.0 0.0 1.0", &
191 repeats=.false., n_var=3, &
192 type_of_var=real_t, default_r_vals=[0.0_dp, 0.0_dp, 1.0_dp])
193 CALL section_add_keyword(section, keyword)
194 CALL keyword_release(keyword)
195
196 CALL keyword_create(keyword, __location__, name="WAVELENGTH", &
197 description="Wavelength of efield field for real-time propagation (RTP) calculations.", &
198 usage="Wavelength 1.E0", &
199 default_r_val=0._dp, unit_str="nm")
200 CALL section_add_keyword(section, keyword)
201 CALL keyword_release(keyword)
202
203 CALL keyword_create(keyword, __location__, name="PHASE", &
204 description="Phase offset of the cosine given in multiples of pi. "// &
205 "Used in real-time propagation (RTP) calculations.", &
206 usage="Phase 1.E0", &
207 default_r_val=0._dp)
208 CALL section_add_keyword(section, keyword)
209 CALL keyword_release(keyword)
210
211 CALL keyword_create(keyword, __location__, name="ENVELOP", &
212 description="Shape of the efield pulse used in real-time propagation (RTP) calculations.", &
213 usage="ENVELOP CONSTANT", &
214 default_i_val=constant_env, &
215 enum_c_vals=s2a("CONSTANT", "GAUSSIAN", "RAMP", "CUSTOM"), &
216 enum_desc=s2a("No envelop function is applied to the strength", &
217 "A Gaussian function is used as envelop ", &
218 "Linear tune in/out of the field", &
219 "A custom field read from a file"), &
221 CALL section_add_keyword(section, keyword)
222 CALL keyword_release(keyword)
223
224 CALL keyword_create(keyword, __location__, name="VEC_POT_INITIAL", &
225 description="Initial value of the vector "// &
226 "potential (for velocity gauge). This input is "// &
227 "made especially for restarting RTP calculation. "// &
228 "Unit is atomic unit. "// &
229 "Note that if several field sections are defined, only the first one will be used.", &
230 usage="vec_pot_initial 1.0E-2 0.0 0.0", &
231 repeats=.false., &
232 n_var=3, type_of_var=real_t, &
233 default_r_vals=[0.0_dp, 0.0_dp, 0.0_dp])
234 CALL section_add_keyword(section, keyword)
235 CALL keyword_release(keyword)
236
237 CALL create_constant_env_section(subsection)
238 CALL section_add_subsection(section, subsection)
239 CALL section_release(subsection)
240
241 CALL create_gaussian_env_section(subsection)
242 CALL section_add_subsection(section, subsection)
243 CALL section_release(subsection)
244
245 CALL create_ramp_env_section(subsection)
246 CALL section_add_subsection(section, subsection)
247 CALL section_release(subsection)
248
249 CALL create_custom_env_section(subsection)
250 CALL section_add_subsection(section, subsection)
251 CALL section_release(subsection)
252
253 END SUBROUTINE create_efield_section
254
255! **************************************************************************************************
256!> \brief ...
257!> \param section ...
258! **************************************************************************************************
259 SUBROUTINE create_constant_env_section(section)
260 TYPE(section_type), POINTER :: section
261
262 TYPE(keyword_type), POINTER :: keyword
263
264 cpassert(.NOT. ASSOCIATED(section))
265 CALL section_create(section, __location__, name="CONSTANT_ENV", &
266 description="parameters for a constant envelop", &
267 n_keywords=6, n_subsections=1, repeats=.true.)
268
269 NULLIFY (keyword)
270
271 CALL keyword_create(keyword, __location__, name="START_STEP", &
272 description="First step the field is applied ", &
273 usage="START_STEP 0", &
274 default_i_val=0)
275 CALL section_add_keyword(section, keyword)
276 CALL keyword_release(keyword)
277
278 CALL keyword_create(keyword, __location__, name="END_STEP", &
279 description="Last step the field is applied", &
280 usage="END_STEP 2", &
281 default_i_val=-1)
282 CALL section_add_keyword(section, keyword)
283 CALL keyword_release(keyword)
284
285 END SUBROUTINE create_constant_env_section
286
287! **************************************************************************************************
288!> \brief ...
289!> \param section ...
290! **************************************************************************************************
291 SUBROUTINE create_gaussian_env_section(section)
292 TYPE(section_type), POINTER :: section
293
294 TYPE(keyword_type), POINTER :: keyword
295
296 cpassert(.NOT. ASSOCIATED(section))
297 CALL section_create(section, __location__, name="GAUSSIAN_ENV", &
298 description="parameters for a gaussian envelop", &
299 n_keywords=6, n_subsections=1, repeats=.true.)
300
301 NULLIFY (keyword)
302
303 CALL keyword_create(keyword, __location__, name="T0", &
304 description="Center of the gaussian envelop (maximum of the gaussian)", &
305 usage="T0 2.0E0", &
306 default_r_val=0.0e0_dp, &
307 unit_str="fs")
308 CALL section_add_keyword(section, keyword)
309 CALL keyword_release(keyword)
310
311 CALL keyword_create(keyword, __location__, name="SIGMA", &
312 description="Width of the gaussian ", &
313 usage="SIGMA 2.0E0", &
314 default_r_val=-1.0e0_dp, &
315 unit_str="fs")
316 CALL section_add_keyword(section, keyword)
317 CALL keyword_release(keyword)
318
319 END SUBROUTINE create_gaussian_env_section
320
321! **************************************************************************************************
322!> \brief ...
323!> \param section ...
324! **************************************************************************************************
325 SUBROUTINE create_ramp_env_section(section)
326 TYPE(section_type), POINTER :: section
327
328 TYPE(keyword_type), POINTER :: keyword
329
330 cpassert(.NOT. ASSOCIATED(section))
331 CALL section_create(section, __location__, name="RAMP_ENV", &
332 description="Parameters for an trapeziodal envelop ", &
333 n_keywords=6, n_subsections=1, repeats=.true.)
334
335 NULLIFY (keyword)
336
337 CALL keyword_create(keyword, __location__, name="START_STEP_IN", &
338 description="Step when the electric field starts to be applied ", &
339 usage="START_STEP_IN 0", &
340 default_i_val=0)
341 CALL section_add_keyword(section, keyword)
342 CALL keyword_release(keyword)
343
344 CALL keyword_create(keyword, __location__, name="END_STEP_IN", &
345 description="Step when the field reaches the full strength", &
346 usage="END_STEP_IN 2", &
347 default_i_val=-1)
348 CALL section_add_keyword(section, keyword)
349 CALL keyword_release(keyword)
350
351 CALL keyword_create(keyword, __location__, name="START_STEP_OUT", &
352 description="Step when the field starts to vanish ", &
353 usage="START_STEP_OUT 0", &
354 default_i_val=0)
355 CALL section_add_keyword(section, keyword)
356 CALL keyword_release(keyword)
357
358 CALL keyword_create(keyword, __location__, name="END_STEP_OUT", &
359 description="Step when the field disappears", &
360 usage="END_STEP_OUT 2", &
361 default_i_val=-1)
362 CALL section_add_keyword(section, keyword)
363 CALL keyword_release(keyword)
364
365 END SUBROUTINE create_ramp_env_section
366
367! **************************************************************************************************
368!> \brief ...
369!> \param section ...
370! **************************************************************************************************
371 SUBROUTINE create_custom_env_section(section)
372 TYPE(section_type), POINTER :: section
373
374 TYPE(keyword_type), POINTER :: keyword
375
376 cpassert(.NOT. ASSOCIATED(section))
377 CALL section_create(section, __location__, name="CUSTOM_ENV", &
378 description="Parameters for a custom efield", &
379 n_keywords=2, n_subsections=1, repeats=.true.)
380
381 NULLIFY (keyword)
382
383 CALL keyword_create(keyword, __location__, name="EFIELD_FILE_NAME", &
384 description="Specify file that contains the electric field [V/m].", &
385 usage="EFIELD_FILE_NAME filename", &
386 n_var=1, type_of_var=char_t, default_c_val="")
387 CALL section_add_keyword(section, keyword)
388 CALL keyword_release(keyword)
389
390 CALL keyword_create(keyword, __location__, name="TIMESTEP", &
391 description="The time step between the entries in the list with the electric field.", &
392 usage="TIMESTEP 1", &
393 unit_str="fs", &
394 default_r_val=1.0_dp)
395 CALL section_add_keyword(section, keyword)
396 CALL keyword_release(keyword)
397
398 END SUBROUTINE create_custom_env_section
399
400END MODULE input_cp2k_field
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public umari2002
integer, save, public stengel2009
integer, save, public souza2002
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public ramp_env
integer, parameter, public constant_env
integer, parameter, public gaussian_env
integer, parameter, public gaussian
integer, parameter, public custom_env
function that build the field section of the input
subroutine, public create_efield_section(section)
creates the section for time dependent nonperiodic fields
subroutine, public create_per_efield_section(section)
creates the section for static periodic fields
represents keywords in an input
subroutine, public keyword_release(keyword)
releases the given keyword (see doc/ReferenceCounting.html)
subroutine, public keyword_create(keyword, location, name, description, usage, type_of_var, n_var, repeats, variants, default_val, default_l_val, default_r_val, default_lc_val, default_c_val, default_i_val, default_l_vals, default_r_vals, default_c_vals, default_i_vals, lone_keyword_val, lone_keyword_l_val, lone_keyword_r_val, lone_keyword_c_val, lone_keyword_i_val, lone_keyword_l_vals, lone_keyword_r_vals, lone_keyword_c_vals, lone_keyword_i_vals, enum_c_vals, enum_i_vals, enum, enum_strict, enum_desc, unit_str, citations, deprecation_notice, removed)
creates a keyword object
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_create(section, location, name, description, n_keywords, n_subsections, repeats, citations, deprecation_notice)
creates a list of keywords
subroutine, public section_add_keyword(section, keyword)
adds a keyword to the given section
subroutine, public section_add_subsection(section, subsection)
adds a subsection to the given section
recursive subroutine, public section_release(section)
releases the given keyword list (see doc/ReferenceCounting.html)
a wrapper for basic fortran types.
integer, parameter, public real_t
integer, parameter, public char_t
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Utilities for string manipulations.
represent a keyword in the input
represent a section of the input file