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 Calculates integrals for LRIGPW method
10 : !> lri : local resolution of the identity
11 : !> \par History
12 : !> created JGH [08.2012]
13 : !> Dorothea Golze [02.2014] (1) extended, re-structured, cleaned
14 : !> (2) heavily debugged
15 : !> split off JGH [11.2017]
16 : !> \authors JGH
17 : !> Dorothea Golze
18 : ! **************************************************************************************************
19 : MODULE lri_integrals
20 : USE basis_set_types, ONLY: gto_basis_set_type
21 : USE generic_os_integrals, ONLY: int_overlap_ab_os,&
22 : int_overlap_aba_os,&
23 : int_overlap_abb_os
24 : USE generic_shg_integrals, ONLY: get_abb_same_kind,&
25 : int_overlap_ab_shg_low,&
26 : int_overlap_aba_shg_low,&
27 : int_overlap_abb_shg_low,&
28 : lri_precalc_angular_shg_part
29 : USE kinds, ONLY: dp
30 : USE lri_environment_types, ONLY: lri_environment_type,&
31 : lri_int_type
32 : #include "./base/base_uses.f90"
33 :
34 : IMPLICIT NONE
35 :
36 : PRIVATE
37 :
38 : ! **************************************************************************************************
39 : TYPE int_type
40 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: sabint
41 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: sooint
42 : REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: abaint
43 : REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: abbint
44 : END TYPE int_type
45 : !
46 : TYPE dint_type
47 : REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: dsabint
48 : REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE :: dsooint
49 : REAL(KIND=dp), DIMENSION(:, :, :, :), ALLOCATABLE :: dabaint
50 : REAL(KIND=dp), DIMENSION(:, :, :, :), ALLOCATABLE :: dabbint
51 : END TYPE dint_type
52 : ! **************************************************************************************************
53 :
54 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'lri_integrals'
55 :
56 : PUBLIC :: lri_int, lri_int2, lri_dint, lri_dint2, int_type, dint_type, allocate_int_type, deallocate_int_type
57 :
58 : ! **************************************************************************************************
59 :
60 : CONTAINS
61 :
62 : ! **************************************************************************************************
63 : !> \brief calcuates the lri integrals using solid harmonic Gaussians
64 : !> \param lri_env ...
65 : !> \param lrii ...
66 : !> \param rab distance vector
67 : !> \param obasa orb basis on A
68 : !> \param obasb orb basis on B
69 : !> \param fbasa aux basis on A
70 : !> \param fbasb aux basis on B
71 : !> \param iatom index atom A
72 : !> \param jatom index atom B
73 : !> \param ikind kind atom A
74 : !> \param jkind kind atom B
75 : !> \param calculate_forces ...
76 : ! **************************************************************************************************
77 0 : SUBROUTINE lri_int(lri_env, lrii, rab, obasa, obasb, fbasa, fbasb, &
78 : iatom, jatom, ikind, jkind, calculate_forces)
79 :
80 : TYPE(lri_environment_type), POINTER :: lri_env
81 : TYPE(lri_int_type), POINTER :: lrii
82 : REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rab
83 : TYPE(gto_basis_set_type), POINTER :: obasa, obasb, fbasa, fbasb
84 : INTEGER, INTENT(IN) :: iatom, jatom, ikind, jkind
85 : LOGICAL, INTENT(IN) :: calculate_forces
86 :
87 0 : IF (lri_env%use_shg_integrals) THEN
88 : CALL lri_int_shg(lri_env, lrii, rab, obasa, obasb, fbasa, fbasb, &
89 0 : iatom, jatom, ikind, jkind, calculate_forces)
90 : ELSE
91 : CALL lri_int_os(lri_env, lrii, rab, obasa, obasb, fbasa, fbasb, &
92 0 : iatom, jatom, ikind, calculate_forces)
93 : END IF
94 :
95 0 : END SUBROUTINE lri_int
96 :
97 : ! **************************************************************************************************
98 : !> \brief calcuates the lri integrals using solid harmonic Gaussians
99 : !> \param lri_env ...
100 : !> \param lrii ...
101 : !> \param lriint ...
102 : !> \param rab distance vector
103 : !> \param obasa orb basis on A
104 : !> \param obasb orb basis on B
105 : !> \param fbasa aux basis on A
106 : !> \param fbasb aux basis on B
107 : !> \param iatom index atom A
108 : !> \param jatom index atom B
109 : !> \param ikind kind atom A
110 : !> \param jkind kind atom B
111 : ! **************************************************************************************************
112 9414 : SUBROUTINE lri_int2(lri_env, lrii, lriint, rab, obasa, obasb, fbasa, fbasb, iatom, jatom, ikind, jkind)
113 :
114 : TYPE(lri_environment_type), POINTER :: lri_env
115 : TYPE(lri_int_type), POINTER :: lrii
116 : TYPE(int_type) :: lriint
117 : REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rab
118 : TYPE(gto_basis_set_type), POINTER :: obasa, obasb, fbasa, fbasb
119 : INTEGER, INTENT(IN) :: iatom, jatom, ikind, jkind
120 :
121 : INTEGER :: nba, nfa
122 9414 : INTEGER, DIMENSION(:, :, :), POINTER :: fba_index, fbb_index, oba_index, &
123 9414 : obb_index
124 : REAL(KIND=dp) :: dab
125 9414 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: dummy1, Waux_mat
126 9414 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :, :) :: dummy2, dWaux_mat
127 9414 : REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: scon_fba, scon_fbb, scon_oba, scon_obb
128 9414 : REAL(KIND=dp), DIMENSION(:, :, :, :), POINTER :: scona_mix, sconb_mix
129 :
130 37656 : dab = SQRT(SUM(rab*rab))
131 9414 : IF (iatom == jatom .AND. dab < lri_env%delta) THEN
132 135 : CPASSERT(ALLOCATED(lriint%sabint))
133 135 : CPASSERT(ALLOCATED(lriint%sooint))
134 135 : CPASSERT(ALLOCATED(lriint%abaint))
135 135 : nba = obasa%nsgf
136 135 : nfa = fbasa%nsgf
137 1494117 : lriint%sabint(1:nfa, 1:nfa) = lri_env%bas_prop(ikind)%ri_ovlp(1:nfa, 1:nfa)
138 10809 : lriint%sooint(1:nba, 1:nba) = lri_env%bas_prop(ikind)%orb_ovlp(1:nba, 1:nba)
139 1070984 : lriint%abaint(1:nba, 1:nba, 1:nfa) = lri_env%bas_prop(ikind)%ovlp3
140 : ELSE
141 9279 : IF (lri_env%use_shg_integrals) THEN
142 8593 : scon_oba => lri_env%bas_prop(ikind)%scon_orb
143 8593 : scon_obb => lri_env%bas_prop(jkind)%scon_orb
144 8593 : scon_fba => lri_env%bas_prop(ikind)%scon_ri
145 8593 : scon_fbb => lri_env%bas_prop(jkind)%scon_ri
146 8593 : scona_mix => lri_env%bas_prop(ikind)%scon_mix
147 8593 : sconb_mix => lri_env%bas_prop(jkind)%scon_mix
148 8593 : oba_index => lri_env%bas_prop(ikind)%orb_index
149 8593 : fba_index => lri_env%bas_prop(ikind)%ri_index
150 8593 : obb_index => lri_env%bas_prop(jkind)%orb_index
151 8593 : fbb_index => lri_env%bas_prop(jkind)%ri_index
152 : !
153 : CALL lri_precalc_angular_shg_part(obasa, obasb, fbasa, fbasb, rab, Waux_mat, dWaux_mat, &
154 8593 : .FALSE.)
155 : !*** (fa,fb)
156 8593 : IF (ALLOCATED(lriint%sabint)) THEN
157 : CALL int_overlap_ab_shg_low(lriint%sabint, dummy1, rab, fbasa, fbasb, scon_fba, scon_fbb, &
158 1305 : Waux_mat, dWaux_mat, .TRUE., .FALSE., contraction_high=.FALSE.)
159 : END IF
160 : !*** (a,b)
161 8593 : IF (ALLOCATED(lriint%sooint)) THEN
162 : CALL int_overlap_ab_shg_low(lriint%sooint, dummy1, rab, obasa, obasb, scon_oba, scon_obb, &
163 8593 : Waux_mat, dWaux_mat, .TRUE., .FALSE., contraction_high=.TRUE.)
164 : END IF
165 : !*** (a,b,fa)
166 8593 : IF (ALLOCATED(lriint%abaint)) THEN
167 : CALL int_overlap_aba_shg_low(lriint%abaint, dummy2, rab, obasa, obasb, fbasa, &
168 : scon_obb, scona_mix, oba_index, fba_index, &
169 : lri_env%cg_shg%cg_coeff, lri_env%cg_shg%cg_none0_list, &
170 : lri_env%cg_shg%ncg_none0, &
171 8593 : Waux_mat, dWaux_mat, .TRUE., .FALSE.)
172 : END IF
173 : !*** (a,b,fb)
174 8593 : IF (ALLOCATED(lriint%abbint)) THEN
175 8593 : IF (ikind == jkind) THEN
176 8043 : CPASSERT(ALLOCATED(lriint%abaint))
177 : CALL get_abb_same_kind(lriint%abbint, dummy2, lriint%abaint, dummy2, &
178 8043 : rab, obasa, fbasa, .TRUE., .FALSE.)
179 : ELSE
180 : CALL int_overlap_abb_shg_low(lriint%abbint, dummy2, rab, obasa, obasb, fbasb, &
181 : scon_oba, sconb_mix, obb_index, fbb_index, &
182 : lri_env%cg_shg%cg_coeff, lri_env%cg_shg%cg_none0_list, &
183 : lri_env%cg_shg%ncg_none0, &
184 550 : Waux_mat, dWaux_mat, .TRUE., .FALSE.)
185 : END IF
186 : END IF
187 8593 : DEALLOCATE (Waux_mat, dWaux_mat)
188 : ELSE
189 : !*** (fa,fb)
190 686 : IF (ALLOCATED(lriint%sabint)) THEN
191 : CALL int_overlap_ab_os(lriint%sabint, dummy1, rab, fbasa, fbasb, &
192 686 : .FALSE., lri_env%debug, lrii%dmax_ab)
193 : END IF
194 : !*** (a,b)
195 686 : IF (ALLOCATED(lriint%sooint)) THEN
196 : CALL int_overlap_ab_os(lriint%sooint, dummy1, rab, obasa, obasb, &
197 686 : .FALSE., lri_env%debug, lrii%dmax_oo)
198 : END IF
199 : !*** (a,b,fa)
200 686 : IF (ALLOCATED(lriint%abaint)) THEN
201 : CALL int_overlap_aba_os(lriint%abaint, dummy2, rab, obasa, obasb, fbasa, &
202 686 : .FALSE., lri_env%debug, lrii%dmax_aba)
203 : END IF
204 : !*** (a,b,fb)
205 686 : IF (ALLOCATED(lriint%abbint)) THEN
206 : CALL int_overlap_abb_os(lriint%abbint, dummy2, rab, obasa, obasb, fbasb, &
207 686 : .FALSE., lri_env%debug, lrii%dmax_abb)
208 : END IF
209 : END IF
210 : END IF
211 :
212 18828 : END SUBROUTINE lri_int2
213 :
214 : ! **************************************************************************************************
215 :
216 : ! **************************************************************************************************
217 : !> \brief ...
218 : !> \param lri_env ...
219 : !> \param lrii ...
220 : !> \param rab ...
221 : !> \param obasa ...
222 : !> \param obasb ...
223 : !> \param fbasa ...
224 : !> \param fbasb ...
225 : !> \param iatom ...
226 : !> \param jatom ...
227 : !> \param ikind ...
228 : !> \param jkind ...
229 : !> \param calculate_forces ...
230 : ! **************************************************************************************************
231 0 : SUBROUTINE lri_dint(lri_env, lrii, rab, obasa, obasb, fbasa, fbasb, &
232 : iatom, jatom, ikind, jkind, calculate_forces)
233 :
234 : TYPE(lri_environment_type), POINTER :: lri_env
235 : TYPE(lri_int_type), POINTER :: lrii
236 : REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rab
237 : TYPE(gto_basis_set_type), POINTER :: obasa, obasb, fbasa, fbasb
238 : INTEGER, INTENT(IN) :: iatom, jatom, ikind, jkind
239 : LOGICAL, INTENT(IN) :: calculate_forces
240 :
241 0 : IF (lri_env%use_shg_integrals) THEN
242 : CALL lri_int_shg(lri_env, lrii, rab, obasa, obasb, fbasa, fbasb, &
243 0 : iatom, jatom, ikind, jkind, calculate_forces)
244 : ELSE
245 : CALL lri_int_os(lri_env, lrii, rab, obasa, obasb, fbasa, fbasb, &
246 0 : iatom, jatom, ikind, calculate_forces)
247 : END IF
248 :
249 0 : END SUBROUTINE lri_dint
250 :
251 : ! **************************************************************************************************
252 : !> \brief ...
253 : !> \param lri_env ...
254 : !> \param lrii ...
255 : !> \param lridint ...
256 : !> \param rab ...
257 : !> \param obasa ...
258 : !> \param obasb ...
259 : !> \param fbasa ...
260 : !> \param fbasb ...
261 : !> \param iatom ...
262 : !> \param jatom ...
263 : !> \param ikind ...
264 : !> \param jkind ...
265 : ! **************************************************************************************************
266 6586 : SUBROUTINE lri_dint2(lri_env, lrii, lridint, rab, obasa, obasb, fbasa, fbasb, &
267 : iatom, jatom, ikind, jkind)
268 :
269 : TYPE(lri_environment_type), POINTER :: lri_env
270 : TYPE(lri_int_type), POINTER :: lrii
271 : TYPE(dint_type) :: lridint
272 : REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rab
273 : TYPE(gto_basis_set_type), POINTER :: obasa, obasb, fbasa, fbasb
274 : INTEGER, INTENT(IN) :: iatom, jatom, ikind, jkind
275 :
276 : INTEGER :: nba, nbb, nfa, nfb
277 6586 : INTEGER, DIMENSION(:, :, :), POINTER :: fba_index, fbb_index, oba_index, &
278 6586 : obb_index
279 : REAL(KIND=dp) :: dab
280 6586 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: dummy1
281 6586 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: dummy2, Waux_mat
282 6586 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :, :) :: dWaux_mat
283 6586 : REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: scon_fba, scon_fbb, scon_oba, scon_obb
284 6586 : REAL(KIND=dp), DIMENSION(:, :, :, :), POINTER :: scona_mix, sconb_mix
285 :
286 26344 : dab = SQRT(SUM(rab*rab))
287 6586 : nba = obasa%nsgf
288 6586 : nbb = obasb%nsgf
289 6586 : nfa = fbasa%nsgf
290 6586 : nfb = fbasb%nsgf
291 :
292 6586 : IF (iatom == jatom .AND. dab < lri_env%delta) THEN
293 : ! nothing to do
294 : ELSE
295 6586 : IF (lrii%calc_force_pair) THEN
296 6586 : IF (lri_env%use_shg_integrals) THEN
297 6140 : scon_oba => lri_env%bas_prop(ikind)%scon_orb
298 6140 : scon_obb => lri_env%bas_prop(jkind)%scon_orb
299 6140 : scon_fba => lri_env%bas_prop(ikind)%scon_ri
300 6140 : scon_fbb => lri_env%bas_prop(jkind)%scon_ri
301 6140 : scona_mix => lri_env%bas_prop(ikind)%scon_mix
302 6140 : sconb_mix => lri_env%bas_prop(jkind)%scon_mix
303 6140 : oba_index => lri_env%bas_prop(ikind)%orb_index
304 6140 : fba_index => lri_env%bas_prop(ikind)%ri_index
305 6140 : obb_index => lri_env%bas_prop(jkind)%orb_index
306 6140 : fbb_index => lri_env%bas_prop(jkind)%ri_index
307 :
308 : CALL lri_precalc_angular_shg_part(obasa, obasb, fbasa, fbasb, rab, &
309 6140 : Waux_mat, dWaux_mat, .TRUE.)
310 : !*** (fa,fb)
311 6140 : IF (ALLOCATED(lridint%dsabint)) THEN
312 : CALL int_overlap_ab_shg_low(dummy1, lridint%dsabint, rab, fbasa, fbasb, scon_fba, scon_fbb, &
313 764 : Waux_mat, dWaux_mat, .FALSE., .TRUE., contraction_high=.FALSE.)
314 : END IF
315 : !*** (a,b)
316 6140 : IF (ALLOCATED(lridint%dsooint)) THEN
317 : CALL int_overlap_ab_shg_low(dummy1, lridint%dsooint, rab, obasa, obasb, scon_oba, scon_obb, &
318 6140 : Waux_mat, dWaux_mat, .FALSE., .TRUE., contraction_high=.TRUE.)
319 : END IF
320 : !*** (a,b,fa)
321 6140 : IF (ALLOCATED(lridint%dabaint)) THEN
322 : CALL int_overlap_aba_shg_low(dummy2, lridint%dabaint, rab, obasa, obasb, fbasa, &
323 : scon_obb, scona_mix, oba_index, fba_index, &
324 : lri_env%cg_shg%cg_coeff, lri_env%cg_shg%cg_none0_list, &
325 : lri_env%cg_shg%ncg_none0, &
326 6140 : Waux_mat, dWaux_mat, .FALSE., .TRUE.)
327 : END IF
328 : !*** (a,b,fb)
329 6140 : IF (ALLOCATED(lridint%dabbint)) THEN
330 6140 : IF (ikind == jkind) THEN
331 5962 : CPASSERT(ALLOCATED(lridint%dabaint))
332 : CALL get_abb_same_kind(dummy2, lridint%dabbint, dummy2, lridint%dabaint, &
333 5962 : rab, obasa, fbasa, .FALSE., .TRUE.)
334 : ELSE
335 : CALL int_overlap_abb_shg_low(dummy2, lridint%dabbint, rab, obasa, obasb, fbasb, &
336 : scon_oba, sconb_mix, obb_index, fbb_index, &
337 : lri_env%cg_shg%cg_coeff, lri_env%cg_shg%cg_none0_list, &
338 : lri_env%cg_shg%ncg_none0, &
339 178 : Waux_mat, dWaux_mat, .FALSE., .TRUE.)
340 : END IF
341 : END IF
342 6140 : DEALLOCATE (Waux_mat, dWaux_mat)
343 :
344 : ELSE
345 :
346 : !*** (fa,fb)
347 446 : IF (ALLOCATED(lridint%dsabint)) THEN
348 1784 : ALLOCATE (dummy1(nfa, nfb))
349 : CALL int_overlap_ab_os(dummy1, lridint%dsabint, rab, fbasa, fbasb, &
350 446 : .TRUE., lri_env%debug, lrii%dmax_ab)
351 446 : DEALLOCATE (dummy1)
352 : END IF
353 : !*** (a,b)
354 446 : IF (ALLOCATED(lridint%dsooint)) THEN
355 1784 : ALLOCATE (dummy1(nba, nbb))
356 : CALL int_overlap_ab_os(dummy1, lridint%dsooint, rab, obasa, obasb, &
357 446 : .TRUE., lri_env%debug, lrii%dmax_oo)
358 446 : DEALLOCATE (dummy1)
359 : END IF
360 : !*** (a,b,fa)
361 446 : IF (ALLOCATED(lridint%dabaint)) THEN
362 2230 : ALLOCATE (dummy2(nba, nbb, nfa))
363 : CALL int_overlap_aba_os(dummy2, lridint%dabaint, rab, obasa, obasb, fbasa, &
364 446 : .TRUE., lri_env%debug, lrii%dmax_aba)
365 446 : DEALLOCATE (dummy2)
366 : END IF
367 : !*** (a,b,fb)
368 446 : IF (ALLOCATED(lridint%dabbint)) THEN
369 2230 : ALLOCATE (dummy2(nba, nbb, nfb))
370 : CALL int_overlap_abb_os(dummy2, lridint%dabbint, rab, obasa, obasb, fbasb, &
371 446 : .TRUE., lri_env%debug, lrii%dmax_abb)
372 446 : DEALLOCATE (dummy2)
373 : END IF
374 : END IF
375 : END IF
376 : END IF
377 :
378 13172 : END SUBROUTINE lri_dint2
379 :
380 : ! **************************************************************************************************
381 : !> \brief calculates the lri intergrals according to the Obara-Saika (OS)
382 : !> scheme
383 : !> \param lri_env ...
384 : !> \param lrii ...
385 : !> \param rab distance vector
386 : !> \param obasa orb basis on center A
387 : !> \param obasb orb basis on center B
388 : !> \param fbasa aux basis on center A
389 : !> \param fbasb aux basis on center B
390 : !> \param iatom index atom A
391 : !> \param jatom index atom B
392 : !> \param ikind kind atom A
393 : !> \param calculate_forces ...
394 : ! **************************************************************************************************
395 0 : SUBROUTINE lri_int_os(lri_env, lrii, rab, obasa, obasb, fbasa, fbasb, &
396 : iatom, jatom, ikind, calculate_forces)
397 :
398 : TYPE(lri_environment_type), POINTER :: lri_env
399 : TYPE(lri_int_type), POINTER :: lrii
400 : REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rab
401 : TYPE(gto_basis_set_type), POINTER :: obasa, obasb, fbasa, fbasb
402 : INTEGER, INTENT(IN) :: iatom, jatom, ikind
403 : LOGICAL, INTENT(IN) :: calculate_forces
404 :
405 : CHARACTER(LEN=*), PARAMETER :: routineN = 'lri_int_os'
406 :
407 : INTEGER :: handle, nba, nbb, nfa, nfb
408 : LOGICAL :: do_force
409 : REAL(KIND=dp) :: dab
410 :
411 0 : CALL timeset(routineN, handle)
412 :
413 0 : dab = SQRT(SUM(rab*rab))
414 0 : nba = obasa%nsgf
415 0 : nbb = obasb%nsgf
416 0 : nfa = fbasa%nsgf
417 0 : nfb = fbasb%nsgf
418 :
419 : !*** calculate overlap integrals; for iatom=jatom this is the self-overlap
420 0 : IF (iatom == jatom .AND. dab < lri_env%delta) THEN
421 : !*** (fa,fa)
422 0 : lrii%sab(1:nfa, 1:nfa) = lri_env%bas_prop(ikind)%ri_ovlp(1:nfa, 1:nfa)
423 : !*** (a,a)
424 0 : lrii%soo(1:nba, 1:nba) = lri_env%bas_prop(ikind)%orb_ovlp(1:nba, 1:nba)
425 : !*** (a,a,fa)
426 : CALL int_overlap_aba_os(lrii%abaint, rab=rab, oba=obasa, obb=obasb, &
427 : fba=fbasa, calculate_forces=.FALSE., debug=lri_env%debug, &
428 0 : dmax=lrii%dmax_aba)
429 0 : IF (calculate_forces) THEN
430 0 : lrii%dsab = 0._dp
431 0 : lrii%dsoo = 0._dp
432 0 : lrii%dabdaint = 0.0_dp
433 0 : lrii%dabbint = 0.0_dp
434 : END IF
435 : ELSE
436 0 : IF (calculate_forces) THEN
437 0 : do_force = lrii%calc_force_pair
438 : ELSE
439 0 : do_force = .FALSE.
440 : END IF
441 : !*** (fa,fb)
442 : CALL int_overlap_ab_os(lrii%sab, lrii%dsab, rab, fbasa, fbasb, &
443 0 : do_force, lri_env%debug, lrii%dmax_ab)
444 : !*** (a,b)
445 : CALL int_overlap_ab_os(lrii%soo, lrii%dsoo, rab, obasa, obasb, &
446 0 : do_force, lri_env%debug, lrii%dmax_oo)
447 : !*** (a,b,fa)
448 : CALL int_overlap_aba_os(lrii%abaint, lrii%dabdaint, rab, obasa, obasb, fbasa, &
449 0 : do_force, lri_env%debug, lrii%dmax_aba)
450 : !*** (a,b,fb)
451 : CALL int_overlap_abb_os(lrii%abbint, lrii%dabbint, rab, obasa, obasb, fbasb, &
452 0 : do_force, lri_env%debug, lrii%dmax_abb)
453 : END IF
454 :
455 0 : CALL timestop(handle)
456 :
457 0 : END SUBROUTINE lri_int_os
458 :
459 : ! **************************************************************************************************
460 : !> \brief calcuates the lri integrals using solid harmonic Gaussians
461 : !> \param lri_env ...
462 : !> \param lrii ...
463 : !> \param rab distance vector
464 : !> \param obasa orb basis on A
465 : !> \param obasb orb basis on B
466 : !> \param fbasa aux basis on A
467 : !> \param fbasb aux basis on B
468 : !> \param iatom index atom A
469 : !> \param jatom index atom B
470 : !> \param ikind kind atom A
471 : !> \param jkind kind atom B
472 : !> \param calculate_forces ...
473 : ! **************************************************************************************************
474 0 : SUBROUTINE lri_int_shg(lri_env, lrii, rab, obasa, obasb, fbasa, fbasb, &
475 : iatom, jatom, ikind, jkind, calculate_forces)
476 :
477 : TYPE(lri_environment_type), POINTER :: lri_env
478 : TYPE(lri_int_type), POINTER :: lrii
479 : REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rab
480 : TYPE(gto_basis_set_type), POINTER :: obasa, obasb, fbasa, fbasb
481 : INTEGER, INTENT(IN) :: iatom, jatom, ikind, jkind
482 : LOGICAL, INTENT(IN) :: calculate_forces
483 :
484 : CHARACTER(LEN=*), PARAMETER :: routineN = 'lri_int_shg'
485 :
486 : INTEGER :: handle, nba, nbb, nfa, nfb
487 0 : INTEGER, DIMENSION(:, :, :), POINTER :: fba_index, fbb_index, oba_index, &
488 0 : obb_index
489 : LOGICAL :: do_force
490 : REAL(KIND=dp) :: dab
491 0 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: Waux_mat
492 0 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :, :) :: dWaux_mat
493 0 : REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: scon_fba, scon_fbb, scon_oba, scon_obb
494 0 : REAL(KIND=dp), DIMENSION(:, :, :, :), POINTER :: scona_mix, sconb_mix
495 :
496 0 : CALL timeset(routineN, handle)
497 0 : NULLIFY (scon_oba, scon_obb, scon_fba, scon_fbb, scona_mix, sconb_mix, &
498 0 : oba_index, obb_index, fba_index, fbb_index)
499 0 : dab = SQRT(SUM(rab*rab))
500 0 : nba = obasa%nsgf
501 0 : nbb = obasb%nsgf
502 0 : nfa = fbasa%nsgf
503 0 : nfb = fbasb%nsgf
504 :
505 : !*** calculate overlap integrals; for iatom=jatom this is the self-overlap
506 0 : IF (iatom == jatom .AND. dab < lri_env%delta) THEN
507 : !*** (fa,fa)
508 0 : lrii%sab(1:nfa, 1:nfa) = lri_env%bas_prop(ikind)%ri_ovlp(1:nfa, 1:nfa)
509 : !*** (a,a)
510 0 : lrii%soo(1:nba, 1:nba) = lri_env%bas_prop(ikind)%orb_ovlp(1:nba, 1:nba)
511 : !*** (a,a,fa)
512 0 : lrii%abaint(1:nba, 1:nba, 1:nfa) = lri_env%bas_prop(ikind)%ovlp3
513 0 : IF (calculate_forces) THEN
514 0 : lrii%dsab = 0._dp
515 0 : lrii%dsoo = 0._dp
516 0 : lrii%dabdaint = 0.0_dp
517 0 : lrii%dabbint = 0.0_dp
518 : END IF
519 : ELSE
520 0 : IF (calculate_forces) THEN
521 0 : do_force = lrii%calc_force_pair
522 : ELSE
523 0 : do_force = .FALSE.
524 : END IF
525 0 : scon_oba => lri_env%bas_prop(ikind)%scon_orb
526 0 : scon_obb => lri_env%bas_prop(jkind)%scon_orb
527 0 : scon_fba => lri_env%bas_prop(ikind)%scon_ri
528 0 : scon_fbb => lri_env%bas_prop(jkind)%scon_ri
529 0 : scona_mix => lri_env%bas_prop(ikind)%scon_mix
530 0 : sconb_mix => lri_env%bas_prop(jkind)%scon_mix
531 0 : oba_index => lri_env%bas_prop(ikind)%orb_index
532 0 : fba_index => lri_env%bas_prop(ikind)%ri_index
533 0 : obb_index => lri_env%bas_prop(jkind)%orb_index
534 0 : fbb_index => lri_env%bas_prop(jkind)%ri_index
535 : CALL lri_precalc_angular_shg_part(obasa, obasb, fbasa, fbasb, rab, Waux_mat, dWaux_mat, &
536 : do_force)
537 : !*** (fa,fb)
538 : CALL int_overlap_ab_shg_low(lrii%sab, lrii%dsab, rab, fbasa, fbasb, scon_fba, scon_fbb, &
539 0 : Waux_mat, dWaux_mat, .TRUE., do_force, contraction_high=.FALSE.)
540 : !*** (a,b)
541 : CALL int_overlap_ab_shg_low(lrii%soo, lrii%dsoo, rab, obasa, obasb, scon_oba, scon_obb, &
542 0 : Waux_mat, dWaux_mat, .TRUE., do_force, contraction_high=.TRUE.)
543 : !*** (a,b,fa)
544 : CALL int_overlap_aba_shg_low(lrii%abaint, lrii%dabdaint, rab, obasa, obasb, fbasa, &
545 : scon_obb, scona_mix, oba_index, fba_index, &
546 : lri_env%cg_shg%cg_coeff, lri_env%cg_shg%cg_none0_list, &
547 : lri_env%cg_shg%ncg_none0, &
548 0 : Waux_mat, dWaux_mat, .TRUE., do_force)
549 : !*** (a,b,fb)
550 0 : IF (ikind == jkind) THEN
551 : CALL get_abb_same_kind(lrii%abbint, lrii%dabbint, lrii%abaint, lrii%dabdaint, &
552 0 : rab, obasa, fbasa, .TRUE., do_force)
553 : ELSE
554 : CALL int_overlap_abb_shg_low(lrii%abbint, lrii%dabbint, rab, obasa, obasb, fbasb, &
555 : scon_oba, sconb_mix, obb_index, fbb_index, &
556 : lri_env%cg_shg%cg_coeff, lri_env%cg_shg%cg_none0_list, &
557 : lri_env%cg_shg%ncg_none0, &
558 0 : Waux_mat, dWaux_mat, .TRUE., do_force)
559 : END IF
560 :
561 0 : DEALLOCATE (Waux_mat, dWaux_mat)
562 : END IF
563 :
564 0 : CALL timestop(handle)
565 :
566 0 : END SUBROUTINE lri_int_shg
567 :
568 : ! **************************************************************************************************
569 : !> \brief ...
570 : !> \param lriint ...
571 : !> \param lridint ...
572 : !> \param nba ...
573 : !> \param nbb ...
574 : !> \param nfa ...
575 : !> \param nfb ...
576 : !> \param skip_sab ...
577 : !> \param skip_soo ...
578 : !> \param skip_aba ...
579 : !> \param skip_abb ...
580 : !> \param skip_dsab ...
581 : !> \param skip_dsoo ...
582 : !> \param skip_daba ...
583 : !> \param skip_dabb ...
584 : ! **************************************************************************************************
585 16000 : SUBROUTINE allocate_int_type(lriint, lridint, nba, nbb, nfa, nfb, &
586 : skip_sab, skip_soo, skip_aba, skip_abb, &
587 : skip_dsab, skip_dsoo, skip_daba, skip_dabb)
588 :
589 : TYPE(int_type), INTENT(INOUT), OPTIONAL :: lriint
590 : TYPE(dint_type), INTENT(INOUT), OPTIONAL :: lridint
591 : INTEGER, INTENT(IN) :: nba, nbb, nfa, nfb
592 : LOGICAL, INTENT(IN), OPTIONAL :: skip_sab, skip_soo, skip_aba, skip_abb, &
593 : skip_dsab, skip_dsoo, skip_daba, &
594 : skip_dabb
595 :
596 : LOGICAL :: do_aba, do_abb, do_daba, do_dabb, &
597 : do_dsab, do_dsoo, do_sab, do_soo
598 :
599 16000 : IF (PRESENT(lriint)) THEN
600 9414 : do_sab = .TRUE.
601 9414 : IF (PRESENT(skip_sab)) do_sab = .NOT. skip_sab
602 9414 : do_soo = .TRUE.
603 9414 : IF (PRESENT(skip_soo)) do_soo = .NOT. skip_soo
604 9414 : do_aba = .TRUE.
605 9414 : IF (PRESENT(skip_aba)) do_aba = .NOT. skip_aba
606 9414 : do_abb = .TRUE.
607 9414 : IF (PRESENT(skip_abb)) do_abb = .NOT. skip_abb
608 : !
609 9414 : IF (do_sab) THEN
610 2126 : IF (ALLOCATED(lriint%sabint)) DEALLOCATE (lriint%sabint)
611 8504 : ALLOCATE (lriint%sabint(nfa, nfb))
612 11684512 : lriint%sabint = 0.0_dp
613 : END IF
614 9414 : IF (do_soo) THEN
615 9414 : IF (ALLOCATED(lriint%sooint)) DEALLOCATE (lriint%sooint)
616 37656 : ALLOCATE (lriint%sooint(nba, nbb))
617 1480901 : lriint%sooint = 0.0_dp
618 : END IF
619 9414 : IF (do_aba) THEN
620 9414 : IF (ALLOCATED(lriint%abaint)) DEALLOCATE (lriint%abaint)
621 47070 : ALLOCATE (lriint%abaint(nba, nbb, nfa))
622 114627218 : lriint%abaint = 0.0_dp
623 : END IF
624 9414 : IF (do_abb) THEN
625 9414 : IF (ALLOCATED(lriint%abbint)) DEALLOCATE (lriint%abbint)
626 47070 : ALLOCATE (lriint%abbint(nba, nbb, nfb))
627 114858301 : lriint%abbint = 0.0_dp
628 : END IF
629 : END IF
630 : !
631 16000 : IF (PRESENT(lridint)) THEN
632 6586 : do_dsab = .TRUE.
633 6586 : IF (PRESENT(skip_dsab)) do_dsab = .NOT. skip_dsab
634 6586 : do_dsoo = .TRUE.
635 6586 : IF (PRESENT(skip_dsoo)) do_dsoo = .NOT. skip_dsoo
636 6586 : do_daba = .TRUE.
637 6586 : IF (PRESENT(skip_daba)) do_daba = .NOT. skip_daba
638 6586 : do_dabb = .TRUE.
639 6586 : IF (PRESENT(skip_dabb)) do_dabb = .NOT. skip_dabb
640 : !
641 6586 : IF (do_dsab) THEN
642 1210 : IF (ALLOCATED(lridint%dsabint)) DEALLOCATE (lridint%dsabint)
643 6050 : ALLOCATE (lridint%dsabint(nfa, nfb, 3))
644 14103661 : lridint%dsabint = 0.0_dp
645 : END IF
646 6586 : IF (do_dsoo) THEN
647 6586 : IF (ALLOCATED(lridint%dsooint)) DEALLOCATE (lridint%dsooint)
648 32930 : ALLOCATE (lridint%dsooint(nba, nbb, 3))
649 3410512 : lridint%dsooint = 0.0_dp
650 : END IF
651 6586 : IF (do_daba) THEN
652 6586 : IF (ALLOCATED(lridint%dabaint)) DEALLOCATE (lridint%dabaint)
653 39516 : ALLOCATE (lridint%dabaint(nba, nbb, nfa, 3))
654 254242525 : lridint%dabaint = 0.0_dp
655 : END IF
656 6586 : IF (do_dabb) THEN
657 6586 : IF (ALLOCATED(lridint%dabbint)) DEALLOCATE (lridint%dabbint)
658 39516 : ALLOCATE (lridint%dabbint(nba, nbb, nfb, 3))
659 254272045 : lridint%dabbint = 0.0_dp
660 : END IF
661 : END IF
662 :
663 16000 : END SUBROUTINE allocate_int_type
664 :
665 : ! **************************************************************************************************
666 : !> \brief ...
667 : !> \param lriint ...
668 : !> \param lridint ...
669 : ! **************************************************************************************************
670 16000 : SUBROUTINE deallocate_int_type(lriint, lridint)
671 :
672 : TYPE(int_type), INTENT(INOUT), OPTIONAL :: lriint
673 : TYPE(dint_type), INTENT(INOUT), OPTIONAL :: lridint
674 :
675 16000 : IF (PRESENT(lriint)) THEN
676 9414 : IF (ALLOCATED(lriint%sabint)) DEALLOCATE (lriint%sabint)
677 9414 : IF (ALLOCATED(lriint%sooint)) DEALLOCATE (lriint%sooint)
678 9414 : IF (ALLOCATED(lriint%abaint)) DEALLOCATE (lriint%abaint)
679 9414 : IF (ALLOCATED(lriint%abbint)) DEALLOCATE (lriint%abbint)
680 : END IF
681 : !
682 16000 : IF (PRESENT(lridint)) THEN
683 6586 : IF (ALLOCATED(lridint%dsabint)) DEALLOCATE (lridint%dsabint)
684 6586 : IF (ALLOCATED(lridint%dsooint)) DEALLOCATE (lridint%dsooint)
685 6586 : IF (ALLOCATED(lridint%dabaint)) DEALLOCATE (lridint%dabaint)
686 6586 : IF (ALLOCATED(lridint%dabbint)) DEALLOCATE (lridint%dabbint)
687 : END IF
688 :
689 16000 : END SUBROUTINE deallocate_int_type
690 :
691 0 : END MODULE lri_integrals
|