52 type,
extends(diagonalizerresult) :: target_rmat_ci
56 real(wp) :: core_energy
57 integer :: current_eigenvector = 0
59 real(wp),
allocatable :: eigenvectors(:,:)
60 real(wp),
allocatable :: eigenvalues(:)
61 type(phase),
pointer :: phase
65 procedure,
public :: initialize => initialize_cirmat
66 procedure,
public :: print => print_cirmat
67 procedure,
public :: get_coefficient => get_coefficient_ci
68 procedure,
public :: print_vecs
69 procedure,
public :: export_eigenvalues
70 procedure,
public :: handle_eigenvalues => store_eigenvalues
71 procedure,
public :: handle_eigenvector => store_eigenvector
72 procedure,
public :: modify_diagonal
73 procedure,
public :: modify_l2_diagonal
74 end type target_rmat_ci
89 subroutine initialize_cirmat (this, set, nstat, num_csfs, phase_, core_energy)
90 class(target_rmat_ci) :: this
91 integer,
intent(in) :: set, nstat, num_csfs
92 real(wp),
intent(in) :: core_energy
93 type(phase),
intent(in),
target :: phase_
101 this % num_csfs = num_csfs
102 this % core_energy = core_energy
103 this % phase => phase_
110 allocate(this % eigenvectors(this % num_csfs, this % nstat), this % eigenvalues(this % nstat), stat = ifail)
111 call master_memory % track_memory(storage_size(this % eigenvectors)/8, &
112 size(this % eigenvectors), ifail,
'TARGET_RMAT_CI::EIGENVECTORS')
113 call master_memory % track_memory(storage_size(this % eigenvalues)/8, &
114 size(this % eigenvalues), ifail,
'TARGET_RMAT_CI::EIGENVALUES')
117 this % eigenvectors(:,:) = 0.0_wp
118 this % eigenvalues(:) = 0.0_wp
171 real(wp) function get_coefficient_ci (this, target_state, configuration_idx)
172 class(target_rmat_ci) :: this
173 integer,
intent(in) :: target_state, configuration_idx
175 get_coefficient_ci = this % eigenvectors(configuration_idx, target_state)
187 subroutine read_ci_mat (option, cirmats)
188 class(options),
intent(in) :: option
189 class(target_rmat_ci),
intent(inout) :: cirmats(:)
191 real(wp),
allocatable :: eigenvectors(:)
192 real(wp),
allocatable :: eigenvalues(:)
194 integer :: ido, jdo, kdo, ii, jj, ci_size, nstat, ifail
197 allocate(eigenvalues(option % total_num_tgt_states), eigenvectors(option % total_num_ci_target), stat = ifail)
198 call master_memory % track_memory(storage_size(eigenvectors)/8,
size(eigenvectors), ifail, &
199 'TARGET_RMAT_CI::READ::EIGENVECTORS')
200 call master_memory % track_memory(storage_size(eigenvalues)/8,
size(eigenvalues), ifail, &
201 'TARGET_RMAT_CI::READ::EIGENVALUES')
204 call cirmat(option % num_target_sym, &
205 option % ci_target_switch, &
206 option % ci_set_number, &
209 option % ci_sequence_number, &
210 option % num_ci_target_sym, &
212 option % num_target_state_sym, &
213 option % phase_index, &
214 option % num_continuum, &
215 option % sym_group_flag)
221 do ido = 1, option % num_target_sym
222 ci_size = cirmats(ido) % num_csfs
223 nstat = cirmats(ido) % nstat
226 cirmats(ido) % eigenvalues(jdo) = eigenvalues(jj)
227 cirmats(ido) % eigenvectors(1:ci_size,jdo) = eigenvectors(ii+1:ii+ci_size)
233 call master_memory % free_memory(storage_size(eigenvectors)/8,
size(eigenvectors))
234 call master_memory % free_memory(storage_size(eigenvalues)/8,
size(eigenvalues))
237 deallocate(eigenvalues)
238 deallocate(eigenvectors)
249 subroutine store_eigenvalues (this, eigenvalues, diagonals, num_eigenpairs, vec_dimen)
250 class(target_rmat_ci) :: this
251 integer,
intent(in) :: num_eigenpairs, vec_dimen
252 real(wp),
intent(in) :: eigenvalues(num_eigenpairs), diagonals(vec_dimen)
254 this % eigenvalues = eigenvalues
269 subroutine store_eigenvector (this, eigenvector, vec_dimen)
270 class(target_rmat_ci) :: this
271 integer,
intent(in) :: vec_dimen
272 real(wp),
intent(in) :: eigenvector(vec_dimen)
274 this % current_eigenvector = this % current_eigenvector + 1
275 this % eigenvectors(:, this % current_eigenvector) = eigenvector(:)
287 subroutine export_eigenvalues (this, eigenvalues, diagonals, num_eigenpairs, vec_dimen, ei, iphz)
288 use precisn,
only: wp
289 class(target_rmat_ci) :: this
290 integer,
intent(in) :: num_eigenpairs, vec_dimen
291 real(wp),
intent(in) :: eigenvalues(num_eigenpairs), diagonals(vec_dimen)
292 real(wp),
allocatable :: ei(:)
293 integer,
allocatable :: iphz(:)