(git:6344619)
Loading...
Searching...
No Matches
generic_shg_integrals_init.F
Go to the documentation of this file.
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 Initialization for solid harmonic Gaussian (SHG) integral scheme. Scheme for calculation
10!> of contracted, spherical Gaussian integrals using the solid harmonics. Initialization of
11!> the contraction matrices
12!> \par History
13!> created [08.2016]
14!> \author Dorothea Golze
15! **************************************************************************************************
18 USE kinds, ONLY: dp
19 USE mathconstants, ONLY: fac,&
20 ifac,&
21 pi
22#include "../base/base_uses.f90"
23
24 IMPLICIT NONE
25
26 PRIVATE
27
28 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'generic_shg_integrals_init'
29
31
32! **************************************************************************************************
33
34CONTAINS
35
36! **************************************************************************************************
37!> \brief contraction matrix for SHG integrals
38!> \param basis ...
39!> \param scon_shg contraction matrix
40! **************************************************************************************************
41 SUBROUTINE contraction_matrix_shg(basis, scon_shg)
42
43 TYPE(gto_basis_set_type), POINTER :: basis
44 REAL(kind=dp), DIMENSION(:, :, :), POINTER :: scon_shg
45
46 INTEGER :: ipgf, iset, ishell, l, maxpgf, maxshell, &
47 nset
48 INTEGER, DIMENSION(:), POINTER :: npgf, nshell
49 REAL(kind=dp) :: aif, gcc
50 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: norm
51 REAL(kind=dp), DIMENSION(:, :), POINTER :: zet
52
53 nset = basis%nset
54 npgf => basis%npgf
55 nshell => basis%nshell
56 zet => basis%zet
57
58 maxpgf = SIZE(basis%gcc, 1)
59 maxshell = SIZE(basis%gcc, 2)
60 ALLOCATE (norm(basis%nset, maxshell))
61 ALLOCATE (scon_shg(maxpgf, maxshell, nset))
62 scon_shg = 0.0_dp
63
64 CALL basis_norm_shg(basis, norm)
65
66 DO iset = 1, nset
67 DO ishell = 1, nshell(iset)
68 l = basis%l(ishell, iset)
69 DO ipgf = 1, npgf(iset)
70 aif = 1.0_dp/((2._dp*zet(ipgf, iset))**l)
71 gcc = basis%gcc(ipgf, ishell, iset)
72 scon_shg(ipgf, ishell, iset) = norm(iset, ishell)*gcc*aif
73 END DO
74 END DO
75 END DO
76
77 DEALLOCATE (norm)
78
79 END SUBROUTINE contraction_matrix_shg
80
81!***************************************************************************************************
82!> \brief normalization solid harmonic Gaussians (SHG)
83!> \param basis ...
84!> \param norm ...
85! **************************************************************************************************
86 SUBROUTINE basis_norm_shg(basis, norm)
87
88 TYPE(gto_basis_set_type), POINTER :: basis
89 REAL(dp), DIMENSION(:, :), INTENT(INOUT) :: norm
90
91 INTEGER :: ipgf, iset, ishell, jpgf, l
92 REAL(kind=dp) :: aai, aaj, cci, ccj, expa, ppl
93
94 norm = 0._dp
95
96 DO iset = 1, basis%nset
97 DO ishell = 1, basis%nshell(iset)
98 l = basis%l(ishell, iset)
99 expa = 0.5_dp*real(2*l + 3, dp)
100 ppl = fac(2*l + 2)*pi**(1.5_dp)/fac(l + 1)
101 ppl = ppl/(2._dp**real(2*l + 1, dp))
102 ppl = ppl/real(2*l + 1, dp)
103 DO ipgf = 1, basis%npgf(iset)
104 cci = basis%gcc(ipgf, ishell, iset)
105 aai = basis%zet(ipgf, iset)
106 DO jpgf = 1, basis%npgf(iset)
107 ccj = basis%gcc(jpgf, ishell, iset)
108 aaj = basis%zet(jpgf, iset)
109 norm(iset, ishell) = norm(iset, ishell) + cci*ccj*ppl/(aai + aaj)**expa
110 END DO
111 END DO
112 norm(iset, ishell) = 1.0_dp/sqrt(norm(iset, ishell))
113 END DO
114 END DO
115
116 END SUBROUTINE basis_norm_shg
117
118! **************************************************************************************************
119!> \brief mixed contraction matrix for SHG integrals [aba] and [abb] for orbital and ri basis
120!> at the same atom
121!> \param orb_basis orbital basis
122!> \param ri_basis ...
123!> \param orb_index index for orbital basis
124!> \param ri_index index for ri basis
125!> \param scon_mix mixed contraction matrix
126! **************************************************************************************************
127 SUBROUTINE contraction_matrix_shg_mix(orb_basis, ri_basis, orb_index, ri_index, scon_mix)
128
129 TYPE(gto_basis_set_type), POINTER :: orb_basis, ri_basis
130 INTEGER, DIMENSION(:, :, :), POINTER :: orb_index, ri_index
131 REAL(kind=dp), DIMENSION(:, :, :, :), POINTER :: scon_mix
132
133 INTEGER :: forb, fri, iil, il, ipgf, iset, ishell, jpgf, jset, jshell, l, l1, l2, lmax_orb, &
134 lmax_ri, maxpgf_orb, maxpgf_ri, maxshell_orb, maxshell_ri, nf_orb, nf_ri, nl, nl_max, &
135 nset_orb, nset_ri
136 INTEGER, DIMENSION(:), POINTER :: npgf_orb, npgf_ri, nshell_orb, nshell_ri
137 REAL(kind=dp) :: cjf, const, const1, const2, gcc_orb, &
138 gcc_ri, prefac, scon1, scon2, zet
139 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: shg_fac
140 REAL(kind=dp), DIMENSION(:, :), POINTER :: norm_orb, norm_ri, zet_orb, zet_ri
141
142 nset_orb = orb_basis%nset
143 npgf_orb => orb_basis%npgf
144 nshell_orb => orb_basis%nshell
145 zet_orb => orb_basis%zet
146 nset_ri = ri_basis%nset
147 npgf_ri => ri_basis%npgf
148 nshell_ri => ri_basis%nshell
149 zet_ri => ri_basis%zet
150
151 maxpgf_orb = SIZE(orb_basis%gcc, 1)
152 maxshell_orb = SIZE(orb_basis%gcc, 2)
153 ALLOCATE (norm_orb(nset_orb, maxshell_orb))
154 maxpgf_ri = SIZE(ri_basis%gcc, 1)
155 maxshell_ri = SIZE(ri_basis%gcc, 2)
156 ALLOCATE (norm_ri(nset_ri, maxshell_ri))
157
158 CALL basis_norm_shg(orb_basis, norm_orb)
159 CALL basis_norm_shg(ri_basis, norm_ri)
160
161 ALLOCATE (orb_index(maxpgf_orb, maxshell_orb, nset_orb))
162 ALLOCATE (ri_index(maxpgf_ri, maxshell_ri, nset_ri))
163
164 !** index orbital basis set
165 nf_orb = 0
166 DO iset = 1, nset_orb
167 DO ishell = 1, nshell_orb(iset)
168 DO ipgf = 1, npgf_orb(iset)
169 nf_orb = nf_orb + 1
170 orb_index(ipgf, ishell, iset) = nf_orb
171 END DO
172 END DO
173 END DO
174
175 !** index ri basis set
176 nf_ri = 0
177 DO iset = 1, nset_ri
178 DO ishell = 1, nshell_ri(iset)
179 DO ipgf = 1, npgf_ri(iset)
180 nf_ri = nf_ri + 1
181 ri_index(ipgf, ishell, iset) = nf_ri
182 END DO
183 END DO
184 END DO
185
186 lmax_orb = maxval(orb_basis%lmax)
187 lmax_ri = maxval(ri_basis%lmax)
188 nl_max = int((lmax_orb + lmax_ri)/2) + 1
189 ALLOCATE (scon_mix(nl_max, nf_ri, nf_orb, nl_max))
190 scon_mix = 0.0_dp
191
192 ALLOCATE (shg_fac(0:nl_max - 1))
193 shg_fac(0) = 1.0_dp
194
195 DO iset = 1, nset_orb
196 DO ishell = 1, nshell_orb(iset)
197 l1 = orb_basis%l(ishell, iset)
198 const1 = sqrt(1.0_dp/real(2*l1 + 1, dp))
199 DO jset = 1, nset_ri
200 DO jshell = 1, nshell_ri(jset)
201 l2 = ri_basis%l(jshell, jset)
202 const2 = sqrt(1.0_dp/real(2*l2 + 1, dp))
203 nl = int((l1 + l2)/2)
204 IF (l1 == 0 .OR. l2 == 0) nl = 0
205 DO il = 0, nl
206 l = l1 + l2 - 2*il
207 const = const1*const2*2.0_dp*sqrt(pi*real(2*l + 1, dp))
208 DO iil = 1, il
209 shg_fac(iil) = fac(l + iil - 1)*ifac(l)*real(l, dp) &
210 *fac(il)/fac(il - iil)/fac(iil)
211 END DO
212 DO ipgf = 1, npgf_orb(iset)
213 forb = orb_index(ipgf, ishell, iset)
214 gcc_orb = orb_basis%gcc(ipgf, ishell, iset)
215 scon1 = norm_orb(iset, ishell)*gcc_orb
216 DO jpgf = 1, npgf_ri(jset)
217 fri = ri_index(jpgf, jshell, jset)
218 gcc_ri = ri_basis%gcc(jpgf, jshell, jset)
219 scon2 = norm_ri(jset, jshell)*gcc_ri
220 zet = zet_orb(ipgf, iset) + zet_ri(jpgf, jset)
221 cjf = 1.0_dp/((2._dp*zet)**l)
222 prefac = const*cjf*scon1*scon2
223 DO iil = 0, il
224 scon_mix(iil + 1, fri, forb, il + 1) = prefac*shg_fac(iil)/zet**iil
225 END DO
226 END DO
227 END DO
228 END DO
229 END DO
230 END DO
231 END DO
232 END DO
233
234 DEALLOCATE (norm_orb, norm_ri, shg_fac)
235
236 END SUBROUTINE contraction_matrix_shg_mix
237
238! **************************************************************************************************
239!> \brief ...
240!> \param basis ...
241!> \param m ...
242!> \param scon_shg ...
243!> \param scon_rx2m ...
244! **************************************************************************************************
245 SUBROUTINE contraction_matrix_shg_rx2m(basis, m, scon_shg, scon_rx2m)
246
247 TYPE(gto_basis_set_type), POINTER :: basis
248 INTEGER, INTENT(IN) :: m
249 REAL(kind=dp), DIMENSION(:, :, :), INTENT(IN) :: scon_shg
250 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :, :) :: scon_rx2m
251
252 INTEGER :: ipgf, iset, ishell, j, l, maxpgf, &
253 maxshell, nset
254 INTEGER, DIMENSION(:), POINTER :: npgf, nshell
255 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: shg_fac
256 REAL(kind=dp), DIMENSION(:, :), POINTER :: zet
257
258 npgf => basis%npgf
259 nshell => basis%nshell
260 zet => basis%zet
261 nset = basis%nset
262
263 maxpgf = SIZE(basis%gcc, 1)
264 maxshell = SIZE(basis%gcc, 2)
265 ALLOCATE (scon_rx2m(maxpgf, m + 1, maxshell, nset))
266 scon_rx2m = 0.0_dp
267 ALLOCATE (shg_fac(0:m))
268 shg_fac(0) = 1.0_dp
269
270 DO iset = 1, nset
271 DO ishell = 1, nshell(iset)
272 l = basis%l(ishell, iset)
273 DO j = 1, m
274 shg_fac(j) = fac(l + j - 1)*ifac(l)*real(l, dp) &
275 *fac(m)/fac(m - j)/fac(j)
276 END DO
277 DO ipgf = 1, npgf(iset)
278 DO j = 0, m
279 scon_rx2m(ipgf, j + 1, ishell, iset) = scon_shg(ipgf, ishell, iset) &
280 *shg_fac(j)/zet(ipgf, iset)**j
281 END DO
282 END DO
283 END DO
284 END DO
285
286 DEALLOCATE (shg_fac)
287
288 END SUBROUTINE contraction_matrix_shg_rx2m
289
Initialization for solid harmonic Gaussian (SHG) integral scheme. Scheme for calculation of contracte...
subroutine, public contraction_matrix_shg_rx2m(basis, m, scon_shg, scon_rx2m)
...
subroutine, public contraction_matrix_shg_mix(orb_basis, ri_basis, orb_index, ri_index, scon_mix)
mixed contraction matrix for SHG integrals [aba] and [abb] for orbital and ri basis at the same atom
subroutine, public contraction_matrix_shg(basis, scon_shg)
contraction matrix for SHG integrals
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
real(kind=dp), dimension(0:maxfac), parameter, public ifac
real(kind=dp), dimension(0:maxfac), parameter, public fac