(git:1f9fd2c)
Loading...
Searching...
No Matches
qs_dispersion_s_dftd3.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
9
10 USE kinds, ONLY: default_string_length, &
11 dp
14
15#if defined(__S_DFTD3)
16 USE dftd3_data_r4r2, ONLY: get_r4r2_val
17 USE dftd3_data_vdwrad, ONLY: get_vdw_rad
18 USE dftd3_param, ONLY: d3_param, &
19 get_rational_damping, &
20 get_zero_damping
21 USE dftd3_reference, ONLY: init_reference_c6, &
22 get_c6, &
23 reference_cn, &
24 number_of_references
25 USE mctc_data, ONLY: get_covalent_rad
26 USE mctc_env, ONLY: error_type
27#endif
28
29#include "./base/base_uses.f90"
30
31 IMPLICIT NONE
32
33 PRIVATE
34
35 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_dispersion_s_dftd3'
36
38
39CONTAINS
40
41! **************************************************************************************************
42!> \brief Check if a functional is supported by the s-dftd3 library
43!> \param pp_type ...
44!> \param ref_functional ...
45!> \param found ...
46! **************************************************************************************************
47 SUBROUTINE dftd3_functional_supported(pp_type, ref_functional, found)
48 INTEGER, INTENT(IN) :: pp_type
49 CHARACTER(LEN=*), INTENT(IN) :: ref_functional
50 LOGICAL, INTENT(OUT) :: found
51
52#if defined(__S_DFTD3)
53
54 CHARACTER(LEN=default_string_length) :: func_name
55 TYPE(d3_param) :: d3params
56 TYPE(error_type), ALLOCATABLE :: lib_error
57
58 ALLOCATE (lib_error)
59 func_name = ref_functional
60 d3params = d3_param()
61 found = .true.
62
63 SELECT CASE (pp_type)
64 CASE (2)
65 CALL get_zero_damping(d3params, func_name, lib_error)
66 CASE (3)
67 CALL get_rational_damping(d3params, func_name, lib_error)
68 CASE DEFAULT
69 d3params = d3_param()
70 END SELECT
71
72 found = .NOT. ALLOCATED(lib_error)
73
74#else
75 mark_used(pp_type)
76 mark_used(ref_functional)
77 found = .false.
78#endif
79
80 END SUBROUTINE dftd3_functional_supported
81
82! **************************************************************************************************
83!> \brief ...
84!> \param c6ab ...
85!> \param maxci ...
86!> \param r0ab ...
87!> \param rcov ...
88!> \param r2r4 ...
89!> \param pp_type ...
90!> \param ref_functional ...
91!> \param s6 ...
92!> \param s8 ...
93!> \param a1 ...
94!> \param a2 ...
95!> \param sr6 ...
96!> \param para_env ...
97!> \param error ...
98!> \param calc_scaling ...
99! **************************************************************************************************
100 SUBROUTINE dftd3_param_from_library(c6ab, maxci, r0ab, rcov, r2r4, &
101 pp_type, ref_functional, &
102 s6, s8, a1, a2, sr6, &
103 para_env, error, calc_scaling)
104
105 REAL(kind=dp), DIMENSION(:, :, :, :, :), &
106 INTENT(INOUT) :: c6ab
107 INTEGER, DIMENSION(:), INTENT(INOUT) :: maxci
108 REAL(kind=dp), DIMENSION(:, :), INTENT(INOUT) :: r0ab
109 REAL(kind=dp), DIMENSION(:), INTENT(INOUT) :: rcov, r2r4
110 INTEGER, INTENT(IN) :: pp_type
111 CHARACTER(LEN=*), INTENT(IN) :: ref_functional
112 REAL(kind=dp), INTENT(INOUT) :: s6, s8, a1, a2, sr6
113 TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
114 CHARACTER(LEN=*), INTENT(OUT), OPTIONAL :: error
115 LOGICAL, INTENT(IN), OPTIONAL :: calc_scaling
116
117#if defined(__S_DFTD3)
118
119 CHARACTER(LEN=*), PARAMETER :: routinen = 'dftd3_param_from_library'
120
121 CHARACTER(LEN=default_string_length) :: func_name
122 INTEGER :: handle, i, iz, jref, jz, nelem, nref
123 LOGICAL :: do_calc_scaling
124 REAL(kind=dp) :: c6_val, r4r2, rcov_val
125 REAL(kind=dp), DIMENSION(94) :: r2r4_tmp, rcov_tmp
126 TYPE(d3_param) :: d3params
127 TYPE(error_type), ALLOCATABLE :: lib_error
128
129 CALL timeset(routinen, handle)
130
131 CALL init_reference_c6()
132
133 nref = 7
134 nelem = min(94, SIZE(maxci))
135
136 maxci(:) = 0
137 DO iz = 1, nelem
138 maxci(iz) = number_of_references(iz)
139 END DO
140
141 IF (para_env%is_source()) THEN
142 DO iz = 1, nelem
143 rcov_val = get_covalent_rad(iz)
144 rcov_tmp(iz) = rcov_val
145
146 r4r2 = get_r4r2_val(iz)
147 r2r4_tmp(iz) = r4r2
148 END DO
149
150 r0ab = 0.0_dp
151 DO iz = 1, nelem
152 DO jz = 1, nelem
153 IF (r2r4_tmp(iz) > 0.0_dp .AND. r2r4_tmp(jz) > 0.0_dp) THEN
154 r0ab(iz, jz) = get_vdw_rad(iz, jz)
155 END IF
156 END DO
157 END DO
158
159 c6ab = 0.0_dp
160 DO jref = 1, nref
161 DO jz = 1, nelem
162 DO i = 1, nref
163 DO iz = 1, nelem
164 c6_val = get_c6(i, jref, iz, jz)
165 c6ab(iz, jz, i, jref, 1) = c6_val
166 c6ab(iz, jz, i, jref, 2) = reference_cn(i, iz)
167 c6ab(iz, jz, i, jref, 3) = reference_cn(jref, jz)
168 END DO
169 END DO
170 END DO
171 END DO
172 END IF
173
174 CALL para_env%bcast(r2r4_tmp)
175 CALL para_env%bcast(r0ab)
176 CALL para_env%bcast(rcov_tmp)
177
178 IF (.NOT. para_env%is_source()) THEN
179 c6ab = 0.0_dp
180 DO jref = 1, nref
181 DO jz = 1, nelem
182 DO i = 1, nref
183 DO iz = 1, nelem
184 c6_val = get_c6(i, jref, iz, jz)
185 c6ab(iz, jz, i, jref, 1) = c6_val
186 c6ab(iz, jz, i, jref, 2) = reference_cn(i, iz)
187 c6ab(iz, jz, i, jref, 3) = reference_cn(jref, jz)
188 END DO
189 END DO
190 END DO
191 END DO
192 END IF
193
194 r2r4(:nelem) = r2r4_tmp(:nelem)
195 rcov(:nelem) = rcov_tmp(:nelem)
196
197 func_name = ref_functional
198 d3params = d3_param()
199
200 IF (para_env%is_source()) THEN
201 SELECT CASE (pp_type)
202 CASE (2)
203 CALL get_zero_damping(d3params, func_name, lib_error)
204 CASE (3)
205 CALL get_rational_damping(d3params, func_name, lib_error)
206 CASE DEFAULT
207 d3params = d3_param()
208 END SELECT
209 IF (ALLOCATED(lib_error)) THEN
210 IF (PRESENT(error)) THEN
211 error = "Functional '"//trim(ref_functional)//"' not found in s-dftd3 library"
212 END IF
213 RETURN
214 END IF
215 END IF
216
217 CALL para_env%bcast(func_name)
218 CALL para_env%bcast(d3params%s6)
219 CALL para_env%bcast(d3params%s8)
220 CALL para_env%bcast(d3params%a1)
221 CALL para_env%bcast(d3params%a2)
222 CALL para_env%bcast(d3params%rs6)
223
224 IF (PRESENT(error)) error = ""
225
226 do_calc_scaling = .true.
227 IF (PRESENT(calc_scaling)) do_calc_scaling = calc_scaling
228
229 IF (do_calc_scaling) THEN
230 s6 = d3params%s6
231 s8 = d3params%s8
232 a1 = d3params%a1
233 a2 = d3params%a2
234 sr6 = d3params%rs6
235 END IF
236
237 CALL timestop(handle)
238
239#else
240 mark_used(c6ab)
241 mark_used(maxci)
242 mark_used(r0ab)
243 mark_used(rcov)
244 mark_used(r2r4)
245 mark_used(pp_type)
246 mark_used(ref_functional)
247 mark_used(s6)
248 mark_used(s8)
249 mark_used(a1)
250 mark_used(a2)
251 mark_used(sr6)
252 mark_used(para_env)
253 mark_used(error)
254 mark_used(calc_scaling)
255 cpabort("s-dftd3 library not compiled in")
256#endif
257
258 END SUBROUTINE dftd3_param_from_library
259
260END MODULE qs_dispersion_s_dftd3
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Interface to the message passing library MPI.
Coordination number routines for dispersion pairpotentials.
subroutine, public setr0ab(rout, rcov, r2r4)
...
subroutine, public dftd3_functional_supported(pp_type, ref_functional, found)
Check if a functional is supported by the s-dftd3 library.
subroutine, public dftd3_param_from_library(c6ab, maxci, r0ab, rcov, r2r4, pp_type, ref_functional, s6, s8, a1, a2, sr6, para_env, error, calc_scaling)
...
stores all the informations relevant to an mpi environment