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 90113412 : 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 90113412 : libint%prv(1)%AB_x(1) = A(1) - B(1)
92 90113412 : libint%prv(1)%AB_y(1) = A(2) - B(2)
93 90113412 : libint%prv(1)%AB_z(1) = A(3) - B(3)
94 :
95 90113412 : libint%prv(1)%CD_x(1) = C(1) - D(1)
96 90113412 : libint%prv(1)%CD_y(1) = C(2) - D(2)
97 90113412 : libint%prv(1)%CD_z(1) = C(3) - D(3)
98 :
99 90113412 : libint%prv(1)%PA_x(1) = P(1) - A(1)
100 90113412 : libint%prv(1)%PA_y(1) = P(2) - A(2)
101 90113412 : libint%prv(1)%PA_z(1) = P(3) - A(3)
102 :
103 90113412 : libint%prv(1)%QC_x(1) = Q(1) - C(1)
104 90113412 : libint%prv(1)%QC_y(1) = Q(2) - C(2)
105 90113412 : libint%prv(1)%QC_z(1) = Q(3) - C(3)
106 :
107 90113412 : libint%prv(1)%WP_x(1) = W(1) - P(1)
108 90113412 : libint%prv(1)%WP_y(1) = W(2) - P(2)
109 90113412 : libint%prv(1)%WP_z(1) = W(3) - P(3)
110 :
111 90113412 : libint%prv(1)%WQ_x(1) = W(1) - Q(1)
112 90113412 : libint%prv(1)%WQ_y(1) = W(2) - Q(2)
113 90113412 : libint%prv(1)%WQ_z(1) = W(3) - Q(3)
114 :
115 90113412 : libint%prv(1)%oo2z(1) = 0.5_dp*ZetaInv
116 90113412 : libint%prv(1)%oo2e(1) = 0.5_dp*EtaInv
117 90113412 : libint%prv(1)%oo2ze(1) = 0.5_dp*ZetapEtaInv
118 90113412 : libint%prv(1)%roz(1) = Rho*ZetaInv
119 90113412 : 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 348328800 : 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 258215388 : = 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 90113412 : END SUBROUTINE cp_libint_set_params_eri_screen
151 :
152 111417683 : SUBROUTINE cp_libint_set_params_eri_deriv(libint, A, B, C, D, P, Q, W, zeta_A, zeta_B, zeta_C, zeta_D, &
153 111417683 : 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 111417683 : libint%prv(1)%AB_x(1) = A(1) - B(1)
164 111417683 : libint%prv(1)%AB_y(1) = A(2) - B(2)
165 111417683 : libint%prv(1)%AB_z(1) = A(3) - B(3)
166 :
167 111417683 : libint%prv(1)%CD_x(1) = C(1) - D(1)
168 111417683 : libint%prv(1)%CD_y(1) = C(2) - D(2)
169 111417683 : libint%prv(1)%CD_z(1) = C(3) - D(3)
170 :
171 111417683 : libint%prv(1)%PA_x(1) = P(1) - A(1)
172 111417683 : libint%prv(1)%PA_y(1) = P(2) - A(2)
173 111417683 : libint%prv(1)%PA_z(1) = P(3) - A(3)
174 :
175 111417683 : libint%prv(1)%PB_x(1) = P(1) - B(1)
176 111417683 : libint%prv(1)%PB_y(1) = P(2) - B(2)
177 111417683 : libint%prv(1)%PB_z(1) = P(3) - B(3)
178 :
179 111417683 : libint%prv(1)%QC_x(1) = Q(1) - C(1)
180 111417683 : libint%prv(1)%QC_y(1) = Q(2) - C(2)
181 111417683 : libint%prv(1)%QC_z(1) = Q(3) - C(3)
182 :
183 111417683 : libint%prv(1)%WP_x(1) = W(1) - P(1)
184 111417683 : libint%prv(1)%WP_y(1) = W(2) - P(2)
185 111417683 : libint%prv(1)%WP_z(1) = W(3) - P(3)
186 :
187 111417683 : libint%prv(1)%WQ_x(1) = W(1) - Q(1)
188 111417683 : libint%prv(1)%WQ_y(1) = W(2) - Q(2)
189 111417683 : libint%prv(1)%WQ_z(1) = W(3) - Q(3)
190 :
191 111417683 : libint%prv(1)%two_alpha0_bra(1) = 2.0_dp*Zeta_A
192 111417683 : libint%prv(1)%two_alpha0_ket(1) = 2.0_dp*Zeta_B
193 111417683 : libint%prv(1)%two_alpha1_ket(1) = 2.0_dp*Zeta_D
194 :
195 111417683 : gammap = Zeta_A + Zeta_B
196 111417683 : gammaq = Zeta_C + Zeta_D
197 111417683 : gammapq = gammap*gammaq/(gammap + gammaq)
198 111417683 : libint%prv(1)%alpha1_rho_over_zeta2(1) = Zeta_A*gammapq/(gammap*gammap)
199 111417683 : libint%prv(1)%alpha2_rho_over_zeta2(1) = Zeta_B*gammapq/(gammap*gammap)
200 111417683 : libint%prv(1)%alpha4_rho_over_eta2(1) = Zeta_D*gammapq/(gammaq*gammaq)
201 111417683 : libint%prv(1)%alpha1_over_zetapluseta(1) = Zeta_A/(gammap + gammaq)
202 111417683 : libint%prv(1)%alpha2_over_zetapluseta(1) = Zeta_B/(gammap + gammaq)
203 111417683 : libint%prv(1)%alpha4_over_zetapluseta(1) = Zeta_D/(gammap + gammaq)
204 :
205 111417683 : rhop = Zeta_A*Zeta_B/gammap
206 111417683 : rhoq = Zeta_C*Zeta_D/gammaq
207 111417683 : libint%prv(1)%rho12_over_alpha1(1) = rhop/Zeta_A
208 :
209 111417683 : libint%prv(1)%rho34_over_alpha3(1) = rhoq/Zeta_C
210 :
211 111417683 : libint%prv(1)%oo2z(1) = 0.5_dp*ZetaInv
212 111417683 : libint%prv(1)%oo2e(1) = 0.5_dp*EtaInv
213 111417683 : libint%prv(1)%oo2ze(1) = 0.5_dp*ZetapEtaInv
214 111417683 : libint%prv(1)%roz(1) = Rho*ZetaInv
215 111417683 : 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 496143596 : 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 384725913 : = 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 111417683 : END SUBROUTINE cp_libint_set_params_eri_deriv
249 :
250 532522011 : 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 532522011 : libint%prv(1)%AB_x(1) = A(1) - B(1)
260 532522011 : libint%prv(1)%AB_y(1) = A(2) - B(2)
261 532522011 : libint%prv(1)%AB_z(1) = A(3) - B(3)
262 :
263 532522011 : libint%prv(1)%CD_x(1) = C(1) - D(1)
264 532522011 : libint%prv(1)%CD_y(1) = C(2) - D(2)
265 532522011 : libint%prv(1)%CD_z(1) = C(3) - D(3)
266 :
267 532522011 : libint%prv(1)%PA_x(1) = P(1) - A(1)
268 532522011 : libint%prv(1)%PA_y(1) = P(2) - A(2)
269 532522011 : libint%prv(1)%PA_z(1) = P(3) - A(3)
270 :
271 532522011 : libint%prv(1)%QC_x(1) = Q(1) - C(1)
272 532522011 : libint%prv(1)%QC_y(1) = Q(2) - C(2)
273 532522011 : libint%prv(1)%QC_z(1) = Q(3) - C(3)
274 :
275 532522011 : libint%prv(1)%WP_x(1) = W(1) - P(1)
276 532522011 : libint%prv(1)%WP_y(1) = W(2) - P(2)
277 532522011 : libint%prv(1)%WP_z(1) = W(3) - P(3)
278 :
279 532522011 : libint%prv(1)%WQ_x(1) = W(1) - Q(1)
280 532522011 : libint%prv(1)%WQ_y(1) = W(2) - Q(2)
281 532522011 : libint%prv(1)%WQ_z(1) = W(3) - Q(3)
282 :
283 532522011 : libint%prv(1)%oo2z(1) = 0.5_dp*ZetaInv
284 532522011 : libint%prv(1)%oo2e(1) = 0.5_dp*EtaInv
285 532522011 : libint%prv(1)%oo2ze(1) = 0.5_dp*ZetapEtaInv
286 532522011 : libint%prv(1)%roz(1) = Rho*ZetaInv
287 532522011 : 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 1886302549 : 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 1353780538 : = 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 532522011 : 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 443122419 : 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 443122419 : CALL C_F_PROCPOINTER(libint2_build_eri(n_d, n_c, n_b, n_a), pbuild)
338 443122419 : CALL pbuild(lib%prv)
339 :
340 886244838 : 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 443122419 : 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 29519249 : 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 29519249 : build_funptr = libint2_build_3eri(n_c, n_b, n_a)
375 29519249 : 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 29519249 : CALL C_F_PROCPOINTER(build_funptr, pbuild)
382 29519249 : CALL pbuild(lib%prv)
383 :
384 59038498 : 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 29519249 : 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 10524550 : 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 10524550 : CALL C_F_PROCPOINTER(libint2_build_2eri(n_b, n_a), pbuild)
501 10524550 : CALL pbuild(lib%prv)
502 :
503 21049100 : 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 10524550 : 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 105499911 : 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 105499911 : REAL(dp), DIMENSION(:), POINTER :: p_work
534 :
535 : PROCEDURE(libint2_build), POINTER :: pbuild
536 : INTEGER :: i, k
537 : #endif
538 :
539 : #if(__LIBINT)
540 105499911 : CALL C_F_PROCPOINTER(libint2_build_eri1(n_d, n_c, n_b, n_a), pbuild)
541 105499911 : CALL pbuild(lib%prv)
542 :
543 1371498843 : DO k = 1, 12
544 1265998932 : IF (k == 4 .OR. k == 5 .OR. k == 6) CYCLE
545 1898998398 : CALL C_F_POINTER(lib%prv(1)%targets(k), p_work, SHAPE=a_mysize)
546 11432908875 : DO i = 1, a_mysize(1)
547 11643908697 : work_forces(i, k) = p_work(i)
548 : END DO
549 : END DO
550 : #else
551 : MARK_USED(n_d)
552 : MARK_USED(n_c)
553 : MARK_USED(n_b)
554 : MARK_USED(n_a)
555 : MARK_USED(lib)
556 : MARK_USED(work_forces)
557 : MARK_USED(a_mysize)
558 : CPABORT("This CP2K executable has not been linked against the required library libint.")
559 : #endif
560 :
561 105499911 : END SUBROUTINE cp_libint_get_derivs
562 :
563 33517254 : FUNCTION get_ssss_f_val(lib)
564 : TYPE(cp_libint_t) :: lib
565 : REAL(KIND=dp) :: get_ssss_f_val
566 :
567 33517254 : get_ssss_f_val = 0
568 :
569 : #if(__LIBINT)
570 33517254 : get_ssss_f_val = lib%prv(1)%f_aB_s___0__s___1___TwoPRep_s___0__s___1___Ab__up_0(1)
571 : #else
572 : MARK_USED(lib)
573 : get_ssss_f_val = 0.0_dp
574 : CPABORT("This CP2K executable has not been linked against the required library libint.")
575 : #endif
576 :
577 33517254 : END FUNCTION get_ssss_f_val
578 :
579 1488 : SUBROUTINE cp_libint_init_eri(lib, max_am)
580 : TYPE(cp_libint_t) :: lib
581 : INTEGER :: max_am
582 : #if(__LIBINT)
583 1488 : CALL libint2_init_eri(lib%prv, max_am, C_NULL_PTR)
584 : #else
585 : MARK_USED(lib)
586 : MARK_USED(max_am)
587 : CPABORT("This CP2K executable has not been linked against the required library libint.")
588 : #endif
589 1488 : END SUBROUTINE cp_libint_init_eri
590 :
591 20364 : SUBROUTINE cp_libint_set_contrdepth(lib, contrdepth)
592 : TYPE(cp_libint_t) :: lib
593 : INTEGER :: contrdepth
594 : #if(__LIBINT)
595 : #if LIBINT_CONTRACTED_INTS
596 20364 : lib%prv(1)%contrdepth = contrdepth
597 : #else
598 : MARK_USED(lib)
599 : MARK_USED(contrdepth)
600 : #endif
601 : #else
602 : MARK_USED(lib)
603 : MARK_USED(contrdepth)
604 : CPABORT("This CP2K executable has not been linked against the required library libint.")
605 : #endif
606 :
607 20364 : END SUBROUTINE cp_libint_set_contrdepth
608 :
609 1488 : SUBROUTINE cp_libint_init_eri1(lib, max_am)
610 : TYPE(cp_libint_t) :: lib
611 : INTEGER :: max_am
612 : #if(__LIBINT)
613 1488 : CALL libint2_init_eri1(lib%prv, max_am, C_NULL_PTR)
614 : #else
615 : MARK_USED(lib)
616 : MARK_USED(max_am)
617 : CPABORT("This CP2K executable has not been linked against the required library libint.")
618 : #endif
619 1488 : END SUBROUTINE cp_libint_init_eri1
620 :
621 15268 : SUBROUTINE cp_libint_init_3eri(lib, max_am)
622 : TYPE(cp_libint_t) :: lib
623 : INTEGER :: max_am
624 : #if(__LIBINT)
625 15268 : CALL libint2_init_3eri(lib%prv, max_am, C_NULL_PTR)
626 : #else
627 : MARK_USED(lib)
628 : MARK_USED(max_am)
629 : CPABORT("This CP2K executable has not been linked against the required library libint.")
630 : #endif
631 15268 : END SUBROUTINE cp_libint_init_3eri
632 :
633 598 : SUBROUTINE cp_libint_init_3eri1(lib, max_am)
634 : TYPE(cp_libint_t) :: lib
635 : INTEGER :: max_am
636 : #if(__LIBINT)
637 598 : CALL libint2_init_3eri1(lib%prv, max_am, C_NULL_PTR)
638 : #else
639 : MARK_USED(lib)
640 : MARK_USED(max_am)
641 : CPABORT("This CP2K executable has not been linked against the required library libint.")
642 : #endif
643 598 : END SUBROUTINE cp_libint_init_3eri1
644 :
645 404 : SUBROUTINE cp_libint_init_2eri1(lib, max_am)
646 : TYPE(cp_libint_t) :: lib
647 : INTEGER :: max_am
648 : #if(__LIBINT)
649 404 : CALL libint2_init_2eri1(lib%prv, max_am, C_NULL_PTR)
650 : #else
651 : MARK_USED(lib)
652 : MARK_USED(max_am)
653 : CPABORT("This CP2K executable has not been linked against the required library libint.")
654 : #endif
655 404 : END SUBROUTINE cp_libint_init_2eri1
656 :
657 1118 : SUBROUTINE cp_libint_init_2eri(lib, max_am)
658 : TYPE(cp_libint_t) :: lib
659 : INTEGER :: max_am
660 : #if(__LIBINT)
661 1118 : CALL libint2_init_2eri(lib%prv, max_am, C_NULL_PTR)
662 : #else
663 : MARK_USED(lib)
664 : MARK_USED(max_am)
665 : CPABORT("This CP2K executable has not been linked against the required library libint.")
666 : #endif
667 1118 : END SUBROUTINE cp_libint_init_2eri
668 :
669 1488 : SUBROUTINE cp_libint_cleanup_eri(lib)
670 : TYPE(cp_libint_t) :: lib
671 : #if(__LIBINT)
672 1488 : CALL libint2_cleanup_eri(lib%prv)
673 : #else
674 : MARK_USED(lib)
675 : CPABORT("This CP2K executable has not been linked against the required library libint.")
676 : #endif
677 1488 : END SUBROUTINE cp_libint_cleanup_eri
678 :
679 1488 : SUBROUTINE cp_libint_cleanup_eri1(lib)
680 : TYPE(cp_libint_t) :: lib
681 : #if(__LIBINT)
682 1488 : CALL libint2_cleanup_eri1(lib%prv)
683 : #else
684 : MARK_USED(lib)
685 : CPABORT("This CP2K executable has not been linked against the required library libint.")
686 : #endif
687 1488 : END SUBROUTINE cp_libint_cleanup_eri1
688 :
689 15268 : SUBROUTINE cp_libint_cleanup_3eri(lib)
690 : TYPE(cp_libint_t) :: lib
691 : #if(__LIBINT)
692 15268 : CALL libint2_cleanup_3eri(lib%prv)
693 : #else
694 : MARK_USED(lib)
695 : CPABORT("This CP2K executable has not been linked against the required library libint.")
696 : #endif
697 15268 : END SUBROUTINE cp_libint_cleanup_3eri
698 :
699 598 : SUBROUTINE cp_libint_cleanup_3eri1(lib)
700 : TYPE(cp_libint_t) :: lib
701 : #if(__LIBINT)
702 598 : CALL libint2_cleanup_3eri1(lib%prv)
703 : #else
704 : MARK_USED(lib)
705 : CPABORT("This CP2K executable has not been linked against the required library libint.")
706 : #endif
707 598 : END SUBROUTINE cp_libint_cleanup_3eri1
708 :
709 404 : SUBROUTINE cp_libint_cleanup_2eri1(lib)
710 : TYPE(cp_libint_t) :: lib
711 : #if(__LIBINT)
712 404 : CALL libint2_cleanup_2eri1(lib%prv)
713 : #else
714 : MARK_USED(lib)
715 : CPABORT("This CP2K executable has not been linked against the required library libint.")
716 : #endif
717 404 : END SUBROUTINE cp_libint_cleanup_2eri1
718 :
719 1118 : SUBROUTINE cp_libint_cleanup_2eri(lib)
720 : TYPE(cp_libint_t) :: lib
721 : #if(__LIBINT)
722 1118 : CALL libint2_cleanup_2eri(lib%prv)
723 : #else
724 : MARK_USED(lib)
725 : CPABORT("This CP2K executable has not been linked against the required library libint.")
726 : #endif
727 1118 : END SUBROUTINE cp_libint_cleanup_2eri
728 :
729 1878 : SUBROUTINE cp_libint_static_init()
730 : #if(__LIBINT)
731 1878 : CALL libint2_static_init()
732 : #else
733 : CPABORT("This CP2K executable has not been linked against the required library libint.")
734 : #endif
735 1878 : END SUBROUTINE cp_libint_static_init
736 :
737 1888 : SUBROUTINE cp_libint_static_cleanup()
738 : #if(__LIBINT)
739 1888 : CALL libint2_static_cleanup()
740 : #else
741 : CPABORT("This CP2K executable has not been linked against the required library libint.")
742 : #endif
743 1888 : END SUBROUTINE cp_libint_static_cleanup
744 :
745 0 : END MODULE libint_wrapper
|