| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=dp), | intent(in) | :: | mat_ele | |||
| real(kind=dp), | intent(in) | :: | pgen |
subroutine fill_frequency_histogram(mat_ele, pgen) ! routine to accumulate the H_ij/pgen ration into the frequency bins ! keep parallelism in mind, especially if we have to adjust the ! bin list and boundary list on the fly.. this has to happen on ! all the processors then or? or can i just do it in the end of a loop ! adapt this function now, to discriminate between single and double ! excitations, and it pParallel is used, which can be determined ! through the excitation matrix and the 2 involved determinants ! (or even the starting determinant) and fill up to 3 frequency ! histograms .. this also means that we have to reset them maybe ! after pSingles or pParallel have been changed since the pgens ! and so the H_ij/pgen ratios change (or? can i modify that somehow ! on the fly?) think about that later and with ali.. ! and for the guga stuff, if i finally implement similar pgens like ! pParallel, as it is already done in the nosym_guga case, i have ! to use even more histograms, but that should be fine. real(dp), intent(in) :: mat_ele, pgen character(*), parameter :: this_routine = "fill_frequency_histogram" integer, parameter :: cnt_threshold = 50 real(dp) :: ratio integer :: ind ! first have to take correct matrix element, dependent if we use ! complex code or not, or no: for now just input the absolute value ! of H_ij, so its always a real then.. ! nah.. it puts in 0 mat_eles too.. so just return if 0 mat_ele ASSERT(pgen > EPS) ! if the matrix element is 0, no excitation will or would be done ! and if the pgen is 0 i also shouldnt be here i guess.. so assert that if (mat_ele < matele_cutoff) then ! misuse doubles for the counting here zero_doubles = zero_doubles + 1 return end if if (pgen < EPS) return ! then i have to first check if i have to make the histogram bigger... ratio = mat_ele / pgen if (ratio < histogramming_spec%max_frequency_bound) then ! the ratio fits in to the bins now i just have to find the ! correct one if (.not. enough_doub_hist) then cnt_doub_hist = cnt_doub_hist + 1 if (cnt_doub_hist > cnt_threshold) enough_doub_hist = .true. end if ind = int(ratio / histogramming_spec%frq_step_size) + 1 ! increase counter frequency_bins(ind) = frequency_bins(ind) + 1 else above_max_doubles = above_max_doubles + 1 end if if (ratio > gamma_doub) gamma_doub = ratio if (ratio < min_doub) min_doub = ratio end subroutine fill_frequency_histogram