(git:ed6f26b)
Loading...
Searching...
No Matches
semi_empirical_int_debug.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Debug the derivatives of the the rotational matrices
10!>
11!> \param sepi ...
12!> \param sepj ...
13!> \param rjiv ...
14!> \param ij_matrix ...
15!> \param do_invert ...
16!> \date 04.2008 [tlaino]
17!> \author Teodoro Laino [tlaino] - University of Zurich
18! **************************************************************************************************
19SUBROUTINE check_rotmat_der(sepi, sepj, rjiv, ij_matrix, do_invert)
20
21 USE kinds, ONLY: dp
28#include "./base/base_uses.f90"
29 IMPLICIT NONE
30 TYPE(semi_empirical_type), POINTER :: sepi, sepj
31 REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rjiv
32 TYPE(rotmat_type), POINTER :: ij_matrix
33 LOGICAL, INTENT(IN) :: do_invert
34
35 CHARACTER(len=*), PARAMETER :: modulen = 'semi_empirical_int_debug', &
36 routinen = 'check_rotmat_der', routinep = modulen//':'//routinen
37
38 REAL(kind=dp) :: dx, r, r0(3), x(3)
39 TYPE(rotmat_type), POINTER :: matrix, matrix_m, matrix_n, &
40 matrix_p
41 INTEGER :: imap(3), i, j, k, l
42
43 INTERFACE
44 FUNCTION check_value(num, ana, minval, thrs) RESULT(passed)
45 USE kinds, ONLY: dp
46 IMPLICIT NONE
47 REAL(KIND=dp) :: num, ana, thrs, minval
48 LOGICAL :: passed
49 END FUNCTION check_value
50 END INTERFACE
51
52 NULLIFY (matrix_m, matrix_p, matrix_n, matrix)
53 CALL rotmat_create(matrix_p)
54 CALL rotmat_create(matrix_m)
55 CALL rotmat_create(matrix_n)
56 dx = 1.0e-6_dp
57 imap(1) = 1
58 imap(2) = 2
59 imap(3) = 3
60 IF (do_invert) THEN
61 imap(1) = 3
62 imap(2) = 2
63 imap(3) = 1
64 END IF
65 ! Check derivatives: analytical VS numerical
66 WRITE (*, *) "DEBUG::"//routinep
67 DO j = 1, 3
68 x = 0.0_dp
69 x(imap(j)) = dx
70 DO i = 1, 2
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)
76 END DO
77 ! SP
78 matrix_n%sp_d(j, :, :) = (matrix_p%sp - matrix_m%sp)/(2.0_dp*dx)
79 DO i = 1, 3
80 DO k = 1, 3
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
83 cpabort("")
84 END IF
85 END DO
86 END DO
87 ! PP
88 matrix_n%pp_d(j, :, :, :) = (matrix_p%pp - matrix_m%pp)/(2.0_dp*dx)
89 DO i = 1, 3
90 DO k = 1, 3
91 DO l = 1, 6
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
94 cpabort("")
95 END IF
96 END DO
97 END DO
98 END DO
99 ! d-orbitals debug
100 IF (sepi%dorb .OR. sepj%dorb) THEN
101 ! SD
102 matrix_n%sd_d(j, :, :) = (matrix_p%sd - matrix_m%sd)/(2.0_dp*dx)
103 DO i = 1, 5
104 DO k = 1, 5
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
107 cpabort("")
108 END IF
109 END DO
110 END DO
111 ! DP
112 matrix_n%pd_d(j, :, :, :) = (matrix_p%pd - matrix_m%pd)/(2.0_dp*dx)
113 DO i = 1, 3
114 DO k = 1, 5
115 DO l = 1, 15
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
118 cpabort("")
119 END IF
120 END DO
121 END DO
122 END DO
123 ! DD
124 matrix_n%dd_d(j, :, :, :) = (matrix_p%dd - matrix_m%dd)/(2.0_dp*dx)
125 DO i = 1, 5
126 DO k = 1, 5
127 DO l = 1, 15
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
130 cpabort("")
131 END IF
132 END DO
133 END DO
134 END DO
135 END IF
136 END DO
137 CALL rotmat_release(matrix_p)
138 CALL rotmat_release(matrix_m)
139 CALL rotmat_release(matrix_n)
140END SUBROUTINE check_rotmat_der
141
142! **************************************************************************************************
143!> \brief Check Numerical Vs Analytical
144!> \param sepi ...
145!> \param sepj ...
146!> \param rijv ...
147!> \param se_int_control ...
148!> \param se_taper ...
149!> \param invert ...
150!> \param ii ...
151!> \param kk ...
152!> \param v_d ...
153!> \par History
154!> 04.2008 created [tlaino]
155!> \author Teodoro Laino - Zurich University
156!> \note
157!> Debug routine
158! **************************************************************************************************
159SUBROUTINE rot_2el_2c_first_debug(sepi, sepj, rijv, se_int_control, se_taper, invert, ii, kk, v_d)
160
161 USE kinds, ONLY: dp
166 rotmat_type, &
172#include "./base/base_uses.f90"
173 IMPLICIT NONE
174 TYPE(semi_empirical_type), POINTER :: sepi, sepj
175 REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rijv
176 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
177 LOGICAL, INTENT(IN) :: invert
178 TYPE(se_taper_type), POINTER :: se_taper
179 INTEGER, INTENT(IN) :: ii, kk
180 REAL(KIND=dp), DIMENSION(3, 45, 45), &
181 INTENT(IN) :: v_d
182
183 CHARACTER(len=*), PARAMETER :: moduleN = 'semi_empirical_int_debug', &
184 routinen = 'rot_2el_2c_first', routinep = modulen//':'//routinen
185
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
189
190 REAL(KIND=dp) :: dx, r, r0(3), x(3)
191 TYPE(rotmat_type), POINTER :: matrix
192 INTEGER :: imap(3), i, j, k, limkl
193
194 INTERFACE
195 FUNCTION check_value(num, ana, minval, thrs) RESULT(passed)
196 USE kinds, ONLY: dp
197 IMPLICIT NONE
198 REAL(KIND=dp) :: num, ana, thrs, minval
199 LOGICAL :: passed
200 END FUNCTION check_value
201 END INTERFACE
202
203 NULLIFY (matrix)
204 dx = 1.0e-6_dp
205 imap(1) = 1
206 imap(2) = 2
207 imap(3) = 3
208 IF (invert) THEN
209 imap(1) = 3
210 imap(2) = 2
211 imap(3) = 1
212 END IF
213 limkl = indexb(kk, kk)
214 ! Check derivatives: analytical VS numerical
215 WRITE (*, *) "DEBUG::"//routinep
216 DO j = 1, 3
217 x = 0.0_dp
218 x(imap(j)) = dx
219 DO i = 1, 2
220 r0 = rijv + (-1.0_dp)**(i - 1)*x
221 r = sqrt(dot_product(r0, r0))
222
223 CALL rotmat_create(matrix)
224 CALL rotmat(sepi, sepj, r0, r, matrix, do_derivatives=.false., debug_invert=invert)
225
226 ! Compute integrals in diatomic frame
227 CALL terep_num(sepi, sepj, r, rep, se_taper=se_taper, se_int_control=se_int_control)
228
229 IF (i == 1) THEN
230 CALL rot_2el_2c_first(sepi, sepj, r0, se_int_control, se_taper, invert, ii, kk, rep, logv, matrix, &
231 v_p, lgrad=.false.)
232 END IF
233 IF (i == 2) THEN
234 CALL rot_2el_2c_first(sepi, sepj, r0, se_int_control, se_taper, invert, ii, kk, rep, logv, matrix, &
235 v_m, lgrad=.false.)
236 END IF
237 CALL rotmat_release(matrix)
238 END DO
239 ! Check numerical VS analytical
240 DO i = 1, 45
241 DO k = 1, limkl
242 ! Compute the numerical derivative
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
246 cpabort("")
247 END IF
248 END DO
249 END DO
250 END DO
251END SUBROUTINE rot_2el_2c_first_debug
252
253! **************************************************************************************************
254!> \brief Check Numerical Vs Analytical ssss
255!> \param sepi ...
256!> \param sepj ...
257!> \param r ...
258!> \param dssss ...
259!> \param itype ...
260!> \param se_int_control ...
261!> \param se_taper ...
262!> \par History
263!> 04.2008 created [tlaino]
264!> \author Teodoro Laino - Zurich University
265!> \note
266!> Debug routine
267! **************************************************************************************************
268SUBROUTINE check_dssss_nucint_ana(sepi, sepj, r, dssss, itype, se_int_control, se_taper)
269
270 USE kinds, ONLY: dp
275#include "./base/base_uses.f90"
276 IMPLICIT NONE
277 TYPE(semi_empirical_type), POINTER :: sepi, sepj
278 REAL(dp), INTENT(IN) :: r
279 REAL(dp), INTENT(IN) :: dssss
280 INTEGER, INTENT(IN) :: itype
281 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
282 TYPE(se_taper_type), POINTER :: se_taper
283
284 CHARACTER(len=*), PARAMETER :: moduleN = 'semi_empirical_int_debug', &
285 routinen = 'check_dssss_nucint_ana', routinep = modulen//':'//routinen
286
287 REAL(dp) :: delta, nssss, od, rn, ssssm, ssssp
288
289 INTERFACE
290 FUNCTION check_value(num, ana, minval, thrs) RESULT(passed)
291 USE kinds, ONLY: dp
292 IMPLICIT NONE
293 REAL(KIND=dp) :: num, ana, thrs, minval
294 LOGICAL :: passed
295 END FUNCTION check_value
296 END INTERFACE
297
298 delta = 1.0e-8_dp
299 od = 0.5_dp/delta
300 rn = r + delta
301 CALL ssss_nucint_num(sepi, sepj, rn, ssssp, itype, se_taper, se_int_control)
302 rn = r - delta
303 CALL ssss_nucint_num(sepi, sepj, rn, ssssm, itype, se_taper, se_int_control)
304 nssss = od*(ssssp - ssssm)
305 ! check
306 WRITE (*, *) "DEBUG::"//routinep
307 IF (.NOT. check_value(nssss, dssss, delta, 0.1_dp)) THEN
308 WRITE (*, *) "ERROR for SSSS derivative SSSS"
309 cpabort("")
310 END IF
311END SUBROUTINE check_dssss_nucint_ana
312
313! **************************************************************************************************
314!> \brief Check Numerical Vs Analytical core
315!> \param sepi ...
316!> \param sepj ...
317!> \param r ...
318!> \param dcore ...
319!> \param itype ...
320!> \param se_int_control ...
321!> \param se_taper ...
322!> \par History
323!> 04.2008 created [tlaino]
324!> \author Teodoro Laino - Zurich University
325!> \note
326!> Debug routine
327! **************************************************************************************************
328SUBROUTINE check_dcore_nucint_ana(sepi, sepj, r, dcore, itype, se_int_control, se_taper)
329
330 USE kinds, ONLY: dp
335#include "./base/base_uses.f90"
336 IMPLICIT NONE
337 TYPE(semi_empirical_type), POINTER :: sepi, sepj
338 REAL(dp), INTENT(IN) :: r
339 REAL(dp), DIMENSION(10, 2), INTENT(IN) :: dcore
340 INTEGER, INTENT(IN) :: itype
341 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
342 TYPE(se_taper_type), POINTER :: se_taper
343
344 CHARACTER(len=*), PARAMETER :: moduleN = 'semi_empirical_int_debug', &
345 routinen = 'check_dcore_nucint_ana', routinep = modulen//':'//routinen
346
347 INTEGER :: i, j
348 REAL(dp) :: delta, od, rn
349 REAL(dp), DIMENSION(10, 2) :: corem, corep, ncore
350
351 INTERFACE
352 FUNCTION check_value(num, ana, minval, thrs) RESULT(passed)
353 USE kinds, ONLY: dp
354 IMPLICIT NONE
355 REAL(KIND=dp) :: num, ana, thrs, minval
356 LOGICAL :: passed
357 END FUNCTION check_value
358 END INTERFACE
359
360 delta = 1.0e-8_dp
361 od = 0.5_dp/delta
362 rn = r + delta
363 CALL core_nucint_num(sepi, sepj, rn, corep, itype, se_taper, se_int_control)
364 rn = r - delta
365 CALL core_nucint_num(sepi, sepj, rn, corem, itype, se_taper, se_int_control)
366 ncore = od*(corep - corem)
367 ! check
368 WRITE (*, *) "DEBUG::"//routinep
369 DO i = 1, 2
370 DO j = 1, 10
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
373 cpabort("")
374 END IF
375 END DO
376 END DO
377END SUBROUTINE check_dcore_nucint_ana
378
379! **************************************************************************************************
380!> \brief Low level comparison function between numberical and analytical values
381!> \param num ...
382!> \param ana ...
383!> \param minval ...
384!> \param thrs ...
385!> \return ...
386!> \par History
387!> 04.2008 created [tlaino]
388!> \author Teodoro Laino - Zurich University
389!> \note
390!> Debug routine
391! **************************************************************************************************
392FUNCTION check_value(num, ana, minval, thrs) RESULT(passed)
393 USE kinds, ONLY: dp
394 IMPLICIT NONE
395 REAL(kind=dp) :: num, ana, thrs, minval
396 LOGICAL :: passed
397
398 passed = .true.
399
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
405 ! skip..
406 RETURN
407 END IF
408 IF (abs((num - ana)/num*100._dp) > thrs) THEN
409 WRITE (*, *) abs(num - ana)/num*100._dp, thrs
410 passed = .false.
411 END IF
412 IF (.NOT. passed) THEN
413 WRITE (*, *) "ANALYTICAL ::", ana
414 WRITE (*, *) "NUMERICAL ::", num
415 END IF
416END FUNCTION check_value
417
418! **************************************************************************************************
419!> \brief Check Numerical Vs Analytical
420!> \param sepi ...
421!> \param sepj ...
422!> \param rijv ...
423!> \param itype ...
424!> \param se_int_control ...
425!> \param se_taper ...
426!> \param e1b ...
427!> \param e2a ...
428!> \param de1b ...
429!> \param de2a ...
430!> \par History
431!> 04.2008 created [tlaino]
432!> \author Teodoro Laino - Zurich University
433!> \note
434!> Debug routine
435! **************************************************************************************************
436SUBROUTINE check_drotnuc_ana(sepi, sepj, rijv, itype, se_int_control, se_taper, e1b, e2a, de1b, de2a)
437
438 USE kinds, ONLY: dp
444#include "./base/base_uses.f90"
445 IMPLICIT NONE
446 TYPE(semi_empirical_type), POINTER :: sepi, sepj
447 REAL(dp), DIMENSION(3), INTENT(IN) :: rijv
448 INTEGER, INTENT(IN) :: itype
449 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
450 TYPE(se_taper_type), POINTER :: se_taper
451 REAL(dp), DIMENSION(45), INTENT(IN), &
452 OPTIONAL :: e1b, e2a
453 REAL(dp), DIMENSION(3, 45), &
454 INTENT(IN), OPTIONAL :: de1b, de2a
455
456 CHARACTER(len=*), PARAMETER :: moduleN = 'semi_empirical_int_debug', &
457 routinen = 'check_drotnuc_ana', routinep = modulen//':'//routinen
458
459 INTEGER :: i, j
460 LOGICAL :: l_de1b, l_de2a, l_e1b, l_e2a, &
461 lgrad
462 REAL(dp) :: delta
463 REAL(KIND=dp), DIMENSION(45) :: e1b2, e2a2
464 REAL(KIND=dp), DIMENSION(3, 45) :: de1b2, de2a2
465
466 INTERFACE
467 FUNCTION check_value(num, ana, minval, thrs) RESULT(passed)
468 USE kinds, ONLY: dp
469 IMPLICIT NONE
470 REAL(KIND=dp) :: num, ana, thrs, minval
471 LOGICAL :: passed
472 END FUNCTION check_value
473 END INTERFACE
474
475 l_e1b = PRESENT(e1b)
476 l_e2a = PRESENT(e2a)
477 l_de1b = PRESENT(de1b)
478 l_de2a = PRESENT(de2a)
479 lgrad = l_de1b .OR. l_de2a
480 delta = 1.0e-5_dp
481 ! Check value of integrals
482 WRITE (*, *) "DEBUG::"//routinep
483 CALL rotnuc_num(sepi, sepj, rijv, e1b2, e2a2, itype, se_int_control, se_taper=se_taper)
484 IF (l_e1b) THEN
485 DO j = 1, 45
486 IF (.NOT. check_value(e1b2(j), e1b(j), delta, 0.1_dp)) THEN
487 WRITE (*, *) "ERROR for E1B value E1B(j), j::", j
488 cpabort("")
489 END IF
490 END DO
491 END IF
492 IF (l_e2a) THEN
493 DO j = 1, 45
494 IF (.NOT. check_value(e2a2(j), e2a(j), delta, 0.1_dp)) THEN
495 WRITE (*, *) "ERROR for E2A value E2A(j), j::", j
496 cpabort("")
497 END IF
498 END DO
499 END IF
500
501 ! Check derivatives
502 IF (lgrad) THEN
503 CALL drotnuc_num(sepi, sepj, rijv, de1b2, de2a2, itype, delta=delta, &
504 se_int_control=se_int_control, se_taper=se_taper)
505 IF (l_de1b) THEN
506 DO i = 1, 3
507 DO j = 1, 45
508 ! Additional check on the value of the integral before checking derivatives
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
512 cpabort("")
513 END IF
514 END IF
515 END DO
516 END DO
517 END IF
518 IF (l_de2a) THEN
519 DO i = 1, 3
520 DO j = 1, 45
521 ! Additional check on the value of the integral before checking derivatives
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
525 cpabort("")
526 END IF
527 END IF
528 END DO
529 END DO
530 END IF
531 END IF
532END SUBROUTINE check_drotnuc_ana
533
534! **************************************************************************************************
535!> \brief Check Numerical Vs Analytical CORE-CORE
536!> \param sepi ...
537!> \param sepj ...
538!> \param rijv ...
539!> \param itype ...
540!> \param se_int_control ...
541!> \param se_taper ...
542!> \param enuc ...
543!> \param denuc ...
544!> \par History
545!> 04.2007 created [tlaino]
546!> \author Teodoro Laino - Zurich University
547!> \note
548!> Debug routine
549! **************************************************************************************************
550SUBROUTINE check_dcorecore_ana(sepi, sepj, rijv, itype, se_int_control, se_taper, enuc, denuc)
551
552 USE kinds, ONLY: dp
558#include "./base/base_uses.f90"
559 IMPLICIT NONE
560 TYPE(semi_empirical_type), POINTER :: sepi, sepj
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), &
565 OPTIONAL :: denuc
566 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
567 TYPE(se_taper_type), POINTER :: se_taper
568
569 CHARACTER(len=*), PARAMETER :: moduleN = 'semi_empirical_int_debug', &
570 routinen = 'check_dcorecore_ana', routinep = modulen//':'//routinen
571
572 INTEGER :: j
573 REAL(dp) :: enuc_num, delta
574 REAL(dp), DIMENSION(3) :: denuc_num
575
576 INTERFACE
577 FUNCTION check_value(num, ana, minval, thrs) RESULT(passed)
578 USE kinds, ONLY: dp
579 IMPLICIT NONE
580 REAL(KIND=dp) :: num, ana, thrs, minval
581 LOGICAL :: passed
582 END FUNCTION check_value
583 END INTERFACE
584
585 WRITE (*, *) "DEBUG::"//routinep
586 delta = 1.0e-7_dp
587 ! check
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)!"
592 cpabort("")
593 END IF
594 END IF
595 IF (PRESENT(denuc)) THEN
596 CALL dcorecore_num(sepi, sepj, rijv, denuc_num, itype, delta, se_int_control, se_taper)
597 DO j = 1, 3
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
600 cpabort("")
601 END IF
602 END DO
603 END IF
604END SUBROUTINE check_dcorecore_ana
605
606! **************************************************************************************************
607!> \brief Check Numerical Vs Analytical DTEREP_ANA
608!> \param sepi ...
609!> \param sepj ...
610!> \param r ...
611!> \param ri ...
612!> \param dri ...
613!> \param se_int_control ...
614!> \param se_taper ...
615!> \param lgrad ...
616!> \par History
617!> 04.2007 created [tlaino]
618!> \author Teodoro Laino - Zurich University
619!> \note
620!> Debug routine
621! **************************************************************************************************
622SUBROUTINE check_dterep_ana(sepi, sepj, r, ri, dri, se_int_control, se_taper, lgrad)
623
624 USE kinds, ONLY: dp
629#include "./base/base_uses.f90"
630 IMPLICIT NONE
631 TYPE(semi_empirical_type), POINTER :: sepi, sepj
632 REAL(dp), INTENT(IN) :: r
633 REAL(dp), DIMENSION(491), INTENT(IN) :: ri, dri
634 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
635 LOGICAL, INTENT(IN) :: lgrad
636 TYPE(se_taper_type), POINTER :: se_taper
637
638 CHARACTER(len=*), PARAMETER :: moduleN = 'semi_empirical_int_debug', &
639 routinen = 'check_dterep_ana', routinep = modulen//':'//routinen
640
641 INTEGER :: j, i
642 REAL(dp) :: delta, od, rn
643 REAL(dp), DIMENSION(491) :: nri, ri0, rim, rip
644
645 INTERFACE
646 FUNCTION check_value(num, ana, minval, thrs) RESULT(passed)
647 USE kinds, ONLY: dp
648 IMPLICIT NONE
649 REAL(KIND=dp) :: num, ana, thrs, minval
650 LOGICAL :: passed
651 END FUNCTION check_value
652 END INTERFACE
653
654 delta = 1.0e-8_dp
655 od = 0.5_dp/delta
656 rn = r
657 CALL terep_num(sepi, sepj, rn, ri0, se_taper, se_int_control)
658 IF (lgrad) THEN
659 rn = r + delta
660 CALL terep_num(sepi, sepj, rn, rip, se_taper, se_int_control)
661 rn = r - delta
662 CALL terep_num(sepi, sepj, rn, rim, se_taper, se_int_control)
663 nri = od*(rip - rim)
664 END IF
665 ! check
666 WRITE (*, *) "DEBUG::"//routinep
667 DO j = 1, 491
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)
670 cpabort("")
671 END IF
672 IF (lgrad) THEN
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"
676 DO i = 1, 491
677 WRITE (*, '(I5,3F15.9)') i, dri(i), nri(i), nri(i) - dri(i)
678 END DO
679 cpabort("")
680 END IF
681 END IF
682 END DO
683END SUBROUTINE check_dterep_ana
684
685! **************************************************************************************************
686!> \brief Check Numerical Vs Analytical ROTINT_ANA
687!> \param sepi ...
688!> \param sepj ...
689!> \param rijv ...
690!> \param w ...
691!> \param dw ...
692!> \param se_int_control ...
693!> \param se_taper ...
694!> \par History
695!> 04.2008 created [tlaino]
696!> \author Teodoro Laino - Zurich University
697!> \note
698!> Debug routine
699! **************************************************************************************************
700SUBROUTINE check_rotint_ana(sepi, sepj, rijv, w, dw, se_int_control, se_taper)
701
702 USE kinds, ONLY: dp
708#include "./base/base_uses.f90"
709 IMPLICIT NONE
710 TYPE(semi_empirical_type), POINTER :: sepi, sepj
711 REAL(dp), DIMENSION(3), INTENT(IN) :: rijv
712 REAL(dp), DIMENSION(2025), INTENT(IN), &
713 OPTIONAL :: w
714 REAL(dp), DIMENSION(3, 2025), &
715 INTENT(IN), OPTIONAL :: dw
716 TYPE(se_int_control_type), INTENT(IN) :: se_int_control
717 TYPE(se_taper_type), POINTER :: se_taper
718
719 CHARACTER(len=*), PARAMETER :: moduleN = 'semi_empirical_int_debug', &
720 routinen = 'rotint_ana', routinep = modulen//':'//routinen
721
722 REAL(dp), DIMENSION(2025) :: w2
723 REAL(dp), DIMENSION(3, 2025) :: dw2
724 INTEGER :: j, i
725 REAL(KIND=dp) :: delta
726
727 INTERFACE
728 FUNCTION check_value(num, ana, minval, thrs) RESULT(passed)
729 USE kinds, ONLY: dp
730 IMPLICIT NONE
731 REAL(KIND=dp) :: num, ana, thrs, minval
732 LOGICAL :: passed
733 END FUNCTION check_value
734 END INTERFACE
735
736 delta = 1.0e-6_dp
737 WRITE (*, *) "DEBUG::"//routinep
738 IF (PRESENT(w)) THEN
739 w2 = 0.0_dp
740 CALL rotint_num(sepi, sepj, rijv, w2, se_int_control, se_taper=se_taper)
741 DO j = 1, 2025
742 IF (.NOT. check_value(w(j), w2(j), delta, 0.1_dp)) THEN
743 WRITE (*, *) "ERROR for integral value W(j), j::", j
744 cpabort("")
745 END IF
746 END DO
747 END IF
748 IF (PRESENT(dw)) THEN
749 ! Numerical derivatives are obviosly a big problem..
750 ! First of all let's decide if the value we get for delta is compatible
751 ! with a reasonable value of the integral.. (compatible if the value of the
752 ! integral is greater than 1.0E-6)
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)
755 DO i = 1, 3
756 DO j = 1, 2025
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
760 cpabort("")
761 END IF
762 END IF
763 END DO
764 END DO
765 END IF
766END SUBROUTINE check_rotint_ana
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
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.