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 Interface to the Libint-Library or a c++ wrapper.
10 : !> \par History
11 : !> 11.2007 created [Manuel Guidon]
12 : !> 10.2009 refactored [Manuel Guidon]
13 : !> \author Manuel Guidon
14 : ! **************************************************************************************************
15 : MODULE libint_wrapper
16 :
17 : #if(__LIBINT)
18 : #include <libint2/libint2_params.h>
19 : #include <libint2/config.h>
20 : #endif
21 :
22 : ! maximum angular momentum to be supported in CP2K-LIBINT interface
23 : #:set libint_max_am_supported = 8
24 :
25 : USE ISO_C_BINDING, ONLY: C_ASSOCIATED, &
26 : C_F_POINTER, &
27 : C_F_PROCPOINTER, &
28 : C_NULL_PTR, &
29 : C_FUNPTR
30 : USE cp_log_handling, ONLY: cp_to_string
31 : USE kinds, ONLY: dp
32 : #if(__LIBINT)
33 : USE libint_f, ONLY: &
34 : libint2_build, libint2_build_eri, libint2_build_eri1, libint2_cleanup_eri, &
35 : libint2_cleanup_eri1, libint2_init_eri, libint2_init_eri1, libint2_static_cleanup, &
36 : libint2_static_init, libint_t, libint2_max_am_eri, libint2_init_3eri, libint2_cleanup_3eri, &
37 : libint2_init_2eri, libint2_cleanup_2eri, &
38 : libint2_build_2eri, libint2_build_3eri, libint2_build_3eri1, libint2_cleanup_3eri1, libint2_init_3eri1, &
39 : libint2_build_2eri1, libint2_cleanup_2eri1, libint2_init_2eri1
40 : #endif
41 : USE orbital_pointers, ONLY: nco
42 : #include "./base/base_uses.f90"
43 :
44 : IMPLICIT NONE
45 : PRIVATE
46 : PUBLIC :: cp_libint_t, prim_data_f_size, build_eri_size, build_deriv1_eri_size, &
47 : libint_max_am, libderiv_max_am1, cp_libint_get_eris, cp_libint_get_derivs, &
48 : cp_libint_init_eri, cp_libint_init_eri1, cp_libint_cleanup_eri, &
49 : cp_libint_cleanup_eri1, cp_libint_static_init, cp_libint_static_cleanup, &
50 : get_ssss_f_val, cp_libint_set_contrdepth, cp_libint_set_params_eri_screen, &
51 : cp_libint_set_params_eri, cp_libint_set_params_eri_deriv, &
52 : cp_libint_init_3eri, cp_libint_cleanup_3eri, cp_libint_get_3eris, &
53 : cp_libint_init_2eri, cp_libint_cleanup_2eri, cp_libint_get_2eris, &
54 : cp_libint_get_3eri_derivs, cp_libint_init_3eri1, cp_libint_cleanup_3eri1, &
55 : cp_libint_get_2eri_derivs, cp_libint_init_2eri1, cp_libint_cleanup_2eri1
56 :
57 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'libint_wrapper'
58 :
59 : #if(__LIBINT)
60 : INTEGER, PARAMETER :: libint_max_am = libint2_max_am_eri
61 : #else
62 : INTEGER, PARAMETER :: libint_max_am = 0
63 : #endif
64 :
65 : INTEGER, PARAMETER :: libderiv_max_am1 = libint_max_am
66 : INTEGER, PARAMETER :: prim_data_f_size = 4*(libint_max_am) + 1
67 : INTEGER, PARAMETER :: libint_vrr_classes_size = 2*(libint_max_am) + 1
68 : INTEGER, PARAMETER :: libint_dvrr_classes_size = 2*(libderiv_max_am1) + 1
69 : INTEGER, PARAMETER :: build_eri_size = libint_max_am
70 : INTEGER, PARAMETER :: build_deriv1_eri_size = libderiv_max_am1
71 :
72 : TYPE :: cp_libint_t
73 : PRIVATE
74 : #if(__LIBINT)
75 : TYPE(libint_t), DIMENSION(1) :: prv
76 : #else
77 : INTEGER :: unused = -1
78 : #endif
79 : END TYPE cp_libint_t
80 :
81 : CONTAINS
82 :
83 96382482 : SUBROUTINE cp_libint_set_params_eri_screen(libint, A, B, C, D, P, Q, W, ZetaInv, EtaInv, ZetapEtaInv, Rho, m_max, F)
84 : TYPE(cp_libint_t) :: libint
85 : REAL(KIND=dp), INTENT(IN), DIMENSION(3) :: A, B, C, D, P, Q, W
86 : REAL(KIND=dp), INTENT(IN) :: ZetaInv, EtaInv, ZetapEtaInv, Rho
87 : INTEGER, INTENT(IN) :: m_max
88 : REAL(KIND=dp), DIMENSION(:) :: F
89 :
90 : #if(__LIBINT)
91 96382482 : libint%prv(1)%AB_x(1) = A(1) - B(1)
92 96382482 : libint%prv(1)%AB_y(1) = A(2) - B(2)
93 96382482 : libint%prv(1)%AB_z(1) = A(3) - B(3)
94 :
95 96382482 : libint%prv(1)%CD_x(1) = C(1) - D(1)
96 96382482 : libint%prv(1)%CD_y(1) = C(2) - D(2)
97 96382482 : libint%prv(1)%CD_z(1) = C(3) - D(3)
98 :
99 96382482 : libint%prv(1)%PA_x(1) = P(1) - A(1)
100 96382482 : libint%prv(1)%PA_y(1) = P(2) - A(2)
101 96382482 : libint%prv(1)%PA_z(1) = P(3) - A(3)
102 :
103 96382482 : libint%prv(1)%QC_x(1) = Q(1) - C(1)
104 96382482 : libint%prv(1)%QC_y(1) = Q(2) - C(2)
105 96382482 : libint%prv(1)%QC_z(1) = Q(3) - C(3)
106 :
107 96382482 : libint%prv(1)%WP_x(1) = W(1) - P(1)
108 96382482 : libint%prv(1)%WP_y(1) = W(2) - P(2)
109 96382482 : libint%prv(1)%WP_z(1) = W(3) - P(3)
110 :
111 96382482 : libint%prv(1)%WQ_x(1) = W(1) - Q(1)
112 96382482 : libint%prv(1)%WQ_y(1) = W(2) - Q(2)
113 96382482 : libint%prv(1)%WQ_z(1) = W(3) - Q(3)
114 :
115 96382482 : libint%prv(1)%oo2z(1) = 0.5_dp*ZetaInv
116 96382482 : libint%prv(1)%oo2e(1) = 0.5_dp*EtaInv
117 96382482 : libint%prv(1)%oo2ze(1) = 0.5_dp*ZetapEtaInv
118 96382482 : libint%prv(1)%roz(1) = Rho*ZetaInv
119 96382482 : libint%prv(1)%roe(1) = Rho*EtaInv
120 :
121 : #:for m_max in range(0, 4*libint_max_am_supported)
122 : #if 4*LIBINT2_MAX_AM_eri > ${m_max}$ - 1
123 370948356 : IF (${m_max}$ <= m_max) THEN
124 : libint%prv(1)%f_aB_s___0__s___1___TwoPRep_s___0__s___1___Ab__up_${m_max}$ (1) &
125 274565874 : = F(${m_max}$+1)
126 : END IF
127 :
128 : #endif
129 : #:endfor
130 :
131 : #else
132 : MARK_USED(libint)
133 : MARK_USED(A)
134 : MARK_USED(B)
135 : MARK_USED(C)
136 : MARK_USED(D)
137 : MARK_USED(P)
138 : MARK_USED(Q)
139 : MARK_USED(W)
140 : MARK_USED(ZetaInv)
141 : MARK_USED(EtaInv)
142 : MARK_USED(ZetapEtaInv)
143 : MARK_USED(Rho)
144 : MARK_USED(m_max)
145 : MARK_USED(F)
146 :
147 : CPABORT("This CP2K executable has not been linked against the required library libint.")
148 : #endif
149 :
150 96382482 : END SUBROUTINE cp_libint_set_params_eri_screen
151 :
152 112113864 : SUBROUTINE cp_libint_set_params_eri_deriv(libint, A, B, C, D, P, Q, W, zeta_A, zeta_B, zeta_C, zeta_D, &
153 112113864 : ZetaInv, EtaInv, ZetapEtaInv, Rho, m_max, F)
154 : TYPE(cp_libint_t) :: libint
155 : REAL(KIND=dp), INTENT(IN), DIMENSION(3) :: A, B, C, D, P, Q, W
156 : REAL(KIND=dp), INTENT(IN) :: zeta_A, zeta_B, zeta_C, zeta_D, ZetaInv, EtaInv, ZetapEtaInv, Rho
157 :
158 : INTEGER, INTENT(IN) :: m_max
159 : REAL(KIND=dp), DIMENSION(:) :: F
160 :
161 : #if(__LIBINT)
162 : REAL(KIND=dp) :: gammap, gammaq, gammapq, rhop, rhoq
163 112113864 : libint%prv(1)%AB_x(1) = A(1) - B(1)
164 112113864 : libint%prv(1)%AB_y(1) = A(2) - B(2)
165 112113864 : libint%prv(1)%AB_z(1) = A(3) - B(3)
166 :
167 112113864 : libint%prv(1)%CD_x(1) = C(1) - D(1)
168 112113864 : libint%prv(1)%CD_y(1) = C(2) - D(2)
169 112113864 : libint%prv(1)%CD_z(1) = C(3) - D(3)
170 :
171 112113864 : libint%prv(1)%PA_x(1) = P(1) - A(1)
172 112113864 : libint%prv(1)%PA_y(1) = P(2) - A(2)
173 112113864 : libint%prv(1)%PA_z(1) = P(3) - A(3)
174 :
175 112113864 : libint%prv(1)%PB_x(1) = P(1) - B(1)
176 112113864 : libint%prv(1)%PB_y(1) = P(2) - B(2)
177 112113864 : libint%prv(1)%PB_z(1) = P(3) - B(3)
178 :
179 112113864 : libint%prv(1)%QC_x(1) = Q(1) - C(1)
180 112113864 : libint%prv(1)%QC_y(1) = Q(2) - C(2)
181 112113864 : libint%prv(1)%QC_z(1) = Q(3) - C(3)
182 :
183 112113864 : libint%prv(1)%WP_x(1) = W(1) - P(1)
184 112113864 : libint%prv(1)%WP_y(1) = W(2) - P(2)
185 112113864 : libint%prv(1)%WP_z(1) = W(3) - P(3)
186 :
187 112113864 : libint%prv(1)%WQ_x(1) = W(1) - Q(1)
188 112113864 : libint%prv(1)%WQ_y(1) = W(2) - Q(2)
189 112113864 : libint%prv(1)%WQ_z(1) = W(3) - Q(3)
190 :
191 112113864 : libint%prv(1)%two_alpha0_bra(1) = 2.0_dp*Zeta_A
192 112113864 : libint%prv(1)%two_alpha0_ket(1) = 2.0_dp*Zeta_B
193 112113864 : libint%prv(1)%two_alpha1_ket(1) = 2.0_dp*Zeta_D
194 :
195 112113864 : gammap = Zeta_A + Zeta_B
196 112113864 : gammaq = Zeta_C + Zeta_D
197 112113864 : gammapq = gammap*gammaq/(gammap + gammaq)
198 112113864 : libint%prv(1)%alpha1_rho_over_zeta2(1) = Zeta_A*gammapq/(gammap*gammap)
199 112113864 : libint%prv(1)%alpha2_rho_over_zeta2(1) = Zeta_B*gammapq/(gammap*gammap)
200 112113864 : libint%prv(1)%alpha4_rho_over_eta2(1) = Zeta_D*gammapq/(gammaq*gammaq)
201 112113864 : libint%prv(1)%alpha1_over_zetapluseta(1) = Zeta_A/(gammap + gammaq)
202 112113864 : libint%prv(1)%alpha2_over_zetapluseta(1) = Zeta_B/(gammap + gammaq)
203 112113864 : libint%prv(1)%alpha4_over_zetapluseta(1) = Zeta_D/(gammap + gammaq)
204 :
205 112113864 : rhop = Zeta_A*Zeta_B/gammap
206 112113864 : rhoq = Zeta_C*Zeta_D/gammaq
207 112113864 : libint%prv(1)%rho12_over_alpha1(1) = rhop/Zeta_A
208 :
209 112113864 : libint%prv(1)%rho34_over_alpha3(1) = rhoq/Zeta_C
210 :
211 112113864 : libint%prv(1)%oo2z(1) = 0.5_dp*ZetaInv
212 112113864 : libint%prv(1)%oo2e(1) = 0.5_dp*EtaInv
213 112113864 : libint%prv(1)%oo2ze(1) = 0.5_dp*ZetapEtaInv
214 112113864 : libint%prv(1)%roz(1) = Rho*ZetaInv
215 112113864 : libint%prv(1)%roe(1) = Rho*EtaInv
216 :
217 : #:for m_max in range(0, 4*libint_max_am_supported)
218 : #if 4*LIBINT2_MAX_AM_eri > ${m_max}$ - 1
219 499225848 : IF (${m_max}$ <= m_max) THEN
220 : libint%prv(1)%f_aB_s___0__s___1___TwoPRep_s___0__s___1___Ab__up_${m_max}$ (1) & ! ERROR: __LIBINT_MAX_AM is too large
221 387111984 : = F(${m_max}$+1)
222 : END IF
223 : #endif
224 : #:endfor
225 :
226 : #else
227 : MARK_USED(libint)
228 : MARK_USED(A)
229 : MARK_USED(B)
230 : MARK_USED(C)
231 : MARK_USED(D)
232 : MARK_USED(P)
233 : MARK_USED(Q)
234 : MARK_USED(W)
235 : MARK_USED(zeta_A)
236 : MARK_USED(zeta_B)
237 : MARK_USED(zeta_C)
238 : MARK_USED(zeta_D)
239 : MARK_USED(ZetaInv)
240 : MARK_USED(EtaInv)
241 : MARK_USED(ZetapEtaInv)
242 : MARK_USED(Rho)
243 : MARK_USED(m_max)
244 : MARK_USED(F)
245 : CPABORT("This CP2K executable has not been linked against the required library libint.")
246 : #endif
247 :
248 112113864 : END SUBROUTINE cp_libint_set_params_eri_deriv
249 :
250 437372434 : SUBROUTINE cp_libint_set_params_eri(libint, A, B, C, D, ZetaInv, EtaInv, ZetapEtaInv, Rho, P, Q, W, m_max, F)
251 : TYPE(cp_libint_t) :: libint
252 : REAL(KIND=dp), INTENT(IN), DIMENSION(3) :: A, B, C, D, P, Q, W
253 : REAL(KIND=dp), INTENT(IN) :: ZetaInv, EtaInv, ZetapEtaInv, Rho
254 : REAL(KIND=dp), DIMENSION(:) :: F
255 :
256 : INTEGER, INTENT(IN) :: m_max
257 :
258 : #if(__LIBINT)
259 437372434 : libint%prv(1)%AB_x(1) = A(1) - B(1)
260 437372434 : libint%prv(1)%AB_y(1) = A(2) - B(2)
261 437372434 : libint%prv(1)%AB_z(1) = A(3) - B(3)
262 :
263 437372434 : libint%prv(1)%CD_x(1) = C(1) - D(1)
264 437372434 : libint%prv(1)%CD_y(1) = C(2) - D(2)
265 437372434 : libint%prv(1)%CD_z(1) = C(3) - D(3)
266 :
267 437372434 : libint%prv(1)%PA_x(1) = P(1) - A(1)
268 437372434 : libint%prv(1)%PA_y(1) = P(2) - A(2)
269 437372434 : libint%prv(1)%PA_z(1) = P(3) - A(3)
270 :
271 437372434 : libint%prv(1)%QC_x(1) = Q(1) - C(1)
272 437372434 : libint%prv(1)%QC_y(1) = Q(2) - C(2)
273 437372434 : libint%prv(1)%QC_z(1) = Q(3) - C(3)
274 :
275 437372434 : libint%prv(1)%WP_x(1) = W(1) - P(1)
276 437372434 : libint%prv(1)%WP_y(1) = W(2) - P(2)
277 437372434 : libint%prv(1)%WP_z(1) = W(3) - P(3)
278 :
279 437372434 : libint%prv(1)%WQ_x(1) = W(1) - Q(1)
280 437372434 : libint%prv(1)%WQ_y(1) = W(2) - Q(2)
281 437372434 : libint%prv(1)%WQ_z(1) = W(3) - Q(3)
282 :
283 437372434 : libint%prv(1)%oo2z(1) = 0.5_dp*ZetaInv
284 437372434 : libint%prv(1)%oo2e(1) = 0.5_dp*EtaInv
285 437372434 : libint%prv(1)%oo2ze(1) = 0.5_dp*ZetapEtaInv
286 437372434 : libint%prv(1)%roz(1) = Rho*ZetaInv
287 437372434 : libint%prv(1)%roe(1) = Rho*EtaInv
288 :
289 : #:for m_max in range(0, 4*libint_max_am_supported)
290 : #if 4*LIBINT2_MAX_AM_eri > ${m_max}$ - 1
291 :
292 1758739449 : IF (${m_max}$ <= m_max) THEN
293 : libint%prv(1)%f_aB_s___0__s___1___TwoPRep_s___0__s___1___Ab__up_${m_max}$ (1) & ! ERROR: __LIBINT_MAX_AM is too large
294 1321367015 : = F(${m_max}$+1)
295 : END IF
296 : #endif
297 : #:endfor
298 :
299 : #else
300 : MARK_USED(libint)
301 : MARK_USED(A)
302 : MARK_USED(B)
303 : MARK_USED(C)
304 : MARK_USED(D)
305 : MARK_USED(P)
306 : MARK_USED(Q)
307 : MARK_USED(W)
308 : MARK_USED(ZetaInv)
309 : MARK_USED(EtaInv)
310 : MARK_USED(ZetapEtaInv)
311 : MARK_USED(Rho)
312 : MARK_USED(m_max)
313 : MARK_USED(F)
314 : CPABORT("This CP2K executable has not been linked against the required library libint.")
315 : #endif
316 :
317 437372434 : END SUBROUTINE cp_libint_set_params_eri
318 : ! **************************************************************************************************
319 : !> \brief ...
320 : !> \param n_d ...
321 : !> \param n_c ...
322 : !> \param n_b ...
323 : !> \param n_a ...
324 : !> \param lib ...
325 : !> \param p_work ...
326 : !> \param a_mysize ...
327 : ! **************************************************************************************************
328 449431714 : SUBROUTINE cp_libint_get_eris(n_d, n_c, n_b, n_a, lib, p_work, a_mysize)
329 : INTEGER, INTENT(IN) :: n_d, n_c, n_b, n_a
330 : TYPE(cp_libint_t) :: lib
331 : REAL(dp), DIMENSION(:), POINTER :: p_work
332 : INTEGER :: a_mysize(1)
333 :
334 : #if(__LIBINT)
335 : PROCEDURE(libint2_build), POINTER :: pbuild
336 :
337 449431714 : CALL C_F_PROCPOINTER(libint2_build_eri(n_d, n_c, n_b, n_a), pbuild)
338 449431714 : CALL pbuild(lib%prv)
339 :
340 898863428 : CALL C_F_POINTER(lib%prv(1)%targets(1), p_work, SHAPE=a_mysize)
341 : #else
342 : MARK_USED(n_d)
343 : MARK_USED(n_c)
344 : MARK_USED(n_b)
345 : MARK_USED(n_a)
346 : MARK_USED(lib)
347 : MARK_USED(p_work)
348 : MARK_USED(a_mysize)
349 : CPABORT("This CP2K executable has not been linked against the required library libint.")
350 : #endif
351 :
352 449431714 : END SUBROUTINE cp_libint_get_eris
353 :
354 : ! **************************************************************************************************
355 : !> \brief ...
356 : !> \param n_c ...
357 : !> \param n_b ...
358 : !> \param n_a ...
359 : !> \param lib ...
360 : !> \param p_work ...
361 : !> \param a_mysize ...
362 : ! **************************************************************************************************
363 57418450 : SUBROUTINE cp_libint_get_3eris(n_c, n_b, n_a, lib, p_work, a_mysize)
364 : INTEGER, INTENT(IN) :: n_c, n_b, n_a
365 : TYPE(cp_libint_t) :: lib
366 : REAL(dp), DIMENSION(:), POINTER :: p_work
367 : INTEGER :: a_mysize(1)
368 :
369 : #if(__LIBINT)
370 : CHARACTER(LEN=160) :: error_msg
371 : PROCEDURE(libint2_build), POINTER :: pbuild
372 : TYPE(C_FUNPTR) :: build_funptr
373 :
374 57418450 : build_funptr = libint2_build_3eri(n_c, n_b, n_a)
375 57418450 : IF (.NOT. C_ASSOCIATED(build_funptr)) THEN
376 : error_msg = "LIBINT has no 3-center ERI kernel for (lc,lb,la)=("// &
377 : TRIM(cp_to_string(n_c))//","//TRIM(cp_to_string(n_b))//","// &
378 0 : TRIM(cp_to_string(n_a))//")"
379 0 : CALL cp_abort(__LOCATION__, TRIM(error_msg))
380 : END IF
381 57418450 : CALL C_F_PROCPOINTER(build_funptr, pbuild)
382 57418450 : CALL pbuild(lib%prv)
383 :
384 114836900 : CALL C_F_POINTER(lib%prv(1)%targets(1), p_work, SHAPE=a_mysize)
385 : #else
386 : MARK_USED(n_c)
387 : MARK_USED(n_b)
388 : MARK_USED(n_a)
389 : MARK_USED(lib)
390 : MARK_USED(p_work)
391 : MARK_USED(a_mysize)
392 : CPABORT("This CP2K executable has not been linked against the required library libint.")
393 : #endif
394 :
395 57418450 : END SUBROUTINE cp_libint_get_3eris
396 :
397 : ! **************************************************************************************************
398 : !> \brief ...
399 : !> \param n_c ...
400 : !> \param n_b ...
401 : !> \param n_a ...
402 : !> \param lib ...
403 : !> \param p_work ...
404 : !> \param a_mysize ...
405 : ! **************************************************************************************************
406 4737818 : SUBROUTINE cp_libint_get_3eri_derivs(n_c, n_b, n_a, lib, p_work, a_mysize)
407 : INTEGER, INTENT(IN) :: n_c, n_b, n_a
408 : TYPE(cp_libint_t) :: lib
409 : INTEGER :: a_mysize(1)
410 : REAL(dp), DIMENSION(:, :), POINTER :: p_work
411 :
412 : #if(__LIBINT)
413 4737818 : REAL(dp), DIMENSION(:), POINTER :: p_work_tmp
414 : PROCEDURE(libint2_build), POINTER :: pbuild
415 : INTEGER :: i
416 :
417 4737818 : CALL C_F_PROCPOINTER(libint2_build_3eri1(n_c, n_b, n_a), pbuild)
418 4737818 : CALL pbuild(lib%prv)
419 :
420 14213454 : ALLOCATE (p_work(a_mysize(1), 9))
421 :
422 : !Derivatives 1-3 can be obtained using translational invariance
423 33164726 : DO i = 4, 9
424 28426908 : NULLIFY (p_work_tmp)
425 56853816 : CALL C_F_POINTER(lib%prv(1)%targets(i), p_work_tmp, SHAPE=a_mysize)
426 486208562 : p_work(:, i) = p_work_tmp
427 : END DO
428 : #else
429 : MARK_USED(n_c)
430 : MARK_USED(n_b)
431 : MARK_USED(n_a)
432 : MARK_USED(lib)
433 : MARK_USED(p_work)
434 : MARK_USED(a_mysize)
435 : CPABORT("This CP2K executable has not been linked against the required library libint.")
436 : #endif
437 :
438 4737818 : END SUBROUTINE cp_libint_get_3eri_derivs
439 :
440 : ! **************************************************************************************************
441 : !> \brief ...
442 : !> \param n_c ...
443 : !> \param n_b ...
444 : !> \param n_a ...
445 : !> \param lib ...
446 : !> \param p_work ...
447 : !> \param a_mysize ...
448 : ! **************************************************************************************************
449 6168147 : SUBROUTINE cp_libint_get_2eri_derivs(n_b, n_a, lib, p_work, a_mysize)
450 : INTEGER, INTENT(IN) :: n_b, n_a
451 : TYPE(cp_libint_t) :: lib
452 : INTEGER :: a_mysize(1)
453 : REAL(dp), DIMENSION(:, :), POINTER :: p_work
454 :
455 : #if(__LIBINT)
456 6168147 : REAL(dp), DIMENSION(:), POINTER :: p_work_tmp
457 : PROCEDURE(libint2_build), POINTER :: pbuild
458 : INTEGER :: i
459 :
460 6168147 : CALL C_F_PROCPOINTER(libint2_build_2eri1(n_b, n_a), pbuild)
461 6168147 : CALL pbuild(lib%prv)
462 :
463 18504441 : ALLOCATE (p_work(a_mysize(1), 6))
464 :
465 : !Derivatives 1-3 can be obtained using translational invariance
466 24672588 : DO i = 4, 6
467 18504441 : NULLIFY (p_work_tmp)
468 37008882 : CALL C_F_POINTER(lib%prv(1)%targets(i), p_work_tmp, SHAPE=a_mysize)
469 321700437 : p_work(:, i) = p_work_tmp
470 : END DO
471 : #else
472 : MARK_USED(n_b)
473 : MARK_USED(n_a)
474 : MARK_USED(lib)
475 : MARK_USED(p_work)
476 : MARK_USED(a_mysize)
477 : CPABORT("This CP2K executable has not been linked against the required library libint.")
478 : #endif
479 :
480 6168147 : END SUBROUTINE cp_libint_get_2eri_derivs
481 :
482 : ! **************************************************************************************************
483 : !> \brief ...
484 : !> \param n_c ...
485 : !> \param n_b ...
486 : !> \param n_a ...
487 : !> \param lib ...
488 : !> \param p_work ...
489 : !> \param a_mysize ...
490 : ! **************************************************************************************************
491 10694811 : SUBROUTINE cp_libint_get_2eris(n_b, n_a, lib, p_work, a_mysize)
492 : INTEGER, INTENT(IN) :: n_b, n_a
493 : TYPE(cp_libint_t) :: lib
494 : REAL(dp), DIMENSION(:), POINTER :: p_work
495 : INTEGER :: a_mysize(1)
496 :
497 : #if(__LIBINT)
498 : PROCEDURE(libint2_build), POINTER :: pbuild
499 :
500 10694811 : CALL C_F_PROCPOINTER(libint2_build_2eri(n_b, n_a), pbuild)
501 10694811 : CALL pbuild(lib%prv)
502 :
503 21389622 : CALL C_F_POINTER(lib%prv(1)%targets(1), p_work, SHAPE=a_mysize)
504 : #else
505 : MARK_USED(n_b)
506 : MARK_USED(n_a)
507 : MARK_USED(lib)
508 : MARK_USED(p_work)
509 : MARK_USED(a_mysize)
510 : CPABORT("This CP2K executable has not been linked against the required library libint.")
511 : #endif
512 :
513 10694811 : END SUBROUTINE cp_libint_get_2eris
514 :
515 : ! **************************************************************************************************
516 : !> \brief ...
517 : !> \param n_d ...
518 : !> \param n_c ...
519 : !> \param n_b ...
520 : !> \param n_a ...
521 : !> \param lib ...
522 : !> \param work_forces ...
523 : !> \param a_mysize ...
524 : ! **************************************************************************************************
525 106196092 : SUBROUTINE cp_libint_get_derivs(n_d, n_c, n_b, n_a, lib, work_forces, a_mysize)
526 : INTEGER, INTENT(IN) :: n_d, n_c, n_b, n_a
527 : TYPE(cp_libint_t) :: lib
528 : REAL(dp), DIMENSION(nco(n_a)*nco(n_b)*nco(n_c)*nco &
529 : (n_d), 12) :: work_forces
530 : INTEGER :: a_mysize(1)
531 :
532 : #if(__LIBINT)
533 106196092 : REAL(dp), DIMENSION(:), POINTER :: p_work
534 :
535 : PROCEDURE(libint2_build), POINTER :: pbuild
536 : INTEGER :: i, k
537 : #endif
538 :
539 : #if(__LIBINT)
540 106196092 : CALL C_F_PROCPOINTER(libint2_build_eri1(n_d, n_c, n_b, n_a), pbuild)
541 106196092 : CALL pbuild(lib%prv)
542 :
543 1380549196 : DO k = 1, 12
544 1274353104 : IF (k == 4 .OR. k == 5 .OR. k == 6) CYCLE
545 1911529656 : CALL C_F_POINTER(lib%prv(1)%targets(k), p_work, SHAPE=a_mysize)
546 11505776920 : DO i = 1, a_mysize(1)
547 11718169104 : work_forces(i, k) = p_work(i)
548 : END DO
549 : END DO
550 : ! Libint omits the canonical second-center derivatives; recover them by translation invariance.
551 424784368 : DO k = 4, 6
552 3906056368 : DO i = 1, a_mysize(1)
553 : work_forces(i, k) = -1.0_dp*(work_forces(i, k - 3) + &
554 3799860276 : work_forces(i, k + 3) + work_forces(i, k + 6))
555 : END DO
556 : END DO
557 : #else
558 : MARK_USED(n_d)
559 : MARK_USED(n_c)
560 : MARK_USED(n_b)
561 : MARK_USED(n_a)
562 : MARK_USED(lib)
563 : MARK_USED(work_forces)
564 : MARK_USED(a_mysize)
565 : CPABORT("This CP2K executable has not been linked against the required library libint.")
566 : #endif
567 :
568 106196092 : END SUBROUTINE cp_libint_get_derivs
569 :
570 36375756 : FUNCTION get_ssss_f_val(lib)
571 : TYPE(cp_libint_t) :: lib
572 : REAL(KIND=dp) :: get_ssss_f_val
573 :
574 36375756 : get_ssss_f_val = 0
575 :
576 : #if(__LIBINT)
577 36375756 : get_ssss_f_val = lib%prv(1)%f_aB_s___0__s___1___TwoPRep_s___0__s___1___Ab__up_0(1)
578 : #else
579 : MARK_USED(lib)
580 : get_ssss_f_val = 0.0_dp
581 : CPABORT("This CP2K executable has not been linked against the required library libint.")
582 : #endif
583 :
584 36375756 : END FUNCTION get_ssss_f_val
585 :
586 1612 : SUBROUTINE cp_libint_init_eri(lib, max_am)
587 : TYPE(cp_libint_t) :: lib
588 : INTEGER :: max_am
589 : #if(__LIBINT)
590 1612 : CALL libint2_init_eri(lib%prv, max_am, C_NULL_PTR)
591 : #else
592 : MARK_USED(lib)
593 : MARK_USED(max_am)
594 : CPABORT("This CP2K executable has not been linked against the required library libint.")
595 : #endif
596 1612 : END SUBROUTINE cp_libint_init_eri
597 :
598 28030 : SUBROUTINE cp_libint_set_contrdepth(lib, contrdepth)
599 : TYPE(cp_libint_t) :: lib
600 : INTEGER :: contrdepth
601 : #if(__LIBINT)
602 : #if LIBINT_CONTRACTED_INTS
603 28030 : lib%prv(1)%contrdepth = contrdepth
604 : #else
605 : MARK_USED(lib)
606 : MARK_USED(contrdepth)
607 : #endif
608 : #else
609 : MARK_USED(lib)
610 : MARK_USED(contrdepth)
611 : CPABORT("This CP2K executable has not been linked against the required library libint.")
612 : #endif
613 :
614 28030 : END SUBROUTINE cp_libint_set_contrdepth
615 :
616 1612 : SUBROUTINE cp_libint_init_eri1(lib, max_am)
617 : TYPE(cp_libint_t) :: lib
618 : INTEGER :: max_am
619 : #if(__LIBINT)
620 1612 : CALL libint2_init_eri1(lib%prv, max_am, C_NULL_PTR)
621 : #else
622 : MARK_USED(lib)
623 : MARK_USED(max_am)
624 : CPABORT("This CP2K executable has not been linked against the required library libint.")
625 : #endif
626 1612 : END SUBROUTINE cp_libint_init_eri1
627 :
628 21902 : SUBROUTINE cp_libint_init_3eri(lib, max_am)
629 : TYPE(cp_libint_t) :: lib
630 : INTEGER :: max_am
631 : #if(__LIBINT)
632 21902 : CALL libint2_init_3eri(lib%prv, max_am, C_NULL_PTR)
633 : #else
634 : MARK_USED(lib)
635 : MARK_USED(max_am)
636 : CPABORT("This CP2K executable has not been linked against the required library libint.")
637 : #endif
638 21902 : END SUBROUTINE cp_libint_init_3eri
639 :
640 598 : SUBROUTINE cp_libint_init_3eri1(lib, max_am)
641 : TYPE(cp_libint_t) :: lib
642 : INTEGER :: max_am
643 : #if(__LIBINT)
644 598 : CALL libint2_init_3eri1(lib%prv, max_am, C_NULL_PTR)
645 : #else
646 : MARK_USED(lib)
647 : MARK_USED(max_am)
648 : CPABORT("This CP2K executable has not been linked against the required library libint.")
649 : #endif
650 598 : END SUBROUTINE cp_libint_init_3eri1
651 :
652 404 : SUBROUTINE cp_libint_init_2eri1(lib, max_am)
653 : TYPE(cp_libint_t) :: lib
654 : INTEGER :: max_am
655 : #if(__LIBINT)
656 404 : CALL libint2_init_2eri1(lib%prv, max_am, C_NULL_PTR)
657 : #else
658 : MARK_USED(lib)
659 : MARK_USED(max_am)
660 : CPABORT("This CP2K executable has not been linked against the required library libint.")
661 : #endif
662 404 : END SUBROUTINE cp_libint_init_2eri1
663 :
664 1902 : SUBROUTINE cp_libint_init_2eri(lib, max_am)
665 : TYPE(cp_libint_t) :: lib
666 : INTEGER :: max_am
667 : #if(__LIBINT)
668 1902 : CALL libint2_init_2eri(lib%prv, max_am, C_NULL_PTR)
669 : #else
670 : MARK_USED(lib)
671 : MARK_USED(max_am)
672 : CPABORT("This CP2K executable has not been linked against the required library libint.")
673 : #endif
674 1902 : END SUBROUTINE cp_libint_init_2eri
675 :
676 1612 : SUBROUTINE cp_libint_cleanup_eri(lib)
677 : TYPE(cp_libint_t) :: lib
678 : #if(__LIBINT)
679 1612 : CALL libint2_cleanup_eri(lib%prv)
680 : #else
681 : MARK_USED(lib)
682 : CPABORT("This CP2K executable has not been linked against the required library libint.")
683 : #endif
684 1612 : END SUBROUTINE cp_libint_cleanup_eri
685 :
686 1612 : SUBROUTINE cp_libint_cleanup_eri1(lib)
687 : TYPE(cp_libint_t) :: lib
688 : #if(__LIBINT)
689 1612 : CALL libint2_cleanup_eri1(lib%prv)
690 : #else
691 : MARK_USED(lib)
692 : CPABORT("This CP2K executable has not been linked against the required library libint.")
693 : #endif
694 1612 : END SUBROUTINE cp_libint_cleanup_eri1
695 :
696 21902 : SUBROUTINE cp_libint_cleanup_3eri(lib)
697 : TYPE(cp_libint_t) :: lib
698 : #if(__LIBINT)
699 21902 : CALL libint2_cleanup_3eri(lib%prv)
700 : #else
701 : MARK_USED(lib)
702 : CPABORT("This CP2K executable has not been linked against the required library libint.")
703 : #endif
704 21902 : END SUBROUTINE cp_libint_cleanup_3eri
705 :
706 598 : SUBROUTINE cp_libint_cleanup_3eri1(lib)
707 : TYPE(cp_libint_t) :: lib
708 : #if(__LIBINT)
709 598 : CALL libint2_cleanup_3eri1(lib%prv)
710 : #else
711 : MARK_USED(lib)
712 : CPABORT("This CP2K executable has not been linked against the required library libint.")
713 : #endif
714 598 : END SUBROUTINE cp_libint_cleanup_3eri1
715 :
716 404 : SUBROUTINE cp_libint_cleanup_2eri1(lib)
717 : TYPE(cp_libint_t) :: lib
718 : #if(__LIBINT)
719 404 : CALL libint2_cleanup_2eri1(lib%prv)
720 : #else
721 : MARK_USED(lib)
722 : CPABORT("This CP2K executable has not been linked against the required library libint.")
723 : #endif
724 404 : END SUBROUTINE cp_libint_cleanup_2eri1
725 :
726 1902 : SUBROUTINE cp_libint_cleanup_2eri(lib)
727 : TYPE(cp_libint_t) :: lib
728 : #if(__LIBINT)
729 1902 : CALL libint2_cleanup_2eri(lib%prv)
730 : #else
731 : MARK_USED(lib)
732 : CPABORT("This CP2K executable has not been linked against the required library libint.")
733 : #endif
734 1902 : END SUBROUTINE cp_libint_cleanup_2eri
735 :
736 3417 : SUBROUTINE cp_libint_static_init()
737 : #if(__LIBINT)
738 3417 : CALL libint2_static_init()
739 : #else
740 : CPABORT("This CP2K executable has not been linked against the required library libint.")
741 : #endif
742 3417 : END SUBROUTINE cp_libint_static_init
743 :
744 3426 : SUBROUTINE cp_libint_static_cleanup()
745 : #if(__LIBINT)
746 3426 : CALL libint2_static_cleanup()
747 : #else
748 : CPABORT("This CP2K executable has not been linked against the required library libint.")
749 : #endif
750 3426 : END SUBROUTINE cp_libint_static_cleanup
751 :
752 0 : END MODULE libint_wrapper
|