42#include "./base/base_uses.f90"
48 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'ct_methods'
66 CHARACTER(len=*),
PARAMETER :: routinen =
'ct_step_execute'
68 INTEGER :: handle, n, preconditioner_type, unit_nr
69 REAL(kind=
dp) :: gap_estimate, safety_margin
70 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals
72 TYPE(
dbcsr_type) :: matrix_pp, matrix_pq, matrix_qp, &
73 matrix_qp_save, matrix_qq, oo1, &
74 oo1_sqrt, oo1_sqrt_inv, t_corr, tmp1, &
84 CALL timeset(routinen, handle)
87 IF (logger%para_env%is_source())
THEN
94 IF (cts_env%update_q .AND. (.NOT. cts_env%update_p))
THEN
95 cpabort(
"q-update is possible only with p-update")
99 cpabort(
"riccati is not implemented for biorthogonal basis")
102 IF (.NOT.
ASSOCIATED(cts_env%matrix_ks))
THEN
103 cpabort(
"KS matrix is not associated")
106 IF (cts_env%use_virt_orbs .AND. (.NOT. cts_env%use_occ_orbs))
THEN
107 cpabort(
"virtual orbs can be used only with occupied orbs")
110 IF (cts_env%use_occ_orbs)
THEN
111 IF (.NOT.
ASSOCIATED(cts_env%matrix_t))
THEN
112 cpabort(
"T matrix is not associated")
114 IF (.NOT.
ASSOCIATED(cts_env%matrix_qp_template))
THEN
115 cpabort(
"QP template is not associated")
117 IF (.NOT.
ASSOCIATED(cts_env%matrix_pq_template))
THEN
118 cpabort(
"PQ template is not associated")
122 IF (cts_env%use_virt_orbs)
THEN
123 IF (.NOT.
ASSOCIATED(cts_env%matrix_v))
THEN
124 cpabort(
"V matrix is not associated")
127 IF (.NOT.
ASSOCIATED(cts_env%matrix_p))
THEN
128 cpabort(
"P matrix is not associated")
134 cpabort(
"illegal tensor flag")
138 IF (cts_env%use_occ_orbs)
THEN
142 template=cts_env%p_index_up, &
143 matrix_type=dbcsr_type_no_symmetry)
145 template=cts_env%matrix_qp_template, &
146 matrix_type=dbcsr_type_no_symmetry)
148 template=cts_env%q_index_up, &
149 matrix_type=dbcsr_type_no_symmetry)
151 template=cts_env%matrix_pq_template, &
152 matrix_type=dbcsr_type_no_symmetry)
156 template=cts_env%matrix_qp_template)
158 CALL assemble_ks_qp_blocks(cts_env%matrix_ks, &
162 cts_env%q_index_down, &
163 cts_env%p_index_up, &
164 cts_env%q_index_up, &
169 cts_env%tensor_type, &
170 cts_env%use_virt_orbs, &
175 template=cts_env%matrix_qp_template)
176 IF (
ASSOCIATED(cts_env%matrix_x_guess))
THEN
178 cts_env%matrix_x_guess)
184 cts_env%matrix_x, 0.0_dp, cts_env%matrix_res, &
185 filter_eps=cts_env%eps_filter)
187 cts_env%p_index_up, 0.0_dp, &
189 filter_eps=cts_env%eps_filter)
198 preconditioner_type = 1
199 safety_margin = 2.0_dp
200 gap_estimate = 0.0001_dp
201 SELECT CASE (preconditioner_type)
207 matrix_type=dbcsr_type_no_symmetry)
213 cts_env%para_env, cts_env%blacs_env)
220 matrix_type=dbcsr_type_no_symmetry)
226 cts_env%para_env, cts_env%blacs_env)
233 CALL matrix_forward_transform(matrix_pp, u_pp, u_pp, &
235 CALL matrix_forward_transform(matrix_qq, u_qq, u_qq, &
237 CALL matrix_forward_transform(matrix_qp, u_qq, u_pp, &
239 CALL matrix_forward_transform(matrix_pq, u_pp, u_qq, &
241 CALL matrix_forward_transform(cts_env%matrix_x, u_qq, u_pp, &
244 IF (cts_env%max_iter .GE. 0)
THEN
246 CALL solve_riccati_equation( &
251 x=cts_env%matrix_x, &
252 res=cts_env%matrix_res, &
253 neglect_quadratic_term=cts_env%neglect_quadratic_term, &
254 conjugator=cts_env%conjugator, &
255 max_iter=cts_env%max_iter, &
256 eps_convergence=cts_env%eps_convergence, &
257 eps_filter=cts_env%eps_filter, &
258 converged=cts_env%converged)
260 IF (cts_env%converged)
THEN
268 cpabort(
"RICCATI: CG algorithm has NOT converged")
273 IF (cts_env%calculate_energy_corr)
THEN
275 CALL dbcsr_dot(matrix_qp, cts_env%matrix_x, cts_env%energy_correction)
285 CALL matrix_backward_transform(cts_env%matrix_x, u_qq, &
286 u_pp, cts_env%eps_filter)
297 matrix_type=dbcsr_type_no_symmetry)
301 abs(safety_margin*gap_estimate))
303 para_env=cts_env%para_env, &
304 blacs_env=cts_env%blacs_env)
306 para_env=cts_env%para_env, &
307 blacs_env=cts_env%blacs_env, &
312 matrix_type=dbcsr_type_no_symmetry)
315 abs(safety_margin*gap_estimate))
317 para_env=cts_env%para_env, &
318 blacs_env=cts_env%blacs_env)
320 para_env=cts_env%para_env, &
321 blacs_env=cts_env%blacs_env, &
326 matrix_type=dbcsr_type_no_symmetry)
328 matrix_qq, 0.0_dp, tmp1, &
329 filter_eps=cts_env%eps_filter)
334 matrix_type=dbcsr_type_no_symmetry)
336 u_pp, 0.0_dp, tmp1, &
337 filter_eps=cts_env%eps_filter)
342 matrix_type=dbcsr_type_no_symmetry)
346 matrix_type=dbcsr_type_no_symmetry)
348 u_pp, 0.0_dp, tmp1, &
349 filter_eps=cts_env%eps_filter)
352 filter_eps=cts_env%eps_filter)
358 IF (cts_env%max_iter .GE. 0)
THEN
360 CALL solve_riccati_equation( &
367 x=cts_env%matrix_x, &
368 res=cts_env%matrix_res, &
369 neglect_quadratic_term=cts_env%neglect_quadratic_term, &
370 conjugator=cts_env%conjugator, &
371 max_iter=cts_env%max_iter, &
372 eps_convergence=cts_env%eps_convergence, &
373 eps_filter=cts_env%eps_filter, &
374 converged=cts_env%converged)
376 IF (cts_env%converged)
THEN
384 cpabort(
"RICCATI: CG algorithm has NOT converged")
389 IF (cts_env%calculate_energy_corr)
THEN
391 CALL dbcsr_dot(matrix_qp_save, cts_env%matrix_x, cts_env%energy_correction)
405 cpabort(
"illegal preconditioner type")
408 IF (cts_env%update_p)
THEN
411 cpabort(
"orbital update is NYI for this tensor type")
417 template=cts_env%p_index_up, &
418 matrix_type=dbcsr_type_no_symmetry)
426 cts_env%matrix_x, 0.0_dp, oo1, &
427 filter_eps=cts_env%eps_filter)
436 threshold=cts_env%eps_filter, &
437 order=cts_env%order_lanczos, &
438 eps_lanczos=cts_env%eps_lancsoz, &
439 max_iter_lanczos=cts_env%max_iter_lanczos)
441 oo1_sqrt_inv, 0.0_dp, oo1, &
442 filter_eps=cts_env%eps_filter)
444 cts_env%p_index_down, 0.0_dp, oo1_sqrt, &
445 filter_eps=cts_env%eps_filter)
451 template=cts_env%matrix_qp_template, &
452 matrix_type=dbcsr_type_no_symmetry)
454 cts_env%matrix_x, 0.0_dp, matrix_qp, &
455 filter_eps=cts_env%eps_filter)
457 cts_env%p_index_down, 0.0_dp, &
459 filter_eps=cts_env%eps_filter)
464 IF (cts_env%use_virt_orbs)
THEN
466 cts_env%matrix_x, 0.0_dp, t_corr, &
467 filter_eps=cts_env%eps_filter)
468 CALL dbcsr_add(cts_env%matrix_t, t_corr, &
471 CALL dbcsr_add(cts_env%matrix_t, cts_env%matrix_x, &
475 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, cts_env%matrix_t, oo1_sqrt, &
476 0.0_dp, t_corr, filter_eps=cts_env%eps_filter)
487 template=cts_env%matrix_qp_template, &
488 matrix_type=dbcsr_type_no_symmetry)
490 cts_env%matrix_x, 0.0_dp, matrix_qp, &
491 filter_eps=cts_env%eps_filter)
493 cts_env%p_index_down, 0.0_dp, &
495 filter_eps=cts_env%eps_filter)
502 cpabort(
"illegal occ option")
505 CALL timestop(handle)
529 SUBROUTINE assemble_ks_qp_blocks(ks, p, t, v, q_index_down, &
530 p_index_up, q_index_up, pp, qq, qp, pq, tensor_type, use_virt_orbs, eps_filter)
532 TYPE(
dbcsr_type),
INTENT(IN) :: ks, p, t, v, q_index_down, p_index_up, &
534 TYPE(
dbcsr_type),
INTENT(OUT) :: pp, qq, qp, pq
535 INTEGER,
INTENT(IN) :: tensor_type
536 LOGICAL,
INTENT(IN) :: use_virt_orbs
537 REAL(kind=
dp),
INTENT(IN) :: eps_filter
539 CHARACTER(len=*),
PARAMETER :: routinen =
'assemble_ks_qp_blocks'
542 LOGICAL :: library_fixed
543 TYPE(
dbcsr_type) :: kst, ksv, no, on, oo, q_index_up_nosym, &
546 CALL timeset(routinen, handle)
548 IF (use_virt_orbs)
THEN
554 0.0_dp, t_or, filter_eps=eps_filter)
556 0.0_dp, v_or, filter_eps=eps_filter)
561 0.0_dp, kst, filter_eps=eps_filter)
564 0.0_dp, pp, filter_eps=eps_filter)
567 0.0_dp, qp, filter_eps=eps_filter)
573 0.0_dp, ksv, filter_eps=eps_filter)
576 0.0_dp, pq, filter_eps=eps_filter)
579 0.0_dp, qq, filter_eps=eps_filter)
589 matrix_type=dbcsr_type_no_symmetry)
591 matrix_type=dbcsr_type_no_symmetry)
595 filter_eps=eps_filter)
598 filter_eps=eps_filter)
601 filter_eps=eps_filter)
604 SELECT CASE (tensor_type)
608 CALL dbcsr_create(q_index_up_nosym, template=q_index_up, &
609 matrix_type=dbcsr_type_no_symmetry)
611 CALL dbcsr_add(
sp, q_index_up_nosym, 1.0_dp, 1.0_dp)
617 filter_eps=eps_filter)
621 filter_eps=eps_filter)
623 SELECT CASE (tensor_type)
629 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, p_index_up, qp, 0.0_dp, pq, &
630 filter_eps=eps_filter)
631 library_fixed = .false.
632 IF (library_fixed)
THEN
636 matrix_type=dbcsr_type_no_symmetry)
637 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, qp, p_index_up, 0.0_dp, no, &
638 filter_eps=eps_filter)
646 filter_eps=eps_filter)
648 SELECT CASE (tensor_type)
652 matrix_type=dbcsr_type_no_symmetry)
654 matrix_type=dbcsr_type_no_symmetry)
657 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, q_index_up, qq, 0.0_dp, spf, &
658 filter_eps=eps_filter)
660 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, q_index_up, qp, 0.0_dp, no, &
661 filter_eps=eps_filter)
663 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, p_index_up, pp, 0.0_dp, oo, &
664 filter_eps=eps_filter)
666 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, p_index_up, pq, 0.0_dp, on, &
667 filter_eps=eps_filter)
676 matrix_type=dbcsr_type_no_symmetry)
679 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, p_index_up, pp, 0.0_dp, oo, &
680 filter_eps=eps_filter)
681 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, oo, p_index_up, 0.0_dp, pp, &
682 filter_eps=eps_filter)
693 CALL timestop(handle)
695 END SUBROUTINE assemble_ks_qp_blocks
721 RECURSIVE SUBROUTINE solve_riccati_equation(pp, qq, qp, pq, oo, vv, x, res, &
722 neglect_quadratic_term, &
723 conjugator, max_iter, eps_convergence, eps_filter, &
729 TYPE(
dbcsr_type),
INTENT(IN),
OPTIONAL :: oo, vv
732 LOGICAL,
INTENT(IN) :: neglect_quadratic_term
733 INTEGER,
INTENT(IN) :: conjugator, max_iter
734 REAL(kind=
dp),
INTENT(IN) :: eps_convergence, eps_filter
735 LOGICAL,
INTENT(OUT) :: converged
737 CHARACTER(len=*),
PARAMETER :: routinen =
'solve_riccati_equation'
739 INTEGER :: handle, istep, iteration, nsteps, &
740 unit_nr, update_prec_freq
741 LOGICAL :: prepare_to_exit, present_oo, present_vv, &
742 quadratic_term, restart_conjugator
743 REAL(kind=
dp) :: best_norm, best_step_size, beta, c0, c1, &
744 c2, c3, denom, kappa, numer, &
745 obj_function, t1, t2, tau
746 REAL(kind=
dp),
DIMENSION(3) :: step_size
748 TYPE(
dbcsr_type) :: aux1, aux2, grad, m, n, oo1, oo2, prec, &
749 res_trial, step, step_oo, vv_step
753 CALL timeset(routinen, handle)
756 IF (logger%para_env%is_source())
THEN
781 quadratic_term = .NOT. neglect_quadratic_term
782 present_oo =
PRESENT(oo)
783 present_vv =
PRESENT(vv)
820 prepare_to_exit = .false.
822 best_step_size = 0.0_dp
823 best_norm = 1.0e+100_dp
826 restart_conjugator = .false.
827 update_prec_freq = 20
831 IF (iteration .EQ. 0)
THEN
834 CALL dbcsr_multiply(
"N",
"N", +1.0_dp, qq, x, 0.0_dp, res_trial, &
835 filter_eps=eps_filter)
836 CALL dbcsr_multiply(
"N",
"N", +1.0_dp, res_trial, oo, 1.0_dp, res, &
837 filter_eps=eps_filter)
840 filter_eps=eps_filter)
843 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, x, pp, 0.0_dp, res_trial, &
844 filter_eps=eps_filter)
845 CALL dbcsr_multiply(
"N",
"N", +1.0_dp, vv, res_trial, 1.0_dp, res, &
846 filter_eps=eps_filter)
849 filter_eps=eps_filter)
851 IF (quadratic_term)
THEN
854 filter_eps=eps_filter)
856 filter_eps=eps_filter)
859 filter_eps=eps_filter)
862 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, x, oo2, 0.0_dp, res_trial, &
863 filter_eps=eps_filter)
864 CALL dbcsr_multiply(
"N",
"N", +1.0_dp, vv, res_trial, 1.0_dp, res, &
865 filter_eps=eps_filter)
868 filter_eps=eps_filter)
873 CALL dbcsr_add(res, m, 1.0_dp, best_step_size)
874 CALL dbcsr_add(res, n, 1.0_dp, -best_step_size*best_step_size)
879 converged = (best_norm .LT. eps_convergence)
880 IF (converged .OR. (iteration .GE. max_iter))
THEN
881 prepare_to_exit = .true.
884 IF (.NOT. prepare_to_exit)
THEN
887 IF (quadratic_term)
THEN
888 IF (iteration .EQ. 0)
THEN
891 filter_eps=eps_filter)
893 filter_eps=eps_filter)
896 filter_eps=eps_filter)
899 CALL dbcsr_multiply(
"N",
"N", -1.0_dp, vv, x, 0.0_dp, res_trial, &
900 filter_eps=eps_filter)
901 CALL dbcsr_multiply(
"N",
"N", +1.0_dp, res_trial, pq, 1.0_dp, aux2, &
902 filter_eps=eps_filter)
905 filter_eps=eps_filter)
909 CALL dbcsr_multiply(
"N",
"N", -best_step_size, pq, step_oo, 1.0_dp, aux1, &
910 filter_eps=eps_filter)
912 CALL dbcsr_multiply(
"N",
"N", -best_step_size, pq, step, 1.0_dp, aux1, &
913 filter_eps=eps_filter)
916 CALL dbcsr_multiply(
"N",
"N", -best_step_size, vv_step, pq, 1.0_dp, aux2, &
917 filter_eps=eps_filter)
919 CALL dbcsr_multiply(
"N",
"N", -best_step_size, step, pq, 1.0_dp, aux2, &
920 filter_eps=eps_filter)
929 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, res, aux1, 0.0_dp, res_trial, &
930 filter_eps=eps_filter)
932 filter_eps=eps_filter)
935 filter_eps=eps_filter)
938 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, aux1, res, 0.0_dp, res_trial, &
939 filter_eps=eps_filter)
941 filter_eps=eps_filter)
944 filter_eps=eps_filter)
949 IF (iteration .EQ. 0)
THEN
950 CALL create_preconditioner(prec, aux1, aux2, eps_filter)
957 IF ((iteration .EQ. 0) .OR. restart_conjugator)
THEN
960 restart_conjugator = .false.
961 SELECT CASE (conjugator)
985 beta = -1.0_dp*numer/denom
991 beta = -1.0_dp*numer/denom
1003 kappa = 2.0_dp*numer/denom
1007 beta = tau - kappa*numer/denom
1011 cpabort(
"illegal conjugator")
1052 IF (present_vv)
THEN
1053 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, vv, step, 0.0_dp, vv_step, &
1054 filter_eps=eps_filter)
1055 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, vv_step, aux1, 0.0_dp, m, &
1056 filter_eps=eps_filter)
1059 filter_eps=eps_filter)
1061 IF (present_oo)
THEN
1062 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, step, oo, 0.0_dp, step_oo, &
1063 filter_eps=eps_filter)
1064 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, aux2, step_oo, 1.0_dp, m, &
1065 filter_eps=eps_filter)
1068 filter_eps=eps_filter)
1071 IF (quadratic_term)
THEN
1073 IF (present_oo)
THEN
1075 filter_eps=eps_filter)
1077 filter_eps=eps_filter)
1080 filter_eps=eps_filter)
1082 IF (present_vv)
THEN
1083 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, step, oo2, 0.0_dp, res_trial, &
1084 filter_eps=eps_filter)
1085 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, vv, res_trial, 0.0_dp, n, &
1086 filter_eps=eps_filter)
1089 filter_eps=eps_filter)
1110 IF (nsteps .EQ. 0)
THEN
1111 cpabort(
"no step sizes!")
1115 best_norm = 1.0e+100_dp
1116 best_step_size = 0.0_dp
1117 DO istep = 1, nsteps
1120 CALL dbcsr_add(res_trial, m, 1.0_dp, step_size(istep))
1121 CALL dbcsr_add(res_trial, n, 1.0_dp, -step_size(istep)*step_size(istep))
1127 IF (obj_function .LT. best_norm)
THEN
1128 best_norm = obj_function
1129 best_step_size = step_size(istep)
1136 CALL dbcsr_add(x, step, 1.0_dp, best_step_size)
1145 converged = (best_norm .LT. eps_convergence)
1146 IF (converged .OR. (iteration .GE. max_iter))
THEN
1147 prepare_to_exit = .true.
1152 IF (unit_nr > 0)
THEN
1153 WRITE (unit_nr,
'(T6,A,1X,I4,1X,E12.3,F8.3)') &
1154 "RICCATI iter ", iteration, best_norm, t2 - t1
1161 iteration = iteration + 1
1163 IF (prepare_to_exit)
EXIT
1179 CALL timestop(handle)
1181 END SUBROUTINE solve_riccati_equation
1196 SUBROUTINE create_preconditioner(prec, pp, qq, eps_filter)
1200 REAL(kind=
dp),
INTENT(IN) :: eps_filter
1202 CHARACTER(len=*),
PARAMETER :: routinen =
'create_preconditioner'
1204 INTEGER :: handle, p_nrows, q_nrows
1205 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: p_diagonal, q_diagonal
1206 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: block
1208 TYPE(
dbcsr_type) :: pp_diag, qq_diag, t1, t2, tmp
1212 CALL timeset(routinen, handle)
1230 block(:, :) = 1.0_dp
1237 ALLOCATE (p_diagonal(p_nrows))
1245 0.0_dp, t2, filter_eps=eps_filter)
1250 ALLOCATE (q_diagonal(q_nrows))
1257 0.0_dp, t1, filter_eps=eps_filter)
1265 0.0_dp, qq_diag, retain_sparsity=.true., &
1266 filter_eps=eps_filter)
1271 DEALLOCATE (q_diagonal)
1274 0.0_dp, t2, filter_eps=eps_filter)
1276 CALL dbcsr_add(prec, t2, 1.0_dp, 1.0_dp)
1280 0.0_dp, pp_diag, retain_sparsity=.true., &
1281 filter_eps=eps_filter)
1286 DEALLOCATE (p_diagonal)
1289 0.0_dp, t2, filter_eps=eps_filter)
1292 CALL dbcsr_add(prec, t2, 1.0_dp, 1.0_dp)
1298 CALL inverse_of_elements(prec)
1301 CALL timestop(handle)
1303 END SUBROUTINE create_preconditioner
1310 SUBROUTINE inverse_of_elements(matrix)
1313 CHARACTER(len=*),
PARAMETER :: routinen =
'inverse_of_elements'
1316 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: block
1319 CALL timeset(routinen, handle)
1323 block = 1.0_dp/block
1326 CALL timestop(handle)
1328 END SUBROUTINE inverse_of_elements
1376 REAL(kind=
dp),
INTENT(IN) :: a, b, c, d
1377 REAL(kind=
dp),
DIMENSION(3),
INTENT(OUT) :: minima
1378 INTEGER,
INTENT(OUT) :: nmins
1380 INTEGER :: i, nroots
1381 REAL(kind=
dp) :: dd, der, p, phi, pi, q, temp1, temp2, u, &
1382 v, y1, y2, y2i, y2r, y3
1383 REAL(kind=
dp),
DIMENSION(3) :: x
1390 IF (a .EQ. 0.0_dp)
THEN
1391 IF (b .EQ. 0.0_dp)
THEN
1392 IF (c .EQ. 0.0_dp)
THEN
1402 dd = c*c - 4.0_dp*b*d
1403 IF (dd .GT. 0.0_dp)
THEN
1405 x(1) = (-c + sqrt(dd))/2.0_dp/b
1406 x(2) = (-c - sqrt(dd))/2.0_dp/b
1407 ELSE IF (dd .LT. 0.0_dp)
THEN
1417 p = c/a - b*b/a/a/3.0_dp
1418 q = (2.0_dp*b*b*b/a/a/a - 9.0_dp*b*c/a/a + 27.0_dp*d/a)/27.0_dp
1421 dd = p*p*p/27.0_dp + q*q/4.0_dp
1423 IF (dd .LT. 0.0_dp)
THEN
1425 phi = acos(-q/2.0_dp/sqrt(abs(p*p*p)/27.0_dp))
1426 temp1 = 2.0_dp*sqrt(abs(p)/3.0_dp)
1427 y1 = temp1*cos(phi/3.0_dp)
1428 y2 = -temp1*cos((phi + pi)/3.0_dp)
1429 y3 = -temp1*cos((phi - pi)/3.0_dp)
1432 temp1 = -q/2.0_dp + sqrt(dd)
1433 temp2 = -q/2.0_dp - sqrt(dd)
1434 u = abs(temp1)**(1.0_dp/3.0_dp)
1435 v = abs(temp2)**(1.0_dp/3.0_dp)
1436 IF (temp1 .LT. 0.0_dp) u = -u
1437 IF (temp2 .LT. 0.0_dp) v = -v
1439 y2r = -(u + v)/2.0_dp
1440 y2i = (u - v)*sqrt(3.0_dp)/2.0_dp
1451 IF (dd .LT. 0.0_dp)
THEN
1456 ELSE IF (dd .EQ. 0.0_dp)
THEN
1475 der = 3.0_dp*a*x(i)*x(i) + 2.0_dp*b*x(i) + c
1476 IF (der .GT. 0.0_dp)
THEN
1478 minima(nmins) = x(i)
1503 CHARACTER(len=*),
PARAMETER :: routinen =
'diagonalize_diagonal_blocks'
1505 INTEGER :: handle, iblock_col, iblock_row, &
1506 iblock_size, info, lwork,
orbital
1507 LOGICAL :: block_needed, do_eigenvalues
1508 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues, work
1509 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: data_copy, new_block
1510 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_p
1513 CALL timeset(routinen, handle)
1515 IF (
PRESENT(e))
THEN
1516 do_eigenvalues = .true.
1518 do_eigenvalues = .false.
1523 IF (do_eigenvalues) &
1532 block_needed = .false.
1533 IF (iblock_row == iblock_col) block_needed = .true.
1535 IF (block_needed)
THEN
1538 ALLOCATE (eigenvalues(iblock_size))
1539 ALLOCATE (data_copy(iblock_size, iblock_size))
1540 data_copy(:, :) = data_p(:, :)
1544 ALLOCATE (work(max(1, lwork)))
1545 CALL dsyev(
'V',
'L', iblock_size, data_copy, iblock_size, eigenvalues, work, lwork, info)
1546 lwork = int(work(1))
1550 ALLOCATE (work(max(1, lwork)))
1551 CALL dsyev(
'V',
'L', iblock_size, data_copy, iblock_size, eigenvalues, work, lwork, info)
1552 IF (info .NE. 0) cpabort(
"DSYEV failed")
1558 IF (do_eigenvalues)
THEN
1559 ALLOCATE (new_block(iblock_size, iblock_size))
1560 new_block(:, :) = 0.0_dp
1565 DEALLOCATE (new_block)
1569 DEALLOCATE (data_copy)
1570 DEALLOCATE (eigenvalues)
1581 CALL timestop(handle)
1595 SUBROUTINE matrix_forward_transform(matrix, u1, u2, eps_filter)
1599 REAL(kind=
dp),
INTENT(IN) :: eps_filter
1601 CHARACTER(len=*),
PARAMETER :: routinen =
'matrix_forward_transform'
1606 CALL timeset(routinen, handle)
1609 matrix_type=dbcsr_type_no_symmetry)
1611 filter_eps=eps_filter)
1613 filter_eps=eps_filter)
1616 CALL timestop(handle)
1618 END SUBROUTINE matrix_forward_transform
1630 SUBROUTINE matrix_backward_transform(matrix, u1, u2, eps_filter)
1634 REAL(kind=
dp),
INTENT(IN) :: eps_filter
1636 CHARACTER(len=*),
PARAMETER :: routinen =
'matrix_backward_transform'
1641 CALL timeset(routinen, handle)
1644 matrix_type=dbcsr_type_no_symmetry)
1646 filter_eps=eps_filter)
1648 filter_eps=eps_filter)
1651 CALL timestop(handle)
1653 END SUBROUTINE matrix_backward_transform
subroutine, public dbcsr_transposed(transposed, normal, shallow_data_copy, transpose_distribution, use_distribution)
...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_work_create(matrix, nblks_guess, sizedata_guess, n, work_mutable)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_finalize(matrix)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_iterator_readonly_start(iterator, matrix, shared, dynamic, dynamic_byrows)
Like dbcsr_iterator_start() but with matrix being INTENT(IN). When invoking this routine,...
subroutine, public dbcsr_put_block(matrix, row, col, block, summation)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
Interface to (sca)lapack for the Cholesky based procedures.
subroutine, public cp_dbcsr_cholesky_decompose(matrix, n, para_env, blacs_env)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
subroutine, public cp_dbcsr_cholesky_invert(matrix, n, para_env, blacs_env, uplo_to_full)
used to replace the cholesky decomposition by the inverse
subroutine, public dbcsr_set_diag(matrix, diag)
Copies the diagonal elements from the given array into the given matrix.
subroutine, public dbcsr_get_diag(matrix, diag)
Copies the diagonal elements from the given matrix into the given array.
subroutine, public dbcsr_add_on_diag(matrix, alpha)
Adds the given scalar to the diagonal of the matrix. Reserves any missing diagonal blocks.
real(dp) function, public dbcsr_maxabs(matrix)
Compute the maxabs norm of a dbcsr matrix.
real(dp) function, public dbcsr_frobenius_norm(matrix)
Compute the frobenius norm of a dbcsr matrix.
subroutine, public dbcsr_dot(matrix_a, matrix_b, trace)
Computes the dot product of two matrices, also known as the trace of their matrix product.
subroutine, public dbcsr_hadamard_product(matrix_a, matrix_b, matrix_c)
Hadamard product: C = A . B (C needs to be different from A and B)
subroutine, public dbcsr_reserve_diag_blocks(matrix)
Reserves all diagonal blocks.
Interface to (sca)lapack for the Cholesky based procedures.
subroutine, public cp_dbcsr_syevd(matrix, eigenvectors, eigenvalues, para_env, blacs_env)
...
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
Cayley transformation methods.
subroutine, public analytic_line_search(a, b, c, d, minima, nmins)
Finds real roots of a cubic equation a*x**3 + b*x**2 + c*x + d = 0 and returns only those roots for...
subroutine, public diagonalize_diagonal_blocks(matrix, c, e)
Diagonalizes diagonal blocks of a symmetric dbcsr matrix and returs its eigenvectors.
subroutine, public ct_step_execute(cts_env)
Performs Cayley transformation.
Types for all cayley transformation methods.
Routines useful for iterative matrix calculations.
subroutine, public matrix_sqrt_newton_schulz(matrix_sqrt, matrix_sqrt_inv, matrix, threshold, order, eps_lanczos, max_iter_lanczos, symmetrize, converged, iounit)
compute the sqrt of a matrix via the sign function and the corresponding Newton-Schulz iterations the...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public sp
Machine interface based on Fortran 2003 and POSIX.
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Orbital angular momentum.