From 3eaec5521569085a3c6c77308d965edef10fa5bd Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 30 May 2016 00:42:39 +0200 Subject: [PATCH] Forgot file --- plugins/Full_CI/full_ci_dressed.irp.f | 127 ++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 plugins/Full_CI/full_ci_dressed.irp.f diff --git a/plugins/Full_CI/full_ci_dressed.irp.f b/plugins/Full_CI/full_ci_dressed.irp.f new file mode 100644 index 00000000..6af3077f --- /dev/null +++ b/plugins/Full_CI/full_ci_dressed.irp.f @@ -0,0 +1,127 @@ +program full_ci + implicit none + integer :: i,k + + + double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) + double precision, allocatable :: pt2_generators(:,:), norm_pert_generators(:,:), H_pert_diag_generators(:,:) + integer :: N_st, degree + N_st = N_states + allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st)) + character*(64) :: perturbation + + pt2 = 1.d0 + diag_algorithm = "Lapack" + + if (N_det > N_det_max) then + call diagonalize_CI + call save_wavefunction + psi_det = psi_det_sorted + psi_coef = psi_coef_sorted + N_det = N_det_max + soft_touch N_det psi_det psi_coef + call diagonalize_CI + call save_wavefunction + print *, 'N_det = ', N_det + print *, 'N_states = ', N_states + print *, 'PT2 = ', pt2 + print *, 'E = ', CI_energy + print *, 'E+PT2 = ', CI_energy+pt2 + print *, '-----' + endif + double precision :: i_H_psi_array(N_states),diag_H_mat_elem,h,i_O1_psi_array(N_states) + double precision :: E_CI_before(N_states) + if(read_wf)then + call i_H_psi(psi_det(1,1,N_det),psi_det,psi_coef,N_int,N_det,psi_det_size,N_states,i_H_psi_array) + h = diag_H_mat_elem(psi_det(1,1,N_det),N_int) + selection_criterion = dabs(psi_coef(N_det,1) * (i_H_psi_array(1) - h * psi_coef(N_det,1))) * 0.1d0 + soft_touch selection_criterion + endif + + + integer :: n_det_before + print*,'Beginning the selection ...' + E_CI_before = CI_energy + do while (N_det < N_det_max.and.maxval(abs(pt2(1:N_st))) > pt2_max) + n_det_before = N_det + call H_apply_FCI(pt2, norm_pert, H_pert_diag, N_st) + + PROVIDE psi_coef + PROVIDE psi_det + PROVIDE psi_det_sorted + + if (N_det > N_det_max) then + psi_det = psi_det_sorted + psi_coef = psi_coef_sorted + N_det = N_det_max + soft_touch N_det psi_det psi_coef + endif + call diagonalize_CI + call save_wavefunction + if(n_det_before == N_det)then + selection_criterion = selection_criterion * 0.5d0 + endif + print *, 'N_det = ', N_det + print *, 'N_states = ', N_states + do k = 1, N_states + print*,'State ',k + print *, 'PT2 = ', pt2(k) + print *, 'E = ', CI_energy(k) + print *, 'E(before)+PT2 = ', E_CI_before(k)+pt2(k) + enddo + print *, '-----' + E_CI_before = CI_energy + if(N_states.gt.1)then + print*,'Variational Energy difference' + do i = 2, N_states + print*,'Delta E = ',CI_energy(i) - CI_energy(1) + enddo + endif + if(N_states.gt.1)then + print*,'Variational + perturbative Energy difference' + do i = 2, N_states + print*,'Delta E = ',E_CI_before(i)+ pt2(i) - (E_CI_before(1) + pt2(1)) + enddo + endif + E_CI_before = CI_energy + call ezfio_set_full_ci_energy(CI_energy) + enddo + N_det = min(N_det_max,N_det) + touch N_det psi_det psi_coef + call diagonalize_CI + if(do_pt2_end)then + threshold_selectors = 1.d0 + threshold_generators = 0.999d0 + TOUCH threshold_selectors threshold_generators + allocate (pt2_generators(N_st,N_det_generators), norm_pert_generators(N_st,N_det_generators),H_pert_diag_generators(N_st,N_det_generators)) + call H_apply_FCI_PT2_dressed(pt2_generators, norm_pert_generators, H_pert_diag_generators, N_st) + psi_det = psi_det_sorted + psi_coef = psi_coef_sorted + SOFT_TOUCH psi_det psi_coef + double precision, allocatable :: energy(:), dressing(:) + allocate(energy(N_states), dressing(N_det)) + do k=1,N_det_generators + dressing(k) = pt2_generators(1,k) + enddo + do k=N_det_generators+1,N_det + dressing(k) = 0.d0 + enddo + + print *, 'Final step' + print *, 'N_det = ', N_det + print *, 'N_states = ', N_states + print *, 'PT2 = ', sum(dressing) + print *, 'E = ', CI_energy + print *, 'E+PT2= ', CI_energy + sum(dressing) + + call davidson_diag_dressed(dressing,psi_det,psi_coef,energy, & + size(psi_det,1),N_det,N_states_diag,N_int,output_determinants) + + print *, 'E dressed = ', energy + print *, '----------- ' + call ezfio_set_full_ci_energy_pt2(energy) + deallocate(pt2_generators,norm_pert_generators) + endif + call save_wavefunction + deallocate(pt2,norm_pert) +end