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 87771222 : 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 87771222 : libint%prv(1)%AB_x(1) = A(1) - B(1)
92 87771222 : libint%prv(1)%AB_y(1) = A(2) - B(2)
93 87771222 : libint%prv(1)%AB_z(1) = A(3) - B(3)
94 :
95 87771222 : libint%prv(1)%CD_x(1) = C(1) - D(1)
96 87771222 : libint%prv(1)%CD_y(1) = C(2) - D(2)
97 87771222 : libint%prv(1)%CD_z(1) = C(3) - D(3)
98 :
99 87771222 : libint%prv(1)%PA_x(1) = P(1) - A(1)
100 87771222 : libint%prv(1)%PA_y(1) = P(2) - A(2)
101 87771222 : libint%prv(1)%PA_z(1) = P(3) - A(3)
102 :
103 87771222 : libint%prv(1)%QC_x(1) = Q(1) - C(1)
104 87771222 : libint%prv(1)%QC_y(1) = Q(2) - C(2)
105 87771222 : libint%prv(1)%QC_z(1) = Q(3) - C(3)
106 :
107 87771222 : libint%prv(1)%WP_x(1) = W(1) - P(1)
108 87771222 : libint%prv(1)%WP_y(1) = W(2) - P(2)
109 87771222 : libint%prv(1)%WP_z(1) = W(3) - P(3)
110 :
111 87771222 : libint%prv(1)%WQ_x(1) = W(1) - Q(1)
112 87771222 : libint%prv(1)%WQ_y(1) = W(2) - Q(2)
113 87771222 : libint%prv(1)%WQ_z(1) = W(3) - Q(3)
114 :
115 87771222 : libint%prv(1)%oo2z(1) = 0.5_dp*ZetaInv
116 87771222 : libint%prv(1)%oo2e(1) = 0.5_dp*EtaInv
117 87771222 : libint%prv(1)%oo2ze(1) = 0.5_dp*ZetapEtaInv
118 87771222 : libint%prv(1)%roz(1) = Rho*ZetaInv
119 87771222 : 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 339041244 : IF (${m_max}$ <= m_max) &
124 : libint%prv(1)%f_aB_s___0__s___1___TwoPRep_s___0__s___1___Ab__up_${m_max}$ (1) &
125 251270022 : = F(${m_max}$+1)
126 :
127 : #endif
128 : #:endfor
129 :
130 : #else
131 : MARK_USED(libint)
132 : MARK_USED(A)
133 : MARK_USED(B)
134 : MARK_USED(C)
135 : MARK_USED(D)
136 : MARK_USED(P)
137 : MARK_USED(Q)
138 : MARK_USED(W)
139 : MARK_USED(ZetaInv)
140 : MARK_USED(EtaInv)
141 : MARK_USED(ZetapEtaInv)
142 : MARK_USED(Rho)
143 : MARK_USED(m_max)
144 : MARK_USED(F)
145 :
146 : CPABORT("This CP2K executable has not been linked against the required library libint.")
147 : #endif
148 :
149 87771222 : END SUBROUTINE cp_libint_set_params_eri_screen
150 :
151 111277756 : SUBROUTINE cp_libint_set_params_eri_deriv(libint, A, B, C, D, P, Q, W, zeta_A, zeta_B, zeta_C, zeta_D, &
152 111277756 : ZetaInv, EtaInv, ZetapEtaInv, Rho, m_max, F)
153 : TYPE(cp_libint_t) :: libint
154 : REAL(KIND=dp), INTENT(IN), DIMENSION(3) :: A, B, C, D, P, Q, W
155 : REAL(KIND=dp), INTENT(IN) :: zeta_A, zeta_B, zeta_C, zeta_D, ZetaInv, EtaInv, ZetapEtaInv, Rho
156 :
157 : INTEGER, INTENT(IN) :: m_max
158 : REAL(KIND=dp), DIMENSION(:) :: F
159 :
160 : #if(__LIBINT)
161 : REAL(KIND=dp) :: gammap, gammaq, gammapq, rhop, rhoq
162 111277756 : libint%prv(1)%AB_x(1) = A(1) - B(1)
163 111277756 : libint%prv(1)%AB_y(1) = A(2) - B(2)
164 111277756 : libint%prv(1)%AB_z(1) = A(3) - B(3)
165 :
166 111277756 : libint%prv(1)%CD_x(1) = C(1) - D(1)
167 111277756 : libint%prv(1)%CD_y(1) = C(2) - D(2)
168 111277756 : libint%prv(1)%CD_z(1) = C(3) - D(3)
169 :
170 111277756 : libint%prv(1)%PA_x(1) = P(1) - A(1)
171 111277756 : libint%prv(1)%PA_y(1) = P(2) - A(2)
172 111277756 : libint%prv(1)%PA_z(1) = P(3) - A(3)
173 :
174 111277756 : libint%prv(1)%PB_x(1) = P(1) - B(1)
175 111277756 : libint%prv(1)%PB_y(1) = P(2) - B(2)
176 111277756 : libint%prv(1)%PB_z(1) = P(3) - B(3)
177 :
178 111277756 : libint%prv(1)%QC_x(1) = Q(1) - C(1)
179 111277756 : libint%prv(1)%QC_y(1) = Q(2) - C(2)
180 111277756 : libint%prv(1)%QC_z(1) = Q(3) - C(3)
181 :
182 111277756 : libint%prv(1)%WP_x(1) = W(1) - P(1)
183 111277756 : libint%prv(1)%WP_y(1) = W(2) - P(2)
184 111277756 : libint%prv(1)%WP_z(1) = W(3) - P(3)
185 :
186 111277756 : libint%prv(1)%WQ_x(1) = W(1) - Q(1)
187 111277756 : libint%prv(1)%WQ_y(1) = W(2) - Q(2)
188 111277756 : libint%prv(1)%WQ_z(1) = W(3) - Q(3)
189 :
190 111277756 : libint%prv(1)%two_alpha0_bra(1) = 2.0_dp*Zeta_A
191 111277756 : libint%prv(1)%two_alpha0_ket(1) = 2.0_dp*Zeta_B
192 111277756 : libint%prv(1)%two_alpha1_ket(1) = 2.0_dp*Zeta_D
193 :
194 111277756 : gammap = Zeta_A + Zeta_B
195 111277756 : gammaq = Zeta_C + Zeta_D
196 111277756 : gammapq = gammap*gammaq/(gammap + gammaq)
197 111277756 : libint%prv(1)%alpha1_rho_over_zeta2(1) = Zeta_A*gammapq/(gammap*gammap)
198 111277756 : libint%prv(1)%alpha2_rho_over_zeta2(1) = Zeta_B*gammapq/(gammap*gammap)
199 111277756 : libint%prv(1)%alpha4_rho_over_eta2(1) = Zeta_D*gammapq/(gammaq*gammaq)
200 111277756 : libint%prv(1)%alpha1_over_zetapluseta(1) = Zeta_A/(gammap + gammaq)
201 111277756 : libint%prv(1)%alpha2_over_zetapluseta(1) = Zeta_B/(gammap + gammaq)
202 111277756 : libint%prv(1)%alpha4_over_zetapluseta(1) = Zeta_D/(gammap + gammaq)
203 :
204 111277756 : rhop = Zeta_A*Zeta_B/gammap
205 111277756 : rhoq = Zeta_C*Zeta_D/gammaq
206 111277756 : libint%prv(1)%rho12_over_alpha1(1) = rhop/Zeta_A
207 :
208 111277756 : libint%prv(1)%rho34_over_alpha3(1) = rhoq/Zeta_C
209 :
210 111277756 : libint%prv(1)%oo2z(1) = 0.5_dp*ZetaInv
211 111277756 : libint%prv(1)%oo2e(1) = 0.5_dp*EtaInv
212 111277756 : libint%prv(1)%oo2ze(1) = 0.5_dp*ZetapEtaInv
213 111277756 : libint%prv(1)%roz(1) = Rho*ZetaInv
214 111277756 : libint%prv(1)%roe(1) = Rho*EtaInv
215 :
216 : #:for m_max in range(0, 4*libint_max_am_supported)
217 : #if 4*LIBINT2_MAX_AM_eri > ${m_max}$ - 1
218 495528699 : IF (${m_max}$ <= m_max) &
219 : 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
220 384250943 : = F(${m_max}$+1)
221 : #endif
222 : #:endfor
223 :
224 : #else
225 : MARK_USED(libint)
226 : MARK_USED(A)
227 : MARK_USED(B)
228 : MARK_USED(C)
229 : MARK_USED(D)
230 : MARK_USED(P)
231 : MARK_USED(Q)
232 : MARK_USED(W)
233 : MARK_USED(zeta_A)
234 : MARK_USED(zeta_B)
235 : MARK_USED(zeta_C)
236 : MARK_USED(zeta_D)
237 : MARK_USED(ZetaInv)
238 : MARK_USED(EtaInv)
239 : MARK_USED(ZetapEtaInv)
240 : MARK_USED(Rho)
241 : MARK_USED(m_max)
242 : MARK_USED(F)
243 : CPABORT("This CP2K executable has not been linked against the required library libint.")
244 : #endif
245 :
246 111277756 : END SUBROUTINE cp_libint_set_params_eri_deriv
247 :
248 524504630 : SUBROUTINE cp_libint_set_params_eri(libint, A, B, C, D, ZetaInv, EtaInv, ZetapEtaInv, Rho, P, Q, W, m_max, F)
249 : TYPE(cp_libint_t) :: libint
250 : REAL(KIND=dp), INTENT(IN), DIMENSION(3) :: A, B, C, D, P, Q, W
251 : REAL(KIND=dp), INTENT(IN) :: ZetaInv, EtaInv, ZetapEtaInv, Rho
252 : REAL(KIND=dp), DIMENSION(:) :: F
253 :
254 : INTEGER, INTENT(IN) :: m_max
255 :
256 : #if(__LIBINT)
257 524504630 : libint%prv(1)%AB_x(1) = A(1) - B(1)
258 524504630 : libint%prv(1)%AB_y(1) = A(2) - B(2)
259 524504630 : libint%prv(1)%AB_z(1) = A(3) - B(3)
260 :
261 524504630 : libint%prv(1)%CD_x(1) = C(1) - D(1)
262 524504630 : libint%prv(1)%CD_y(1) = C(2) - D(2)
263 524504630 : libint%prv(1)%CD_z(1) = C(3) - D(3)
264 :
265 524504630 : libint%prv(1)%PA_x(1) = P(1) - A(1)
266 524504630 : libint%prv(1)%PA_y(1) = P(2) - A(2)
267 524504630 : libint%prv(1)%PA_z(1) = P(3) - A(3)
268 :
269 524504630 : libint%prv(1)%QC_x(1) = Q(1) - C(1)
270 524504630 : libint%prv(1)%QC_y(1) = Q(2) - C(2)
271 524504630 : libint%prv(1)%QC_z(1) = Q(3) - C(3)
272 :
273 524504630 : libint%prv(1)%WP_x(1) = W(1) - P(1)
274 524504630 : libint%prv(1)%WP_y(1) = W(2) - P(2)
275 524504630 : libint%prv(1)%WP_z(1) = W(3) - P(3)
276 :
277 524504630 : libint%prv(1)%WQ_x(1) = W(1) - Q(1)
278 524504630 : libint%prv(1)%WQ_y(1) = W(2) - Q(2)
279 524504630 : libint%prv(1)%WQ_z(1) = W(3) - Q(3)
280 :
281 524504630 : libint%prv(1)%oo2z(1) = 0.5_dp*ZetaInv
282 524504630 : libint%prv(1)%oo2e(1) = 0.5_dp*EtaInv
283 524504630 : libint%prv(1)%oo2ze(1) = 0.5_dp*ZetapEtaInv
284 524504630 : libint%prv(1)%roz(1) = Rho*ZetaInv
285 524504630 : libint%prv(1)%roe(1) = Rho*EtaInv
286 :
287 : #:for m_max in range(0, 4*libint_max_am_supported)
288 : #if 4*LIBINT2_MAX_AM_eri > ${m_max}$ - 1
289 :
290 1860242571 : IF (${m_max}$ <= m_max) &
291 : 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
292 1335737941 : = F(${m_max}$+1)
293 : #endif
294 : #:endfor
295 :
296 : #else
297 : MARK_USED(libint)
298 : MARK_USED(A)
299 : MARK_USED(B)
300 : MARK_USED(C)
301 : MARK_USED(D)
302 : MARK_USED(P)
303 : MARK_USED(Q)
304 : MARK_USED(W)
305 : MARK_USED(ZetaInv)
306 : MARK_USED(EtaInv)
307 : MARK_USED(ZetapEtaInv)
308 : MARK_USED(Rho)
309 : MARK_USED(m_max)
310 : MARK_USED(F)
311 : CPABORT("This CP2K executable has not been linked against the required library libint.")
312 : #endif
313 :
314 524504630 : END SUBROUTINE cp_libint_set_params_eri
315 : ! **************************************************************************************************
316 : !> \brief ...
317 : !> \param n_d ...
318 : !> \param n_c ...
319 : !> \param n_b ...
320 : !> \param n_a ...
321 : !> \param lib ...
322 : !> \param p_work ...
323 : !> \param a_mysize ...
324 : ! **************************************************************************************************
325 436521503 : SUBROUTINE cp_libint_get_eris(n_d, n_c, n_b, n_a, lib, p_work, a_mysize)
326 : INTEGER, INTENT(IN) :: n_d, n_c, n_b, n_a
327 : TYPE(cp_libint_t) :: lib
328 : REAL(dp), DIMENSION(:), POINTER :: p_work
329 : INTEGER :: a_mysize(1)
330 :
331 : #if(__LIBINT)
332 : PROCEDURE(libint2_build), POINTER :: pbuild
333 :
334 436521503 : CALL C_F_PROCPOINTER(libint2_build_eri(n_d, n_c, n_b, n_a), pbuild)
335 436521503 : CALL pbuild(lib%prv)
336 :
337 873043006 : CALL C_F_POINTER(lib%prv(1)%targets(1), p_work, SHAPE=a_mysize)
338 : #else
339 : MARK_USED(n_d)
340 : MARK_USED(n_c)
341 : MARK_USED(n_b)
342 : MARK_USED(n_a)
343 : MARK_USED(lib)
344 : MARK_USED(p_work)
345 : MARK_USED(a_mysize)
346 : CPABORT("This CP2K executable has not been linked against the required library libint.")
347 : #endif
348 :
349 436521503 : END SUBROUTINE cp_libint_get_eris
350 :
351 : ! **************************************************************************************************
352 : !> \brief ...
353 : !> \param n_c ...
354 : !> \param n_b ...
355 : !> \param n_a ...
356 : !> \param lib ...
357 : !> \param p_work ...
358 : !> \param a_mysize ...
359 : ! **************************************************************************************************
360 29235982 : SUBROUTINE cp_libint_get_3eris(n_c, n_b, n_a, lib, p_work, a_mysize)
361 : INTEGER, INTENT(IN) :: n_c, n_b, n_a
362 : TYPE(cp_libint_t) :: lib
363 : REAL(dp), DIMENSION(:), POINTER :: p_work
364 : INTEGER :: a_mysize(1)
365 :
366 : #if(__LIBINT)
367 : CHARACTER(LEN=160) :: error_msg
368 : PROCEDURE(libint2_build), POINTER :: pbuild
369 : TYPE(C_FUNPTR) :: build_funptr
370 :
371 29235982 : build_funptr = libint2_build_3eri(n_c, n_b, n_a)
372 29235982 : IF (.NOT. C_ASSOCIATED(build_funptr)) THEN
373 : error_msg = "LIBINT has no 3-center ERI kernel for (lc,lb,la)=("// &
374 : TRIM(cp_to_string(n_c))//","//TRIM(cp_to_string(n_b))//","// &
375 0 : TRIM(cp_to_string(n_a))//")"
376 0 : CALL cp_abort(__LOCATION__, TRIM(error_msg))
377 : END IF
378 29235982 : CALL C_F_PROCPOINTER(build_funptr, pbuild)
379 29235982 : CALL pbuild(lib%prv)
380 :
381 58471964 : CALL C_F_POINTER(lib%prv(1)%targets(1), p_work, SHAPE=a_mysize)
382 : #else
383 : MARK_USED(n_c)
384 : MARK_USED(n_b)
385 : MARK_USED(n_a)
386 : MARK_USED(lib)
387 : MARK_USED(p_work)
388 : MARK_USED(a_mysize)
389 : CPABORT("This CP2K executable has not been linked against the required library libint.")
390 : #endif
391 :
392 29235982 : END SUBROUTINE cp_libint_get_3eris
393 :
394 : ! **************************************************************************************************
395 : !> \brief ...
396 : !> \param n_c ...
397 : !> \param n_b ...
398 : !> \param n_a ...
399 : !> \param lib ...
400 : !> \param p_work ...
401 : !> \param a_mysize ...
402 : ! **************************************************************************************************
403 4737818 : SUBROUTINE cp_libint_get_3eri_derivs(n_c, n_b, n_a, lib, p_work, a_mysize)
404 : INTEGER, INTENT(IN) :: n_c, n_b, n_a
405 : TYPE(cp_libint_t) :: lib
406 : INTEGER :: a_mysize(1)
407 : REAL(dp), DIMENSION(:, :), POINTER :: p_work
408 :
409 : #if(__LIBINT)
410 4737818 : REAL(dp), DIMENSION(:), POINTER :: p_work_tmp
411 : PROCEDURE(libint2_build), POINTER :: pbuild
412 : INTEGER :: i
413 :
414 4737818 : CALL C_F_PROCPOINTER(libint2_build_3eri1(n_c, n_b, n_a), pbuild)
415 4737818 : CALL pbuild(lib%prv)
416 :
417 14213454 : ALLOCATE (p_work(a_mysize(1), 9))
418 :
419 : !Derivatives 1-3 can be obtained using translational invariance
420 33164726 : DO i = 4, 9
421 28426908 : NULLIFY (p_work_tmp)
422 56853816 : CALL C_F_POINTER(lib%prv(1)%targets(i), p_work_tmp, SHAPE=a_mysize)
423 486208562 : p_work(:, i) = p_work_tmp
424 : END DO
425 : #else
426 : MARK_USED(n_c)
427 : MARK_USED(n_b)
428 : MARK_USED(n_a)
429 : MARK_USED(lib)
430 : MARK_USED(p_work)
431 : MARK_USED(a_mysize)
432 : CPABORT("This CP2K executable has not been linked against the required library libint.")
433 : #endif
434 :
435 4737818 : END SUBROUTINE cp_libint_get_3eri_derivs
436 :
437 : ! **************************************************************************************************
438 : !> \brief ...
439 : !> \param n_c ...
440 : !> \param n_b ...
441 : !> \param n_a ...
442 : !> \param lib ...
443 : !> \param p_work ...
444 : !> \param a_mysize ...
445 : ! **************************************************************************************************
446 6168147 : SUBROUTINE cp_libint_get_2eri_derivs(n_b, n_a, lib, p_work, a_mysize)
447 : INTEGER, INTENT(IN) :: n_b, n_a
448 : TYPE(cp_libint_t) :: lib
449 : INTEGER :: a_mysize(1)
450 : REAL(dp), DIMENSION(:, :), POINTER :: p_work
451 :
452 : #if(__LIBINT)
453 6168147 : REAL(dp), DIMENSION(:), POINTER :: p_work_tmp
454 : PROCEDURE(libint2_build), POINTER :: pbuild
455 : INTEGER :: i
456 :
457 6168147 : CALL C_F_PROCPOINTER(libint2_build_2eri1(n_b, n_a), pbuild)
458 6168147 : CALL pbuild(lib%prv)
459 :
460 18504441 : ALLOCATE (p_work(a_mysize(1), 6))
461 :
462 : !Derivatives 1-3 can be obtained using translational invariance
463 24672588 : DO i = 4, 6
464 18504441 : NULLIFY (p_work_tmp)
465 37008882 : CALL C_F_POINTER(lib%prv(1)%targets(i), p_work_tmp, SHAPE=a_mysize)
466 321700437 : p_work(:, i) = p_work_tmp
467 : END DO
468 : #else
469 : MARK_USED(n_b)
470 : MARK_USED(n_a)
471 : MARK_USED(lib)
472 : MARK_USED(p_work)
473 : MARK_USED(a_mysize)
474 : CPABORT("This CP2K executable has not been linked against the required library libint.")
475 : #endif
476 :
477 6168147 : END SUBROUTINE cp_libint_get_2eri_derivs
478 :
479 : ! **************************************************************************************************
480 : !> \brief ...
481 : !> \param n_c ...
482 : !> \param n_b ...
483 : !> \param n_a ...
484 : !> \param lib ...
485 : !> \param p_work ...
486 : !> \param a_mysize ...
487 : ! **************************************************************************************************
488 10520762 : SUBROUTINE cp_libint_get_2eris(n_b, n_a, lib, p_work, a_mysize)
489 : INTEGER, INTENT(IN) :: n_b, n_a
490 : TYPE(cp_libint_t) :: lib
491 : REAL(dp), DIMENSION(:), POINTER :: p_work
492 : INTEGER :: a_mysize(1)
493 :
494 : #if(__LIBINT)
495 : PROCEDURE(libint2_build), POINTER :: pbuild
496 :
497 10520762 : CALL C_F_PROCPOINTER(libint2_build_2eri(n_b, n_a), pbuild)
498 10520762 : CALL pbuild(lib%prv)
499 :
500 21041524 : CALL C_F_POINTER(lib%prv(1)%targets(1), p_work, SHAPE=a_mysize)
501 : #else
502 : MARK_USED(n_b)
503 : MARK_USED(n_a)
504 : MARK_USED(lib)
505 : MARK_USED(p_work)
506 : MARK_USED(a_mysize)
507 : CPABORT("This CP2K executable has not been linked against the required library libint.")
508 : #endif
509 :
510 10520762 : END SUBROUTINE cp_libint_get_2eris
511 :
512 : ! **************************************************************************************************
513 : !> \brief ...
514 : !> \param n_d ...
515 : !> \param n_c ...
516 : !> \param n_b ...
517 : !> \param n_a ...
518 : !> \param lib ...
519 : !> \param work_forces ...
520 : !> \param a_mysize ...
521 : ! **************************************************************************************************
522 105359984 : SUBROUTINE cp_libint_get_derivs(n_d, n_c, n_b, n_a, lib, work_forces, a_mysize)
523 : INTEGER, INTENT(IN) :: n_d, n_c, n_b, n_a
524 : TYPE(cp_libint_t) :: lib
525 : REAL(dp), DIMENSION(nco(n_a)*nco(n_b)*nco(n_c)*nco &
526 : (n_d), 12) :: work_forces
527 : INTEGER :: a_mysize(1)
528 :
529 : #if(__LIBINT)
530 105359984 : REAL(dp), DIMENSION(:), POINTER :: p_work
531 :
532 : PROCEDURE(libint2_build), POINTER :: pbuild
533 : INTEGER :: i, k
534 : #endif
535 :
536 : #if(__LIBINT)
537 105359984 : CALL C_F_PROCPOINTER(libint2_build_eri1(n_d, n_c, n_b, n_a), pbuild)
538 105359984 : CALL pbuild(lib%prv)
539 :
540 1369679792 : DO k = 1, 12
541 1264319808 : IF (k == 4 .OR. k == 5 .OR. k == 6) CYCLE
542 1896479712 : CALL C_F_POINTER(lib%prv(1)%targets(k), p_work, SHAPE=a_mysize)
543 11419741520 : DO i = 1, a_mysize(1)
544 11630461488 : work_forces(i, k) = p_work(i)
545 : END DO
546 : END DO
547 : #else
548 : MARK_USED(n_d)
549 : MARK_USED(n_c)
550 : MARK_USED(n_b)
551 : MARK_USED(n_a)
552 : MARK_USED(lib)
553 : MARK_USED(work_forces)
554 : MARK_USED(a_mysize)
555 : CPABORT("This CP2K executable has not been linked against the required library libint.")
556 : #endif
557 :
558 105359984 : END SUBROUTINE cp_libint_get_derivs
559 :
560 32673096 : FUNCTION get_ssss_f_val(lib)
561 : TYPE(cp_libint_t) :: lib
562 : REAL(KIND=dp) :: get_ssss_f_val
563 :
564 32673096 : get_ssss_f_val = 0
565 :
566 : #if(__LIBINT)
567 32673096 : get_ssss_f_val = lib%prv(1)%f_aB_s___0__s___1___TwoPRep_s___0__s___1___Ab__up_0(1)
568 : #else
569 : MARK_USED(lib)
570 : get_ssss_f_val = 0.0_dp
571 : CPABORT("This CP2K executable has not been linked against the required library libint.")
572 : #endif
573 :
574 32673096 : END FUNCTION get_ssss_f_val
575 :
576 1438 : SUBROUTINE cp_libint_init_eri(lib, max_am)
577 : TYPE(cp_libint_t) :: lib
578 : INTEGER :: max_am
579 : #if(__LIBINT)
580 1438 : CALL libint2_init_eri(lib%prv, max_am, C_NULL_PTR)
581 : #else
582 : MARK_USED(lib)
583 : MARK_USED(max_am)
584 : CPABORT("This CP2K executable has not been linked against the required library libint.")
585 : #endif
586 1438 : END SUBROUTINE cp_libint_init_eri
587 :
588 12916 : SUBROUTINE cp_libint_set_contrdepth(lib, contrdepth)
589 : TYPE(cp_libint_t) :: lib
590 : INTEGER :: contrdepth
591 : #if(__LIBINT)
592 : #if LIBINT_CONTRACTED_INTS
593 12916 : lib%prv(1)%contrdepth = contrdepth
594 : #else
595 : MARK_USED(lib)
596 : MARK_USED(contrdepth)
597 : #endif
598 : #else
599 : MARK_USED(lib)
600 : MARK_USED(contrdepth)
601 : CPABORT("This CP2K executable has not been linked against the required library libint.")
602 : #endif
603 :
604 12916 : END SUBROUTINE cp_libint_set_contrdepth
605 :
606 1438 : SUBROUTINE cp_libint_init_eri1(lib, max_am)
607 : TYPE(cp_libint_t) :: lib
608 : INTEGER :: max_am
609 : #if(__LIBINT)
610 1438 : CALL libint2_init_eri1(lib%prv, max_am, C_NULL_PTR)
611 : #else
612 : MARK_USED(lib)
613 : MARK_USED(max_am)
614 : CPABORT("This CP2K executable has not been linked against the required library libint.")
615 : #endif
616 1438 : END SUBROUTINE cp_libint_init_eri1
617 :
618 8048 : SUBROUTINE cp_libint_init_3eri(lib, max_am)
619 : TYPE(cp_libint_t) :: lib
620 : INTEGER :: max_am
621 : #if(__LIBINT)
622 8048 : CALL libint2_init_3eri(lib%prv, max_am, C_NULL_PTR)
623 : #else
624 : MARK_USED(lib)
625 : MARK_USED(max_am)
626 : CPABORT("This CP2K executable has not been linked against the required library libint.")
627 : #endif
628 8048 : END SUBROUTINE cp_libint_init_3eri
629 :
630 598 : SUBROUTINE cp_libint_init_3eri1(lib, max_am)
631 : TYPE(cp_libint_t) :: lib
632 : INTEGER :: max_am
633 : #if(__LIBINT)
634 598 : CALL libint2_init_3eri1(lib%prv, max_am, C_NULL_PTR)
635 : #else
636 : MARK_USED(lib)
637 : MARK_USED(max_am)
638 : CPABORT("This CP2K executable has not been linked against the required library libint.")
639 : #endif
640 598 : END SUBROUTINE cp_libint_init_3eri1
641 :
642 404 : SUBROUTINE cp_libint_init_2eri1(lib, max_am)
643 : TYPE(cp_libint_t) :: lib
644 : INTEGER :: max_am
645 : #if(__LIBINT)
646 404 : CALL libint2_init_2eri1(lib%prv, max_am, C_NULL_PTR)
647 : #else
648 : MARK_USED(lib)
649 : MARK_USED(max_am)
650 : CPABORT("This CP2K executable has not been linked against the required library libint.")
651 : #endif
652 404 : END SUBROUTINE cp_libint_init_2eri1
653 :
654 990 : SUBROUTINE cp_libint_init_2eri(lib, max_am)
655 : TYPE(cp_libint_t) :: lib
656 : INTEGER :: max_am
657 : #if(__LIBINT)
658 990 : CALL libint2_init_2eri(lib%prv, max_am, C_NULL_PTR)
659 : #else
660 : MARK_USED(lib)
661 : MARK_USED(max_am)
662 : CPABORT("This CP2K executable has not been linked against the required library libint.")
663 : #endif
664 990 : END SUBROUTINE cp_libint_init_2eri
665 :
666 1438 : SUBROUTINE cp_libint_cleanup_eri(lib)
667 : TYPE(cp_libint_t) :: lib
668 : #if(__LIBINT)
669 1438 : CALL libint2_cleanup_eri(lib%prv)
670 : #else
671 : MARK_USED(lib)
672 : CPABORT("This CP2K executable has not been linked against the required library libint.")
673 : #endif
674 1438 : END SUBROUTINE cp_libint_cleanup_eri
675 :
676 1438 : SUBROUTINE cp_libint_cleanup_eri1(lib)
677 : TYPE(cp_libint_t) :: lib
678 : #if(__LIBINT)
679 1438 : CALL libint2_cleanup_eri1(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 1438 : END SUBROUTINE cp_libint_cleanup_eri1
685 :
686 8048 : SUBROUTINE cp_libint_cleanup_3eri(lib)
687 : TYPE(cp_libint_t) :: lib
688 : #if(__LIBINT)
689 8048 : CALL libint2_cleanup_3eri(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 8048 : END SUBROUTINE cp_libint_cleanup_3eri
695 :
696 598 : SUBROUTINE cp_libint_cleanup_3eri1(lib)
697 : TYPE(cp_libint_t) :: lib
698 : #if(__LIBINT)
699 598 : CALL libint2_cleanup_3eri1(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 598 : END SUBROUTINE cp_libint_cleanup_3eri1
705 :
706 404 : SUBROUTINE cp_libint_cleanup_2eri1(lib)
707 : TYPE(cp_libint_t) :: lib
708 : #if(__LIBINT)
709 404 : CALL libint2_cleanup_2eri1(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 404 : END SUBROUTINE cp_libint_cleanup_2eri1
715 :
716 990 : SUBROUTINE cp_libint_cleanup_2eri(lib)
717 : TYPE(cp_libint_t) :: lib
718 : #if(__LIBINT)
719 990 : CALL libint2_cleanup_2eri(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 990 : END SUBROUTINE cp_libint_cleanup_2eri
725 :
726 1808 : SUBROUTINE cp_libint_static_init()
727 : #if(__LIBINT)
728 1808 : CALL libint2_static_init()
729 : #else
730 : CPABORT("This CP2K executable has not been linked against the required library libint.")
731 : #endif
732 1808 : END SUBROUTINE cp_libint_static_init
733 :
734 1818 : SUBROUTINE cp_libint_static_cleanup()
735 : #if(__LIBINT)
736 1818 : CALL libint2_static_cleanup()
737 : #else
738 : CPABORT("This CP2K executable has not been linked against the required library libint.")
739 : #endif
740 1818 : END SUBROUTINE cp_libint_static_cleanup
741 :
742 0 : END MODULE libint_wrapper
|