20#include "./base/base_uses.f90"
26 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_cneo_types'
30 LOGICAL :: ready = .false.
31 REAL(
dp),
DIMENSION(:, :), &
32 POINTER :: pmat => null(), &
37 REAL(
dp),
DIMENSION(3) &
38 :: f = [0.0_dp, 0.0_dp, 0.0_dp]
39 REAL(
dp) :: e_core = 0.0_dp
40 REAL(
dp),
DIMENSION(:, :), &
41 POINTER :: cpc_h => null(), &
43 rho_rad_h => null(), &
44 rho_rad_s => null(), &
45 vrho_rad_h => null(), &
46 vrho_rad_s => null(), &
47 ga_vlocal_gb_h => null(), &
48 ga_vlocal_gb_s => null()
55 REAL(
dp) :: zeff = 0.0_dp, &
57 INTEGER,
DIMENSION(:), &
58 POINTER :: elec_conf => null()
59 INTEGER :: nsgf = 0, &
63 REAL(
dp),
DIMENSION(:, :), &
64 POINTER :: my_gcc_h => null(), &
69 REAL(
dp),
DIMENSION(:, :, :), &
70 POINTER :: distance => null()
72 POINTER :: harmonics => null()
73 REAL(
dp),
DIMENSION(:, :, :), &
74 POINTER :: qlm_gg => null(), &
76 REAL(
dp),
DIMENSION(:, :, :, :), &
77 POINTER :: vgg => null()
78 INTEGER,
DIMENSION(:), &
79 POINTER :: n2oindex => null(), &
81 REAL(
dp),
DIMENSION(:, :), &
82 POINTER :: rad2l => null(), &
105 INTEGER,
INTENT(IN) :: natom
107 IF (
ASSOCIATED(rhoz_cneo_set))
THEN
111 ALLOCATE (rhoz_cneo_set(natom))
119 SUBROUTINE deallocate_rhoz_cneo(rhoz_cneo)
123 IF (
ASSOCIATED(rhoz_cneo))
THEN
124 IF (
ASSOCIATED(rhoz_cneo%pmat))
THEN
125 DEALLOCATE (rhoz_cneo%pmat)
127 IF (
ASSOCIATED(rhoz_cneo%core))
THEN
128 DEALLOCATE (rhoz_cneo%core)
130 IF (
ASSOCIATED(rhoz_cneo%vmat))
THEN
131 DEALLOCATE (rhoz_cneo%vmat)
133 IF (
ASSOCIATED(rhoz_cneo%fmat))
THEN
134 DEALLOCATE (rhoz_cneo%fmat)
136 IF (
ASSOCIATED(rhoz_cneo%wfn))
THEN
137 DEALLOCATE (rhoz_cneo%wfn)
139 IF (
ASSOCIATED(rhoz_cneo%cpc_h))
THEN
140 DEALLOCATE (rhoz_cneo%cpc_h)
142 IF (
ASSOCIATED(rhoz_cneo%cpc_s))
THEN
143 DEALLOCATE (rhoz_cneo%cpc_s)
145 IF (
ASSOCIATED(rhoz_cneo%rho_rad_h))
THEN
146 DEALLOCATE (rhoz_cneo%rho_rad_h)
148 IF (
ASSOCIATED(rhoz_cneo%rho_rad_s))
THEN
149 DEALLOCATE (rhoz_cneo%rho_rad_s)
151 IF (
ASSOCIATED(rhoz_cneo%vrho_rad_h))
THEN
152 DEALLOCATE (rhoz_cneo%vrho_rad_h)
154 IF (
ASSOCIATED(rhoz_cneo%vrho_rad_s))
THEN
155 DEALLOCATE (rhoz_cneo%vrho_rad_s)
157 IF (
ASSOCIATED(rhoz_cneo%ga_Vlocal_gb_h))
THEN
158 DEALLOCATE (rhoz_cneo%ga_Vlocal_gb_h)
160 IF (
ASSOCIATED(rhoz_cneo%ga_Vlocal_gb_s))
THEN
161 DEALLOCATE (rhoz_cneo%ga_Vlocal_gb_s)
165 END SUBROUTINE deallocate_rhoz_cneo
175 INTEGER :: iat, natom
178 IF (
ASSOCIATED(rhoz_cneo_set))
THEN
179 natom =
SIZE(rhoz_cneo_set)
181 rhoz_cneo => rhoz_cneo_set(iat)
182 CALL deallocate_rhoz_cneo(rhoz_cneo)
184 DEALLOCATE (rhoz_cneo_set)
197 IF (
ASSOCIATED(potential))
THEN
213 IF (
ASSOCIATED(potential))
THEN
214 IF (
ASSOCIATED(potential%elec_conf))
THEN
215 DEALLOCATE (potential%elec_conf)
217 IF (
ASSOCIATED(potential%my_gcc_h))
THEN
218 DEALLOCATE (potential%my_gcc_h)
220 IF (
ASSOCIATED(potential%my_gcc_s))
THEN
221 DEALLOCATE (potential%my_gcc_s)
223 IF (
ASSOCIATED(potential%ovlp))
THEN
224 DEALLOCATE (potential%ovlp)
226 IF (
ASSOCIATED(potential%kin))
THEN
227 DEALLOCATE (potential%kin)
229 IF (
ASSOCIATED(potential%utrans))
THEN
230 DEALLOCATE (potential%utrans)
232 IF (
ASSOCIATED(potential%distance))
THEN
233 DEALLOCATE (potential%distance)
235 IF (
ASSOCIATED(potential%harmonics))
THEN
238 IF (
ASSOCIATED(potential%Qlm_gg))
THEN
239 DEALLOCATE (potential%Qlm_gg)
241 IF (
ASSOCIATED(potential%gg))
THEN
242 DEALLOCATE (potential%gg)
244 IF (
ASSOCIATED(potential%vgg))
THEN
245 DEALLOCATE (potential%vgg)
247 IF (
ASSOCIATED(potential%n2oindex))
THEN
248 DEALLOCATE (potential%n2oindex)
250 IF (
ASSOCIATED(potential%o2nindex))
THEN
251 DEALLOCATE (potential%o2nindex)
253 IF (
ASSOCIATED(potential%rad2l))
THEN
254 DEALLOCATE (potential%rad2l)
256 IF (
ASSOCIATED(potential%oorad2l))
THEN
257 DEALLOCATE (potential%oorad2l)
259 DEALLOCATE (potential)
291 nsotot, my_gcc_h, my_gcc_s, ovlp, kin, utrans, distance, &
292 harmonics, Qlm_gg, gg, vgg, n2oindex, o2nindex, rad2l, oorad2l)
295 INTEGER,
INTENT(OUT),
OPTIONAL :: z
296 REAL(
dp),
INTENT(OUT),
OPTIONAL :: zeff, mass
297 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: elec_conf
298 INTEGER,
INTENT(OUT),
OPTIONAL :: nsgf, nne, npsgf, nsotot
299 REAL(
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: my_gcc_h, my_gcc_s, ovlp, kin, utrans
300 REAL(
dp),
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: distance
302 REAL(
dp),
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: qlm_gg, gg
303 REAL(
dp),
DIMENSION(:, :, :, :),
OPTIONAL,
POINTER :: vgg
304 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: n2oindex, o2nindex
305 REAL(
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: rad2l, oorad2l
307 IF (
ASSOCIATED(potential))
THEN
309 IF (
PRESENT(z)) z = potential%z
310 IF (
PRESENT(zeff)) zeff = potential%zeff
311 IF (
PRESENT(mass)) mass = potential%mass
312 IF (
PRESENT(elec_conf)) elec_conf => potential%elec_conf
313 IF (
PRESENT(nsgf)) nsgf = potential%nsgf
314 IF (
PRESENT(nne)) nne = potential%nne
315 IF (
PRESENT(npsgf)) npsgf = potential%npsgf
316 IF (
PRESENT(nsotot)) nsotot = potential%nsotot
317 IF (
PRESENT(my_gcc_h)) my_gcc_h => potential%my_gcc_h
318 IF (
PRESENT(my_gcc_s)) my_gcc_s => potential%my_gcc_s
319 IF (
PRESENT(ovlp)) ovlp => potential%ovlp
320 IF (
PRESENT(kin)) kin => potential%kin
321 IF (
PRESENT(ovlp)) ovlp => potential%ovlp
322 IF (
PRESENT(utrans)) utrans => potential%utrans
323 IF (
PRESENT(distance)) distance => potential%distance
324 IF (
PRESENT(harmonics)) harmonics => potential%harmonics
325 IF (
PRESENT(qlm_gg)) qlm_gg => potential%Qlm_gg
326 IF (
PRESENT(gg)) gg => potential%gg
327 IF (
PRESENT(vgg)) vgg => potential%vgg
328 IF (
PRESENT(n2oindex)) n2oindex => potential%n2oindex
329 IF (
PRESENT(o2nindex)) o2nindex => potential%o2nindex
330 IF (
PRESENT(rad2l)) rad2l => potential%rad2l
331 IF (
PRESENT(oorad2l)) oorad2l => potential%oorad2l
335 cpabort(
"The pointer potential is not associated.")
367 nsotot, my_gcc_h, my_gcc_s, ovlp, kin, utrans, distance, &
368 harmonics, Qlm_gg, gg, vgg, n2oindex, o2nindex, rad2l, oorad2l)
371 INTEGER,
INTENT(IN),
OPTIONAL :: z
372 REAL(
dp),
INTENT(IN),
OPTIONAL :: mass
373 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: elec_conf
374 INTEGER,
INTENT(IN),
OPTIONAL :: nsgf, nne, npsgf, nsotot
375 REAL(
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: my_gcc_h, my_gcc_s, ovlp, kin, utrans
376 REAL(
dp),
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: distance
378 REAL(
dp),
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: qlm_gg, gg
379 REAL(
dp),
DIMENSION(:, :, :, :),
OPTIONAL,
POINTER :: vgg
380 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: n2oindex, o2nindex
381 REAL(
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: rad2l, oorad2l
383 IF (
ASSOCIATED(potential))
THEN
387 potential%zeff = real(z,
dp)
388 IF (
ASSOCIATED(potential%elec_conf))
THEN
389 cpabort(
"elec_conf is already associated")
391 ALLOCATE (potential%elec_conf(0:3))
392 potential%elec_conf(0:3) =
ptable(z)%e_conv(0:3)
393 cpassert(potential%mass == 0.0_dp)
397 potential%mass = 1.007825_dp - 0.000548579909_dp
401 potential%mass =
ptable(z)%amass - 0.000548579909_dp*real(z,
dp)
404 IF (
PRESENT(mass))
THEN
405 potential%mass = mass
407 IF (
PRESENT(elec_conf))
THEN
408 IF (
ASSOCIATED(potential%elec_conf))
THEN
409 DEALLOCATE (potential%elec_conf)
411 ALLOCATE (potential%elec_conf(0:
SIZE(elec_conf) - 1))
412 potential%elec_conf(:) = elec_conf(:)
414 IF (
PRESENT(nsgf)) potential%nsgf = nsgf
415 IF (
PRESENT(nne)) potential%nne = nne
416 IF (
PRESENT(npsgf)) potential%npsgf = npsgf
417 IF (
PRESENT(nsotot)) potential%nsotot = nsotot
418 IF (
PRESENT(my_gcc_h)) potential%my_gcc_h => my_gcc_h
419 IF (
PRESENT(my_gcc_s)) potential%my_gcc_s => my_gcc_s
420 IF (
PRESENT(ovlp)) potential%ovlp => ovlp
421 IF (
PRESENT(kin)) potential%kin => kin
422 IF (
PRESENT(utrans)) potential%utrans => utrans
423 IF (
PRESENT(distance)) potential%distance => distance
424 IF (
PRESENT(harmonics)) potential%harmonics => harmonics
425 IF (
PRESENT(qlm_gg)) potential%Qlm_gg => qlm_gg
426 IF (
PRESENT(gg)) potential%gg => gg
427 IF (
PRESENT(vgg)) potential%vgg => vgg
428 IF (
PRESENT(n2oindex)) potential%n2oindex => n2oindex
429 IF (
PRESENT(o2nindex)) potential%o2nindex => o2nindex
430 IF (
PRESENT(rad2l)) potential%rad2l => rad2l
431 IF (
PRESENT(oorad2l)) potential%oorad2l => oorad2l
435 cpabort(
"The pointer potential is not associated")
449 INTEGER,
INTENT(IN) :: output_unit
451 CHARACTER(LEN=20) :: string
453 IF (output_unit > 0 .AND.
ASSOCIATED(potential))
THEN
454 WRITE (unit=output_unit, fmt=
"(/,T6,A,/)") &
455 "CNEO Potential information"
456 WRITE (unit=output_unit, fmt=
"(T8,A,T41,A,I4,A,F11.6)") &
457 "Description: ",
"Z =", potential%z, &
458 ", nuclear mass =", potential%mass
459 WRITE (unit=string, fmt=
"(5I4)") potential%elec_conf
460 WRITE (unit=output_unit, fmt=
"(T8,A,T61,A20)") &
461 "Electronic configuration (s p d ...):", &
462 adjustr(trim(string))
Defines the basic variable types.
integer, parameter, public dp
Periodic Table related data definitions.
type(atom), dimension(0:nelem), public ptable
Types used by CNEO-DFT (see J. Chem. Theory Comput. 2025, 21, 16, 7865–7877)
subroutine, public allocate_cneo_potential(potential)
...
subroutine, public write_cneo_potential(potential, output_unit)
...
subroutine, public deallocate_rhoz_cneo_set(rhoz_cneo_set)
...
subroutine, public deallocate_cneo_potential(potential)
...
subroutine, public set_cneo_potential(potential, z, mass, elec_conf, nsgf, nne, npsgf, nsotot, my_gcc_h, my_gcc_s, ovlp, kin, utrans, distance, harmonics, qlm_gg, gg, vgg, n2oindex, o2nindex, rad2l, oorad2l)
...
subroutine, public get_cneo_potential(potential, z, zeff, mass, elec_conf, nsgf, nne, npsgf, nsotot, my_gcc_h, my_gcc_s, ovlp, kin, utrans, distance, harmonics, qlm_gg, gg, vgg, n2oindex, o2nindex, rad2l, oorad2l)
...
subroutine, public allocate_rhoz_cneo_set(rhoz_cneo_set, natom)
...
subroutine, public deallocate_harmonics_atom(harmonics)
Deallocate the spherical harmonics set for the atom grid.