(git:374b731)
Loading...
Searching...
No Matches
atom_energy.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
11 USE atom_fit, ONLY: atom_fit_density,&
20 USE atom_output, ONLY: atom_print_basis,&
27 USE atom_types, ONLY: &
33 USE atom_utils, ONLY: &
48 USE kinds, ONLY: default_string_length,&
49 dp
50 USE mathconstants, ONLY: dfac,&
51 gamma1,&
52 pi,&
53 rootpi
54 USE periodic_table, ONLY: nelem,&
55 ptable
56 USE physcon, ONLY: bohr
57#include "./base/base_uses.f90"
58
59 IMPLICIT NONE
60 PRIVATE
61 PUBLIC :: atom_energy_opt
62
63 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'atom_energy'
64
65CONTAINS
66
67! **************************************************************************************************
68!> \brief Compute the atomic energy.
69!> \param atom_section ATOM input section
70!> \par History
71!> * 11.2016 geometrical response basis set [Juerg Hutter]
72!> * 07.2016 ADMM analysis [Juerg Hutter]
73!> * 02.2014 non-additive kinetic energy term [Juerg Hutter]
74!> * 11.2013 Zhao, Morrison, and Parr (ZMP) potential [Daniele Varsano]
75!> * 02.2010 unrestricted KS and HF methods [Juerg Hutter]
76!> * 05.2009 electronic density fit [Juerg Hutter]
77!> * 04.2009 refactored and renamed to atom_energy_opt() [Juerg Hutter]
78!> * 08.2008 created as atom_energy() [Juerg Hutter]
79! **************************************************************************************************
80 SUBROUTINE atom_energy_opt(atom_section)
81 TYPE(section_vals_type), POINTER :: atom_section
82
83 CHARACTER(len=*), PARAMETER :: routinen = 'atom_energy_opt'
84
85 CHARACTER(LEN=2) :: elem
86 CHARACTER(LEN=default_string_length) :: filename
87 CHARACTER(LEN=default_string_length), &
88 DIMENSION(:), POINTER :: tmpstringlist
89 INTEGER :: do_eric, do_erie, handle, i, im, in, iw, k, maxl, mb, method, mo, n_meth, n_rep, &
90 nder, nr_gh, num_gau, num_gto, num_pol, reltyp, zcore, zval, zz
91 INTEGER, DIMENSION(0:lmat) :: maxn
92 INTEGER, DIMENSION(:), POINTER :: cn
93 LOGICAL :: dm, do_gh, do_zmp, doread, eri_c, eri_e, &
94 had_ae, had_pp, lcomp, lcond, pp_calc, &
95 read_vxc
96 REAL(kind=dp) :: crad, delta, lambda
97 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: ext_density, ext_vxc
98 REAL(kind=dp), DIMENSION(0:lmat, 10) :: pocc
99 TYPE(atom_basis_type), POINTER :: ae_basis, pp_basis
100 TYPE(atom_integrals), POINTER :: ae_int, pp_int
101 TYPE(atom_optimization_type) :: optimization
102 TYPE(atom_orbitals), POINTER :: orbitals
103 TYPE(atom_p_type), DIMENSION(:, :), POINTER :: atom_info
104 TYPE(atom_potential_type), POINTER :: ae_pot, p_pot
105 TYPE(atom_state), POINTER :: state
106 TYPE(cp_logger_type), POINTER :: logger
107 TYPE(section_vals_type), POINTER :: admm_section, basis_section, external_vxc_section, &
108 method_section, opt_section, potential_section, powell_section, sgp_section, xc_section, &
109 zmp_restart_section, zmp_section
110
111 CALL timeset(routinen, handle)
112
113 ! What atom do we calculate
114 CALL section_vals_val_get(atom_section, "ATOMIC_NUMBER", i_val=zval)
115 CALL section_vals_val_get(atom_section, "ELEMENT", c_val=elem)
116 zz = 0
117 DO i = 1, nelem
118 IF (ptable(i)%symbol == elem) THEN
119 zz = i
120 EXIT
121 END IF
122 END DO
123 IF (zz /= 1) zval = zz
124
125 ! read and set up inofrmation on the basis sets
126 ALLOCATE (ae_basis, pp_basis)
127 basis_section => section_vals_get_subs_vals(atom_section, "AE_BASIS")
128 NULLIFY (ae_basis%grid)
129 CALL init_atom_basis(ae_basis, basis_section, zval, "AE")
130 NULLIFY (pp_basis%grid)
131 basis_section => section_vals_get_subs_vals(atom_section, "PP_BASIS")
132 CALL init_atom_basis(pp_basis, basis_section, zval, "PP")
133
134 ! print general and basis set information
135 logger => cp_get_default_logger()
136 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%PROGRAM_BANNER", extension=".log")
137 IF (iw > 0) CALL atom_print_info(zval, "Atomic Energy Calculation", iw)
138 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%PROGRAM_BANNER")
139 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%BASIS_SET", extension=".log")
140 IF (iw > 0) THEN
141 CALL atom_print_basis(ae_basis, iw, " All Electron Basis")
142 CALL atom_print_basis(pp_basis, iw, " Pseudopotential Basis")
143 END IF
144 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%BASIS_SET")
145
146 ! read and setup information on the pseudopotential
147 NULLIFY (potential_section)
148 potential_section => section_vals_get_subs_vals(atom_section, "POTENTIAL")
149 ALLOCATE (ae_pot, p_pot)
150 CALL init_atom_potential(p_pot, potential_section, zval)
151 CALL init_atom_potential(ae_pot, potential_section, -1)
152
153 ! if the ERI's are calculated analytically, we have to precalculate them
154 eri_c = .false.
155 CALL section_vals_val_get(atom_section, "COULOMB_INTEGRALS", i_val=do_eric)
156 IF (do_eric == do_analytic) eri_c = .true.
157 eri_e = .false.
158 CALL section_vals_val_get(atom_section, "EXCHANGE_INTEGRALS", i_val=do_erie)
159 IF (do_erie == do_analytic) eri_e = .true.
160 CALL section_vals_val_get(atom_section, "USE_GAUSS_HERMITE", l_val=do_gh)
161 CALL section_vals_val_get(atom_section, "GRID_POINTS_GH", i_val=nr_gh)
162
163 ! information on the states to be calculated
164 CALL section_vals_val_get(atom_section, "MAX_ANGULAR_MOMENTUM", i_val=maxl)
165 maxn = 0
166 CALL section_vals_val_get(atom_section, "CALCULATE_STATES", i_vals=cn)
167 DO in = 1, min(SIZE(cn), 4)
168 maxn(in - 1) = cn(in)
169 END DO
170 DO in = 0, lmat
171 maxn(in) = min(maxn(in), ae_basis%nbas(in))
172 maxn(in) = min(maxn(in), pp_basis%nbas(in))
173 END DO
174
175 ! read optimization section
176 opt_section => section_vals_get_subs_vals(atom_section, "OPTIMIZATION")
177 CALL read_atom_opt_section(optimization, opt_section)
178
179 had_ae = .false.
180 had_pp = .false.
181
182 ! Check for the total number of electron configurations to be calculated
183 CALL section_vals_val_get(atom_section, "ELECTRON_CONFIGURATION", n_rep_val=n_rep)
184 ! Check for the total number of method types to be calculated
185 method_section => section_vals_get_subs_vals(atom_section, "METHOD")
186 CALL section_vals_get(method_section, n_repetition=n_meth)
187
188 ! integrals
189 ALLOCATE (ae_int, pp_int)
190
191 ALLOCATE (atom_info(n_rep, n_meth))
192
193 DO in = 1, n_rep
194 DO im = 1, n_meth
195
196 NULLIFY (atom_info(in, im)%atom)
197 CALL create_atom_type(atom_info(in, im)%atom)
198
199 atom_info(in, im)%atom%optimization = optimization
200
201 atom_info(in, im)%atom%z = zval
202 xc_section => section_vals_get_subs_vals(method_section, "XC", i_rep_section=im)
203 atom_info(in, im)%atom%xc_section => xc_section
204
205 ! ZMP Reading input sections if they are found initialize everything
206 do_zmp = .false.
207 doread = .false.
208 read_vxc = .false.
209
210 zmp_section => section_vals_get_subs_vals(method_section, "ZMP")
211 CALL section_vals_get(zmp_section, explicit=do_zmp)
212 atom_info(in, im)%atom%do_zmp = do_zmp
213 CALL section_vals_val_get(zmp_section, "FILE_DENSITY", c_val=filename)
214 atom_info(in, im)%atom%ext_file = filename
215 CALL section_vals_val_get(zmp_section, "GRID_TOL", &
216 r_val=atom_info(in, im)%atom%zmpgrid_tol)
217 CALL section_vals_val_get(zmp_section, "LAMBDA", r_val=lambda)
218 atom_info(in, im)%atom%lambda = lambda
219 CALL section_vals_val_get(zmp_section, "DM", l_val=dm)
220 atom_info(in, im)%atom%dm = dm
221
222 zmp_restart_section => section_vals_get_subs_vals(zmp_section, "RESTART")
223 CALL section_vals_get(zmp_restart_section, explicit=doread)
224 atom_info(in, im)%atom%doread = doread
225 CALL section_vals_val_get(zmp_restart_section, "FILE_RESTART", c_val=filename)
226 atom_info(in, im)%atom%zmp_restart_file = filename
227
228 ! ZMP Reading external vxc section, if found initialize
229 external_vxc_section => section_vals_get_subs_vals(method_section, "EXTERNAL_VXC")
230 CALL section_vals_get(external_vxc_section, explicit=read_vxc)
231 atom_info(in, im)%atom%read_vxc = read_vxc
232 CALL section_vals_val_get(external_vxc_section, "FILE_VXC", c_val=filename)
233 atom_info(in, im)%atom%ext_vxc_file = filename
234 CALL section_vals_val_get(external_vxc_section, "GRID_TOL", &
235 r_val=atom_info(in, im)%atom%zmpvxcgrid_tol)
236
237 ALLOCATE (state)
238
239 ! get the electronic configuration
240 CALL section_vals_val_get(atom_section, "ELECTRON_CONFIGURATION", i_rep_val=in, &
241 c_vals=tmpstringlist)
242
243 ! set occupations
244 CALL atom_set_occupation(tmpstringlist, state%occ, state%occupation, state%multiplicity)
245 state%maxl_occ = get_maxl_occ(state%occ)
246 state%maxn_occ = get_maxn_occ(state%occ)
247
248 ! set number of states to be calculated
249 state%maxl_calc = max(maxl, state%maxl_occ)
250 state%maxl_calc = min(lmat, state%maxl_calc)
251 state%maxn_calc = 0
252 DO k = 0, state%maxl_calc
253 state%maxn_calc(k) = max(maxn(k), state%maxn_occ(k))
254 END DO
255
256 ! is there a pseudo potential
257 pp_calc = any(index(tmpstringlist(1:), "CORE") /= 0)
258 IF (pp_calc) THEN
259 ! get and set the core occupations
260 CALL section_vals_val_get(atom_section, "CORE", c_vals=tmpstringlist)
261 CALL atom_set_occupation(tmpstringlist, state%core, pocc)
262 zcore = zval - nint(sum(state%core))
263 CALL set_atom(atom_info(in, im)%atom, zcore=zcore, pp_calc=.true.)
264 ELSE
265 state%core = 0._dp
266 CALL set_atom(atom_info(in, im)%atom, zcore=zval, pp_calc=.false.)
267 END IF
268
269 CALL section_vals_val_get(method_section, "METHOD_TYPE", i_val=method, i_rep_section=im)
270 CALL section_vals_val_get(method_section, "RELATIVISTIC", i_val=reltyp, i_rep_section=im)
271 CALL set_atom(atom_info(in, im)%atom, method_type=method, relativistic=reltyp)
272
273 IF (atom_consistent_method(method, state%multiplicity)) THEN
274 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%METHOD_INFO", extension=".log")
275 CALL atom_print_method(atom_info(in, im)%atom, iw)
276 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%METHOD_INFO")
277
278 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%POTENTIAL", extension=".log")
279 IF (pp_calc) THEN
280 IF (iw > 0) CALL atom_print_potential(p_pot, iw)
281 ELSE
282 IF (iw > 0) CALL atom_print_potential(ae_pot, iw)
283 END IF
284 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%POTENTIAL")
285 END IF
286
287 ! calculate integrals
288 IF (pp_calc) THEN
289 ! general integrals
290 CALL atom_int_setup(pp_int, pp_basis, &
291 potential=p_pot, eri_coulomb=eri_c, eri_exchange=eri_e)
292 ! potential
293 CALL atom_ppint_setup(pp_int, pp_basis, potential=p_pot)
294 !
295 NULLIFY (pp_int%tzora, pp_int%hdkh)
296 !
297 CALL set_atom(atom_info(in, im)%atom, basis=pp_basis, integrals=pp_int, potential=p_pot)
298 state%maxn_calc(:) = min(state%maxn_calc(:), pp_basis%nbas(:))
299 cpassert(all(state%maxn_calc(:) >= state%maxn_occ))
300 had_pp = .true.
301 ELSE
302 ! general integrals
303 CALL atom_int_setup(ae_int, ae_basis, potential=ae_pot, &
304 eri_coulomb=eri_c, eri_exchange=eri_e)
305 ! potential
306 CALL atom_ppint_setup(ae_int, ae_basis, potential=ae_pot)
307 ! relativistic correction terms
308 CALL atom_relint_setup(ae_int, ae_basis, reltyp, zcore=real(zval, dp))
309 !
310 CALL set_atom(atom_info(in, im)%atom, basis=ae_basis, integrals=ae_int, potential=ae_pot)
311 state%maxn_calc(:) = min(state%maxn_calc(:), ae_basis%nbas(:))
312 cpassert(all(state%maxn_calc(:) >= state%maxn_occ))
313 had_ae = .true.
314 END IF
315
316 CALL set_atom(atom_info(in, im)%atom, state=state)
317
318 CALL set_atom(atom_info(in, im)%atom, coulomb_integral_type=do_eric, &
319 exchange_integral_type=do_erie)
320 atom_info(in, im)%atom%hfx_pot%do_gh = do_gh
321 atom_info(in, im)%atom%hfx_pot%nr_gh = nr_gh
322
323 NULLIFY (orbitals)
324 mo = maxval(state%maxn_calc)
325 mb = maxval(atom_info(in, im)%atom%basis%nbas)
326 CALL create_atom_orbs(orbitals, mb, mo)
327 CALL set_atom(atom_info(in, im)%atom, orbitals=orbitals)
328
329 IF (atom_consistent_method(method, state%multiplicity)) THEN
330 !Calculate the electronic structure
331 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%SCF_INFO", extension=".log")
332 CALL calculate_atom(atom_info(in, im)%atom, iw)
333 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%SCF_INFO")
334
335 ! ZMP If we have the external density do zmp
336 IF (atom_info(in, im)%atom%do_zmp) THEN
337 CALL atom_write_zmp_restart(atom_info(in, im)%atom)
338
339 ALLOCATE (ext_density(atom_info(in, im)%atom%basis%grid%nr))
340 ext_density = 0._dp
341 CALL atom_read_external_density(ext_density, atom_info(in, im)%atom, iw)
342 CALL calculate_atom_zmp(ext_density=ext_density, &
343 atom=atom_info(in, im)%atom, &
344 lprint=.true.)
345 DEALLOCATE (ext_density)
346 END IF
347 ! ZMP If we have the external v_xc calculate KS quantities
348 IF (atom_info(in, im)%atom%read_vxc) THEN
349 ALLOCATE (ext_vxc(atom_info(in, im)%atom%basis%grid%nr))
350 ext_vxc = 0._dp
351 CALL atom_read_external_vxc(ext_vxc, atom_info(in, im)%atom, iw)
352 CALL calculate_atom_ext_vxc(vxc=ext_vxc, &
353 atom=atom_info(in, im)%atom, &
354 lprint=.true.)
355 DEALLOCATE (ext_vxc)
356 END IF
357
358 ! Print out the orbitals if requested
359 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%ORBITALS", extension=".log")
360 IF (iw > 0) THEN
361 CALL atom_print_orbitals(atom_info(in, im)%atom, iw)
362 END IF
363 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%ORBITALS")
364
365 ! perform a fit of the total electronic density
366 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%FIT_DENSITY", extension=".log")
367 IF (iw > 0) THEN
368 CALL section_vals_val_get(atom_section, "PRINT%FIT_DENSITY%NUM_GTO", i_val=num_gto)
369 powell_section => section_vals_get_subs_vals(atom_section, "POWELL")
370 CALL atom_fit_density(atom_info(in, im)%atom, num_gto, 0, iw, powell_section=powell_section)
371 END IF
372 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%FIT_DENSITY")
373
374 ! Optimize a local potential for the non-additive kinetic energy term in KG
375 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%FIT_KGPOT", extension=".log")
376 IF (iw > 0) THEN
377 CALL section_vals_val_get(atom_section, "PRINT%FIT_KGPOT%NUM_GAUSSIAN", i_val=num_gau)
378 CALL section_vals_val_get(atom_section, "PRINT%FIT_KGPOT%NUM_POLYNOM", i_val=num_pol)
379 powell_section => section_vals_get_subs_vals(atom_section, "POWELL")
380 CALL atom_fit_kgpot(atom_info(in, im)%atom, num_gau, num_pol, iw, powell_section=powell_section)
381 END IF
382 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%FIT_KGPOT")
383
384 ! generate a response basis
385 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%RESPONSE_BASIS", extension=".log")
386 IF (iw > 0) THEN
387 CALL section_vals_val_get(atom_section, "PRINT%RESPONSE_BASIS%DELTA_CHARGE", r_val=delta)
388 CALL section_vals_val_get(atom_section, "PRINT%RESPONSE_BASIS%DERIVATIVES", i_val=nder)
389 CALL atom_response_basis(atom_info(in, im)%atom, delta, nder, iw)
390 END IF
391 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%RESPONSE_BASIS")
392
393 ! generate a UPF file
394 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%UPF_FILE", extension=".upf", &
395 file_position="REWIND")
396 IF (iw > 0) THEN
397 CALL atom_write_upf(atom_info(in, im)%atom, iw)
398 END IF
399 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%UPF_FILE")
400 END IF
401
402 END DO
403 END DO
404
405 ! generate a geometrical response basis (GRB)
406 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%GEOMETRICAL_RESPONSE_BASIS", extension=".log")
407 IF (iw > 0) THEN
408 CALL atom_grb_construction(atom_info, atom_section, iw)
409 END IF
410 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%GEOMETRICAL_RESPONSE_BASIS")
411
412 ! Analyze basis sets
413 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%ANALYZE_BASIS", extension=".log")
414 IF (iw > 0) THEN
415 CALL section_vals_val_get(atom_section, "PRINT%ANALYZE_BASIS%OVERLAP_CONDITION_NUMBER", l_val=lcond)
416 CALL section_vals_val_get(atom_section, "PRINT%ANALYZE_BASIS%COMPLETENESS", l_val=lcomp)
417 crad = ptable(zval)%covalent_radius*bohr
418 IF (had_ae) THEN
419 IF (lcond) CALL atom_condnumber(ae_basis, crad, iw)
420 IF (lcomp) CALL atom_completeness(ae_basis, zval, iw)
421 END IF
422 IF (had_pp) THEN
423 IF (lcond) CALL atom_condnumber(pp_basis, crad, iw)
424 IF (lcomp) CALL atom_completeness(pp_basis, zval, iw)
425 END IF
426 END IF
427 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%ANALYZE_BASIS")
428
429 ! Analyse ADMM approximation
430 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%ADMM", extension=".log")
431 admm_section => section_vals_get_subs_vals(atom_section, "PRINT%ADMM")
432 IF (iw > 0) THEN
433 CALL atom_admm(atom_info, admm_section, iw)
434 END IF
435 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%ADMM")
436
437 ! Generate a separable form of the pseudopotential using Gaussian functions
438 iw = cp_print_key_unit_nr(logger, atom_section, "PRINT%SEPARABLE_GAUSSIAN_PSEUDO", extension=".log")
439 sgp_section => section_vals_get_subs_vals(atom_section, "PRINT%SEPARABLE_GAUSSIAN_PSEUDO")
440 IF (iw > 0) THEN
441 CALL atom_sgp_construction(atom_info, sgp_section, iw)
442 END IF
443 CALL cp_print_key_finished_output(iw, logger, atom_section, "PRINT%SEPARABLE_GAUSSIAN_PSEUDO")
444
445 ! clean up
446 IF (had_ae) THEN
447 CALL atom_int_release(ae_int)
448 CALL atom_ppint_release(ae_int)
449 CALL atom_relint_release(ae_int)
450 END IF
451 IF (had_pp) THEN
452 CALL atom_int_release(pp_int)
453 CALL atom_ppint_release(pp_int)
454 CALL atom_relint_release(pp_int)
455 END IF
456 CALL release_atom_basis(ae_basis)
457 CALL release_atom_basis(pp_basis)
458
459 CALL release_atom_potential(p_pot)
460 CALL release_atom_potential(ae_pot)
461
462 DO in = 1, n_rep
463 DO im = 1, n_meth
464 CALL release_atom_type(atom_info(in, im)%atom)
465 END DO
466 END DO
467 DEALLOCATE (atom_info)
468
469 DEALLOCATE (ae_pot, p_pot, ae_basis, pp_basis, ae_int, pp_int)
470
471 CALL timestop(handle)
472
473 END SUBROUTINE atom_energy_opt
474
475! **************************************************************************************************
476!> \brief Calculate response basis contraction coefficients.
477!> \param atom information about the atomic kind
478!> \param delta variation of charge used in finite difference derivative calculation
479!> \param nder number of wavefunction derivatives to calculate
480!> \param iw output file unit
481!> \par History
482!> * 10.2011 Gram-Schmidt orthogonalization [Joost VandeVondele]
483!> * 05.2009 created [Juerg Hutter]
484! **************************************************************************************************
485 SUBROUTINE atom_response_basis(atom, delta, nder, iw)
486
487 TYPE(atom_type), POINTER :: atom
488 REAL(kind=dp), INTENT(IN) :: delta
489 INTEGER, INTENT(IN) :: nder, iw
490
491 INTEGER :: i, ider, j, k, l, lhomo, m, n, nhomo, &
492 s1, s2
493 REAL(kind=dp) :: dene, emax, expzet, fhomo, o, prefac, &
494 zeta
495 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: amat
496 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: rbasis
497 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :, :) :: wfn
498 REAL(kind=dp), DIMENSION(:, :, :), POINTER :: ovlp
499 TYPE(atom_state), POINTER :: state
500
501 WRITE (iw, '(/," ",79("*"),/,T30,A,A/," ",79("*"))') "RESPONSE BASIS for ", ptable(atom%z)%symbol
502
503 state => atom%state
504 ovlp => atom%integrals%ovlp
505
506 ! find HOMO
507 lhomo = -1
508 nhomo = -1
509 emax = -huge(1._dp)
510 DO l = 0, state%maxl_occ
511 DO i = 1, state%maxn_occ(l)
512 IF (atom%orbitals%ener(i, l) > emax) THEN
513 lhomo = l
514 nhomo = i
515 emax = atom%orbitals%ener(i, l)
516 fhomo = state%occupation(l, i)
517 END IF
518 END DO
519 END DO
520
521 s1 = SIZE(atom%orbitals%wfn, 1)
522 s2 = SIZE(atom%orbitals%wfn, 2)
523 ALLOCATE (wfn(s1, s2, 0:lmat, -nder:nder))
524 s2 = maxval(state%maxn_occ) + nder
525 ALLOCATE (rbasis(s1, s2, 0:lmat))
526 rbasis = 0._dp
527
528 DO ider = -nder, nder
529 dene = real(ider, kind=dp)*delta
530 cpassert(fhomo > abs(dene))
531 state%occupation(lhomo, nhomo) = fhomo + dene
532 CALL calculate_atom(atom, iw=0, noguess=.true.)
533 wfn(:, :, :, ider) = atom%orbitals%wfn
534 state%occupation(lhomo, nhomo) = fhomo
535 END DO
536
537 DO l = 0, state%maxl_occ
538 ! occupied states
539 DO i = 1, max(state%maxn_occ(l), 1)
540 rbasis(:, i, l) = wfn(:, i, l, 0)
541 END DO
542 ! differentiation
543 DO ider = 1, nder
544 i = max(state%maxn_occ(l), 1)
545 SELECT CASE (ider)
546 CASE (1)
547 rbasis(:, i + 1, l) = 0.5_dp*(wfn(:, i, l, 1) - wfn(:, i, l, -1))/delta
548 CASE (2)
549 rbasis(:, i + 2, l) = 0.25_dp*(wfn(:, i, l, 2) - 2._dp*wfn(:, i, l, 0) + wfn(:, i, l, -2))/delta**2
550 CASE (3)
551 rbasis(:, i + 3, l) = 0.125_dp*(wfn(:, i, l, 3) - 3._dp*wfn(:, i, l, 1) &
552 + 3._dp*wfn(:, i, l, -1) - wfn(:, i, l, -3))/delta**3
553 CASE DEFAULT
554 cpabort("")
555 END SELECT
556 END DO
557
558 ! orthogonalization, use gram-schmidt in order to keep the natural order (semi-core, valence, response) of the wfn.
559 n = state%maxn_occ(l) + nder
560 m = atom%basis%nbas(l)
561 DO i = 1, n
562 DO j = 1, i - 1
563 o = dot_product(rbasis(1:m, j, l), reshape(matmul(ovlp(1:m, 1:m, l), rbasis(1:m, i:i, l)), (/m/)))
564 rbasis(1:m, i, l) = rbasis(1:m, i, l) - o*rbasis(1:m, j, l)
565 END DO
566 o = dot_product(rbasis(1:m, i, l), reshape(matmul(ovlp(1:m, 1:m, l), rbasis(1:m, i:i, l)), (/m/)))
567 rbasis(1:m, i, l) = rbasis(1:m, i, l)/sqrt(o)
568 END DO
569
570 ! check
571 ALLOCATE (amat(n, n))
572 amat(1:n, 1:n) = matmul(transpose(rbasis(1:m, 1:n, l)), matmul(ovlp(1:m, 1:m, l), rbasis(1:m, 1:n, l)))
573 DO i = 1, n
574 amat(i, i) = amat(i, i) - 1._dp
575 END DO
576 IF (maxval(abs(amat)) > 1.e-12) THEN
577 WRITE (iw, '(/,A,G20.10)') " Orthogonality error ", maxval(abs(amat))
578 END IF
579 DEALLOCATE (amat)
580
581 ! Quickstep normalization
582 WRITE (iw, '(/,A,T30,I3)') " Angular momentum :", l
583
584 WRITE (iw, '(/,A,I0,A,I0,A)') " Exponent Coef.(Quickstep Normalization), first ", &
585 n - nder, " valence ", nder, " response"
586 expzet = 0.25_dp*real(2*l + 3, dp)
587 prefac = sqrt(rootpi/2._dp**(l + 2)*dfac(2*l + 1))
588 DO i = 1, m
589 zeta = (2._dp*atom%basis%am(i, l))**expzet
590 WRITE (iw, '(4X,F20.10,4X,15ES20.6)') atom%basis%am(i, l), ((prefac*rbasis(i, k, l)/zeta), k=1, n)
591 END DO
592
593 END DO
594
595 DEALLOCATE (wfn, rbasis)
596
597 WRITE (iw, '(" ",79("*"))')
598
599 END SUBROUTINE atom_response_basis
600
601! **************************************************************************************************
602!> \brief Write pseudo-potential in Quantum Espresso UPF format.
603!> \param atom information about the atomic kind
604!> \param iw output file unit
605!> \par History
606!> * 09.2012 created [Juerg Hutter]
607! **************************************************************************************************
608 SUBROUTINE atom_write_upf(atom, iw)
609
610 TYPE(atom_type), POINTER :: atom
611 INTEGER, INTENT(IN) :: iw
612
613 CHARACTER(LEN=default_string_length) :: string
614 INTEGER :: i, ibeta, j, k, l, lmax, nbeta, nr, &
615 nwfc, nwfn
616 LOGICAL :: up
617 REAL(kind=dp) :: pf, rl, rmax
618 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: beta, corden, dens, ef, locpot, rp
619 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: dij
620 TYPE(atom_gthpot_type), POINTER :: pot
621
622 IF (.NOT. atom%pp_calc) RETURN
623 IF (atom%potential%ppot_type /= gth_pseudo) RETURN
624 pot => atom%potential%gth_pot
625 cpassert(.NOT. pot%lsdpot)
626
627 WRITE (iw, '(A)') '<UPF version="2.0.1">'
628
629 WRITE (iw, '(T4,A)') '<PP_INFO>'
630 WRITE (iw, '(T8,A)') 'Converted from CP2K GTH format'
631 WRITE (iw, '(T8,A)') '<PP_INPUTFILE>'
632 CALL atom_write_pseudo_param(pot, iw)
633 WRITE (iw, '(T8,A)') '</PP_INPUTFILE>'
634 WRITE (iw, '(T4,A)') '</PP_INFO>'
635 WRITE (iw, '(T4,A)') '<PP_HEADER'
636 WRITE (iw, '(T8,A)') 'generated="Generated in analytical, separable form"'
637 WRITE (iw, '(T8,A)') 'author="Goedecker/Hartwigsen/Hutter/Teter"'
638 WRITE (iw, '(T8,A)') 'date="Phys.Rev.B58, 3641 (1998); B54, 1703 (1996)"'
639 WRITE (iw, '(T8,A)') 'comment="This file generated by CP2K ATOM code"'
640 CALL compose(string, "element", cval=pot%symbol)
641 WRITE (iw, '(T8,A)') trim(string)
642 WRITE (iw, '(T8,A)') 'pseudo_type="NC"'
643 WRITE (iw, '(T8,A)') 'relativistic="no"'
644 WRITE (iw, '(T8,A)') 'is_ultrasoft="F"'
645 WRITE (iw, '(T8,A)') 'is_paw="F"'
646 WRITE (iw, '(T8,A)') 'is_coulomb="F"'
647 WRITE (iw, '(T8,A)') 'has_so="F"'
648 WRITE (iw, '(T8,A)') 'has_wfc="F"'
649 WRITE (iw, '(T8,A)') 'has_gipaw="F"'
650 WRITE (iw, '(T8,A)') 'paw_as_gipaw="F"'
651 IF (pot%nlcc) THEN
652 WRITE (iw, '(T8,A)') 'core_correction="T"'
653 ELSE
654 WRITE (iw, '(T8,A)') 'core_correction="F"'
655 END IF
656 WRITE (iw, '(T8,A)') 'functional="DFT"'
657 CALL compose(string, "z_valence", rval=pot%zion)
658 WRITE (iw, '(T8,A)') trim(string)
659 CALL compose(string, "total_psenergy", rval=2._dp*atom%energy%etot)
660 WRITE (iw, '(T8,A)') trim(string)
661 WRITE (iw, '(T8,A)') 'wfc_cutoff="0.0E+00"'
662 WRITE (iw, '(T8,A)') 'rho_cutoff="0.0E+00"'
663 lmax = -1
664 DO l = 0, lmat
665 IF (pot%nl(l) > 0) lmax = l
666 END DO
667 CALL compose(string, "l_max", ival=lmax)
668 WRITE (iw, '(T8,A)') trim(string)
669 WRITE (iw, '(T8,A)') 'l_max_rho="0"'
670 WRITE (iw, '(T8,A)') 'l_local="-3"'
671 nr = atom%basis%grid%nr
672 CALL compose(string, "mesh_size", ival=nr)
673 WRITE (iw, '(T8,A)') trim(string)
674 nwfc = sum(atom%state%maxn_occ)
675 CALL compose(string, "number_of_wfc", ival=nwfc)
676 WRITE (iw, '(T8,A)') trim(string)
677 nbeta = sum(pot%nl)
678 CALL compose(string, "number_of_proj", ival=nbeta)
679 WRITE (iw, '(T8,A)') trim(string)//'/>'
680
681 ! Mesh
682 up = atom%basis%grid%rad(1) < atom%basis%grid%rad(nr)
683 WRITE (iw, '(T4,A)') '<PP_MESH'
684 WRITE (iw, '(T8,A)') 'dx="1.E+00"'
685 CALL compose(string, "mesh", ival=nr)
686 WRITE (iw, '(T8,A)') trim(string)
687 WRITE (iw, '(T8,A)') 'xmin="1.E+00"'
688 rmax = maxval(atom%basis%grid%rad)
689 CALL compose(string, "rmax", rval=rmax)
690 WRITE (iw, '(T8,A)') trim(string)
691 WRITE (iw, '(T8,A)') 'zmesh="1.E+00">'
692 WRITE (iw, '(T8,A)') '<PP_R type="real"'
693 CALL compose(string, "size", ival=nr)
694 WRITE (iw, '(T12,A)') trim(string)
695 WRITE (iw, '(T12,A)') 'columns="4">'
696 IF (up) THEN
697 WRITE (iw, '(T12,4ES25.12E3)') (atom%basis%grid%rad(i), i=1, nr)
698 ELSE
699 WRITE (iw, '(T12,4ES25.12E3)') (atom%basis%grid%rad(i), i=nr, 1, -1)
700 END IF
701 WRITE (iw, '(T8,A)') '</PP_R>'
702 WRITE (iw, '(T8,A)') '<PP_RAB type="real"'
703 CALL compose(string, "size", ival=nr)
704 WRITE (iw, '(T12,A)') trim(string)
705 WRITE (iw, '(T12,A)') 'columns="4">'
706 IF (up) THEN
707 WRITE (iw, '(T12,4ES25.12E3)') (atom%basis%grid%wr(i)/atom%basis%grid%rad2(i), i=1, nr)
708 ELSE
709 WRITE (iw, '(T12,4ES25.12E3)') (atom%basis%grid%wr(i)/atom%basis%grid%rad2(i), i=nr, 1, -1)
710 END IF
711 WRITE (iw, '(T8,A)') '</PP_RAB>'
712 WRITE (iw, '(T4,A)') '</PP_MESH>'
713
714 ! NLCC
715 IF (pot%nlcc) THEN
716 WRITE (iw, '(T4,A)') '<PP_NLCC type="real"'
717 CALL compose(string, "size", ival=nr)
718 WRITE (iw, '(T8,A)') trim(string)
719 WRITE (iw, '(T8,A)') 'columns="4">'
720 ALLOCATE (corden(nr))
721 corden(:) = 0.0_dp
722 CALL atom_core_density(corden, atom%potential, "RHO", atom%basis%grid%rad)
723 IF (up) THEN
724 WRITE (iw, '(T8,4ES25.12E3)') (corden(i), i=1, nr)
725 ELSE
726 WRITE (iw, '(T8,4ES25.12E3)') (corden(i), i=nr, 1, -1)
727 END IF
728 DEALLOCATE (corden)
729 WRITE (iw, '(T4,A)') '</PP_NLCC>'
730 END IF
731
732 ! local PP
733 WRITE (iw, '(T4,A)') '<PP_LOCAL type="real"'
734 CALL compose(string, "size", ival=nr)
735 WRITE (iw, '(T8,A)') trim(string)
736 WRITE (iw, '(T8,A)') 'columns="4">'
737 ALLOCATE (locpot(nr))
738 locpot(:) = 0.0_dp
739 CALL atom_local_potential(locpot, pot, atom%basis%grid%rad)
740 IF (up) THEN
741 WRITE (iw, '(T8,4ES25.12E3)') (2.0_dp*locpot(i), i=1, nr)
742 ELSE
743 WRITE (iw, '(T8,4ES25.12E3)') (2.0_dp*locpot(i), i=nr, 1, -1)
744 END IF
745 DEALLOCATE (locpot)
746 WRITE (iw, '(T4,A)') '</PP_LOCAL>'
747
748 ! nonlocal PP
749 WRITE (iw, '(T4,A)') '<PP_NONLOCAL>'
750 ALLOCATE (rp(nr), ef(nr), beta(nr))
751 ibeta = 0
752 DO l = 0, lmat
753 IF (pot%nl(l) == 0) cycle
754 rl = pot%rcnl(l)
755 rp(:) = atom%basis%grid%rad
756 ef(:) = exp(-0.5_dp*rp*rp/(rl*rl))
757 DO i = 1, pot%nl(l)
758 pf = rl**(l + 0.5_dp*(4._dp*i - 1._dp))
759 j = l + 2*i - 1
760 pf = sqrt(2._dp)/(pf*sqrt(gamma1(j)))
761 beta(:) = pf*rp**(l + 2*i - 2)*ef
762 ibeta = ibeta + 1
763 CALL compose(string, "<PP_BETA", counter=ibeta)
764 WRITE (iw, '(T8,A)') trim(string)
765 CALL compose(string, "angular_momentum", ival=l)
766 WRITE (iw, '(T12,A)') trim(string)
767 WRITE (iw, '(T12,A)') 'type="real"'
768 CALL compose(string, "size", ival=nr)
769 WRITE (iw, '(T12,A)') trim(string)
770 WRITE (iw, '(T12,A)') 'columns="4">'
771 beta(:) = beta*rp
772 IF (up) THEN
773 WRITE (iw, '(T12,4ES25.12E3)') (2._dp*beta(j), j=1, nr)
774 ELSE
775 WRITE (iw, '(T12,4ES25.12E3)') (2._dp*beta(j), j=nr, 1, -1)
776 END IF
777 CALL compose(string, "</PP_BETA", counter=ibeta, isfinal=.true.)
778 WRITE (iw, '(T8,A)') trim(string)
779 END DO
780 END DO
781 DEALLOCATE (rp, ef, beta)
782 ! nonlocal PP matrix elements
783 ALLOCATE (dij(nbeta, nbeta))
784 dij = 0._dp
785 DO l = 0, lmat
786 IF (pot%nl(l) == 0) cycle
787 ibeta = sum(pot%nl(0:l - 1)) + 1
788 i = ibeta + pot%nl(l) - 1
789 dij(ibeta:i, ibeta:i) = pot%hnl(1:pot%nl(l), 1:pot%nl(l), l)
790 END DO
791 WRITE (iw, '(T8,A)') '<PP_DIJ type="real"'
792 WRITE (iw, '(T12,A)') 'columns="4">'
793 WRITE (iw, '(T12,4ES25.12E3)') ((0.5_dp*dij(i, j), j=1, nbeta), i=1, nbeta)
794 WRITE (iw, '(T8,A)') '</PP_DIJ>'
795 DEALLOCATE (dij)
796 WRITE (iw, '(T4,A)') '</PP_NONLOCAL>'
797
798 ! atomic wavefunctions
799 ALLOCATE (beta(nr))
800 WRITE (iw, '(T4,A)') '<PP_PSWFC>'
801 nwfn = 0
802 DO l = 0, lmat
803 DO i = 1, 10
804 IF (abs(atom%state%occupation(l, i)) == 0._dp) cycle
805 nwfn = nwfn + 1
806 CALL compose(string, "<PP_CHI", counter=nwfn)
807 WRITE (iw, '(T8,A)') trim(string)
808 CALL compose(string, "l", ival=l)
809 WRITE (iw, '(T12,A)') trim(string)
810 CALL compose(string, "occupation", rval=atom%state%occupation(l, i))
811 WRITE (iw, '(T12,A)') trim(string)
812 CALL compose(string, "pseudo_energy", rval=2._dp*atom%orbitals%ener(i, l))
813 WRITE (iw, '(T12,A)') trim(string)
814 WRITE (iw, '(T12,A)') 'columns="4">'
815 beta = 0._dp
816 DO k = 1, atom%basis%nbas(l)
817 beta(:) = beta(:) + atom%orbitals%wfn(k, i, l)*atom%basis%bf(:, k, l)
818 END DO
819 beta(:) = beta*atom%basis%grid%rad
820 IF (up) THEN
821 WRITE (iw, '(T12,4ES25.12E3)') (beta(j)*atom%basis%grid%rad(j), j=1, nr)
822 ELSE
823 WRITE (iw, '(T12,4ES25.12E3)') (beta(j)*atom%basis%grid%rad(j), j=nr, 1, -1)
824 END IF
825 CALL compose(string, "</PP_CHI", counter=nwfn, isfinal=.true.)
826 WRITE (iw, '(T8,A)') trim(string)
827 END DO
828 END DO
829 WRITE (iw, '(T4,A)') '</PP_PSWFC>'
830 DEALLOCATE (beta)
831
832 ! atomic charge
833 ALLOCATE (dens(nr))
834 WRITE (iw, '(T4,A)') '<PP_RHOATOM type="real"'
835 CALL compose(string, "size", ival=nr)
836 WRITE (iw, '(T8,A)') trim(string)
837 WRITE (iw, '(T8,A)') 'columns="4">'
838 CALL atom_density(dens, atom%orbitals%pmat, atom%basis, atom%state%maxl_occ, &
839 "RHO", atom%basis%grid%rad)
840 IF (up) THEN
841 WRITE (iw, '(T8,4ES25.12E3)') (4._dp*pi*dens(j)*atom%basis%grid%rad2(j), j=1, nr)
842 ELSE
843 WRITE (iw, '(T8,4ES25.12E3)') (4._dp*pi*dens(j)*atom%basis%grid%rad2(j), j=nr, 1, -1)
844 END IF
845 WRITE (iw, '(T4,A)') '</PP_RHOATOM>'
846 DEALLOCATE (dens)
847
848 WRITE (iw, '(A)') '</UPF>'
849
850 END SUBROUTINE atom_write_upf
851
852! **************************************************************************************************
853!> \brief Produce an XML attribute string 'tag="counter/rval/ival/cval"'
854!> \param string composed string
855!> \param tag attribute tag
856!> \param counter counter
857!> \param rval real variable
858!> \param ival integer variable
859!> \param cval string variable
860!> \param isfinal close the current XML element if this is the last attribute
861!> \par History
862!> * 09.2012 created [Juerg Hutter]
863! **************************************************************************************************
864 SUBROUTINE compose(string, tag, counter, rval, ival, cval, isfinal)
865 CHARACTER(len=*), INTENT(OUT) :: string
866 CHARACTER(len=*), INTENT(IN) :: tag
867 INTEGER, INTENT(IN), OPTIONAL :: counter
868 REAL(kind=dp), INTENT(IN), OPTIONAL :: rval
869 INTEGER, INTENT(IN), OPTIONAL :: ival
870 CHARACTER(len=*), INTENT(IN), OPTIONAL :: cval
871 LOGICAL, INTENT(IN), OPTIONAL :: isfinal
872
873 CHARACTER(LEN=default_string_length) :: str
874 LOGICAL :: fin
875
876 IF (PRESENT(counter)) THEN
877 WRITE (str, "(I12)") counter
878 ELSEIF (PRESENT(rval)) THEN
879 WRITE (str, "(G18.8)") rval
880 ELSEIF (PRESENT(ival)) THEN
881 WRITE (str, "(I12)") ival
882 ELSEIF (PRESENT(cval)) THEN
883 WRITE (str, "(A)") trim(adjustl(cval))
884 ELSE
885 WRITE (str, "(A)") ""
886 END IF
887 fin = .false.
888 IF (PRESENT(isfinal)) fin = isfinal
889 IF (PRESENT(counter)) THEN
890 IF (fin) THEN
891 WRITE (string, "(A,A1,A,A1)") trim(adjustl(tag)), '.', trim(adjustl(str)), '>'
892 ELSE
893 WRITE (string, "(A,A1,A)") trim(adjustl(tag)), '.', trim(adjustl(str))
894 END IF
895 ELSE
896 IF (fin) THEN
897 WRITE (string, "(A,A2,A,A2)") trim(adjustl(tag)), '="', trim(adjustl(str)), '>"'
898 ELSE
899 WRITE (string, "(A,A2,A,A1)") trim(adjustl(tag)), '="', trim(adjustl(str)), '"'
900 END IF
901 END IF
902 END SUBROUTINE compose
903
904END MODULE atom_energy
static GRID_HOST_DEVICE orbital up(const int i, const orbital a)
Increase i'th component of given orbital angular momentum.
subroutine, public atom_admm(atom_info, admm_section, iw)
Analysis of ADMM approximation to exact exchange.
subroutine, public calculate_atom(atom, iw, noguess, converged)
General routine to perform electronic structure atomic calculations.
subroutine, public atom_energy_opt(atom_section)
Compute the atomic energy.
Definition atom_energy.F:81
routines that fit parameters for /from atomic calculations
Definition atom_fit.F:11
subroutine, public atom_fit_density(atom, num_gto, norder, iunit, powell_section, results)
Fit the atomic electron density using a geometrical Gaussian basis set.
Definition atom_fit.F:77
subroutine, public atom_fit_kgpot(atom, num_gau, num_pol, iunit, powell_section, results)
...
Definition atom_fit.F:1867
subroutine, public atom_grb_construction(atom_info, atom_section, iw)
Construct geometrical response basis set.
Definition atom_grb.F:78
Calculate the atomic operator matrices.
subroutine, public atom_ppint_release(integrals)
Release memory allocated for atomic integrals (core electrons).
subroutine, public atom_int_setup(integrals, basis, potential, eri_coulomb, eri_exchange, all_nu)
Set up atomic integrals.
subroutine, public atom_relint_setup(integrals, basis, reltyp, zcore, alpha)
...
subroutine, public atom_relint_release(integrals)
Release memory allocated for atomic integrals (relativistic effects).
subroutine, public atom_ppint_setup(integrals, basis, potential)
...
subroutine, public atom_int_release(integrals)
Release memory allocated for atomic integrals (valence electrons).
Routines that print various information about an atomic kind.
Definition atom_output.F:11
subroutine, public atom_print_basis(atom_basis, iw, title)
Print atomic basis set.
subroutine, public atom_write_pseudo_param(gthpot, iunit)
Print GTH pseudo-potential parameters.
subroutine, public atom_print_method(atom, iw)
Print information about the electronic structure method in use.
subroutine, public atom_print_orbitals(atom, iw)
Print atomic orbitals.
subroutine, public atom_print_potential(potential, iw)
Print information about the pseudo-potential.
subroutine, public atom_print_info(zval, info, iw)
Print an information string related to the atomic kind.
Definition atom_output.F:64
subroutine, public atom_sgp_construction(atom_info, input_section, iw)
...
Definition atom_sgp.F:201
Define the atom type and its sub types.
Definition atom_types.F:15
subroutine, public read_atom_opt_section(optimization, opt_section)
...
subroutine, public create_atom_type(atom)
...
Definition atom_types.F:944
subroutine, public release_atom_type(atom)
...
Definition atom_types.F:968
subroutine, public release_atom_potential(potential)
...
subroutine, public init_atom_basis(basis, basis_section, zval, btyp)
Initialize the basis for the atomic code.
Definition atom_types.F:375
integer, parameter, public lmat
Definition atom_types.F:67
subroutine, public set_atom(atom, basis, state, integrals, orbitals, potential, zcore, pp_calc, do_zmp, doread, read_vxc, method_type, relativistic, coulomb_integral_type, exchange_integral_type, fmat)
...
subroutine, public init_atom_potential(potential, potential_section, zval)
...
subroutine, public release_atom_basis(basis)
...
Definition atom_types.F:910
subroutine, public create_atom_orbs(orbs, mbas, mo)
...
Some basic routines for atomic calculations.
Definition atom_utils.F:15
subroutine, public atom_condnumber(basis, crad, iw)
Print condition numbers of the given atomic basis set.
pure subroutine, public atom_local_potential(locpot, gthpot, rr)
...
Definition atom_utils.F:800
subroutine, public atom_read_external_vxc(vxc, atom, iw)
ZMP subroutine to read external v_xc in the atomic code.
Definition atom_utils.F:608
pure logical function, public atom_consistent_method(method, multiplicity)
Check that the atomic multiplicity is consistent with the electronic structure method.
subroutine, public atom_core_density(corden, potential, typ, rr)
...
Definition atom_utils.F:694
pure integer function, dimension(0:lmat), public get_maxn_occ(occupation)
Return the maximum principal quantum number of occupied orbitals.
Definition atom_utils.F:302
subroutine, public atom_density(density, pmat, basis, maxl, typ, rr)
Map the electron density on an atomic radial grid.
Definition atom_utils.F:367
subroutine, public atom_read_external_density(density, atom, iw)
ZMP subroutine to read external density from linear grid of density matrix.
Definition atom_utils.F:517
subroutine, public atom_completeness(basis, zv, iw)
Estimate completeness of the given atomic basis set.
subroutine, public atom_write_zmp_restart(atom)
ZMP subroutine to write external restart file.
Definition atom_utils.F:424
subroutine, public atom_set_occupation(ostring, occupation, wfnocc, multiplicity)
Set occupation of atomic orbitals.
Definition atom_utils.F:104
pure integer function, public get_maxl_occ(occupation)
Return the maximum orbital quantum number of occupied orbitals.
Definition atom_utils.F:282
routines that build the integrals of the Vxc potential calculated for the atomic code
Definition atom_xc.F:12
subroutine, public calculate_atom_ext_vxc(vxc, atom, lprint, xcmat)
ZMP subroutine for the scf external density from the external v_xc.
Definition atom_xc.F:148
subroutine, public calculate_atom_zmp(ext_density, atom, lprint, xcmat)
ZMP subroutine for the calculation of the effective constraint potential in the atomic code.
Definition atom_xc.F:78
Definition atom.F:9
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_analytic
integer, parameter, public gth_pseudo
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
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
integer, parameter, public default_string_length
Definition kinds.F:57
Definition of mathematical constants and functions.
real(kind=dp), dimension(0:maxfac), parameter, public gamma1
real(kind=dp), parameter, public pi
real(kind=dp), dimension(-1:2 *maxfac+1), parameter, public dfac
real(kind=dp), parameter, public rootpi
Periodic Table related data definitions.
type(atom), dimension(0:nelem), public ptable
integer, parameter, public nelem
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public bohr
Definition physcon.F:147
Provides all information about a basis set.
Definition atom_types.F:78
Provides all information about a pseudopotential.
Definition atom_types.F:98
Information on optimization procedure.
Definition atom_types.F:280
Holds atomic orbitals and energies.
Definition atom_types.F:234
Provides all information on states and occupation.
Definition atom_types.F:195
Provides all information about an atomic kind.
Definition atom_types.F:290
type of a logger, at the moment it contains just a print level starting at which level it should be l...