53 subroutine diagonalize_davidson(this, matrix_elements, num_eigenpair, dresult, all_procs, option, integrals)
54 class(davidsondiagonalizer) :: this
55 class(diagonalizerresult) :: dresult
56 class(basematrix),
intent(in) :: matrix_elements
57 class(baseintegral),
intent(in) :: integrals
58 type(options),
intent(in) :: option
59 integer,
intent(in) :: num_eigenpair
60 logical,
intent(in) :: all_procs
62 integer :: max_iterations
63 real(wp) :: max_tolerance
66 if (myrank /= master)
return
68 max_iterations = option % max_iterations
69 max_tolerance = option % max_tolerance
71 if (max_iterations < 0)
then
72 max_iterations = max(num_eigenpair * 40, 500)
75 print *,
'max_iterations', max_iterations
76 print *,
'max_tolerance', max_tolerance
78 select type(matrix_elements)
79 type is (writermatrix)
80 call this % diagonalize_writermatrix(matrix_elements, num_eigenpair, dresult, all_procs, &
81 max_iterations, max_tolerance, option, integrals)
83 call mpi_xermsg(
'DavidsonDiagonalizer_module',
'diagonalize_davidson', &
84 'Only WriterMatrix format can use Davidson', 1, 1)
90 subroutine diagonalize_writermatrix (this, matrix_elements, num_eigenpair, dresult, all_procs, max_iterations, max_tolerance, &
92 class(davidsondiagonalizer) :: this
93 class(diagonalizerresult) :: dresult
94 type(writermatrix),
intent(in) :: matrix_elements
95 class(baseintegral),
intent(in) :: integrals
96 type(options),
intent(in) :: option
97 integer,
intent(in) :: num_eigenpair
98 logical,
intent(in) :: all_procs
99 integer,
intent(in) :: max_iterations
100 real(wp),
intent(in) :: max_tolerance
104 real(wp) :: CRITC = 1e-10_wp
105 real(wp) :: CRITR = 1e-8_wp
106 real(wp) :: ORTHO = 1e-7_wp
108 integer :: matrix_unit
109 integer :: matrix_size
110 integer :: num_matrix_elements_per_record, num_elems
112 real(wp),
allocatable :: hamiltonian(:), diagonal(:), eig(:)
113 real(wp),
pointer :: vec_ptr(:)
115 integer :: mpi_num_eig, mpi_num_vecs, ido, ierr
117 real(wp),
allocatable :: eigen(:)
118 real(wp),
allocatable :: vecs(:,:)
120 character(len=4),
dimension(30) :: NAMP
121 integer,
dimension(10) :: NHD
122 integer,
dimension(20) :: KEYCSF, NHE
123 real(kind=wp),
dimension(41) :: dtnuc
125 write (stdout,
"('Diagonalization done with Davidson')")
126 write (stdout,
"('Parameters:')")
127 write (stdout,
"('N: ',i8)") matrix_elements % get_matrix_size()
128 write (stdout,
"('Requested # of eigenpairs',i8)") num_eigenpair
130 allocate(eigen(num_eigenpair), vecs(matrix_elements % get_matrix_size(), num_eigenpair))
136 if (myrank == master)
then
138 matrix_unit = matrix_elements % get_matrix_unit()
142 read (matrix_unit) matrix_size, num_matrix_elements_per_record, nhd, namp, nhe, dtnuc
144 num_elems = matrix_elements % get_size()
145 print *,
'matrix_size', matrix_size
146 print *,
'num_elems', num_elems
149 allocate(diagonal(matrix_size))
150 call mkdvm(vecs, eigen, diagonal, matrix_size, num_eigenpair, stdout, matrix_unit, &
151 num_matrix_elements_per_record, num_elems, max_tolerance, critc, critr, ortho, &
152 max_iterations, ierr)
155 call mpi_xermsg(
'DavidsonDiagonalizer_module',
'DavidsonDiagonalizer', &
156 'Davidson diagonalization failed', ierr, 1)
161 call mpi_mod_bcast(matrix_size, master)
162 mpi_num_vecs = matrix_size * num_eigenpair
163 mpi_num_eig = num_eigenpair
164 call mpi_mod_bcast(eigen,master)
165 do ido = 1, num_eigenpair
166 call mpi_mod_bcast(vecs(:,ido), master)
171 call dresult % export_header(option, integrals)
173 call dresult % write_header(option, integrals)
174 call dresult % handle_eigenvalues(eigen, matrix_elements % diagonal, num_eigenpair, matrix_size)
176 do ido = 1, num_eigenpair
177 call dresult % handle_eigenvector(vecs(:,ido), matrix_size)
183 if (
allocated(dresult % ci_vec % CV))
deallocate(dresult % ci_vec % CV)
184 call move_alloc(vecs, dresult % ci_vec % CV)
185 dresult % ci_vec % CV_is_scalapack = .false.
188 call dresult % export_eigenvalues(eigen(1:num_eigenpair), matrix_elements % diagonal, &
189 num_eigenpair, matrix_size, dresult % ci_vec % ei, dresult % ci_vec % iphz)
191 write (stdout,
'(/," Eigensolutions exported into the CIVect structure.",/)')