35#include "./base/base_uses.f90"
41 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'dm_ls_scf_curvy'
59 REAL(kind=
dp) :: energy
62 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dm_ls_curvy_optimization'
64 INTEGER :: handle, i, lsstep
66 CALL timeset(routinen, handle)
75 IF (.NOT.
ALLOCATED(ls_scf_env%curvy_data%matrix_dp))
THEN
76 CALL init_curvy(ls_scf_env%curvy_data, ls_scf_env%matrix_s, ls_scf_env%nspins)
77 ls_scf_env%curvy_data%line_search_step = 1
80 DO i = 1, ls_scf_env%nspins
81 CALL dbcsr_copy(ls_scf_env%curvy_data%matrix_psave(i, 1), &
82 ls_scf_env%matrix_p(i))
85 IF (ls_scf_env%nspins == 1)
CALL dbcsr_scale(ls_scf_env%matrix_p(1), 0.5_dp)
86 CALL transform_matrix_orth(ls_scf_env%matrix_p, ls_scf_env%matrix_s_sqrt, &
87 ls_scf_env%eps_filter)
89 DO i = 1, ls_scf_env%nspins
90 CALL dbcsr_copy(ls_scf_env%curvy_data%matrix_p(i), ls_scf_env%matrix_p(i))
94 lsstep = ls_scf_env%curvy_data%line_search_step
98 IF (ls_scf_env%curvy_data%line_search_step == 1)
THEN
99 CALL transform_matrix_orth(ls_scf_env%matrix_ks, ls_scf_env%matrix_s_sqrt_inv, &
100 ls_scf_env%eps_filter)
104 ls_scf_env%curvy_data%energies(lsstep) = energy
105 IF (lsstep /= 1) energy = ls_scf_env%curvy_data%energies(1)
108 IF (lsstep <= 2)
THEN
109 CALL optimization_step(ls_scf_env%curvy_data, ls_scf_env)
110 ELSE IF (lsstep == ls_scf_env%curvy_data%line_search_type)
THEN
112 CALL optimization_step(ls_scf_env%curvy_data, ls_scf_env)
114 CALL new_p_from_save(ls_scf_env%matrix_p, ls_scf_env%curvy_data%matrix_psave, lsstep, &
115 ls_scf_env%curvy_data%double_step_size)
116 ls_scf_env%curvy_data%line_search_step = ls_scf_env%curvy_data%line_search_step + 1
117 CALL timestop(handle)
120 lsstep = ls_scf_env%curvy_data%line_search_step
124 CALL transform_matrix_orth(ls_scf_env%matrix_p, ls_scf_env%matrix_s_sqrt_inv, &
125 ls_scf_env%eps_filter)
126 IF (ls_scf_env%nspins == 1)
CALL dbcsr_scale(ls_scf_env%matrix_p(1), 2.0_dp)
130 DO i = 1, ls_scf_env%nspins
131 CALL dbcsr_copy(ls_scf_env%curvy_data%matrix_psave(i, lsstep), &
132 ls_scf_env%matrix_p(i))
135 check_conv = lsstep == 1
137 CALL timestop(handle)
152 SUBROUTINE optimization_step(curvy_data, ls_scf_env)
156 CHARACTER(LEN=*),
PARAMETER :: routinen =
'optimization_step'
158 INTEGER :: handle, ispin
159 REAL(kind=
dp) :: filter, step_size(2)
163 CALL timeset(routinen, handle)
165 IF (curvy_data%line_search_step == 1)
THEN
166 curvy_data%step_size = maxval(curvy_data%step_size)
167 curvy_data%step_size = min(max(0.10_dp, 0.5_dp*abs(curvy_data%step_size(1))), 0.5_dp)
169 filter = max(ls_scf_env%eps_filter*curvy_data%min_filter, &
170 ls_scf_env%eps_filter*curvy_data%filter_factor)
171 CALL compute_direction_newton(curvy_data%matrix_p, ls_scf_env%matrix_ks, &
172 curvy_data%matrix_dp, filter, curvy_data%fix_shift, curvy_data%shift, &
173 curvy_data%cg_numer, curvy_data%cg_denom, curvy_data%min_shift)
174 curvy_data%filter_factor = curvy_data%scale_filter*curvy_data%filter_factor
175 step_size = curvy_data%step_size
176 curvy_data%BCH_saved = 0
177 ELSE IF (curvy_data%line_search_step == 2)
THEN
178 step_size = curvy_data%step_size
179 IF (curvy_data%energies(1) - curvy_data%energies(2) > 0.0_dp)
THEN
180 curvy_data%step_size = curvy_data%step_size*2.0_dp
181 curvy_data%double_step_size = .true.
183 curvy_data%step_size = curvy_data%step_size*0.5_dp
184 curvy_data%double_step_size = .false.
186 step_size = curvy_data%step_size
188 CALL line_search_2d(curvy_data%energies, curvy_data%step_size)
189 step_size = curvy_data%step_size
191 CALL line_search_3pnt(curvy_data%energies, curvy_data%step_size)
192 step_size = curvy_data%step_size
195 CALL update_p_exp(curvy_data%matrix_p, ls_scf_env%matrix_p, curvy_data%matrix_dp, &
196 curvy_data%matrix_BCH, ls_scf_env%eps_filter, step_size, curvy_data%BCH_saved, &
197 curvy_data%n_bch_hist)
200 curvy_data%line_search_step = mod(curvy_data%line_search_step, curvy_data%line_search_type) + 1
201 IF (curvy_data%line_search_step == 1)
THEN
202 DO ispin = 1,
SIZE(curvy_data%matrix_p)
203 CALL dbcsr_copy(curvy_data%matrix_p(ispin), ls_scf_env%matrix_p(ispin))
206 CALL timestop(handle)
208 END SUBROUTINE optimization_step
220 SUBROUTINE line_search_2d(energies, step_size)
221 REAL(kind=
dp) :: energies(6), step_size(2)
223 INTEGER :: info, unit_nr
224 REAL(kind=
dp) :: e_pred, param(6), s1, s1sq, s2, s2sq, &
225 sys_lin_eq(6, 6), tmp_e, v1, v2
229 IF (energies(1) - energies(2) < 0._dp)
THEN
230 tmp_e = energies(2); energies(2) = energies(3); energies(3) = tmp_e
231 step_size = step_size*2.0_dp
233 IF (logger%para_env%is_source())
THEN
238 s1 = 0.5_dp*step_size(1); s2 = step_size(1); s1sq = s1**2; s2sq = s2**2
239 sys_lin_eq = 0.0_dp; sys_lin_eq(:, 6) = 1.0_dp
240 sys_lin_eq(2, 1) = s1sq; sys_lin_eq(2, 2) = s1sq; sys_lin_eq(2, 3) = s1sq; sys_lin_eq(2, 4) = s1; sys_lin_eq(2, 5) = s1
241 sys_lin_eq(3, 1) = s2sq; sys_lin_eq(3, 2) = s2sq; sys_lin_eq(3, 3) = s2sq; sys_lin_eq(3, 4) = s2; sys_lin_eq(3, 5) = s2
242 sys_lin_eq(4, 3) = s1sq; sys_lin_eq(4, 5) = s1
243 sys_lin_eq(5, 1) = s1sq; sys_lin_eq(5, 4) = s1
244 sys_lin_eq(6, 3) = s2sq; sys_lin_eq(6, 5) = s2
246 CALL invmat(sys_lin_eq, info)
247 param = matmul(sys_lin_eq, energies)
248 v1 = (param(2)*param(4))/(2.0_dp*param(1)) - param(5)
249 v2 = -(param(2)**2)/(2.0_dp*param(1)) + 2.0_dp*param(3)
251 step_size(1) = (-param(2)*step_size(2) - param(4))/(2.0_dp*param(1))
252 IF (step_size(1) < 0.0_dp) step_size(1) = 1.0_dp
253 IF (step_size(2) < 0.0_dp) step_size(2) = 1.0_dp
256 e_pred = param(1)*step_size(1)**2 + param(2)*step_size(1)*step_size(2) + &
257 param(3)*step_size(2)**2 + param(4)*step_size(1) + param(5)*step_size(2) + param(6)
258 IF (unit_nr > 0)
WRITE (unit_nr,
"(t3,a,F10.5,F10.5,A,F20.9)") &
259 " Line Search: Step Size", step_size,
" Predicted energy", e_pred
260 e_pred = param(1)*s1**2 + param(2)*s2*s1*0.0_dp + &
261 param(3)*s1**2*0.0_dp + param(4)*s1 + param(5)*s1*0.0_dp + param(6)
263 END SUBROUTINE line_search_2d
274 SUBROUTINE line_search_3pnt(energies, step_size)
275 REAL(kind=
dp) :: energies(3), step_size(2)
278 REAL(kind=
dp) :: a, b, c, e_pred, min_val, step1, tmp, &
283 IF (energies(1) - energies(2) < 0._dp)
THEN
284 tmp_e = energies(2); energies(2) = energies(3); energies(3) = tmp_e
285 step_size = step_size*2.0_dp
287 IF (logger%para_env%is_source())
THEN
292 step1 = 0.5_dp*step_size(1)
294 a = (energies(3) + c - 2.0_dp*energies(2))/(2.0_dp*step1**2)
295 b = (energies(2) - c - a*step1**2)/step1
296 IF (a < 1.0e-12_dp) a = -1.0e-12_dp
297 min_val = -b/(2.0_dp*a)
298 e_pred = a*min_val**2 + b*min_val + c
300 IF (e_pred < energies(1) .AND. e_pred < energies(2))
THEN
301 step_size = max(-1.0_dp, &
302 min(min_val, 10_dp*step_size))
306 e_pred = a*(step_size(1))**2 + b*(step_size(1)) + c
307 IF (unit_nr > 0)
THEN
308 WRITE (unit_nr,
"(t3,a,f16.8,a,F20.9)")
"Line Search: Step Size", step_size(1),
" Predicted energy", e_pred
311 END SUBROUTINE line_search_3pnt
330 SUBROUTINE compute_direction_newton(matrix_p, matrix_ks, matrix_dp, eps_filter, fix_shift, &
331 curvy_shift, cg_numer, cg_denom, min_shift)
332 TYPE(
dbcsr_type),
DIMENSION(:) :: matrix_p, matrix_ks, matrix_dp
333 REAL(kind=
dp) :: eps_filter
334 LOGICAL :: fix_shift(2)
335 REAL(kind=
dp) :: curvy_shift(2), cg_numer(2), &
336 cg_denom(2), min_shift
338 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_direction_newton'
340 INTEGER :: handle, i, ispin, ncyc, nspin, unit_nr
342 REAL(kind=
dp) :: beta, conv_val, maxel, old_conv, shift
344 TYPE(
dbcsr_type) :: matrix_ax, matrix_b, matrix_cg, &
345 matrix_dp_old, matrix_pks, matrix_res, &
346 matrix_tmp, matrix_tmp1
350 IF (logger%para_env%is_source())
THEN
355 CALL timeset(routinen, handle)
356 nspin =
SIZE(matrix_p)
358 CALL dbcsr_create(matrix_pks, template=matrix_dp(1), matrix_type=dbcsr_type_no_symmetry)
359 CALL dbcsr_create(matrix_ax, template=matrix_dp(1), matrix_type=dbcsr_type_no_symmetry)
360 CALL dbcsr_create(matrix_tmp, template=matrix_dp(1), matrix_type=dbcsr_type_no_symmetry)
361 CALL dbcsr_create(matrix_tmp1, template=matrix_dp(1), matrix_type=dbcsr_type_no_symmetry)
362 CALL dbcsr_create(matrix_res, template=matrix_dp(1), matrix_type=dbcsr_type_no_symmetry)
363 CALL dbcsr_create(matrix_cg, template=matrix_dp(1), matrix_type=dbcsr_type_no_symmetry)
364 CALL dbcsr_create(matrix_b, template=matrix_dp(1), matrix_type=dbcsr_type_no_symmetry)
365 CALL dbcsr_create(matrix_dp_old, template=matrix_dp(1), matrix_type=dbcsr_type_no_symmetry)
368 CALL dbcsr_copy(matrix_dp_old, matrix_dp(ispin))
371 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_p(ispin), matrix_ks(ispin), &
372 0.0_dp, matrix_pks, filter_eps=eps_filter)
377 CALL dbcsr_add(matrix_cg, matrix_pks, 2.0_dp, -2.0_dp)
383 CALL dbcsr_add(matrix_b, matrix_pks, -1.0_dp, -1.0_dp)
387 shift = min(10.0_dp, max(min_shift, 0.05_dp*old_conv))
388 conv_val = max(0.010_dp*old_conv, 100.0_dp*eps_filter)
390 IF (fix_shift(ispin))
THEN
391 shift = max(min_shift, min(10.0_dp, max(shift, curvy_shift(ispin) - 0.5_dp*curvy_shift(ispin))))
392 curvy_shift(ispin) = shift
401 CALL commutator_symm(matrix_b, matrix_cg, matrix_ax, eps_filter, 1.0_dp)
404 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_cg, matrix_p(ispin), &
405 0.0_dp, matrix_tmp, filter_eps=eps_filter)
406 CALL commutator_symm(matrix_ks(ispin), matrix_tmp, matrix_tmp1, eps_filter, 2.0_dp)
407 CALL dbcsr_add(matrix_ax, matrix_tmp1, 1.0_dp, 1.0_dp)
410 CALL dbcsr_add(matrix_ax, matrix_cg, 1.0_dp, shift)
412 CALL compute_cg_matrices(matrix_ax, matrix_res, matrix_cg, matrix_dp(ispin), &
413 matrix_tmp, eps_filter, at_limit)
418 IF (unit_nr > 0)
THEN
419 WRITE (unit_nr,
"(T3,A,F12.6)")
"Convergence of Newton iteration ", maxel
422 at_limit = at_limit .OR. (old_conv/maxel < 1.01_dp)
424 IF (i == ncyc .AND. maxel/conv_val > 5.0_dp)
THEN
425 fix_shift(ispin) = .true.
426 curvy_shift(ispin) = 4.0_dp*shift
428 IF (maxel < conv_val .OR. at_limit)
EXIT
435 CALL dbcsr_add(matrix_cg, matrix_pks, 1.0_dp, -1.0_dp)
436 cg_denom(ispin) = cg_numer(ispin)
437 CALL dbcsr_dot(matrix_cg, matrix_dp(ispin), cg_numer(ispin))
438 beta = cg_numer(ispin)/max(cg_denom(ispin), 1.0e-6_dp)
439 IF (beta < 1.0_dp)
THEN
440 beta = max(0.0_dp, beta)
441 CALL dbcsr_add(matrix_dp(ispin), matrix_dp_old, 1.0_dp, beta)
443 IF (unit_nr > 0)
WRITE (unit_nr,
"(A)")
" "
456 IF (unit_nr > 0)
CALL m_flush(unit_nr)
457 CALL timestop(handle)
458 END SUBROUTINE compute_direction_newton
475 SUBROUTINE compute_cg_matrices(Ax, res, cg, deltp, tmp, eps_filter, at_limit)
477 REAL(kind=
dp) :: eps_filter
481 REAL(kind=
dp) :: alpha, beta, devi(3),
fac, fac1, &
482 lin_eq(3, 3), new_norm, norm_ca, &
489 fac = norm_rr/norm_ca
496 lin_eq(i, :) = [
fac**2,
fac, 1.0_dp]
497 fac = fac1 + fac1*((-1)**i)*0.5_dp
500 vec = matmul(lin_eq, devi)
501 alpha = -vec(2)/(2.0_dp*vec(1))
502 fac = sqrt(norm_rr/(norm_ca*alpha))
506 norm_ca = norm_ca*
fac**2
509 alpha = norm_rr/norm_ca
512 IF (norm_rr < eps_filter*0.001_dp .OR. new_norm < eps_filter*0.001_dp)
THEN
516 beta = new_norm/norm_rr
519 beta = new_norm/norm_rr
522 END SUBROUTINE compute_cg_matrices
537 SUBROUTINE new_p_from_save(matrix_p, matrix_psave, lsstep, DOUBLE)
539 TYPE(
dbcsr_type),
DIMENSION(:, :) :: matrix_psave
545 CALL dbcsr_copy(matrix_p(1), matrix_psave(1, 1))
547 CALL dbcsr_copy(matrix_p(2), matrix_psave(2, 2))
549 CALL dbcsr_copy(matrix_p(2), matrix_psave(2, 3))
553 CALL dbcsr_copy(matrix_p(1), matrix_psave(1, 2))
555 CALL dbcsr_copy(matrix_p(1), matrix_psave(1, 3))
557 CALL dbcsr_copy(matrix_p(2), matrix_psave(2, 1))
559 CALL dbcsr_copy(matrix_p(1), matrix_psave(1, 1))
561 CALL dbcsr_copy(matrix_p(2), matrix_psave(2, 3))
563 CALL dbcsr_copy(matrix_p(2), matrix_psave(2, 2))
567 END SUBROUTINE new_p_from_save
581 SUBROUTINE commutator_symm(a, b, res, eps_filter, prefac)
583 REAL(kind=
dp) :: eps_filter, prefac
585 CHARACTER(LEN=*),
PARAMETER :: routinen =
'commutator_symm'
590 CALL timeset(routinen, handle)
592 CALL dbcsr_create(work, template=a, matrix_type=dbcsr_type_no_symmetry)
594 CALL dbcsr_multiply(
"N",
"N", prefac, a, b, 0.0_dp, res, filter_eps=eps_filter)
596 CALL dbcsr_add(res, work, 1.0_dp, -1.0_dp)
600 CALL timestop(handle)
601 END SUBROUTINE commutator_symm
620 SUBROUTINE update_p_exp(matrix_p_in, matrix_p_out, matrix_dp, matrix_BCH, threshold, step_size, &
621 BCH_saved, n_bch_hist)
622 TYPE(
dbcsr_type),
DIMENSION(:) :: matrix_p_in, matrix_p_out, matrix_dp
623 TYPE(
dbcsr_type),
DIMENSION(:, :) :: matrix_bch
624 REAL(kind=
dp) :: threshold, step_size(2)
625 INTEGER :: bch_saved(2), n_bch_hist
627 CHARACTER(LEN=*),
PARAMETER :: routinen =
'update_p_exp'
629 INTEGER :: handle, i, ispin, nsave, nspin, unit_nr
631 REAL(kind=
dp) :: frob_norm, step_fac
635 CALL timeset(routinen, handle)
638 IF (logger%para_env%is_source())
THEN
644 CALL dbcsr_create(matrix, template=matrix_p_in(1), matrix_type=dbcsr_type_no_symmetry)
645 CALL dbcsr_create(matrix_tmp, template=matrix_p_in(1), matrix_type=dbcsr_type_no_symmetry)
646 nspin =
SIZE(matrix_p_in)
653 CALL dbcsr_copy(matrix_tmp, matrix_p_in(ispin))
654 CALL dbcsr_copy(matrix_p_out(ispin), matrix_p_in(ispin))
657 DO i = 1, bch_saved(ispin)
658 step_fac = step_fac*step_size(ispin)
659 CALL dbcsr_copy(matrix_tmp, matrix_p_out(ispin))
660 CALL dbcsr_add(matrix_p_out(ispin), matrix_bch(ispin, i), 1.0_dp,
ifac(i)*step_fac)
661 CALL dbcsr_add(matrix_tmp, matrix_p_out(ispin), 1.0_dp, -1.0_dp)
663 IF (unit_nr > 0)
WRITE (unit_nr,
"(t3,a,i3,a,f16.8)")
"BCH: step", i,
" Norm of P_old-Pnew:", frob_norm
664 IF (frob_norm < threshold)
EXIT
666 IF (frob_norm < threshold) cycle
669 save_bch = bch_saved(ispin) == 0 .AND. n_bch_hist > 0
670 DO i = bch_saved(ispin) + 1, 20
671 step_fac = step_fac*step_size(ispin)
674 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_tmp, matrix_dp(ispin), &
675 0.0_dp, matrix, filter_eps=threshold)
680 CALL dbcsr_add(matrix, matrix_tmp, 1.0_dp, 1.0_dp)
683 CALL dbcsr_copy(matrix_tmp, matrix_p_out(ispin))
684 CALL dbcsr_add(matrix_p_out(ispin), matrix, 1.0_dp,
ifac(i)*step_fac)
685 IF (save_bch .AND. i <= n_bch_hist)
THEN
690 CALL dbcsr_add(matrix_tmp, matrix_p_out(ispin), 1.0_dp, -1.0_dp)
694 IF (unit_nr > 0)
WRITE (unit_nr,
"(t3,a,i3,a,f16.8)")
"BCH: step", i,
" Norm of P_old-Pnew:", frob_norm
695 IF (frob_norm < threshold)
EXIT
701 bch_saved(ispin) = nsave
702 IF (unit_nr > 0)
WRITE (unit_nr,
"(A)")
" "
706 IF (unit_nr > 0)
CALL m_flush(unit_nr)
709 CALL timestop(handle)
710 END SUBROUTINE update_p_exp
723 SUBROUTINE transform_matrix_orth(matrix, matrix_trafo, eps_filter)
726 REAL(kind=
dp) :: eps_filter
728 CHARACTER(LEN=*),
PARAMETER :: routinen =
'transform_matrix_orth'
730 INTEGER :: handle, ispin
733 CALL timeset(routinen, handle)
735 CALL dbcsr_create(matrix_work, template=matrix(1), matrix_type=dbcsr_type_no_symmetry)
736 CALL dbcsr_create(matrix_tmp, template=matrix(1), matrix_type=dbcsr_type_no_symmetry)
738 DO ispin = 1,
SIZE(matrix)
739 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix(ispin), matrix_trafo, &
740 0.0_dp, matrix_work, filter_eps=eps_filter)
741 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_trafo, matrix_work, &
742 0.0_dp, matrix_tmp, filter_eps=eps_filter)
745 CALL dbcsr_add(matrix_tmp, matrix_work, 0.5_dp, 0.5_dp)
751 CALL timestop(handle)
753 END SUBROUTINE transform_matrix_orth
764 CALL release_dbcsr_array(curvy_data%matrix_dp)
765 CALL release_dbcsr_array(curvy_data%matrix_p)
767 IF (
ALLOCATED(curvy_data%matrix_psave))
THEN
768 DO i = 1,
SIZE(curvy_data%matrix_psave, 1)
773 DEALLOCATE (curvy_data%matrix_psave)
775 IF (
ALLOCATED(curvy_data%matrix_BCH))
THEN
776 DO i = 1,
SIZE(curvy_data%matrix_BCH, 1)
781 DEALLOCATE (curvy_data%matrix_BCH)
789 SUBROUTINE release_dbcsr_array(matrix)
790 TYPE(
dbcsr_type),
ALLOCATABLE,
DIMENSION(:) :: matrix
794 IF (
ALLOCATED(matrix))
THEN
795 DO i = 1,
SIZE(matrix)
800 END SUBROUTINE release_dbcsr_array
808 SUBROUTINE init_curvy(curvy_data, matrix_s, nspins)
815 ALLOCATE (curvy_data%matrix_dp(nspins))
816 ALLOCATE (curvy_data%matrix_p(nspins))
818 CALL dbcsr_create(curvy_data%matrix_dp(ispin), template=matrix_s, &
819 matrix_type=dbcsr_type_no_symmetry)
820 CALL dbcsr_set(curvy_data%matrix_dp(ispin), 0.0_dp)
821 CALL dbcsr_create(curvy_data%matrix_p(ispin), template=matrix_s, &
822 matrix_type=dbcsr_type_no_symmetry)
823 curvy_data%fix_shift = .false.
824 curvy_data%double_step_size = .true.
825 curvy_data%shift = 1.0_dp
826 curvy_data%BCH_saved = 0
827 curvy_data%step_size = 0.60_dp
828 curvy_data%cg_numer = 0.00_dp
829 curvy_data%cg_denom = 0.00_dp
832 ALLOCATE (curvy_data%matrix_psave(nspins, 3))
835 CALL dbcsr_create(curvy_data%matrix_psave(ispin, j), template=matrix_s, &
836 matrix_type=dbcsr_type_no_symmetry)
840 IF (curvy_data%n_bch_hist > 0)
THEN
841 ALLOCATE (curvy_data%matrix_BCH(nspins, curvy_data%n_bch_hist))
843 DO j = 1, curvy_data%n_bch_hist
844 CALL dbcsr_create(curvy_data%matrix_BCH(ispin, j), template=matrix_s, &
845 matrix_type=dbcsr_type_no_symmetry)
850 END SUBROUTINE init_curvy
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public shao2003
subroutine, public dbcsr_transposed(transposed, normal, shallow_data_copy, transpose_distribution, use_distribution)
...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
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_filter(matrix, eps)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
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.
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
density matrix optimization using exponential transformations
subroutine, public dm_ls_curvy_optimization(ls_scf_env, energy, check_conv)
driver routine for Head-Gordon curvy step approach
subroutine, public deallocate_curvy_data(curvy_data)
...
Types needed for a linear scaling quickstep SCF run based on the density matrix.
Routines useful for iterative matrix calculations.
Defines the basic variable types.
integer, parameter, public dp
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition of mathematical constants and functions.
real(kind=dp), dimension(0:maxfac), parameter, public ifac
real(kind=dp), dimension(0:maxfac), parameter, public fac
Collection of simple mathematical functions and subroutines.
subroutine, public invmat(a, info)
returns inverse of matrix using the lapack routines DGETRF and DGETRI
type of a logger, at the moment it contains just a print level starting at which level it should be l...