(git:b17b328)
Loading...
Searching...
No Matches
hartree_local_methods.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7! **************************************************************************************************
13 USE cell_types, ONLY: cell_type
19 USE kinds, ONLY: dp
20 USE mathconstants, ONLY: fourpi,&
21 pi
23 USE orbital_pointers, ONLY: indso,&
24 nsoset
25 USE pw_env_types, ONLY: pw_env_get,&
39 USE qs_kind_types, ONLY: get_qs_kind,&
45 USE qs_rho0_types, ONLY: get_rho0_mpole,&
51 USE util, ONLY: get_limit
52#include "./base/base_uses.f90"
53
54 IMPLICIT NONE
55
56 PRIVATE
57
58 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'hartree_local_methods'
59
60 ! Public Subroutine
61
63
64CONTAINS
65
66! **************************************************************************************************
67!> \brief ...
68!> \param hartree_local ...
69!> \param natom ...
70! **************************************************************************************************
71 SUBROUTINE init_coulomb_local(hartree_local, natom)
72
73 TYPE(hartree_local_type), POINTER :: hartree_local
74 INTEGER, INTENT(IN) :: natom
75
76 CHARACTER(len=*), PARAMETER :: routinen = 'init_coulomb_local'
77
78 INTEGER :: handle
79 TYPE(ecoul_1center_type), DIMENSION(:), POINTER :: ecoul_1c
80
81 CALL timeset(routinen, handle)
82
83 NULLIFY (ecoul_1c)
84 ! Allocate and Initialize 1-center Potentials and Integrals
85 CALL allocate_ecoul_1center(ecoul_1c, natom)
86 hartree_local%ecoul_1c => ecoul_1c
87
88 CALL timestop(handle)
89
90 END SUBROUTINE init_coulomb_local
91
92! **************************************************************************************************
93!> \brief Calculates Hartree potential for hard and soft densities (including
94!> nuclear charge and compensation charges) using numerical integration
95!> \param vrad_h ...
96!> \param vrad_s ...
97!> \param rrad_h ...
98!> \param rrad_s ...
99!> \param rrad_0 ...
100!> \param rrad_z ...
101!> \param grid_atom ...
102!> \par History
103!> 05.2012 JGH refactoring
104!> \author ??
105! **************************************************************************************************
106 SUBROUTINE calculate_vh_1center(vrad_h, vrad_s, rrad_h, rrad_s, rrad_0, rrad_z, grid_atom)
107
108 REAL(dp), DIMENSION(:, :), INTENT(INOUT) :: vrad_h, vrad_s
109 TYPE(rho_atom_coeff), DIMENSION(:), INTENT(IN) :: rrad_h, rrad_s
110 REAL(dp), DIMENSION(:, :), INTENT(IN) :: rrad_0
111 REAL(dp), DIMENSION(:), INTENT(IN) :: rrad_z
112 TYPE(grid_atom_type), POINTER :: grid_atom
113
114 CHARACTER(len=*), PARAMETER :: routinen = 'calculate_Vh_1center'
115
116 INTEGER :: handle, ir, iso, ispin, l_ang, &
117 max_s_harm, nchannels, nr, nspins
118 REAL(dp) :: i1_down, i1_up, i2_down, i2_up, prefactor
119 REAL(dp), ALLOCATABLE, DIMENSION(:, :) :: rho_1, rho_2
120 REAL(dp), DIMENSION(:), POINTER :: wr
121 REAL(dp), DIMENSION(:, :), POINTER :: oor2l, r2l
122
123 CALL timeset(routinen, handle)
124
125 nr = grid_atom%nr
126 max_s_harm = SIZE(vrad_h, 2)
127 nspins = SIZE(rrad_h, 1)
128 nchannels = SIZE(rrad_0, 2)
129
130 r2l => grid_atom%rad2l
131 oor2l => grid_atom%oorad2l
132 wr => grid_atom%wr
133
134 ALLOCATE (rho_1(nr, max_s_harm), rho_2(nr, max_s_harm))
135 rho_1 = 0.0_dp
136 rho_2 = 0.0_dp
137
138 ! Case lm = 0
139 rho_1(:, 1) = rrad_z(:)
140 rho_2(:, 1) = rrad_0(:, 1)
141
142 DO iso = 2, nchannels
143 rho_2(:, iso) = rrad_0(:, iso)
144 END DO
145
146 DO iso = 1, max_s_harm
147 DO ispin = 1, nspins
148 rho_1(:, iso) = rho_1(:, iso) + rrad_h(ispin)%r_coef(:, iso)
149 rho_2(:, iso) = rho_2(:, iso) + rrad_s(ispin)%r_coef(:, iso)
150 END DO
151
152 l_ang = indso(1, iso)
153 prefactor = fourpi/(2._dp*l_ang + 1._dp)
154
155 rho_1(:, iso) = rho_1(:, iso)*wr(:)
156 rho_2(:, iso) = rho_2(:, iso)*wr(:)
157
158 i1_up = 0.0_dp
159 i1_down = 0.0_dp
160 i2_up = 0.0_dp
161 i2_down = 0.0_dp
162
163 i1_up = r2l(nr, l_ang)*rho_1(nr, iso)
164 i2_up = r2l(nr, l_ang)*rho_2(nr, iso)
165
166 DO ir = nr - 1, 1, -1
167 i1_down = i1_down + oor2l(ir, l_ang + 1)*rho_1(ir, iso)
168 i2_down = i2_down + oor2l(ir, l_ang + 1)*rho_2(ir, iso)
169 END DO
170
171 vrad_h(nr, iso) = vrad_h(nr, iso) + prefactor* &
172 (oor2l(nr, l_ang + 1)*i1_up + r2l(nr, l_ang)*i1_down)
173 vrad_s(nr, iso) = vrad_s(nr, iso) + prefactor* &
174 (oor2l(nr, l_ang + 1)*i2_up + r2l(nr, l_ang)*i2_down)
175
176 DO ir = nr - 1, 1, -1
177 i1_up = i1_up + r2l(ir, l_ang)*rho_1(ir, iso)
178 i1_down = i1_down - oor2l(ir, l_ang + 1)*rho_1(ir, iso)
179 i2_up = i2_up + r2l(ir, l_ang)*rho_2(ir, iso)
180 i2_down = i2_down - oor2l(ir, l_ang + 1)*rho_2(ir, iso)
181
182 vrad_h(ir, iso) = vrad_h(ir, iso) + prefactor* &
183 (oor2l(ir, l_ang + 1)*i1_up + r2l(ir, l_ang)*i1_down)
184 vrad_s(ir, iso) = vrad_s(ir, iso) + prefactor* &
185 (oor2l(ir, l_ang + 1)*i2_up + r2l(ir, l_ang)*i2_down)
186
187 END DO
188
189 END DO
190
191 DEALLOCATE (rho_1, rho_2)
192
193 CALL timestop(handle)
194
195 END SUBROUTINE calculate_vh_1center
196
197! **************************************************************************************************
198!> \brief Calculates one center GAPW Hartree energies and matrix elements
199!> Hartree potentials are input
200!> Takes possible background charge into account
201!> Special case for densities without core charge
202!> \param qs_env ...
203!> \param energy_hartree_1c ...
204!> \param ecoul_1c ...
205!> \param local_rho_set ...
206!> \param para_env ...
207!> \param tddft ...
208!> \param local_rho_set_2nd ...
209!> \param core_2nd ...
210!> \par History
211!> 05.2012 JGH refactoring
212!> \author ??
213! **************************************************************************************************
214 SUBROUTINE vh_1c_gg_integrals(qs_env, energy_hartree_1c, ecoul_1c, local_rho_set, para_env, tddft, local_rho_set_2nd, &
215 core_2nd)
216
217 TYPE(qs_environment_type), POINTER :: qs_env
218 REAL(kind=dp), INTENT(out) :: energy_hartree_1c
219 TYPE(ecoul_1center_type), DIMENSION(:), POINTER :: ecoul_1c
220 TYPE(local_rho_type), POINTER :: local_rho_set
221 TYPE(mp_para_env_type), POINTER :: para_env
222 LOGICAL, INTENT(IN) :: tddft
223 TYPE(local_rho_type), OPTIONAL, POINTER :: local_rho_set_2nd
224 LOGICAL, INTENT(IN), OPTIONAL :: core_2nd
225
226 CHARACTER(LEN=*), PARAMETER :: routinen = 'Vh_1c_gg_integrals'
227
228 INTEGER :: bo(2), handle, iat, iatom, ikind, ipgf1, is1, iset1, iso, l_ang, llmax, &
229 llmax_nuc, lmax0, lmax0_2nd, lmax_0, m1, max_iso, max_iso_not0, max_iso_not0_nuc, &
230 max_s_harm, max_s_harm_nuc, maxl, maxl_nuc, maxso, maxso_nuc, mepos, n1, nat, nchan_0, &
231 nkind, nr, nset, nset_nuc, nsotot, nsotot_nuc, nspins, num_pe
232 INTEGER, ALLOCATABLE, DIMENSION(:) :: cg_n_list
233 INTEGER, ALLOCATABLE, DIMENSION(:, :, :) :: cg_list
234 INTEGER, DIMENSION(:), POINTER :: atom_list, lmax, lmax_nuc, lmin, &
235 lmin_nuc, npgf, npgf_nuc
236 LOGICAL :: cneo, core_charge, l_2nd_local_rho, &
237 my_core_2nd, my_periodic, paw_atom
238 REAL(dp) :: back_ch, ecoul_1_z_cneo, factor
239 REAL(dp), ALLOCATABLE, DIMENSION(:) :: gexp, sqrtwr
240 REAL(dp), ALLOCATABLE, DIMENSION(:, :) :: avh1b_00, avh1b_00_nuc, avh1b_hh, &
241 avh1b_hh_nuc, avh1b_ss, avh1b_ss_nuc, &
242 g0_h_w
243 REAL(dp), DIMENSION(:), POINTER :: rrad_z, vrrad_z
244 REAL(dp), DIMENSION(:, :), POINTER :: g0_h, g0_h_2nd, gsph, gsph_nuc, rrad_0, &
245 vh1_h, vh1_s, vrrad_0, zet, zet_nuc
246 REAL(dp), DIMENSION(:, :, :), POINTER :: my_cg, qlm_gg, qlm_gg_2nd
247 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
248 TYPE(cell_type), POINTER :: cell
249 TYPE(cneo_potential_type), POINTER :: cneo_potential
250 TYPE(dft_control_type), POINTER :: dft_control
251 TYPE(grid_atom_type), POINTER :: grid_atom
252 TYPE(gto_basis_set_type), POINTER :: basis_1c, nuc_basis
253 TYPE(harmonics_atom_type), POINTER :: harmonics
254 TYPE(pw_env_type), POINTER :: pw_env
255 TYPE(pw_poisson_type), POINTER :: poisson_env
256 TYPE(qs_charges_type), POINTER :: qs_charges
257 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
258 TYPE(rho0_atom_type), DIMENSION(:), POINTER :: rho0_atom_set, rho0_atom_set_2nd
259 TYPE(rho0_mpole_type), POINTER :: rho0_mpole, rho0_mpole_2nd
260 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom_set, rho_atom_set_2nd
261 TYPE(rho_atom_type), POINTER :: rho_atom
262 TYPE(rhoz_cneo_type), DIMENSION(:), POINTER :: rhoz_cneo_set
263 TYPE(rhoz_cneo_type), POINTER :: rhoz_cneo
264 TYPE(rhoz_type), DIMENSION(:), POINTER :: rhoz_set, rhoz_set_2nd
265
266 CALL timeset(routinen, handle)
267
268 NULLIFY (cell, dft_control, poisson_env, pw_env, qs_charges)
269 NULLIFY (atomic_kind_set, qs_kind_set, rho_atom_set, rho0_atom_set)
270 NULLIFY (rho0_mpole, rhoz_set)
271 NULLIFY (atom_list, grid_atom, harmonics)
272 NULLIFY (basis_1c, lmin, lmax, npgf, zet)
273 NULLIFY (gsph)
274 NULLIFY (rhoz_cneo, rhoz_cneo_set)
275
276 CALL get_qs_env(qs_env=qs_env, &
277 cell=cell, dft_control=dft_control, &
278 atomic_kind_set=atomic_kind_set, &
279 qs_kind_set=qs_kind_set, &
280 pw_env=pw_env, qs_charges=qs_charges)
281
282 CALL pw_env_get(pw_env, poisson_env=poisson_env)
283 my_periodic = (poisson_env%method == pw_poisson_periodic)
284
285 back_ch = qs_charges%background*cell%deth
286
287 ! rhoz_set is not accessed in TDDFT
288 CALL get_local_rho(local_rho_set, rho_atom_set, rho0_atom_set, rho0_mpole, rhoz_set, &
289 rhoz_cneo_set) ! for integral space
290
291 ! for forces we need a second local_rho_set
292 l_2nd_local_rho = .false.
293 IF (PRESENT(local_rho_set_2nd)) THEN ! for potential
294 l_2nd_local_rho = .true.
295 NULLIFY (rho_atom_set_2nd, rho0_atom_set_2nd, rhoz_set_2nd) ! for potential
296 CALL get_local_rho(local_rho_set_2nd, rho_atom_set_2nd, rho0_atom_set_2nd, rho0_mpole_2nd, rhoz_set=rhoz_set_2nd)
297 END IF
298
299 nkind = SIZE(atomic_kind_set, 1)
300 nspins = dft_control%nspins
301
302 core_charge = .NOT. tddft ! for forces mixed version
303 my_core_2nd = .true.
304 IF (PRESENT(core_2nd)) my_core_2nd = .NOT. core_2nd ! if my_core_2nd true, include core charge
305
306 ! The aim of the following code was to return immediately if the subroutine
307 ! was called for triplet excited states in spin-restricted case. This check
308 ! is also performed before invocation of this subroutine. It should be save
309 ! to remove the optional argument 'do_triplet' from the subroutine interface.
310 !IF (tddft) THEN
311 ! CPASSERT(PRESENT(do_triplet))
312 ! IF (nspins == 1 .AND. do_triplet) RETURN
313 !END IF
314
315 CALL get_qs_kind_set(qs_kind_set, maxg_iso_not0=max_iso)
316 CALL get_rho0_mpole(rho0_mpole=rho0_mpole, lmax_0=lmax_0)
317
318 ! Put to 0 the local hartree energy contribution from 1 center integrals
319 energy_hartree_1c = 0.0_dp
320 ! Restore total quantum nuclear density to zero
321 qs_charges%total_rho1_hard_nuc = 0.0_dp
322 rho0_mpole%tot_rhoz_cneo_s = 0.0_dp
323
324 ! Here starts the loop over all the atoms
325 DO ikind = 1, nkind
326
327 CALL get_atomic_kind(atomic_kind_set(ikind), atom_list=atom_list, natom=nat)
328 NULLIFY (cneo_potential)
329 CALL get_qs_kind(qs_kind_set(ikind), &
330 grid_atom=grid_atom, &
331 harmonics=harmonics, ngrid_rad=nr, &
332 max_iso_not0=max_iso_not0, paw_atom=paw_atom, &
333 cneo_potential=cneo_potential)
334 CALL get_qs_kind(qs_kind_set(ikind), &
335 basis_set=basis_1c, basis_type="GAPW_1C")
336
337 cneo = ASSOCIATED(cneo_potential)
338 IF (cneo .AND. tddft) &
339 cpabort("Electronic TDDFT with CNEO quantum nuclei is not implemented.")
340
341 NULLIFY (nuc_basis)
342 max_iso_not0_nuc = 0
343 IF (cneo) THEN
344 cpassert(paw_atom)
345 CALL get_qs_kind(qs_kind_set(ikind), &
346 basis_set=nuc_basis, basis_type="NUC")
347 max_iso_not0_nuc = cneo_potential%harmonics%max_iso_not0
348 END IF
349
350 IF (paw_atom) THEN
351!=========== PAW ===============
352 CALL get_gto_basis_set(gto_basis_set=basis_1c, lmax=lmax, lmin=lmin, &
353 maxso=maxso, npgf=npgf, maxl=maxl, &
354 nset=nset, zet=zet)
355
356 max_s_harm = harmonics%max_s_harm
357 llmax = harmonics%llmax
358
359 nsotot = maxso*nset
360 ALLOCATE (gsph(nr, nsotot))
361 ALLOCATE (gexp(nr))
362 ALLOCATE (sqrtwr(nr), g0_h_w(nr, 0:lmax_0))
363
364 ALLOCATE (avh1b_hh(nsotot, nsotot))
365 ALLOCATE (avh1b_ss(nsotot, nsotot))
366 ALLOCATE (avh1b_00(nsotot, nsotot))
367
368 NULLIFY (qlm_gg, g0_h)
369 CALL get_rho0_mpole(rho0_mpole=rho0_mpole, ikind=ikind, &
370 l0_ikind=lmax0, &
371 qlm_gg=qlm_gg, g0_h=g0_h) ! Qlm_gg of density
372
373 IF (PRESENT(local_rho_set_2nd)) THEN ! for potential
374 NULLIFY (qlm_gg_2nd, g0_h_2nd)
375 CALL get_rho0_mpole(rho0_mpole=rho0_mpole_2nd, ikind=ikind, &
376 l0_ikind=lmax0_2nd, &
377 qlm_gg=qlm_gg_2nd, g0_h=g0_h_2nd) ! Qlm_gg of density
378 END IF
379 nchan_0 = nsoset(lmax0)
380
381 IF (nchan_0 > max(max_iso_not0, max_iso_not0_nuc)) &
382 cpabort("channels for rho0 > # max of spherical harmonics")
383
384 NULLIFY (vh1_h, vh1_s)
385 ALLOCATE (vh1_h(nr, max_iso_not0))
386 ALLOCATE (vh1_s(nr, max(max_iso_not0, max_iso_not0_nuc, nchan_0)))
387
388 NULLIFY (lmax_nuc, lmin_nuc, npgf_nuc, zet_nuc, gsph_nuc)
389 maxso_nuc = 0
390 maxl_nuc = -1
391 nset_nuc = 0
392 max_s_harm_nuc = 0
393 llmax_nuc = -1
394 nsotot_nuc = 0
395 IF (cneo) THEN
396 CALL get_gto_basis_set(gto_basis_set=nuc_basis, lmax=lmax_nuc, &
397 lmin=lmin_nuc, maxso=maxso_nuc, npgf=npgf_nuc, &
398 maxl=maxl_nuc, nset=nset_nuc, zet=zet_nuc)
399
400 max_s_harm_nuc = cneo_potential%harmonics%max_s_harm
401 llmax_nuc = cneo_potential%harmonics%llmax
402 nsotot_nuc = maxso_nuc*nset_nuc
403 ALLOCATE (gsph_nuc(nr, nsotot_nuc))
404 gsph_nuc = 0.0_dp
405 ALLOCATE (avh1b_hh_nuc(nsotot_nuc, nsotot_nuc))
406 ALLOCATE (avh1b_ss_nuc(nsotot_nuc, nsotot_nuc))
407 ALLOCATE (avh1b_00_nuc(nsotot_nuc, nsotot_nuc))
408 END IF
409
410 ALLOCATE (cg_list(2, nsoset(max(maxl, maxl_nuc))**2, &
411 max(max_s_harm, max_s_harm_nuc)), &
412 cg_n_list(max(max_s_harm, max_s_harm_nuc)))
413
414 NULLIFY (rrad_z, my_cg)
415 my_cg => harmonics%my_CG
416
417 ! set to zero temporary arrays
418 sqrtwr = 0.0_dp
419 g0_h_w = 0.0_dp
420 gexp = 0.0_dp
421 gsph = 0.0_dp
422
423 sqrtwr(1:nr) = sqrt(grid_atom%wr(1:nr))
424 DO l_ang = 0, lmax0
425 g0_h_w(1:nr, l_ang) = g0_h(1:nr, l_ang)*grid_atom%wr(1:nr)
426 END DO
427
428 m1 = 0
429 DO iset1 = 1, nset
430 n1 = nsoset(lmax(iset1))
431 DO ipgf1 = 1, npgf(iset1)
432 gexp(1:nr) = exp(-zet(ipgf1, iset1)*grid_atom%rad2(1:nr))*sqrtwr(1:nr)
433 DO is1 = nsoset(lmin(iset1) - 1) + 1, nsoset(lmax(iset1))
434 iso = is1 + (ipgf1 - 1)*n1 + m1
435 l_ang = indso(1, is1)
436 gsph(1:nr, iso) = grid_atom%rad2l(1:nr, l_ang)*gexp(1:nr)
437 END DO ! is1
438 END DO ! ipgf1
439 m1 = m1 + maxso
440 END DO ! iset1
441
442 IF (cneo) THEN
443 ! initialize nuclear pmat, cpc and e_core to zero
444 DO iat = 1, nat
445 iatom = atom_list(iat)
446 rhoz_cneo_set(iatom)%pmat = 0.0_dp
447 rhoz_cneo_set(iatom)%cpc_h = 0.0_dp
448 rhoz_cneo_set(iatom)%cpc_s = 0.0_dp
449 rhoz_cneo_set(iatom)%e_core = 0.0_dp
450 rhoz_cneo_set(iatom)%ready = .false.
451 END DO
452
453 ! calculate nuclear gsph
454 m1 = 0
455 DO iset1 = 1, nset_nuc
456 n1 = nsoset(lmax_nuc(iset1))
457 DO ipgf1 = 1, npgf_nuc(iset1)
458 gexp(1:nr) = exp(-zet_nuc(ipgf1, iset1)*grid_atom%rad2(1:nr))*sqrtwr(1:nr)
459 DO is1 = nsoset(lmin_nuc(iset1) - 1) + 1, nsoset(lmax_nuc(iset1))
460 iso = is1 + (ipgf1 - 1)*n1 + m1
461 l_ang = indso(1, is1)
462 gsph_nuc(1:nr, iso) = cneo_potential%rad2l(1:nr, l_ang)*gexp(1:nr)
463 END DO ! is1
464 END DO ! ipgf1
465 m1 = m1 + maxso_nuc
466 END DO ! iset1
467 END IF
468
469 ! Distribute the atoms of this kind
470 num_pe = para_env%num_pe
471 mepos = para_env%mepos
472 bo = get_limit(nat, num_pe, mepos)
473
474 DO iat = bo(1), bo(2) !1,nat
475 iatom = atom_list(iat)
476 rho_atom => rho_atom_set(iatom)
477
478 NULLIFY (rrad_z, vrrad_z, rrad_0, vrrad_0)
479 IF (core_charge .AND. .NOT. cneo) THEN
480 rrad_z => rhoz_set(ikind)%r_coef ! for density
481 END IF
482 IF (my_core_2nd .AND. .NOT. cneo) THEN
483 IF (l_2nd_local_rho) THEN
484 vrrad_z => rhoz_set_2nd(ikind)%vr_coef ! for potential
485 ELSE
486 vrrad_z => rhoz_set(ikind)%vr_coef ! for potential
487 END IF
488 END IF
489 rrad_0 => rho0_atom_set(iatom)%rho0_rad_h%r_coef ! for density
490 vrrad_0 => rho0_atom_set(iatom)%vrho0_rad_h%r_coef
491 IF (l_2nd_local_rho) THEN
492 rho_atom => rho_atom_set_2nd(iatom)
493 vrrad_0 => rho0_atom_set_2nd(iatom)%vrho0_rad_h%r_coef ! for potential
494 END IF
495 IF (my_periodic .AND. back_ch .GT. 1.e-3_dp) THEN
496 factor = -2.0_dp*pi/3.0_dp*sqrt(fourpi)*qs_charges%background
497 ELSE
498 factor = 0._dp
499 END IF
500
501 CALL vh_1c_atom_potential(rho_atom, vrrad_0, &
502 grid_atom, my_core_2nd .AND. .NOT. cneo, & ! core charge for potential (2nd)
503 vrrad_z, vh1_h, vh1_s, &
504 nchan_0, nspins, max_iso_not0, factor)
505
506 IF (l_2nd_local_rho) rho_atom => rho_atom_set(iatom) ! rho_atom for density
507
508 ecoul_1_z_cneo = 0.0_dp
509 IF (cneo) THEN
510 rhoz_cneo => rhoz_cneo_set(iatom)
511 ! Add the soft tail of nuclear Hartree potential to total Vh1_s first.
512 ! vrho already contains the -zeff factor.
513 DO iso = 1, max_iso_not0_nuc
514 vh1_s(:, iso) = vh1_s(:, iso) + rhoz_cneo%vrho_rad_s(:, iso)
515 END DO
516
517 ! Build nuclear 1c integrals according to Vh1_h from electronic density only
518 ! and Vh1_s from electron density and last step (or initial guess) nuclear density
519 ! Vh1_h_nuc = -Z*Vh1_h, Vh1_s_nuc = -Z*Vh1_s
520 CALL vh_1c_nuc_integrals(rhoz_cneo, cneo_potential%zeff, &
521 avh1b_hh_nuc, avh1b_ss_nuc, avh1b_00_nuc, vh1_h, vh1_s, &
522 max_iso_not0, max_iso_not0_nuc, &
523 max_s_harm_nuc, llmax_nuc, cg_list, cg_n_list, &
524 nset_nuc, npgf_nuc, lmin_nuc, lmax_nuc, nsotot_nuc, maxso_nuc, &
525 nchan_0, gsph_nuc, g0_h_w, cneo_potential%harmonics%my_CG, &
526 cneo_potential%Qlm_gg)
527
528 ! Solve the nuclear 1c problem
529 CALL calculate_rhoz_cneo(rhoz_cneo, cneo_potential, cg_list, cg_n_list, nset_nuc, &
530 npgf_nuc, lmin_nuc, lmax_nuc, maxl_nuc, maxso_nuc)
531 ! slm_int(iso=1) = sqrt(4*Pi), slm_int(iso>1) = 0, without using Lebedev grid
532 ! when printing, nuclear density is positive, thus needing the minus sign
533 qs_charges%total_rho1_hard_nuc = qs_charges%total_rho1_hard_nuc - sqrt(fourpi) &
534 *sum(rhoz_cneo%rho_rad_h(:, 1)*grid_atom%wr(:))
535 rho0_mpole%tot_rhoz_cneo_s = rho0_mpole%tot_rhoz_cneo_s - sqrt(fourpi) &
536 *sum(rhoz_cneo%rho_rad_s(:, 1)*grid_atom%wr(:))
537
538 ! Calculate the contributions to Ecoul coming from Vh1_h*rhoz_cneo_h and Vh1_s*rhoz_cneo_s.
539 ! Self-interaction of the quantum nucleus is already removed in ecoul_1_z_cneo.
540 ! rho already contains the -zeff factor.
541 DO iso = 1, min(max_iso_not0, max_iso_not0_nuc)
542 ecoul_1_z_cneo = ecoul_1_z_cneo + 0.5_dp* &
543 (sum(vh1_h(:, iso)*rhoz_cneo%rho_rad_h(:, iso)*grid_atom%wr(:)) &
544 - sum(vh1_s(:, iso)*rhoz_cneo%rho_rad_s(:, iso)*grid_atom%wr(:)))
545 END DO
546 DO iso = max_iso_not0 + 1, max_iso_not0_nuc
547 ecoul_1_z_cneo = ecoul_1_z_cneo - 0.5_dp* &
548 sum(vh1_s(:, iso)*rhoz_cneo%rho_rad_s(:, iso)*grid_atom%wr(:))
549 END DO
550
551 ! Add nuclear Hartree potential to total Vh1_h after solving the nuclear 1c problem
552 ! to avoid nuclear self-interaction.
553 ! vrho already contains the -zeff factor.
554 ! Here the min of two max_iso_not0's is chosen, because even when the nuclear one
555 ! is larger, it is meaningless to let Vh1_h have higher angular momentum components
556 ! as Vh1_h now is only used for the electronic part.
557 DO iso = 1, min(max_iso_not0, max_iso_not0_nuc)
558 vh1_h(:, iso) = vh1_h(:, iso) + rhoz_cneo%vrho_rad_h(:, iso)
559 END DO
560 END IF
561
562 CALL vh_1c_atom_energy(energy_hartree_1c, ecoul_1c, rho_atom, rrad_0, &
563 grid_atom, iatom, core_charge .AND. .NOT. cneo, & ! core charge for density
564 rrad_z, vh1_h, vh1_s, nchan_0, nspins, max_iso_not0)
565
566 IF (l_2nd_local_rho) rho_atom => rho_atom_set_2nd(iatom) ! rho_atom for potential (2nd)
567
568 IF (cneo) THEN
569 CALL set_ecoul_1c(ecoul_1c, iatom, ecoul_1_z=ecoul_1c(iatom)%ecoul_1_z + ecoul_1_z_cneo)
570 energy_hartree_1c = energy_hartree_1c + ecoul_1_z_cneo
571 END IF
572
573 CALL vh_1c_atom_integrals(rho_atom, & ! results (int_local_h and int_local_s) written on rho_atom_2nd
574 ! int_local_h and int_local_s are used in update_ks_atom
575 ! on int_local_h mixed core / non-core
576 avh1b_hh, avh1b_ss, avh1b_00, vh1_h, vh1_s, max_iso_not0, &
577 max_s_harm, llmax, cg_list, cg_n_list, &
578 nset, npgf, lmin, lmax, nsotot, maxso, nspins, nchan_0, gsph, &
579 g0_h_w, my_cg, qlm_gg) ! Qlm_gg for density from local_rho_set
580
581 END DO ! iat
582
583 DEALLOCATE (avh1b_hh)
584 DEALLOCATE (avh1b_ss)
585 DEALLOCATE (avh1b_00)
586 IF (ALLOCATED(avh1b_hh_nuc)) DEALLOCATE (avh1b_hh_nuc)
587 IF (ALLOCATED(avh1b_ss_nuc)) DEALLOCATE (avh1b_ss_nuc)
588 IF (ALLOCATED(avh1b_00_nuc)) DEALLOCATE (avh1b_00_nuc)
589 DEALLOCATE (vh1_h, vh1_s)
590 DEALLOCATE (cg_list, cg_n_list)
591 DEALLOCATE (gsph)
592 IF (ASSOCIATED(gsph_nuc)) DEALLOCATE (gsph_nuc)
593 DEALLOCATE (gexp)
594 DEALLOCATE (sqrtwr, g0_h_w)
595
596 IF (cneo) THEN
597 ! broadcast nuclear pmat, cpc and e_core
598 DO iat = 1, nat
599 iatom = atom_list(iat)
600 CALL para_env%sum(rhoz_cneo_set(iatom)%pmat)
601 CALL para_env%sum(rhoz_cneo_set(iatom)%cpc_h)
602 CALL para_env%sum(rhoz_cneo_set(iatom)%cpc_s)
603 CALL para_env%sum(rhoz_cneo_set(iatom)%e_core)
604 rhoz_cneo_set(iatom)%ready = .true.
605 END DO
606 END IF
607 ELSE
608!=========== NO PAW ===============
609! This term is taken care of using the core density as in GPW
610 cycle
611 END IF ! paw
612 END DO ! ikind
613
614 CALL para_env%sum(energy_hartree_1c)
615 CALL para_env%sum(qs_charges%total_rho1_hard_nuc)
616 CALL para_env%sum(rho0_mpole%tot_rhoz_cneo_s)
617
618 CALL timestop(handle)
619
620 END SUBROUTINE vh_1c_gg_integrals
621
622! **************************************************************************************************
623
624! **************************************************************************************************
625!> \brief ...
626!> \param rho_atom ...
627!> \param vrrad_0 ...
628!> \param grid_atom ...
629!> \param core_charge ...
630!> \param vrrad_z ...
631!> \param Vh1_h ...
632!> \param Vh1_s ...
633!> \param nchan_0 ...
634!> \param nspins ...
635!> \param max_iso_not0 ...
636!> \param bfactor ...
637! **************************************************************************************************
638 SUBROUTINE vh_1c_atom_potential(rho_atom, vrrad_0, &
639 grid_atom, core_charge, vrrad_z, Vh1_h, Vh1_s, &
640 nchan_0, nspins, max_iso_not0, bfactor)
641
642 TYPE(rho_atom_type), POINTER :: rho_atom
643 REAL(dp), DIMENSION(:, :), POINTER :: vrrad_0
644 TYPE(grid_atom_type), POINTER :: grid_atom
645 LOGICAL, INTENT(IN) :: core_charge
646 REAL(dp), DIMENSION(:), POINTER :: vrrad_z
647 REAL(dp), DIMENSION(:, :), POINTER :: vh1_h, vh1_s
648 INTEGER, INTENT(IN) :: nchan_0, nspins, max_iso_not0
649 REAL(dp), INTENT(IN) :: bfactor
650
651 INTEGER :: ir, iso, ispin, nr
652 TYPE(rho_atom_coeff), DIMENSION(:), POINTER :: vr_h, vr_s
653
654 nr = grid_atom%nr
655
656 NULLIFY (vr_h, vr_s)
657 CALL get_rho_atom(rho_atom=rho_atom, vrho_rad_h=vr_h, vrho_rad_s=vr_s)
658
659 vh1_h = 0.0_dp
660 vh1_s = 0.0_dp
661
662 IF (core_charge) vh1_h(:, 1) = vrrad_z(:)
663
664 DO iso = 1, nchan_0
665 vh1_s(:, iso) = vrrad_0(:, iso)
666 END DO
667
668 DO ispin = 1, nspins
669 DO iso = 1, max_iso_not0
670 vh1_h(:, iso) = vh1_h(:, iso) + vr_h(ispin)%r_coef(:, iso)
671 vh1_s(:, iso) = vh1_s(:, iso) + vr_s(ispin)%r_coef(:, iso)
672 END DO
673 END DO
674
675 IF (bfactor /= 0._dp) THEN
676 DO ir = 1, nr
677 vh1_h(ir, 1) = vh1_h(ir, 1) + bfactor*grid_atom%rad2(ir)*grid_atom%wr(ir)
678 vh1_s(ir, 1) = vh1_s(ir, 1) + bfactor*grid_atom%rad2(ir)*grid_atom%wr(ir)
679 END DO
680 END IF
681
682 END SUBROUTINE vh_1c_atom_potential
683
684! **************************************************************************************************
685
686! **************************************************************************************************
687!> \brief ...
688!> \param energy_hartree_1c ...
689!> \param ecoul_1c ...
690!> \param rho_atom ...
691!> \param rrad_0 ...
692!> \param grid_atom ...
693!> \param iatom ...
694!> \param core_charge ...
695!> \param rrad_z ...
696!> \param Vh1_h ...
697!> \param Vh1_s ...
698!> \param nchan_0 ...
699!> \param nspins ...
700!> \param max_iso_not0 ...
701! **************************************************************************************************
702 SUBROUTINE vh_1c_atom_energy(energy_hartree_1c, ecoul_1c, rho_atom, rrad_0, &
703 grid_atom, iatom, core_charge, rrad_z, Vh1_h, Vh1_s, &
704 nchan_0, nspins, max_iso_not0)
705
706 REAL(dp), INTENT(INOUT) :: energy_hartree_1c
707 TYPE(ecoul_1center_type), DIMENSION(:), POINTER :: ecoul_1c
708 TYPE(rho_atom_type), POINTER :: rho_atom
709 REAL(dp), DIMENSION(:, :), POINTER :: rrad_0
710 TYPE(grid_atom_type), POINTER :: grid_atom
711 INTEGER, INTENT(IN) :: iatom
712 LOGICAL, INTENT(IN) :: core_charge
713 REAL(dp), DIMENSION(:), POINTER :: rrad_z
714 REAL(dp), DIMENSION(:, :), POINTER :: vh1_h, vh1_s
715 INTEGER, INTENT(IN) :: nchan_0, nspins, max_iso_not0
716
717 INTEGER :: iso, ispin, nr
718 REAL(dp) :: ecoul_1_0, ecoul_1_h, ecoul_1_s, &
719 ecoul_1_z
720 TYPE(rho_atom_coeff), DIMENSION(:), POINTER :: r_h, r_s
721
722 nr = grid_atom%nr
723
724 NULLIFY (r_h, r_s)
725 CALL get_rho_atom(rho_atom=rho_atom, rho_rad_h=r_h, rho_rad_s=r_s)
726
727 ! Calculate the contributions to Ecoul coming from Vh1_h*rhoz
728 ecoul_1_z = 0.0_dp
729 IF (core_charge) THEN
730 ecoul_1_z = 0.5_dp*sum(vh1_h(:, 1)*rrad_z(:)*grid_atom%wr(:))
731 END IF
732
733 ! Calculate the contributions to Ecoul coming from Vh1_s*rho0
734 ecoul_1_0 = 0.0_dp
735 DO iso = 1, nchan_0
736 ecoul_1_0 = ecoul_1_0 + 0.5_dp*sum(vh1_s(:, iso)*rrad_0(:, iso)*grid_atom%wr(:))
737 END DO
738
739 ! Calculate the contributions to Ecoul coming from Vh1_h*rho1_h and Vh1_s*rho1_s
740 ecoul_1_s = 0.0_dp
741 ecoul_1_h = 0.0_dp
742 DO ispin = 1, nspins
743 DO iso = 1, max_iso_not0
744 ecoul_1_s = ecoul_1_s + 0.5_dp*sum(vh1_s(:, iso)*r_s(ispin)%r_coef(:, iso)*grid_atom%wr(:))
745 ecoul_1_h = ecoul_1_h + 0.5_dp*sum(vh1_h(:, iso)*r_h(ispin)%r_coef(:, iso)*grid_atom%wr(:))
746 END DO
747 END DO
748
749 CALL set_ecoul_1c(ecoul_1c, iatom, ecoul_1_z=ecoul_1_z, ecoul_1_0=ecoul_1_0)
750 CALL set_ecoul_1c(ecoul_1c=ecoul_1c, iatom=iatom, ecoul_1_h=ecoul_1_h, ecoul_1_s=ecoul_1_s)
751
752 energy_hartree_1c = energy_hartree_1c + ecoul_1_z - ecoul_1_0
753 energy_hartree_1c = energy_hartree_1c + ecoul_1_h - ecoul_1_s
754
755 END SUBROUTINE vh_1c_atom_energy
756
757!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
758
759! **************************************************************************************************
760!> \brief ...
761!> \param rho_atom ...
762!> \param aVh1b_hh ...
763!> \param aVh1b_ss ...
764!> \param aVh1b_00 ...
765!> \param Vh1_h ...
766!> \param Vh1_s ...
767!> \param max_iso_not0 ...
768!> \param max_s_harm ...
769!> \param llmax ...
770!> \param cg_list ...
771!> \param cg_n_list ...
772!> \param nset ...
773!> \param npgf ...
774!> \param lmin ...
775!> \param lmax ...
776!> \param nsotot ...
777!> \param maxso ...
778!> \param nspins ...
779!> \param nchan_0 ...
780!> \param gsph ...
781!> \param g0_h_w ...
782!> \param my_CG ...
783!> \param Qlm_gg ...
784! **************************************************************************************************
785 SUBROUTINE vh_1c_atom_integrals(rho_atom, &
786 aVh1b_hh, aVh1b_ss, aVh1b_00, Vh1_h, Vh1_s, max_iso_not0, &
787 max_s_harm, llmax, cg_list, cg_n_list, &
788 nset, npgf, lmin, lmax, nsotot, maxso, nspins, nchan_0, gsph, &
789 g0_h_w, my_CG, Qlm_gg)
790
791 TYPE(rho_atom_type), POINTER :: rho_atom
792 REAL(dp), DIMENSION(:, :) :: avh1b_hh, avh1b_ss, avh1b_00
793 REAL(dp), DIMENSION(:, :), POINTER :: vh1_h, vh1_s
794 INTEGER, INTENT(IN) :: max_iso_not0, max_s_harm, llmax
795 INTEGER, DIMENSION(:, :, :) :: cg_list
796 INTEGER, DIMENSION(:) :: cg_n_list
797 INTEGER, INTENT(IN) :: nset
798 INTEGER, DIMENSION(:), POINTER :: npgf, lmin, lmax
799 INTEGER, INTENT(IN) :: nsotot, maxso, nspins, nchan_0
800 REAL(dp), DIMENSION(:, :), POINTER :: gsph
801 REAL(dp), DIMENSION(:, 0:) :: g0_h_w
802 REAL(dp), DIMENSION(:, :, :), POINTER :: my_cg, qlm_gg
803
804 INTEGER :: icg, ipgf1, ipgf2, ir, is1, is2, iset1, &
805 iset2, iso, iso1, iso2, ispin, l_ang, &
806 m1, m2, max_iso_not0_local, n1, n2, nr
807 REAL(dp) :: gvg_0, gvg_h, gvg_s
808 TYPE(rho_atom_coeff), DIMENSION(:), POINTER :: int_local_h, int_local_s
809
810 NULLIFY (int_local_h, int_local_s)
811 CALL get_rho_atom(rho_atom=rho_atom, &
812 ga_vlocal_gb_h=int_local_h, &
813 ga_vlocal_gb_s=int_local_s)
814
815 ! Calculate the integrals of the potential with 2 primitives
816 avh1b_hh = 0.0_dp
817 avh1b_ss = 0.0_dp
818 avh1b_00 = 0.0_dp
819
820 nr = SIZE(gsph, 1)
821
822 m1 = 0
823 DO iset1 = 1, nset
824 m2 = 0
825 DO iset2 = 1, nset
826 CALL get_none0_cg_list(my_cg, lmin(iset1), lmax(iset1), lmin(iset2), lmax(iset2), &
827 max_s_harm, llmax, cg_list, cg_n_list, max_iso_not0_local)
828
829 n1 = nsoset(lmax(iset1))
830 DO ipgf1 = 1, npgf(iset1)
831 n2 = nsoset(lmax(iset2))
832 DO ipgf2 = 1, npgf(iset2)
833 ! with contributions to V1_s*rho0
834 DO iso = 1, min(nchan_0, max_iso_not0)
835 l_ang = indso(1, iso)
836 gvg_0 = sum(vh1_s(:, iso)*g0_h_w(:, l_ang))
837 DO icg = 1, cg_n_list(iso)
838 is1 = cg_list(1, icg, iso)
839 is2 = cg_list(2, icg, iso)
840
841 iso1 = is1 + n1*(ipgf1 - 1) + m1
842 iso2 = is2 + n2*(ipgf2 - 1) + m2
843 gvg_h = 0.0_dp
844 gvg_s = 0.0_dp
845
846 DO ir = 1, nr
847 gvg_h = gvg_h + gsph(ir, iso1)*gsph(ir, iso2)*vh1_h(ir, iso)
848 gvg_s = gvg_s + gsph(ir, iso1)*gsph(ir, iso2)*vh1_s(ir, iso)
849 END DO ! ir
850
851 avh1b_hh(iso1, iso2) = avh1b_hh(iso1, iso2) + gvg_h*my_cg(is1, is2, iso)
852 avh1b_ss(iso1, iso2) = avh1b_ss(iso1, iso2) + gvg_s*my_cg(is1, is2, iso)
853 avh1b_00(iso1, iso2) = avh1b_00(iso1, iso2) + gvg_0*qlm_gg(iso1, iso2, iso)
854
855 END DO !icg
856 END DO ! iso
857 ! without contributions to V1_s*rho0
858 DO iso = nchan_0 + 1, max_iso_not0
859 DO icg = 1, cg_n_list(iso)
860 is1 = cg_list(1, icg, iso)
861 is2 = cg_list(2, icg, iso)
862
863 iso1 = is1 + n1*(ipgf1 - 1) + m1
864 iso2 = is2 + n2*(ipgf2 - 1) + m2
865 gvg_h = 0.0_dp
866 gvg_s = 0.0_dp
867
868 DO ir = 1, nr
869 gvg_h = gvg_h + gsph(ir, iso1)*gsph(ir, iso2)*vh1_h(ir, iso)
870 gvg_s = gvg_s + gsph(ir, iso1)*gsph(ir, iso2)*vh1_s(ir, iso)
871 END DO ! ir
872
873 avh1b_hh(iso1, iso2) = avh1b_hh(iso1, iso2) + gvg_h*my_cg(is1, is2, iso)
874 avh1b_ss(iso1, iso2) = avh1b_ss(iso1, iso2) + gvg_s*my_cg(is1, is2, iso)
875
876 END DO !icg
877 END DO ! iso
878 END DO ! ipgf2
879 END DO ! ipgf1
880 m2 = m2 + maxso
881 END DO ! iset2
882 m1 = m1 + maxso
883 END DO !iset1
884 DO ispin = 1, nspins
885 CALL daxpy(nsotot*nsotot, 1.0_dp, avh1b_hh, 1, int_local_h(ispin)%r_coef, 1)
886 CALL daxpy(nsotot*nsotot, 1.0_dp, avh1b_ss, 1, int_local_s(ispin)%r_coef, 1)
887 CALL daxpy(nsotot*nsotot, -1.0_dp, avh1b_00, 1, int_local_h(ispin)%r_coef, 1)
888 CALL daxpy(nsotot*nsotot, -1.0_dp, avh1b_00, 1, int_local_s(ispin)%r_coef, 1)
889 END DO ! ispin
890
891 END SUBROUTINE vh_1c_atom_integrals
892
893!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
894
895END MODULE hartree_local_methods
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum)
...
Handles all functions related to the CELL.
Definition cell_types.F:15
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public init_coulomb_local(hartree_local, natom)
...
subroutine, public vh_1c_gg_integrals(qs_env, energy_hartree_1c, ecoul_1c, local_rho_set, para_env, tddft, local_rho_set_2nd, core_2nd)
Calculates one center GAPW Hartree energies and matrix elements Hartree potentials are input Takes po...
subroutine, public calculate_vh_1center(vrad_h, vrad_s, rrad_h, rrad_s, rrad_0, rrad_z, grid_atom)
Calculates Hartree potential for hard and soft densities (including nuclear charge and compensation c...
subroutine, public allocate_ecoul_1center(ecoul_1c, natom)
...
subroutine, public set_ecoul_1c(ecoul_1c, iatom, ecoul_1_h, ecoul_1_s, ecoul_1_z, ecoul_1_0)
...
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), parameter, public fourpi
Interface to the message passing library MPI.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public nsoset
integer, dimension(:, :), allocatable, public indso
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
functions related to the poisson solver on regular grids
integer, parameter, public pw_poisson_periodic
container for information about total charges on the grids
A collection of functions used by CNEO-DFT (see J. Chem. Theory Comput. 2025, 21, 16,...
subroutine, public vh_1c_nuc_integrals(rhoz_cneo, zeff, avh1b_hh, avh1b_ss, avh1b_00, vh1_h, vh1_s, max_iso_not0_elec, max_iso_not0_nuc, max_s_harm, llmax, cg_list, cg_n_list, nset, npgf, lmin, lmax, nsotot, maxso, nchan_0, gsph, g0_h_w, my_cg, qlm_gg)
Mostly copied from hartree_local_methods::Vh_1c_atom_integrals.
subroutine, public calculate_rhoz_cneo(rho, potential, cg_list, cg_n_list, nset, npgf, lmin, lmax, maxl, maxso)
...
Types used by CNEO-DFT (see J. Chem. Theory Comput. 2025, 21, 16, 7865–7877)
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_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, 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, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_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, harris_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, eeq, rhs, do_rixs, tb_tblite)
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, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, 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_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_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
subroutine, public get_local_rho(local_rho_set, rho_atom_set, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_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)
...
subroutine, public get_rho_atom(rho_atom, cpc_h, cpc_s, rho_rad_h, rho_rad_s, drho_rad_h, drho_rad_s, vrho_rad_h, vrho_rad_s, rho_rad_h_d, rho_rad_s_d, ga_vlocal_gb_h, ga_vlocal_gb_s, int_scr_h, int_scr_s)
...
All kind of helpful little routines.
Definition util.F:14
pure integer function, dimension(2), public get_limit(m, n, me)
divide m entries into n parts, return size of part me
Definition util.F:333
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
Container for information about total charges on the grids.
Provides all information about a quickstep kind.