Numerical routines
Eigenvalue problems
Arnoldi
Real symmetric problem for extreme eigenvalues
The Arnoldi method for real symmetric eigenvalue problems for extreme eigenvalues is implemented in subroutine
eigensolver_real_arpack in MODULE mod_eigensolver_real_arpack. One has to
provide a subroutine for matrix-vector-multiplication and a subroutine to solve
a linear equation (this is only used for the shift-invert-option).
They are contained in MODULE
eigensolver_arpack_routines.
SUBROUTINE matvec_sg_arpack
calculates yV = D^(1/2)*H*D^(1/2)*xV, where D^(1/2) is the diagonal matrix
stored in diag_sgV in MODULE normalization_factors_sg
and H is the
Hamilton-matrix stored in MODULE sparse_matrix_rout_real.
SUBROUTINE lin_equation_solver_arnoldi: dummy subroutine since
option 'shift-invert' is not used.
This method can be used for calculation of the Eigenvalues of the single-band
Hamiltonian.
Complex hermitian problem for extreme eigenvalues
The Arnoldi method for complex hermitian eigenvalue problems for extreme
eigenvalues is implemented in subroutine
arnoldi_complex in MODULE mod_eigensolver_complex_arpack. One has to provide a
subroutine for matrix-vector-multiplication and a subroutine to solve a linear
equation (this is only used for the shift-invert-option).
They are contained in MODULE
eigensolver_arpack_routines
and are used for calculation of the single-band Hamiltonmatrix with magnetic
field:
SUBROUTINE matvec_magnsg_arpack
calculates yV = D^(1/2)*H*D^(1/2)*xV, where D^(1/2) is the diagonal matrix
stored in diag_sgV in MODULE normalization_factors_sg
and H is the
Hamilton-matrix stored in MODULE sparse_matrix_rout.
SUBROUTINE m_lin_equation_solver_arnoldi: dummy subroutine since
option 'shift-invert' is not used.
This method is also used for diagonalization of the 6x6-kp-Hamiltonian. The
subroutines are contained in MODULE
arnoldi_complex_routines:
SUBROUTINE matvec_arnoldi_complex
calculates yV = D^(1/2)*H*D^(1/2)*xV, where D^(1/2) is the diagonal matrix
stored in diag_kpV in MODULE normalization_factors_sg
and H is the
Hamilton-matrix stored in MODULE sparse_matrix_rout.
SUBROUTINE lin_equation_solver_arnoldi_c: dummy subroutine since
option 'shift-invert' is not used.
Conjugate Gradients
Complex hermitian problem for extreme eigenvalues
Extreme eigenvalues of a complex hermitian matrix can be calculated
employing a conjugate gradient scheme. This method is contained in subroutine
eigensolver_hermitian in MODULE mod_eigensolver_hermitian.
This method can be used for diagonalization of the 6x6-kp-Hamiltonian. The
subroutines are contained in MODULE
eigensolver_iter_routines:
SUBROUTINE matrix_vector_eigencg
calculates yV = D^(1/2)*H*D^(1/2)*xV, where D^(1/2) is the diagonal matrix
stored in diag_kpV in MODULE normalization_factors_sg
and H is the
Hamilton-matrix stored in MODULE sparse_matrix_rout.
SUBROUTINE precond_eigencg: preconditioner
Note: Only the 1D preconditioner is implemented.
SUBROUTINE inner_product_eigencg: inner product is the
standard dot product
For this method there exists also a version for real, symmetric matrices:
subroutine
eigensolver_realsym in MODULE mod_eigensolver_realsym.
Jacobi-Davidson
Complex hermitian problem for inner eigenvalues
Inner Eigenvalues can be calculated by the Jacobi-Davidson method. It
calculates the Eigenvalues around a given energy. This routine is called in
subroutine
eigensolver_davidson in MODULE mod_eigensolver_davidson. Three subroutines
are directly called (amul,
bmul,
precon).
In MODULE
mod_precond_ilu_davidson there are several routines used in context wirh
Jacobi-Davidson:
subroutine transform_sparse_to_ilu3D(2D,1D)
The matrix to be diagonalized is D^(1/2) H D^(1/2). In the setup, the matrix H
is stored as sparse matrix. In Davidson routines, the routine amul
directly
calls the sparse matrix-vector product. So the diagonal matrices D^(1/2)
have
to be taken into account.
subroutine setup_david_precond_jac: To setup the Jacobi preconditioner.
Note: It has turned out for Jacobi-Davidson that degenerate eigenstates are
not orthogonal. So we lift degeneracy by adding a perturbation of 1d-6.
Furthermore it turned out that the method works better if the matrix is shifted
in a way that the separation energy around which the eigenstates are calculated
is shifted to +2d0 for electrons and -2d0 for holes.
Chebychev-Arnoldi
Real symmetric problem for extreme eigenvalues
(by A. Trellakis)
Complex hermitian problem for extreme eigenvalues
(by A. Trellakis) |