subroutine set_initial_run_references()
! Analyse each of the runs, and set the reference determinant to the
! det with the largest coefficient, rather than the currently guessed
! one...
HElement_t(dp) :: largest_coeff, sgn
integer(n_int) :: largest_det(0:NIfTot)
! integer :: run, j
integer(int64) :: j
integer :: run
integer(int32) :: proc_highest
integer(n_int) :: ilut(0:NIfTot)
integer(int32) :: int_tmp(2)
do run = 1, inum_runs
if (tMultipleInitialRefs) then
! Use user specified reference states.
call EncodeBitDet(initial_refs(:, run), ilut)
call update_run_reference(ilut, run)
else
! Find the largest det on this processor
largest_coeff = h_cast(0.0_dp)
do j = 1, TotWalkers
sgn = extract_run_sign(CurrentDets(:, j), run)
if (abs(sgn) > abs(largest_coeff)) then
largest_coeff = sgn
largest_det = CurrentDets(:, j)
end if
end do
! Find the largest det on any processor (n.b. discard the
! non-integer part. This isn't all that important).
! [W.D. 15.5.2017:]
! for the test suite problems, maybe it is important..
! because there seems to be some compiler dependent
! differences..
call MPIAllReduceDatatype( &
(/int(abs(largest_coeff), int32), int(iProcIndex, int32)/), 1, &
MPI_MAXLOC, MPI_2INTEGER, int_tmp)
proc_highest = int_tmp(2)
call MPIBCast(largest_det, NIfTot + 1, int(proc_highest))
! call MPIBCast(largest_det, NIfTot+1, proc_highest)
write(stdout, *) 'Setting ref', run
call writebitdet(stdout, largest_det, .true.)
! Set this det as the reference
call update_run_reference(largest_det, run)
end if
end do
if (tMultiRefShift) then
do run = 1, inum_runs
DiagSft(run) = proje_ref_energy_offsets(run)
end do
end if
end subroutine set_initial_run_references