74#include "./base/base_uses.f90"
81 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_ot_eigensolver'
105 matrix_c_fm, preconditioner, eps_gradient, &
106 iter_max, size_ortho_space, silent, ot_settings)
108 TYPE(
dbcsr_type),
POINTER :: matrix_h, matrix_s
109 TYPE(
cp_fm_type),
INTENT(IN),
OPTIONAL :: matrix_orthogonal_space_fm
110 TYPE(
cp_fm_type),
INTENT(INOUT) :: matrix_c_fm
112 REAL(kind=
dp) :: eps_gradient
113 INTEGER,
INTENT(IN) :: iter_max
114 INTEGER,
INTENT(IN),
OPTIONAL :: size_ortho_space
115 LOGICAL,
INTENT(IN),
OPTIONAL :: silent
118 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_eigensolver'
119 INTEGER,
PARAMETER :: max_iter_inner_loop = 40
120 REAL(kind=
dp),
PARAMETER :: rone = 1.0_dp, rzero = 0.0_dp
122 INTEGER :: handle, ieigensolver, iter_total, k, n, &
123 ortho_k, ortho_space_k, output_unit
124 LOGICAL :: energy_only, my_silent, ortho, &
126 REAL(kind=
dp) :: delta, energy
128 TYPE(
dbcsr_type),
POINTER :: matrix_buf1_ortho, matrix_buf2_ortho, &
129 matrix_c, matrix_orthogonal_space, &
130 matrix_os_ortho, matrix_s_ortho
131 TYPE(
qs_ot_type),
DIMENSION(:),
POINTER :: qs_ot_env
133 CALL timeset(routinen, handle)
137 IF (
PRESENT(silent))
THEN
147 ref_algorithm = .false.
148 IF (
PRESENT(ot_settings)) ref_algorithm = ot_settings%ot_algorithm ==
"REF"
149 IF (ref_algorithm)
THEN
152 sym=dbcsr_type_no_symmetry)
164 NULLIFY (matrix_s_ortho)
165 NULLIFY (matrix_os_ortho)
166 NULLIFY (matrix_buf1_ortho)
167 NULLIFY (matrix_buf2_ortho)
168 NULLIFY (matrix_orthogonal_space)
170 ALLOCATE (qs_ot_env(1))
171 ALLOCATE (matrix_hc(1))
172 NULLIFY (matrix_hc(1)%matrix)
176 IF (
PRESENT(matrix_orthogonal_space_fm)) ortho = .true.
179 IF (
PRESENT(ot_settings))
THEN
180 qs_ot_env(1)%settings = ot_settings
184 qs_ot_env(1)%settings%ds_min = 0.10_dp
188 ALLOCATE (matrix_orthogonal_space)
190 CALL cp_fm_get_info(matrix_orthogonal_space_fm, ncol_global=ortho_space_k)
192 IF (
PRESENT(size_ortho_space)) ortho_space_k = size_ortho_space
193 ortho_k = ortho_space_k + k
199 CALL qs_ot_allocate(qs_ot_env(1), matrix_s, matrix_c_fm%matrix_struct, ortho_k=ortho_k)
200 IF (ref_algorithm)
THEN
201 CALL dbcsr_copy(matrix_hc(1)%matrix, qs_ot_env(1)%matrix_x,
'matrix_hc')
203 CALL dbcsr_copy(matrix_hc(1)%matrix, matrix_c,
'matrix_hc')
210 CALL dbcsr_copy(matrix_s_ortho, matrix_orthogonal_space, name=
"matrix_s_ortho")
214 sym=dbcsr_type_no_symmetry)
218 sym=dbcsr_type_no_symmetry)
222 sym=dbcsr_type_no_symmetry)
224 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s, matrix_orthogonal_space, &
225 0.0_dp, matrix_s_ortho)
226 CALL dbcsr_multiply(
'T',
'N', rone, matrix_s_ortho, matrix_s_ortho, &
227 rzero, matrix_os_ortho)
230 para_env=qs_ot_env(1)%para_env, blacs_env=qs_ot_env(1)%blacs_env)
232 para_env=qs_ot_env(1)%para_env, blacs_env=qs_ot_env(1)%blacs_env, &
236 rzero, matrix_buf1_ortho)
237 CALL dbcsr_multiply(
'N',
'N', rone, matrix_os_ortho, matrix_buf1_ortho, &
238 rzero, matrix_buf2_ortho)
239 CALL dbcsr_multiply(
'N',
'N', -rone, matrix_s_ortho, matrix_buf2_ortho, &
243 CALL dbcsr_copy(qs_ot_env(1)%matrix_c0, matrix_c)
244 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s, qs_ot_env(1)%matrix_c0, &
248 qs_ot_env(1)%para_env, qs_ot_env(1)%blacs_env)
253 para_env=qs_ot_env(1)%para_env, blacs_env=qs_ot_env(1)%blacs_env)
256 para_env=qs_ot_env(1)%para_env, blacs_env=qs_ot_env(1)%blacs_env)
266 CALL dbcsr_copy(qs_ot_env(1)%matrix_c0, matrix_c)
267 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s, qs_ot_env(1)%matrix_c0, &
268 0.0_dp, qs_ot_env(1)%matrix_sc0)
270 CALL make_basis_sv(qs_ot_env(1)%matrix_c0, k, qs_ot_env(1)%matrix_sc0, &
271 qs_ot_env(1)%para_env, qs_ot_env(1)%blacs_env)
276 energy_only = qs_ot_env(1)%energy_only
278 SELECT CASE (qs_ot_env(1)%settings%ot_algorithm)
280 CALL dbcsr_set(qs_ot_env(1)%matrix_x, 0.0_dp)
281 CALL dbcsr_set(qs_ot_env(1)%matrix_sx, 0.0_dp)
282 CALL qs_ot_get_p(qs_ot_env(1)%matrix_x, qs_ot_env(1)%matrix_sx, qs_ot_env(1))
285 CALL dbcsr_copy(qs_ot_env(1)%matrix_x, qs_ot_env(1)%matrix_c0)
286 CALL dbcsr_copy(qs_ot_env(1)%matrix_sx, qs_ot_env(1)%matrix_sc0)
287 CALL dbcsr_copy(matrix_c, qs_ot_env(1)%matrix_c0)
289 cpabort(
"OT eigensolver supports ALGORITHM STRICT or IRAC")
308 ieigensolver = ieigensolver + 1
309 iter_total = iter_total + 1
313 0.0_dp, matrix_hc(1)%matrix)
314 CALL dbcsr_dot(matrix_c, matrix_hc(1)%matrix, energy)
315 IF (.NOT. energy_only)
THEN
319 qs_ot_env(1)%etotal = energy
320 CALL ot_mini(qs_ot_env, matrix_hc)
321 delta = qs_ot_env(1)%delta
322 energy_only = qs_ot_env(1)%energy_only
324 SELECT CASE (qs_ot_env(1)%settings%ot_algorithm)
326 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s, qs_ot_env(1)%matrix_x, &
327 0.0_dp, qs_ot_env(1)%matrix_sx)
328 CALL qs_ot_get_p(qs_ot_env(1)%matrix_x, qs_ot_env(1)%matrix_sx, qs_ot_env(1))
332 qs_ot_env(1)%matrix_sx, qs_ot_env(1)%matrix_gx_old, &
333 qs_ot_env(1)%matrix_dx, qs_ot_env(1), qs_ot_env(1))
337 IF (delta < eps_gradient .OR. ieigensolver >= max_iter_inner_loop)
EXIT eigensolver_loop
339 IF (iter_total >= iter_max .AND. qs_ot_env(1)%OT_METHOD_FULL /=
"OT LS")
EXIT eigensolver_loop
341 END DO eigensolver_loop
344 DEALLOCATE (qs_ot_env)
346 DEALLOCATE (matrix_hc)
349 IF (delta < eps_gradient)
THEN
350 IF ((output_unit > 0) .AND. .NOT. my_silent)
THEN
351 WRITE (unit=output_unit, fmt=
"(T2,A,I0,A)") &
352 "OT| Eigensolver reached convergence in ", iter_total,
" iterations"
356 IF (iter_total >= iter_max)
THEN
357 IF (output_unit > 0)
THEN
359 WRITE (output_unit,
"(A,T60,E20.10)")
" WARNING OT eigensolver did not converge: current gradient", delta
361 WRITE (output_unit, *)
"WARNING : did not converge in ot_eigensolver"
362 WRITE (output_unit, *)
"number of iterations ", iter_total,
" exceeded maximum"
363 WRITE (output_unit, *)
"current gradient / target gradient", delta,
" / ", eps_gradient
374 CALL timestop(handle)
397 matrix_c_fm, matrix_c_fm_im, preconditioner, &
398 eps_gradient, iter_max, eigenvalues, silent, ot_settings, &
399 matrix_t, matrix_t_im, mo_set)
401 TYPE(
dbcsr_type),
POINTER :: matrix_h, matrix_h_im, matrix_s, &
403 TYPE(
cp_fm_type),
INTENT(INOUT) :: matrix_c_fm, matrix_c_fm_im
405 REAL(kind=
dp),
INTENT(IN) :: eps_gradient
406 INTEGER,
INTENT(IN) :: iter_max
407 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT),
OPTIONAL :: eigenvalues
408 LOGICAL,
INTENT(IN),
OPTIONAL :: silent
410 TYPE(
dbcsr_type),
OPTIONAL,
POINTER :: matrix_t, matrix_t_im
413 CHARACTER(len=*),
PARAMETER :: routinen =
'ot_eigensolver_complex'
414 INTEGER,
PARAMETER :: max_iter_inner_loop = 40
416 INTEGER :: handle, ieigensolver, iter_total, k, n, &
418 LOGICAL :: energy_only, my_silent, &
419 preconditioner_rejected
420 REAL(kind=
dp) :: delta, energy_im, energy_re
421 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_hc, matrix_hc_im
422 TYPE(
dbcsr_type),
POINTER :: matrix_c, matrix_c_im, matrix_tmp
424 TYPE(
qs_ot_type),
DIMENSION(:),
POINTER :: qs_ot_env
426 CALL timeset(routinen, handle)
429 IF (
PRESENT(silent)) my_silent = silent
430 NULLIFY (local_preconditioner)
433 cpassert(n > 0 .AND. k > 0)
434 ALLOCATE (matrix_c, matrix_c_im, matrix_tmp)
437 sym=dbcsr_type_no_symmetry)
440 sym=dbcsr_type_no_symmetry)
443 sym=dbcsr_type_no_symmetry)
449 ALLOCATE (qs_ot_env(1), matrix_hc(1), matrix_hc_im(1))
450 NULLIFY (matrix_hc(1)%matrix, matrix_hc_im(1)%matrix)
452 IF (
PRESENT(ot_settings))
THEN
453 qs_ot_env(1)%settings = ot_settings
456 qs_ot_env(1)%settings%ds_min = 0.10_dp
459 CALL qs_ot_allocate(qs_ot_env(1), matrix_s, matrix_c_fm%matrix_struct)
462 CALL dbcsr_copy(matrix_hc(1)%matrix, qs_ot_env(1)%matrix_x,
'matrix_hc')
464 CALL dbcsr_copy(matrix_hc_im(1)%matrix, qs_ot_env(1)%matrix_x_im,
'matrix_hc_im')
466 CALL dbcsr_copy(qs_ot_env(1)%matrix_c0, matrix_c)
467 CALL dbcsr_copy(qs_ot_env(1)%matrix_c0_im, matrix_c_im)
469 0.0_dp, qs_ot_env(1)%matrix_sc0)
472 CALL dbcsr_add(qs_ot_env(1)%matrix_sc0, matrix_tmp, &
473 alpha_scalar=1.0_dp, beta_scalar=-1.0_dp)
475 0.0_dp, qs_ot_env(1)%matrix_sc0_im)
478 CALL dbcsr_add(qs_ot_env(1)%matrix_sc0_im, matrix_tmp, &
479 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
482 energy_only = qs_ot_env(1)%energy_only
483 SELECT CASE (qs_ot_env(1)%settings%ot_algorithm)
485 CALL dbcsr_set(qs_ot_env(1)%matrix_x, 0.0_dp)
486 CALL dbcsr_set(qs_ot_env(1)%matrix_x_im, 0.0_dp)
487 CALL dbcsr_set(qs_ot_env(1)%matrix_sx, 0.0_dp)
488 CALL dbcsr_set(qs_ot_env(1)%matrix_sx_im, 0.0_dp)
492 CALL dbcsr_copy(qs_ot_env(1)%matrix_x, qs_ot_env(1)%matrix_c0)
493 CALL dbcsr_copy(qs_ot_env(1)%matrix_x_im, qs_ot_env(1)%matrix_c0_im)
494 CALL dbcsr_copy(qs_ot_env(1)%matrix_sx, qs_ot_env(1)%matrix_sc0)
495 CALL dbcsr_copy(qs_ot_env(1)%matrix_sx_im, qs_ot_env(1)%matrix_sc0_im)
497 qs_ot_env(1), qs_ot_env(1))
499 cpabort(
'Complex OT eigensolver supports ALGORITHM STRICT or IRAC')
502 IF (.NOT.
PRESENT(
preconditioner) .AND. .NOT.
ASSOCIATED(local_preconditioner) .AND. &
504 ALLOCATE (local_preconditioner)
505 CALL init_preconditioner(local_preconditioner, qs_ot_env(1)%para_env, qs_ot_env(1)%blacs_env)
506 SELECT CASE (qs_ot_env(1)%settings%preconditioner_type)
508 IF (qs_ot_env(1)%settings%ot_algorithm ==
'TOD')
THEN
512 local_preconditioner, matrix_s, matrix_s_im, &
513 qs_ot_env(1)%settings%precond_solver_type)
515 IF (.NOT.
PRESENT(mo_set))
THEN
516 cpabort(
'Complex FULL_ALL eigensolver preconditioning requires MO energy labels')
519 local_preconditioner, qs_ot_env(1)%matrix_c0, qs_ot_env(1)%matrix_c0_im, &
520 matrix_h, matrix_h_im, matrix_s, matrix_s_im, mo_set, &
521 qs_ot_env(1)%settings%energy_gap, qs_ot_env(1)%settings%precond_solver_type)
524 IF (.NOT.
PRESENT(mo_set))
THEN
525 cpabort(
'Complex FULL_SINGLE eigensolver preconditioning requires MO energy labels')
528 local_preconditioner, matrix_h, matrix_h_im, matrix_s, matrix_s_im, mo_set, &
529 qs_ot_env(1)%settings%energy_gap, qs_ot_env(1)%settings%precond_solver_type)
532 local_preconditioner, qs_ot_env(1)%matrix_c0, qs_ot_env(1)%matrix_c0_im, &
533 matrix_h, matrix_h_im, matrix_s, matrix_s_im, &
534 qs_ot_env(1)%settings%energy_gap, qs_ot_env(1)%settings%precond_solver_type)
536 IF (.NOT.
PRESENT(matrix_t) .OR. .NOT.
PRESENT(matrix_t_im))
THEN
537 cpabort(
'Complex FULL_KINETIC eigensolver preconditioning requires T(k)')
539 IF (.NOT.
ASSOCIATED(matrix_t) .OR. .NOT.
ASSOCIATED(matrix_t_im))
THEN
540 cpabort(
'Complex FULL_KINETIC eigensolver preconditioning requires T(k)')
543 local_preconditioner, matrix_t, matrix_t_im, matrix_s, matrix_s_im, &
544 qs_ot_env(1)%settings%energy_gap, qs_ot_env(1)%settings%precond_solver_type)
547 local_preconditioner, matrix_s, matrix_s_im, &
548 qs_ot_env(1)%settings%precond_solver_type)
550 cpabort(
'Unsupported complex K-point OT eigensolver preconditioner')
560 ELSE IF (
ASSOCIATED(local_preconditioner))
THEN
564 IF (qs_ot_env(1)%settings%ot_algorithm ==
'TOD')
THEN
566 IF (preconditioner_rejected .AND.
ASSOCIATED(local_preconditioner))
THEN
569 qs_ot_env(1)%para_env, qs_ot_env(1)%blacs_env)
571 local_preconditioner, matrix_s, matrix_s_im, &
572 qs_ot_env(1)%settings%precond_solver_type)
575 cpassert(.NOT. preconditioner_rejected)
581 ieigensolver = ieigensolver + 1
582 iter_total = iter_total + 1
586 0.0_dp, matrix_hc(1)%matrix)
589 CALL dbcsr_add(matrix_hc(1)%matrix, matrix_tmp, &
590 alpha_scalar=1.0_dp, beta_scalar=-1.0_dp)
592 0.0_dp, matrix_hc_im(1)%matrix)
595 CALL dbcsr_add(matrix_hc_im(1)%matrix, matrix_tmp, &
596 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
598 CALL dbcsr_dot(matrix_c, matrix_hc(1)%matrix, energy_re)
599 CALL dbcsr_dot(matrix_c_im, matrix_hc_im(1)%matrix, energy_im)
600 qs_ot_env(1)%etotal = energy_re + energy_im
601 IF (.NOT. energy_only)
THEN
605 CALL ot_mini(qs_ot_env, matrix_hc, matrix_hc_im=matrix_hc_im)
606 delta = qs_ot_env(1)%delta
607 energy_only = qs_ot_env(1)%energy_only
609 SELECT CASE (qs_ot_env(1)%settings%ot_algorithm)
615 qs_ot_env(1), qs_ot_env(1))
618 IF (delta < eps_gradient .OR. ieigensolver >= max_iter_inner_loop)
EXIT eigensolver_loop
619 IF (iter_total >= iter_max .AND. qs_ot_env(1)%OT_METHOD_FULL /=
'OT LS')
EXIT eigensolver_loop
620 END DO eigensolver_loop
623 DEALLOCATE (qs_ot_env)
626 DEALLOCATE (matrix_hc, matrix_hc_im)
628 IF (delta < eps_gradient)
THEN
629 IF (output_unit > 0 .AND. .NOT. my_silent)
THEN
630 WRITE (unit=output_unit, fmt=
'(T2,A,I0,A)') &
631 'OT| Complex eigensolver reached convergence in ', iter_total,
' iterations'
635 IF (iter_total >= iter_max)
THEN
636 IF (output_unit > 0)
THEN
637 WRITE (output_unit,
'(A,T60,E20.10)') &
638 ' WARNING complex OT eigensolver did not converge: current gradient', delta
646 IF (
PRESENT(eigenvalues))
THEN
647 CALL canonicalize_complex_subspace(matrix_h, matrix_h_im, matrix_c_fm, &
648 matrix_c_fm_im, eigenvalues)
653 IF (
ASSOCIATED(local_preconditioner))
THEN
655 DEALLOCATE (local_preconditioner)
657 CALL timestop(handle)
669 SUBROUTINE canonicalize_complex_subspace(matrix_h, matrix_h_im, coeff_re, coeff_im, eigenvalues)
670 TYPE(
dbcsr_type),
POINTER :: matrix_h, matrix_h_im
671 TYPE(
cp_fm_type),
INTENT(INOUT) :: coeff_re, coeff_im
672 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: eigenvalues
675 TYPE(
cp_cfm_type) :: coeff, eigenvectors, hblock, hc, rotated
679 cpassert(
SIZE(eigenvalues) >= nmo)
684 alpha=-1.0_dp, beta=1.0_dp)
687 alpha=1.0_dp, beta=1.0_dp)
692 CALL cp_cfm_create(hblock, coeff_re%matrix_struct, nrow=nmo, ncol=nmo)
693 CALL cp_cfm_create(eigenvectors, coeff_re%matrix_struct, nrow=nmo, ncol=nmo)
697 CALL cp_cfm_heevd(hblock, eigenvectors, eigenvalues(1:nmo))
708 END SUBROUTINE canonicalize_complex_subspace
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_gemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, a_first_col, a_first_row, b_first_col, b_first_row, c_first_col, c_first_row)
Performs one of the matrix-matrix operations: matrix_c = alpha * op1( matrix_a ) * op2( matrix_b ) + ...
used for collecting diagonalization schemes available for cp_cfm_type
subroutine, public cp_cfm_heevd(matrix, eigenvectors, eigenvalues)
Perform a diagonalisation of a complex matrix.
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_fm_to_cfm(msourcer, msourcei, mtarget)
Construct a complex full matrix by taking its real and imaginary parts from two separate real-value f...
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_to_fm(msource, mtargetr, mtargeti)
Copy real and imaginary parts of a complex full matrix into separate real-value full matrices.
subroutine, public dbcsr_release_p(matrix)
...
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_init_p(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
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_dot(matrix_a, matrix_b, trace)
Computes the dot product of two matrices, also known as the trace of their matrix product.
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_fm_to_dbcsr_row_template(matrix, fm_in, template)
Utility function to copy a specially shaped fm to dbcsr_matrix The result matrix will be the matrix i...
subroutine, public cp_dbcsr_m_by_n_from_row_template(matrix, template, n, sym)
Utility function to create dbcsr matrix, m x n matrix (n arbitrary) with the same processor grid and ...
subroutine, public cp_dbcsr_m_by_n_from_template(matrix, template, m, n, sym)
Utility function to create an arbitrary shaped dbcsr matrix with the same processor grid as the templ...
subroutine, public dbcsr_copy_columns_hack(matrix_b, matrix_a, ncol, source_start, target_start, para_env, blacs_env)
hack for dbcsr_copy_columns
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public z_zero
subroutine, public init_preconditioner(preconditioner_env, para_env, blacs_env)
...
subroutine, public destroy_preconditioner(preconditioner_env)
...
logical function, public preconditioner_in_use(preconditioner)
...
computes preconditioners, and implements methods to apply them currently used in qs_ot
subroutine, public make_preconditioner_complex_full_all(preconditioner_env, matrix_c_re, matrix_c_im, matrix_h_re, matrix_h_im, matrix_s_re, matrix_s_im, mo_set, energy_gap, solver_type)
Construct FULL_ALL directly from one complex H(k), S(k), and C(k) channel.
subroutine, public make_preconditioner_complex_full_s_inverse(preconditioner_env, matrix_s_re, matrix_s_im, solver_type)
Construct a complex FULL_S_INVERSE preconditioner.
subroutine, public make_preconditioner_complex_full_single(preconditioner_env, matrix_h_re, matrix_h_im, matrix_s_re, matrix_s_im, mo_set, energy_gap, solver_type)
Construct a complex FULL_SINGLE preconditioner from H(k) and S(k).
subroutine, public make_preconditioner_complex_full_single_inverse(preconditioner_env, matrix_c_re, matrix_c_im, matrix_h_re, matrix_h_im, matrix_s_re, matrix_s_im, energy_gap, solver_type)
Construct a complex FULL_SINGLE_INVERSE preconditioner without discarding Im(H,S,C).
subroutine, public make_preconditioner_complex_full_kinetic(preconditioner_env, matrix_t_re, matrix_t_im, matrix_s_re, matrix_s_im, energy_gap, solver_type)
Construct a complex FULL_KINETIC preconditioner.
collects routines that perform operations directly related to MOs
Definition and initialisation of the mo data type.
an eigen-space solver for the generalised symmetric eigenvalue problem for sparse matrices,...
subroutine, public ot_eigensolver_complex(matrix_h, matrix_h_im, matrix_s, matrix_s_im, matrix_c_fm, matrix_c_fm_im, preconditioner, eps_gradient, iter_max, eigenvalues, silent, ot_settings, matrix_t, matrix_t_im, mo_set)
solve a fixed complex Hermitian generalized eigenproblem by OT
subroutine, public ot_eigensolver(matrix_h, matrix_s, matrix_orthogonal_space_fm, matrix_c_fm, preconditioner, eps_gradient, iter_max, size_ortho_space, silent, ot_settings)
...
subroutine, public ot_mini(qs_ot_env, matrix_hc, matrix_hc_im, matrix_hc_physical, matrix_hc_physical_im, para_env_inter_kp, gradient_only, gradient_prepared)
...
subroutine, public qs_ot_init(qs_ot_env)
init matrices, needs c0 and sc0 so that c0*sc0=1
subroutine, public qs_ot_settings_init(settings)
sets default values for the settings type
subroutine, public qs_ot_allocate(qs_ot_env, matrix_s, fm_struct_ref, ortho_k, energy_dimension)
allocates the data in qs_ot_env, for a calculation with fm_struct_ref ortho_k allows for specifying a...
subroutine, public qs_ot_allocate_complex_state(qs_ot_env, matrix_s)
...
subroutine, public qs_ot_destroy(qs_ot_env)
deallocates data
subroutine, public qs_ot_get_p(matrix_x, matrix_sx, qs_ot_env)
computes p=x*S*x and the matrix functionals related matrices
subroutine, public qs_ot_get_orbitals_ref_complex(matrix_c, matrix_c_im, matrix_s, matrix_s_im, qs_ot_env, qs_ot_env1)
update complex REF k-point orbitals and their S(k)C(k) images
subroutine, public qs_ot_prepare_complex_tangent_metric(qs_ot_env, preconditioner_rejected)
Prepare the inverse metric used to project a complex STRICT gradient. An unusable preconditioner is d...
subroutine, public qs_ot_get_orbitals(matrix_c, matrix_x, qs_ot_env)
c=(c0*cos(p^0.5)+x*sin(p^0.5)*p^(-0.5)) x rot_mat_u this assumes that x is already ortho to S*C0,...
subroutine, public qs_ot_get_orbitals_ref(matrix_c, matrix_s, matrix_x, matrix_sx, matrix_gx_old, matrix_dx, qs_ot_env, qs_ot_env1)
...
subroutine, public qs_ot_new_preconditioner(qs_ot_env, preconditioner)
gets ready to use the preconditioner/ or renew the preconditioner only keeps a pointer to the precond...
subroutine, public qs_ot_get_orbitals_complex(matrix_c, matrix_c_im, matrix_s, matrix_s_im, qs_ot_env)
update complex K-point orbitals with the finite STRICT transformation
Represent a complex full matrix.
notice, this variable needs to be copyable, needed for spins as e.g. in qs_ot_scf