(git:374b731)
Loading...
Searching...
No Matches
lri_environment_init.F
Go to the documentation of this file.
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 initializes the environment for lri
10!> lri : local resolution of the identity
11!> \par History
12!> created [06.2015]
13!> \author Dorothea Golze
14! **************************************************************************************************
16 USE ao_util, ONLY: exp_radius
21 USE bibliography, ONLY: golze2017a,&
23 cite_reference
31 USE kinds, ONLY: dp
35 USE mathconstants, ONLY: fac,&
36 pi,&
37 rootpi
38 USE mathlib, ONLY: invert_matrix
41 USE qs_kind_types, ONLY: get_qs_kind,&
43#include "./base/base_uses.f90"
44
45 IMPLICIT NONE
46
47 PRIVATE
48
49! **************************************************************************************************
50
51 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'lri_environment_init'
52
54
55! **************************************************************************************************
56
57CONTAINS
58
59! **************************************************************************************************
60!> \brief initializes the lri env
61!> \param lri_env ...
62!> \param lri_section ...
63! **************************************************************************************************
64 SUBROUTINE lri_env_init(lri_env, lri_section)
65
66 TYPE(lri_environment_type), POINTER :: lri_env
67 TYPE(section_vals_type), POINTER :: lri_section
68
69 REAL(kind=dp), DIMENSION(:), POINTER :: radii
70
71 NULLIFY (lri_env)
72 ALLOCATE (lri_env)
73 CALL lri_env_create(lri_env)
74
75 ! init keywords
76 ! use RI for local pp terms
77 CALL section_vals_val_get(lri_section, "RI_STATISTIC", &
78 l_val=lri_env%statistics)
79 ! use exact one-center terms
80 CALL section_vals_val_get(lri_section, "EXACT_1C_TERMS", &
81 l_val=lri_env%exact_1c_terms)
82 ! use RI for local pp terms
83 CALL section_vals_val_get(lri_section, "PPL_RI", &
84 l_val=lri_env%ppl_ri)
85 ! check for debug (OS scheme)
86 CALL section_vals_val_get(lri_section, "DEBUG_LRI_INTEGRALS", &
87 l_val=lri_env%debug)
88 ! integrals based on solid harmonic Gaussians
89 CALL section_vals_val_get(lri_section, "SHG_LRI_INTEGRALS", &
90 l_val=lri_env%use_shg_integrals)
91 ! how to calculate inverse/pseuodinverse of overlap
92 CALL section_vals_val_get(lri_section, "LRI_OVERLAP_MATRIX", &
93 i_val=lri_env%lri_overlap_inv)
94 CALL section_vals_val_get(lri_section, "MAX_CONDITION_NUM", &
95 r_val=lri_env%cond_max)
96 ! integrals threshold (aba, abb)
97 CALL section_vals_val_get(lri_section, "EPS_O3_INT", &
98 r_val=lri_env%eps_o3_int)
99 ! RI SINV
100 CALL section_vals_val_get(lri_section, "RI_SINV", &
101 c_val=lri_env%ri_sinv_app)
102 ! Distant Pair Approximation
103 CALL section_vals_val_get(lri_section, "DISTANT_PAIR_APPROXIMATION", &
104 l_val=lri_env%distant_pair_approximation)
105 CALL section_vals_val_get(lri_section, "DISTANT_PAIR_METHOD", &
106 c_val=lri_env%distant_pair_method)
107 CALL section_vals_val_get(lri_section, "DISTANT_PAIR_RADII", r_vals=radii)
108 cpassert(SIZE(radii) == 2)
109 cpassert(radii(2) > radii(1))
110 cpassert(radii(1) > 0.0_dp)
111 lri_env%r_in = radii(1)
112 lri_env%r_out = radii(2)
113
114 CALL cite_reference(golze2017b)
115 IF (lri_env%use_shg_integrals) CALL cite_reference(golze2017a)
116
117 END SUBROUTINE lri_env_init
118! **************************************************************************************************
119!> \brief initializes the lri env
120!> \param ri_type ...
121!> \param qs_env ...
122!> \param lri_env ...
123!> \param qs_kind_set ...
124! **************************************************************************************************
125 SUBROUTINE lri_env_basis(ri_type, qs_env, lri_env, qs_kind_set)
126
127 CHARACTER(len=*), INTENT(IN) :: ri_type
128 TYPE(qs_environment_type), POINTER :: qs_env
129 TYPE(lri_environment_type), POINTER :: lri_env
130 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
131
132 INTEGER :: i, i1, i2, iat, ikind, ip, ipgf, iset, ishell, jp, l, lmax_ikind_orb, &
133 lmax_ikind_ri, maxl_orb, maxl_ri, n1, n2, natom, nbas, nkind, nribas, nspin
134 INTEGER, ALLOCATABLE, DIMENSION(:) :: kind_of
135 REAL(kind=dp) :: gcc, rad, rai, raj, xradius, zeta
136 REAL(kind=dp), DIMENSION(:), POINTER :: int_aux, norm
137 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
138 TYPE(dft_control_type), POINTER :: dft_control
139 TYPE(gto_basis_set_type), POINTER :: orb_basis_set, ri_basis_set
140
141 ! initialize the basic basis sets (orb and ri)
142 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set)
143 nkind = SIZE(atomic_kind_set)
144 ALLOCATE (lri_env%orb_basis(nkind), lri_env%ri_basis(nkind))
145 maxl_orb = 0
146 maxl_ri = 0
147 DO ikind = 1, nkind
148 NULLIFY (orb_basis_set, ri_basis_set)
149 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set, basis_type="ORB")
150 IF (ri_type == "LRI") THEN
151 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis_set, basis_type="LRI_AUX")
152 ELSE IF (ri_type == "P_LRI") THEN
153 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis_set, basis_type="P_LRI_AUX")
154 ELSE IF (ri_type == "RI") THEN
155 CALL get_qs_kind(qs_kind_set(ikind), basis_set=ri_basis_set, basis_type="RI_HXC")
156 ELSE
157 cpabort('ri_type')
158 END IF
159 NULLIFY (lri_env%orb_basis(ikind)%gto_basis_set)
160 NULLIFY (lri_env%ri_basis(ikind)%gto_basis_set)
161 IF (ASSOCIATED(orb_basis_set)) THEN
162 CALL copy_gto_basis_set(orb_basis_set, lri_env%orb_basis(ikind)%gto_basis_set)
163 CALL copy_gto_basis_set(ri_basis_set, lri_env%ri_basis(ikind)%gto_basis_set)
164 END IF
165 lmax_ikind_orb = maxval(lri_env%orb_basis(ikind)%gto_basis_set%lmax)
166 lmax_ikind_ri = maxval(lri_env%ri_basis(ikind)%gto_basis_set%lmax)
167 maxl_orb = max(maxl_orb, lmax_ikind_orb)
168 maxl_ri = max(maxl_ri, lmax_ikind_ri)
169 END DO
170
171 IF ((ri_type == "LRI") .OR. (ri_type == "P_LRI")) THEN
172 ! CG coefficients needed for lri integrals
173 IF (ASSOCIATED(lri_env%cg_shg)) THEN
174 CALL get_clebsch_gordon_coefficients(lri_env%cg_shg%cg_coeff, &
175 lri_env%cg_shg%cg_none0_list, &
176 lri_env%cg_shg%ncg_none0, &
177 maxl_orb, maxl_ri)
178 END IF
179 CALL lri_basis_init(lri_env)
180 ! distant pair approximation
181 IF (lri_env%distant_pair_approximation) THEN
182 !
183 SELECT CASE (lri_env%distant_pair_method)
184 CASE ("EW")
185 ! equal weight of 0.5
186 CASE ("AW")
187 ALLOCATE (lri_env%aradius(nkind))
188 DO i = 1, nkind
189 orb_basis_set => lri_env%orb_basis(i)%gto_basis_set
190 lri_env%aradius(i) = orb_basis_set%kind_radius
191 END DO
192 CASE ("SW")
193 ALLOCATE (lri_env%wbas(nkind))
194 DO i = 1, nkind
195 orb_basis_set => lri_env%orb_basis(i)%gto_basis_set
196 n1 = orb_basis_set%nsgf
197 ALLOCATE (lri_env%wbas(i)%vec(n1))
198 DO iset = 1, orb_basis_set%nset
199 i1 = orb_basis_set%first_sgf(1, iset)
200 n2 = orb_basis_set%nshell(iset)
201 i2 = orb_basis_set%last_sgf(n2, iset)
202 lri_env%wbas(i)%vec(i1:i2) = orb_basis_set%set_radius(iset)
203 END DO
204 END DO
205 CASE ("LW")
206 ALLOCATE (lri_env%wbas(nkind))
207 DO i = 1, nkind
208 orb_basis_set => lri_env%orb_basis(i)%gto_basis_set
209 n1 = orb_basis_set%nsgf
210 ALLOCATE (lri_env%wbas(i)%vec(n1))
211 DO iset = 1, orb_basis_set%nset
212 DO ishell = 1, orb_basis_set%nshell(iset)
213 i1 = orb_basis_set%first_sgf(ishell, iset)
214 i2 = orb_basis_set%last_sgf(ishell, iset)
215 l = orb_basis_set%l(ishell, iset)
216 xradius = 0.0_dp
217 DO ipgf = 1, orb_basis_set%npgf(iset)
218 gcc = orb_basis_set%gcc(ipgf, ishell, iset)
219 zeta = orb_basis_set%zet(ipgf, iset)
220 rad = exp_radius(l, zeta, 1.e-5_dp, gcc, rlow=xradius)
221 xradius = max(xradius, rad)
222 END DO
223 lri_env%wbas(i)%vec(i1:i2) = xradius
224 END DO
225 END DO
226 END DO
227 CASE DEFAULT
228 cpabort("Unknown DISTANT_PAIR_METHOD in LRI")
229 END SELECT
230 !
231 ALLOCATE (lri_env%wmat(nkind, nkind))
232 SELECT CASE (lri_env%distant_pair_method)
233 CASE ("EW")
234 ! equal weight of 0.5
235 DO i1 = 1, nkind
236 n1 = lri_env%orb_basis(i1)%gto_basis_set%nsgf
237 DO i2 = 1, nkind
238 n2 = lri_env%orb_basis(i2)%gto_basis_set%nsgf
239 ALLOCATE (lri_env%wmat(i1, i2)%mat(n1, n2))
240 lri_env%wmat(i1, i2)%mat(:, :) = 0.5_dp
241 END DO
242 END DO
243 CASE ("AW")
244 DO i1 = 1, nkind
245 n1 = lri_env%orb_basis(i1)%gto_basis_set%nsgf
246 DO i2 = 1, nkind
247 n2 = lri_env%orb_basis(i2)%gto_basis_set%nsgf
248 ALLOCATE (lri_env%wmat(i1, i2)%mat(n1, n2))
249 rai = lri_env%aradius(i1)**2
250 raj = lri_env%aradius(i2)**2
251 IF (raj > rai) THEN
252 lri_env%wmat(i1, i2)%mat(:, :) = 1.0_dp
253 ELSE
254 lri_env%wmat(i1, i2)%mat(:, :) = 0.0_dp
255 END IF
256 END DO
257 END DO
258 CASE ("SW", "LW")
259 DO i1 = 1, nkind
260 n1 = lri_env%orb_basis(i1)%gto_basis_set%nsgf
261 DO i2 = 1, nkind
262 n2 = lri_env%orb_basis(i2)%gto_basis_set%nsgf
263 ALLOCATE (lri_env%wmat(i1, i2)%mat(n1, n2))
264 DO ip = 1, SIZE(lri_env%wbas(i1)%vec)
265 rai = lri_env%wbas(i1)%vec(ip)**2
266 DO jp = 1, SIZE(lri_env%wbas(i2)%vec)
267 raj = lri_env%wbas(i2)%vec(jp)**2
268 IF (raj > rai) THEN
269 lri_env%wmat(i1, i2)%mat(ip, jp) = 1.0_dp
270 ELSE
271 lri_env%wmat(i1, i2)%mat(ip, jp) = 0.0_dp
272 END IF
273 END DO
274 END DO
275 END DO
276 END DO
277 END SELECT
278 END IF
279 ELSE IF (ri_type == "RI") THEN
280 ALLOCATE (lri_env%ri_fit)
281 NULLIFY (lri_env%ri_fit%nvec)
282 NULLIFY (lri_env%ri_fit%bas_ptr)
283 CALL get_qs_env(qs_env=qs_env, natom=natom)
284 ! initialize pointers to RI basis vector
285 ALLOCATE (lri_env%ri_fit%bas_ptr(2, natom))
286 ALLOCATE (kind_of(natom))
287 CALL get_atomic_kind_set(atomic_kind_set, kind_of=kind_of)
288 nbas = 0
289 DO iat = 1, natom
290 ikind = kind_of(iat)
291 nribas = lri_env%ri_basis(ikind)%gto_basis_set%nsgf
292 lri_env%ri_fit%bas_ptr(1, iat) = nbas + 1
293 lri_env%ri_fit%bas_ptr(2, iat) = nbas + nribas
294 nbas = nbas + nribas
295 END DO
296 ! initialize vector t
297 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
298 nspin = dft_control%nspins
299 ALLOCATE (lri_env%ri_fit%tvec(nbas, nspin), lri_env%ri_fit%rm1t(nbas, nspin))
300 ! initialize vector a, expansion of density
301 ALLOCATE (lri_env%ri_fit%avec(nbas, nspin))
302 ! initialize vector fout, R^(-1)*(f-p*n)
303 ALLOCATE (lri_env%ri_fit%fout(nbas, nspin))
304 ! initialize vector with RI basis integrated
305 NULLIFY (norm, int_aux)
306 nbas = lri_env%ri_fit%bas_ptr(2, natom)
307 ALLOCATE (lri_env%ri_fit%nvec(nbas), lri_env%ri_fit%rm1n(nbas))
308 ikind = 0
309 DO iat = 1, natom
310 IF (ikind /= kind_of(iat)) THEN
311 ikind = kind_of(iat)
312 ri_basis_set => lri_env%ri_basis(ikind)%gto_basis_set
313 IF (ASSOCIATED(norm)) DEALLOCATE (norm)
314 IF (ASSOCIATED(int_aux)) DEALLOCATE (int_aux)
315 CALL basis_norm_s_func(ri_basis_set, norm)
316 CALL basis_int(ri_basis_set, int_aux, norm)
317 END IF
318 nbas = SIZE(int_aux)
319 i1 = lri_env%ri_fit%bas_ptr(1, iat)
320 i2 = lri_env%ri_fit%bas_ptr(2, iat)
321 lri_env%ri_fit%nvec(i1:i2) = int_aux(1:nbas)
322 END DO
323 IF (ASSOCIATED(norm)) DEALLOCATE (norm)
324 IF (ASSOCIATED(int_aux)) DEALLOCATE (int_aux)
325 DEALLOCATE (kind_of)
326 ELSE
327 cpabort('ri_type')
328 END IF
329
330 END SUBROUTINE lri_env_basis
331
332! **************************************************************************************************
333!> \brief initializes the lri basis: calculates the norm, self-overlap
334!> and integral of the ri basis
335!> \param lri_env ...
336! **************************************************************************************************
337 SUBROUTINE lri_basis_init(lri_env)
338 TYPE(lri_environment_type), POINTER :: lri_env
339
340 INTEGER :: ikind, nkind
341 INTEGER, DIMENSION(:, :, :), POINTER :: orb_index, ri_index
342 REAL(kind=dp) :: delta
343 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :, :) :: dovlp3
344 REAL(kind=dp), DIMENSION(:), POINTER :: orb_norm_r, ri_int_fbas, ri_norm_r, &
345 ri_norm_s
346 REAL(kind=dp), DIMENSION(:, :), POINTER :: orb_ovlp, ri_ovlp, ri_ovlp_inv
347 REAL(kind=dp), DIMENSION(:, :, :), POINTER :: scon_orb, scon_ri
348 REAL(kind=dp), DIMENSION(:, :, :, :), POINTER :: scon_mix
349 TYPE(gto_basis_set_type), POINTER :: orb_basis, ri_basis
350
351 IF (ASSOCIATED(lri_env)) THEN
352 IF (ASSOCIATED(lri_env%orb_basis)) THEN
353 cpassert(ASSOCIATED(lri_env%ri_basis))
354 nkind = SIZE(lri_env%orb_basis)
355 CALL deallocate_bas_properties(lri_env)
356 ALLOCATE (lri_env%bas_prop(nkind))
357 DO ikind = 1, nkind
358 NULLIFY (orb_basis, ri_basis)
359 orb_basis => lri_env%orb_basis(ikind)%gto_basis_set
360 IF (ASSOCIATED(orb_basis)) THEN
361 ri_basis => lri_env%ri_basis(ikind)%gto_basis_set
362 cpassert(ASSOCIATED(ri_basis))
363 NULLIFY (ri_norm_r)
364 CALL basis_norm_radial(ri_basis, ri_norm_r)
365 NULLIFY (orb_norm_r)
366 CALL basis_norm_radial(orb_basis, orb_norm_r)
367 NULLIFY (ri_norm_s)
368 CALL basis_norm_s_func(ri_basis, ri_norm_s)
369 NULLIFY (ri_int_fbas)
370 CALL basis_int(ri_basis, ri_int_fbas, ri_norm_s)
371 lri_env%bas_prop(ikind)%int_fbas => ri_int_fbas
372 NULLIFY (ri_ovlp)
373 CALL basis_ovlp(ri_basis, ri_ovlp, ri_norm_r)
374 lri_env%bas_prop(ikind)%ri_ovlp => ri_ovlp
375 NULLIFY (orb_ovlp)
376 CALL basis_ovlp(orb_basis, orb_ovlp, orb_norm_r)
377 lri_env%bas_prop(ikind)%orb_ovlp => orb_ovlp
378 NULLIFY (scon_ri)
379 CALL contraction_matrix_shg(ri_basis, scon_ri)
380 lri_env%bas_prop(ikind)%scon_ri => scon_ri
381 NULLIFY (scon_orb)
382 CALL contraction_matrix_shg(orb_basis, scon_orb)
383 lri_env%bas_prop(ikind)%scon_orb => scon_orb
384 NULLIFY (scon_mix)
385 CALL contraction_matrix_shg_mix(orb_basis, ri_basis, &
386 orb_index, ri_index, scon_mix)
387 lri_env%bas_prop(ikind)%scon_mix => scon_mix
388 lri_env%bas_prop(ikind)%orb_index => orb_index
389 lri_env%bas_prop(ikind)%ri_index => ri_index
390 ALLOCATE (lri_env%bas_prop(ikind)%ovlp3(orb_basis%nsgf, orb_basis%nsgf, ri_basis%nsgf))
391 ALLOCATE (dovlp3(orb_basis%nsgf, orb_basis%nsgf, ri_basis%nsgf, 3))
392 CALL int_overlap_aba_shg(lri_env%bas_prop(ikind)%ovlp3, dovlp3, (/0.0_dp, 0.0_dp, 0.0_dp/), &
393 orb_basis, orb_basis, ri_basis, scon_orb, &
394 scon_mix, orb_index, ri_index, &
395 lri_env%cg_shg%cg_coeff, &
396 lri_env%cg_shg%cg_none0_list, &
397 lri_env%cg_shg%ncg_none0, &
398 calculate_forces=.false.)
399 DEALLOCATE (orb_norm_r, ri_norm_r, ri_norm_s)
400 DEALLOCATE (dovlp3)
401 ALLOCATE (ri_ovlp_inv(ri_basis%nsgf, ri_basis%nsgf))
402 CALL invert_matrix(ri_ovlp, ri_ovlp_inv, delta, improve=.true.)
403 lri_env%bas_prop(ikind)%ri_ovlp_inv => ri_ovlp_inv
404 END IF
405 END DO
406 END IF
407 END IF
408
409 END SUBROUTINE lri_basis_init
410
411! **************************************************************************************************
412!> \brief normalization for a contracted Gaussian s-function,
413!> spherical = cartesian Gaussian for s-functions
414!> \param basis ...
415!> \param norm ...
416! **************************************************************************************************
417 SUBROUTINE basis_norm_s_func(basis, norm)
418
419 TYPE(gto_basis_set_type), POINTER :: basis
420 REAL(dp), DIMENSION(:), POINTER :: norm
421
422 INTEGER :: ipgf, iset, isgf, ishell, jpgf, l, nbas
423 REAL(kind=dp) :: aai, aaj, cci, ccj, expa, ppl
424
425 NULLIFY (norm)
426
427 nbas = basis%nsgf
428 ALLOCATE (norm(nbas))
429 norm = 0._dp
430
431 DO iset = 1, basis%nset
432 DO ishell = 1, basis%nshell(iset)
433 l = basis%l(ishell, iset)
434 IF (l /= 0) cycle
435 expa = 0.5_dp*real(2*l + 3, dp)
436 ppl = pi**(3._dp/2._dp)
437 DO isgf = basis%first_sgf(ishell, iset), basis%last_sgf(ishell, iset)
438 DO ipgf = 1, basis%npgf(iset)
439 cci = basis%gcc(ipgf, ishell, iset)
440 aai = basis%zet(ipgf, iset)
441 DO jpgf = 1, basis%npgf(iset)
442 ccj = basis%gcc(jpgf, ishell, iset)
443 aaj = basis%zet(jpgf, iset)
444 norm(isgf) = norm(isgf) + cci*ccj*ppl/(aai + aaj)**expa
445 END DO
446 END DO
447 norm(isgf) = 1.0_dp/sqrt(norm(isgf))
448 END DO
449 END DO
450 END DO
451
452 END SUBROUTINE basis_norm_s_func
453
454! **************************************************************************************************
455!> \brief normalization for radial part of contracted spherical Gaussian
456!> functions
457!> \param basis ...
458!> \param norm ...
459! **************************************************************************************************
460 SUBROUTINE basis_norm_radial(basis, norm)
461
462 TYPE(gto_basis_set_type), POINTER :: basis
463 REAL(dp), DIMENSION(:), POINTER :: norm
464
465 INTEGER :: ipgf, iset, isgf, ishell, jpgf, l, nbas
466 REAL(kind=dp) :: aai, aaj, cci, ccj, expa, ppl
467
468 NULLIFY (norm)
469
470 nbas = basis%nsgf
471 ALLOCATE (norm(nbas))
472 norm = 0._dp
473
474 DO iset = 1, basis%nset
475 DO ishell = 1, basis%nshell(iset)
476 l = basis%l(ishell, iset)
477 expa = 0.5_dp*real(2*l + 3, dp)
478 ppl = fac(2*l + 2)*rootpi/2._dp**real(2*l + 3, dp)/fac(l + 1)
479 DO isgf = basis%first_sgf(ishell, iset), basis%last_sgf(ishell, iset)
480 DO ipgf = 1, basis%npgf(iset)
481 cci = basis%gcc(ipgf, ishell, iset)
482 aai = basis%zet(ipgf, iset)
483 DO jpgf = 1, basis%npgf(iset)
484 ccj = basis%gcc(jpgf, ishell, iset)
485 aaj = basis%zet(jpgf, iset)
486 norm(isgf) = norm(isgf) + cci*ccj*ppl/(aai + aaj)**expa
487 END DO
488 END DO
489 norm(isgf) = 1.0_dp/sqrt(norm(isgf))
490 END DO
491 END DO
492 END DO
493
494 END SUBROUTINE basis_norm_radial
495
496!*****************************************************************************
497!> \brief integral over a single (contracted) lri auxiliary basis function,
498!> integral is zero for all but s-functions
499!> \param basis ...
500!> \param int_aux ...
501!> \param norm ...
502! **************************************************************************************************
503 SUBROUTINE basis_int(basis, int_aux, norm)
504
505 TYPE(gto_basis_set_type), POINTER :: basis
506 REAL(dp), DIMENSION(:), POINTER :: int_aux, norm
507
508 INTEGER :: ipgf, iset, isgf, ishell, l, nbas
509 REAL(kind=dp) :: aa, cc, pp
510
511 nbas = basis%nsgf
512 ALLOCATE (int_aux(nbas))
513 int_aux = 0._dp
514
515 DO iset = 1, basis%nset
516 DO ishell = 1, basis%nshell(iset)
517 l = basis%l(ishell, iset)
518 IF (l /= 0) cycle
519 DO isgf = basis%first_sgf(ishell, iset), basis%last_sgf(ishell, iset)
520 DO ipgf = 1, basis%npgf(iset)
521 cc = basis%gcc(ipgf, ishell, iset)
522 aa = basis%zet(ipgf, iset)
523 pp = (pi/aa)**(3._dp/2._dp)
524 int_aux(isgf) = int_aux(isgf) + norm(isgf)*cc*pp
525 END DO
526 END DO
527 END DO
528 END DO
529
530 END SUBROUTINE basis_int
531
532!*****************************************************************************
533!> \brief self-overlap of lri basis for contracted spherical Gaussians.
534!> Overlap of radial part. Norm contains only normalization of radial
535!> part. Norm and overlap of spherical harmonics not explicitly
536!> calculated since this cancels for the self-overlap anyway.
537!> \param basis ...
538!> \param ovlp ...
539!> \param norm ...
540! **************************************************************************************************
541 SUBROUTINE basis_ovlp(basis, ovlp, norm)
542
543 TYPE(gto_basis_set_type), POINTER :: basis
544 REAL(dp), DIMENSION(:, :), POINTER :: ovlp
545 REAL(dp), DIMENSION(:), POINTER :: norm
546
547 INTEGER :: ipgf, iset, isgf, ishell, jpgf, jset, &
548 jsgf, jshell, l, li, lj, m_i, m_j, nbas
549 REAL(kind=dp) :: aai, aaj, cci, ccj, expa, norm_i, &
550 norm_j, oo, ppl
551
552 nbas = basis%nsgf
553 ALLOCATE (ovlp(nbas, nbas))
554 ovlp = 0._dp
555
556 DO iset = 1, basis%nset
557 DO ishell = 1, basis%nshell(iset)
558 li = basis%l(ishell, iset)
559 DO jset = 1, basis%nset
560 DO jshell = 1, basis%nshell(jset)
561 lj = basis%l(jshell, jset)
562 IF (li == lj) THEN
563 l = li
564 expa = 0.5_dp*real(2*l + 3, dp)
565 ppl = fac(2*l + 2)*rootpi/2._dp**real(2*l + 3, dp)/fac(l + 1)
566 DO isgf = basis%first_sgf(ishell, iset), basis%last_sgf(ishell, iset)
567 m_i = basis%m(isgf)
568 DO jsgf = basis%first_sgf(jshell, jset), basis%last_sgf(jshell, jset)
569 m_j = basis%m(jsgf)
570 IF (m_i == m_j) THEN
571 DO ipgf = 1, basis%npgf(iset)
572 cci = basis%gcc(ipgf, ishell, iset)
573 aai = basis%zet(ipgf, iset)
574 norm_i = norm(isgf)
575 DO jpgf = 1, basis%npgf(jset)
576 ccj = basis%gcc(jpgf, jshell, jset)
577 aaj = basis%zet(jpgf, jset)
578 oo = 1._dp/(aai + aaj)**expa
579 norm_j = norm(jsgf)
580 ovlp(isgf, jsgf) = ovlp(isgf, jsgf) + norm_i*norm_j*ppl*cci*ccj*oo
581 END DO
582 END DO
583 END IF
584 END DO
585 END DO
586 END IF
587 END DO
588 END DO
589 END DO
590 END DO
591
592 END SUBROUTINE basis_ovlp
593
594END MODULE lri_environment_init
All kind of helpful little routines.
Definition ao_util.F:14
real(kind=dp) function, public exp_radius(l, alpha, threshold, prefactor, epsabs, epsrel, rlow)
The radius of a primitive Gaussian function for a given threshold is calculated. g(r) = prefactor*r**...
Definition ao_util.F:96
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
subroutine, public copy_gto_basis_set(basis_set_in, basis_set_out)
...
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public golze2017b
integer, save, public golze2017a
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Initialization for solid harmonic Gaussian (SHG) integral scheme. Scheme for calculation of contracte...
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
subroutine, public get_clebsch_gordon_coefficients(my_cg, cg_none0_list, ncg_none0, maxl1, maxl2)
calculate the Clebsch-Gordon (CG) coefficients for expansion of the product of two spherical harmonic...
Calculation of contracted, spherical Gaussian integrals using the solid harmonic Gaussian (SHG) integ...
subroutine, public int_overlap_aba_shg(saba, dsaba, rab, oba, obb, fba, scon_obb, scona_mix, oba_index, fba_index, cg_coeff, cg_none0_list, ncg_none0, calculate_forces)
calculate integrals (a,b,fa)
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
initializes the environment for lri lri : local resolution of the identity
subroutine, public lri_basis_init(lri_env)
initializes the lri basis: calculates the norm, self-overlap and integral of the ri basis
subroutine, public lri_env_init(lri_env, lri_section)
initializes the lri env
subroutine, public lri_env_basis(ri_type, qs_env, lri_env, qs_kind_set)
initializes the lri env
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
subroutine, public deallocate_bas_properties(lri_env)
deallocates one-center overlap integrals, integral of ri basis and scon matrices
subroutine, public lri_env_create(lri_env)
creates and initializes an lri_env
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
real(kind=dp), parameter, public rootpi
real(kind=dp), dimension(0:maxfac), parameter, public fac
Collection of simple mathematical functions and subroutines.
Definition mathlib.F:15
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, rhs)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_r3d_rs_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
Provides all information about an atomic kind.
Provides all information about a quickstep kind.