subroutine sync_rdm_sampling_iter()
use LoggingData, only: RDMEnergyIter, IterRDMOnfly
use CalcData, only: coreSpaceUpdateCycle, semistoch_shift_iter
implicit none
integer :: frac
! first, adjust the offset to make the rdm sampling start right when a semistochastic
! update cycle ends
IterRDMOnFly = IterRDMOnFly - &
mod(IterRDMOnFly - semistoch_shift_iter, coreSpaceUpdateCycle) - 1
! The -1 is just because the sampling starts one iteration after IterRDMOnFly
! If we subtracted too much, jump one cycle backwards
if (IterRDMOnFly < semistoch_shift_iter) IterRDMOnFly = IterRDMOnFly + coreSpaceUpdateCycle
write(stdout, *) "Adjusted starting iteration of RDM sampling to ", IterRDMOnFly
! Now sync the update cycles
if (RDMEnergyIter > coreSpaceUpdateCycle) then
RDMEnergyIter = coreSpaceUpdateCycle
write(stdout, *) "The RDM sampling interval cannot be larger than the update " &
//"interval of the semi-stochastic space. Reducing it to ", RDMEnergyIter
end if
if (mod(coreSpaceUpdateCycle, RDMEnergyIter) /= 0) then
! first, try to ramp up the RDMEnergyIter to meet the coreSpaceUpdateCycle
frac = coreSpaceUpdateCycle / RDMEnergyIter
RDMEnergyIter = coreSpaceUpdateCycle / frac
write(stdout, *) "Update cycle of semi-stochastic space and RDM sampling interval" &
//" out of sync. "
write(stdout, *) "Readjusting RDM sampling interval to ", RDMEnergyIter
! now, if this did not succeed, adjust the coreSpaceUpdateCycle
if (mod(coreSpaceUpdateCycle, RDMEnergyIter) /= 0) then
coreSpaceUpdateCycle = coreSpaceUpdateCycle - &
mod(coreSpaceUpdateCycle, RDMEnergyIter)
write(stdout, *) "Adjusted update cycle of semi-stochastic space to ", &
coreSpaceUpdateCycle
end if
end if
end subroutine sync_rdm_sampling_iter