57#include "./base/base_uses.f90"
63 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'atom_energy'
83 CHARACTER(len=*),
PARAMETER :: routinen =
'atom_energy_opt'
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 graph, had_ae, had_pp, lcomp, lcond, &
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
103 TYPE(
atom_p_type),
DIMENSION(:, :),
POINTER :: atom_info
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
111 CALL timeset(routinen, handle)
118 IF (
ptable(i)%symbol == elem)
THEN
123 IF (zz /= 1) zval = zz
126 ALLOCATE (ae_basis, pp_basis)
128 NULLIFY (ae_basis%grid)
130 NULLIFY (pp_basis%grid)
137 IF (iw > 0)
CALL atom_print_info(zval,
"Atomic Energy Calculation", iw)
147 NULLIFY (potential_section)
149 ALLOCATE (ae_pot, p_pot)
167 DO in = 1, min(
SIZE(cn), 4)
168 maxn(in - 1) = cn(in)
171 maxn(in) = min(maxn(in), ae_basis%nbas(in))
172 maxn(in) = min(maxn(in), pp_basis%nbas(in))
189 ALLOCATE (ae_int, pp_int)
191 ALLOCATE (atom_info(n_rep, n_meth))
196 NULLIFY (atom_info(in, im)%atom)
199 atom_info(in, im)%atom%optimization = optimization
201 atom_info(in, im)%atom%z = zval
203 atom_info(in, im)%atom%xc_section => xc_section
212 atom_info(in, im)%atom%do_zmp = do_zmp
214 atom_info(in, im)%atom%ext_file = filename
216 r_val=atom_info(in, im)%atom%zmpgrid_tol)
218 atom_info(in, im)%atom%lambda = lambda
220 atom_info(in, im)%atom%dm = dm
224 atom_info(in, im)%atom%doread = doread
226 atom_info(in, im)%atom%zmp_restart_file = filename
231 atom_info(in, im)%atom%read_vxc = read_vxc
233 atom_info(in, im)%atom%ext_vxc_file = filename
235 r_val=atom_info(in, im)%atom%zmpvxcgrid_tol)
241 c_vals=tmpstringlist)
249 state%maxl_calc = max(maxl, state%maxl_occ)
250 state%maxl_calc = min(
lmat, state%maxl_calc)
252 DO k = 0, state%maxl_calc
253 state%maxn_calc(k) = max(maxn(k), state%maxn_occ(k))
257 pp_calc = any(index(tmpstringlist(1:),
"CORE") /= 0)
262 zcore = zval - nint(sum(state%core))
263 CALL set_atom(atom_info(in, im)%atom, zcore=zcore, pp_calc=.true.)
266 CALL set_atom(atom_info(in, im)%atom, zcore=zval, pp_calc=.false.)
271 CALL set_atom(atom_info(in, im)%atom, method_type=method, relativistic=reltyp)
291 potential=p_pot, eri_coulomb=eri_c, eri_exchange=eri_e)
295 NULLIFY (pp_int%tzora, pp_int%hdkh)
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))
304 eri_coulomb=eri_c, eri_exchange=eri_e)
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))
316 CALL set_atom(atom_info(in, im)%atom, state=state)
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
324 mo = maxval(state%maxn_calc)
325 mb = maxval(atom_info(in, im)%atom%basis%nbas)
327 CALL set_atom(atom_info(in, im)%atom, orbitals=orbitals)
336 IF (atom_info(in, im)%atom%do_zmp)
THEN
339 ALLOCATE (ext_density(atom_info(in, im)%atom%basis%grid%nr))
343 atom=atom_info(in, im)%atom, &
345 DEALLOCATE (ext_density)
348 IF (atom_info(in, im)%atom%read_vxc)
THEN
349 ALLOCATE (ext_vxc(atom_info(in, im)%atom%basis%grid%nr))
353 atom=atom_info(in, im)%atom, &
371 CALL atom_fit_density(atom_info(in, im)%atom, num_gto, 0, iw, powell_section=powell_section)
381 CALL atom_fit_kgpot(atom_info(in, im)%atom, num_gau, num_pol, iw, powell_section=powell_section)
390 CALL atom_response_basis(atom_info(in, im)%atom, delta, nder, iw)
396 file_position=
"REWIND")
398 CALL atom_write_upf(atom_info(in, im)%atom, iw)
407 iw =
cp_print_key_unit_nr(logger, atom_section,
"PRINT%GEOMETRICAL_RESPONSE_BASIS", extension=
".log")
416 CALL section_vals_val_get(atom_section,
"PRINT%ANALYZE_BASIS%OVERLAP_CONDITION_NUMBER", l_val=lcond)
434 CALL atom_admm(atom_info, admm_section, iw)
439 iw =
cp_print_key_unit_nr(logger, atom_section,
"PRINT%SEPARABLE_GAUSSIAN_PSEUDO", extension=
".log")
468 DEALLOCATE (atom_info)
470 DEALLOCATE (ae_pot, p_pot, ae_basis, pp_basis, ae_int, pp_int)
472 CALL timestop(handle)
486 SUBROUTINE atom_response_basis(atom, delta, nder, iw)
489 REAL(kind=
dp),
INTENT(IN) :: delta
490 INTEGER,
INTENT(IN) :: nder, iw
492 INTEGER :: i, ider, j, k, l, lhomo, m, n, nhomo, &
494 REAL(kind=
dp) :: dene, emax, expzet, fhomo, o, prefac, &
496 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: amat
497 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rbasis
498 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :, :) :: wfn
499 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: ovlp
502 WRITE (iw,
'(/," ",79("*"),/,T30,A,A/," ",79("*"))')
"RESPONSE BASIS for ",
ptable(
atom%z)%symbol
505 ovlp =>
atom%integrals%ovlp
511 DO l = 0, state%maxl_occ
512 DO i = 1, state%maxn_occ(l)
513 IF (
atom%orbitals%ener(i, l) > emax)
THEN
516 emax =
atom%orbitals%ener(i, l)
517 fhomo = state%occupation(l, i)
522 s1 =
SIZE(
atom%orbitals%wfn, 1)
523 s2 =
SIZE(
atom%orbitals%wfn, 2)
524 ALLOCATE (wfn(s1, s2, 0:
lmat, -nder:nder))
525 s2 = maxval(state%maxn_occ) + nder
526 ALLOCATE (rbasis(s1, s2, 0:
lmat))
529 DO ider = -nder, nder
530 dene = real(ider, kind=
dp)*delta
531 cpassert(fhomo > abs(dene))
532 state%occupation(lhomo, nhomo) = fhomo + dene
534 wfn(:, :, :, ider) =
atom%orbitals%wfn
535 state%occupation(lhomo, nhomo) = fhomo
538 DO l = 0, state%maxl_occ
540 DO i = 1, max(state%maxn_occ(l), 1)
541 rbasis(:, i, l) = wfn(:, i, l, 0)
545 i = max(state%maxn_occ(l), 1)
548 rbasis(:, i + 1, l) = 0.5_dp*(wfn(:, i, l, 1) - wfn(:, i, l, -1))/delta
550 rbasis(:, i + 2, l) = 0.25_dp*(wfn(:, i, l, 2) - 2._dp*wfn(:, i, l, 0) + wfn(:, i, l, -2))/delta**2
552 rbasis(:, i + 3, l) = 0.125_dp*(wfn(:, i, l, 3) - 3._dp*wfn(:, i, l, 1) &
553 + 3._dp*wfn(:, i, l, -1) - wfn(:, i, l, -3))/delta**3
560 n = state%maxn_occ(l) + nder
561 m =
atom%basis%nbas(l)
564 o = dot_product(rbasis(1:m, j, l), reshape(matmul(ovlp(1:m, 1:m, l), rbasis(1:m, i:i, l)), (/m/)))
565 rbasis(1:m, i, l) = rbasis(1:m, i, l) - o*rbasis(1:m, j, l)
567 o = dot_product(rbasis(1:m, i, l), reshape(matmul(ovlp(1:m, 1:m, l), rbasis(1:m, i:i, l)), (/m/)))
568 rbasis(1:m, i, l) = rbasis(1:m, i, l)/sqrt(o)
572 ALLOCATE (amat(n, n))
573 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)))
575 amat(i, i) = amat(i, i) - 1._dp
577 IF (maxval(abs(amat)) > 1.e-12)
THEN
578 WRITE (iw,
'(/,A,G20.10)')
" Orthogonality error ", maxval(abs(amat))
583 WRITE (iw,
'(/,A,T30,I3)')
" Angular momentum :", l
585 WRITE (iw,
'(/,A,I0,A,I0,A)')
" Exponent Coef.(Quickstep Normalization), first ", &
586 n - nder,
" valence ", nder,
" response"
587 expzet = 0.25_dp*real(2*l + 3,
dp)
588 prefac = sqrt(
rootpi/2._dp**(l + 2)*
dfac(2*l + 1))
590 zeta = (2._dp*
atom%basis%am(i, l))**expzet
591 WRITE (iw,
'(4X,F20.10,4X,15ES20.6)')
atom%basis%am(i, l), ((prefac*rbasis(i, k, l)/zeta), k=1, n)
596 DEALLOCATE (wfn, rbasis)
598 WRITE (iw,
'(" ",79("*"))')
600 END SUBROUTINE atom_response_basis
609 SUBROUTINE atom_write_upf(atom, iw)
612 INTEGER,
INTENT(IN) :: iw
614 CHARACTER(LEN=default_string_length) :: string
615 INTEGER :: i, ibeta, ii, j, k, kk, l, lmax, n0, &
616 nbeta, nr, nwfc, nwfn
618 REAL(kind=
dp) :: occa, occb, pf, rl, rlp, rmax, vnlm, vnlp
619 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: beta, corden, dens, ef, locpot, rp
620 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: dij
623 IF (.NOT.
atom%pp_calc)
RETURN
625 pot =>
atom%potential%gth_pot
626 cpassert(.NOT. pot%lsdpot)
629 WRITE (iw,
'(A)')
'<UPF version="2.0.1">'
631 WRITE (iw,
'(T4,A)')
'<PP_INFO>'
632 WRITE (iw,
'(T8,A)')
'Converted from CP2K GTH format'
633 WRITE (iw,
'(T8,A)')
'<PP_INPUTFILE>'
635 WRITE (iw,
'(T8,A)')
'</PP_INPUTFILE>'
636 WRITE (iw,
'(T4,A)')
'</PP_INFO>'
637 WRITE (iw,
'(T4,A)')
'<PP_HEADER'
638 WRITE (iw,
'(T8,A)')
'generated="Generated in analytical, separable form"'
639 WRITE (iw,
'(T8,A)')
'author="Goedecker/Hartwigsen/Hutter/Teter"'
640 WRITE (iw,
'(T8,A)')
'date="Phys.Rev.B58, 3641 (1998); B54, 1703 (1996)"'
641 WRITE (iw,
'(T8,A)')
'comment="This file generated by CP2K ATOM code"'
642 CALL compose(string,
"element", cval=pot%symbol)
643 WRITE (iw,
'(T8,A)') trim(string)
644 WRITE (iw,
'(T8,A)')
'pseudo_type="NC"'
645 WRITE (iw,
'(T8,A)')
'relativistic="no"'
646 WRITE (iw,
'(T8,A)')
'is_ultrasoft="F"'
647 WRITE (iw,
'(T8,A)')
'is_paw="F"'
648 WRITE (iw,
'(T8,A)')
'is_coulomb="F"'
650 WRITE (iw,
'(T8,A)')
'has_so="T"'
652 WRITE (iw,
'(T8,A)')
'has_so="F"'
654 WRITE (iw,
'(T8,A)')
'has_wfc="F"'
655 WRITE (iw,
'(T8,A)')
'has_gipaw="F"'
656 WRITE (iw,
'(T8,A)')
'paw_as_gipaw="F"'
658 WRITE (iw,
'(T8,A)')
'core_correction="T"'
660 WRITE (iw,
'(T8,A)')
'core_correction="F"'
662 WRITE (iw,
'(T8,A)')
'functional="DFT"'
663 CALL compose(string,
"z_valence", rval=pot%zion)
664 WRITE (iw,
'(T8,A)') trim(string)
665 CALL compose(string,
"total_psenergy", rval=2._dp*
atom%energy%etot)
666 WRITE (iw,
'(T8,A)') trim(string)
667 WRITE (iw,
'(T8,A)')
'wfc_cutoff="0.0E+00"'
668 WRITE (iw,
'(T8,A)')
'rho_cutoff="0.0E+00"'
671 IF (pot%nl(l) > 0) lmax = l
673 CALL compose(string,
"l_max", ival=lmax)
674 WRITE (iw,
'(T8,A)') trim(string)
675 WRITE (iw,
'(T8,A)')
'l_max_rho="0"'
676 WRITE (iw,
'(T8,A)')
'l_local="-3"'
677 nr =
atom%basis%grid%nr
678 CALL compose(string,
"mesh_size", ival=nr)
679 WRITE (iw,
'(T8,A)') trim(string)
680 nwfc = sum(
atom%state%maxn_occ)
681 CALL compose(string,
"number_of_wfc", ival=nwfc)
682 WRITE (iw,
'(T8,A)') trim(string)
684 nbeta = pot%nl(0) + 2*sum(pot%nl(1:))
688 CALL compose(string,
"number_of_proj", ival=nbeta)
689 WRITE (iw,
'(T8,A)') trim(string)//
'/>'
692 up =
atom%basis%grid%rad(1) <
atom%basis%grid%rad(nr)
693 WRITE (iw,
'(T4,A)')
'<PP_MESH'
694 WRITE (iw,
'(T8,A)')
'dx="1.E+00"'
695 CALL compose(string,
"mesh", ival=nr)
696 WRITE (iw,
'(T8,A)') trim(string)
697 WRITE (iw,
'(T8,A)')
'xmin="1.E+00"'
698 rmax = maxval(
atom%basis%grid%rad)
699 CALL compose(string,
"rmax", rval=rmax)
700 WRITE (iw,
'(T8,A)') trim(string)
701 WRITE (iw,
'(T8,A)')
'zmesh="1.E+00">'
702 WRITE (iw,
'(T8,A)')
'<PP_R type="real"'
703 CALL compose(string,
"size", ival=nr)
704 WRITE (iw,
'(T12,A)') trim(string)
705 WRITE (iw,
'(T12,A)')
'columns="4">'
707 WRITE (iw,
'(T12,4ES25.12E3)') (
atom%basis%grid%rad(i), i=1, nr)
709 WRITE (iw,
'(T12,4ES25.12E3)') (
atom%basis%grid%rad(i), i=nr, 1, -1)
711 WRITE (iw,
'(T8,A)')
'</PP_R>'
712 WRITE (iw,
'(T8,A)')
'<PP_RAB type="real"'
713 CALL compose(string,
"size", ival=nr)
714 WRITE (iw,
'(T12,A)') trim(string)
715 WRITE (iw,
'(T12,A)')
'columns="4">'
717 WRITE (iw,
'(T12,4ES25.12E3)') (
atom%basis%grid%wr(i)/
atom%basis%grid%rad2(i), i=1, nr)
719 WRITE (iw,
'(T12,4ES25.12E3)') (
atom%basis%grid%wr(i)/
atom%basis%grid%rad2(i), i=nr, 1, -1)
721 WRITE (iw,
'(T8,A)')
'</PP_RAB>'
722 WRITE (iw,
'(T4,A)')
'</PP_MESH>'
726 WRITE (iw,
'(T4,A)')
'<PP_NLCC type="real"'
727 CALL compose(string,
"size", ival=nr)
728 WRITE (iw,
'(T8,A)') trim(string)
729 WRITE (iw,
'(T8,A)')
'columns="4">'
730 ALLOCATE (corden(nr))
734 WRITE (iw,
'(T8,4ES25.12E3)') (corden(i), i=1, nr)
736 WRITE (iw,
'(T8,4ES25.12E3)') (corden(i), i=nr, 1, -1)
739 WRITE (iw,
'(T4,A)')
'</PP_NLCC>'
743 WRITE (iw,
'(T4,A)')
'<PP_LOCAL type="real"'
744 CALL compose(string,
"size", ival=nr)
745 WRITE (iw,
'(T8,A)') trim(string)
746 WRITE (iw,
'(T8,A)')
'columns="4">'
747 ALLOCATE (locpot(nr))
751 WRITE (iw,
'(T8,4ES25.12E3)') (2.0_dp*locpot(i), i=1, nr)
753 WRITE (iw,
'(T8,4ES25.12E3)') (2.0_dp*locpot(i), i=nr, 1, -1)
756 WRITE (iw,
'(T4,A)')
'</PP_LOCAL>'
759 WRITE (iw,
'(T4,A)')
'<PP_NONLOCAL>'
760 ALLOCATE (rp(nr), ef(nr), beta(nr))
763 IF (pot%nl(l) == 0) cycle
765 rp(:) =
atom%basis%grid%rad
766 ef(:) = exp(-0.5_dp*rp*rp/(rl*rl))
768 pf = rl**(l + 0.5_dp*(4._dp*i - 1._dp))
770 pf = sqrt(2._dp)/(pf*sqrt(
gamma1(j)))
771 beta(:) = pf*rp**(l + 2*i - 2)*ef
775 CALL compose(string,
"<PP_BETA", counter=ibeta)
776 WRITE (iw,
'(T8,A)') trim(string)
777 CALL compose(string,
"angular_momentum", ival=l)
778 WRITE (iw,
'(T12,A)') trim(string)
779 WRITE (iw,
'(T12,A)')
'type="real"'
780 CALL compose(string,
"size", ival=nr)
781 WRITE (iw,
'(T12,A)') trim(string)
782 WRITE (iw,
'(T12,A)')
'columns="4">'
784 WRITE (iw,
'(T12,4ES25.12E3)') (2._dp*beta(j), j=1, nr)
786 WRITE (iw,
'(T12,4ES25.12E3)') (2._dp*beta(j), j=nr, 1, -1)
788 CALL compose(string,
"</PP_BETA", counter=ibeta, isfinal=.true.)
789 WRITE (iw,
'(T8,A)') trim(string)
790 IF (soc .AND. l /= 0)
THEN
792 CALL compose(string,
"<PP_BETA", counter=ibeta)
793 WRITE (iw,
'(T8,A)') trim(string)
794 CALL compose(string,
"angular_momentum", ival=l)
795 WRITE (iw,
'(T12,A)') trim(string)
796 WRITE (iw,
'(T12,A)')
'type="real"'
797 CALL compose(string,
"size", ival=nr)
798 WRITE (iw,
'(T12,A)') trim(string)
799 WRITE (iw,
'(T12,A)')
'columns="4">'
801 WRITE (iw,
'(T12,4ES25.12E3)') (2._dp*beta(j), j=1, nr)
803 WRITE (iw,
'(T12,4ES25.12E3)') (2._dp*beta(j), j=nr, 1, -1)
805 CALL compose(string,
"</PP_BETA", counter=ibeta, isfinal=.true.)
806 WRITE (iw,
'(T8,A)') trim(string)
810 DEALLOCATE (rp, ef, beta)
812 ALLOCATE (dij(nbeta, nbeta))
818 IF (pot%nl(l) == 0) cycle
821 dij(1:n0, 1:n0) = pot%hnl(1:n0, 1:n0, 0)
823 ibeta = n0 + 2*sum(pot%nl(1:l - 1))
828 vnlp = pot%hnl(i, k, l) + 0.5_dp*l*pot%knl(i, k, l)
829 vnlm = pot%hnl(i, k, l) - 0.5_dp*(l + 1)*pot%knl(i, k, l)
830 dij(ibeta + ii, ibeta + kk) = vnlm
831 dij(ibeta + ii + 1, ibeta + kk + 1) = vnlp
838 IF (pot%nl(l) == 0) cycle
839 ibeta = sum(pot%nl(0:l - 1)) + 1
840 i = ibeta + pot%nl(l) - 1
841 dij(ibeta:i, ibeta:i) = pot%hnl(1:pot%nl(l), 1:pot%nl(l), l)
844 WRITE (iw,
'(T8,A)')
'<PP_DIJ type="real"'
845 WRITE (iw,
'(T12,A)')
'columns="4">'
846 WRITE (iw,
'(T12,4ES25.12E3)') ((0.5_dp*dij(i, j), j=1, nbeta), i=1, nbeta)
847 WRITE (iw,
'(T8,A)')
'</PP_DIJ>'
849 WRITE (iw,
'(T4,A)')
'</PP_NONLOCAL>'
853 WRITE (iw,
'(T4,A)')
'<PP_PSWFC>'
857 IF (abs(
atom%state%occupation(l, i)) == 0._dp) cycle
858 occa =
atom%state%occupation(l, i)
860 IF (soc .AND. l /= 0)
THEN
865 CALL compose(string,
"<PP_CHI", counter=nwfn)
866 WRITE (iw,
'(T8,A)') trim(string)
867 CALL compose(string,
"l", ival=l)
868 WRITE (iw,
'(T12,A)') trim(string)
869 CALL compose(string,
"occupation", rval=occa)
870 WRITE (iw,
'(T12,A)') trim(string)
871 CALL compose(string,
"pseudo_energy", rval=2._dp*
atom%orbitals%ener(i, l))
872 WRITE (iw,
'(T12,A)') trim(string)
873 WRITE (iw,
'(T12,A)')
'columns="4">'
875 DO k = 1,
atom%basis%nbas(l)
876 beta(:) = beta(:) +
atom%orbitals%wfn(k, i, l)*
atom%basis%bf(:, k, l)
878 beta(:) = beta*
atom%basis%grid%rad
880 WRITE (iw,
'(T12,4ES25.12E3)') (beta(j)*
atom%basis%grid%rad(j), j=1, nr)
882 WRITE (iw,
'(T12,4ES25.12E3)') (beta(j)*
atom%basis%grid%rad(j), j=nr, 1, -1)
884 CALL compose(string,
"</PP_CHI", counter=nwfn, isfinal=.true.)
885 WRITE (iw,
'(T8,A)') trim(string)
886 IF (soc .AND. l /= 0)
THEN
888 CALL compose(string,
"<PP_CHI", counter=nwfn)
889 WRITE (iw,
'(T8,A)') trim(string)
890 CALL compose(string,
"l", ival=l)
891 WRITE (iw,
'(T12,A)') trim(string)
892 CALL compose(string,
"occupation", rval=occb)
893 WRITE (iw,
'(T12,A)') trim(string)
894 CALL compose(string,
"pseudo_energy", rval=2._dp*
atom%orbitals%ener(i, l))
895 WRITE (iw,
'(T12,A)') trim(string)
896 WRITE (iw,
'(T12,A)')
'columns="4">'
898 DO k = 1,
atom%basis%nbas(l)
899 beta(:) = beta(:) +
atom%orbitals%wfn(k, i, l)*
atom%basis%bf(:, k, l)
901 beta(:) = beta*
atom%basis%grid%rad
903 WRITE (iw,
'(T12,4ES25.12E3)') (beta(j)*
atom%basis%grid%rad(j), j=1, nr)
905 WRITE (iw,
'(T12,4ES25.12E3)') (beta(j)*
atom%basis%grid%rad(j), j=nr, 1, -1)
907 CALL compose(string,
"</PP_CHI", counter=nwfn, isfinal=.true.)
908 WRITE (iw,
'(T8,A)') trim(string)
912 WRITE (iw,
'(T4,A)')
'</PP_PSWFC>'
917 WRITE (iw,
'(T4,A)')
'<PP_RHOATOM type="real"'
918 CALL compose(string,
"size", ival=nr)
919 WRITE (iw,
'(T8,A)') trim(string)
920 WRITE (iw,
'(T8,A)')
'columns="4">'
922 "RHO",
atom%basis%grid%rad)
924 WRITE (iw,
'(T8,4ES25.12E3)') (4._dp*
pi*dens(j)*
atom%basis%grid%rad2(j), j=1, nr)
926 WRITE (iw,
'(T8,4ES25.12E3)') (4._dp*
pi*dens(j)*
atom%basis%grid%rad2(j), j=nr, 1, -1)
928 WRITE (iw,
'(T4,A)')
'</PP_RHOATOM>'
933 WRITE (iw,
'(T4,A)')
'<PP_SPIN_ORB>'
938 IF (abs(
atom%state%occupation(l, i)) == 0._dp) cycle
939 occa =
atom%state%occupation(l, i)
946 CALL compose(string,
"<PP_RELWFC", counter=nwfn)
947 WRITE (iw,
'(T8,A)') trim(string)
948 CALL compose(string,
"index", ival=nwfn)
949 WRITE (iw,
'(T12,A)') trim(string)
952 CALL compose(string,
"nn", ival=nwfn)
953 WRITE (iw,
'(T12,A)') trim(string)
954 CALL compose(string,
"lchi", ival=l)
955 WRITE (iw,
'(T12,A)') trim(string)
961 CALL compose(string,
"jchi", rval=rlp)
962 WRITE (iw,
'(T12,A)') trim(string)
963 CALL compose(string,
"oc", rval=occa)
964 WRITE (iw,
'(T12,A)') trim(string)
965 WRITE (iw,
'(T12,A)')
'/>'
968 CALL compose(string,
"<PP_RELWFC", counter=nwfn)
969 WRITE (iw,
'(T8,A)') trim(string)
970 CALL compose(string,
"index", ival=nwfn)
971 WRITE (iw,
'(T12,A)') trim(string)
974 CALL compose(string,
"nn", ival=nwfn)
975 WRITE (iw,
'(T12,A)') trim(string)
976 CALL compose(string,
"lchi", ival=l)
977 WRITE (iw,
'(T12,A)') trim(string)
979 CALL compose(string,
"jchi", rval=rlp)
980 WRITE (iw,
'(T12,A)') trim(string)
981 CALL compose(string,
"oc", rval=occa)
982 WRITE (iw,
'(T12,A)') trim(string)
983 WRITE (iw,
'(T12,A)')
'/>'
989 IF (pot%nl(l) == 0) cycle
992 CALL compose(string,
"<PP_RELBETA", counter=ibeta)
993 WRITE (iw,
'(T8,A)') trim(string)
994 CALL compose(string,
"index", ival=ibeta)
995 WRITE (iw,
'(T12,A)') trim(string)
996 CALL compose(string,
"lll", ival=l)
997 WRITE (iw,
'(T12,A)') trim(string)
1003 CALL compose(string,
"jjj", rval=rlp)
1004 WRITE (iw,
'(T12,A)') trim(string)
1005 WRITE (iw,
'(T12,A)')
'/>'
1008 CALL compose(string,
"<PP_RELBETA", counter=ibeta)
1009 WRITE (iw,
'(T8,A)') trim(string)
1010 CALL compose(string,
"index", ival=ibeta)
1011 WRITE (iw,
'(T12,A)') trim(string)
1012 CALL compose(string,
"lll", ival=l)
1013 WRITE (iw,
'(T12,A)') trim(string)
1015 CALL compose(string,
"jjj", rval=rlp)
1016 WRITE (iw,
'(T12,A)') trim(string)
1017 WRITE (iw,
'(T12,A)')
'/>'
1021 WRITE (iw,
'(T4,A)')
'</PP_SPIN_ORB>'
1024 WRITE (iw,
'(A)')
'</UPF>'
1026 END SUBROUTINE atom_write_upf
1040 SUBROUTINE compose(string, tag, counter, rval, ival, cval, isfinal)
1041 CHARACTER(len=*),
INTENT(OUT) :: string
1042 CHARACTER(len=*),
INTENT(IN) :: tag
1043 INTEGER,
INTENT(IN),
OPTIONAL :: counter
1044 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: rval
1045 INTEGER,
INTENT(IN),
OPTIONAL :: ival
1046 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: cval
1047 LOGICAL,
INTENT(IN),
OPTIONAL :: isfinal
1049 CHARACTER(LEN=default_string_length) :: str
1052 IF (
PRESENT(counter))
THEN
1053 WRITE (str,
"(I12)") counter
1054 ELSEIF (
PRESENT(rval))
THEN
1055 WRITE (str,
"(G18.8)") rval
1056 ELSEIF (
PRESENT(ival))
THEN
1057 WRITE (str,
"(I12)") ival
1058 ELSEIF (
PRESENT(cval))
THEN
1059 WRITE (str,
"(A)") trim(adjustl(cval))
1061 WRITE (str,
"(A)")
""
1064 IF (
PRESENT(isfinal)) fin = isfinal
1065 IF (
PRESENT(counter))
THEN
1067 WRITE (string,
"(A,A1,A,A1)") trim(adjustl(tag)),
'.', trim(adjustl(str)),
'>'
1069 WRITE (string,
"(A,A1,A)") trim(adjustl(tag)),
'.', trim(adjustl(str))
1073 WRITE (string,
"(A,A2,A,A2)") trim(adjustl(tag)),
'="', trim(adjustl(str)),
'>"'
1075 WRITE (string,
"(A,A2,A,A1)") trim(adjustl(tag)),
'="', trim(adjustl(str)),
'"'
1078 END SUBROUTINE compose
program graph
Program to Map on grid the hills spawned during a metadynamics run.
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.
routines that fit parameters for /from atomic calculations
subroutine, public atom_fit_density(atom, num_gto, norder, iunit, agto, powell_section, results)
Fit the atomic electron density using a geometrical Gaussian basis set.
subroutine, public atom_fit_kgpot(atom, num_gau, num_pol, iunit, powell_section, results)
...
subroutine, public atom_grb_construction(atom_info, atom_section, iw)
Construct geometrical response basis set.
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.
subroutine, public atom_print_orbitals(atom, iw, xmgrace)
Print atomic orbitals.
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_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.
subroutine, public atom_sgp_construction(atom_info, input_section, iw)
...
Define the atom type and its sub types.
subroutine, public read_atom_opt_section(optimization, opt_section)
...
subroutine, public create_atom_type(atom)
...
subroutine, public release_atom_type(atom)
...
subroutine, public release_atom_potential(potential)
...
subroutine, public init_atom_basis(basis, basis_section, zval, btyp)
Initialize the basis for the atomic code.
integer, parameter, public lmat
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)
...
subroutine, public create_atom_orbs(orbs, mbas, mo)
...
Some basic routines for atomic calculations.
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)
...
subroutine, public atom_read_external_vxc(vxc, atom, iw)
ZMP subroutine to read external v_xc in the atomic code.
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)
...
pure integer function, dimension(0:lmat), public get_maxn_occ(occupation)
Return the maximum principal quantum number of occupied orbitals.
subroutine, public atom_density(density, pmat, basis, maxl, typ, rr)
Map the electron density on an atomic radial grid.
subroutine, public atom_read_external_density(density, atom, iw)
ZMP subroutine to read external density from linear grid of density matrix.
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.
subroutine, public atom_set_occupation(ostring, occupation, wfnocc, multiplicity)
Set occupation of atomic orbitals.
pure integer function, public get_maxl_occ(occupation)
Return the maximum orbital quantum number of occupied orbitals.
routines that build the integrals of the Vxc potential calculated for the atomic code
subroutine, public calculate_atom_ext_vxc(vxc, atom, lprint, xcmat)
ZMP subroutine for the scf external density from the external v_xc.
subroutine, public calculate_atom_zmp(ext_density, atom, lprint, xcmat)
ZMP subroutine for the calculation of the effective constraint potential in the atomic code.
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,...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
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:
real(kind=dp), parameter, public bohr
Routines to facilitate writing XMGRACE files.
Provides all information about a basis set.
Provides all information about a pseudopotential.
Information on optimization procedure.
Holds atomic orbitals and energies.
Provides all information on states and occupation.
Provides all information about an atomic kind.
type of a logger, at the moment it contains just a print level starting at which level it should be l...