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
97 IF (sum(orb_basis_set%nsgf_set) == 0)
THEN
98 CALL cp_abort(__location__, &
99 "Cannot autocreate RI_AUX basis set for at least one of the given "// &
100 "primary basis sets due to missing exponents. If you have invoked BASIS_SET NONE, "// &
101 "you should state BASIS_SET RI_AUX NONE explicitly in the input.")
103 CALL get_basis_keyfigures(orb_basis_set, lmax, zmin, zmax, zeff)
107 CALL get_basis_products(lmax, zmin, zmax, zeff, pmin, pmax, peff)
108 CALL get_qs_kind(qs_kind, zeff=zval, elec_conf=econf, element_symbol=element_symbol)
111 DO l = 0, maxval(ubound(econf))
112 IF (econf(l) > 0) lval = l
114 IF (sum(econf) /= nint(zval))
THEN
115 cpwarn(
"Valence charge and electron configuration not consistent")
120 SELECT CASE (basis_cntrl)
122 laux = max(2*lval, lmax + linc)
124 laux = max(2*lval, lmax + linc)
126 laux = max(2*lval, lmax + linc + 1)
128 laux = max(2*lmax, lmax + linc + 2)
130 cpabort(
"Invalid value of control variable")
133 DO l = 2*lmax + 1, laux
142 IF (l <= 2*lval)
THEN
143 pend(l) = min(fv(l)*peff(l), pmax(l))
149 xv = log(pend(l)/pmin(l))/log(bval(l)) + 1.e-10_dp
150 nval(l) = max(ceiling(xv), 0)
156 DO l = lval + 1, laux
157 IF (nval(l) < nval(lval) - 1)
EXIT
161 IF (laux > ls2(1))
THEN
162 IF (lval == 0 .OR. 2*lval <= ls2(1) + 1)
THEN
169 ls2(2) = min(2*lval, laux)
172 IF (nval(l) < nval(lx) - 1)
EXIT
175 IF (laux > ls2(2))
THEN
187 DO j = ls1(i), ls2(i)
188 amax(i) = max(amax(i), pend(j))
189 amin(i) = min(amin(i), pmin(j))
190 bmin(i) = min(bmin(i), bval(j))
192 xv = log(amax(i)/amin(i))/log(bmin(i)) + 1.e-10_dp
193 npgf(i) = max(ceiling(xv), 0)
195 nx = maxval(npgf(1:nsets))
196 ALLOCATE (zet(nx, nsets))
202 zet(jj, i) = amin(i)*bmin(i)**(j - 1)
204 DO l = ls1(i), ls2(i)
208 bsname = trim(element_symbol)//
"-RI-AUX-"//trim(orb_basis_set%name)
210 CALL create_aux_basis(ri_aux_basis_set, bsname, nsets, ls1, ls2, nl, npgf, zet)
214 IF (
PRESENT(basis_sort))
THEN
232 exact_1c_terms, tda_kernel)
235 INTEGER,
INTENT(IN) :: basis_cntrl
236 LOGICAL,
INTENT(IN),
OPTIONAL :: exact_1c_terms, tda_kernel
238 CHARACTER(LEN=2) :: element_symbol
239 CHARACTER(LEN=default_string_length) :: bsname
240 INTEGER :: i, j, l, laux, linc, lm, lmax, lval, n1, &
242 INTEGER,
DIMENSION(0:18) :: nval
243 INTEGER,
DIMENSION(0:9, 1:50) :: nl
244 INTEGER,
DIMENSION(1:50) :: ls1, ls2, npgf
245 INTEGER,
DIMENSION(:),
POINTER :: econf
246 LOGICAL :: e1terms, kernel_basis
247 REAL(kind=
dp) :: xv, zval
248 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: zet
249 REAL(kind=
dp),
DIMENSION(0:18) :: bval, peff, pend, pmax, pmin
250 REAL(kind=
dp),
DIMENSION(0:9) :: zeff, zmax, zmin
251 REAL(kind=
dp),
DIMENSION(4) :: bv, bx
255 IF (
PRESENT(exact_1c_terms))
THEN
256 e1terms = exact_1c_terms
260 IF (
PRESENT(tda_kernel))
THEN
261 kernel_basis = tda_kernel
263 kernel_basis = .false.
265 IF (kernel_basis .AND. e1terms)
THEN
266 CALL cp_warn(__location__,
"LRI Kernel basis generation will ignore exact 1C term option.")
269 cpassert(.NOT.
ASSOCIATED(lri_aux_basis_set))
270 NULLIFY (orb_basis_set)
271 CALL get_qs_kind(qs_kind, basis_set=orb_basis_set, basis_type=
"ORB")
272 IF (
ASSOCIATED(orb_basis_set))
THEN
273 CALL get_basis_keyfigures(orb_basis_set, lmax, zmin, zmax, zeff)
274 CALL get_basis_products(lmax, zmin, zmax, zeff, pmin, pmax, peff)
275 CALL get_qs_kind(qs_kind, zeff=zval, elec_conf=econf, element_symbol=element_symbol)
278 DO l = 0, maxval(ubound(econf))
279 IF (econf(l) > 0) lval = l
281 IF (sum(econf) /= nint(zval))
THEN
282 cpwarn(
"Valence charge and electron configuration not consistent")
288 IF (kernel_basis)
THEN
289 bv(1:4) = (/3.20_dp, 2.80_dp, 2.40_dp, 2.00_dp/)
290 bx(1:4) = (/4.00_dp, 3.50_dp, 3.00_dp, 2.50_dp/)
292 SELECT CASE (basis_cntrl)
296 laux = max(lval + 1, lmax)
298 laux = max(lval + 2, lmax + 1)
300 laux = max(lval + 3, lmax + 2)
301 laux = min(laux, 2 + linc)
303 cpabort(
"Invalid value of control variable")
306 bv(1:4) = (/2.00_dp, 1.90_dp, 1.80_dp, 1.80_dp/)
307 bx(1:4) = (/2.60_dp, 2.40_dp, 2.20_dp, 2.20_dp/)
309 SELECT CASE (basis_cntrl)
311 laux = max(2*lval, lmax + linc)
312 laux = min(laux, 2 + linc)
314 laux = max(2*lval, lmax + linc)
315 laux = min(laux, 3 + linc)
317 laux = max(2*lval, lmax + linc + 1)
318 laux = min(laux, 4 + linc)
320 laux = max(2*lval, lmax + linc + 1)
321 laux = min(laux, 4 + linc)
323 cpabort(
"Invalid value of control variable")
327 DO l = 2*lmax + 1, laux
328 pmin(l) = pmin(2*lmax)
329 pmax(l) = pmax(2*lmax)
330 peff(l) = peff(2*lmax)
334 IF (exact_1c_terms)
THEN
336 IF (l <= lval + 1)
THEN
337 pend(l) = zmax(l) + 1.0_dp
338 bval(l) = bv(basis_cntrl + 1)
340 pend(l) = 2.0_dp*peff(l)
341 bval(l) = bx(basis_cntrl + 1)
344 xv = log(pend(l)/pmin(l))/log(bval(l)) + 1.e-10_dp
345 nval(l) = max(ceiling(xv), 0)
346 bval(l) = (pend(l)/pmin(l))**(1._dp/nval(l))
350 IF (l <= lval + 1)
THEN
352 bval(l) = bv(basis_cntrl + 1)
355 pend(l) = 4.0_dp*peff(l)
356 bval(l) = bx(basis_cntrl + 1)
358 xv = log(pend(l)/pmin(l))/log(bval(l)) + 1.e-10_dp
359 nval(l) = max(ceiling(xv), 0)
360 bval(l) = (pend(l)/pmin(l))**(1._dp/nval(l))
365 n1 = maxval(nval(0:lm))
366 IF (laux < lm + 1)
THEN
369 n2 = maxval(nval(lm + 1:laux))
373 ALLOCATE (zet(1, nsets))
376 j = maxval(maxloc(nval(0:lm)))
381 zet(1, i) = pmin(j)*bval(j)**(i - 1)
391 zet(1, i) = pmin(j)*bval(j)**(i - n1 - 1)
397 bsname = trim(element_symbol)//
"-LRI-AUX-"//trim(orb_basis_set%name)
399 CALL create_aux_basis(lri_aux_basis_set, bsname, nsets, ls1, ls2, nl, npgf, zet)
415 INTEGER,
INTENT(IN) :: lmax_oce, nbas_oce
417 CHARACTER(LEN=default_string_length) :: bsname
418 INTEGER :: i, l, lmax, lx, nset, nx
419 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lmin, lset, npgf
420 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: nl
421 INTEGER,
DIMENSION(:),
POINTER :: npgf_orb
422 REAL(kind=
dp) :: cval, x, z0, z1
423 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: zet
424 REAL(kind=
dp),
DIMENSION(0:9) :: zeff, zmax, zmin
426 CALL get_basis_keyfigures(orb_basis, lmax, zmin, zmax, zeff)
427 IF (nbas_oce < 1)
THEN
429 nx = sum(npgf_orb(1:nset))
433 nset = max(nbas_oce, nx)
434 lx = max(lmax_oce, lmax)
436 bsname =
"OCE-"//trim(orb_basis%name)
437 ALLOCATE (lmin(nset), lset(nset), nl(0:9, nset), npgf(nset), zet(1, nset))
444 z0 = minval(zmin(0:lmax))
445 z1 = maxval(zmax(0:lmax))
446 x = 1.0_dp/real(nset - 1, kind=
dp)
449 DO i = nset - 1, 1, -1
450 zet(1, i) = zet(1, i + 1)*cval
456 IF (x < z1) lset(i) = l
458 IF (lset(i) == lmax) lset(i) = lx
463 DEALLOCATE (lmin, lset, nl, npgf, zet)
474 SUBROUTINE get_basis_keyfigures(basis_set, lmax, zmin, zmax, zeff)
476 INTEGER,
INTENT(OUT) :: lmax
477 REAL(kind=
dp),
DIMENSION(0:9),
INTENT(OUT) :: zmin, zmax, zeff
479 INTEGER :: i, ipgf, iset, ishell, j, l, nset
480 INTEGER,
DIMENSION(:),
POINTER :: lm, npgf, nshell
481 INTEGER,
DIMENSION(:, :),
POINTER :: lshell
482 REAL(kind=
dp) :: aeff, gcca, gccb, kval, rexp, rint, rno, &
484 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: zet
485 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: gcc
505 DO ipgf = 1, npgf(iset)
506 DO ishell = 1, nshell(iset)
507 l = lshell(ishell, iset)
508 zeta = zet(ipgf, iset)
509 zmax(l) = max(zmax(l), zeta)
510 zmin(l) = min(zmin(l), zeta)
514 DO ishell = 1, nshell(iset)
515 l = lshell(ishell, iset)
516 kval =
fac(l + 1)**2*2._dp**(2*l + 1)/
fac(2*l + 2)
520 gcca = gcc(i, ishell, iset)
522 zeta = zet(i, iset) + zet(j, iset)
523 gccb = gcc(j, ishell, iset)
524 rint = 0.5_dp*
fac(l + 1)/zeta**(l + 2)
525 rexp = rexp + gcca*gccb*rint
526 rint =
rootpi*0.5_dp**(l + 2)*
dfac(2*l + 1)/zeta**(l + 1.5_dp)
527 rno = rno + gcca*gccb*rint
531 aeff = (
fac(l + 1)/
dfac(2*l + 1))**2*2._dp**(2*l + 1)/(
pi*rexp**2)
532 zeff(l) = max(zeff(l), aeff)
536 END SUBROUTINE get_basis_keyfigures
548 SUBROUTINE get_basis_products(lmax, zmin, zmax, zeff, pmin, pmax, peff)
549 INTEGER,
INTENT(IN) :: lmax
550 REAL(kind=
dp),
DIMENSION(0:9),
INTENT(IN) :: zmin, zmax, zeff
551 REAL(kind=
dp),
DIMENSION(0:18),
INTENT(OUT) :: pmin, pmax, peff
553 INTEGER :: l1, l2, la
561 DO la = l2 - l1, l2 + l1
562 pmax(la) = max(pmax(la), zmax(l1) + zmax(l2))
563 pmin(la) = min(pmin(la), zmin(l1) + zmin(l2))
564 peff(la) = max(peff(la), zeff(l1) + zeff(l2))
569 END SUBROUTINE get_basis_products
582 SUBROUTINE overlap_maximum(lm, npgf, nfun, zet, gcc, nfit, afit, amet, eval)
583 INTEGER,
INTENT(IN) :: lm, npgf, nfun
584 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: zet
585 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: gcc
586 INTEGER,
INTENT(IN) :: nfit
587 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: afit
588 REAL(kind=
dp),
INTENT(IN) :: amet
589 REAL(kind=
dp),
INTENT(OUT) :: eval
591 INTEGER :: i, ia, ib, info
592 REAL(kind=
dp) :: fij, fxij, intab, p, xij
593 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: fx, tx, x2, xx
599 p = zet(ia) + zet(ib) + amet
600 intab = 0.5_dp/p**(lm + 1.5_dp)*
gamma1(lm + 1)
602 fij = fij + gcc(ia, i)*gcc(ib, i)*intab
608 ALLOCATE (fx(nfit, nfun), tx(nfit, nfun))
612 p = zet(ia) + afit(ib) + amet
613 intab = 0.5_dp/p**(lm + 1.5_dp)*
gamma1(lm + 1)
615 fx(ib, i) = fx(ib, i) + gcc(ia, i)*intab
621 ALLOCATE (xx(nfit, nfit), x2(nfit, nfit))
624 p = afit(ia) + afit(ib) + amet
625 xx(ia, ib) = 0.5_dp/p**(lm + 1.5_dp)*
gamma1(lm + 1)
630 tx(1:nfit, 1:nfun) = fx(1:nfit, 1:nfun)
631 x2(1:nfit, 1:nfit) = xx(1:nfit, 1:nfit)
632 CALL dposv(
"U", nfit, nfun, x2, nfit, tx, nfit, info)
637 xij = xij + dot_product(tx(:, i), matmul(xx, tx(:, i)))
642 fxij = fxij + dot_product(tx(:, i), fx(:, i))
645 eval = fij - 2.0_dp*fxij + xij
651 DEALLOCATE (fx, xx, x2, tx)
653 END SUBROUTINE overlap_maximum
660 SUBROUTINE neb_potential(x, n, eval)
661 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: x
662 INTEGER,
INTENT(IN) :: n
663 REAL(kind=
dp),
INTENT(INOUT) :: eval
668 IF (x(i) < 1.5_dp)
THEN
669 eval = eval + 10.0_dp*(1.5_dp - x(i))**2
673 END SUBROUTINE neb_potential
683 SUBROUTINE get_basis_functions(basis_set, lin, np, nf, zval, gcval)
685 INTEGER,
INTENT(IN) :: lin
686 INTEGER,
INTENT(OUT) :: np, nf
687 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zval
688 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: gcval
690 INTEGER :: iset, ishell, j1, j2, jf, jp, l, nset
691 INTEGER,
DIMENSION(:),
POINTER :: lm, npgf, nshell
692 INTEGER,
DIMENSION(:, :),
POINTER :: lshell
694 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: zet
695 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: gcc
710 DO ishell = 1, nshell(iset)
711 l = lshell(ishell, iset)
721 ALLOCATE (zval(np), gcval(np, nf))
729 DO ishell = 1, nshell(iset)
730 l = lshell(ishell, iset)
736 zval(j1:j2) = zet(1:npgf(iset), iset)
740 gcval(j1:j2, jf) = gcc(1:npgf(iset), ishell, iset)
745 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.