iter_diagnostics Subroutine

public subroutine iter_diagnostics()

Arguments

None

Contents

Source Code


Source Code

    subroutine iter_diagnostics()

        character(*), parameter :: this_routine = 'iter_diagnostics'
        character(*), parameter :: t_r = this_routine
        integer :: run, part_type

#ifndef CMPLX_
        if (tPositiveHFSign) then
            do part_type = 1, lenof_sign
                if ((.not. tFillingStochRDMonFly) .or. (inum_runs == 1)) then
                    if (AllNoAtHF(part_type) < 0.0_dp) then
                        root_print 'No. at HF < 0 - flipping sign of entire ensemble &
                                   &of particles in simulation: ', part_type
                        root_print AllNoAtHF(part_type)

                        ! And do the flipping
                        call FlipSign(part_type)
                        AllNoatHF(part_type) = -AllNoatHF(part_type)
                        NoatHF(part_type) = -NoatHF(part_type)

                        if (tFillingStochRDMonFly) then
                            ! Want to flip all the averaged signs.
                            AvNoatHF = -AVNoatHF
                            InstNoatHF(part_type) = -InstNoatHF(part_type)
                        end if
                    end if
                end if
            end do
        end if
#endif
        if (iProcIndex == Root) then
            ! Have all of the particles died?
#ifdef CMPLX_
            tRestart = .false.
            do run = 1, inum_runs
                if (near_zero(sum(AllTotParts(min_part_type(run):max_part_type(run))))) then
                    call stop_all(t_r, "All particles have died. Aborting.")
                end if
            end do
#else
            if (near_zero(AllTotParts(1)) .or. near_zero(AllTotParts(inum_runs))) then
                call stop_all(t_r, "All particles have died. Aborting.")
            else
                tRestart = .false.
            end if
            !TODO CMO: Work out how to wipe the walkers on the second population if double run
#endif
        end if
        call MPIBCast(tRestart)
        if (tRestart) then
            ! a restart not wanted in the real-time fciqmc..
            !Initialise variables for calculation on each node
            CALL DeallocFCIMCMemPar()
            IF (iProcIndex == Root) THEN
                close(fcimcstats_unit)
                if (inum_runs == 2) close(fcimcstats_unit2)
                IF (tTruncInitiator) close(initiatorstats_unit)
                IF (tLogComplexPops) close(complexstats_unit)
                if (tLogEXLEVELStats) close(EXLEVELStats_unit)
            end if
            IF (TDebug) close(11)
            CALL SetupParameters()
            CALL InitFCIMCCalcPar()
            if (tFCIMCStats2) then
                call write_fcimcstats2(iter_data_fciqmc, initial=.true.)
                call write_fcimcstats2(iter_data_fciqmc)
            else
                call WriteFciMCStatsHeader()
                ! Prepend a # to the initial status line so analysis doesn't pick up
                ! repetitions in the FCIMCStats or INITIATORStats files from restarts.
                if (iProcIndex == root) then
                    write(fcimcstats_unit, '("#")', advance='no')
                    if (inum_runs == 2) &
                        write(fcimcstats_unit2, '("#")', advance='no')
                    write(initiatorstats_unit, '("#")', advance='no')
                end if
                call WriteFCIMCStats()
            end if
            Iter = 1
            if (iProcIndex == root .and. tLogEXLEVELStats) &
                write(EXLEVELStats_unit, '("#")', advance='no')
            return
        end if

        ! update the number of spawning attempts per walker
        if (tDynamicAvMCEx) then
            if (allNValidExcits /= 0) then
                ! we try to have approx. one valid excitation generated per walker
                AvMCExcits = (allNValidExcits + allNInvalidExcits) / (allNValidExcits)
                write(stdout, *) "Now spawning ", AvMCExcits, " times per walker"
            end if
        end if

    end subroutine iter_diagnostics