From 1064e7470ba7229a1897ea81961de06a552c9768 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 29 Oct 2015 11:39:26 +0100 Subject: [PATCH] no more connected_to_ref in mrcc_dress + cleaning --- config/gfortran.cfg | 2 +- plugins/MRCC_Utils/README.rst | 821 +++++++++++++++++++++ plugins/MRCC_Utils/davidson.irp.f | 1 - plugins/MRCC_Utils/mrcc_dress.irp.f | 267 ++----- src/Determinants/README.rst | 926 ++++++++++++++++++++++++ src/Determinants/filter_connected.irp.f | 60 +- 6 files changed, 1799 insertions(+), 278 deletions(-) diff --git a/config/gfortran.cfg b/config/gfortran.cfg index 192e6d49..c1032aa1 100644 --- a/config/gfortran.cfg +++ b/config/gfortran.cfg @@ -10,7 +10,7 @@ # # [COMMON] -FC : gfortran -g -ffree-line-length-none -mavx -I . +FC : gfortran -g -ffree-line-length-none -I . LAPACK_LIB : -llapack -lblas IRPF90 : irpf90 IRPF90_FLAGS : --ninja --align=32 diff --git a/plugins/MRCC_Utils/README.rst b/plugins/MRCC_Utils/README.rst index e69de29b..a332ad0c 100644 --- a/plugins/MRCC_Utils/README.rst +++ b/plugins/MRCC_Utils/README.rst @@ -0,0 +1,821 @@ +Needed Modules +============== +.. Do not edit this section It was auto-generated +.. by the `update_README.py` script. + + +.. image:: tree_dependency.png + +* `Perturbation `_ +* `Selectors_full `_ +* `Generators_full `_ +* `Psiref_Utils `_ + +Documentation +============= +.. Do not edit this section It was auto-generated +.. by the `update_README.py` script. + + +`a_coef `_ + Undocumented + + +`abort_all `_ + If True, all the calculation is aborted + + +`abort_here `_ + If True, all the calculation is aborted + + +`add_poly `_ + Add two polynomials + D(t) =! D(t) +( B(t)+C(t)) + + +`add_poly_multiply `_ + Add a polynomial multiplied by a constant + D(t) =! D(t) +( cst * B(t)) + + +`align_double `_ + Compute 1st dimension such that it is aligned for vectorization. + + +`apply_rotation `_ + Apply the rotation found by find_rotation + + +`approx_dble `_ + Undocumented + + +`b_coef `_ + Undocumented + + +`binom `_ + Binomial coefficients + + +`binom_func `_ + .. math :: + .br + \frac{i!}{j!(i-j)!} + .br + + +`binom_transp `_ + Binomial coefficients + + +`catch_signal `_ + What to do on Ctrl-C. If two Ctrl-C are pressed within 1 sec, the calculation if aborted. + + +`ci_eigenvectors_dressed `_ + Eigenvectors/values of the CI matrix + + +`ci_eigenvectors_s2_dressed `_ + Eigenvectors/values of the CI matrix + + +`ci_electronic_energy_dressed `_ + Eigenvectors/values of the CI matrix + + +`ci_energy_dressed `_ + N_states lowest eigenvalues of the dressed CI matrix + + +`create_minilist `_ + Undocumented + + +`davidson_diag_hjj_mrcc `_ + Davidson diagonalization with specific diagonal elements of the H matrix + .br + H_jj : specific diagonal H matrix elements to diagonalize de Davidson + .br + dets_in : bitmasks corresponding to determinants + .br + u_in : guess coefficients on the various states. Overwritten + on exit + .br + dim_in : leftmost dimension of u_in + .br + sze : Number of determinants + .br + N_st : Number of eigenstates + .br + iunit : Unit for the I/O + .br + Initial guess vectors are not necessarily orthonormal + + +`davidson_diag_mrcc `_ + Davidson diagonalization. + .br + dets_in : bitmasks corresponding to determinants + .br + u_in : guess coefficients on the various states. Overwritten + on exit + .br + dim_in : leftmost dimension of u_in + .br + sze : Number of determinants + .br + N_st : Number of eigenstates + .br + iunit : Unit number for the I/O + .br + Initial guess vectors are not necessarily orthonormal + + +`dble_fact `_ + Undocumented + + +`dble_fact_even `_ + n!! + + +`dble_fact_odd `_ + n!! + + +`dble_logfact `_ + n!! + + +`ddfact2 `_ + Undocumented + + +`delta_ii `_ + Dressing matrix in N_det basis + + +`delta_ij `_ + Dressing matrix in N_det basis + + +`diagonalize_ci_dressed `_ + Replace the coefficients of the CI states by the coefficients of the + eigenstates of the CI matrix + + +`dset_order `_ + array A has already been sorted, and iorder has contains the new order of + elements of A. This subroutine changes the order of x to match the new order of A. + + +`dset_order_big `_ + array A has already been sorted, and iorder has contains the new order of + elements of A. This subroutine changes the order of x to match the new order of A. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`dsort `_ + Sort array x(isize). + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`erf0 `_ + Undocumented + + +`f_integral `_ + function that calculates the following integral + \int_{\-infty}^{+\infty} x^n \exp(-p x^2) dx + + +`fact `_ + n! + + +`fact_inv `_ + 1/n! + + +`find_rotation `_ + Find A.C = B + + +`find_triples_and_quadruples `_ + Undocumented + + +`gammln `_ + Undocumented + + +`gammp `_ + Undocumented + + +`gaussian_product `_ + Gaussian product in 1D. + e^{-a (x-x_A)^2} e^{-b (x-x_B)^2} = K_{ab}^x e^{-p (x-x_P)^2} + + +`gaussian_product_x `_ + Gaussian product in 1D. + e^{-a (x-x_A)^2} e^{-b (x-x_B)^2} = K_{ab}^x e^{-p (x-x_P)^2} + + +`gcf `_ + Undocumented + + +`gen_det_idx `_ + Undocumented + + +`gen_det_shortcut `_ + Undocumented + + +`gen_det_sorted `_ + Undocumented + + +`gen_det_version `_ + Undocumented + + +`get_pseudo_inverse `_ + Find C = A^-1 + + +`give_explicit_poly_and_gaussian `_ + Transforms the product of + (x-x_A)^a(1) (x-x_B)^b(1) (x-x_A)^a(2) (y-y_B)^b(2) (z-z_A)^a(3) (z-z_B)^b(3) exp(-(r-A)^2 alpha) exp(-(r-B)^2 beta) + into + fact_k * [ sum (l_x = 0,i_order(1)) P_new(l_x,1) * (x-P_center(1))^l_x ] exp (- p (x-P_center(1))^2 ) + * [ sum (l_y = 0,i_order(2)) P_new(l_y,2) * (y-P_center(2))^l_y ] exp (- p (y-P_center(2))^2 ) + * [ sum (l_z = 0,i_order(3)) P_new(l_z,3) * (z-P_center(3))^l_z ] exp (- p (z-P_center(3))^2 ) + + +`give_explicit_poly_and_gaussian_double `_ + Transforms the product of + (x-x_A)^a(1) (x-x_B)^b(1) (x-x_A)^a(2) (y-y_B)^b(2) (z-z_A)^a(3) (z-z_B)^b(3) + exp(-(r-A)^2 alpha) exp(-(r-B)^2 beta) exp(-(r-Nucl_center)^2 gama + .br + into + fact_k * [ sum (l_x = 0,i_order(1)) P_new(l_x,1) * (x-P_center(1))^l_x ] exp (- p (x-P_center(1))^2 ) + * [ sum (l_y = 0,i_order(2)) P_new(l_y,2) * (y-P_center(2))^l_y ] exp (- p (y-P_center(2))^2 ) + * [ sum (l_z = 0,i_order(3)) P_new(l_z,3) * (z-P_center(3))^l_z ] exp (- p (z-P_center(3))^2 ) + + +`give_explicit_poly_and_gaussian_x `_ + Transform the product of + (x-x_A)^a(1) (x-x_B)^b(1) (x-x_A)^a(2) (y-y_B)^b(2) (z-z_A)^a(3) (z-z_B)^b(3) exp(-(r-A)^2 alpha) exp(-(r-B)^2 beta) + into + fact_k (x-x_P)^iorder(1) (y-y_P)^iorder(2) (z-z_P)^iorder(3) exp(-p(r-P)^2) + + +`gser `_ + Undocumented + + +`h_apply_mrcc `_ + Calls H_apply on the HF determinant and selects all connected single and double + excitations (of the same symmetry). Auto-generated by the ``generate_h_apply`` script. + + +`h_apply_mrcc_diexc `_ + Undocumented + + +`h_apply_mrcc_diexcorg `_ + Generate all double excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +`h_apply_mrcc_diexcp `_ + Undocumented + + +`h_apply_mrcc_monoexc `_ + Generate all single excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +`h_matrix_dressed `_ + Dressed H with Delta_ij + + +`h_u_0_mrcc `_ + Computes v_0 = H|u_0> + .br + n : number of determinants + .br + H_jj : array of + + +`h_u_0_mrcc_org `_ + Computes v_0 = H|u_0> + .br + n : number of determinants + .br + H_jj : array of + + +`heap_dsort `_ + Sort array x(isize) using the heap sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`heap_dsort_big `_ + Sort array x(isize) using the heap sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`heap_i2sort `_ + Sort array x(isize) using the heap sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`heap_i2sort_big `_ + Sort array x(isize) using the heap sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`heap_i8sort `_ + Sort array x(isize) using the heap sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`heap_i8sort_big `_ + Sort array x(isize) using the heap sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`heap_isort `_ + Sort array x(isize) using the heap sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`heap_isort_big `_ + Sort array x(isize) using the heap sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`heap_sort `_ + Sort array x(isize) using the heap sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`heap_sort_big `_ + Sort array x(isize) using the heap sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`hermite `_ + Hermite polynomial + + +`i2radix_sort `_ + Sort integer array x(isize) using the radix sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + iradix should be -1 in input. + + +`i2set_order `_ + array A has already been sorted, and iorder has contains the new order of + elements of A. This subroutine changes the order of x to match the new order of A. + + +`i2set_order_big `_ + array A has already been sorted, and iorder has contains the new order of + elements of A. This subroutine changes the order of x to match the new order of A. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`i2sort `_ + Sort array x(isize). + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`i8radix_sort `_ + Sort integer array x(isize) using the radix sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + iradix should be -1 in input. + + +`i8radix_sort_big `_ + Sort integer array x(isize) using the radix sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + iradix should be -1 in input. + + +`i8set_order `_ + array A has already been sorted, and iorder has contains the new order of + elements of A. This subroutine changes the order of x to match the new order of A. + + +`i8set_order_big `_ + array A has already been sorted, and iorder has contains the new order of + elements of A. This subroutine changes the order of x to match the new order of A. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`i8sort `_ + Sort array x(isize). + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`insertion_dsort `_ + Sort array x(isize) using the insertion sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`insertion_dsort_big `_ + Sort array x(isize) using the insertion sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`insertion_i2sort `_ + Sort array x(isize) using the insertion sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`insertion_i2sort_big `_ + Sort array x(isize) using the insertion sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`insertion_i8sort `_ + Sort array x(isize) using the insertion sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`insertion_i8sort_big `_ + Sort array x(isize) using the insertion sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`insertion_isort `_ + Sort array x(isize) using the insertion sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`insertion_isort_big `_ + Sort array x(isize) using the insertion sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`insertion_sort `_ + Sort array x(isize) using the insertion sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`insertion_sort_big `_ + Sort array x(isize) using the insertion sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`inv_int `_ + 1/i + + +`iradix_sort `_ + Sort integer array x(isize) using the radix sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + iradix should be -1 in input. + + +`iradix_sort_big `_ + Sort integer array x(isize) using the radix sort algorithm. + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + iradix should be -1 in input. + + +`iset_order `_ + array A has already been sorted, and iorder has contains the new order of + elements of A. This subroutine changes the order of x to match the new order of A. + + +`iset_order_big `_ + array A has already been sorted, and iorder has contains the new order of + elements of A. This subroutine changes the order of x to match the new order of A. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`isort `_ + Sort array x(isize). + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`lambda_mrcc `_ + cm/ or perturbative 1/Delta_E(m) + + +`lambda_mrcc_tmp `_ + Undocumented + + +`lambda_pert `_ + cm/ or perturbative 1/Delta_E(m) + + +`lapack_diag `_ + Diagonalize matrix H + .br + H is untouched between input and ouptut + .br + eigevalues(i) = ith lowest eigenvalue of the H matrix + .br + eigvectors(i,j) = where i is the basis function and psi_j is the j th eigenvector + .br + + +`lapack_diag_s2 `_ + Diagonalize matrix H + .br + H is untouched between input and ouptut + .br + eigevalues(i) = ith lowest eigenvalue of the H matrix + .br + eigvectors(i,j) = where i is the basis function and psi_j is the j th eigenvector + .br + + +`lapack_diagd `_ + Diagonalize matrix H + .br + H is untouched between input and ouptut + .br + eigevalues(i) = ith lowest eigenvalue of the H matrix + .br + eigvectors(i,j) = where i is the basis function and psi_j is the j th eigenvector + .br + + +`lapack_partial_diag `_ + Diagonalize matrix H + .br + H is untouched between input and ouptut + .br + eigevalues(i) = ith lowest eigenvalue of the H matrix + .br + eigvectors(i,j) = where i is the basis function and psi_j is the j th eigenvector + .br + + +`logfact `_ + n! + + +`mrcc_dress `_ + Undocumented + + +`mrcc_iterations `_ + Undocumented + + +`multiply_poly `_ + Multiply two polynomials + D(t) =! D(t) +( B(t)*C(t)) + + +`normalize `_ + Normalizes vector u + u is expected to be aligned in memory. + + +`nproc `_ + Number of current OpenMP threads + + +`ortho_lowdin `_ + Compute C_new=C_old.S^-1/2 canonical orthogonalization. + .br + overlap : overlap matrix + .br + LDA : leftmost dimension of overlap array + .br + N : Overlap matrix is NxN (array is (LDA,N) ) + .br + C : Coefficients of the vectors to orthogonalize. On exit, + orthogonal vectors + .br + LDC : leftmost dimension of C + .br + m : Coefficients matrix is MxN, ( array is (LDC,N) ) + .br + + +`oscillations `_ + Undocumented + + +`overlap_a_b_c `_ + Undocumented + + +`overlap_gaussian_x `_ + .. math:: + .br + \sum_{-infty}^{+infty} (x-A_x)^ax (x-B_x)^bx exp(-alpha(x-A_x)^2) exp(-beta(x-B_X)^2) dx + .br + + +`overlap_gaussian_xyz `_ + .. math:: + .br + S_x = \int (x-A_x)^{a_x} exp(-\alpha(x-A_x)^2) (x-B_x)^{b_x} exp(-beta(x-B_x)^2) dx \\ + S = S_x S_y S_z + .br + + +`overlap_x_abs `_ + .. math :: + .br + \int_{-infty}^{+infty} (x-A_center)^(power_A) * (x-B_center)^power_B * exp(-alpha(x-A_center)^2) * exp(-beta(x-B_center)^2) dx + .br + + +`pert_determinants `_ + Undocumented + + +`progress_active `_ + Current status for displaying progress bars. Global variable. + + +`progress_bar `_ + Current status for displaying progress bars. Global variable. + + +`progress_timeout `_ + Current status for displaying progress bars. Global variable. + + +`progress_title `_ + Current status for displaying progress bars. Global variable. + + +`progress_value `_ + Current status for displaying progress bars. Global variable. + + +`psi_ref_lock `_ + Locks on ref determinants to fill delta_ij + + +`recentered_poly2 `_ + Recenter two polynomials + + +`rint `_ + .. math:: + .br + \int_0^1 dx \exp(-p x^2) x^n + .br + + +`rint1 `_ + Standard version of rint + + +`rint_large_n `_ + Version of rint for large values of n + + +`rint_sum `_ + Needed for the calculation of two-electron integrals. + + +`rinteg `_ + Undocumented + + +`rintgauss `_ + Undocumented + + +`run_mrcc `_ + Undocumented + + +`run_progress `_ + Display a progress bar with documentation of what is happening + + +`sabpartial `_ + Undocumented + + +`set_generators_bitmasks_as_holes_and_particles `_ + Undocumented + + +`set_order `_ + array A has already been sorted, and iorder has contains the new order of + elements of A. This subroutine changes the order of x to match the new order of A. + + +`set_order_big `_ + array A has already been sorted, and iorder has contains the new order of + elements of A. This subroutine changes the order of x to match the new order of A. + This is a version for very large arrays where the indices need + to be in integer*8 format + + +`set_zero_extra_diag `_ + Undocumented + + +`sort `_ + Sort array x(isize). + iorder in input should be (1,2,3,...,isize), and in output + contains the new order of the elements. + + +`start_progress `_ + Starts the progress bar + + +`stop_progress `_ + Stop the progress bar + + +`trap_signals `_ + What to do when a signal is caught. Here, trap Ctrl-C and call the control_C subroutine. + + +`u_dot_u `_ + Compute + + +`u_dot_v `_ + Compute + + +`wall_time `_ + The equivalent of cpu_time, but for the wall time. + + +`write_git_log `_ + Write the last git commit in file iunit. + diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index 2fa09575..abf1b63a 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -431,7 +431,6 @@ subroutine H_u_0_mrcc(v_0,u_0,H_jj,n,keys_tmp,shortcut,sort_idx,Nint,istate) do ii=shortcut(sh),shortcut(sh+1)-1 idx(0) = ii - !call filter_connected_davidson_mwen(keys_tmp,shortcut,keys_tmp(1,1,ii),Nint,ii-1,idx) call filter_connected_davidson_warp(keys_tmp,warp,keys_tmp(1,1,ii),Nint,ii-1,idx) i = sort_idx(ii) diff --git a/plugins/MRCC_Utils/mrcc_dress.irp.f b/plugins/MRCC_Utils/mrcc_dress.irp.f index 09b34033..7fb04144 100644 --- a/plugins/MRCC_Utils/mrcc_dress.irp.f +++ b/plugins/MRCC_Utils/mrcc_dress.irp.f @@ -91,22 +91,42 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Ndet_ref, Ndet_non_ref,i_generator,n integer :: iint, ipos integer :: i_state, k_sd, l_sd, i_I, i_alpha - integer(bit_kind) :: miniList(Nint, 2, N_det_non_ref), key_mask(Nint, 2) - integer :: idx_miniList(N_det_non_ref), N_miniList + integer(bit_kind),allocatable :: miniList(:,:,:) + integer(bit_kind),intent(in) :: key_mask(Nint, 2) + integer,allocatable :: idx_miniList(:) + integer :: N_miniList, ni -! N_miniList = 0 -! do i=i_generator-1,1,-1 -! k = popcnt(key_mask(1,1)) + popcnt(key_mask(1,2)) - popcnt(iand(key_mask(1,1), psi_det_generators(1,1,i))) - popcnt(iand(key_mask(1,2), psi_det_generators(1,2,i))) -! if(k == 0) then -! return -! end if -! if(k <= 2) then -! N_minilist += 1 -! miniList(:,:,N_minilist) = psi_det_generators(:,:,i) -! end if -! end do + allocate(miniList(Nint, 2, max(N_det_generators, N_det_non_ref)), idx_miniList(max(N_det_generators, N_det_non_ref))) + + l = 0 + do ni = 1,Nint + l += popcnt(key_mask(ni,1)) + popcnt(key_mask(ni,2)) + end do + + if(l == 0) then + N_miniList = i_generator-1 + miniList(:,:,:N_miniList) = psi_det_generators(:,:,:N_minilist) + else + N_miniList = 0 + do i=i_generator-1,1,-1 + k = l + do ni=1,nint + k -= popcnt(iand(key_mask(ni,1), psi_det_generators(ni,1,i))) + popcnt(iand(key_mask(ni,2), psi_det_generators(ni,2,i))) + end do + + if(k == 0) then + deallocate(miniList, idx_miniList) + return + end if + if(k <= 2) then + N_minilist += 1 + miniList(:,:,N_minilist) = psi_det_generators(:,:,i) + end if + end do + end if + call find_triples_and_quadruples(i_generator,n_selected,det_buffer,Nint,tq,N_tq,miniList,N_minilist) @@ -227,71 +247,19 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Ndet_ref, Ndet_non_ref,i_generator,n enddo enddo deallocate (dIa_hla) + deallocate(miniList, idx_miniList) end - - - - -! subroutine mrcc_dress_simple(delta_ij_non_ref_,Ndet_non_ref,i_generator,n_selected,det_buffer,Nint,iproc) -! use bitmasks -! implicit none -! -! integer, intent(in) :: i_generator,n_selected, Nint, iproc -! integer, intent(in) :: Ndet_non_ref -! double precision, intent(inout) :: delta_ij_non_ref_(Ndet_non_ref,Ndet_non_ref,*) -! -! integer(bit_kind), intent(in) :: det_buffer(Nint,2,n_selected) -! integer :: i,j,k,m -! integer :: new_size -! integer :: degree(psi_det_size) -! integer :: idx(0:psi_det_size) -! logical :: good -! -! integer(bit_kind) :: tq(Nint,2,n_selected) -! integer :: N_tq, c_ref -! integer :: connected_to_ref -! -! -! call find_triples_and_quadruples(i_generator,n_selected,det_buffer,Nint,tq,N_tq) -! -! ! Compute / (E0 - Haa) -! double precision :: hka, haa -! double precision :: haj -! double precision :: f(N_states) -! -! do i=1,N_tq -! call get_excitation_degree_vector(psi_non_ref,tq(1,1,i),degree,Nint,Ndet_non_ref,idx) -! call i_h_j(tq(1,1,i),tq(1,1,i),Nint,haa) -! do m=1,N_states -! f(m) = 1.d0/(ci_electronic_energy(m)-haa) -! enddo -! do k=1,idx(0) -! call i_h_j(tq(1,1,i),psi_non_ref(1,1,idx(k)),Nint,hka) -! do j=k,idx(0) -! call i_h_j(tq(1,1,i),psi_non_ref(1,1,idx(j)),Nint,haj) -! do m=1,N_states -! delta_ij_non_ref_(idx(k), idx(j),m) += haj*hka* f(m) -! delta_ij_non_ref_(idx(j), idx(k),m) += haj*hka* f(m) -! enddo -! enddo -! enddo -! enddo -! end - - BEGIN_PROVIDER [ integer(bit_kind), gen_det_sorted, (N_int,2,N_det_generators,2) ] &BEGIN_PROVIDER [ integer, gen_det_shortcut, (0:N_det_generators,2) ] &BEGIN_PROVIDER [ integer, gen_det_version, (N_int, N_det_generators,2) ] &BEGIN_PROVIDER [ integer, gen_det_idx, (N_det_generators,2) ] - gen_det_sorted(:,:,:,1) = psi_det_generators(:,:,:N_det_generators) gen_det_sorted(:,:,:,2) = psi_det_generators(:,:,:N_det_generators) call sort_dets_ab_v(gen_det_sorted(:,:,:,1), gen_det_idx(:,1), gen_det_shortcut(0:,1), gen_det_version(:,:,1), N_det_generators, N_int) call sort_dets_ba_v(gen_det_sorted(:,:,:,2), gen_det_idx(:,2), gen_det_shortcut(0:,2), gen_det_version(:,:,2), N_det_generators, N_int) - print *, " *********************** ", gen_det_shortcut(0,:) END_PROVIDER @@ -311,166 +279,32 @@ subroutine find_triples_and_quadruples(i_generator,n_selected,det_buffer,Nint,tq integer(bit_kind), intent(out) :: tq(Nint,2,n_selected) integer, intent(out) :: N_tq - integer :: c_ref - integer :: connected_to_ref - integer :: na, nb, nt,mex, lex, sh,ni + integer :: nt,ni - integer(bit_kind),intent(in) :: miniList(Nint,2,N_det_generators) + integer(bit_kind),intent(in) :: miniList(Nint,2,N_det_generators) integer,intent(in) :: N_miniList - N_tq = 0 - do i=1,N_selected -! c_ref = 0 -! do j=1,N_miniList -! na = popcnt(xor(miniList(1,1,j), det_buffer(1,1,i))) -! nb = popcnt(xor(miniList(1,2,j), det_buffer(1,2,i))) -! if(na+nb <= 4) then -! c_ref = 1 -! exit -! end if -! end do - - -! -! if(Nint /= 1) then -! c_ref = 0 -! na = 0 -! nb = 0 -! do ni=1,Nint -! na += popcnt(xor(det_buffer(ni,1,i), psi_ref(ni,1,1))) -! nb += popcnt(xor(det_buffer(ni,2,i), psi_ref(ni,2,1))) -! end do -! if(na > nb) then -! mex = 1 -! lex = 2 -! else -! mex = 2 -! lex = 1 -! end if -! -! -! sh_loop : do sh=1,gen_det_shortcut(0,lex) -! do ni=1,Nint -! if(det_buffer(ni,lex,i) /= gen_det_sorted(ni,lex,gen_det_shortcut(sh, lex),lex)) then -! cycle sh_loop -! end if -! end do -! do j=gen_det_shortcut(sh,lex),gen_det_shortcut(sh+1,lex)-1 -! if(gen_det_idx(j,lex) >= i_generator) then -! cycle -! end if -! nt = 0 -! do ni=1,nint -! nt += popcnt(xor(det_buffer(ni,mex,i), gen_det_sorted(ni,mex,j,lex))) -! end do -! if(nt <= 4) then -! ! if(gen_det_idx(j,lex) < i_generator) then -! c_ref = 1!gen_det_idx(j,lex) -! exit sh_loop -! ! end if -! end if -! end do -! exit sh_loop -! end do sh_loop -! -! if(c_ref == 0) then -! sh_loop2 : do sh = 1,gen_det_shortcut(0,mex) -! na = 0 -! do ni=1,Nint -! na += popcnt(xor(det_buffer(ni,mex,i), gen_det_sorted(ni,mex,gen_det_shortcut(sh, mex),mex))) -! end do -! if(na > 2) then -! cycle -! end if - -! do j=gen_det_shortcut(sh, mex), gen_det_shortcut(sh+1,mex)-1 -! if(gen_det_idx(j,mex) >= i_generator) then -! cycle -! end if -! nt = na -! do ni=1,Nint -! nt += popcnt(xor(det_buffer(ni,lex,i), gen_det_sorted(ni,lex,j,mex))) -! end do -! if(nt <= 4) then -! ! if(gen_det_idx(j,mex) < i_generator) then -! c_ref = 2!gen_det_idx(j,mex) -! exit sh_loop2 -! ! end if -! end if -! end do -! end do sh_loop2 -! end if -! else -! c_ref = 0 -! na = popcnt(xor(det_buffer(1,1,i), psi_ref(1,1,1))) -! nb = popcnt(xor(det_buffer(1,2,i), psi_ref(1,2,1))) -! if(na > nb) then -! mex = 1 -! lex = 2 -! else -! mex = 2 -! lex = 1 -! end if -! -! -! sh_loop3 : do sh=1,gen_det_shortcut(0,lex) -! if(det_buffer(1,lex,i) /= gen_det_version(1,sh,lex)) then!gen_det_sorted(1,lex,gen_det_shortcut(sh, lex),lex)) then -! cycle sh_loop3 -! end if -! do j=gen_det_shortcut(sh,lex),gen_det_shortcut(sh+1,lex)-1 -! if(gen_det_idx(j,lex) >= i_generator) then -! cycle -! end if -! nt = popcnt(xor(det_buffer(1,mex,i), gen_det_sorted(1,mex,j,lex))) -! if(nt <= 4) then -! ! if(gen_det_idx(j,lex) < i_generator) then -! c_ref = 1!gen_det_idx(j,lex) -! exit sh_loop3 -! ! end if -! end if -! end do -! exit sh_loop3 -! end do sh_loop3 -! -! if(c_ref == 0) then -! sh_loop4 : do sh = 1,gen_det_shortcut(0,mex) -! na = popcnt(xor(det_buffer(1,mex,i),gen_det_version(1,sh,mex)))! gen_det_sorted(1,mex,gen_det_shortcut(sh, mex),mex))) -! if(na > 2) then -! cycle sh_loop4 -! end if -! do j=gen_det_shortcut(sh, mex), gen_det_shortcut(sh+1,mex)-1 -! if(gen_det_idx(j,mex) >= i_generator) then -! cycle -! end if -! nt = na -! nt += popcnt(xor(det_buffer(1,lex,i), gen_det_sorted(1,lex,j,mex))) -! if(nt <= 4) then -! ! if(gen_det_idx(j,mex) < i_generator) then -! c_ref = 2!gen_det_idx(j,mex) -! exit sh_loop4 -! ! end if -! end if -! end do -! end do sh_loop4 -! end if + i_loop : do i=1,N_selected + do j=1,N_miniList + nt = 0 + do ni=1,Nint + nt += popcnt(xor(miniList(ni,1,j), det_buffer(ni,1,i))) + popcnt(xor(miniList(ni,2,j), det_buffer(ni,2,i))) + end do + if(nt <= 4) then + cycle i_loop + end if + end do +! if(connected_to_ref(det_buffer(1,1,i),psi_det_generators,Nint, & +! i_generator,N_det_generators) /= 0) then +! cycle i_loop ! end if - - - c_ref = connected_to_ref(det_buffer(1,1,i),psi_det_generators,Nint, & - i_generator,N_det_generators) - - - if (c_ref /= 0) then - cycle - endif - ! Select determinants that are triple or quadruple excitations ! from the ref good = .True. @@ -491,8 +325,7 @@ subroutine find_triples_and_quadruples(i_generator,n_selected,det_buffer,Nint,tq enddo endif endif - enddo - + enddo i_loop end diff --git a/src/Determinants/README.rst b/src/Determinants/README.rst index e69de29b..17b69577 100644 --- a/src/Determinants/README.rst +++ b/src/Determinants/README.rst @@ -0,0 +1,926 @@ +Needed Modules +============== +.. Do not edit this section It was auto-generated +.. by the `update_README.py` script. + + +.. image:: tree_dependency.png + +* `Integrals_Monoelec `_ +* `Integrals_Bielec `_ + +Documentation +============= +.. Do not edit this section It was auto-generated +.. by the `update_README.py` script. + + +`a_operator `_ + Needed for diag_H_mat_elem + + +`abs_psi_coef_max `_ + Max and min values of the coefficients + + +`abs_psi_coef_min `_ + Max and min values of the coefficients + + +`ac_operator `_ + Needed for diag_H_mat_elem + + +`apply_mono `_ + Undocumented + + +`bi_elec_ref_bitmask_energy `_ + Energy of the reference bitmask used in Slater rules + + +`ci_eigenvectors `_ + Eigenvectors/values of the CI matrix + + +`ci_eigenvectors_mono `_ + Eigenvectors/values of the CI matrix + + +`ci_eigenvectors_s2 `_ + Eigenvectors/values of the CI matrix + + +`ci_eigenvectors_s2_mono `_ + Eigenvectors/values of the CI matrix + + +`ci_electronic_energy `_ + Eigenvectors/values of the CI matrix + + +`ci_electronic_energy_mono `_ + Eigenvectors/values of the CI matrix + + +`ci_energy `_ + N_states lowest eigenvalues of the CI matrix + + +`ci_sc2_eigenvectors `_ + Eigenvectors/values of the CI matrix + + +`ci_sc2_electronic_energy `_ + Eigenvectors/values of the CI matrix + + +`ci_sc2_energy `_ + N_states_diag lowest eigenvalues of the CI matrix + + +`cisd `_ + Undocumented + + +`cisd_sc2 `_ + CISD+SC2 method :: take off all the disconnected terms of a CISD (selected or not) + .br + dets_in : bitmasks corresponding to determinants + .br + u_in : guess coefficients on the various states. Overwritten + on exit + .br + dim_in : leftmost dimension of u_in + .br + sze : Number of determinants + .br + N_st : Number of eigenstates + .br + Initial guess vectors are not necessarily orthonormal + + +`connected_to_ref `_ + Undocumented + + +`connected_to_ref_by_mono `_ + Undocumented + + +`copy_h_apply_buffer_to_wf `_ + Copies the H_apply buffer to psi_coef. + After calling this subroutine, N_det, psi_det and psi_coef need to be touched + + +`create_wf_of_psi_bilinear_matrix `_ + Generate a wave function containing all possible products + of alpha and beta determinants + + +`davidson_converged `_ + True if the Davidson algorithm is converged + + +`davidson_criterion `_ + Can be : [ energy | residual | both | wall_time | cpu_time | iterations ] + + +`davidson_diag `_ + Davidson diagonalization. + .br + dets_in : bitmasks corresponding to determinants + .br + u_in : guess coefficients on the various states. Overwritten + on exit + .br + dim_in : leftmost dimension of u_in + .br + sze : Number of determinants + .br + N_st : Number of eigenstates + .br + iunit : Unit number for the I/O + .br + Initial guess vectors are not necessarily orthonormal + + +`davidson_diag_hjj `_ + Davidson diagonalization with specific diagonal elements of the H matrix + .br + H_jj : specific diagonal H matrix elements to diagonalize de Davidson + .br + dets_in : bitmasks corresponding to determinants + .br + u_in : guess coefficients on the various states. Overwritten + on exit + .br + dim_in : leftmost dimension of u_in + .br + sze : Number of determinants + .br + N_st : Number of eigenstates + .br + iunit : Unit for the I/O + .br + Initial guess vectors are not necessarily orthonormal + + +`davidson_iter_max `_ + Max number of Davidson iterations + + +`davidson_sze_max `_ + Max number of Davidson sizes + + +`davidson_threshold `_ + Can be : [ energy | residual | both | wall_time | cpu_time | iterations ] + + +`decode_exc `_ + Decodes the exc arrays returned by get_excitation. + h1,h2 : Holes + p1,p2 : Particles + s1,s2 : Spins (1:alpha, 2:beta) + degree : Degree of excitation + + +`det_coef `_ + det_coef + + +`det_connections `_ + Build connection proxy between determinants + + +`det_inf `_ + Undocumented + + +`det_num `_ + det_num + + +`det_occ `_ + det_occ + + +`det_search_key `_ + Return an integer*8 corresponding to a determinant index for searching + + +`det_to_occ_pattern `_ + Transform a determinant to an occupation pattern + + +`diag_algorithm `_ + Diagonalization algorithm (Davidson or Lapack) + + +`diag_h_mat_elem `_ + Computes + + +`diagonalize_ci `_ + Replace the coefficients of the CI states by the coefficients of the + eigenstates of the CI matrix + + +`diagonalize_ci_mono `_ + Replace the coefficients of the CI states by the coefficients of the + eigenstates of the CI matrix + + +`diagonalize_ci_sc2 `_ + Replace the coefficients of the CI states_diag by the coefficients of the + eigenstates of the CI matrix + + +`do_mono_excitation `_ + Apply the mono excitation operator : a^{dager}_(i_particle) a_(i_hole) of spin = ispin + on key_in + ispin = 1 == alpha + ispin = 2 == beta + i_ok = 1 == the excitation is possible + i_ok = -1 == the excitation is not possible + + +`double_exc_bitmask `_ + double_exc_bitmask(:,1,i) is the bitmask for holes of excitation 1 + double_exc_bitmask(:,2,i) is the bitmask for particles of excitation 1 + double_exc_bitmask(:,3,i) is the bitmask for holes of excitation 2 + double_exc_bitmask(:,4,i) is the bitmask for particles of excitation 2 + for a given couple of hole/particle excitations i. + + +`expected_s2 `_ + Expected value of S2 : S*(S+1) + + +`fill_h_apply_buffer_no_selection `_ + Fill the H_apply buffer with determiants for CISD + + +`filter_3_highest_electrons `_ + Returns a determinant with only the 3 highest electrons + + +`filter_connected `_ + Filters out the determinants that are not connected by H + .br + returns the array idx which contains the index of the + .br + determinants in the array key1 that interact + .br + via the H operator with key2. + .br + idx(0) is the number of determinants that interact with key1 + + +`filter_connected_davidson `_ + Filters out the determinants that are not connected by H + returns the array idx which contains the index of the + determinants in the array key1 that interact + via the H operator with key2. + .br + idx(0) is the number of determinants that interact with key1 + key1 should come from psi_det_sorted_ab. + + +`filter_connected_davidson_shortcut `_ + Filters out the determinants that are not connected by H + returns the array idx which contains the index of the + determinants in the array key1 that interact + via the H operator with key2. + .br + idx(0) is the number of determinants that interact with key1 + key1 should come from psi_det_sorted_ab. + + +`filter_connected_davidson_warp `_ + Filters out the determinants that are not connected by H + returns the array idx which contains the index of the + determinants in the array key1 that interact + via the H operator with key2. + .br + idx(0) is the number of determinants that interact with key1 + key1 should come from psi_det_sorted_ab. + + +`filter_connected_i_h_psi0 `_ + returns the array idx which contains the index of the + .br + determinants in the array key1 that interact + .br + via the H operator with key2. + .br + idx(0) is the number of determinants that interact with key1 + + +`filter_connected_i_h_psi0_sc2 `_ + standard filter_connected_i_H_psi but returns in addition + .br + the array of the index of the non connected determinants to key1 + .br + in order to know what double excitation can be repeated on key1 + .br + idx_repeat(0) is the number of determinants that can be used + .br + to repeat the excitations + + +`generate_all_alpha_beta_det_products `_ + Create a wave function from all possible alpha x beta determinants + + +`get_double_excitation `_ + Returns the two excitation operators between two doubly excited determinants and the phase + + +`get_excitation `_ + Returns the excitation operators between two determinants and the phase + + +`get_excitation_degree `_ + Returns the excitation degree between two determinants + + +`get_excitation_degree_vector `_ + Applies get_excitation_degree to an array of determinants + + +`get_index_in_psi_det_alpha_unique `_ + Returns the index of the determinant in the ``psi_det_alpha_unique`` array + + +`get_index_in_psi_det_beta_unique `_ + Returns the index of the determinant in the ``psi_det_beta_unique`` array + + +`get_index_in_psi_det_sorted_bit `_ + Returns the index of the determinant in the ``psi_det_sorted_bit`` array + + +`get_mono_excitation `_ + Returns the excitation operator between two singly excited determinants and the phase + + +`get_occ_from_key `_ + Returns a list of occupation numbers from a bitstring + + +`get_s2 `_ + Returns + + +`get_s2_u0 `_ + Undocumented + + +`get_s2_u0_old `_ + Undocumented + + +`h_apply_buffer_allocated `_ + Buffer of determinants/coefficients/perturbative energy for H_apply. + Uninitialized. Filled by H_apply subroutines. + + +`h_apply_buffer_lock `_ + Buffer of determinants/coefficients/perturbative energy for H_apply. + Uninitialized. Filled by H_apply subroutines. + + +`h_matrix_all_dets `_ + H matrix on the basis of the slater determinants defined by psi_det + + +`h_matrix_cas `_ + Undocumented + + +`h_u_0 `_ + Computes v_0 = H|u_0> + .br + n : number of determinants + .br + H_jj : array of + + +`h_u_0_org `_ + Computes v_0 = H|u_0> + .br + n : number of determinants + .br + H_jj : array of + + +`i_h_j `_ + Returns where i and j are determinants + + +`i_h_j_phase_out `_ + Returns where i and j are determinants + + +`i_h_j_verbose `_ + Returns where i and j are determinants + + +`i_h_psi `_ + for the various Nstates + + +`i_h_psi_sc2 `_ + for the various Nstate + .br + returns in addition + .br + the array of the index of the non connected determinants to key1 + .br + in order to know what double excitation can be repeated on key1 + .br + idx_repeat(0) is the number of determinants that can be used + .br + to repeat the excitations + + +`i_h_psi_sc2_verbose `_ + for the various Nstate + .br + returns in addition + .br + the array of the index of the non connected determinants to key1 + .br + in order to know what double excitation can be repeated on key1 + .br + idx_repeat(0) is the number of determinants that can be used + .br + to repeat the excitations + + +`i_h_psi_sec_ord `_ + for the various Nstates + + +`idx_cas `_ + CAS wave function, defined from the application of the CAS bitmask on the + determinants. idx_cas gives the indice of the CAS determinant in psi_det. + + +`idx_non_cas `_ + Set of determinants which are not part of the CAS, defined from the application + of the CAS bitmask on the determinants. + idx_non_cas gives the indice of the determinant in psi_det. + + +`int_of_3_highest_electrons `_ + Returns an integer*8 as : + .br + |_<--- 21 bits ---><--- 21 bits ---><--- 21 bits --->| + .br + |0<--- i1 ---><--- i2 ---><--- i3 --->| + .br + It encodes the value of the indices of the 3 highest MOs + in descending order + .br + + +`is_in_wavefunction `_ + True if the determinant ``det`` is in the wave function + + +`kinetic_ref_bitmask_energy `_ + Energy of the reference bitmask used in Slater rules + + +`make_s2_eigenfunction `_ + Undocumented + + +`max_degree_exc `_ + Maximum degree of excitation in the wf + + +`mono_elec_ref_bitmask_energy `_ + Energy of the reference bitmask used in Slater rules + + +`n_con_int `_ + Number of integers to represent the connections between determinants + + +`n_det `_ + Number of determinants in the wave function + + +`n_det_alpha_unique `_ + Unique alpha determinants + + +`n_det_beta_unique `_ + Unique beta determinants + + +`n_det_cas `_ + CAS wave function, defined from the application of the CAS bitmask on the + determinants. idx_cas gives the indice of the CAS determinant in psi_det. + + +`n_det_max `_ + Max number of determinants in the wave function + + +`n_det_max_jacobi `_ + Maximum number of determinants diagonalized by Jacobi + + +`n_det_max_property `_ + Max number of determinants in the wave function when you select for a given property + + +`n_det_non_cas `_ + Set of determinants which are not part of the CAS, defined from the application + of the CAS bitmask on the determinants. + idx_non_cas gives the indice of the determinant in psi_det. + + +`n_double_exc_bitmasks `_ + Number of double excitation bitmasks + + +`n_occ_pattern `_ + array of the occ_pattern present in the wf + psi_occ_pattern(:,1,j) = jth occ_pattern of the wave function : represent all the single occupation + psi_occ_pattern(:,2,j) = jth occ_pattern of the wave function : represent all the double occupation + + +`n_single_exc_bitmasks `_ + Number of single excitation bitmasks + + +`n_states `_ + Number of states to consider + + +`n_states_diag `_ + Number of states to consider for the diagonalization + + +`nucl_elec_ref_bitmask_energy `_ + Energy of the reference bitmask used in Slater rules + + +`occ_pattern_search_key `_ + Return an integer*8 corresponding to a determinant index for searching + + +`occ_pattern_to_dets `_ + Generate all possible determinants for a give occ_pattern + + +`occ_pattern_to_dets_size `_ + Number of possible determinants for a given occ_pattern + + +`one_body_dm_mo `_ + One-body density matrix + + +`one_body_dm_mo_alpha `_ + Alpha and beta one-body density matrix for each state + + +`one_body_dm_mo_beta `_ + Alpha and beta one-body density matrix for each state + + +`one_body_single_double_dm_mo_alpha `_ + Alpha and beta one-body density matrix for each state + + +`one_body_single_double_dm_mo_beta `_ + Alpha and beta one-body density matrix for each state + + +`one_body_spin_density_mo `_ + rho(alpha) - rho(beta) + + +`only_single_double_dm `_ + If true, The One body DM is calculated with ignoring the Double<->Doubles extra diag elements + + +`pouet `_ + Undocumented + + +`psi_average_norm_contrib `_ + Contribution of determinants to the state-averaged density + + +`psi_average_norm_contrib_sorted `_ + Wave function sorted by determinants contribution to the norm (state-averaged) + + +`psi_bilinear_matrix `_ + Coefficient matrix if the wave function is expressed in a bilinear form : + D_a^t C D_b + + +`psi_bilinear_matrix_columns `_ + Sparse coefficient matrix if the wave function is expressed in a bilinear form : + D_a^t C D_b + + +`psi_bilinear_matrix_rows `_ + Sparse coefficient matrix if the wave function is expressed in a bilinear form : + D_a^t C D_b + + +`psi_bilinear_matrix_values `_ + Sparse coefficient matrix if the wave function is expressed in a bilinear form : + D_a^t C D_b + + +`psi_cas `_ + CAS wave function, defined from the application of the CAS bitmask on the + determinants. idx_cas gives the indice of the CAS determinant in psi_det. + + +`psi_cas_coef `_ + CAS wave function, defined from the application of the CAS bitmask on the + determinants. idx_cas gives the indice of the CAS determinant in psi_det. + + +`psi_cas_coef_sorted_bit `_ + CAS determinants sorted to accelerate the search of a random determinant in the wave + function. + + +`psi_cas_energy `_ + Undocumented + + +`psi_cas_energy_diagonalized `_ + Undocumented + + +`psi_cas_sorted_bit `_ + CAS determinants sorted to accelerate the search of a random determinant in the wave + function. + + +`psi_coef `_ + The wave function coefficients. Initialized with Hartree-Fock if the EZFIO file + is empty + + +`psi_coef_cas_diagonalized `_ + Undocumented + + +`psi_coef_max `_ + Max and min values of the coefficients + + +`psi_coef_min `_ + Max and min values of the coefficients + + +`psi_coef_sorted `_ + Wave function sorted by determinants contribution to the norm (state-averaged) + + +`psi_coef_sorted_ab `_ + Determinants on which we apply . + They are sorted by the 3 highest electrons in the alpha part, + then by the 3 highest electrons in the beta part to accelerate + the research of connected determinants. + + +`psi_coef_sorted_bit `_ + Determinants on which we apply for perturbation. + They are sorted by determinants interpreted as integers. Useful + to accelerate the search of a random determinant in the wave + function. + + +`psi_det `_ + The wave function determinants. Initialized with Hartree-Fock if the EZFIO file + is empty + + +`psi_det_alpha `_ + List of alpha determinants of psi_det + + +`psi_det_alpha_unique `_ + Unique alpha determinants + + +`psi_det_beta `_ + List of beta determinants of psi_det + + +`psi_det_beta_unique `_ + Unique beta determinants + + +`psi_det_size `_ + Size of the psi_det/psi_coef arrays + + +`psi_det_sorted `_ + Wave function sorted by determinants contribution to the norm (state-averaged) + + +`psi_det_sorted_ab `_ + Determinants on which we apply . + They are sorted by the 3 highest electrons in the alpha part, + then by the 3 highest electrons in the beta part to accelerate + the research of connected determinants. + + +`psi_det_sorted_bit `_ + Determinants on which we apply for perturbation. + They are sorted by determinants interpreted as integers. Useful + to accelerate the search of a random determinant in the wave + function. + + +`psi_det_sorted_next_ab `_ + Determinants on which we apply . + They are sorted by the 3 highest electrons in the alpha part, + then by the 3 highest electrons in the beta part to accelerate + the research of connected determinants. + + +`psi_non_cas `_ + Set of determinants which are not part of the CAS, defined from the application + of the CAS bitmask on the determinants. + idx_non_cas gives the indice of the determinant in psi_det. + + +`psi_non_cas_coef `_ + Set of determinants which are not part of the CAS, defined from the application + of the CAS bitmask on the determinants. + idx_non_cas gives the indice of the determinant in psi_det. + + +`psi_non_cas_coef_sorted_bit `_ + CAS determinants sorted to accelerate the search of a random determinant in the wave + function. + + +`psi_non_cas_sorted_bit `_ + CAS determinants sorted to accelerate the search of a random determinant in the wave + function. + + +`psi_occ_pattern `_ + array of the occ_pattern present in the wf + psi_occ_pattern(:,1,j) = jth occ_pattern of the wave function : represent all the single occupation + psi_occ_pattern(:,2,j) = jth occ_pattern of the wave function : represent all the double occupation + + +`put_gess `_ + Undocumented + + +`read_dets `_ + Reads the determinants from the EZFIO file + + +`read_wf `_ + If true, read the wave function from the EZFIO file + + +`rec_occ_pattern_to_dets `_ + Undocumented + + +`ref_bitmask_energy `_ + Energy of the reference bitmask used in Slater rules + + +`remove_duplicates_in_psi_det `_ + Removes duplicate determinants in the wave function. + + +`resize_h_apply_buffer `_ + Resizes the H_apply buffer of proc iproc. The buffer lock should + be set before calling this function. + + +`routine `_ + Undocumented + + +`s2_eig `_ + Force the wave function to be an eigenfunction of S^2 + + +`s2_values `_ + array of the averaged values of the S^2 operator on the various states + + +`s_z `_ + z component of the Spin + + +`s_z2_sz `_ + z component of the Spin + + +`save_natorb `_ + Undocumented + + +`save_natural_mos `_ + Save natural orbitals, obtained by diagonalization of the one-body density matrix in the MO basis + + +`save_wavefunction `_ + Save the wave function into the EZFIO file + + +`save_wavefunction_general `_ + Save the wave function into the EZFIO file + + +`save_wavefunction_specified `_ + Save the wave function into the EZFIO file + + +`save_wavefunction_unsorted `_ + Save the wave function into the EZFIO file + + +`set_bite_to_integer `_ + Undocumented + + +`set_natural_mos `_ + Set natural orbitals, obtained by diagonalization of the one-body density matrix in the MO basis + + +`single_exc_bitmask `_ + single_exc_bitmask(:,1,i) is the bitmask for holes + single_exc_bitmask(:,2,i) is the bitmask for particles + for a given couple of hole/particle excitations i. + + +`sort_dets_ab `_ + Undocumented + + +`sort_dets_ab_v `_ + Undocumented + + +`sort_dets_ba_v `_ + Undocumented + + +`sort_dets_by_3_highest_electrons `_ + Determinants on which we apply . + They are sorted by the 3 highest electrons in the alpha part, + then by the 3 highest electrons in the beta part to accelerate + the research of connected determinants. + + +`sort_dets_by_det_search_key `_ + Determinants are sorted are sorted according to their det_search_key. + Useful to accelerate the search of a random determinant in the wave + function. + + +`spin_det_search_key `_ + Return an integer*8 corresponding to a determinant index for searching + + +`state_average_weight `_ + Weights in the state-average calculation of the density matrix + + +`tamiser `_ + Undocumented + + +`threshold_convergence_sc2 `_ + convergence of the correlation energy of SC2 iterations + + +`threshold_generators `_ + Thresholds on generators (fraction of the norm) + + +`threshold_selectors `_ + Thresholds on selectors (fraction of the norm) + + +`write_spindeterminants `_ + Undocumented + diff --git a/src/Determinants/filter_connected.irp.f b/src/Determinants/filter_connected.irp.f index f55643bd..ed4f092e 100644 --- a/src/Determinants/filter_connected.irp.f +++ b/src/Determinants/filter_connected.irp.f @@ -98,65 +98,6 @@ subroutine filter_connected(key1,key2,Nint,sze,idx) end -subroutine filter_connected_sorted_ab(key1,key2,next,Nint,sze,idx) - use bitmasks - implicit none - BEGIN_DOC - ! Filters out the determinants that are not connected by H - ! returns the array idx which contains the index of the - ! determinants in the array key1 that interact - ! via the H operator with key2. - ! idx(0) is the number of determinants that interact with key1 - ! - ! Determinants are taken from the psi_det_sorted_ab array - END_DOC - integer, intent(in) :: Nint, sze - integer, intent(in) :: next(2,N_det) - integer(bit_kind), intent(in) :: key1(Nint,2,sze) - integer(bit_kind), intent(in) :: key2(Nint,2) - integer, intent(out) :: idx(0:sze) - - integer :: i,j,l - integer :: degree_x2 - integer(bit_kind) :: det3_1(Nint,2), det3_2(Nint,2) - - ASSERT (Nint > 0) - ASSERT (sze >= 0) - - l=1 - - call filter_3_highest_electrons( key2(1,1), det3_2(1,1), Nint) - if (Nint==1) then - - i = 1 - do while ( i<= sze ) - call filter_3_highest_electrons( key1(1,1,i), det3_1(1,1), Nint) - degree_x2 = popcnt( xor( det3_1(1,1), det3_2(1,1))) - if (degree_x2 > 4) then - i = next(1,i) - cycle - else - degree_x2 = popcnt( xor( key1(1,1,i), key2(1,1)) ) - if (degree_x2 <= 4) then - degree_x2 += popcnt( xor( key1(1,2,i), key2(1,2)) ) - if (degree_x2 <= 4) then - idx(l) = i - l += 1 - endif - endif - i += 1 - endif - enddo - - else - - print *, 'Not implemented', irp_here - stop 1 - - endif - idx(0) = l-1 -end - subroutine filter_connected_davidson_warp(key1,warp,key2,Nint,sze,idx) use bitmasks @@ -337,6 +278,7 @@ subroutine filter_connected_davidson(key1,key2,Nint,sze,idx) PROVIDE N_con_int det_connections + ASSERT (Nint > 0) ASSERT (sze >= 0)