55 subroutine diagonalize_arpack (this, matrix_elements, num_eigenpair, dresult, all_procs, option, integrals)
56 class(arpackdiagonalizer) :: this
57 class(diagonalizerresult) :: dresult
58 class(basematrix),
intent(in) :: matrix_elements
59 class(baseintegral),
intent(in) :: integrals
60 type(options),
intent(in) :: option
61 integer,
intent(in) :: num_eigenpair
62 logical,
intent(in) :: all_procs
64 integer :: max_iterations
65 real(wp) :: max_tolerance
68 if (myrank /= master)
return
70 max_iterations = option % max_iterations
71 max_tolerance = option % max_tolerance
73 if (max_iterations < 0)
then
74 max_iterations = max(num_eigenpair * 50, default_arpack_max_iter)
77 select type(matrix_elements)
78 type is (writermatrix)
79 call this % diagonalize_writermatrix(matrix_elements, num_eigenpair, dresult, max_iterations, max_tolerance, &
82 call mpi_xermsg(
'ARPACKDiagonalizer_module',
'diagonalize_ARPACK', &
83 'Only WriterMatrix format can use Arpack', 1, 1)
89 subroutine diagonalize_writermatrix (this, matrix_elements, num_eigenpair, dresult, max_iterations, max_tolerance, &
91 class(arpackdiagonalizer) :: this
92 class(diagonalizerresult) :: dresult
93 type(writermatrix),
intent(in) :: matrix_elements
94 class(baseintegral),
intent(in) :: integrals
95 type(options),
intent(in) :: option
96 integer,
intent(in) :: num_eigenpair
97 integer,
intent(in) :: max_iterations
98 real(wp),
intent(in) :: max_tolerance
102 integer :: matrix_unit
103 integer :: matrix_size
106 integer :: arpack_numeig
107 integer :: arpack_maxit
108 real(wp) :: arpack_maxtol
109 integer :: num_matrix_elements_per_record, num_elems
111 real(wp),
allocatable :: eigenvalues(:), eigenvector(:)
113 write (stdout,
"('Diagonalization done with ARPACK')")
114 write (stdout,
"('Parameters:')")
115 write (stdout,
"('N: ',i8)") matrix_elements % get_matrix_size()
116 write (stdout,
"('Requested # of eigenpairs',i8)") num_eigenpair
118 arpack_numeig = num_eigenpair
119 arpack_maxit = max_iterations
120 arpack_maxtol = max_tolerance
121 matrix_size = matrix_elements % get_matrix_size()
122 num_elems = matrix_elements % get_size()
123 matrix_unit = matrix_elements % get_matrix_unit()
125 allocate(eigenvalues(num_eigenpair), eigenvector(matrix_size))
127 call mkarp(matrix_size, arpack_numeig, arpack_maxit, arpack_maxtol, matrix_unit)
133 open (unit = 11, file =
"___tmp_eigensys", status =
"old", action =
"read", form =
"unformatted")
137 do i1 = 1, num_eigenpair
138 read (unit = 11) eigenvalues(i1)
142 call dresult % export_header(option, integrals)
143 if (
allocated(dresult % ci_vec % CV))
deallocate(dresult % ci_vec % CV)
144 allocate (dresult % ci_vec % CV(matrix_size, num_eigenpair))
145 dresult % ci_vec % CV_is_scalapack = .false.
147 call dresult % write_header(option, integrals)
148 call dresult % handle_eigenvalues(eigenvalues, matrix_elements % diagonal, num_eigenpair, matrix_size)
152 do i1 = 1, num_eigenpair
153 do i2 = 1, matrix_size
154 read (unit = 11) eigenvector(i2)
156 call dresult % handle_eigenvector(eigenvector, matrix_size)
158 dresult % ci_vec % CV(1:matrix_size, i1) = eigenvector(1:matrix_size)
166 close (unit = 11, status =
"delete")
169 call dresult % export_eigenvalues(eigenvalues(1:num_eigenpair), matrix_elements % diagonal, &
170 num_eigenpair, matrix_size, dresult % ci_vec % ei, dresult % ci_vec % iphz)
171 write (stdout,
'(/," Eigensolutions exported into the CIVect structure.",/)')
174 deallocate(eigenvalues, eigenvector)