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 82334190 : 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 82334190 : libint%prv(1)%AB_x(1) = A(1) - B(1)
90 82334190 : libint%prv(1)%AB_y(1) = A(2) - B(2)
91 82334190 : libint%prv(1)%AB_z(1) = A(3) - B(3)
92 :
93 82334190 : libint%prv(1)%CD_x(1) = C(1) - D(1)
94 82334190 : libint%prv(1)%CD_y(1) = C(2) - D(2)
95 82334190 : libint%prv(1)%CD_z(1) = C(3) - D(3)
96 :
97 82334190 : libint%prv(1)%PA_x(1) = P(1) - A(1)
98 82334190 : libint%prv(1)%PA_y(1) = P(2) - A(2)
99 82334190 : libint%prv(1)%PA_z(1) = P(3) - A(3)
100 :
101 82334190 : libint%prv(1)%QC_x(1) = Q(1) - C(1)
102 82334190 : libint%prv(1)%QC_y(1) = Q(2) - C(2)
103 82334190 : libint%prv(1)%QC_z(1) = Q(3) - C(3)
104 :
105 82334190 : libint%prv(1)%WP_x(1) = W(1) - P(1)
106 82334190 : libint%prv(1)%WP_y(1) = W(2) - P(2)
107 82334190 : libint%prv(1)%WP_z(1) = W(3) - P(3)
108 :
109 82334190 : libint%prv(1)%WQ_x(1) = W(1) - Q(1)
110 82334190 : libint%prv(1)%WQ_y(1) = W(2) - Q(2)
111 82334190 : libint%prv(1)%WQ_z(1) = W(3) - Q(3)
112 :
113 82334190 : libint%prv(1)%oo2z(1) = 0.5_dp*ZetaInv
114 82334190 : libint%prv(1)%oo2e(1) = 0.5_dp*EtaInv
115 82334190 : libint%prv(1)%oo2ze(1) = 0.5_dp*ZetapEtaInv
116 82334190 : libint%prv(1)%roz(1) = Rho*ZetaInv
117 82334190 : 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 317625204 : 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 235291014 : = 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 82334190 : END SUBROUTINE
148 :
149 99278397 : SUBROUTINE cp_libint_set_params_eri_deriv(libint, A, B, C, D, P, Q, W, zeta_A, zeta_B, zeta_C, zeta_D, &
150 99278397 : 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 99278397 : libint%prv(1)%AB_x(1) = A(1) - B(1)
161 99278397 : libint%prv(1)%AB_y(1) = A(2) - B(2)
162 99278397 : libint%prv(1)%AB_z(1) = A(3) - B(3)
163 :
164 99278397 : libint%prv(1)%CD_x(1) = C(1) - D(1)
165 99278397 : libint%prv(1)%CD_y(1) = C(2) - D(2)
166 99278397 : libint%prv(1)%CD_z(1) = C(3) - D(3)
167 :
168 99278397 : libint%prv(1)%PA_x(1) = P(1) - A(1)
169 99278397 : libint%prv(1)%PA_y(1) = P(2) - A(2)
170 99278397 : libint%prv(1)%PA_z(1) = P(3) - A(3)
171 :
172 99278397 : libint%prv(1)%PB_x(1) = P(1) - B(1)
173 99278397 : libint%prv(1)%PB_y(1) = P(2) - B(2)
174 99278397 : libint%prv(1)%PB_z(1) = P(3) - B(3)
175 :
176 99278397 : libint%prv(1)%QC_x(1) = Q(1) - C(1)
177 99278397 : libint%prv(1)%QC_y(1) = Q(2) - C(2)
178 99278397 : libint%prv(1)%QC_z(1) = Q(3) - C(3)
179 :
180 99278397 : libint%prv(1)%WP_x(1) = W(1) - P(1)
181 99278397 : libint%prv(1)%WP_y(1) = W(2) - P(2)
182 99278397 : libint%prv(1)%WP_z(1) = W(3) - P(3)
183 :
184 99278397 : libint%prv(1)%WQ_x(1) = W(1) - Q(1)
185 99278397 : libint%prv(1)%WQ_y(1) = W(2) - Q(2)
186 99278397 : libint%prv(1)%WQ_z(1) = W(3) - Q(3)
187 :
188 99278397 : libint%prv(1)%two_alpha0_bra(1) = 2.0_dp*Zeta_A
189 99278397 : libint%prv(1)%two_alpha0_ket(1) = 2.0_dp*Zeta_B
190 99278397 : libint%prv(1)%two_alpha1_ket(1) = 2.0_dp*Zeta_D
191 :
192 99278397 : gammap = Zeta_A + Zeta_B
193 99278397 : gammaq = Zeta_C + Zeta_D
194 99278397 : gammapq = gammap*gammaq/(gammap + gammaq)
195 99278397 : libint%prv(1)%alpha1_rho_over_zeta2(1) = Zeta_A*gammapq/(gammap*gammap)
196 99278397 : libint%prv(1)%alpha2_rho_over_zeta2(1) = Zeta_B*gammapq/(gammap*gammap)
197 99278397 : libint%prv(1)%alpha4_rho_over_eta2(1) = Zeta_D*gammapq/(gammaq*gammaq)
198 99278397 : libint%prv(1)%alpha1_over_zetapluseta(1) = Zeta_A/(gammap + gammaq)
199 99278397 : libint%prv(1)%alpha2_over_zetapluseta(1) = Zeta_B/(gammap + gammaq)
200 99278397 : libint%prv(1)%alpha4_over_zetapluseta(1) = Zeta_D/(gammap + gammaq)
201 :
202 99278397 : rhop = Zeta_A*Zeta_B/gammap
203 99278397 : rhoq = Zeta_C*Zeta_D/gammaq
204 99278397 : libint%prv(1)%rho12_over_alpha1(1) = rhop/Zeta_A
205 :
206 99278397 : libint%prv(1)%rho34_over_alpha3(1) = rhoq/Zeta_C
207 :
208 99278397 : libint%prv(1)%oo2z(1) = 0.5_dp*ZetaInv
209 99278397 : libint%prv(1)%oo2e(1) = 0.5_dp*EtaInv
210 99278397 : libint%prv(1)%oo2ze(1) = 0.5_dp*ZetapEtaInv
211 99278397 : libint%prv(1)%roz(1) = Rho*ZetaInv
212 99278397 : 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 441149533 : 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 341871136 : = 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 99278397 : END SUBROUTINE
245 :
246 335821540 : 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 335821540 : libint%prv(1)%AB_x(1) = A(1) - B(1)
256 335821540 : libint%prv(1)%AB_y(1) = A(2) - B(2)
257 335821540 : libint%prv(1)%AB_z(1) = A(3) - B(3)
258 :
259 335821540 : libint%prv(1)%CD_x(1) = C(1) - D(1)
260 335821540 : libint%prv(1)%CD_y(1) = C(2) - D(2)
261 335821540 : libint%prv(1)%CD_z(1) = C(3) - D(3)
262 :
263 335821540 : libint%prv(1)%PA_x(1) = P(1) - A(1)
264 335821540 : libint%prv(1)%PA_y(1) = P(2) - A(2)
265 335821540 : libint%prv(1)%PA_z(1) = P(3) - A(3)
266 :
267 335821540 : libint%prv(1)%QC_x(1) = Q(1) - C(1)
268 335821540 : libint%prv(1)%QC_y(1) = Q(2) - C(2)
269 335821540 : libint%prv(1)%QC_z(1) = Q(3) - C(3)
270 :
271 335821540 : libint%prv(1)%WP_x(1) = W(1) - P(1)
272 335821540 : libint%prv(1)%WP_y(1) = W(2) - P(2)
273 335821540 : libint%prv(1)%WP_z(1) = W(3) - P(3)
274 :
275 335821540 : libint%prv(1)%WQ_x(1) = W(1) - Q(1)
276 335821540 : libint%prv(1)%WQ_y(1) = W(2) - Q(2)
277 335821540 : libint%prv(1)%WQ_z(1) = W(3) - Q(3)
278 :
279 335821540 : libint%prv(1)%oo2z(1) = 0.5_dp*ZetaInv
280 335821540 : libint%prv(1)%oo2e(1) = 0.5_dp*EtaInv
281 335821540 : libint%prv(1)%oo2ze(1) = 0.5_dp*ZetapEtaInv
282 335821540 : libint%prv(1)%roz(1) = Rho*ZetaInv
283 335821540 : 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 1227900732 : 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 892079192 : = 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 335821540 : 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 299555217 : 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 299555217 : CALL C_F_PROCPOINTER(libint2_build_eri(n_d, n_c, n_b, n_a), pbuild)
333 299555217 : CALL pbuild(lib%prv)
334 :
335 599110434 : 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 299555217 : 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 25289799 : 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 25289799 : CALL C_F_PROCPOINTER(libint2_build_3eri(n_c, n_b, n_a), pbuild)
368 25289799 : CALL pbuild(lib%prv)
369 :
370 50579598 : 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 25289799 : 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 4701969 : 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 4701969 : REAL(dp), DIMENSION(:), POINTER :: p_work_tmp
400 : PROCEDURE(libint2_build), POINTER :: pbuild
401 : INTEGER :: i
402 :
403 4701969 : CALL C_F_PROCPOINTER(libint2_build_3eri1(n_c, n_b, n_a), pbuild)
404 4701969 : CALL pbuild(lib%prv)
405 :
406 14105907 : ALLOCATE (p_work(a_mysize(1), 9))
407 :
408 : !Derivatives 1-3 can be obtained using translational invariance
409 32913783 : DO i = 4, 9
410 28211814 : NULLIFY (p_work_tmp)
411 56423628 : CALL C_F_POINTER(lib%prv(1)%targets(i), p_work_tmp, SHAPE=a_mysize)
412 481346325 : 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 4701969 : 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 6157563 : 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 6157563 : REAL(dp), DIMENSION(:), POINTER :: p_work_tmp
443 : PROCEDURE(libint2_build), POINTER :: pbuild
444 : INTEGER :: i
445 :
446 6157563 : CALL C_F_PROCPOINTER(libint2_build_2eri1(n_b, n_a), pbuild)
447 6157563 : CALL pbuild(lib%prv)
448 :
449 18472689 : ALLOCATE (p_work(a_mysize(1), 6))
450 :
451 : !Derivatives 1-3 can be obtained using translational invariance
452 24630252 : DO i = 4, 6
453 18472689 : NULLIFY (p_work_tmp)
454 36945378 : CALL C_F_POINTER(lib%prv(1)%targets(i), p_work_tmp, SHAPE=a_mysize)
455 321286461 : 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 6157563 : 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 10315928 : 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 10315928 : CALL C_F_PROCPOINTER(libint2_build_2eri(n_b, n_a), pbuild)
487 10315928 : CALL pbuild(lib%prv)
488 :
489 20631856 : 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 10315928 : 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 93417329 : 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 93417329 : REAL(dp), DIMENSION(:), POINTER :: p_work
520 :
521 : PROCEDURE(libint2_build), POINTER :: pbuild
522 : INTEGER :: i, k
523 : #endif
524 :
525 : #if(__LIBINT)
526 93417329 : CALL C_F_PROCPOINTER(libint2_build_eri1(n_d, n_c, n_b, n_a), pbuild)
527 93417329 : CALL pbuild(lib%prv)
528 :
529 1214425277 : DO k = 1, 12
530 1121007948 : IF (k == 4 .OR. k == 5 .OR. k == 6) CYCLE
531 1681511922 : CALL C_F_POINTER(lib%prv(1)%targets(k), p_work, SHAPE=a_mysize)
532 9948449243 : DO i = 1, a_mysize(1)
533 10135283901 : 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 93417329 : END SUBROUTINE cp_libint_get_derivs
548 :
549 30858732 : FUNCTION get_ssss_f_val(lib)
550 : TYPE(cp_libint_t) :: lib
551 : REAL(KIND=dp) :: get_ssss_f_val
552 :
553 30858732 : get_ssss_f_val = 0
554 :
555 : #if(__LIBINT)
556 30858732 : 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 30858732 : END FUNCTION
564 :
565 1326 : SUBROUTINE cp_libint_init_eri(lib, max_am)
566 : TYPE(cp_libint_t) :: lib
567 : INTEGER :: max_am
568 : #if(__LIBINT)
569 1326 : 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 1326 : END SUBROUTINE
576 :
577 30497 : 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 30497 : 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 30497 : END SUBROUTINE
594 :
595 1326 : SUBROUTINE cp_libint_init_eri1(lib, max_am)
596 : TYPE(cp_libint_t) :: lib
597 : INTEGER :: max_am
598 : #if(__LIBINT)
599 1326 : 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 1326 : END SUBROUTINE
606 :
607 25933 : SUBROUTINE cp_libint_init_3eri(lib, max_am)
608 : TYPE(cp_libint_t) :: lib
609 : INTEGER :: max_am
610 : #if(__LIBINT)
611 25933 : 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 25933 : 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 950 : SUBROUTINE cp_libint_init_2eri(lib, max_am)
644 : TYPE(cp_libint_t) :: lib
645 : INTEGER :: max_am
646 : #if(__LIBINT)
647 950 : 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 950 : END SUBROUTINE
654 :
655 1326 : SUBROUTINE cp_libint_cleanup_eri(lib)
656 : TYPE(cp_libint_t) :: lib
657 : #if(__LIBINT)
658 1326 : 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 1326 : END SUBROUTINE
664 :
665 1326 : SUBROUTINE cp_libint_cleanup_eri1(lib)
666 : TYPE(cp_libint_t) :: lib
667 : #if(__LIBINT)
668 1326 : 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 1326 : END SUBROUTINE
674 :
675 25933 : SUBROUTINE cp_libint_cleanup_3eri(lib)
676 : TYPE(cp_libint_t) :: lib
677 : #if(__LIBINT)
678 25933 : 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 25933 : 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 950 : SUBROUTINE cp_libint_cleanup_2eri(lib)
706 : TYPE(cp_libint_t) :: lib
707 : #if(__LIBINT)
708 950 : 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 950 : END SUBROUTINE
714 :
715 1664 : SUBROUTINE cp_libint_static_init()
716 : #if(__LIBINT)
717 1664 : CALL libint2_static_init()
718 : #else
719 : CPABORT("This CP2K executable has not been linked against the required library libint.")
720 : #endif
721 1664 : END SUBROUTINE
722 :
723 1672 : SUBROUTINE cp_libint_static_cleanup()
724 : #if(__LIBINT)
725 1672 : CALL libint2_static_cleanup()
726 : #else
727 : CPABORT("This CP2K executable has not been linked against the required library libint.")
728 : #endif
729 1672 : END SUBROUTINE
730 :
731 0 : END MODULE libint_wrapper
|