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)) &
125 DEALLOCATE (rhoz_cneo%pmat)
126 IF (
ASSOCIATED(rhoz_cneo%core)) &
127 DEALLOCATE (rhoz_cneo%core)
128 IF (
ASSOCIATED(rhoz_cneo%vmat)) &
129 DEALLOCATE (rhoz_cneo%vmat)
130 IF (
ASSOCIATED(rhoz_cneo%fmat)) &
131 DEALLOCATE (rhoz_cneo%fmat)
132 IF (
ASSOCIATED(rhoz_cneo%wfn)) &
133 DEALLOCATE (rhoz_cneo%wfn)
134 IF (
ASSOCIATED(rhoz_cneo%cpc_h)) &
135 DEALLOCATE (rhoz_cneo%cpc_h)
136 IF (
ASSOCIATED(rhoz_cneo%cpc_s)) &
137 DEALLOCATE (rhoz_cneo%cpc_s)
138 IF (
ASSOCIATED(rhoz_cneo%rho_rad_h)) &
139 DEALLOCATE (rhoz_cneo%rho_rad_h)
140 IF (
ASSOCIATED(rhoz_cneo%rho_rad_s)) &
141 DEALLOCATE (rhoz_cneo%rho_rad_s)
142 IF (
ASSOCIATED(rhoz_cneo%vrho_rad_h)) &
143 DEALLOCATE (rhoz_cneo%vrho_rad_h)
144 IF (
ASSOCIATED(rhoz_cneo%vrho_rad_s)) &
145 DEALLOCATE (rhoz_cneo%vrho_rad_s)
146 IF (
ASSOCIATED(rhoz_cneo%ga_Vlocal_gb_h)) &
147 DEALLOCATE (rhoz_cneo%ga_Vlocal_gb_h)
148 IF (
ASSOCIATED(rhoz_cneo%ga_Vlocal_gb_s)) &
149 DEALLOCATE (rhoz_cneo%ga_Vlocal_gb_s)
152 END SUBROUTINE deallocate_rhoz_cneo
162 INTEGER :: iat, natom
165 IF (
ASSOCIATED(rhoz_cneo_set))
THEN
166 natom =
SIZE(rhoz_cneo_set)
168 rhoz_cneo => rhoz_cneo_set(iat)
169 CALL deallocate_rhoz_cneo(rhoz_cneo)
171 DEALLOCATE (rhoz_cneo_set)
184 IF (
ASSOCIATED(potential)) &
199 IF (
ASSOCIATED(potential))
THEN
200 IF (
ASSOCIATED(potential%elec_conf)) &
201 DEALLOCATE (potential%elec_conf)
202 IF (
ASSOCIATED(potential%my_gcc_h)) &
203 DEALLOCATE (potential%my_gcc_h)
204 IF (
ASSOCIATED(potential%my_gcc_s)) &
205 DEALLOCATE (potential%my_gcc_s)
206 IF (
ASSOCIATED(potential%ovlp)) &
207 DEALLOCATE (potential%ovlp)
208 IF (
ASSOCIATED(potential%kin)) &
209 DEALLOCATE (potential%kin)
210 IF (
ASSOCIATED(potential%utrans)) &
211 DEALLOCATE (potential%utrans)
212 IF (
ASSOCIATED(potential%distance)) &
213 DEALLOCATE (potential%distance)
214 IF (
ASSOCIATED(potential%harmonics)) &
216 IF (
ASSOCIATED(potential%Qlm_gg)) &
217 DEALLOCATE (potential%Qlm_gg)
218 IF (
ASSOCIATED(potential%gg)) &
219 DEALLOCATE (potential%gg)
220 IF (
ASSOCIATED(potential%vgg)) &
221 DEALLOCATE (potential%vgg)
222 IF (
ASSOCIATED(potential%n2oindex)) &
223 DEALLOCATE (potential%n2oindex)
224 IF (
ASSOCIATED(potential%o2nindex)) &
225 DEALLOCATE (potential%o2nindex)
226 IF (
ASSOCIATED(potential%rad2l)) &
227 DEALLOCATE (potential%rad2l)
228 IF (
ASSOCIATED(potential%oorad2l)) &
229 DEALLOCATE (potential%oorad2l)
230 DEALLOCATE (potential)
262 nsotot, my_gcc_h, my_gcc_s, ovlp, kin, utrans, distance, &
263 harmonics, Qlm_gg, gg, vgg, n2oindex, o2nindex, rad2l, oorad2l)
266 INTEGER,
INTENT(OUT),
OPTIONAL :: z
267 REAL(
dp),
INTENT(OUT),
OPTIONAL :: zeff, mass
268 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: elec_conf
269 INTEGER,
INTENT(OUT),
OPTIONAL :: nsgf, nne, npsgf, nsotot
270 REAL(
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: my_gcc_h, my_gcc_s, ovlp, kin, utrans
271 REAL(
dp),
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: distance
273 REAL(
dp),
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: qlm_gg, gg
274 REAL(
dp),
DIMENSION(:, :, :, :),
OPTIONAL,
POINTER :: vgg
275 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: n2oindex, o2nindex
276 REAL(
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: rad2l, oorad2l
278 IF (
ASSOCIATED(potential))
THEN
280 IF (
PRESENT(z)) z = potential%z
281 IF (
PRESENT(zeff)) zeff = potential%zeff
282 IF (
PRESENT(mass)) mass = potential%mass
283 IF (
PRESENT(elec_conf)) elec_conf => potential%elec_conf
284 IF (
PRESENT(nsgf)) nsgf = potential%nsgf
285 IF (
PRESENT(nne)) nne = potential%nne
286 IF (
PRESENT(npsgf)) npsgf = potential%npsgf
287 IF (
PRESENT(nsotot)) nsotot = potential%nsotot
288 IF (
PRESENT(my_gcc_h)) my_gcc_h => potential%my_gcc_h
289 IF (
PRESENT(my_gcc_s)) my_gcc_s => potential%my_gcc_s
290 IF (
PRESENT(ovlp)) ovlp => potential%ovlp
291 IF (
PRESENT(kin)) kin => potential%kin
292 IF (
PRESENT(ovlp)) ovlp => potential%ovlp
293 IF (
PRESENT(utrans)) utrans => potential%utrans
294 IF (
PRESENT(distance)) distance => potential%distance
295 IF (
PRESENT(harmonics)) harmonics => potential%harmonics
296 IF (
PRESENT(qlm_gg)) qlm_gg => potential%Qlm_gg
297 IF (
PRESENT(gg)) gg => potential%gg
298 IF (
PRESENT(vgg)) vgg => potential%vgg
299 IF (
PRESENT(n2oindex)) n2oindex => potential%n2oindex
300 IF (
PRESENT(o2nindex)) o2nindex => potential%o2nindex
301 IF (
PRESENT(rad2l)) rad2l => potential%rad2l
302 IF (
PRESENT(oorad2l)) oorad2l => potential%oorad2l
306 cpabort(
"The pointer potential is not associated.")
338 nsotot, my_gcc_h, my_gcc_s, ovlp, kin, utrans, distance, &
339 harmonics, Qlm_gg, gg, vgg, n2oindex, o2nindex, rad2l, oorad2l)
342 INTEGER,
INTENT(IN),
OPTIONAL :: z
343 REAL(
dp),
INTENT(IN),
OPTIONAL :: mass
344 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: elec_conf
345 INTEGER,
INTENT(IN),
OPTIONAL :: nsgf, nne, npsgf, nsotot
346 REAL(
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: my_gcc_h, my_gcc_s, ovlp, kin, utrans
347 REAL(
dp),
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: distance
349 REAL(
dp),
DIMENSION(:, :, :),
OPTIONAL,
POINTER :: qlm_gg, gg
350 REAL(
dp),
DIMENSION(:, :, :, :),
OPTIONAL,
POINTER :: vgg
351 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: n2oindex, o2nindex
352 REAL(
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: rad2l, oorad2l
354 IF (
ASSOCIATED(potential))
THEN
358 potential%zeff = real(z,
dp)
359 IF (
ASSOCIATED(potential%elec_conf)) &
360 cpabort(
"elec_conf is already associated")
361 ALLOCATE (potential%elec_conf(0:3))
362 potential%elec_conf(0:3) =
ptable(z)%e_conv(0:3)
363 cpassert(potential%mass == 0.0_dp)
367 potential%mass = 1.007825_dp - 0.000548579909_dp
371 potential%mass =
ptable(z)%amass - 0.000548579909_dp*real(z,
dp)
374 IF (
PRESENT(mass))
THEN
375 potential%mass = mass
377 IF (
PRESENT(elec_conf))
THEN
378 IF (
ASSOCIATED(potential%elec_conf))
THEN
379 DEALLOCATE (potential%elec_conf)
381 ALLOCATE (potential%elec_conf(0:
SIZE(elec_conf) - 1))
382 potential%elec_conf(:) = elec_conf(:)
384 IF (
PRESENT(nsgf)) potential%nsgf = nsgf
385 IF (
PRESENT(nne)) potential%nne = nne
386 IF (
PRESENT(npsgf)) potential%npsgf = npsgf
387 IF (
PRESENT(nsotot)) potential%nsotot = nsotot
388 IF (
PRESENT(my_gcc_h)) potential%my_gcc_h => my_gcc_h
389 IF (
PRESENT(my_gcc_s)) potential%my_gcc_s => my_gcc_s
390 IF (
PRESENT(ovlp)) potential%ovlp => ovlp
391 IF (
PRESENT(kin)) potential%kin => kin
392 IF (
PRESENT(utrans)) potential%utrans => utrans
393 IF (
PRESENT(distance)) potential%distance => distance
394 IF (
PRESENT(harmonics)) potential%harmonics => harmonics
395 IF (
PRESENT(qlm_gg)) potential%Qlm_gg => qlm_gg
396 IF (
PRESENT(gg)) potential%gg => gg
397 IF (
PRESENT(vgg)) potential%vgg => vgg
398 IF (
PRESENT(n2oindex)) potential%n2oindex => n2oindex
399 IF (
PRESENT(o2nindex)) potential%o2nindex => o2nindex
400 IF (
PRESENT(rad2l)) potential%rad2l => rad2l
401 IF (
PRESENT(oorad2l)) potential%oorad2l => oorad2l
405 cpabort(
"The pointer potential is not associated")
419 INTEGER,
INTENT(IN) :: output_unit
421 CHARACTER(LEN=20) :: string
423 IF (output_unit > 0 .AND.
ASSOCIATED(potential))
THEN
424 WRITE (unit=output_unit, fmt=
"(/,T6,A,/)") &
425 "CNEO Potential information"
426 WRITE (unit=output_unit, fmt=
"(T8,A,T41,A,I4,A,F11.6)") &
427 "Description: ",
"Z =", potential%z, &
428 ", nuclear mass =", potential%mass
429 WRITE (unit=string, fmt=
"(5I4)") potential%elec_conf
430 WRITE (unit=output_unit, fmt=
"(T8,A,T61,A20)") &
431 "Electronic configuration (s p d ...):", &
432 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.