subroutine init_overlap_buffers
use CalcData, only: tSemiStochastic, ss_space_in
use semi_stoch_gen, only: init_semi_stochastic
use real_time_procs, only: reset_tot_parts
implicit none
! this subroutine sets up everything required to compute green's functions
integer :: ierr, j, i
complex(dp), allocatable :: norm_buf(:)
logical :: tStartedFromCoreGround
normsize = inum_runs**2
allocate(overlap_real(gf_count), overlap_imag(gf_count))
allocate(gf_overlap(normsize, gf_count), stat=ierr)
allocate(pert_norm(normsize, gf_count), stat=ierr)
allocate(dyn_norm_psi(normsize), stat=ierr)
dyn_norm_psi = 1.0_dp
allocate(dyn_norm_red(normsize, gf_count), stat=ierr)
allocate(current_overlap(normsize, gf_count), stat=ierr)
dyn_norm_red = 1.0_dp
gf_overlap = 0.0_dp
! also need to create the perturbed ground state to calculate the
! overlaps to |y(t)>
call create_perturbed_ground()
if (tSemiStochastic) call init_semi_stochastic(ss_space_in, tStartedFromCoreGround)
! If only the corespace time-evolution is to be taken, truncate the
! initial wavefunction to the corespace
! We currently do not truncate the overlap state too, but it might come
! later
if (tGZero) then
call truncate_initial_state()
call truncate_overlap_states()
call reset_tot_parts()
TotWalkers = cs_replicas(core_run)%determ_sizes(iProcIndex)
end if
! if a ground-state POPSFILE is used, we need to ensure coherence between the replicas
if (.not. tRealTimePopsfile) call equalize_initial_phase()
allocate(norm_buf(normsize), stat=ierr)
! to avoid dividing by 0 if not all entries get filled
pert_norm = 1.0_dp
norm_buf = calc_norm(CurrentDets, int(TotWalkers))
call MPIReduce(norm_buf, MPI_SUM, dyn_norm_psi)
do j = 1, gf_count
! calc. the norm of the perturbed ground states
norm_buf = calc_norm(overlap_states(j)%dets, overlap_states(j)%nDets)
write(stdout, *) "Number of walkers / in overlap state", TotWalkers, overlap_states(j)%nDets
! the norm (squared) can be obtained by reduction over all processes
call MPIReduce(norm_buf, MPI_SUM, pert_norm(:, j))
! for diagonal green's functions, this is the same as pert_norm, but
! in general, this general normalization is required.
do i = 1, normsize
dyn_norm_red(i, j) = sqrt(pert_norm(i, j) * dyn_norm_psi(i))
end do
end do
deallocate(norm_buf)
if (.not. allocated(shift_damping)) then
allocate(shift_damping(inum_runs), stat=ierr)
shift_damping = 0.0_dp
end if
if (tLogTrajectory) call openTauContourFile()
end subroutine init_overlap_buffers