28 #include "./base/base_uses.f90"
34 INTEGER,
PARAMETER,
PRIVATE :: nelem = 106
36 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'semi_empirical_par_utils'
50 INTEGER,
DIMENSION(0:nelem),
PRIVATE :: Nos = (/-1, &
52 1, 2, 2, 2, 2, 2, 2, 0, &
53 1, 2, 2, 2, 2, 2, 2, 0, &
54 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 0, &
55 1, 2, 2, 2, 1, 1, 2, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 0, &
56 1, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, &
57 2, 2, 1, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 0, &
58 1, 1, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 0, 3, -3, 1, 2, 1, -2, -1/)
61 INTEGER,
DIMENSION(0:nelem),
PRIVATE :: Nop = (/-1, &
63 0, 0, 1, 2, 3, 4, 5, 6, &
64 0, 0, 1, 2, 3, 4, 5, 6, &
65 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, &
66 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, &
67 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
68 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, &
69 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/)
72 INTEGER,
DIMENSION(0:nelem),
PRIVATE :: Nod = (/-1, &
74 0, 0, 0, 0, 0, 0, 0, 0, &
75 0, 0, 0, 0, 0, 0, 0, 0, &
76 0, 0, 1, 2, 3, 5, 5, 6, 7, 8, 10, 0, 0, 0, 0, 0, 0, 0, &
77 0, 0, 1, 2, 4, 5, 5, 7, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, &
78 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, &
79 2, 3, 5, 5, 6, 7, 9, 10, 0, 0, 0, 0, 0, 0, 0, &
80 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/)
90 INTEGER,
DIMENSION(0:nelem),
PARAMETER,
PRIVATE :: nqs = (/-1, &
92 2, 2, 2, 2, 2, 2, 2, 2, &
93 3, 3, 3, 3, 3, 3, 3, 3, &
94 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, &
95 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
96 6, 6, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, &
97 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -1, -1, -1, &
98 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1/)
100 INTEGER,
DIMENSION(0:nelem),
PARAMETER,
PRIVATE :: nqp = (/-1, &
102 2, 2, 2, 2, 2, 2, 2, 2, &
103 3, 3, 3, 3, 3, 3, 3, 3, &
104 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, &
105 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, &
106 6, 6, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, &
107 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -1, -1, -1, &
108 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1/)
110 INTEGER,
DIMENSION(0:nelem),
PARAMETER,
PRIVATE :: nqd = (/-1, &
112 -1, -1, -1, -1, -1, -1, -1, -1, &
113 -1, -1, 3, 3, 3, 3, 3, -1, &
114 -1, -1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, -1, &
115 -1, -1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, -1, &
116 -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, &
117 5, 5, 5, 5, 5, 5, 5, 5, 5, -1, -1, -1, -1, -1, -1, &
118 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1/)
120 INTEGER,
DIMENSION(0:nelem),
PARAMETER,
PRIVATE :: nqf = (/-1, &
122 -1, -1, -1, -1, -1, -1, -1, -1, &
123 -1, -1, -1, -1, -1, -1, -1, -1, &
124 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, &
125 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, &
126 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, &
127 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, &
128 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1/)
131 INTEGER,
DIMENSION(0:nelem),
PARAMETER,
PRIVATE :: zval = (/-1, &
133 1, 2, 3, 4, 5, 6, 7, 8, &
134 1, 2, 3, 4, 5, 6, 7, 8, &
135 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, &
136 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, &
137 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 3, &
138 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, -1, &
139 -1, -1, -1, 4, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1/)
143 INTEGER,
DIMENSION(0:nelem),
PARAMETER,
PRIVATE :: ir016 = (/0, &
145 0, 0, 0, 0, 0, 0, 0, 0, &
146 0, 0, 0, 0, 0, 0, 0, 0, &
147 0, 0, 2, 4, 6, 5, 10, 12, 14, 16, 10, 0, 0, 0, 0, 0, 0, 0, &
148 0, 0, 4, 4, 4, 5, 10, 7, 8, 0, 10, 0, 0, 0, 0, 0, 0, 0, &
149 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
150 4, 6, 8, 10, 12, 14, 9, 10, 0, 0, 0, 0, 0, 0, 0, &
151 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/)
154 INTEGER,
DIMENSION(0:nelem),
PARAMETER,
PRIVATE :: ir066 = (/0, &
156 0, 0, 0, 0, 0, 0, 0, 0, &
157 0, 0, 0, 0, 0, 0, 0, 0, &
158 0, 0, 0, 1, 3, 10, 10, 15, 21, 28, 45, 0, 0, 0, 0, 0, 0, 0, &
159 0, 0, 0, 1, 6, 10, 10, 21, 28, 45, 45, 0, 0, 0, 0, 0, 0, 0, &
160 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
161 1, 3, 6, 10, 15, 21, 36, 45, 0, 0, 0, 0, 0, 0, 0, &
162 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/)
165 INTEGER,
DIMENSION(0:nelem),
PARAMETER,
PRIVATE :: ir244 = (/0, &
167 0, 0, 0, 0, 0, 0, 0, 0, &
168 0, 0, 0, 0, 0, 0, 0, 0, &
169 0, 0, 1, 2, 3, 5, 5, 6, 7, 8, 5, 0, 0, 0, 0, 0, 0, 0, &
170 0, 0, 1, 2, 4, 5, 5, 5, 5, 0, 5, 0, 0, 0, 0, 0, 0, 0, &
171 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
172 2, 3, 4, 5, 6, 7, 5, 5, 0, 0, 0, 0, 0, 0, 0, &
173 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/)
176 INTEGER,
DIMENSION(0:nelem),
PARAMETER,
PRIVATE :: ir266 = (/0, &
178 0, 0, 0, 0, 0, 0, 0, 0, &
179 0, 0, 0, 0, 0, 0, 0, 0, &
180 0, 0, 0, 8, 15, 35, 35, 35, 43, 50, 70, 0, 0, 0, 0, 0, 0, 0, &
181 0, 0, 0, 8, 21, 35, 35, 43, 50, 70, 70, 0, 0, 0, 0, 0, 0, 0, &
182 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
183 8, 15, 21, 35, 35, 43, 56, 70, 0, 0, 0, 0, 0, 0, 0, &
184 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/)
187 INTEGER,
DIMENSION(0:nelem),
PARAMETER,
PRIVATE :: ir466 = (/0, &
189 0, 0, 0, 0, 0, 0, 0, 0, &
190 0, 0, 0, 0, 0, 0, 0, 0, &
191 0, 0, 0, 1, 8, 35, 35, 35, 36, 43, 70, 0, 0, 0, 0, 0, 0, 0, &
192 0, 0, 0, 1, 21, 35, 35, 36, 43, 70, 70, 0, 0, 0, 0, 0, 0, 0, &
193 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
194 1, 8, 21, 35, 35, 36, 56, 70, 0, 0, 0, 0, 0, 0, 0, &
195 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/)
198 MODULE PROCEDURE amn_l1, amn_l2
213 TYPE(semi_empirical_type),
POINTER :: sep
214 LOGICAL,
INTENT(IN) :: extended_basis_set
217 LOGICAL :: check, use_p_orbitals
218 REAL(kind=
dp) :: zeff
220 use_p_orbitals = .true.
226 use_p_orbitals = .false.
228 use_p_orbitals = sep%p_orbitals_on_h
234 IF (nqs(z) > 0) natorb = natorb + 1
235 IF ((nqp(z) > 0) .OR. use_p_orbitals) natorb = natorb + 3
236 IF (extended_basis_set .AND. element_has_d(sep)) natorb = natorb + 5
237 IF (extended_basis_set .AND. element_has_f(sep)) natorb = natorb + 7
239 check = (natorb <= 4) .OR. (extended_basis_set)
242 sep%extended_basis_set = extended_basis_set
244 zeff = real(zval(z), kind=
dp)
255 TYPE(semi_empirical_type),
POINTER :: sep
256 INTEGER,
INTENT(IN) :: l
259 IF (sep%z < 0 .OR. sep%z > nelem)
THEN
260 cpabort(
"Invalid atomic number !")
266 IF ((sep%z == 1) .AND. sep%p_orbitals_on_h)
THEN
276 cpabort(
"Invalid l quantum number !")
279 cpabort(
"Invalid n quantum number !")
291 TYPE(semi_empirical_type),
POINTER :: sep
293 sep%beta = sep%beta/
evolt
294 sep%uss = sep%uss/
evolt
295 sep%upp = sep%upp/
evolt
296 sep%udd = sep%udd/
evolt
297 sep%alp = sep%alp/
bohr
298 sep%eisol = sep%eisol/
evolt
299 sep%gss = sep%gss/
evolt
300 sep%gsp = sep%gsp/
evolt
301 sep%gpp = sep%gpp/
evolt
302 sep%gp2 = sep%gp2/
evolt
303 sep%gsd = sep%gsd/
evolt
304 sep%gpd = sep%gpd/
evolt
305 sep%gdd = sep%gdd/
evolt
306 sep%hsp = sep%hsp/
evolt
309 sep%fn3 = sep%fn3*
bohr
312 sep%bfn3 = sep%bfn3*
bohr
318 sep%pre = sep%pre/
evolt
332 TYPE(semi_empirical_type),
POINTER :: sep
334 INTEGER :: iod, iop, ios, j, jmax, k, l
335 REAL(kind=
dp) :: ad, am, aq, d1, d2, d3, dd, df, eisol, gdd1, gp2, gp2c, gpp, gppc, gqq, &
336 gsp, gspc, gss, gssc, hpp, hpp1, hpp2, hsp, hsp1, hsp2, hspc, p, p4, q1, q2, q3, qf, qn, &
337 qq, udd, upp, uss, zp, zs
339 IF (.NOT. sep%defined)
RETURN
348 zs = sep%sto_exponents(0)
349 zp = sep%sto_exponents(1)
357 gssc = real(max(ios - 1, 0), kind=
dp)
360 gspc = real(ios*k, kind=
dp)
365 gp2c = real((k*(k - 1))/2, kind=
dp) + 0.5_dp*real((l*(l - 1))/2, kind=
dp)
367 gppc = -0.5_dp*real((l*(l - 1))/2, kind=
dp)
371 hspc = real(-k, kind=
dp)
375 hpp = 0.5_dp*(gpp - gp2)
376 hpp = max(0.1_dp, hpp)
377 hsp = max(1.e-7_dp, hsp)
380 eisol = uss*ios + upp*iop + udd*iod + gss*gssc + gpp*gppc + gsp*gspc + gp2*gp2c + hsp*hspc
383 qn = real(nqs(z), kind=
dp)
387 dd = (2.0_dp*qn + 1)*(4.0_dp*zs*zp)**(qn + 0.5_dp)/(zs + zp)**(2.0_dp*qn + 2)/sqrt(3.0_dp)
388 qq = sqrt((4.0_dp*qn*qn + 6.0_dp*qn + 2.0_dp)/20.0_dp)/zp
392 gdd1 = (hsp/(
evolt*dd**2))**(1.0_dp/3.0_dp)
397 hsp1 = 0.5_dp*d1 - 0.5_dp/sqrt(4.0_dp*dd**2 + 1.0_dp/d1**2)
398 hsp2 = 0.5_dp*d2 - 0.5_dp/sqrt(4.0_dp*dd**2 + 1.0_dp/d2**2)
399 IF (abs(hsp2 - hsp1) < epsilon(0.0_dp))
EXIT
400 d3 = d1 + df*(hsp/
evolt - hsp1)/(hsp2 - hsp1)
404 gqq = (p4*hpp/(
evolt*48.0_dp*qq**4))**0.2_dp
409 hpp1 = 0.25_dp*q1 - 0.5_dp/sqrt(4.0_dp*qq**2 + 1.0_dp/q1**2) + 0.25_dp/sqrt(8.0_dp*qq**2 + 1.0_dp/q1**2)
410 hpp2 = 0.25_dp*q2 - 0.5_dp/sqrt(4.0_dp*qq**2 + 1.0_dp/q2**2) + 0.25_dp/sqrt(8.0_dp*qq**2 + 1.0_dp/q2**2)
411 IF (abs(hpp2 - hpp1) < epsilon(0.0_dp))
EXIT
412 q3 = q1 + qf*(hpp/
evolt - hpp1)/(hpp2 - hpp1)
427 IF (abs(sep%eisol) < epsilon(0.0_dp)) sep%eisol = eisol
428 IF (abs(sep%dd) < epsilon(0.0_dp)) sep%dd = dd
429 IF (abs(sep%qq) < epsilon(0.0_dp)) sep%qq = qq
430 IF (abs(sep%am) < epsilon(0.0_dp)) sep%am = am
431 IF (abs(sep%ad) < epsilon(0.0_dp)) sep%ad = ad
432 IF (abs(sep%aq) < epsilon(0.0_dp)) sep%aq = aq
446 SUBROUTINE calpar_d(sep)
447 TYPE(semi_empirical_type),
POINTER :: sep
449 REAL(kind=
dp),
DIMENSION(6) :: amn
454 IF (sep%extended_basis_set) sep%dorb = element_has_d(sep)
457 CALL eval_1c_2el_spd(sep)
458 CALL eval_cs_ko(sep, amn)
460 IF (.NOT. sep%dorb)
THEN
462 IF (abs(sep%am) > epsilon(0.0_dp))
THEN
463 sep%ko(1) = 0.5_dp/sep%am
465 IF (abs(sep%ad) > epsilon(0.0_dp) .AND. (sep%z /= 1))
THEN
466 sep%ko(2) = 0.5_dp/sep%ad
468 IF (abs(sep%aq) > epsilon(0.0_dp) .AND. (sep%z /= 1))
THEN
469 sep%ko(3) = 0.5_dp/sep%aq
471 sep%ko(7) = sep%ko(1)
472 sep%ko(9) = sep%ko(1)
474 sep%cs(3) = sep%qq*sqrt(2.0_dp)
477 sep%ko(9) = sep%ko(1)
478 sep%aq = 0.5_dp/sep%ko(3)
482 IF (abs(sep%rho) > epsilon(0.0_dp))
THEN
485 END SUBROUTINE calpar_d
495 FUNCTION element_has_d(sep)
RESULT(res)
496 TYPE(semi_empirical_type),
POINTER :: sep
499 res = (nqd(sep%z) > 0 .AND. sep%sto_exponents(2) > epsilon(0.0_dp))
500 END FUNCTION element_has_d
510 FUNCTION element_has_f(sep)
RESULT(res)
511 TYPE(semi_empirical_type),
POINTER :: sep
514 res = (nqf(sep%z) > 0 .AND. sep%sto_exponents(3) > epsilon(0.0_dp))
515 END FUNCTION element_has_f
528 SUBROUTINE amn_l1(sep, amn)
529 TYPE(semi_empirical_type),
POINTER :: sep
530 REAL(kind=
dp),
DIMENSION(6),
INTENT(OUT) :: amn
533 REAL(kind=
dp) :: z1, z2, z3
535 z1 = sep%sto_exponents(0)
536 z2 = sep%sto_exponents(1)
537 z3 = sep%sto_exponents(2)
539 CALL cp_abort(__location__, &
540 "Trying to use s-orbitals, but the STO exponents is set to 0. "// &
541 "Please check if your parameterization supports the usage of s orbitals! ")
544 IF (sep%natorb >= 4)
THEN
546 CALL cp_abort(__location__, &
547 "Trying to use p-orbitals, but the STO exponents is set to 0. "// &
548 "Please check if your parameterization supports the usage of p orbitals! ")
549 amn(2) = amn_l_low(z1, z2, nsp, nsp, 1)
550 amn(3) = amn_l_low(z2, z2, nsp, nsp, 2)
553 CALL cp_abort(__location__, &
554 "Trying to use d-orbitals, but the STO exponents is set to 0. "// &
555 "Please check if your parameterization supports the usage of d orbitals! ")
557 amn(4) = amn_l_low(z1, z3, nsp, nd, 2)
558 amn(5) = amn_l_low(z2, z3, nsp, nd, 1)
559 amn(6) = amn_l_low(z3, z3, nd, nd, 2)
562 END SUBROUTINE amn_l1
575 SUBROUTINE amn_l2(sep, amn)
576 TYPE(semi_empirical_type),
POINTER :: sep
577 REAL(kind=
dp),
DIMENSION(6, 0:2),
INTENT(OUT) :: amn
580 REAL(kind=
dp) :: z1, z2, z3
582 z1 = sep%sto_exponents(0)
583 z2 = sep%sto_exponents(1)
584 z3 = sep%sto_exponents(2)
585 cpassert(z1 > 0.0_dp)
588 amn(1, 0) = amn_l_low(z1, z1, nsp, nsp, 0)
589 IF (sep%natorb >= 4)
THEN
590 cpassert(z2 > 0.0_dp)
591 amn(2, 1) = amn_l_low(z1, z2, nsp, nsp, 1)
592 amn(3, 0) = amn_l_low(z2, z2, nsp, nsp, 0)
593 amn(3, 2) = amn_l_low(z2, z2, nsp, nsp, 2)
595 cpassert(z3 > 0.0_dp)
597 amn(4, 2) = amn_l_low(z1, z3, nsp, nd, 2)
598 amn(5, 1) = amn_l_low(z2, z3, nsp, nd, 1)
599 amn(6, 0) = amn_l_low(z3, z3, nd, nd, 0)
600 amn(6, 2) = amn_l_low(z3, z3, nd, nd, 2)
603 END SUBROUTINE amn_l2
616 FUNCTION amn_l_low(z1, z2, n1, n2, l)
RESULT(amnl)
617 REAL(kind=
dp),
INTENT(IN) :: z1, z2
618 INTEGER,
INTENT(IN) :: n1, n2, l
619 REAL(kind=
dp) :: amnl
621 amnl =
fac(n1 + n2 + l)/sqrt(
fac(2*n1)*
fac(2*n2))*(2.0_dp*z1/(z1 + z2))**n1* &
622 (2.0_dp*z2/(z1 + z2))**n2*2.0_dp*sqrt(z1*z2)/(z1 + z2)**(l + 1)
624 END FUNCTION amn_l_low
640 SUBROUTINE eval_cs_ko(sep, amn)
641 TYPE(semi_empirical_type),
POINTER :: sep
642 REAL(kind=
dp),
DIMENSION(6),
INTENT(IN) :: amn
644 REAL(kind=
dp) :: d, fg
649 sep%ko(1) = ko_ij(0, 1.0_dp, fg)
650 IF (sep%natorb >= 4)
THEN
653 d = amn(2)/sqrt(3.0_dp)
656 sep%ko(2) = ko_ij(1, d, fg)
658 sep%ko(7) = sep%ko(1)
659 d = sqrt(amn(3)*2.0_dp/5.0_dp)
660 fg = 0.5_dp*(sep%gpp - sep%gp2)
662 sep%ko(3) = ko_ij(2, d, fg)
666 d = sqrt(amn(4)*2.0_dp/sqrt(15.0_dp))
669 sep%ko(4) = ko_ij(2, d, fg)
671 d = amn(5)/sqrt(5.0_dp)
672 fg = sep%onec2el(23) - 1.8_dp*sep%onec2el(35)
674 sep%ko(5) = ko_ij(1, d, fg)
676 fg = 0.2_dp*(sep%onec2el(29) + 2.0_dp*sep%onec2el(30) + 2.0_dp*sep%onec2el(31))
677 sep%ko(8) = ko_ij(0, 1.0_dp, fg)
678 d = sqrt(amn(6)*2.0_dp/7.0_dp)
679 fg = sep%onec2el(44) - (20.0_dp/35.0_dp)*sep%onec2el(52)
681 sep%ko(6) = ko_ij(2, d, fg)
684 END SUBROUTINE eval_cs_ko
692 SUBROUTINE eval_1c_2el_spd(sep)
693 TYPE(semi_empirical_type),
POINTER :: sep
695 REAL(kind=
dp) :: r016, r036, r066, r125, r155, r234, &
696 r236, r244, r246, r266, r355, r466, &
705 CALL sc_param(sep, r066, r266, r466, r016, r244, r036, r236, r155, r355, r125, &
708 IF (abs(sep%f0sd) > epsilon(0.0_dp))
THEN
711 IF (abs(sep%g2sd) > epsilon(0.0_dp))
THEN
714 CALL eisol_corr(sep, r016, r066, r244, r266, r466)
715 sep%onec2el(1) = r016
716 sep%onec2el(2) = 2.0_dp/(3.0_dp*s5)*r125
717 sep%onec2el(3) = 1.0_dp/s15*r125
718 sep%onec2el(4) = 2.0_dp/(5.0_dp*s5)*r234
719 sep%onec2el(5) = r036 + 4.0_dp/35.0_dp*r236
720 sep%onec2el(6) = r036 + 2.0_dp/35.0_dp*r236
721 sep%onec2el(7) = r036 - 4.0_dp/35.0_dp*r236
722 sep%onec2el(8) = -1.0_dp/(3.0_dp*s5)*r125
723 sep%onec2el(9) = sqrt(3.0_dp/125.0_dp)*r234
724 sep%onec2el(10) = s3/35.0_dp*r236
725 sep%onec2el(11) = 3.0_dp/35.0_dp*r236
726 sep%onec2el(12) = -1.0_dp/(5.0_dp*s5)*r234
727 sep%onec2el(13) = r036 - 2.0_dp/35.0_dp*r236
728 sep%onec2el(14) = -2.0_dp*s3/35.0_dp*r236
729 sep%onec2el(15) = -sep%onec2el(3)
730 sep%onec2el(16) = -sep%onec2el(11)
731 sep%onec2el(17) = -sep%onec2el(9)
732 sep%onec2el(18) = -sep%onec2el(14)
733 sep%onec2el(19) = 1.0_dp/5.0_dp*r244
734 sep%onec2el(20) = 2.0_dp/(7.0_dp*s5)*r246
735 sep%onec2el(21) = sep%onec2el(20)/2.0_dp
736 sep%onec2el(22) = -sep%onec2el(20)
737 sep%onec2el(23) = 4.0_dp/15.0_dp*r155 + 27.0_dp/245.0_dp*r355
738 sep%onec2el(24) = 2.0_dp*s3/15.0_dp*r155 - 9.0_dp*s3/245.0_dp*r355
739 sep%onec2el(25) = 1.0_dp/15.0_dp*r155 + 18.0_dp/245.0_dp*r355
740 sep%onec2el(26) = -s3/15.0_dp*r155 + 12.0_dp*s3/245.0_dp*r355
741 sep%onec2el(27) = -s3/15.0_dp*r155 - 3.0_dp*s3/245.0_dp*r355
742 sep%onec2el(28) = -sep%onec2el(27)
743 sep%onec2el(29) = r066 + 4.0_dp/49.0_dp*r266 + 4.0_dp/49.0_dp*r466
744 sep%onec2el(30) = r066 + 2.0_dp/49.0_dp*r266 - 24.0_dp/441.0_dp*r466
745 sep%onec2el(31) = r066 - 4.0_dp/49.0_dp*r266 + 6.0_dp/441.0_dp*r466
746 sep%onec2el(32) = sqrt(3.0_dp/245.0_dp)*r246
747 sep%onec2el(33) = 1.0_dp/5.0_dp*r155 + 24.0_dp/245.0_dp*r355
748 sep%onec2el(34) = 1.0_dp/5.0_dp*r155 - 6.0_dp/245.0_dp*r355
749 sep%onec2el(35) = 3.0_dp/49.0_dp*r355
750 sep%onec2el(36) = 1.0_dp/49.0_dp*r266 + 30.0_dp/441.0_dp*r466
751 sep%onec2el(37) = s3/49.0_dp*r266 - 5.0_dp*s3/441.0_dp*r466
752 sep%onec2el(38) = r066 - 2.0_dp/49.0_dp*r266 - 4.0_dp/441.0_dp*r466
753 sep%onec2el(39) = -2.0_dp*s3/49.0_dp*r266 + 10.0_dp*s3/441.0_dp*r466
754 sep%onec2el(40) = -sep%onec2el(32)
755 sep%onec2el(41) = -sep%onec2el(34)
756 sep%onec2el(42) = -sep%onec2el(35)
757 sep%onec2el(43) = -sep%onec2el(37)
758 sep%onec2el(44) = 3.0_dp/49.0_dp*r266 + 20.0_dp/441.0_dp*r466
759 sep%onec2el(45) = -sep%onec2el(39)
760 sep%onec2el(46) = 1.0_dp/5.0_dp*r155 - 3.0_dp/35.0_dp*r355
761 sep%onec2el(47) = -sep%onec2el(46)
762 sep%onec2el(48) = 4.0_dp/49.0_dp*r266 + 15.0_dp/441.0_dp*r466
763 sep%onec2el(49) = 3.0_dp/49.0_dp*r266 - 5.0_dp/147.0_dp*r466
764 sep%onec2el(50) = -sep%onec2el(49)
765 sep%onec2el(51) = r066 + 4.0_dp/49.0_dp*r266 - 34.0_dp/441.0_dp*r466
766 sep%onec2el(52) = 35.0_dp/441.0_dp*r466
777 END SUBROUTINE eval_1c_2el_spd
797 SUBROUTINE sc_param(sep, r066, r266, r466, r016, r244, r036, r236, r155, r355, &
799 TYPE(semi_empirical_type),
POINTER :: sep
800 REAL(kind=
dp),
INTENT(out) :: r066, r266, r466, r016, r244, r036, &
801 r236, r155, r355, r125, r234, r246
804 REAL(kind=
dp) :: ed, ep, es
811 r016 = sc_param_low(0, ns, es, ns, es, nd, ed, nd, ed)
812 r036 = sc_param_low(0, ns, ep, ns, ep, nd, ed, nd, ed)
813 r066 = sc_param_low(0, nd, ed, nd, ed, nd, ed, nd, ed)
814 r155 = sc_param_low(1, ns, ep, nd, ed, ns, ep, nd, ed)
815 r125 = sc_param_low(1, ns, es, ns, ep, ns, ep, nd, ed)
816 r244 = sc_param_low(2, ns, es, nd, ed, ns, es, nd, ed)
817 r236 = sc_param_low(2, ns, ep, ns, ep, nd, ed, nd, ed)
818 r266 = sc_param_low(2, nd, ed, nd, ed, nd, ed, nd, ed)
819 r234 = sc_param_low(2, ns, ep, ns, ep, ns, es, nd, ed)
820 r246 = sc_param_low(2, ns, es, nd, ed, nd, ed, nd, ed)
821 r355 = sc_param_low(3, ns, ep, nd, ed, ns, ep, nd, ed)
822 r466 = sc_param_low(4, nd, ed, nd, ed, nd, ed, nd, ed)
823 END SUBROUTINE sc_param
846 FUNCTION sc_param_low(k, na, ea, nb, eb, nc, ec, nd, ed)
RESULT(res)
847 INTEGER,
INTENT(in) :: k, na
848 REAL(kind=
dp),
INTENT(in) :: ea
849 INTEGER,
INTENT(in) :: nb
850 REAL(kind=
dp),
INTENT(in) :: eb
851 INTEGER,
INTENT(in) :: nc
852 REAL(kind=
dp),
INTENT(in) :: ec
853 INTEGER,
INTENT(in) :: nd
854 REAL(kind=
dp),
INTENT(in) :: ed
857 INTEGER :: i, m, m1, m2, n, nab, ncd
858 REAL(kind=
dp) :: a2, aab, acd, ae, aea, aeb, aec, aed, c, &
859 e, eab, ecd, ff, s0, s1, s2, s3, tmp
861 cpassert(ea > 0.0_dp)
862 cpassert(eb > 0.0_dp)
863 cpassert(ec > 0.0_dp)
864 cpassert(ed > 0.0_dp)
880 tmp = na*aea + nb*aeb + nc*aec + nd*aed + 0.5_dp*(aea + aeb + aec + aed) + a2*(n + 2) - ae*n
881 c =
evolt*ff*exp(tmp)
896 s3 = exp(ae*n - acd*(m2 + 1) - aab*(nab - k))/
binomial(n - 1, m2)
897 res = c*(s1 - s2 + s3)
898 END FUNCTION sc_param_low
919 SUBROUTINE eisol_corr(sep, r016, r066, r244, r266, r466)
920 TYPE(semi_empirical_type),
POINTER :: sep
921 REAL(kind=
dp),
INTENT(in) :: r016, r066, r244, r266, r466
923 sep%eisol = sep%eisol + ir016(sep%z)*r016 + &
924 ir066(sep%z)*r066 - &
925 ir244(sep%z)*r244/5.0_dp - &
926 ir266(sep%z)*r266/49.0_dp - &
927 ir466(sep%z)*r466/49.0_dp
928 END SUBROUTINE eisol_corr
941 FUNCTION ko_ij(l, d, fg)
RESULT(res)
942 INTEGER,
INTENT(in) :: l
943 REAL(kind=
dp),
INTENT(in) :: d, fg
946 INTEGER,
PARAMETER :: niter = 100
947 REAL(kind=
dp),
PARAMETER :: epsil = 1.0e-08_dp, g1 = 0.382_dp, &
951 REAL(kind=
dp) :: a1, a2, delta, dsq, ev4, ev8, f1, f2, &
954 cpassert(fg /= 0.0_dp)
957 res = 0.5_dp*
evolt/fg
968 IF (delta < epsil)
EXIT
972 f1 = (ev4*(1/y1 - 1/sqrt(y1**2 + dsq)) - fg)**2
973 f2 = (ev4*(1/y2 - 1/sqrt(y2**2 + dsq)) - fg)**2
974 ELSE IF (l == 2)
THEN
975 f1 = (ev8*(1.0_dp/y1 - 2.0_dp/sqrt(y1**2 + dsq*0.5_dp) + 1.0_dp/sqrt(y1**2 + dsq)) - fg)**2
976 f2 = (ev8*(1/y2 - 2.0_dp/sqrt(y2**2 + dsq*0.5_dp) + 1.0_dp/sqrt(y2**2 + dsq)) - fg)**2
1000 TYPE(semi_empirical_type),
POINTER :: sep
1002 INTEGER :: i, ij, ij0, ind, ip, ipx, ipy, ipz, &
1005 REAL(kind=
dp) :: gp2, gpp, gsp, gss, hsp
1007 CALL get_se_param(sep, defined=defined, natorb=natorb, &
1008 gss=gss, gsp=gsp, gpp=gpp, gp2=gp2, hsp=hsp)
1011 isize = natorb*(natorb + 1)/2
1012 ALLOCATE (sep%w(isize, isize))
1016 IF (natorb > 0)
THEN
1019 IF (natorb > 2)
THEN
1023 sep%w(ipx, ip) = gsp
1024 sep%w(ipy, ip) = gsp
1025 sep%w(ipz, ip) = gsp
1026 sep%w(ip, ipx) = gsp
1027 sep%w(ip, ipy) = gsp
1028 sep%w(ip, ipz) = gsp
1029 sep%w(ipx, ipx) = gpp
1030 sep%w(ipy, ipy) = gpp
1031 sep%w(ipz, ipz) = gpp
1032 sep%w(ipy, ipx) = gp2
1033 sep%w(ipz, ipx) = gp2
1034 sep%w(ipz, ipy) = gp2
1035 sep%w(ipx, ipy) = gp2
1036 sep%w(ipx, ipz) = gp2
1037 sep%w(ipy, ipz) = gp2
1038 sep%w(ip + 1, ip + 1) = hsp
1039 sep%w(ip + 3, ip + 3) = hsp
1040 sep%w(ip + 6, ip + 6) = hsp
1041 sep%w(ip + 4, ip + 4) = 0.5_dp*(gpp - gp2)
1042 sep%w(ip + 7, ip + 7) = 0.5_dp*(gpp - gp2)
1043 sep%w(ip + 8, ip + 8) = 0.5_dp*(gpp - gp2)
1050 sep%w(ij + ij0, kl + ij0) = sep%onec2el(ind)/
evolt
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), dimension(0:maxfac), parameter, public fac
Collection of simple mathematical functions and subroutines.
elemental real(kind=dp) function, public binomial(n, k)
The binomial coefficient n over k for 0 <= k <= n is calculated, otherwise zero is returned.
Definition of physical constants:
real(kind=dp), parameter, public evolt
real(kind=dp), parameter, public bohr
Arrays of parameters used in the semi-empirical calculations \References Everywhere in this module TC...
integer, dimension(243), public int_kl
integer, dimension(243), public int_ij
integer, dimension(243), public int_onec2el
Utilities to post-process semi-empirical parameters.
subroutine, public setup_1c_2el_int(sep)
Fills the 1 center 2 electron integrals for the construction of the one-electron fock matrix.
subroutine, public valence_electrons(sep, extended_basis_set)
Gives back the number of valence electrons for element z and also the number of atomic orbitals for t...
subroutine, public calpar(z, sep)
Calculates missing parameters.
integer function, public get_se_basis(sep, l)
Gives back the number of basis function for each l.
subroutine, public convert_param_to_cp2k(sep)
Converts parameter units to internal.
Definition of the semi empirical parameter types.
subroutine, public get_se_param(sep, name, typ, defined, z, zeff, natorb, eheat, beta, sto_exponents, uss, upp, udd, uff, alp, eisol, gss, gsp, gpp, gp2, acoul, nr, de, ass, asp, app, hsp, gsd, gpd, gdd, ppddg, dpddg, ngauss)
Get info from the semi-empirical type.