33#include "./base/base_uses.f90"
39 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'auto_basis'
59 INTEGER,
INTENT(IN) :: basis_cntrl
60 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: basis_type
61 INTEGER,
INTENT(IN),
OPTIONAL :: basis_sort
63 CHARACTER(LEN=2) :: element_symbol
64 CHARACTER(LEN=default_string_length) :: bsname
65 INTEGER :: i, j, jj, l, laux, linc, lmax, lval, lx, &
67 INTEGER,
DIMENSION(0:18) :: nval
68 INTEGER,
DIMENSION(0:9, 1:20) :: nl
69 INTEGER,
DIMENSION(1:3) :: ls1, ls2, npgf
70 INTEGER,
DIMENSION(:),
POINTER :: econf
71 REAL(kind=
dp) :: xv, zval
72 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: zet
73 REAL(kind=
dp),
DIMENSION(0:18) :: bv, bval, fv, peff, pend, pmax, pmin
74 REAL(kind=
dp),
DIMENSION(0:9) :: zeff, zmax, zmin
75 REAL(kind=
dp),
DIMENSION(3) :: amax, amin, bmin
81 bv(0:18) = (/1.8_dp, 2.0_dp, 2.2_dp, 2.2_dp, 2.3_dp, 3.0_dp, 3.0_dp, 3.0_dp, 3.0_dp, 3.0_dp, 3.0_dp, &
82 3.0_dp, 3.0_dp, 3.0_dp, 3.0_dp, 3.0_dp, 3.0_dp, 3.0_dp, 3.0_dp/)
83 fv(0:18) = (/20.0_dp, 4.0_dp, 4.0_dp, 3.5_dp, 2.5_dp, 2.0_dp, 2.0_dp, 2.0_dp, 2.0_dp, 2.0_dp, 2.0_dp, &
84 2.0_dp, 2.0_dp, 2.0_dp, 2.0_dp, 2.0_dp, 2.0_dp, 2.0_dp, 2.0_dp/)
86 cpassert(.NOT.
ASSOCIATED(ri_aux_basis_set))
87 NULLIFY (orb_basis_set)
88 IF (.NOT.
PRESENT(basis_type))
THEN
89 CALL get_qs_kind(qs_kind, basis_set=orb_basis_set, basis_type=
"ORB")
91 CALL get_qs_kind(qs_kind, basis_set=orb_basis_set, basis_type=basis_type)
93 IF (
ASSOCIATED(orb_basis_set))
THEN
94 CALL get_basis_keyfigures(orb_basis_set, lmax, zmin, zmax, zeff)
98 CALL get_basis_products(lmax, zmin, zmax, zeff, pmin, pmax, peff)
99 CALL get_qs_kind(qs_kind, zeff=zval, elec_conf=econf, element_symbol=element_symbol)
102 DO l = 0, maxval(ubound(econf))
103 IF (econf(l) > 0) lval = l
105 IF (sum(econf) /= nint(zval))
THEN
106 cpwarn(
"Valence charge and electron configuration not consistent")
111 SELECT CASE (basis_cntrl)
113 laux = max(2*lval, lmax + linc)
115 laux = max(2*lval, lmax + linc)
117 laux = max(2*lval, lmax + linc + 1)
119 laux = max(2*lmax, lmax + linc + 2)
121 cpabort(
"Invalid value of control variable")
124 DO l = 2*lmax + 1, laux
133 IF (l <= 2*lval)
THEN
134 pend(l) = min(fv(l)*peff(l), pmax(l))
140 xv = log(pend(l)/pmin(l))/log(bval(l)) + 1.e-10_dp
141 nval(l) = max(ceiling(xv), 0)
147 DO l = lval + 1, laux
148 IF (nval(l) < nval(lval) - 1)
EXIT
152 IF (laux > ls2(1))
THEN
153 IF (lval == 0 .OR. 2*lval <= ls2(1) + 1)
THEN
160 ls2(2) = min(2*lval, laux)
163 IF (nval(l) < nval(lx) - 1)
EXIT
166 IF (laux > ls2(2))
THEN
178 DO j = ls1(i), ls2(i)
179 amax(i) = max(amax(i), pend(j))
180 amin(i) = min(amin(i), pmin(j))
181 bmin(i) = min(bmin(i), bval(j))
183 xv = log(amax(i)/amin(i))/log(bmin(i)) + 1.e-10_dp
184 npgf(i) = max(ceiling(xv), 0)
186 nx = maxval(npgf(1:nsets))
187 ALLOCATE (zet(nx, nsets))
193 zet(jj, i) = amin(i)*bmin(i)**(j - 1)
195 DO l = ls1(i), ls2(i)
199 bsname = trim(element_symbol)//
"-RI-AUX-"//trim(orb_basis_set%name)
201 CALL create_aux_basis(ri_aux_basis_set, bsname, nsets, ls1, ls2, nl, npgf, zet)
205 IF (
PRESENT(basis_sort))
THEN
223 exact_1c_terms, tda_kernel)
226 INTEGER,
INTENT(IN) :: basis_cntrl
227 LOGICAL,
INTENT(IN),
OPTIONAL :: exact_1c_terms, tda_kernel
229 CHARACTER(LEN=2) :: element_symbol
230 CHARACTER(LEN=default_string_length) :: bsname
231 INTEGER :: i, j, l, laux, linc, lm, lmax, lval, n1, &
233 INTEGER,
DIMENSION(0:18) :: nval
234 INTEGER,
DIMENSION(0:9, 1:50) :: nl
235 INTEGER,
DIMENSION(1:50) :: ls1, ls2, npgf
236 INTEGER,
DIMENSION(:),
POINTER :: econf
237 LOGICAL :: e1terms, kernel_basis
238 REAL(kind=
dp) :: xv, zval
239 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: zet
240 REAL(kind=
dp),
DIMENSION(0:18) :: bval, peff, pend, pmax, pmin
241 REAL(kind=
dp),
DIMENSION(0:9) :: zeff, zmax, zmin
242 REAL(kind=
dp),
DIMENSION(4) :: bv, bx
246 IF (
PRESENT(exact_1c_terms))
THEN
247 e1terms = exact_1c_terms
251 IF (
PRESENT(tda_kernel))
THEN
252 kernel_basis = tda_kernel
254 kernel_basis = .false.
256 IF (kernel_basis .AND. e1terms)
THEN
257 CALL cp_warn(__location__,
"LRI Kernel basis generation will ignore exact 1C term option.")
260 cpassert(.NOT.
ASSOCIATED(lri_aux_basis_set))
261 NULLIFY (orb_basis_set)
262 CALL get_qs_kind(qs_kind, basis_set=orb_basis_set, basis_type=
"ORB")
263 IF (
ASSOCIATED(orb_basis_set))
THEN
264 CALL get_basis_keyfigures(orb_basis_set, lmax, zmin, zmax, zeff)
265 CALL get_basis_products(lmax, zmin, zmax, zeff, pmin, pmax, peff)
266 CALL get_qs_kind(qs_kind, zeff=zval, elec_conf=econf, element_symbol=element_symbol)
269 DO l = 0, maxval(ubound(econf))
270 IF (econf(l) > 0) lval = l
272 IF (sum(econf) /= nint(zval))
THEN
273 cpwarn(
"Valence charge and electron configuration not consistent")
279 IF (kernel_basis)
THEN
280 bv(1:4) = (/3.20_dp, 2.80_dp, 2.40_dp, 2.00_dp/)
281 bx(1:4) = (/4.00_dp, 3.50_dp, 3.00_dp, 2.50_dp/)
283 SELECT CASE (basis_cntrl)
287 laux = max(lval + 1, lmax)
289 laux = max(lval + 2, lmax + 1)
291 laux = max(lval + 3, lmax + 2)
292 laux = min(laux, 2 + linc)
294 cpabort(
"Invalid value of control variable")
297 bv(1:4) = (/2.00_dp, 1.90_dp, 1.80_dp, 1.80_dp/)
298 bx(1:4) = (/2.60_dp, 2.40_dp, 2.20_dp, 2.20_dp/)
300 SELECT CASE (basis_cntrl)
302 laux = max(2*lval, lmax + linc)
303 laux = min(laux, 2 + linc)
305 laux = max(2*lval, lmax + linc)
306 laux = min(laux, 3 + linc)
308 laux = max(2*lval, lmax + linc + 1)
309 laux = min(laux, 4 + linc)
311 laux = max(2*lval, lmax + linc + 1)
312 laux = min(laux, 4 + linc)
314 cpabort(
"Invalid value of control variable")
318 DO l = 2*lmax + 1, laux
319 pmin(l) = pmin(2*lmax)
320 pmax(l) = pmax(2*lmax)
321 peff(l) = peff(2*lmax)
325 IF (exact_1c_terms)
THEN
327 IF (l <= lval + 1)
THEN
328 pend(l) = zmax(l) + 1.0_dp
329 bval(l) = bv(basis_cntrl + 1)
331 pend(l) = 2.0_dp*peff(l)
332 bval(l) = bx(basis_cntrl + 1)
335 xv = log(pend(l)/pmin(l))/log(bval(l)) + 1.e-10_dp
336 nval(l) = max(ceiling(xv), 0)
337 bval(l) = (pend(l)/pmin(l))**(1._dp/nval(l))
341 IF (l <= lval + 1)
THEN
343 bval(l) = bv(basis_cntrl + 1)
346 pend(l) = 4.0_dp*peff(l)
347 bval(l) = bx(basis_cntrl + 1)
349 xv = log(pend(l)/pmin(l))/log(bval(l)) + 1.e-10_dp
350 nval(l) = max(ceiling(xv), 0)
351 bval(l) = (pend(l)/pmin(l))**(1._dp/nval(l))
356 n1 = maxval(nval(0:lm))
357 IF (laux < lm + 1)
THEN
360 n2 = maxval(nval(lm + 1:laux))
364 ALLOCATE (zet(1, nsets))
367 j = maxval(maxloc(nval(0:lm)))
372 zet(1, i) = pmin(j)*bval(j)**(i - 1)
382 zet(1, i) = pmin(j)*bval(j)**(i - n1 - 1)
388 bsname = trim(element_symbol)//
"-LRI-AUX-"//trim(orb_basis_set%name)
390 CALL create_aux_basis(lri_aux_basis_set, bsname, nsets, ls1, ls2, nl, npgf, zet)
406 INTEGER,
INTENT(IN) :: lmax_oce, nbas_oce
408 CHARACTER(LEN=default_string_length) :: bsname
409 INTEGER :: i, l, lmax, lx, nset, nx
410 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lmin, lset, npgf
411 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: nl
412 INTEGER,
DIMENSION(:),
POINTER :: npgf_orb
413 REAL(kind=
dp) :: cval, x, z0, z1
414 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: zet
415 REAL(kind=
dp),
DIMENSION(0:9) :: zeff, zmax, zmin
417 CALL get_basis_keyfigures(orb_basis, lmax, zmin, zmax, zeff)
418 IF (nbas_oce < 1)
THEN
420 nx = sum(npgf_orb(1:nset))
424 nset = max(nbas_oce, nx)
425 lx = max(lmax_oce, lmax)
427 bsname =
"OCE-"//trim(orb_basis%name)
428 ALLOCATE (lmin(nset), lset(nset), nl(0:9, nset), npgf(nset), zet(1, nset))
435 z0 = minval(zmin(0:lmax))
436 z1 = maxval(zmax(0:lmax))
437 x = 1.0_dp/real(nset - 1, kind=
dp)
440 DO i = nset - 1, 1, -1
441 zet(1, i) = zet(1, i + 1)*cval
447 IF (x < z1) lset(i) = l
449 IF (lset(i) == lmax) lset(i) = lx
454 DEALLOCATE (lmin, lset, nl, npgf, zet)
465 SUBROUTINE get_basis_keyfigures(basis_set, lmax, zmin, zmax, zeff)
467 INTEGER,
INTENT(OUT) :: lmax
468 REAL(kind=
dp),
DIMENSION(0:9),
INTENT(OUT) :: zmin, zmax, zeff
470 INTEGER :: i, ipgf, iset, ishell, j, l, nset
471 INTEGER,
DIMENSION(:),
POINTER :: lm, npgf, nshell
472 INTEGER,
DIMENSION(:, :),
POINTER :: lshell
473 REAL(kind=
dp) :: aeff, gcca, gccb, kval, rexp, rint, rno, &
475 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: zet
476 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: gcc
496 DO ipgf = 1, npgf(iset)
497 DO ishell = 1, nshell(iset)
498 l = lshell(ishell, iset)
499 zeta = zet(ipgf, iset)
500 zmax(l) = max(zmax(l), zeta)
501 zmin(l) = min(zmin(l), zeta)
505 DO ishell = 1, nshell(iset)
506 l = lshell(ishell, iset)
507 kval =
fac(l + 1)**2*2._dp**(2*l + 1)/
fac(2*l + 2)
511 gcca = gcc(i, ishell, iset)
513 zeta = zet(i, iset) + zet(j, iset)
514 gccb = gcc(j, ishell, iset)
515 rint = 0.5_dp*
fac(l + 1)/zeta**(l + 2)
516 rexp = rexp + gcca*gccb*rint
517 rint =
rootpi*0.5_dp**(l + 2)*
dfac(2*l + 1)/zeta**(l + 1.5_dp)
518 rno = rno + gcca*gccb*rint
522 aeff = (
fac(l + 1)/
dfac(2*l + 1))**2*2._dp**(2*l + 1)/(
pi*rexp**2)
523 zeff(l) = max(zeff(l), aeff)
527 END SUBROUTINE get_basis_keyfigures
539 SUBROUTINE get_basis_products(lmax, zmin, zmax, zeff, pmin, pmax, peff)
540 INTEGER,
INTENT(IN) :: lmax
541 REAL(kind=
dp),
DIMENSION(0:9),
INTENT(IN) :: zmin, zmax, zeff
542 REAL(kind=
dp),
DIMENSION(0:18),
INTENT(OUT) :: pmin, pmax, peff
544 INTEGER :: l1, l2, la
552 DO la = l2 - l1, l2 + l1
553 pmax(la) = max(pmax(la), zmax(l1) + zmax(l2))
554 pmin(la) = min(pmin(la), zmin(l1) + zmin(l2))
555 peff(la) = max(peff(la), zeff(l1) + zeff(l2))
560 END SUBROUTINE get_basis_products
573 SUBROUTINE overlap_maximum(lm, npgf, nfun, zet, gcc, nfit, afit, amet, eval)
574 INTEGER,
INTENT(IN) :: lm, npgf, nfun
575 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: zet
576 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: gcc
577 INTEGER,
INTENT(IN) :: nfit
578 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: afit
579 REAL(kind=
dp),
INTENT(IN) :: amet
580 REAL(kind=
dp),
INTENT(OUT) :: eval
582 INTEGER :: i, ia, ib, info
583 REAL(kind=
dp) :: fij, fxij, intab, p, xij
584 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: fx, tx, x2, xx
590 p = zet(ia) + zet(ib) + amet
591 intab = 0.5_dp/p**(lm + 1.5_dp)*
gamma1(lm + 1)
593 fij = fij + gcc(ia, i)*gcc(ib, i)*intab
599 ALLOCATE (fx(nfit, nfun), tx(nfit, nfun))
603 p = zet(ia) + afit(ib) + amet
604 intab = 0.5_dp/p**(lm + 1.5_dp)*
gamma1(lm + 1)
606 fx(ib, i) = fx(ib, i) + gcc(ia, i)*intab
612 ALLOCATE (xx(nfit, nfit), x2(nfit, nfit))
615 p = afit(ia) + afit(ib) + amet
616 xx(ia, ib) = 0.5_dp/p**(lm + 1.5_dp)*
gamma1(lm + 1)
621 tx(1:nfit, 1:nfun) = fx(1:nfit, 1:nfun)
622 x2(1:nfit, 1:nfit) = xx(1:nfit, 1:nfit)
623 CALL dposv(
"U", nfit, nfun, x2, nfit, tx, nfit, info)
628 xij = xij + dot_product(tx(:, i), matmul(xx, tx(:, i)))
633 fxij = fxij + dot_product(tx(:, i), fx(:, i))
636 eval = fij - 2.0_dp*fxij + xij
642 DEALLOCATE (fx, xx, x2, tx)
644 END SUBROUTINE overlap_maximum
651 SUBROUTINE neb_potential(x, n, eval)
652 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: x
653 INTEGER,
INTENT(IN) :: n
654 REAL(kind=
dp),
INTENT(INOUT) :: eval
659 IF (x(i) < 1.5_dp)
THEN
660 eval = eval + 10.0_dp*(1.5_dp - x(i))**2
664 END SUBROUTINE neb_potential
674 SUBROUTINE get_basis_functions(basis_set, lin, np, nf, zval, gcval)
676 INTEGER,
INTENT(IN) :: lin
677 INTEGER,
INTENT(OUT) :: np, nf
678 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zval
679 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: gcval
681 INTEGER :: iset, ishell, j1, j2, jf, jp, l, nset
682 INTEGER,
DIMENSION(:),
POINTER :: lm, npgf, nshell
683 INTEGER,
DIMENSION(:, :),
POINTER :: lshell
685 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: zet
686 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: gcc
701 DO ishell = 1, nshell(iset)
702 l = lshell(ishell, iset)
712 ALLOCATE (zval(np), gcval(np, nf))
720 DO ishell = 1, nshell(iset)
721 l = lshell(ishell, iset)
727 zval(j1:j2) = zet(1:npgf(iset), iset)
731 gcval(j1:j2, jf) = gcc(1:npgf(iset), ishell, iset)
736 END SUBROUTINE get_basis_functions
Automatic generation of auxiliary basis sets of different kind.
subroutine, public create_lri_aux_basis_set(lri_aux_basis_set, qs_kind, basis_cntrl, exact_1c_terms, tda_kernel)
Create a LRI_AUX basis set using some heuristics.
subroutine, public create_ri_aux_basis_set(ri_aux_basis_set, qs_kind, basis_cntrl, basis_type, basis_sort)
Create a RI_AUX basis set using some heuristics.
subroutine, public create_oce_basis(oce_basis, orb_basis, lmax_oce, nbas_oce)
...
subroutine, public create_aux_basis(aux_basis, bsname, nsets, lmin, lmax, nl, npgf, zet)
create a basis in GTO form
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)
...
subroutine, public sort_gto_basis_set(basis_set, sort_method)
sort basis sets w.r.t. radius
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public stoychev2016
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
real(kind=dp), dimension(0:maxfac), parameter, public fac
Provides Cartesian and spherical orbital pointers and indices.
subroutine, public init_orbital_pointers(maxl)
Initialize or update the orbital pointers.
Periodic Table related data definitions.
subroutine, public get_ptable_info(symbol, number, amass, ielement, covalent_radius, metallic_radius, vdw_radius, found)
Pass information about the kind given the element symbol.
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, 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.
Provides all information about a quickstep kind.