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 Input section for NEGF based quantum transport calculations.
10 : ! **************************************************************************************************
11 :
12 : MODULE input_cp2k_negf
13 : USE bibliography, ONLY: Bailey2006,&
14 : Papior2017
15 : USE cp_output_handling, ONLY: cp_print_key_section_create,&
16 : debug_print_level,&
17 : high_print_level,&
18 : low_print_level,&
19 : medium_print_level,&
20 : silent_print_level
21 : USE input_constants, ONLY: negfint_method_cc,&
22 : negfint_method_simpson
23 : USE input_keyword_types, ONLY: keyword_create,&
24 : keyword_release,&
25 : keyword_type
26 : USE input_section_types, ONLY: section_add_keyword,&
27 : section_add_subsection,&
28 : section_create,&
29 : section_release,&
30 : section_type
31 : USE input_val_types, ONLY: char_t,&
32 : integer_t,&
33 : real_t
34 : USE kinds, ONLY: dp
35 : USE physcon, ONLY: kelvin
36 : USE qs_density_mixing_types, ONLY: create_mixing_section
37 : USE string_utilities, ONLY: s2a
38 : #include "./base/base_uses.f90"
39 :
40 : IMPLICIT NONE
41 : PRIVATE
42 :
43 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'input_cp2k_negf'
44 :
45 : PUBLIC :: create_negf_section
46 :
47 : CONTAINS
48 :
49 : ! **************************************************************************************************
50 : !> \brief Create NEGF input section.
51 : !> \param section input section
52 : !> \par History
53 : !> * 02.2017 created [Sergey Chulkov]
54 : ! **************************************************************************************************
55 8530 : SUBROUTINE create_negf_section(section)
56 : TYPE(section_type), POINTER :: section
57 :
58 : TYPE(keyword_type), POINTER :: keyword
59 : TYPE(section_type), POINTER :: print_key, subsection
60 :
61 8530 : CPASSERT(.NOT. ASSOCIATED(section))
62 : CALL section_create(section, __LOCATION__, name="NEGF", &
63 : description="Parameters which control quantum transport calculation"// &
64 : " based on Non-Equilibrium Green's Function method.", &
65 : citations=(/Bailey2006, Papior2017/), &
66 25590 : n_keywords=18, n_subsections=6, repeats=.FALSE.)
67 :
68 8530 : NULLIFY (keyword, print_key, subsection)
69 :
70 8530 : CALL create_contact_section(subsection)
71 8530 : CALL section_add_subsection(section, subsection)
72 8530 : CALL section_release(subsection)
73 :
74 8530 : CALL create_atomlist_section(subsection, "SCATTERING_REGION", "Defines atoms which form the scattering region.", .FALSE.)
75 8530 : CALL section_add_subsection(section, subsection)
76 8530 : CALL section_release(subsection)
77 :
78 : ! mixing section
79 8530 : CALL create_mixing_section(subsection, ls_scf=.FALSE.)
80 8530 : CALL section_add_subsection(section, subsection)
81 8530 : CALL section_release(subsection)
82 :
83 : CALL keyword_create(keyword, __LOCATION__, name="DISABLE_CACHE", &
84 : description="Do not keep contact self-energy matrices for future reuse", &
85 8530 : default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
86 8530 : CALL section_add_keyword(section, keyword)
87 8530 : CALL keyword_release(keyword)
88 :
89 : ! convergence thresholds
90 : CALL keyword_create(keyword, __LOCATION__, name="EPS_DENSITY", &
91 : description="Target accuracy for electronic density.", &
92 8530 : n_var=1, type_of_var=real_t, default_r_val=1.0e-5_dp)
93 8530 : CALL section_add_keyword(section, keyword)
94 8530 : CALL keyword_release(keyword)
95 :
96 : CALL keyword_create(keyword, __LOCATION__, name="EPS_GREEN", &
97 : description="Target accuracy for surface Green's functions.", &
98 8530 : n_var=1, type_of_var=real_t, default_r_val=1.0e-5_dp)
99 8530 : CALL section_add_keyword(section, keyword)
100 8530 : CALL keyword_release(keyword)
101 :
102 : CALL keyword_create(keyword, __LOCATION__, name="EPS_SCF", &
103 : description="Target accuracy for SCF convergence.", &
104 8530 : n_var=1, type_of_var=real_t, default_r_val=1.0e-5_dp)
105 8530 : CALL section_add_keyword(section, keyword)
106 8530 : CALL keyword_release(keyword)
107 :
108 : CALL keyword_create(keyword, __LOCATION__, name="EPS_GEO", &
109 : description="Accuracy in mapping atoms between different force environments.", &
110 : n_var=1, type_of_var=real_t, unit_str="angstrom", &
111 8530 : default_r_val=1.0e-6_dp)
112 8530 : CALL section_add_keyword(section, keyword)
113 8530 : CALL keyword_release(keyword)
114 :
115 : CALL keyword_create(keyword, __LOCATION__, name="ENERGY_LBOUND", &
116 : description="Lower bound energy of the conductance band.", &
117 : n_var=1, type_of_var=real_t, unit_str="hartree", &
118 8530 : default_r_val=-5.0_dp)
119 8530 : CALL section_add_keyword(section, keyword)
120 8530 : CALL keyword_release(keyword)
121 :
122 : CALL keyword_create(keyword, __LOCATION__, name="ETA", &
123 : description="Infinitesimal offset from the real axis.", &
124 : n_var=1, type_of_var=real_t, unit_str="hartree", &
125 8530 : default_r_val=1.0e-5_dp)
126 8530 : CALL section_add_keyword(section, keyword)
127 8530 : CALL keyword_release(keyword)
128 :
129 : CALL keyword_create(keyword, __LOCATION__, name="HOMO_LUMO_GAP", &
130 : description="The gap between the HOMO and some fictitious LUMO. This option is used as"// &
131 : " an initial offset to determine the actual Fermi level of bulk contacts."// &
132 : " It does not need to be exact HOMO-LUMO gap, just some value to start with.", &
133 : n_var=1, type_of_var=real_t, unit_str="hartree", &
134 8530 : default_r_val=0.2_dp)
135 8530 : CALL section_add_keyword(section, keyword)
136 8530 : CALL keyword_release(keyword)
137 :
138 : CALL keyword_create(keyword, __LOCATION__, name="DELTA_NPOLES", &
139 : description="Number of poles of Fermi function to consider.", &
140 : n_var=1, type_of_var=integer_t, &
141 8530 : default_i_val=4)
142 8530 : CALL section_add_keyword(section, keyword)
143 8530 : CALL keyword_release(keyword)
144 :
145 : CALL keyword_create(keyword, __LOCATION__, name="GAMMA_KT", &
146 : description="Offset from the axis (in terms of k*T)"// &
147 : " where poles of the Fermi function reside.", &
148 : n_var=1, type_of_var=integer_t, &
149 8530 : default_i_val=20)
150 8530 : CALL section_add_keyword(section, keyword)
151 8530 : CALL keyword_release(keyword)
152 :
153 : CALL keyword_create(keyword, __LOCATION__, name="INTEGRATION_METHOD", &
154 : description="Method to integrate Green's functions along a closed-circuit contour.", &
155 : default_i_val=negfint_method_cc, &
156 : enum_c_vals=s2a("CLENSHAW-CURTIS", "SIMPSON"), &
157 : enum_desc=s2a( &
158 : "Adaptive Clenshaw-Curtis quadrature method. Requires FFTW3 library.", &
159 : "Adaptive Simpson method. Works without FFTW3."), &
160 8530 : enum_i_vals=(/negfint_method_cc, negfint_method_simpson/))
161 8530 : CALL section_add_keyword(section, keyword)
162 8530 : CALL keyword_release(keyword)
163 :
164 : CALL keyword_create(keyword, __LOCATION__, name="INTEGRATION_MIN_POINTS", &
165 : description="Initial (minimal) number of grid point for adaptive numerical integration.", &
166 : n_var=1, type_of_var=integer_t, &
167 8530 : default_i_val=16)
168 8530 : CALL section_add_keyword(section, keyword)
169 8530 : CALL keyword_release(keyword)
170 :
171 : CALL keyword_create(keyword, __LOCATION__, name="INTEGRATION_MAX_POINTS", &
172 : description="Maximal number of grid point for adaptive numerical integration.", &
173 : n_var=1, type_of_var=integer_t, &
174 8530 : default_i_val=512)
175 8530 : CALL section_add_keyword(section, keyword)
176 8530 : CALL keyword_release(keyword)
177 :
178 : CALL keyword_create(keyword, __LOCATION__, name="MAX_SCF", &
179 : description="Maximum number of SCF iterations to be performed.", &
180 : n_var=1, type_of_var=integer_t, &
181 8530 : default_i_val=30)
182 8530 : CALL section_add_keyword(section, keyword)
183 8530 : CALL keyword_release(keyword)
184 :
185 : CALL keyword_create(keyword, __LOCATION__, name="NPROC_POINT", &
186 : description="Number of MPI processes to be used per energy point."// &
187 : " Default is to use all processors (0).", &
188 : n_var=1, type_of_var=integer_t, &
189 8530 : default_i_val=0)
190 8530 : CALL section_add_keyword(section, keyword)
191 8530 : CALL keyword_release(keyword)
192 :
193 : CALL keyword_create(keyword, __LOCATION__, name="V_SHIFT", &
194 : description="Initial value of the Hartree potential shift", &
195 : n_var=1, type_of_var=real_t, unit_str="hartree", &
196 8530 : default_r_val=0.0_dp)
197 8530 : CALL section_add_keyword(section, keyword)
198 8530 : CALL keyword_release(keyword)
199 :
200 : CALL keyword_create(keyword, __LOCATION__, name="V_SHIFT_OFFSET", &
201 : description="Initial offset to determine the optimal shift in Hartree potential.", &
202 8530 : n_var=1, type_of_var=real_t, default_r_val=0.10_dp)
203 8530 : CALL section_add_keyword(section, keyword)
204 8530 : CALL keyword_release(keyword)
205 :
206 : CALL keyword_create(keyword, __LOCATION__, name="V_SHIFT_MAX_ITERS", &
207 : description="Maximal number of iteration to determine the optimal shift in Hartree potential.", &
208 8530 : n_var=1, type_of_var=integer_t, default_i_val=30)
209 8530 : CALL section_add_keyword(section, keyword)
210 8530 : CALL keyword_release(keyword)
211 :
212 : ! PRINT subsection
213 : CALL section_create(subsection, __LOCATION__, "PRINT", "Printing of information during the NEGF.", &
214 8530 : repeats=.FALSE.)
215 :
216 8530 : CALL create_print_program_run_info_section(print_key)
217 8530 : CALL section_add_subsection(subsection, print_key)
218 8530 : CALL section_release(print_key)
219 :
220 8530 : CALL create_print_dos_section(print_key, "DOS", "the Density of States (DOS) in the scattering region")
221 8530 : CALL section_add_subsection(subsection, print_key)
222 8530 : CALL section_release(print_key)
223 :
224 8530 : CALL create_print_dos_section(print_key, "TRANSMISSION", "the transmission coefficient")
225 8530 : CALL section_add_subsection(subsection, print_key)
226 8530 : CALL section_release(print_key)
227 :
228 8530 : CALL section_add_subsection(section, subsection)
229 8530 : CALL section_release(subsection)
230 :
231 8530 : END SUBROUTINE create_negf_section
232 :
233 : ! **************************************************************************************************
234 : !> \brief Create NEGF%CONTACT input section.
235 : !> \param section input section
236 : !> \par History
237 : !> * 09.2017 split from create_negf_section() [Sergey Chulkov]
238 : ! **************************************************************************************************
239 8530 : SUBROUTINE create_contact_section(section)
240 : TYPE(section_type), POINTER :: section
241 :
242 : TYPE(keyword_type), POINTER :: keyword
243 : TYPE(section_type), POINTER :: print_key, subsection, subsection2
244 :
245 8530 : CPASSERT(.NOT. ASSOCIATED(section))
246 :
247 : CALL section_create(section, __LOCATION__, name="CONTACT", &
248 : description="Section defining the contact region of NEGF setup.", &
249 8530 : n_keywords=5, n_subsections=3, repeats=.TRUE.)
250 :
251 8530 : NULLIFY (keyword, print_key, subsection, subsection2)
252 :
253 : CALL create_atomlist_section(subsection, "BULK_REGION", &
254 8530 : "the bulk contact adjacent to the screening region.", .FALSE.)
255 8530 : CALL section_add_subsection(section, subsection)
256 : CALL create_atomlist_section(subsection2, "CELL", &
257 : "a single bulk contact unit cell. Bulk Hamiltonian will be contstructed "// &
258 : "using two such unit cells instead of performing k-point bulk calculation. "// &
259 8530 : "FORCE_EVAL_SECTION must be 0.", .TRUE.)
260 8530 : CALL section_add_subsection(subsection, subsection2)
261 8530 : CALL section_release(subsection2)
262 8530 : CALL section_release(subsection)
263 :
264 : CALL create_atomlist_section(subsection, "SCREENING_REGION", &
265 8530 : "the given contact adjacent to the scattering region.", .FALSE.)
266 8530 : CALL section_add_subsection(section, subsection)
267 8530 : CALL section_release(subsection)
268 :
269 : CALL keyword_create(keyword, __LOCATION__, name="FORCE_EVAL_SECTION", &
270 : description=" Index of the FORCE_EVAL section which will be used for bulk calculation.", &
271 8530 : n_var=1, type_of_var=integer_t, 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="ELECTRIC_POTENTIAL", &
276 : description="External electrostatic potential applied to the given contact.", &
277 : n_var=1, type_of_var=real_t, unit_str="hartree", &
278 8530 : default_r_val=0.0_dp)
279 8530 : CALL section_add_keyword(section, keyword)
280 8530 : CALL keyword_release(keyword)
281 :
282 : CALL keyword_create(keyword, __LOCATION__, name="FERMI_LEVEL", &
283 : description="Contact Fermi level at the given temperature."// &
284 : " If this keyword is not given explicitly, the Fermi level"// &
285 : " will be automatically computed prior the actual NEGF calculation.", &
286 : n_var=1, type_of_var=real_t, unit_str="hartree", &
287 8530 : default_r_val=0.0_dp)
288 8530 : CALL section_add_keyword(section, keyword)
289 8530 : CALL keyword_release(keyword)
290 :
291 : CALL keyword_create(keyword, __LOCATION__, name="REFINE_FERMI_LEVEL", &
292 : description="Compute the Fermi level using the value from the FERMI_LEVEL keyword"// &
293 : " as a starting point. By default the Fermi level is computed only"// &
294 : " when the keyword FERMI_LEVEL is not given explicitly.", &
295 8530 : default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
296 8530 : CALL section_add_keyword(section, keyword)
297 8530 : CALL keyword_release(keyword)
298 :
299 : CALL keyword_create(keyword, __LOCATION__, name="TEMPERATURE", &
300 : description="Electronic temperature.", &
301 : n_var=1, type_of_var=real_t, unit_str="K", &
302 8530 : default_r_val=300.0_dp/kelvin)
303 8530 : CALL section_add_keyword(section, keyword)
304 8530 : CALL keyword_release(keyword)
305 :
306 : ! PRINT subsection
307 : CALL section_create(subsection, __LOCATION__, "PRINT", "Print properties for the given contact.", &
308 8530 : repeats=.FALSE.)
309 :
310 8530 : CALL create_print_dos_section(print_key, "DOS", "the Density of States (DOS)")
311 8530 : CALL section_add_subsection(subsection, print_key)
312 8530 : CALL section_release(print_key)
313 :
314 8530 : CALL section_add_subsection(section, subsection)
315 8530 : CALL section_release(subsection)
316 :
317 8530 : END SUBROUTINE create_contact_section
318 :
319 : ! **************************************************************************************************
320 : !> \brief Create an atomic list section.
321 : !> \param section NEGF section
322 : !> \param name name of the new section
323 : !> \param description section description
324 : !> \param repeats whether the section can be repeated
325 : !> \par History
326 : !> * 02.2017 created [Sergey Chulkov]
327 : ! **************************************************************************************************
328 34120 : SUBROUTINE create_atomlist_section(section, name, description, repeats)
329 : TYPE(section_type), POINTER :: section
330 : CHARACTER(len=*), INTENT(in) :: name, description
331 : LOGICAL, INTENT(in) :: repeats
332 :
333 : TYPE(keyword_type), POINTER :: keyword
334 :
335 0 : CPASSERT(.NOT. ASSOCIATED(section))
336 :
337 : CALL section_create(section, __LOCATION__, name=TRIM(ADJUSTL(name)), &
338 : description="Atoms belonging to "//TRIM(ADJUSTL(description)), &
339 34120 : n_keywords=2, n_subsections=0, repeats=repeats)
340 :
341 34120 : NULLIFY (keyword)
342 :
343 : CALL keyword_create(keyword, __LOCATION__, name="LIST", &
344 : description="Specifies a list of atoms.", &
345 : usage="LIST {integer} {integer} .. {integer}", repeats=.TRUE., &
346 34120 : n_var=-1, type_of_var=integer_t)
347 34120 : CALL section_add_keyword(section, keyword)
348 34120 : CALL keyword_release(keyword)
349 :
350 : CALL keyword_create(keyword, __LOCATION__, name="MOLNAME", &
351 : description="Specifies a list of named molecular fragments.", &
352 : usage="MOLNAME WAT MEOH", repeats=.TRUE., &
353 34120 : n_var=-1, type_of_var=char_t)
354 34120 : CALL section_add_keyword(section, keyword)
355 34120 : CALL keyword_release(keyword)
356 34120 : END SUBROUTINE create_atomlist_section
357 :
358 : ! **************************************************************************************************
359 : !> \brief Create the PROGRAM_RUN_INFO print section.
360 : !> \param section section to create
361 : !> \par History
362 : !> * 11.2020 created [Dmitry Ryndyk]
363 : ! **************************************************************************************************
364 8530 : SUBROUTINE create_print_program_run_info_section(section)
365 :
366 : TYPE(section_type), POINTER :: section
367 :
368 : TYPE(keyword_type), POINTER :: keyword
369 :
370 : CALL cp_print_key_section_create(section, __LOCATION__, "PROGRAM_RUN_INFO", &
371 : description="Controls the printing of basic information during the NEGF.", &
372 8530 : print_level=low_print_level, filename="__STD_OUT__")
373 8530 : NULLIFY (keyword)
374 :
375 : CALL keyword_create(keyword, __LOCATION__, name="_SECTION_PARAMETERS_", &
376 : description="Level starting at which this property is printed", &
377 : usage="_SECTION_PARAMETERS_", &
378 : default_i_val=low_print_level, lone_keyword_i_val=low_print_level, &
379 : enum_c_vals=s2a("on", "off", "silent", "low", "medium", "high", "debug"), &
380 : enum_i_vals=(/silent_print_level - 1, debug_print_level + 1, &
381 : silent_print_level, low_print_level, &
382 8530 : medium_print_level, high_print_level, debug_print_level/))
383 8530 : CALL section_add_keyword(section, keyword)
384 8530 : CALL keyword_release(keyword)
385 :
386 : CALL keyword_create(keyword, __LOCATION__, name="PRINT_LEVEL", &
387 : variants=(/"IOLEVEL"/), &
388 : description="Determines the verbose level for this section "// &
389 : "additionally to GLOBAL%PRINT_LEVEL and SECTION_PARAMETERS, "// &
390 : "which switch on printing.", &
391 : usage="PRINT_LEVEL HIGH", &
392 : default_i_val=low_print_level, enum_c_vals= &
393 : s2a("SILENT", "LOW", "MEDIUM", "HIGH", "DEBUG"), &
394 : enum_desc=s2a("No output", &
395 : "Little output", "Quite some output", "Lots of output", &
396 : "Everything is written out, useful for debugging purposes only"), &
397 : enum_i_vals=(/silent_print_level, low_print_level, medium_print_level, &
398 17060 : high_print_level, debug_print_level/))
399 8530 : CALL section_add_keyword(section, keyword)
400 8530 : CALL keyword_release(keyword)
401 :
402 8530 : END SUBROUTINE create_print_program_run_info_section
403 :
404 : ! **************************************************************************************************
405 : !> \brief Create the DOS print section.
406 : !> \param section section to create
407 : !> \param name name of the new section
408 : !> \param description section description
409 : !> \par History
410 : !> * 11.2017 created [Sergey Chulkov]
411 : ! **************************************************************************************************
412 25590 : SUBROUTINE create_print_dos_section(section, name, description)
413 : TYPE(section_type), POINTER :: section
414 : CHARACTER(len=*), INTENT(in) :: name, description
415 :
416 : TYPE(keyword_type), POINTER :: keyword
417 :
418 : CALL cp_print_key_section_create(section, __LOCATION__, TRIM(ADJUSTL(name)), &
419 : description="Controls the printing of "//TRIM(ADJUSTL(description))//".", &
420 25590 : print_level=high_print_level, filename="__STD_OUT__")
421 25590 : NULLIFY (keyword)
422 :
423 : CALL keyword_create(keyword, __LOCATION__, name="FROM_ENERGY", &
424 : description="Energy point to start with.", &
425 : n_var=1, type_of_var=real_t, unit_str="hartree", &
426 25590 : default_r_val=-1.0_dp)
427 25590 : CALL section_add_keyword(section, keyword)
428 25590 : CALL keyword_release(keyword)
429 :
430 : CALL keyword_create(keyword, __LOCATION__, name="TILL_ENERGY", &
431 : description="Energy point to end with.", &
432 : n_var=1, type_of_var=real_t, unit_str="hartree", &
433 25590 : default_r_val=1.0_dp)
434 25590 : CALL section_add_keyword(section, keyword)
435 25590 : CALL keyword_release(keyword)
436 :
437 : CALL keyword_create(keyword, __LOCATION__, name="N_GRIDPOINTS", &
438 : description="Number of points to compute.", &
439 25590 : n_var=1, type_of_var=integer_t, default_i_val=201)
440 25590 : CALL section_add_keyword(section, keyword)
441 25590 : CALL keyword_release(keyword)
442 25590 : END SUBROUTINE create_print_dos_section
443 : END MODULE input_cp2k_negf
|