diff --git a/devel/variance/.gitignore b/devel/variance/.gitignore new file mode 100644 index 0000000..1561915 --- /dev/null +++ b/devel/variance/.gitignore @@ -0,0 +1,59 @@ +IRPF90_temp/ +IRPF90_man/ +build.ninja +irpf90.make +ezfio_interface.irp.f +irpf90_entities +tags +Makefile +ao_basis +ao_one_e_ints +ao_two_e_erf_ints +ao_two_e_ints +aux_quantities +becke_numerical_grid +bitmask +cis +cisd +cipsi +davidson +davidson_dressed +davidson_undressed +density_for_dft +determinants +dft_keywords +dft_utils_in_r +dft_utils_one_e +dft_utils_two_body +dressing +dummy +electrons +ezfio_files +fci +generators_cas +generators_full +hartree_fock +iterations +kohn_sham +kohn_sham_rs +mo_basis +mo_guess +mo_one_e_ints +mo_two_e_erf_ints +mo_two_e_ints +mpi +mrpt_utils +nuclei +perturbation +pseudo +psiref_cas +psiref_utils +scf_utils +selectors_cassd +selectors_full +selectors_utils +single_ref_method +slave +tools +utils +zmq diff --git a/devel/variance/EZFIO.cfg b/devel/variance/EZFIO.cfg new file mode 100644 index 0000000..0ecc86d --- /dev/null +++ b/devel/variance/EZFIO.cfg @@ -0,0 +1,6 @@ +[expected_variance] +type: double precision +doc: Expected variance where the calculation should stop +interface: ezfio, provider, ocaml +default: 0.1 + diff --git a/devel/variance/NEED b/devel/variance/NEED new file mode 100644 index 0000000..c76c9da --- /dev/null +++ b/devel/variance/NEED @@ -0,0 +1 @@ +fci diff --git a/devel/variance/README.rst b/devel/variance/README.rst new file mode 100644 index 0000000..640a967 --- /dev/null +++ b/devel/variance/README.rst @@ -0,0 +1,4 @@ +======== +variance +======== + diff --git a/devel/variance/variance b/devel/variance/variance new file mode 100755 index 0000000..cf37e32 Binary files /dev/null and b/devel/variance/variance differ diff --git a/devel/variance/variance.irp.f b/devel/variance/variance.irp.f new file mode 100644 index 0000000..cafb6ce --- /dev/null +++ b/devel/variance/variance.irp.f @@ -0,0 +1,139 @@ +program variance + implicit none + BEGIN_DOC +! Selected Full Configuration Interaction with Stochastic selection and PT2. + END_DOC + integer :: i,j,k + double precision, allocatable :: pt2(:), var(:), norm(:), rpt2(:) + integer :: to_select + logical, external :: qp_stop + + double precision :: rss + double precision, external :: memory_of_double + PROVIDE H_apply_buffer_allocated N_generators_bitmask + + threshold_generators = 1.d0 + SOFT_TOUCH threshold_generators + + rss = memory_of_double(N_states)*4.d0 + call check_mem(rss,irp_here) + + allocate (pt2(N_states), rpt2(N_states), norm(N_states), var(N_states)) + + double precision :: hf_energy_ref + logical :: has + double precision :: relative_error + + relative_error=PT2_relative_error + + pt2 = -huge(1.e0) + rpt2 = -huge(1.e0) + norm = 0.d0 + var = huge(1.e0) + + if (s2_eig) then + call make_s2_eigenfunction + endif + call diagonalize_CI + call save_wavefunction + + call ezfio_has_hartree_fock_energy(has) + if (has) then + call ezfio_get_hartree_fock_energy(hf_energy_ref) + else + hf_energy_ref = ref_bitmask_energy + endif + + 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 + if (s2_eig) then + call make_s2_eigenfunction + endif + call diagonalize_CI + call save_wavefunction + endif + + double precision :: correlation_energy_ratio + double precision :: error(N_states) + + correlation_energy_ratio = 0.d0 + + do while ( & + (N_det < N_det_max) .and. & + (maxval(abs(pt2(1:N_states))) > pt2_max) .and. & + (maxval(abs(var(1:N_states))) > variance_max) .and. & + (correlation_energy_ratio <= correlation_energy_ratio_max) & + ) + write(*,'(A)') '--------------------------------------------------------------------------------' + + + to_select = N_det/20 + to_select = max(N_states_diag, to_select) + + pt2 = 0.d0 + var = 0.d0 + norm = 0.d0 + call ZMQ_pt2(psi_energy_with_nucl_rep,pt2,relative_error,error, var, & + norm, to_select) ! Stochastic PT2 and selection + + correlation_energy_ratio = (psi_energy_with_nucl_rep(1) - hf_energy_ref) / & + (psi_energy_with_nucl_rep(1) + pt2(1) - hf_energy_ref) + correlation_energy_ratio = min(1.d0,correlation_energy_ratio) + + call save_energy(psi_energy_with_nucl_rep, pt2) + call write_double(6,correlation_energy_ratio, 'Correlation ratio') + call print_summary(psi_energy_with_nucl_rep,pt2,error,var,norm,N_det,N_occ_pattern,N_states,psi_s2) + + do k=1,N_states + rpt2(:) = pt2(:)/(1.d0 + norm(k)) + enddo + + call save_iterations(psi_energy_with_nucl_rep(1:N_states),rpt2,N_det) + call print_extrapolated_energy() + N_iter += 1 + + if (qp_stop()) exit + + ! Add selected determinants + call copy_H_apply_buffer_to_wf() + call save_wavefunction + + PROVIDE psi_coef + PROVIDE psi_det + PROVIDE psi_det_sorted + + call diagonalize_CI + call save_wavefunction + rpt2(:) = 0.d0 + call save_energy(psi_energy_with_nucl_rep, rpt2) + if (qp_stop()) exit + enddo + + if (.not.qp_stop()) then + if (N_det < N_det_max) then + call diagonalize_CI + call save_wavefunction + rpt2(:) = 0.d0 + call save_energy(psi_energy_with_nucl_rep, rpt2) + endif + + pt2 = 0.d0 + var = 0.d0 + norm = 0.d0 + call ZMQ_pt2(psi_energy_with_nucl_rep, pt2,relative_error,error,var, & + norm,0) ! Stochastic PT2 + call save_energy(psi_energy_with_nucl_rep, pt2) + + do k=1,N_states + rpt2(:) = pt2(:)/(1.d0 + norm(k)) + enddo + + call print_summary(psi_energy_with_nucl_rep(1:N_states),pt2,error,var,norm,N_det,N_occ_pattern,N_states,psi_s2) + call save_iterations(psi_energy_with_nucl_rep(1:N_states),rpt2,N_det) + call print_extrapolated_energy() + endif + +end diff --git a/stable/champ/save_for_champ.irp.f b/stable/champ/save_for_champ.irp.f index 15fc2a7..6de6c23 100644 --- a/stable/champ/save_for_champ.irp.f +++ b/stable/champ/save_for_champ.irp.f @@ -1,7 +1,7 @@ program qmcpack implicit none BEGIN_DOC -! Generates a file for QMCPACK +! Generates a file for CHAMP END_DOC integer :: i,j