average_determ_vector Subroutine

public subroutine average_determ_vector()

Arguments

None

Contents

Source Code


Source Code

    subroutine average_determ_vector()

        use FciMCData, only: Iter, IterRDMStart
        use FciMCData, only: PreviousCycles
        use LoggingData, only: RDMEnergyIter

        real(dp) :: iter_curr, iter_start_av
        integer :: run
        ! If this condition is met then RDM energies were added in on the
        ! previous iteration. We now want to start a new averaging block so
        ! that the same contributions aren't added in again later.
        if (mod(Iter + PreviousCycles - IterRDMStart, RDMEnergyIter) == 0) then
            do run = 1, size(cs_replicas)
                cs_replicas(run)%full_determ_vecs_av = 0.0_dp
            end do
            write(stdout, *) "Reset fdv av at iteration ", iter
        end if

        ! The current iteration, converted to a double precision real.
        iter_curr = real(Iter + PreviousCycles, dp)
        ! The iteration that this averaging block started on.
        iter_start_av = real(RDMEnergyIter * ((Iter + PreviousCycles - IterRDMStart) &
             / RDMEnergyIter) + IterRDMStart, dp)

        ! Add in the current deterministic vector to the running average.
        do run = 1, size(cs_replicas)
            associate(rep => cs_replicas(run))
                rep%full_determ_vecs_av = (((iter_curr - iter_start_av) &
                    * rep%full_determ_vecs_av) + rep%full_determ_vecs) / &
                                          (iter_curr - iter_start_av + 1.0_dp)
            end associate
        end do

    end subroutine average_determ_vector