subroutine check_start_rdm() ! This routine checks if we should start filling the RDMs - ! and does so if we should. use rdm_general, only: realloc_SpawnedParts use LoggingData, only: tReadRDMs, tTransitionRDMs logical :: tFullVaryshift tFullVaryShift = .false. if (all(.not. tSinglePartPhase)) tFullVaryShift = .true. ! If we're reading in the RDMs we've already started accumulating them in a previous calculation ! We don't want to put in an arbitrary break now! if (tReadRDMs) IterRDMonFly = 0 if (tFullVaryShift .and. ((Iter - maxval(VaryShiftIter)) == (IterRDMonFly + 1))) then ! IterRDMonFly is the number of iterations after the shift has changed that we want ! to fill the RDMs. If this many iterations have passed, start accumulating the RDMs! IterRDMStart = Iter + PreviousCycles IterRDM_HF = Iter + PreviousCycles if (tEN2) tEN2Started = .true. ! We have reached the iteration where we want to start filling the RDM. if (tExplicitAllRDM) then ! Explicitly calculating all connections - expensive... ! TODO: why are explicit RDMs not working with replicas? if (tPairedReplicas) call stop_all('check_start_rdm', "Cannot yet do replica RDM sampling with explicit RDMs. " & // " e.g Hacky bit in Gen_Hist_ExcDjs to make it compile.") tFillingExplicRDMonFly = .true. if (tHistSpawn) NHistEquilSteps = Iter else ! If we are load balancing, this will disable the load balancer ! so we should do a last-gasp balance at this point. if (tLoadBalanceBlocks .and. .not. tSemiStochastic) & call adjust_load_balance(iter_data_fciqmc) extract_bit_rep_avsign => extract_bit_rep_avsign_norm ! By default - we will do a stochastic calculation of the RDM. tFillingStochRDMonFly = .true. if (tTransitionRDMs) tTransitionRDMsStarted = .true. call realloc_SpawnedParts() ! The SpawnedParts array now needs to carry both the spawned parts Dj, and also it's ! parent Di (and it's sign, Ci). - We deallocate it and reallocate it with the larger size. ! Don't need any of this if we're just doing HF_Ref_Explicit calculation. ! This is all done in the add_rdm_hfconnections routine. end if if (RDMExcitLevel == 1) then write(stdout, '(A)') 'Calculating the 1 electron density matrix on the fly.' else write(stdout, '(A)') 'Calculating the 2 electron density matrix on the fly.' end if write(stdout, '(A,I10)') 'Beginning to fill the RDMs during iteration', Iter end if end subroutine check_start_rdm