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