28#include "./base/base_uses.f90"
31 REAL(KIND=
dp),
DIMENSION(3),
INTENT(IN) :: rjiv
33 LOGICAL,
INTENT(IN) :: do_invert
35 CHARACTER(len=*),
PARAMETER :: modulen =
'semi_empirical_int_debug', &
36 routinen =
'check_rotmat_der', routinep = modulen//
':'//routinen
38 REAL(kind=
dp) :: dx, r, r0(3), x(3)
39 TYPE(
rotmat_type),
POINTER :: matrix, matrix_m, matrix_n, &
41 INTEGER :: imap(3), i, j, k, l
44 FUNCTION check_value(num, ana, minval, thrs)
RESULT(passed)
47 REAL(KIND=
dp) :: num, ana, thrs, minval
52 NULLIFY (matrix_m, matrix_p, matrix_n, matrix)
66 WRITE (*, *)
"DEBUG::"//routinep
71 IF (i == 1) matrix => matrix_p
72 IF (i == 2) matrix => matrix_m
73 r0 = rjiv + (-1.0_dp)**(i - 1)*x
74 r = sqrt(dot_product(r0, r0))
75 CALL rotmat(sepi, sepj, r0, r, matrix, do_derivatives=.false., debug_invert=do_invert)
78 matrix_n%sp_d(j, :, :) = (matrix_p%sp - matrix_m%sp)/(2.0_dp*dx)
81 IF (.NOT.
check_value(matrix_n%sp_d(j, k, i), ij_matrix%sp_d(j, k, i), dx, 0.1_dp))
THEN
82 WRITE (*, *)
"ERROR for SP rotation matrix derivative SP(j,k,i), j,k,i::", j, k, i
88 matrix_n%pp_d(j, :, :, :) = (matrix_p%pp - matrix_m%pp)/(2.0_dp*dx)
92 IF (.NOT.
check_value(matrix_n%pp_d(j, l, k, i), ij_matrix%pp_d(j, l, k, i), dx, 0.1_dp))
THEN
93 WRITE (*, *)
"ERROR for PP rotation matrix derivative PP(j,l,k,i), j,l,k,i::", j, l, k, i
100 IF (sepi%dorb .OR. sepj%dorb)
THEN
102 matrix_n%sd_d(j, :, :) = (matrix_p%sd - matrix_m%sd)/(2.0_dp*dx)
105 IF (.NOT.
check_value(matrix_n%sd_d(j, k, i), ij_matrix%sd_d(j, k, i), dx, 0.1_dp))
THEN
106 WRITE (*, *)
"ERROR for SD rotation matrix derivative SD(j,k,i), j,k,i::", j, k, i
112 matrix_n%pd_d(j, :, :, :) = (matrix_p%pd - matrix_m%pd)/(2.0_dp*dx)
116 IF (.NOT.
check_value(matrix_n%pd_d(j, l, k, i), ij_matrix%pd_d(j, l, k, i), dx, 0.1_dp))
THEN
117 WRITE (*, *)
"ERROR for DP rotation matrix derivative DP(j,l,k,i), j,l,k,i::", j, l, k, i
124 matrix_n%dd_d(j, :, :, :) = (matrix_p%dd - matrix_m%dd)/(2.0_dp*dx)
128 IF (.NOT.
check_value(matrix_n%dd_d(j, l, k, i), ij_matrix%dd_d(j, l, k, i), dx, 0.1_dp))
THEN
129 WRITE (*, *)
"ERROR for DD rotation matrix derivative DD(j,l,k,i), j,l,k,i::", j, l, k, i
172#include "./base/base_uses.f90"
175 REAL(KIND=
dp),
DIMENSION(3),
INTENT(IN) :: rijv
177 LOGICAL,
INTENT(IN) :: invert
179 INTEGER,
INTENT(IN) :: ii, kk
180 REAL(KIND=
dp),
DIMENSION(3, 45, 45), &
183 CHARACTER(len=*),
PARAMETER :: moduleN =
'semi_empirical_int_debug', &
184 routinen =
'rot_2el_2c_first', routinep = modulen//
':'//routinen
186 REAL(KIND=
dp),
DIMENSION(491) :: rep
187 LOGICAL,
DIMENSION(45, 45) :: logv
188 REAL(KIND=
dp),
DIMENSION(45, 45) :: v_n, v_p, v_m
190 REAL(KIND=
dp) :: dx, r, r0(3), x(3)
192 INTEGER :: imap(3), i, j, k, limkl
195 FUNCTION check_value(num, ana, minval, thrs)
RESULT(passed)
198 REAL(KIND=
dp) :: num, ana, thrs, minval
215 WRITE (*, *)
"DEBUG::"//routinep
220 r0 = rijv + (-1.0_dp)**(i - 1)*x
221 r = sqrt(dot_product(r0, r0))
224 CALL rotmat(sepi, sepj, r0, r, matrix, do_derivatives=.false., debug_invert=invert)
227 CALL terep_num(sepi, sepj, r, rep, se_taper=se_taper, se_int_control=se_int_control)
230 CALL rot_2el_2c_first(sepi, sepj, r0, se_int_control, se_taper, invert, ii, kk, rep, logv, matrix, &
234 CALL rot_2el_2c_first(sepi, sepj, r0, se_int_control, se_taper, invert, ii, kk, rep, logv, matrix, &
243 v_n(i, k) = (v_p(i, k) - v_m(i, k))/(2.0_dp*dx)
244 IF (.NOT.
check_value(v_d(j, i, k), v_n(i, k), dx, 0.1_dp))
THEN
245 WRITE (*, *)
"ERROR for rot_2el_2c_first derivative V_D(j,i,k), j,i,k::", j, i, k
275#include "./base/base_uses.f90"
278 REAL(dp),
INTENT(IN) :: r
279 REAL(dp),
INTENT(IN) :: dssss
280 INTEGER,
INTENT(IN) :: itype
284 CHARACTER(len=*),
PARAMETER :: moduleN =
'semi_empirical_int_debug', &
285 routinen =
'check_dssss_nucint_ana', routinep = modulen//
':'//routinen
287 REAL(dp) :: delta, nssss, od, rn, ssssm, ssssp
290 FUNCTION check_value(num, ana, minval, thrs)
RESULT(passed)
293 REAL(KIND=dp) :: num, ana, thrs, minval
301 CALL ssss_nucint_num(sepi, sepj, rn, ssssp, itype, se_taper, se_int_control)
303 CALL ssss_nucint_num(sepi, sepj, rn, ssssm, itype, se_taper, se_int_control)
304 nssss = od*(ssssp - ssssm)
306 WRITE (*, *)
"DEBUG::"//routinep
307 IF (.NOT.
check_value(nssss, dssss, delta, 0.1_dp))
THEN
308 WRITE (*, *)
"ERROR for SSSS derivative SSSS"
335#include "./base/base_uses.f90"
338 REAL(dp),
INTENT(IN) :: r
339 REAL(dp),
DIMENSION(10, 2),
INTENT(IN) :: dcore
340 INTEGER,
INTENT(IN) :: itype
344 CHARACTER(len=*),
PARAMETER :: moduleN =
'semi_empirical_int_debug', &
345 routinen =
'check_dcore_nucint_ana', routinep = modulen//
':'//routinen
348 REAL(dp) :: delta, od, rn
349 REAL(dp),
DIMENSION(10, 2) :: corem, corep, ncore
352 FUNCTION check_value(num, ana, minval, thrs)
RESULT(passed)
355 REAL(KIND=dp) :: num, ana, thrs, minval
363 CALL core_nucint_num(sepi, sepj, rn, corep, itype, se_taper, se_int_control)
365 CALL core_nucint_num(sepi, sepj, rn, corem, itype, se_taper, se_int_control)
366 ncore = od*(corep - corem)
368 WRITE (*, *)
"DEBUG::"//routinep
371 IF (.NOT.
check_value(ncore(j, i), dcore(j, i), delta, 0.1_dp))
THEN
372 WRITE (*, *)
"ERROR for CORE derivative CORE(j,i), j,i::", j, i
395 REAL(kind=
dp) :: num, ana, thrs, minval
400 IF ((abs(num) < minval) .AND. (abs(ana) > minval))
THEN
401 WRITE (*, *)
"WARNING ---> ", num, ana, thrs
402 ELSE IF ((abs(num) > minval) .AND. (abs(ana) < minval))
THEN
403 WRITE (*, *)
"WARNING ---> ", num, ana, thrs
404 ELSE IF ((abs(num) < minval) .AND. (abs(ana) < minval))
THEN
408 IF (abs((num - ana)/num*100._dp) > thrs)
THEN
409 WRITE (*, *) abs(num - ana)/num*100._dp, thrs
412 IF (.NOT. passed)
THEN
413 WRITE (*, *)
"ANALYTICAL ::", ana
414 WRITE (*, *)
"NUMERICAL ::", num
436SUBROUTINE check_drotnuc_ana(sepi, sepj, rijv, itype, se_int_control, se_taper, e1b, e2a, de1b, de2a)
444#include "./base/base_uses.f90"
447 REAL(dp),
DIMENSION(3),
INTENT(IN) :: rijv
448 INTEGER,
INTENT(IN) :: itype
451 REAL(dp),
DIMENSION(45),
INTENT(IN), &
453 REAL(dp),
DIMENSION(3, 45), &
454 INTENT(IN),
OPTIONAL :: de1b, de2a
456 CHARACTER(len=*),
PARAMETER :: moduleN =
'semi_empirical_int_debug', &
457 routinen =
'check_drotnuc_ana', routinep = modulen//
':'//routinen
460 LOGICAL :: l_de1b, l_de2a, l_e1b, l_e2a, &
463 REAL(KIND=dp),
DIMENSION(45) :: e1b2, e2a2
464 REAL(KIND=dp),
DIMENSION(3, 45) :: de1b2, de2a2
467 FUNCTION check_value(num, ana, minval, thrs)
RESULT(passed)
470 REAL(KIND=dp) :: num, ana, thrs, minval
477 l_de1b =
PRESENT(de1b)
478 l_de2a =
PRESENT(de2a)
479 lgrad = l_de1b .OR. l_de2a
482 WRITE (*, *)
"DEBUG::"//routinep
483 CALL rotnuc_num(sepi, sepj, rijv, e1b2, e2a2, itype, se_int_control, se_taper=se_taper)
486 IF (.NOT.
check_value(e1b2(j), e1b(j), delta, 0.1_dp))
THEN
487 WRITE (*, *)
"ERROR for E1B value E1B(j), j::", j
494 IF (.NOT.
check_value(e2a2(j), e2a(j), delta, 0.1_dp))
THEN
495 WRITE (*, *)
"ERROR for E2A value E2A(j), j::", j
503 CALL drotnuc_num(sepi, sepj, rijv, de1b2, de2a2, itype, delta=delta, &
504 se_int_control=se_int_control, se_taper=se_taper)
509 IF (abs(e1b2(j)) > delta)
THEN
510 IF (.NOT.
check_value(de1b2(i, j), de1b(i, j), delta, 0.1_dp))
THEN
511 WRITE (*, *)
"ERROR for derivative of E1B. DE1B(i,j), i,j::", i, j
522 IF (abs(e2a2(j)) > delta)
THEN
523 IF (.NOT.
check_value(de2a2(i, j), de2a(i, j), delta, 0.1_dp))
THEN
524 WRITE (*, *)
"ERROR for derivative of E2A. DE2A(i,j), i,j::", i, j
558#include "./base/base_uses.f90"
561 REAL(dp),
DIMENSION(3),
INTENT(IN) :: rijv
562 INTEGER,
INTENT(IN) :: itype
563 REAL(dp),
INTENT(IN),
OPTIONAL :: enuc
564 REAL(dp),
DIMENSION(3),
INTENT(IN), &
569 CHARACTER(len=*),
PARAMETER :: moduleN =
'semi_empirical_int_debug', &
570 routinen =
'check_dcorecore_ana', routinep = modulen//
':'//routinen
573 REAL(dp) :: enuc_num, delta
574 REAL(dp),
DIMENSION(3) :: denuc_num
577 FUNCTION check_value(num, ana, minval, thrs)
RESULT(passed)
580 REAL(KIND=dp) :: num, ana, thrs, minval
585 WRITE (*, *)
"DEBUG::"//routinep
588 IF (
PRESENT(enuc))
THEN
589 CALL corecore_num(sepi, sepj, rijv, enuc_num, itype, se_int_control, se_taper)
590 IF (.NOT.
check_value(enuc, enuc_num, delta, 0.001_dp))
THEN
591 WRITE (*, *)
"ERROR for CORE-CORE energy value (numerical different from analytical)!"
595 IF (
PRESENT(denuc))
THEN
596 CALL dcorecore_num(sepi, sepj, rijv, denuc_num, itype, delta, se_int_control, se_taper)
598 IF (.NOT.
check_value(denuc(j), denuc_num(j), delta, 0.001_dp))
THEN
599 WRITE (*, *)
"ERROR for CORE-CORE energy derivative value (numerical different from analytical). DENUC(j), j::", j
629#include "./base/base_uses.f90"
632 REAL(dp),
INTENT(IN) :: r
633 REAL(dp),
DIMENSION(491),
INTENT(IN) :: ri, dri
635 LOGICAL,
INTENT(IN) :: lgrad
638 CHARACTER(len=*),
PARAMETER :: moduleN =
'semi_empirical_int_debug', &
639 routinen =
'check_dterep_ana', routinep = modulen//
':'//routinen
642 REAL(dp) :: delta, od, rn
643 REAL(dp),
DIMENSION(491) :: nri, ri0, rim, rip
646 FUNCTION check_value(num, ana, minval, thrs)
RESULT(passed)
649 REAL(KIND=dp) :: num, ana, thrs, minval
657 CALL terep_num(sepi, sepj, rn, ri0, se_taper, se_int_control)
660 CALL terep_num(sepi, sepj, rn, rip, se_taper, se_int_control)
662 CALL terep_num(sepi, sepj, rn, rim, se_taper, se_int_control)
666 WRITE (*, *)
"DEBUG::"//routinep
668 IF (abs(ri(j) - ri0(j)) > epsilon(0.0_dp))
THEN
669 WRITE (*, *)
"Error in value of the integral RI", j, ri(j), ri0(j)
673 IF (.NOT.
check_value(dri(j), nri(j), delta*100.0_dp, 0.1_dp))
THEN
674 WRITE (*, *)
"ERROR for derivative of RI integral, RI(j), j::", j
675 WRITE (*, *)
"FULL SET OF INTEGRALS: INDX ANAL NUM DIFF"
677 WRITE (*,
'(I5,3F15.9)') i, dri(i), nri(i), nri(i) - dri(i)
708#include "./base/base_uses.f90"
711 REAL(dp),
DIMENSION(3),
INTENT(IN) :: rijv
712 REAL(dp),
DIMENSION(2025),
INTENT(IN), &
714 REAL(dp),
DIMENSION(3, 2025), &
715 INTENT(IN),
OPTIONAL :: dw
719 CHARACTER(len=*),
PARAMETER :: moduleN =
'semi_empirical_int_debug', &
720 routinen =
'rotint_ana', routinep = modulen//
':'//routinen
722 REAL(dp),
DIMENSION(2025) :: w2
723 REAL(dp),
DIMENSION(3, 2025) :: dw2
725 REAL(KIND=dp) :: delta
728 FUNCTION check_value(num, ana, minval, thrs)
RESULT(passed)
731 REAL(KIND=dp) :: num, ana, thrs, minval
737 WRITE (*, *)
"DEBUG::"//routinep
740 CALL rotint_num(sepi, sepj, rijv, w2, se_int_control, se_taper=se_taper)
742 IF (.NOT.
check_value(w(j), w2(j), delta, 0.1_dp))
THEN
743 WRITE (*, *)
"ERROR for integral value W(j), j::", j
748 IF (
PRESENT(dw))
THEN
753 CALL drotint_num(sepi, sepj, rijv, dw2, delta=delta, se_int_control=se_int_control, se_taper=se_taper)
754 CALL rotint_num(sepi, sepj, rijv, w2, se_int_control=se_int_control, se_taper=se_taper)
757 IF ((abs(w2(j)) > delta) .AND. (abs(dw2(i, j)) > delta*10))
THEN
758 IF (.NOT.
check_value(dw(i, j), dw2(i, j), delta, 0.1_dp))
THEN
759 WRITE (*, *)
"ERROR for derivative of the integral value W(j). DW(i,j) i,j::", i, j
Defines the basic variable types.
integer, parameter, public dp
Arrays of parameters used in the semi-empirical calculations \References Everywhere in this module TC...
integer, dimension(9, 9), public indexb
Integrals for semi-empiric methods.
subroutine, public rotnuc_num(sepi, sepj, rijv, e1b, e2a, itype, se_int_control, se_taper)
Computes the two-particle interactions.
subroutine, public rotint_num(sepi, sepj, rijv, w, se_int_control, se_taper)
Computes the two particle interactions in the lab frame.
subroutine, public drotint_num(sepi, sepj, r, dw, delta, se_int_control, se_taper)
Numerical Derivatives for rotint.
subroutine, public core_nucint_num(sepi, sepj, rij, core, itype, se_taper, se_int_control)
Calculates the nuclear attraction integrals CORE (main driver)
subroutine, public ssss_nucint_num(sepi, sepj, rij, ssss, itype, se_taper, se_int_control)
Calculates the SSSS integrals (main driver)
subroutine, public drotnuc_num(sepi, sepj, r, de1b, de2a, itype, delta, se_int_control, se_taper)
Numerical Derivatives for rotnuc.
subroutine, public dcorecore_num(sepi, sepj, r, denuc, itype, delta, se_int_control, se_taper)
Numerical Derivatives for corecore.
subroutine, public corecore_num(sepi, sepj, rijv, enuc, itype, se_int_control, se_taper)
Computes the core-core interactions.
subroutine, public terep_num(sepi, sepj, rij, rep, se_taper, se_int_control)
Calculates the derivative pf two-electron repulsion integrals and the nuclear attraction integrals w....
Utilities for Integrals for semi-empiric methods.
recursive subroutine, public rotmat(sepi, sepj, rjiv, r, ij_matrix, do_derivatives, do_invert, debug_invert)
Computes the general rotation matrices for the integrals between I and J (J>=I)
recursive subroutine, public rot_2el_2c_first(sepi, sepj, rijv, se_int_control, se_taper, invert, ii, kk, rep, logv, ij_matrix, v, lgrad, rep_d, v_d, logv_d, drij)
First Step of the rotation of the two-electron two-center integrals in SPD basis.
Definition of the semi empirical parameter types.
subroutine, public rotmat_release(rotmat)
Releases rotmat type.
subroutine, public rotmat_create(rotmat)
Creates rotmat type.
subroutine check_rotmat_der(sepi, sepj, rjiv, ij_matrix, do_invert)
Debug the derivatives of the the rotational matrices.
subroutine rot_2el_2c_first_debug(sepi, sepj, rijv, se_int_control, se_taper, invert, ii, kk, v_d)
Check Numerical Vs Analytical.
subroutine check_dssss_nucint_ana(sepi, sepj, r, dssss, itype, se_int_control, se_taper)
Check Numerical Vs Analytical ssss.
logical function check_value(num, ana, minval, thrs)
Low level comparison function between numberical and analytical values.
subroutine check_dcorecore_ana(sepi, sepj, rijv, itype, se_int_control, se_taper, enuc, denuc)
Check Numerical Vs Analytical CORE-CORE.
subroutine check_rotint_ana(sepi, sepj, rijv, w, dw, se_int_control, se_taper)
Check Numerical Vs Analytical ROTINT_ANA.
subroutine check_drotnuc_ana(sepi, sepj, rijv, itype, se_int_control, se_taper, e1b, e2a, de1b, de2a)
Check Numerical Vs Analytical.
subroutine check_dcore_nucint_ana(sepi, sepj, r, dcore, itype, se_int_control, se_taper)
Check Numerical Vs Analytical core.
subroutine check_dterep_ana(sepi, sepj, r, ri, dri, se_int_control, se_taper, lgrad)
Check Numerical Vs Analytical DTEREP_ANA.
Taper type use in semi-empirical calculations.