Line data Source code
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 Set disperson types for DFT calculations
10 : !> \author JGH (04.2014)
11 : ! **************************************************************************************************
12 : MODULE qs_dispersion_utils
13 :
14 : USE atomic_kind_types, ONLY: atomic_kind_type,&
15 : get_atomic_kind
16 : USE cp_log_handling, ONLY: cp_get_default_logger,&
17 : cp_logger_type
18 : USE cp_output_handling, ONLY: cp_print_key_finished_output,&
19 : cp_print_key_unit_nr
20 : USE input_constants, ONLY: &
21 : vdw_nl_DRSLL, vdw_nl_LMKLL, vdw_nl_RVV10, vdw_pairpot_dftd2, vdw_pairpot_dftd3, &
22 : vdw_pairpot_dftd3bj, vdw_pairpot_dftd4, xc_funct_b3lyp, xc_funct_blyp, xc_funct_bp, &
23 : xc_funct_no_shortcut, xc_funct_pbe, xc_funct_pbe0, xc_funct_tpss, xc_none, &
24 : xc_vdw_fun_nonloc, xc_vdw_fun_pairpot
25 : USE input_section_types, ONLY: section_vals_get_subs_vals,&
26 : section_vals_type,&
27 : section_vals_val_get
28 : USE kinds, ONLY: default_string_length,&
29 : dp
30 : USE physcon, ONLY: bohr,&
31 : kjmol
32 : USE qs_dispersion_types, ONLY: qs_atom_dispersion_type,&
33 : qs_dispersion_type
34 : USE qs_environment_types, ONLY: get_qs_env,&
35 : qs_environment_type
36 : USE qs_kind_types, ONLY: get_qs_kind,&
37 : qs_kind_type
38 : USE string_utilities, ONLY: lowercase,&
39 : uppercase
40 : #include "./base/base_uses.f90"
41 :
42 : IMPLICIT NONE
43 :
44 : PRIVATE
45 :
46 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_dispersion_utils'
47 :
48 : PUBLIC :: qs_dispersion_env_set, qs_write_dispersion
49 : PUBLIC :: cellhash, xc_functional_to_d_name, xc_functional_to_d4_name_int, xc_functional_detect_expanded
50 :
51 : ! **************************************************************************************************
52 : CONTAINS
53 : ! **************************************************************************************************
54 : !> \brief ...
55 : !> \param xc_functional_name ...
56 : !> \param d_functional_name ...
57 : ! **************************************************************************************************
58 50 : SUBROUTINE xc_functional_to_d_name(xc_functional_name, d_functional_name)
59 : CHARACTER(len=*), INTENT(IN) :: xc_functional_name
60 : CHARACTER(len=*), INTENT(OUT) :: d_functional_name
61 :
62 50 : IF (TRIM(ADJUSTL(xc_functional_name)) == "BP") THEN
63 8 : d_functional_name = "bp86"
64 : ELSE
65 42 : d_functional_name = TRIM(ADJUSTL(xc_functional_name))
66 42 : CALL lowercase(d_functional_name)
67 : END IF
68 :
69 50 : END SUBROUTINE xc_functional_to_d_name
70 :
71 : ! **************************************************************************************************
72 : !> \brief ...
73 : !> \param xc_functional_id ...
74 : !> \param xc_functional_name ...
75 : ! **************************************************************************************************
76 0 : SUBROUTINE xc_functional_to_d4_name_int(xc_functional_id, xc_functional_name)
77 : INTEGER, INTENT(IN) :: xc_functional_id
78 : CHARACTER(len=*), INTENT(OUT) :: xc_functional_name
79 :
80 0 : SELECT CASE (xc_functional_id)
81 : CASE (xc_funct_pbe)
82 0 : xc_functional_name = "PBE"
83 : CASE (xc_funct_pbe0)
84 0 : xc_functional_name = "PBE0"
85 : CASE (xc_funct_b3lyp)
86 0 : xc_functional_name = "B3LYP"
87 : CASE (xc_funct_blyp)
88 0 : xc_functional_name = "BLYP"
89 : CASE (xc_funct_bp)
90 0 : xc_functional_name = "BP"
91 : CASE (xc_funct_tpss)
92 0 : xc_functional_name = "TPSS"
93 : CASE DEFAULT
94 0 : xc_functional_name = "NONE"
95 : END SELECT
96 :
97 0 : END SUBROUTINE xc_functional_to_d4_name_int
98 :
99 : ! **************************************************************************************************
100 : !> \brief ...
101 : !> \param xc_fun_section ...
102 : !> \param xc_functional_name ...
103 : ! **************************************************************************************************
104 6302 : SUBROUTINE xc_functional_detect_expanded(xc_fun_section, xc_functional_name)
105 : TYPE(section_vals_type), POINTER :: xc_fun_section
106 : CHARACTER(len=*), INTENT(OUT) :: xc_functional_name
107 :
108 6302 : CHARACTER(len=20), ALLOCATABLE :: sub_names(:)
109 : INTEGER :: i, n_explicit
110 : LOGICAL :: has_becke88, has_lyp, has_mgga_c_r2scan, has_mgga_c_scan, has_mgga_x_r2scan, &
111 : has_mgga_x_scan, has_optx, has_p86c, has_pbe0_13, has_vwn, has_xalpha
112 : REAL(dp) :: scal_x_pbe
113 : TYPE(section_vals_type), POINTER :: sub_section
114 :
115 6302 : n_explicit = 0
116 6302 : has_becke88 = .FALSE.; has_lyp = .FALSE.; has_vwn = .FALSE.; has_p86c = .FALSE.
117 6302 : has_xalpha = .FALSE.; has_optx = .FALSE.; has_pbe0_13 = .FALSE.
118 6302 : has_mgga_c_r2scan = .FALSE.; has_mgga_x_r2scan = .FALSE.
119 6302 : has_mgga_c_scan = .FALSE.; has_mgga_x_scan = .FALSE.
120 :
121 18906 : ALLOCATE (sub_names(xc_fun_section%section%n_subsections))
122 :
123 4461816 : DO i = 1, xc_fun_section%section%n_subsections
124 4455514 : sub_section => xc_fun_section%subs_vals(i, 1)%section_vals
125 4461816 : IF (SIZE(sub_section%values, 2) > 0) THEN
126 6524 : n_explicit = n_explicit + 1
127 6524 : sub_names(n_explicit) = TRIM(ADJUSTL(sub_section%section%name))
128 510 : SELECT CASE (sub_names(n_explicit))
129 510 : CASE ("BECKE88"); has_becke88 = .TRUE.
130 502 : CASE ("LYP"); has_lyp = .TRUE.
131 26 : CASE ("VWN"); has_vwn = .TRUE.
132 10 : CASE ("P86C"); has_p86c = .TRUE.
133 56 : CASE ("XALPHA"); has_xalpha = .TRUE.
134 4 : CASE ("OPTX"); has_optx = .TRUE.
135 2 : CASE ("MGGA_C_R2SCAN"); has_mgga_c_r2scan = .TRUE.
136 2 : CASE ("MGGA_X_R2SCAN"); has_mgga_x_r2scan = .TRUE.
137 2 : CASE ("MGGA_C_SCAN"); has_mgga_c_scan = .TRUE.
138 2 : CASE ("MGGA_X_SCAN"); has_mgga_x_scan = .TRUE.
139 0 : CASE ("PBE0_1/3"); has_pbe0_13 = .TRUE.
140 : CASE ("PBE")
141 2438 : CALL section_vals_val_get(sub_section, "SCALE_X", r_val=scal_x_pbe)
142 6524 : IF (ABS(scal_x_pbe - 0.75_dp) < 0.01_dp) has_pbe0_13 = .TRUE.
143 : END SELECT
144 : END IF
145 : END DO
146 :
147 6302 : IF (has_becke88 .AND. has_lyp .AND. has_vwn .AND. has_xalpha) THEN
148 26 : xc_functional_name = "B3LYP"
149 6276 : ELSE IF (has_becke88 .AND. has_lyp) THEN
150 936 : xc_functional_name = MERGE("PBE0", "BLYP", has_pbe0_13)
151 5808 : ELSE IF (has_becke88 .AND. has_p86c) THEN
152 10 : xc_functional_name = "BP"
153 5798 : ELSE IF (has_optx .AND. has_lyp) THEN
154 4 : xc_functional_name = "OLYP"
155 5794 : ELSE IF (has_mgga_c_r2scan .AND. has_mgga_x_r2scan) THEN
156 2 : xc_functional_name = "R2SCAN"
157 5792 : ELSE IF (has_mgga_c_scan .AND. has_mgga_x_scan) THEN
158 2 : xc_functional_name = "SCAN"
159 5790 : ELSE IF (n_explicit == 1 .AND. has_pbe0_13) THEN
160 550 : xc_functional_name = "PBE0"
161 5240 : ELSE IF (n_explicit == 1) THEN
162 4518 : xc_functional_name = sub_names(1)
163 : ELSE
164 722 : xc_functional_name = "NONE"
165 : END IF
166 :
167 12604 : END SUBROUTINE xc_functional_detect_expanded
168 :
169 : !> \brief ...
170 : !> \param dispersion_env ...
171 : !> \param xc_section ...
172 : ! **************************************************************************************************
173 12604 : SUBROUTINE qs_dispersion_env_set(dispersion_env, xc_section)
174 : TYPE(qs_dispersion_type), POINTER :: dispersion_env
175 : TYPE(section_vals_type), POINTER :: xc_section
176 :
177 : CHARACTER(len=60) :: xc_functional_name
178 : INTEGER :: xc_functional_id
179 : LOGICAL :: exfun, explicit
180 6302 : REAL(dp), POINTER :: params(:), scal(:)
181 : TYPE(section_vals_type), POINTER :: nl_section, pp_section, vdw_section, &
182 : xc_fun_section
183 :
184 0 : CPASSERT(ASSOCIATED(dispersion_env))
185 :
186 : ! set general defaults
187 6302 : dispersion_env%doabc = .FALSE.
188 6302 : dispersion_env%c9cnst = .FALSE.
189 6302 : dispersion_env%lrc = .FALSE.
190 6302 : dispersion_env%srb = .FALSE.
191 6302 : dispersion_env%verbose = .FALSE.
192 6302 : dispersion_env%nd3_exclude_pair = 0
193 6302 : NULLIFY (dispersion_env%c6ab, dispersion_env%maxci, dispersion_env%r0ab, dispersion_env%rcov, &
194 6302 : dispersion_env%r2r4, dispersion_env%cn, dispersion_env%cnkind, dispersion_env%cnlist, &
195 6302 : dispersion_env%d3_exclude_pair)
196 6302 : NULLIFY (dispersion_env%q_mesh, dispersion_env%kernel, dispersion_env%d2phi_dk2, &
197 6302 : dispersion_env%d2y_dx2)
198 6302 : NULLIFY (dispersion_env%sab_vdw, dispersion_env%sab_cn)
199 6302 : NULLIFY (dispersion_env%dftd_section)
200 6302 : NULLIFY (vdw_section, xc_fun_section)
201 6302 : vdw_section => section_vals_get_subs_vals(xc_section, "vdw_potential")
202 6302 : xc_fun_section => section_vals_get_subs_vals(xc_section, "XC_FUNCTIONAL")
203 6302 : CALL section_vals_val_get(xc_fun_section, "_SECTION_PARAMETERS_", i_val=xc_functional_id)
204 6302 : IF (xc_functional_id == xc_funct_no_shortcut .OR. xc_functional_id == xc_none) THEN
205 6302 : CALL xc_functional_detect_expanded(xc_fun_section, xc_functional_name)
206 : ELSE
207 0 : CALL xc_functional_to_d4_name_int(xc_functional_id, xc_functional_name)
208 : END IF
209 6302 : CALL section_vals_val_get(vdw_section, "POTENTIAL_TYPE", i_val=dispersion_env%type)
210 6302 : IF (dispersion_env%type == xc_vdw_fun_pairpot) THEN
211 178 : NULLIFY (pp_section)
212 178 : pp_section => section_vals_get_subs_vals(vdw_section, "PAIR_POTENTIAL")
213 178 : CALL section_vals_val_get(pp_section, "VERBOSE_OUTPUT", l_val=dispersion_env%verbose)
214 178 : CALL section_vals_val_get(pp_section, "TYPE", i_val=dispersion_env%pp_type)
215 178 : IF (dispersion_env%pp_type == vdw_pairpot_dftd2) THEN
216 : ! functional parameters for Grimme D2 type
217 34 : CALL section_vals_val_get(pp_section, "EXP_PRE", r_val=dispersion_env%exp_pre)
218 34 : CALL section_vals_val_get(pp_section, "SCALING", explicit=explicit)
219 34 : IF (.NOT. explicit) THEN
220 22 : CALL section_vals_val_get(pp_section, "REFERENCE_FUNCTIONAL", explicit=exfun)
221 22 : IF (.NOT. exfun) THEN
222 12 : CALL xc_functional_to_d_name(xc_functional_name, dispersion_env%ref_functional)
223 12 : IF (dispersion_env%ref_functional == "none") THEN
224 : CALL cp_abort(__LOCATION__, &
225 : "D2 vdW: XC_FUNCTIONAL not supported. "// &
226 : "Set REFERENCE_FUNCTIONAL explicitly. "// &
227 : "Go to https://www.chemie.uni-bonn.de/grimme/de/software/dft-d3/ "// &
228 0 : "for a full list of supported functionals")
229 : END IF
230 : ELSE
231 : CALL section_vals_val_get(vdw_section, &
232 : "PAIR_POTENTIAL%REFERENCE_FUNCTIONAL", &
233 10 : c_val=dispersion_env%ref_functional)
234 : END IF
235 22 : CALL qs_scaling_dftd2(dispersion_env%scaling, dispersion_env%ref_functional)
236 : ELSE
237 12 : CALL section_vals_val_get(pp_section, "SCALING", r_val=dispersion_env%scaling)
238 : END IF
239 : ELSE
240 144 : dispersion_env%exp_pre = 0._dp
241 144 : dispersion_env%scaling = 0._dp
242 : END IF
243 178 : IF (dispersion_env%pp_type == vdw_pairpot_dftd3 .OR. &
244 : dispersion_env%pp_type == vdw_pairpot_dftd3bj) THEN
245 : ! functional parameters for Grimme DFT-D3 type
246 102 : CALL section_vals_val_get(pp_section, "EPS_CN", r_val=dispersion_env%eps_cn)
247 102 : CALL section_vals_val_get(pp_section, "CALCULATE_C9_TERM", l_val=dispersion_env%doabc)
248 102 : CALL section_vals_val_get(pp_section, "REFERENCE_C9_TERM", l_val=dispersion_env%c9cnst)
249 102 : CALL section_vals_val_get(pp_section, "LONG_RANGE_CORRECTION", l_val=dispersion_env%lrc)
250 102 : CALL section_vals_val_get(pp_section, "SHORT_RANGE_CORRECTION", l_val=dispersion_env%srb)
251 102 : CALL section_vals_val_get(pp_section, "SHORT_RANGE_CORRECTION_PARAMETERS", r_vals=params)
252 918 : dispersion_env%srb_params(1:4) = params(1:4)
253 : ! KG corrections
254 102 : CALL section_vals_val_get(pp_section, "MOLECULE_CORRECTION", l_val=dispersion_env%domol)
255 102 : CALL section_vals_val_get(pp_section, "MOLECULE_CORRECTION_C8", r_val=dispersion_env%kgc8)
256 102 : IF (dispersion_env%pp_type == vdw_pairpot_dftd3) THEN
257 60 : CALL section_vals_val_get(pp_section, "D3_SCALING", explicit=explicit)
258 42 : ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd3bj) THEN
259 42 : CALL section_vals_val_get(pp_section, "D3BJ_SCALING", explicit=explicit)
260 : END IF
261 102 : IF (.NOT. explicit) THEN
262 92 : CALL section_vals_val_get(pp_section, "REFERENCE_FUNCTIONAL", explicit=exfun)
263 92 : IF (.NOT. exfun) THEN
264 24 : CALL xc_functional_to_d_name(xc_functional_name, dispersion_env%ref_functional)
265 24 : IF (dispersion_env%ref_functional == "none") THEN
266 : CALL cp_abort(__LOCATION__, &
267 : "D3 vdW: XC_FUNCTIONAL not supported. "// &
268 : "Set REFERENCE_FUNCTIONAL explicitly. "// &
269 : "Go to https://www.chemie.uni-bonn.de/grimme/de/software/dft-d3/ for a full "// &
270 0 : "list of supported functionals")
271 : END IF
272 : ELSE
273 : CALL section_vals_val_get(vdw_section, &
274 : "PAIR_POTENTIAL%REFERENCE_FUNCTIONAL", &
275 68 : c_val=dispersion_env%ref_functional)
276 : END IF
277 92 : IF (dispersion_env%pp_type == vdw_pairpot_dftd3) THEN
278 : CALL qs_scaling_dftd3(dispersion_env%s6, dispersion_env%sr6, &
279 56 : dispersion_env%s8, dispersion_env%ref_functional)
280 36 : ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd3bj) THEN
281 : CALL qs_scaling_dftd3bj(dispersion_env%s6, dispersion_env%a1, dispersion_env%s8, &
282 36 : dispersion_env%a2, dispersion_env%ref_functional)
283 : END IF
284 : ELSE
285 10 : IF (dispersion_env%pp_type == vdw_pairpot_dftd3) THEN
286 : ! zero damping
287 4 : CALL section_vals_val_get(pp_section, "D3_SCALING", r_vals=scal)
288 4 : dispersion_env%s6 = scal(1)
289 4 : dispersion_env%sr6 = scal(2)
290 4 : dispersion_env%s8 = scal(3)
291 4 : dispersion_env%a1 = 0.0_dp
292 4 : dispersion_env%a2 = 0.0_dp
293 6 : ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd3bj) THEN
294 : ! BJ damping
295 6 : CALL section_vals_val_get(pp_section, "D3BJ_SCALING", r_vals=scal)
296 6 : dispersion_env%s6 = scal(1)
297 6 : dispersion_env%a1 = scal(2)
298 6 : dispersion_env%s8 = scal(3)
299 6 : dispersion_env%a2 = scal(4)
300 6 : dispersion_env%sr6 = 0.0_dp
301 : END IF
302 : END IF
303 : ELSE
304 76 : dispersion_env%s6 = 0._dp
305 76 : dispersion_env%sr6 = 0._dp
306 76 : dispersion_env%s8 = 0._dp
307 76 : dispersion_env%s9 = 0._dp
308 76 : dispersion_env%a1 = 0._dp
309 76 : dispersion_env%a2 = 0._dp
310 76 : dispersion_env%eps_cn = 0._dp
311 : END IF
312 178 : IF (dispersion_env%pp_type == vdw_pairpot_dftd4) THEN
313 42 : CALL section_vals_val_get(pp_section, "D4_SCALING", explicit=explicit)
314 42 : IF (.NOT. explicit) THEN
315 42 : CALL section_vals_val_get(pp_section, "REFERENCE_FUNCTIONAL", explicit=exfun)
316 42 : IF (.NOT. exfun) THEN
317 14 : CALL xc_functional_to_d_name(xc_functional_name, dispersion_env%ref_functional)
318 : ELSE
319 : CALL section_vals_val_get(vdw_section, &
320 : "PAIR_POTENTIAL%REFERENCE_FUNCTIONAL", &
321 28 : c_val=dispersion_env%ref_functional)
322 : END IF
323 42 : IF (TRIM(ADJUSTL(dispersion_env%ref_functional)) == "none") THEN
324 0 : CPABORT("D4: XC_FUNCTIONAL not supported. Set REFERENCE_FUNCTIONAL explicitly.")
325 : END IF
326 : ELSE
327 0 : CALL section_vals_val_get(pp_section, "D4_SCALING", r_vals=scal)
328 0 : dispersion_env%s6 = scal(1)
329 0 : dispersion_env%a1 = scal(2)
330 0 : dispersion_env%s8 = scal(3)
331 0 : dispersion_env%a2 = scal(4)
332 0 : dispersion_env%sr6 = 0.0_dp
333 0 : dispersion_env%ref_functional = "none"
334 : END IF
335 42 : CALL section_vals_val_get(pp_section, "EPS_CN", r_val=dispersion_env%eps_cn)
336 : CALL section_vals_val_get(pp_section, "D4_REFERENCE_CODE", &
337 42 : l_val=dispersion_env%d4_reference_code)
338 42 : CALL section_vals_val_get(pp_section, "D4_DEBUG", l_val=dispersion_env%d4_debug)
339 42 : CALL section_vals_val_get(pp_section, "D4_CUTOFF", r_val=dispersion_env%rc_d4)
340 42 : CALL section_vals_val_get(pp_section, "D4_CN_CUTOFF", r_val=dispersion_env%rc_cn)
341 42 : CALL section_vals_val_get(pp_section, "FACTOR_S9_TERM", r_val=dispersion_env%s9)
342 : !C9 term default=T for D4
343 42 : CALL section_vals_val_get(pp_section, "CALCULATE_C9_TERM", explicit=exfun)
344 42 : IF (exfun) THEN
345 8 : CALL section_vals_val_get(pp_section, "CALCULATE_C9_TERM", l_val=dispersion_env%doabc)
346 : ELSE
347 34 : dispersion_env%doabc = .TRUE.
348 : END IF
349 : END IF
350 178 : CALL section_vals_val_get(pp_section, "R_CUTOFF", r_val=dispersion_env%rc_disp)
351 : CALL section_vals_val_get(pp_section, "PARAMETER_FILE_NAME", &
352 178 : c_val=dispersion_env%parameter_file_name)
353 : ! set DFTD section for output handling
354 178 : dispersion_env%dftd_section => pp_section
355 6124 : ELSE IF (dispersion_env%type == xc_vdw_fun_nonloc) THEN
356 50 : NULLIFY (nl_section)
357 50 : nl_section => section_vals_get_subs_vals(vdw_section, "NON_LOCAL")
358 50 : CALL section_vals_val_get(nl_section, "VERBOSE_OUTPUT", l_val=dispersion_env%verbose)
359 : CALL section_vals_val_get(nl_section, "KERNEL_FILE_NAME", &
360 50 : c_val=dispersion_env%kernel_file_name)
361 50 : CALL section_vals_val_get(nl_section, "TYPE", i_val=dispersion_env%nl_type)
362 50 : CALL section_vals_val_get(nl_section, "CUTOFF", r_val=dispersion_env%pw_cutoff)
363 50 : CALL section_vals_val_get(nl_section, "PARAMETERS", r_vals=params)
364 50 : CALL section_vals_val_get(nl_section, "SCALE", r_val=dispersion_env%scale_rvv10)
365 50 : dispersion_env%b_value = params(1)
366 50 : dispersion_env%c_value = params(2)
367 : END IF
368 6302 : END SUBROUTINE qs_dispersion_env_set
369 :
370 : ! **************************************************************************************************
371 : !> \brief ...
372 : !> \param qs_env ...
373 : !> \param dispersion_env ...
374 : !> \param ounit ...
375 : ! **************************************************************************************************
376 7272 : SUBROUTINE qs_write_dispersion(qs_env, dispersion_env, ounit)
377 : TYPE(qs_environment_type), POINTER :: qs_env
378 : TYPE(qs_dispersion_type), POINTER :: dispersion_env
379 : INTEGER, INTENT(in), OPTIONAL :: ounit
380 :
381 : CHARACTER(LEN=2) :: symbol
382 : INTEGER :: i, ikind, nkind, output_unit
383 7272 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
384 : TYPE(cp_logger_type), POINTER :: logger
385 : TYPE(qs_atom_dispersion_type), POINTER :: disp
386 7272 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
387 : TYPE(section_vals_type), POINTER :: dft_section
388 :
389 7272 : IF (PRESENT(ounit)) THEN
390 0 : output_unit = ounit
391 : ELSE
392 7272 : NULLIFY (logger)
393 7272 : logger => cp_get_default_logger()
394 :
395 7272 : dft_section => section_vals_get_subs_vals(qs_env%input, "DFT")
396 : output_unit = cp_print_key_unit_nr(logger, dft_section, &
397 7272 : "PRINT%DFT_CONTROL_PARAMETERS", extension=".Log")
398 : END IF
399 :
400 7272 : IF (output_unit > 0) THEN
401 : ! vdW type specific output
402 1581 : IF (dispersion_env%type == xc_vdw_fun_pairpot) THEN
403 106 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T67,'Pair Potential')")
404 : ! Pair potentials
405 106 : IF (dispersion_env%pp_type == vdw_pairpot_dftd2) THEN
406 15 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T35,'DFT-D2')")
407 15 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T35,'Potential Form: S. Grimme, JCC 27: 1787 (2006)')")
408 15 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T35,'Cutoff Radius [Bohr]:',T73,F8.2)") dispersion_env%rc_disp
409 15 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T35,'Scaling Factor:',T73,F8.4)") dispersion_env%scaling
410 15 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T35,'Exp Prefactor for Damping:',T73,F8.1)") dispersion_env%exp_pre
411 15 : CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
412 15 : nkind = SIZE(atomic_kind_set)
413 40 : DO ikind = 1, nkind
414 25 : CALL get_atomic_kind(atomic_kind_set(ikind), element_symbol=symbol)
415 25 : CALL get_qs_kind(qs_kind_set(ikind), dispersion=disp)
416 40 : IF (disp%defined) THEN
417 : WRITE (output_unit, fmt="(' vdW PARAMETER| ',T18,'Atom=',A2, "// &
418 : "T28,'C6[J*nm^6*mol^-1]=',F8.4,T63,'r(vdW)[A]=',F8.4)") &
419 25 : symbol, disp%c6/(1000._dp*bohr**6/kjmol), disp%vdw_radii/bohr
420 : ELSE
421 0 : WRITE (output_unit, fmt="(' vdW PARAMETER| ',T20,'Atom=',A2,T70,'not defined')")
422 : END IF
423 : END DO
424 91 : ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd3) THEN
425 16 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'DFT-D3 (Version 3.1)')")
426 16 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'Potential Form: S. Grimme et al, JCP 132: 154104 (2010)')")
427 16 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'Zero Damping')")
428 16 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'Cutoff Radius [Bohr]:',T73,F8.2)") dispersion_env%rc_disp
429 16 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'s6 Scaling Factor:',T73,F8.4)") dispersion_env%s6
430 16 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'sr6 Scaling Factor:',T73,F8.4)") dispersion_env%sr6
431 16 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'s8 Scaling Factor:',T73,F8.4)") dispersion_env%s8
432 16 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'Cutoff for CN calculation:',T69,E12.4)") dispersion_env%eps_cn
433 16 : IF (dispersion_env%nd3_exclude_pair > 0) THEN
434 0 : DO i = 1, dispersion_env%nd3_exclude_pair
435 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'Excluded Pairs: ',T76,I2,' ',I2)") &
436 0 : dispersion_env%d3_exclude_pair(i, :)
437 : END DO
438 : END IF
439 75 : ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd3bj) THEN
440 58 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'DFT-D3 (Version 3.1)')")
441 58 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'Potential Form: S. Grimme et al, JCP 132: 154104 (2010)')")
442 58 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'BJ Damping: S. Grimme et al, JCC 32: 1456 (2011)')")
443 58 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'Cutoff Radius [Bohr]:',T73,F8.2)") dispersion_env%rc_disp
444 58 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'s6 Scaling Factor:',T73,F8.4)") dispersion_env%s6
445 58 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'a1 Damping Factor:',T73,F8.4)") dispersion_env%a1
446 58 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'s8 Scaling Factor:',T73,F8.4)") dispersion_env%s8
447 58 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'a2 Damping Factor:',T73,F8.4)") dispersion_env%a2
448 58 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'Cutoff for CN calculation:',T69,E12.4)") dispersion_env%eps_cn
449 58 : IF (dispersion_env%nd3_exclude_pair > 0) THEN
450 0 : DO i = 1, dispersion_env%nd3_exclude_pair
451 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'Excluded Kind Pairs: ',T76,I2,' ',I2)") &
452 0 : dispersion_env%d3_exclude_pair(i, :)
453 : END DO
454 : END IF
455 17 : ELSE IF (dispersion_env%pp_type == vdw_pairpot_dftd4) THEN
456 : #if defined(__DFTD4_V3)
457 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'DFT-D4(Version 3.7)')")
458 : #else
459 17 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'DFT-D4(Version 4.0)')")
460 : #endif
461 17 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'see https://github.com/dftd4/dftd4')")
462 17 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'E. Caldeweyher et al, PCCP 22: 8499 (2020)')")
463 17 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'E. Caldeweyher et al, JCP 150: 154122 (2019)')")
464 17 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T26,'E. Caldeweyher et al, JCP 147: 034112 (2017)')")
465 : END IF
466 1475 : ELSE IF (dispersion_env%type == xc_vdw_fun_nonloc) THEN
467 13 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ',T61,'Non-local Functional')")
468 : WRITE (output_unit, &
469 13 : fmt="(' vdW POTENTIAL| ','Implementation: G. Roman-Perez, J. Soler, PRL 103: 096102 (2009)')")
470 : WRITE (output_unit, &
471 13 : fmt="(' vdW POTENTIAL| ',T38,' T. Thonhauser et al, PRB 76: 125112 (2007)')")
472 : WRITE (output_unit, &
473 13 : fmt="(' vdW POTENTIAL| ',T22,' R. Sabatini et al, J.Phys:Condens Matter 24: 424209 (2012)')")
474 : WRITE (output_unit, &
475 13 : fmt="(' vdW POTENTIAL| ',T16,' Based on QE implementation by Brian Kolb, Timo Thonhauser (2009)')")
476 13 : SELECT CASE (dispersion_env%nl_type)
477 : CASE DEFAULT
478 : ! unknown functional
479 0 : CPABORT("")
480 : CASE (vdw_nl_DRSLL)
481 : WRITE (output_unit, &
482 8 : fmt="(' vdW POTENTIAL| ','DRSLL Functional: M. Dion et al, PRL 92: 246401 (2004)')")
483 : CASE (vdw_nl_LMKLL)
484 : WRITE (output_unit, &
485 3 : fmt="(' vdW POTENTIAL| ','LMKLL Functional: K. Lee et al, PRB 82: 081101 (2010)')")
486 : CASE (vdw_nl_RVV10)
487 : WRITE (output_unit, &
488 13 : fmt="(' vdW POTENTIAL| ','RVV10 Functional: R. Sabatini et al, PRB 87: 041108(R) (2013)')")
489 : END SELECT
490 13 : IF (dispersion_env%verbose) THEN
491 : WRITE (output_unit, &
492 12 : fmt="(' vdW POTENTIAL| ',' Carrying out vdW-DF run using the following parameters:')")
493 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ','Nqs =',I8,' Nr_points =',I8,' r_max =',F10.3)") &
494 12 : dispersion_env%nqs, dispersion_env%nr_points, dispersion_env%r_max
495 12 : WRITE (output_unit, fmt="(' vdW POTENTIAL| ','q_mesh =')")
496 252 : WRITE (output_unit, fmt="(8X,4F18.8)") (dispersion_env%q_mesh(i), i=1, dispersion_env%nqs)
497 : WRITE (output_unit, &
498 : fmt="(' vdW POTENTIAL| ','Density cutoff for convolution [a.u.]:',T71,F10.1)") &
499 12 : dispersion_env%pw_cutoff
500 : END IF
501 : END IF
502 : END IF
503 7272 : IF (.NOT. PRESENT(ounit)) THEN
504 : CALL cp_print_key_finished_output(output_unit, logger, dft_section, &
505 7272 : "PRINT%DFT_CONTROL_PARAMETERS")
506 : END IF
507 :
508 7272 : END SUBROUTINE qs_write_dispersion
509 :
510 : ! **************************************************************************************************
511 : !> \brief ...
512 : !> \param scaling ...
513 : !> \param ref_functional ...
514 : ! **************************************************************************************************
515 22 : SUBROUTINE qs_scaling_dftd2(scaling, ref_functional)
516 : REAL(KIND=dp), INTENT(inout) :: scaling
517 : CHARACTER(LEN=default_string_length), INTENT(in) :: ref_functional
518 :
519 : CHARACTER(LEN=default_string_length) :: functional
520 :
521 22 : functional = ref_functional
522 22 : CALL uppercase(functional)
523 22 : SELECT CASE (TRIM(functional))
524 : CASE DEFAULT
525 : ! unknown functional
526 0 : CPABORT("No DFT-D2 s6 value available for this functional:"//TRIM(functional))
527 : CASE ("BLYP")
528 6 : scaling = 1.20_dp
529 : CASE ("B3LYP")
530 2 : scaling = 1.05_dp
531 : CASE ("TPSS")
532 2 : scaling = 1.00_dp
533 : CASE ("PBE")
534 8 : scaling = 0.75_dp
535 : CASE ("PBE0")
536 2 : scaling = 0.6_dp
537 : CASE ("B2PLYP")
538 0 : scaling = 0.55_dp
539 : CASE ("BP86")
540 2 : scaling = 1.05_dp
541 : CASE ("B97")
542 22 : scaling = 1.25_dp
543 : END SELECT
544 :
545 22 : END SUBROUTINE qs_scaling_dftd2
546 :
547 : ! **************************************************************************************************
548 : !> \brief ...
549 : !> \param s6 ...
550 : !> \param sr6 ...
551 : !> \param s8 ...
552 : !> \param ref_functional ...
553 : ! **************************************************************************************************
554 56 : SUBROUTINE qs_scaling_dftd3(s6, sr6, s8, ref_functional)
555 :
556 : REAL(KIND=dp), INTENT(inout) :: s6, sr6, s8
557 : CHARACTER(LEN=default_string_length), INTENT(in) :: ref_functional
558 :
559 : CHARACTER(LEN=default_string_length) :: functional
560 :
561 56 : functional = ref_functional
562 56 : CALL uppercase(functional)
563 : ! values for different functionals from:
564 : ! https://www.chemie.uni-bonn.de/grimme/de/software/dft-d3
565 : ! L. Goerigk et al. PCCP 2017, 32147-32744, SI
566 56 : SELECT CASE (TRIM(functional))
567 : CASE DEFAULT
568 : ! unknown functional
569 0 : CPABORT("No DFT-D3 values available for this functional:"//TRIM(ref_functional))
570 : CASE ("B1B95")
571 0 : s6 = 1.000_dp
572 0 : sr6 = 1.613_dp
573 0 : s8 = 1.868_dp
574 : CASE ("B2GPPLYP")
575 : ! L. Goerigk and S. Grimme
576 : ! J. Chem. Theory Comput. 2011, 7, 291-309; doi:10.1021/ct100466k
577 0 : s6 = 0.56_dp
578 0 : sr6 = 1.586_dp
579 0 : s8 = 0.760_dp
580 : CASE ("B2PLYP")
581 : ! L. Goerigk and S. Grimme
582 : ! J. Chem. Theory Comput. 2011, 7, 291-309; doi:10.1021/ct100466k
583 2 : s6 = 0.64_dp
584 2 : sr6 = 1.427_dp
585 2 : s8 = 1.022_dp
586 : CASE ("DSD-BLYP")
587 : ! L. Goerigk and S. Grimme
588 : ! J. Chem. Theory Comput. 2011, 7, 291-309; doi:10.1021/ct100466k
589 0 : s6 = 0.50_dp
590 0 : sr6 = 1.569_dp
591 0 : s8 = 0.705_dp
592 : CASE ("B3LYP")
593 : ! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
594 : ! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
595 2 : s6 = 1.000_dp
596 2 : sr6 = 1.261_dp
597 2 : s8 = 1.703_dp
598 : CASE ("B97-D")
599 : ! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
600 : ! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
601 0 : s6 = 1.000_dp
602 0 : sr6 = 0.892_dp
603 0 : s8 = 0.909_dp
604 : CASE ("BHLYP")
605 0 : s6 = 1.000_dp
606 0 : sr6 = 1.370_dp
607 0 : s8 = 1.442_dp
608 : CASE ("BLYP")
609 : ! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
610 : ! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
611 2 : s6 = 1.000_dp
612 2 : sr6 = 1.094_dp
613 2 : s8 = 1.682_dp
614 : CASE ("BP86")
615 : ! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
616 : ! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
617 2 : s6 = 1.000_dp
618 2 : sr6 = 1.139_dp
619 2 : s8 = 1.683_dp
620 : CASE ("BPBE")
621 0 : s6 = 1.000_dp
622 0 : sr6 = 1.087_dp
623 0 : s8 = 2.033_dp
624 : CASE ("MPWLYP")
625 0 : s6 = 1.000_dp
626 0 : sr6 = 1.239_dp
627 0 : s8 = 1.098_dp
628 : CASE ("PBE")
629 : ! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
630 : ! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
631 44 : s6 = 1.000_dp
632 44 : sr6 = 1.217_dp
633 44 : s8 = 0.722_dp
634 : CASE ("PBEHPBE")
635 0 : s6 = 1.000_dp
636 0 : sr6 = 1.5703_dp
637 0 : s8 = 1.4010_dp
638 : CASE ("PBE0")
639 : ! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
640 : ! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
641 2 : s6 = 1.000_dp
642 2 : sr6 = 1.287_dp
643 2 : s8 = 0.928_dp
644 : CASE ("PW6B95")
645 : ! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
646 : ! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
647 0 : s6 = 1.000_dp
648 0 : sr6 = 1.532_dp
649 0 : s8 = 0.862_dp
650 : CASE ("PWB6K")
651 0 : s6 = 1.000_dp
652 0 : sr6 = 1.660_dp
653 0 : s8 = 0.550_dp
654 : CASE ("REVPBE")
655 : ! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
656 : ! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
657 0 : s6 = 1.000_dp
658 0 : sr6 = 0.923_dp
659 0 : s8 = 1.010_dp
660 : CASE ("RPBE")
661 0 : s6 = 1.000_dp
662 0 : sr6 = 0.872_dp
663 0 : s8 = 0.514_dp
664 : CASE ("TPSS")
665 : ! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
666 : ! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
667 2 : s6 = 1.000_dp
668 2 : sr6 = 1.166_dp
669 2 : s8 = 1.105_dp
670 : CASE ("TPSS0")
671 : ! S. Grimme, J. Antony, S. Ehrlich, and H. Krieg
672 : ! J. Chem. Phys. 132,154104 (2010); doi:10.1063/1.3382344
673 0 : s6 = 1.000_dp
674 0 : sr6 = 1.252_dp
675 0 : s8 = 1.242_dp
676 : CASE ("TPSSH")
677 0 : s6 = 1.000_dp
678 0 : sr6 = 1.223_dp
679 0 : s8 = 1.219_dp
680 : CASE ("B1LYP")
681 0 : s6 = 1.000_dp
682 0 : sr6 = 1.3725_dp
683 0 : s8 = 1.9467_dp
684 : CASE ("B1P86")
685 0 : s6 = 1.000_dp
686 0 : sr6 = 1.1815_dp
687 0 : s8 = 1.1209_dp
688 : CASE ("B3P86")
689 0 : s6 = 1.000_dp
690 0 : sr6 = 1.1897_dp
691 0 : s8 = 1.1961_dp
692 : CASE ("B3PW91")
693 0 : s6 = 1.000_dp
694 0 : sr6 = 1.176_dp
695 0 : s8 = 1.775_dp
696 : CASE ("BMK")
697 0 : s6 = 1.000_dp
698 0 : sr6 = 1.931_dp
699 0 : s8 = 2.168_dp
700 : CASE ("CAMB3LYP")
701 0 : s6 = 1.000_dp
702 0 : sr6 = 1.378_dp
703 0 : s8 = 1.217_dp
704 : CASE ("LCWPBE")
705 0 : s6 = 1.000_dp
706 0 : sr6 = 1.355_dp
707 0 : s8 = 1.279_dp
708 : CASE ("M052X")
709 0 : s6 = 1.000_dp
710 0 : sr6 = 1.417_dp
711 0 : s8 = 0.000_dp
712 : CASE ("M05")
713 0 : s6 = 1.000_dp
714 0 : sr6 = 1.373_dp
715 0 : s8 = 0.595_dp
716 : CASE ("M062X")
717 0 : s6 = 1.000_dp
718 0 : sr6 = 1.619_dp
719 0 : s8 = 0.000_dp
720 : CASE ("M06HF")
721 0 : s6 = 1.000_dp
722 0 : sr6 = 1.446_dp
723 0 : s8 = 0.000_dp
724 : CASE ("M06L")
725 0 : s6 = 1.000_dp
726 0 : sr6 = 1.581_dp
727 0 : s8 = 0.000_dp
728 : CASE ("M06N")
729 0 : s6 = 1.000_dp
730 0 : sr6 = 1.325_dp
731 0 : s8 = 0.000_dp
732 : CASE ("HCTH120")
733 0 : s6 = 1.000_dp
734 0 : sr6 = 1.221_dp
735 0 : s8 = 1.206_dp
736 : CASE ("HCTH407")
737 0 : s6 = 1.000_dp
738 0 : sr6 = 4.0426_dp
739 0 : s8 = 2.7694_dp
740 : CASE ("MPW2PLYP")
741 0 : s6 = 1.000_dp
742 0 : sr6 = 1.5527_dp
743 0 : s8 = 0.7529_dp
744 : CASE ("PKZB")
745 0 : s6 = 1.000_dp
746 0 : sr6 = 0.6327_dp
747 0 : s8 = 0.000_dp
748 : CASE ("PTPSS")
749 0 : s6 = 0.750_dp
750 0 : sr6 = 1.541_dp
751 0 : s8 = 0.879_dp
752 : CASE ("PWPB95")
753 0 : s6 = 0.820_dp
754 0 : sr6 = 1.557_dp
755 0 : s8 = 0.705_dp
756 : CASE ("OLYP")
757 0 : s6 = 1.000_dp
758 0 : sr6 = 0.806_dp
759 0 : s8 = 1.764_dp
760 : CASE ("OPBE")
761 0 : s6 = 1.000_dp
762 0 : sr6 = 0.837_dp
763 0 : s8 = 2.055_dp
764 : CASE ("OTPSS")
765 0 : s6 = 1.000_dp
766 0 : sr6 = 1.128_dp
767 0 : s8 = 1.494_dp
768 : CASE ("PBE1KCIS")
769 0 : s6 = 1.000_dp
770 0 : sr6 = 3.6355_dp
771 0 : s8 = 1.7934_dp
772 : CASE ("PBE38")
773 0 : s6 = 1.000_dp
774 0 : sr6 = 1.333_dp
775 0 : s8 = 0.998_dp
776 : CASE ("PBEH1PBE")
777 0 : s6 = 1.000_dp
778 0 : sr6 = 1.3719_dp
779 0 : s8 = 1.0430_dp
780 : CASE ("PBESOL")
781 0 : s6 = 1.000_dp
782 0 : sr6 = 1.345_dp
783 0 : s8 = 0.612_dp
784 : CASE ("REVSSB")
785 0 : s6 = 1.000_dp
786 0 : sr6 = 1.221_dp
787 0 : s8 = 0.560_dp
788 : CASE ("REVTPSS")
789 0 : s6 = 1.000_dp
790 0 : sr6 = 1.3491_dp
791 0 : s8 = 1.3666_dp
792 : CASE ("SSB")
793 0 : s6 = 1.000_dp
794 0 : sr6 = 1.215_dp
795 0 : s8 = 0.663_dp
796 : CASE ("B97-1")
797 0 : s6 = 1.000_dp
798 0 : sr6 = 3.7924_dp
799 0 : s8 = 1.6418_dp
800 : CASE ("B97-2")
801 0 : s6 = 1.000_dp
802 0 : sr6 = 1.7066_dp
803 0 : s8 = 2.4661_dp
804 : CASE ("B98")
805 0 : s6 = 1.000_dp
806 0 : sr6 = 2.6895_dp
807 0 : s8 = 1.9078_dp
808 : CASE ("BOP")
809 0 : s6 = 1.000_dp
810 0 : sr6 = 0.929_dp
811 0 : s8 = 1.975_dp
812 : CASE ("HISS")
813 0 : s6 = 1.000_dp
814 0 : sr6 = 1.3338_dp
815 0 : s8 = 0.7615_dp
816 : CASE ("HSE03")
817 0 : s6 = 1.000_dp
818 0 : sr6 = 1.3944_dp
819 0 : s8 = 1.0156_dp
820 : CASE ("HSE06")
821 0 : s6 = 1.000_dp
822 0 : sr6 = 1.129_dp
823 0 : s8 = 0.109_dp
824 : CASE ("M08HX")
825 0 : s6 = 1.000_dp
826 0 : sr6 = 1.6247_dp
827 0 : s8 = 0.000_dp
828 : CASE ("MN15L")
829 0 : s6 = 1.000_dp
830 0 : sr6 = 3.3388_dp
831 0 : s8 = 0.000_dp
832 : CASE ("MPWPW91")
833 0 : s6 = 1.0000_dp
834 0 : sr6 = 1.3725_dp
835 0 : s8 = 1.9467_dp
836 : CASE ("MPW1B95")
837 0 : s6 = 1.000_dp
838 0 : sr6 = 1.605_dp
839 0 : s8 = 1.118_dp
840 : CASE ("MPW1KCIS")
841 0 : s6 = 1.000_dp
842 0 : sr6 = 1.7231_dp
843 0 : s8 = 2.2917_dp
844 : CASE ("MPW1LYP")
845 0 : s6 = 1.000_dp
846 0 : sr6 = 2.0512_dp
847 0 : s8 = 1.9529_dp
848 : CASE ("MPW1PW91")
849 0 : s6 = 1.000_dp
850 0 : sr6 = 1.2892_dp
851 0 : s8 = 1.4758_dp
852 : CASE ("MPWB1K")
853 0 : s6 = 1.000_dp
854 0 : sr6 = 1.671_dp
855 0 : s8 = 1.061_dp
856 : CASE ("MPWKCIS1K")
857 0 : s6 = 1.000_dp
858 0 : sr6 = 1.4853_dp
859 0 : s8 = 1.7553_dp
860 : CASE ("O3LYP")
861 0 : s6 = 1.000_dp
862 0 : sr6 = 1.4060_dp
863 0 : s8 = 1.8058_dp
864 : CASE ("PW1PW")
865 0 : s6 = 1.000_dp
866 0 : sr6 = 1.4968_dp
867 0 : s8 = 1.1786_dp
868 : CASE ("PW91P86")
869 0 : s6 = 1.0000_dp
870 0 : sr6 = 2.1040_dp
871 0 : s8 = 0.8747_dp
872 : CASE ("REVPBE0")
873 0 : s6 = 1.000_dp
874 0 : sr6 = 0.949_dp
875 0 : s8 = 0.792_dp
876 : CASE ("REVPBE38")
877 0 : s6 = 1.000_dp
878 0 : sr6 = 1.021_dp
879 0 : s8 = 0.862_dp
880 : CASE ("REVTPSSh")
881 0 : s6 = 1.000_dp
882 0 : sr6 = 1.3224_dp
883 0 : s8 = 1.2504_dp
884 : CASE ("REVTPSS0")
885 0 : s6 = 1.000_dp
886 0 : sr6 = 1.2881_dp
887 0 : s8 = 1.0649_dp
888 : CASE ("TPSS1KCIS")
889 0 : s6 = 1.000_dp
890 0 : sr6 = 1.7729_dp
891 0 : s8 = 2.0902_dp
892 : CASE ("THCTHHYB")
893 0 : s6 = 1.000_dp
894 0 : sr6 = 1.5001_dp
895 0 : s8 = 1.6302_dp
896 : CASE ("RPW86PBE")
897 0 : s6 = 1.000_dp
898 0 : sr6 = 1.224_dp
899 0 : s8 = 0.901_dp
900 : CASE ("SCAN")
901 0 : s6 = 1.000_dp
902 0 : sr6 = 1.324_dp
903 0 : s8 = 0.000_dp
904 : CASE ("THCTH")
905 0 : s6 = 1.000_dp
906 0 : sr6 = 0.932_dp
907 0 : s8 = 0.5662_dp
908 : CASE ("XLYP")
909 0 : s6 = 1.0000_dp
910 0 : sr6 = 0.9384_dp
911 0 : s8 = 0.7447_dp
912 : CASE ("X3LYP")
913 0 : s6 = 1.000_dp
914 0 : sr6 = 1.0000_dp
915 56 : s8 = 0.2990_dp
916 : END SELECT
917 :
918 56 : END SUBROUTINE qs_scaling_dftd3
919 :
920 : ! **************************************************************************************************
921 : !> \brief ...
922 : !> \param s6 ...
923 : !> \param a1 ...
924 : !> \param s8 ...
925 : !> \param a2 ...
926 : !> \param ref_functional ...
927 : ! **************************************************************************************************
928 36 : SUBROUTINE qs_scaling_dftd3bj(s6, a1, s8, a2, ref_functional)
929 : REAL(KIND=dp), INTENT(inout) :: s6, a1, s8, a2
930 : CHARACTER(LEN=default_string_length), INTENT(in) :: ref_functional
931 :
932 : CHARACTER(LEN=default_string_length) :: functional
933 :
934 36 : functional = ref_functional
935 36 : CALL uppercase(functional)
936 :
937 : ! values for different functionals from:
938 : ! http://www.thch.uni-bonn.de/tc/downloads/DFT-D3/functionalsbj.html
939 : ! L. Goerigk et al. PCCP 2017, 32147-32744, SI
940 36 : SELECT CASE (TRIM(functional))
941 : CASE DEFAULT
942 : ! unknown functional
943 0 : CPABORT("No DFT-D3(BJ) values available for this functional:"//TRIM(functional))
944 : CASE ("B1B95")
945 0 : s6 = 1.0000_dp
946 0 : a1 = 0.2092_dp
947 0 : s8 = 1.4507_dp
948 0 : a2 = 5.5545_dp
949 : CASE ("B2GPPLYP")
950 0 : s6 = 0.5600_dp
951 0 : a1 = 0.0000_dp
952 0 : s8 = 0.2597_dp
953 0 : a2 = 6.3332_dp
954 : CASE ("B3PW91")
955 0 : s6 = 1.0000_dp
956 0 : a1 = 0.4312_dp
957 0 : s8 = 2.8524_dp
958 0 : a2 = 4.4693_dp
959 : CASE ("BHLYP")
960 0 : s6 = 1.0000_dp
961 0 : a1 = 0.2793_dp
962 0 : s8 = 1.0354_dp
963 0 : a2 = 4.9615_dp
964 : CASE ("BMK")
965 0 : s6 = 1.0000_dp
966 0 : a1 = 0.1940_dp
967 0 : s8 = 2.0860_dp
968 0 : a2 = 5.9197_dp
969 : CASE ("BOP")
970 0 : s6 = 1.0000_dp
971 0 : a1 = 0.4870_dp
972 0 : s8 = 3.2950_dp
973 0 : a2 = 3.5043_dp
974 : CASE ("BPBE")
975 0 : s6 = 1.0000_dp
976 0 : a1 = 0.4567_dp
977 0 : s8 = 4.0728_dp
978 0 : a2 = 4.3908_dp
979 : CASE ("B97-3C")
980 4 : s6 = 1.0000_dp
981 4 : a1 = 0.3700_dp
982 4 : s8 = 1.5000_dp
983 4 : a2 = 4.1000_dp
984 : CASE ("CAMB3LYP")
985 0 : s6 = 1.0000_dp
986 0 : a1 = 0.3708_dp
987 0 : s8 = 2.0674_dp
988 0 : a2 = 5.4743_dp
989 : CASE ("DSDBLYP")
990 0 : s6 = 0.5000_dp
991 0 : a1 = 0.0000_dp
992 0 : s8 = 0.2130_dp
993 0 : a2 = 6.0519_dp
994 : CASE ("DSDPBEP86")
995 0 : s6 = 0.4180_dp
996 0 : a1 = 0.0000_dp
997 0 : s8 = 0.0000_dp
998 0 : a2 = 5.6500_dp
999 : CASE ("DSDPBEB95")
1000 0 : s6 = 0.6100_dp
1001 0 : a1 = 0.0000_dp
1002 0 : s8 = 0.0000_dp
1003 0 : a2 = 6.2000_dp
1004 : CASE ("LCWPBE")
1005 0 : s6 = 1.0000_dp
1006 0 : a1 = 0.3919_dp
1007 0 : s8 = 1.8541_dp
1008 0 : a2 = 5.0897_dp
1009 : CASE ("LCWhPBE")
1010 0 : s6 = 1.0000_dp
1011 0 : a1 = 0.2746_dp
1012 0 : s8 = 1.1908_dp
1013 0 : a2 = 5.3157_dp
1014 : CASE ("MPW1B95")
1015 0 : s6 = 1.0000_dp
1016 0 : a1 = 0.1955_dp
1017 0 : s8 = 1.0508_dp
1018 0 : a2 = 6.4177_dp
1019 : CASE ("MPW2PLYP")
1020 0 : s6 = 0.6600_dp
1021 0 : a1 = 0.4105_dp
1022 0 : s8 = 0.6223_dp
1023 0 : a2 = 5.0136_dp
1024 : CASE ("MPWB1K")
1025 0 : s6 = 1.0000_dp
1026 0 : a1 = 0.1474_dp
1027 0 : s8 = 0.9499_dp
1028 0 : a2 = 6.6223_dp
1029 : CASE ("MPWLYP")
1030 0 : s6 = 1.0000_dp
1031 0 : a1 = 0.4831_dp
1032 0 : s8 = 2.0077_dp
1033 0 : a2 = 4.5323_dp
1034 : CASE ("OLYP")
1035 0 : s6 = 1.0000_dp
1036 0 : a1 = 0.5299_dp
1037 0 : s8 = 2.6205_dp
1038 0 : a2 = 2.8065_dp
1039 : CASE ("OPBE")
1040 0 : s6 = 1.0000_dp
1041 0 : a1 = 0.5512_dp
1042 0 : s8 = 3.3816_dp
1043 0 : a2 = 2.9444_dp
1044 : CASE ("OTPSS")
1045 0 : s6 = 1.0000_dp
1046 0 : a1 = 0.4634_dp
1047 0 : s8 = 2.7495_dp
1048 0 : a2 = 4.3153_dp
1049 : CASE ("PBE38")
1050 0 : s6 = 1.0000_dp
1051 0 : a1 = 0.3995_dp
1052 0 : s8 = 1.4623_dp
1053 0 : a2 = 5.1405_dp
1054 : CASE ("PBEsol")
1055 0 : s6 = 1.0000_dp
1056 0 : a1 = 0.4466_dp
1057 0 : s8 = 2.9491_dp
1058 0 : a2 = 6.1742_dp
1059 : CASE ("PTPSS")
1060 0 : s6 = 0.7500_dp
1061 0 : a1 = 0.0000_dp
1062 0 : s8 = 0.2804_dp
1063 0 : a2 = 6.5745_dp
1064 : CASE ("PWB6K")
1065 0 : s6 = 1.0000_dp
1066 0 : a1 = 0.1805_dp
1067 0 : s8 = 0.9383_dp
1068 0 : a2 = 7.7627_dp
1069 : CASE ("revSSB")
1070 0 : s6 = 1.0000_dp
1071 0 : a1 = 0.4720_dp
1072 0 : s8 = 0.4389_dp
1073 0 : a2 = 4.0986_dp
1074 : CASE ("SSB")
1075 0 : s6 = 1.0000_dp
1076 0 : a1 = -0.0952_dp
1077 0 : s8 = -0.1744_dp
1078 0 : a2 = 5.2170_dp
1079 : CASE ("TPSSh")
1080 0 : s6 = 1.0000_dp
1081 0 : a1 = 0.4529_dp
1082 0 : s8 = 2.2382_dp
1083 0 : a2 = 4.6550_dp
1084 : CASE ("HCTH120")
1085 0 : s6 = 1.0000_dp
1086 0 : a1 = 0.3563_dp
1087 0 : s8 = 1.0821_dp
1088 0 : a2 = 4.3359_dp
1089 : CASE ("B2PLYP")
1090 0 : s6 = 0.6400_dp
1091 0 : a1 = 0.3065_dp
1092 0 : s8 = 0.9147_dp
1093 0 : a2 = 5.0570_dp
1094 : CASE ("B1LYP")
1095 0 : s6 = 1.0000_dp
1096 0 : a1 = 0.1986_dp
1097 0 : s8 = 2.1167_dp
1098 0 : a2 = 5.3875_dp
1099 : CASE ("B1P86")
1100 0 : s6 = 1.0000_dp
1101 0 : a1 = 0.4724_dp
1102 0 : s8 = 3.5681_dp
1103 0 : a2 = 4.9858_dp
1104 : CASE ("B3LYP", "SKALA", "SKALA-1.1", "SKALA1.1")
1105 4 : s6 = 1.0000_dp
1106 4 : a1 = 0.3981_dp
1107 4 : s8 = 1.9889_dp
1108 4 : a2 = 4.4211_dp
1109 : CASE ("B3P86")
1110 0 : s6 = 1.0000_dp
1111 0 : a1 = 0.4601_dp
1112 0 : s8 = 3.3211_dp
1113 0 : a2 = 4.9294_dp
1114 : CASE ("B97-1")
1115 0 : s6 = 1.0000_dp
1116 0 : a1 = 0.0000_dp
1117 0 : s8 = 0.4814_dp
1118 0 : a2 = 6.2279_dp
1119 : CASE ("B97-2")
1120 0 : s6 = 1.0000_dp
1121 0 : a1 = 0.0000_dp
1122 0 : s8 = 0.9448_dp
1123 0 : a2 = 5.4603_dp
1124 : CASE ("B97-D")
1125 0 : s6 = 1.0000_dp
1126 0 : a1 = 0.5545_dp
1127 0 : s8 = 2.2609_dp
1128 0 : a2 = 3.2297_dp
1129 : CASE ("B98")
1130 0 : s6 = 1.0000_dp
1131 0 : a1 = 0.0000_dp
1132 0 : s8 = 0.7086_dp
1133 0 : a2 = 6.0672_dp
1134 : CASE ("BLYP")
1135 6 : s6 = 1.0000_dp
1136 6 : a1 = 0.4298_dp
1137 6 : s8 = 2.6996_dp
1138 6 : a2 = 4.2359_dp
1139 : CASE ("BP86")
1140 2 : s6 = 1.0000_dp
1141 2 : a1 = 0.3946_dp
1142 2 : s8 = 3.2822_dp
1143 2 : a2 = 4.8516_dp
1144 : CASE ("DSD-BLYP")
1145 0 : s6 = 0.5000_dp
1146 0 : a1 = 0.0000_dp
1147 0 : s8 = 0.2130_dp
1148 0 : a2 = 6.0519_dp
1149 : CASE ("HCTH407")
1150 0 : s6 = 1.0000_dp
1151 0 : a1 = 0.0000_dp
1152 0 : s8 = 0.6490_dp
1153 0 : a2 = 4.8162_dp
1154 : CASE ("HISS")
1155 0 : s6 = 1.0000_dp
1156 0 : a1 = 0.0000_dp
1157 0 : s8 = 1.6112_dp
1158 0 : a2 = 7.3539_dp
1159 : CASE ("HSE03")
1160 0 : s6 = 1.0000_dp
1161 0 : a1 = 0.0000_dp
1162 0 : s8 = 1.1243_dp
1163 0 : a2 = 6.8889_dp
1164 : CASE ("HSE06")
1165 0 : s6 = 1.0000_dp
1166 0 : a1 = 0.3830_dp
1167 0 : s8 = 2.3100_dp
1168 0 : a2 = 5.6850_dp
1169 : CASE ("M11")
1170 0 : s6 = 1.0000_dp
1171 0 : a1 = 0.0000_dp
1172 0 : s8 = 2.8112_dp
1173 0 : a2 = 10.1389_dp
1174 : CASE ("MN12SX")
1175 0 : s6 = 1.0000_dp
1176 0 : a1 = 0.0983_dp
1177 0 : s8 = 1.1674_dp
1178 0 : a2 = 8.0259_dp
1179 : CASE ("MN15")
1180 0 : s6 = 1.0000_dp
1181 0 : a1 = 2.0971_dp
1182 0 : s8 = 0.7862_dp
1183 0 : a2 = 7.5923_dp
1184 : CASE ("mPWPW91")
1185 0 : s6 = 1.0000_dp
1186 0 : a1 = 0.3168_dp
1187 0 : s8 = 1.7974_dp
1188 0 : a2 = 4.7732_dp
1189 : CASE ("MPW1PW91")
1190 0 : s6 = 1.0000_dp
1191 0 : a1 = 0.3342_dp
1192 0 : s8 = 1.8744_dp
1193 0 : a2 = 4.9819_dp
1194 : CASE ("MPW1KCIS")
1195 0 : s6 = 1.0000_dp
1196 0 : a1 = 0.0576_dp
1197 0 : s8 = 1.0893_dp
1198 0 : a2 = 5.5314_dp
1199 : CASE ("MPWKCIS1K")
1200 0 : s6 = 1.0000_dp
1201 0 : a1 = 0.0855_dp
1202 0 : s8 = 1.2875_dp
1203 0 : a2 = 5.8961_dp
1204 : CASE ("N12SX")
1205 0 : s6 = 1.0000_dp
1206 0 : a1 = 0.3283_dp
1207 0 : s8 = 2.4900_dp
1208 0 : a2 = 5.7898_dp
1209 : CASE ("O3LYP")
1210 0 : s6 = 1.0000_dp
1211 0 : a1 = 0.0963_dp
1212 0 : s8 = 1.8171_dp
1213 0 : a2 = 5.9940_dp
1214 : CASE ("PBE0")
1215 2 : s6 = 1.0000_dp
1216 2 : a1 = 0.4145_dp
1217 2 : s8 = 1.2177_dp
1218 2 : a2 = 4.8593_dp
1219 : CASE ("PBE")
1220 16 : s6 = 1.0000_dp
1221 16 : a1 = 0.4289_dp
1222 16 : s8 = 0.7875_dp
1223 16 : a2 = 4.4407_dp
1224 : CASE ("PBEhPBE")
1225 0 : s6 = 1.0000_dp
1226 0 : a1 = 0.0000_dp
1227 0 : s8 = 1.1152_dp
1228 0 : a2 = 6.7184_dp
1229 : CASE ("PBEh1PBE")
1230 0 : s6 = 1.0000_dp
1231 0 : a1 = 0.0000_dp
1232 0 : s8 = 1.4877_dp
1233 0 : a2 = 7.0385_dp
1234 : CASE ("PBE1KCIS")
1235 0 : s6 = 1.0000_dp
1236 0 : a1 = 0.0000_dp
1237 0 : s8 = 0.7688_dp
1238 0 : a2 = 6.2794_dp
1239 : CASE ("PW6B95")
1240 0 : s6 = 1.0000_dp
1241 0 : a1 = 0.2076_dp
1242 0 : s8 = 0.7257_dp
1243 0 : a2 = 6.3750_dp
1244 : CASE ("PWPB95")
1245 0 : s6 = 0.8200_dp
1246 0 : a1 = 0.0000_dp
1247 0 : s8 = 0.2904_dp
1248 0 : a2 = 7.3141_dp
1249 : CASE ("revPBE0")
1250 0 : s6 = 1.0000_dp
1251 0 : a1 = 0.4679_dp
1252 0 : s8 = 1.7588_dp
1253 0 : a2 = 3.7619_dp
1254 : CASE ("revPBE38")
1255 0 : s6 = 1.0000_dp
1256 0 : a1 = 0.4309_dp
1257 0 : s8 = 1.4760_dp
1258 0 : a2 = 3.9446_dp
1259 : CASE ("revPBE")
1260 0 : s6 = 1.0000_dp
1261 0 : a1 = 0.5238_dp
1262 0 : s8 = 2.3550_dp
1263 0 : a2 = 3.5016_dp
1264 : CASE ("revTPSS")
1265 0 : s6 = 1.0000_dp
1266 0 : a1 = 0.4426_dp
1267 0 : s8 = 1.4023_dp
1268 0 : a2 = 4.4723_dp
1269 : CASE ("revTPSS0")
1270 0 : s6 = 1.0000_dp
1271 0 : a1 = 0.2218_dp
1272 0 : s8 = 1.6151_dp
1273 0 : a2 = 5.7985_dp
1274 : CASE ("revTPSSh")
1275 0 : s6 = 1.0000_dp
1276 0 : a1 = 0.2660_dp
1277 0 : s8 = 1.4076_dp
1278 0 : a2 = 5.3761_dp
1279 : CASE ("RPBE")
1280 0 : s6 = 1.0000_dp
1281 0 : a1 = 0.1820_dp
1282 0 : s8 = 0.8318_dp
1283 0 : a2 = 4.0094_dp
1284 : CASE ("RPW86PBE")
1285 0 : s6 = 1.0000_dp
1286 0 : a1 = 0.4613_dp
1287 0 : s8 = 1.3845_dp
1288 0 : a2 = 4.5062_dp
1289 : CASE ("SCAN")
1290 0 : s6 = 1.0000_dp
1291 0 : a1 = 0.538_dp
1292 0 : s8 = 0.0000_dp
1293 0 : a2 = 5.420_dp
1294 : CASE ("SOGGA11X")
1295 0 : s6 = 1.0000_dp
1296 0 : a1 = 0.1330_dp
1297 0 : s8 = 1.1426_dp
1298 0 : a2 = 5.7381_dp
1299 : CASE ("TPSS0")
1300 0 : s6 = 1.0000_dp
1301 0 : a1 = 0.3768_dp
1302 0 : s8 = 1.2576_dp
1303 0 : a2 = 4.5865_dp
1304 : CASE ("TPSS1KCIS")
1305 0 : s6 = 1.0000_dp
1306 0 : a1 = 0.0000_dp
1307 0 : s8 = 1.0542_dp
1308 0 : a2 = 6.0201_dp
1309 : CASE ("TPSS")
1310 2 : s6 = 1.0000_dp
1311 2 : a1 = 0.4535_dp
1312 2 : s8 = 1.9435_dp
1313 2 : a2 = 4.4752_dp
1314 : CASE ("tHCTH")
1315 0 : s6 = 1.0000_dp
1316 0 : a1 = 0.0000_dp
1317 0 : s8 = 1.2626_dp
1318 0 : a2 = 5.6162_dp
1319 : CASE ("tHCTHhyb")
1320 0 : s6 = 1.0000_dp
1321 0 : a1 = 0.0000_dp
1322 0 : s8 = 0.9585_dp
1323 0 : a2 = 6.2303_dp
1324 : CASE ("XLYP")
1325 0 : s6 = 1.0000_dp
1326 0 : a1 = 0.0809_dp
1327 0 : s8 = 1.5669_dp
1328 0 : a2 = 5.3166_dp
1329 : CASE ("X3LYP")
1330 0 : s6 = 1.0000_dp
1331 0 : a1 = 0.2022_dp
1332 0 : s8 = 1.5744_dp
1333 36 : a2 = 5.4184_dp
1334 : END SELECT
1335 :
1336 36 : END SUBROUTINE qs_scaling_dftd3bj
1337 :
1338 : ! **************************************************************************************************
1339 : !> \brief ...
1340 : !> \param cell ...
1341 : !> \param ncell ...
1342 : !> \return ...
1343 : ! **************************************************************************************************
1344 3014448 : FUNCTION cellhash(cell, ncell) RESULT(hash)
1345 : INTEGER, DIMENSION(3), INTENT(IN) :: cell, ncell
1346 : INTEGER :: hash
1347 :
1348 : INTEGER :: ix, iy, iz, nx, ny, nz
1349 :
1350 12057792 : CPASSERT(ALL(ABS(cell) <= ncell))
1351 :
1352 3014448 : ix = cell(1)
1353 3014448 : IF (ix /= 0) THEN
1354 2582800 : ix = 2*ABS(ix) - (1 + SIGN(1, ix))/2
1355 : END IF
1356 3014448 : iy = cell(2)
1357 3014448 : IF (iy /= 0) THEN
1358 2582812 : iy = 2*ABS(iy) - (1 + SIGN(1, iy))/2
1359 : END IF
1360 3014448 : iz = cell(3)
1361 3014448 : IF (iz /= 0) THEN
1362 2582812 : iz = 2*ABS(iz) - (1 + SIGN(1, iz))/2
1363 : END IF
1364 :
1365 3014448 : nx = 2*ncell(1) + 1
1366 3014448 : ny = 2*ncell(2) + 1
1367 3014448 : nz = 2*ncell(3) + 1
1368 :
1369 3014448 : hash = ix*ny*nz + iy*nz + iz + 1
1370 :
1371 3014448 : END FUNCTION cellhash
1372 : ! **************************************************************************************************
1373 :
1374 : END MODULE qs_dispersion_utils
|