create_perturbed_ground Subroutine

public subroutine create_perturbed_ground()

Arguments

None

Contents


Source Code

    subroutine create_perturbed_ground()
        ! routine to create from the already read in popsfile info in
        ! popsfile_dets the left hand <y(0)| by applying the corresponding
        ! creation or annihilation operator
        implicit none
        character(*), parameter :: this_routine = "create_perturbed_ground"
        integer :: tmp_totwalkers, totwalkers_backup, TotWalkers_orig_max
        integer :: ierr, i, totNOccDets, iProc, nPertRefs
        integer(n_int), allocatable :: perturbed_buf(:, :)
        logical :: t_use_perturbed_buf

        if (tReadPops .and. .not. tNewOverlap) then
            tmp_totwalkers = int(TotWalkers_orig)
        else
            tmp_totwalkers = int(TotWalkers)
        end if

        write(stdout, *) "Creating the wavefunction to projected on!"
        write(stdout, *) "Initial number of walkers: ", tmp_totwalkers

        if (allocated(overlap_pert)) then
            call MPISumAll(tmp_totwalkers, TotWalkers_orig_max)
        else
            TotWalkers_orig_max = MaxWalkersPart
        end if
        t_use_perturbed_buf = allocated(overlap_pert) .and. tNewOverlap

        if (.not. allGfs == 0) call setup_pert_array(allGfs)

        allocate(overlap_states(gf_count), stat=ierr)
        if (t_use_perturbed_buf) &
            allocate(perturbed_buf(0:niftot, TotWalkers_orig_max), stat=ierr)
        write(stdout, *) "Read-in dets", TotWalkers_orig
        do i = 1, gf_count
            totwalkers_backup = tmp_totwalkers
            if (t_use_perturbed_buf) then
                if (.not. t_kspace_operators) then
                    if (tReadPops) then
                        ! if the perturbation is to be created from the read-in population
                        ! explicitly
                        perturbed_buf = 0_n_int
                        call apply_perturbation(overlap_pert(i), tmp_totwalkers, popsfile_dets, &
                                                perturbed_buf)

                        ! The HF-Overlap option makes us use a reference for projection
                        ! instead of the full wavefunction
                        if (tHFOverlap) call create_perturbed_ref(perturbed_buf, TotWalkers_orig_max)
                    else
                        ! else, perturb the current population (this is for starting from
                        ! a defined determinant)
                        call apply_perturbation(overlap_pert(i), tmp_totwalkers, CurrentDets, &
                                                perturbed_buf)
                    end if
                else
                    ! a less useful feature for fourier-transforming the perturbation
                    if (gf_count > 1) call stop_all("create_perturbed_ground", &
                                                    "Unable to use momentum operators for multiple correlation functions")
                    if (tReadPops) then
                        perturbed_buf = 0_n_int
                        call apply_perturbation_array(overlap_pert, tmp_totwalkers, popsfile_dets, &
                                                      perturbed_buf, phase_factors)
                    else
                        call apply_perturbation_array(overlap_pert, tmp_totwalkers, CurrentDets, &
                                                      perturbed_buf, phase_factors)
                    end if
                end if

                call write_overlap_state_serial(perturbed_buf, TotWalkers_orig_max, i)
            else
                write(stdout, *) "Generated overlap state"
                call write_overlap_state_serial(CurrentDets, int(TotWalkers), i)
                write(stdout, *) "Written overlap state to array"
            end if
            call MPISumAll(overlap_states(i)%nDets, totNOccDets)
            if (totNOccDets == 0) then
                if (gf_count == 1) then
                    call stop_all('create_perturbed_ground', 'No walkers survived perturbation')
                else
                    write(stdout, *) "WARNING, EMPTY PERTURBED STATE WITH INDEX", i
                end if
            end if
            tmp_totwalkers = totwalkers_backup
        end do

        if (allocated(overlap_states)) write(stdout, *) &
            "Determinants remaining in perturbed ground state:", overlap_states(1)%nDets
        if (allocated(perturbed_buf)) deallocate(perturbed_buf, stat=ierr)

    end subroutine create_perturbed_ground