22#include "./base/base_uses.f90"
30 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_rho0_types'
36 REAL(
dp),
DIMENSION(:),
POINTER :: qlm_h => null(), &
40 REAL(
dp) :: qlm_z = -1.0_dp
41 REAL(
dp),
DIMENSION(2) :: q0 = -1.0_dp
46 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: qlm_gg => null()
47 REAL(
dp),
DIMENSION(:, :),
POINTER :: g0_h => null(), vg0_h => null()
48 REAL(
dp) :: rpgf0_h = -1.0_dp, rpgf0_s = -1.0_dp
55 POINTER :: mp_gau => null()
56 REAL(
dp) :: zet0_h = -1.0_dp, &
57 total_rho0_h = -1.0_dp
58 REAL(
dp) :: max_rpgf0_s = -1.0_dp
59 REAL(
dp),
DIMENSION(:),
POINTER :: norm_g0l_h => null()
60 INTEGER,
DIMENSION(:),
POINTER :: lmax0_kind => null()
61 INTEGER :: lmax_0 = -1, igrid_zet0_s = -1
71 LOGICAL :: do_cneo = .false.
72 REAL(
dp) :: tot_rhoz_cneo_s = 0.0_dp
108 INTEGER,
INTENT(IN) :: natom
110 INTEGER,
INTENT(IN) :: nkind
112 INTEGER :: iat, ikind
114 IF (
ASSOCIATED(mp_rho))
THEN
115 CALL deallocate_mpole_rho(mp_rho)
118 ALLOCATE (mp_rho(natom))
121 NULLIFY (mp_rho(iat)%Qlm_h)
122 NULLIFY (mp_rho(iat)%Qlm_s)
123 NULLIFY (mp_rho(iat)%Qlm_tot)
124 NULLIFY (mp_rho(iat)%Qlm_car)
127 IF (
ASSOCIATED(mp_gau))
THEN
128 CALL deallocate_mpole_gau(mp_gau)
131 ALLOCATE (mp_gau(nkind))
134 NULLIFY (mp_gau(ikind)%Qlm_gg)
135 NULLIFY (mp_gau(ikind)%g0_h)
136 NULLIFY (mp_gau(ikind)%vg0_h)
137 mp_gau(ikind)%rpgf0_h = 0.0_dp
138 mp_gau(ikind)%rpgf0_s = 0.0_dp
151 INTEGER,
INTENT(IN) :: natom
155 IF (
ASSOCIATED(rho0_set))
THEN
159 ALLOCATE (rho0_set(natom))
162 NULLIFY (rho0_set(iat)%rho0_rad_h)
163 NULLIFY (rho0_set(iat)%vrho0_rad_h)
177 INTEGER,
INTENT(IN) :: nr, nchannels
179 ALLOCATE (rho0_atom%rho0_rad_h)
181 NULLIFY (rho0_atom%rho0_rad_h%r_coef)
182 ALLOCATE (rho0_atom%rho0_rad_h%r_coef(1:nr, 1:nchannels))
183 rho0_atom%rho0_rad_h%r_coef = 0.0_dp
185 ALLOCATE (rho0_atom%vrho0_rad_h)
187 NULLIFY (rho0_atom%vrho0_rad_h%r_coef)
188 ALLOCATE (rho0_atom%vrho0_rad_h%r_coef(1:nr, 1:nchannels))
189 rho0_atom%vrho0_rad_h%r_coef = 0.0_dp
201 IF (
ASSOCIATED(rho0))
THEN
207 NULLIFY (rho0%mp_rho)
208 NULLIFY (rho0%mp_gau)
209 NULLIFY (rho0%norm_g0l_h)
210 NULLIFY (rho0%lmax0_kind)
211 NULLIFY (rho0%rho0_s_rs)
212 NULLIFY (rho0%rho0_s_gs)
226 INTEGER,
INTENT(IN) :: ik
228 INTEGER :: ir, l, lmax, nr
229 REAL(
dp) :: c1, prefactor, root_z_h, z_h
230 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: erf_z_h, gexp, gh_tmp, int1, int2
233 lmax = rho0_mpole%lmax0_kind(ik)
234 z_h = rho0_mpole%zet0_h
238 CALL reallocate(rho0_mpole%mp_gau(ik)%g0_h, 1, nr, 0, lmax)
239 CALL reallocate(rho0_mpole%mp_gau(ik)%vg0_h, 1, nr, 0, lmax)
241 ALLOCATE (gexp(nr), gh_tmp(nr), erf_z_h(nr), int1(nr), int2(nr))
243 gh_tmp(1:nr) = exp(-z_h*grid_atom%rad2(1:nr))
246 erf_z_h(ir) = erf(grid_atom%rad(ir)*root_z_h)
250 IF (gh_tmp(ir) < 1.0e-30_dp) gh_tmp(ir) = 0.0_dp
253 gexp(1:nr) = gh_tmp(1:nr)
254 rho0_mpole%mp_gau(ik)%g0_h(1:nr, 0) = gh_tmp(1:nr)* &
255 rho0_mpole%norm_g0l_h(0)
256 CALL whittaker_c0a(int1, grid_atom%rad, gh_tmp, erf_z_h, z_h, 0, 0, nr)
257 CALL whittaker_ci(int2, grid_atom%rad, gh_tmp, z_h, 0, nr)
259 prefactor =
fourpi*rho0_mpole%norm_g0l_h(0)
261 c1 = sqrt(
pi*
pi*
pi/(z_h*z_h*z_h))*rho0_mpole%norm_g0l_h(0)
264 rho0_mpole%mp_gau(ik)%vg0_h(ir, 0) = c1*erf_z_h(ir)*grid_atom%oorad2l(ir, 1)
268 gh_tmp(1:nr) = gh_tmp(1:nr)*grid_atom%rad(1:nr)
269 rho0_mpole%mp_gau(ik)%g0_h(1:nr, l) = gh_tmp(1:nr)* &
270 rho0_mpole%norm_g0l_h(l)
272 prefactor =
fourpi/(2.0_dp*l + 1.0_dp)*rho0_mpole%norm_g0l_h(l)
273 CALL whittaker_c0a(int1, grid_atom%rad, gexp, erf_z_h, z_h, l, l, nr)
275 rho0_mpole%mp_gau(ik)%vg0_h(ir, l) = prefactor*(int1(ir) + &
276 int2(ir)*grid_atom%rad2l(ir, l))
281 DEALLOCATE (gexp, erf_z_h, gh_tmp, int1, int2)
288 SUBROUTINE deallocate_mpole_gau(mp_gau)
292 INTEGER :: ikind, nkind
298 IF (
ASSOCIATED(mp_gau(ikind)%Qlm_gg))
THEN
299 DEALLOCATE (mp_gau(ikind)%Qlm_gg)
302 DEALLOCATE (mp_gau(ikind)%g0_h)
304 DEALLOCATE (mp_gau(ikind)%vg0_h)
309 END SUBROUTINE deallocate_mpole_gau
315 SUBROUTINE deallocate_mpole_rho(mp_rho)
319 INTEGER :: iat, natom
324 DEALLOCATE (mp_rho(iat)%Qlm_h)
325 DEALLOCATE (mp_rho(iat)%Qlm_s)
326 DEALLOCATE (mp_rho(iat)%Qlm_tot)
327 DEALLOCATE (mp_rho(iat)%Qlm_car)
332 END SUBROUTINE deallocate_mpole_rho
342 INTEGER :: iat, natom
344 IF (
ASSOCIATED(rho0_atom_set))
THEN
346 natom =
SIZE(rho0_atom_set)
349 IF (
ASSOCIATED(rho0_atom_set(iat)%rho0_rad_h))
THEN
350 DEALLOCATE (rho0_atom_set(iat)%rho0_rad_h%r_coef)
351 DEALLOCATE (rho0_atom_set(iat)%rho0_rad_h)
353 IF (
ASSOCIATED(rho0_atom_set(iat)%vrho0_rad_h))
THEN
354 DEALLOCATE (rho0_atom_set(iat)%vrho0_rad_h%r_coef)
355 DEALLOCATE (rho0_atom_set(iat)%vrho0_rad_h)
359 DEALLOCATE (rho0_atom_set)
361 CALL cp_abort(__location__, &
362 "The pointer rho0_atom_set is not associated and "// &
363 "cannot be deallocated")
375 IF (
ASSOCIATED(rho0))
THEN
377 IF (
ASSOCIATED(rho0%mp_gau))
CALL deallocate_mpole_gau(rho0%mp_gau)
379 IF (
ASSOCIATED(rho0%mp_rho))
CALL deallocate_mpole_rho(rho0%mp_rho)
381 IF (
ASSOCIATED(rho0%lmax0_kind))
THEN
382 DEALLOCATE (rho0%lmax0_kind)
385 IF (
ASSOCIATED(rho0%norm_g0l_h))
THEN
386 DEALLOCATE (rho0%norm_g0l_h)
389 IF (
ASSOCIATED(rho0%rho0_s_rs))
THEN
390 CALL rho0%rho0_s_rs%release()
391 DEALLOCATE (rho0%rho0_s_rs)
394 IF (
ASSOCIATED(rho0%rho0_s_gs))
THEN
395 CALL rho0%rho0_s_gs%release()
396 DEALLOCATE (rho0%rho0_s_gs)
399 IF (
ASSOCIATED(rho0%rhoz_cneo_s_rs))
THEN
400 CALL rho0%rhoz_cneo_s_rs%release()
401 DEALLOCATE (rho0%rhoz_cneo_s_rs)
404 IF (
ASSOCIATED(rho0%rhoz_cneo_s_gs))
THEN
405 CALL rho0%rhoz_cneo_s_gs%release()
406 DEALLOCATE (rho0%rhoz_cneo_s_gs)
411 CALL cp_abort(__location__, &
412 "The pointer rho0 is not associated and "// &
413 "cannot be deallocated")
443 SUBROUTINE get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, &
444 mp_gau_ikind, mp_rho, norm_g0l_h, &
445 Qlm_gg, Qlm_car, Qlm_tot, &
446 zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, &
447 max_rpgf0_s, rho0_s_rs, rho0_s_gs, &
448 rhoz_cneo_s_rs, rhoz_cneo_s_gs)
451 REAL(
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: g0_h, vg0_h
452 INTEGER,
INTENT(IN),
OPTIONAL :: iat, ikind
453 INTEGER,
INTENT(OUT),
OPTIONAL :: lmax_0, l0_ikind
457 REAL(
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: norm_g0l_h
458 REAL(
dp),
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: qlm_gg
459 REAL(
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: qlm_car, qlm_tot
460 REAL(
dp),
INTENT(OUT),
OPTIONAL :: zet0_h
461 INTEGER,
INTENT(OUT),
OPTIONAL :: igrid_zet0_s
462 REAL(
dp),
INTENT(OUT),
OPTIONAL :: rpgf0_h, rpgf0_s, max_rpgf0_s
468 IF (
ASSOCIATED(rho0_mpole))
THEN
470 IF (
PRESENT(lmax_0)) lmax_0 = rho0_mpole%lmax_0
471 IF (
PRESENT(mp_rho)) mp_rho => rho0_mpole%mp_rho
472 IF (
PRESENT(norm_g0l_h)) norm_g0l_h => rho0_mpole%norm_g0l_h
473 IF (
PRESENT(zet0_h)) zet0_h = rho0_mpole%zet0_h
474 IF (
PRESENT(igrid_zet0_s)) igrid_zet0_s = rho0_mpole%igrid_zet0_s
475 IF (
PRESENT(max_rpgf0_s)) max_rpgf0_s = rho0_mpole%max_rpgf0_s
476 IF (
PRESENT(rho0_s_rs)) rho0_s_rs => rho0_mpole%rho0_s_rs
477 IF (
PRESENT(rho0_s_gs)) rho0_s_gs => rho0_mpole%rho0_s_gs
478 IF (
PRESENT(rhoz_cneo_s_rs)) rhoz_cneo_s_rs => rho0_mpole%rhoz_cneo_s_rs
479 IF (
PRESENT(rhoz_cneo_s_gs)) rhoz_cneo_s_gs => rho0_mpole%rhoz_cneo_s_gs
481 IF (
PRESENT(ikind))
THEN
482 IF (
PRESENT(l0_ikind)) l0_ikind = rho0_mpole%lmax0_kind(ikind)
483 IF (
PRESENT(mp_gau_ikind)) mp_gau_ikind => rho0_mpole%mp_gau(ikind)
484 IF (
PRESENT(g0_h)) g0_h => rho0_mpole%mp_gau(ikind)%g0_h
485 IF (
PRESENT(vg0_h)) vg0_h => rho0_mpole%mp_gau(ikind)%vg0_h
486 IF (
PRESENT(qlm_gg)) qlm_gg => rho0_mpole%mp_gau(ikind)%Qlm_gg
487 IF (
PRESENT(rpgf0_h)) rpgf0_h = rho0_mpole%mp_gau(ikind)%rpgf0_h
488 IF (
PRESENT(rpgf0_s)) rpgf0_s = rho0_mpole%mp_gau(ikind)%rpgf0_s
490 IF (
PRESENT(iat))
THEN
491 IF (
PRESENT(qlm_car)) qlm_car => rho0_mpole%mp_rho(iat)%Qlm_car
492 IF (
PRESENT(qlm_tot)) qlm_tot => rho0_mpole%mp_rho(iat)%Qlm_tot
496 cpabort(
"The pointer rho0_mpole is not associated")
511 INTEGER,
INTENT(IN) :: nchan_s, nchan_c
512 REAL(kind=
dp),
INTENT(IN) :: zeff
519 mp_rho%Qlm_h = 0.0_dp
520 mp_rho%Qlm_s = 0.0_dp
521 mp_rho%Qlm_tot = 0.0_dp
522 mp_rho%Qlm_car = 0.0_dp
523 mp_rho%Qlm_z = -2.0_dp*
rootpi*zeff
537 CHARACTER(LEN=*),
INTENT(IN) :: unit_str
538 INTEGER,
INTENT(in) :: output_unit
540 INTEGER :: ikind, l, nkind
543 IF (
ASSOCIATED(rho0_mpole))
THEN
546 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
547 "*** Compensation density charges data set ***"
548 WRITE (unit=output_unit, fmt=
"(T2,A,T35,f16.10)") &
549 "- Rho0 exponent :", rho0_mpole%zet0_h
550 WRITE (unit=output_unit, fmt=
"(T2,A,T35,I5)") &
551 "- Global max l :", rho0_mpole%lmax_0
553 WRITE (unit=output_unit, fmt=
"(T2,A)") &
554 "- Normalization constants for g0"
555 DO l = 0, rho0_mpole%lmax_0
556 WRITE (unit=output_unit, fmt=
"(T20,A,T31,I2,T38,A,f15.5)") &
557 "ang. mom.= ", l,
" hard= ", rho0_mpole%norm_g0l_h(l)
560 nkind =
SIZE(rho0_mpole%lmax0_kind, 1)
562 WRITE (unit=output_unit, fmt=
"(/,T2,A,T55,I2)") &
563 "- rho0 max L and radii in "//trim(unit_str)// &
564 " for the atom kind :", ikind
566 WRITE (unit=output_unit, fmt=
"(T2,T20,A,T55,I5)") &
567 "=> l max :", rho0_mpole%lmax0_kind(ikind)
569 WRITE (unit=output_unit, fmt=
"(T2,T20,A,T55,f20.10)") &
570 "=> max radius of g0: ", &
571 rho0_mpole%mp_gau(ikind)%rpgf0_h*conv
575 WRITE (unit=output_unit, fmt=
"(/,T5,A,/)") &
576 ' WARNING: I cannot print rho0, it is not associated'
real(kind=dp) function, public cp_unit_from_cp2k(value, unit_str, defaults, power)
converts from the internal cp2k units to the given unit
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
real(kind=dp), parameter, public rootpi
real(kind=dp), parameter, public fourpi
Utility routines for the memory handling.
subroutine, public allocate_multipoles(mp_rho, natom, mp_gau, nkind)
...
subroutine, public initialize_mpole_rho(mp_rho, nchan_s, nchan_c, zeff)
...
subroutine, public allocate_rho0_atom_rad(rho0_atom, nr, nchannels)
...
subroutine, public calculate_g0(rho0_mpole, grid_atom, ik)
...
subroutine, public write_rho0_info(rho0_mpole, unit_str, output_unit)
...
subroutine, public allocate_rho0_atom(rho0_set, natom)
...
subroutine, public allocate_rho0_mpole(rho0)
...
subroutine, public deallocate_rho0_mpole(rho0)
...
subroutine, public deallocate_rho0_atom(rho0_atom_set)
...
subroutine, public get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, mp_gau_ikind, mp_rho, norm_g0l_h, qlm_gg, qlm_car, qlm_tot, zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, max_rpgf0_s, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs)
...
Calculates special integrals.
subroutine, public whittaker_c0a(wc, r, expa, erfa, alpha, l1, l2, n)
int(y^(2+l1+l2) * exp(-alpha*y*y),y=0..x) / x^(l2+1); wc(:) :: output r(:) :: coordinate expa(:) :: e...
subroutine, public whittaker_ci(wc, r, expa, alpha, l, n)
int(y^(l+1) * exp(-alpha*y*y),y=x..infinity);