| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | det(nel) | |||
| integer(kind=n_int), | intent(in) | :: | ilut(0:NIfTot) |
function get_off_diagonal_matel(det, ilut) result(offdiagH) ! Get the off-diagonal element between the reference determinant ! a determinant det with ilut representation ilut, but only if it ! would contribute to the projected energy. ! In: det - The determinant to evaluate ! ilut - Bit representation ! Ret: offdiagH - The off-diagonal matrix element integer, intent(in) :: det(nel) integer(n_int), intent(in) :: ilut(0:NIfTot) HElement_t(dp) :: offdiagH integer(n_int) :: ilut0(0:NIfTot) integer :: exlevel, det0(nel) ! We operate with the reference for run=1 here, which works for ! inum_runs==1 and inum_runs>1 with a common reference. The projected ! energy for inum_runs>1 with different references is calculated ! separately anyway, so the return value does not get used. ilut0 = ilutRef(:,1) ! Get reference and excitation level with respect to it. call decode_bit_det(det0, ilut0) exlevel = FindBitExcitLevel(ilut0, ilut, t_hphf_ic=.true.) ! Compute matrix element depending on the calculation type. offdiagH = h_cast(0_dp) if (tGUGA) then ! TODO(@Oskar): Perhaps keep csf_i calculated? if (exlevel/=0) offdiagH = calc_off_diag_guga_ref(ilut, & CSF_Info_t(ilut), exlevel=exlevel) else if ( exlevel==2 .or. & ( exlevel==1 .and. tNoBrillouin ) .or. & ( exlevel==3 .and. (t_3_body_excits .or. & t_ueg_3_body .or. & t_mol_3_body) ) ) then if (tHPHF) then offdiagH = hphf_off_diag_helement(det0, det, ilut0, ilut) else offdiagH = get_helement(det, det0, exlevel, ilut, ilut0) end if end if end if end function get_off_diagonal_matel