From f65aae95384225da778ec03fa4b1ae376b842fff Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 4 Mar 2016 16:52:46 +0100 Subject: [PATCH 001/216] init mrcepa0 --- plugins/MRCC_Utils/mrcc_utils.irp.f | 13 ++ plugins/mrcepa0/dressing.irp.f | 234 ++++++++++++++++++++++++++ plugins/mrcepa0/mrcepa0.irp.f | 24 +++ plugins/mrcepa0/mrcepa0_general.irp.f | 96 +++++++++++ 4 files changed, 367 insertions(+) create mode 100644 plugins/mrcepa0/dressing.irp.f create mode 100644 plugins/mrcepa0/mrcepa0.irp.f create mode 100644 plugins/mrcepa0/mrcepa0_general.irp.f diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 1e2f974d..866a6e3b 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -110,6 +110,7 @@ END_PROVIDER BEGIN_PROVIDER [ double precision, delta_ij, (N_det_ref,N_det_non_ref,N_states) ] &BEGIN_PROVIDER [ double precision, delta_ii, (N_det_ref,N_states) ] +&BEGIN_PROVIDER [ double precision, delta_cas, (N_det_ref,N_det_ref,N_states) ] implicit none BEGIN_DOC ! Dressing matrix in N_det basis @@ -117,6 +118,7 @@ END_PROVIDER integer :: i,j,m delta_ij = 0.d0 delta_ii = 0.d0 + call H_apply_mrcc(delta_ij,delta_ii,N_det_ref,N_det_non_ref) double precision :: max_delta double precision :: accu @@ -157,6 +159,17 @@ BEGIN_PROVIDER [ double precision, h_matrix_dressed, (N_det,N_det,N_states) ] h_matrix_dressed(i,j,istate) = h_matrix_all_dets(i,j) enddo enddo + + !!!!!!!!!! + do ii = 1, N_det_ref + do jj = 1, N_det_ref + i = idx_ref(ii) + j = idx_ref(jj) + h_matrix_dressed(i,j,istate) += delta_cas(ii,jj,istate) + h_matrix_dressed(j,i,istate) += delta_cas(ii,jj,istate) + end do + end do + !!!!!!!!!!!!! do ii = 1, N_det_ref i =idx_ref(ii) h_matrix_dressed(i,i,istate) += delta_ii(ii,istate) diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f new file mode 100644 index 00000000..53a9417b --- /dev/null +++ b/plugins/mrcepa0/dressing.irp.f @@ -0,0 +1,234 @@ +use bitmasks + + + BEGIN_PROVIDER [ integer, cepa0_shortcut, (0:N_det_non_ref+1) ] +&BEGIN_PROVIDER [ integer, det_cepa0_idx, (N_det_non_ref) ] +&BEGIN_PROVIDER [ integer(bit_kind), det_cepa0_active, (N_det_non_ref) ] +&BEGIN_PROVIDER [ integer(bit_kind), det_ref_active, (N_det_ref) ] + use bitmasks + implicit none + + integer(bit_kind) :: det_noactive(N_int, 2, N_det_non_ref), active_sorb(2) + integer i, II, j, k + logical, external :: detEq + + print *, "provide cepa0" + active_sorb = (/b'001100000000', b'001100000000'/) + do i=1, N_det_non_ref + det_noactive(1,1,i) = iand(psi_non_ref(1,1,i), not(active_sorb(1))) + det_noactive(1,2,i) = iand(psi_non_ref(1,2,i), not(active_sorb(2))) + end do + + call sort_dets_ab(det_noactive, det_cepa0_idx, cepa0_shortcut, N_det_non_ref, N_int) + do i=1,N_det_ref + det_ref_active(i) = iand(psi_ref(1,1,i), active_sorb(1)) + det_ref_active(i) = det_ref_active(i) + iand(psi_ref(1,2,i), active_sorb(2)) * 2_8**32_8 + end do + + cepa0_shortcut(0) = 1 + cepa0_shortcut(1) = 1 + det_cepa0_active(1) = iand(psi_non_ref(1,1,det_cepa0_idx(1)), active_sorb(1)) + det_cepa0_active(1) = det_cepa0_active(1) + iand(psi_non_ref(1,2,det_cepa0_idx(1)), active_sorb(2)) * 2_8**32_8 + + do i=2,N_det_non_ref + det_cepa0_active(i) = iand(psi_non_ref(1,1,det_cepa0_idx(i)), active_sorb(1)) + det_cepa0_active(i) = det_cepa0_active(i) + iand(psi_non_ref(1,2,det_cepa0_idx(i)), active_sorb(2)) * 2_8**32_8 + + if(.not. detEq(det_noactive(1,1,i), det_noactive(1,1,i-1), N_int)) then + cepa0_shortcut(0) += 1 + cepa0_shortcut(cepa0_shortcut(0)) = i + end if + end do + cepa0_shortcut(0) += 1 + cepa0_shortcut(cepa0_shortcut(0)) = N_det_non_ref+1 + +END_PROVIDER + + + + BEGIN_PROVIDER [ double precision, delta_cas, (N_det_ref, N_det_ref, N_states) ] + use bitmasks + implicit none + integer :: i,j,k + double precision :: Hjk, Hki + integer i_state + + i_state = 1 + + do i=1,N_det_ref + do j=1,i + delta_cas(i,j,i_state) = 0d0 + do k=1,N_det_non_ref + call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,k),N_int,Hjk) + call i_h_j(psi_ref(1,1,i), psi_non_ref(1,1,k),N_int,Hki) + delta_cas(i,j,i_state) += Hjk * Hki * lambda_mrcc(i_state, k) + end do + delta_cas(j,i,i_state) = delta_cas(i,j,i_state) + end do + end do + + print *, "mrcepa0_cas_dressing", delta_cas(:,:,1) + END_PROVIDER + +logical function detEq(a,b,Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer(bit_kind), intent(in) :: a(Nint,2), b(Nint,2) + integer :: ni, i + + detEq = .false. + do i=1,2 + do ni=1,Nint + if(a(ni,i) /= b(ni,i)) return + end do + end do + detEq = .true. +end function + + + + BEGIN_PROVIDER [ double precision, delta_ij, (N_det_ref,N_det_non_ref,N_states) ] +&BEGIN_PROVIDER [ double precision, delta_ii, (N_det_ref,N_states) ] + use bitmasks + implicit none + + integer :: i_state, i, i_I, J, k, degree, degree2, m, l, deg, ni + integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_ + logical :: ok + double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(1), HkI, ci_inv(1), dia_hla(1) + double precision :: contrib + integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ + integer(bit_kind) :: det_tmp(N_int, 2), made_hole, made_particle + integer, allocatable :: idx_sorted_bit(:) + integer, external :: get_index_in_psi_det_sorted_bit + logical, external :: is_in_wavefunction + + integer :: II, blok + + provide det_cepa0_active + + if(N_int /= 1) then + print *, "mrcepa0 experimental N_int==1" + stop + end if + + i_state = 1 + delta_ii(:,:) = 0 + delta_ij(:,:,:) = 0 + +! do i=1,N_det_ref +! delta_ii(i,i_state) = delta_cas(i,i) +! end do + + provide mo_bielec_integrals_in_map + allocate(idx_sorted_bit(N_det)) + + idx_sorted_bit(:) = -1 + do i=1,N_det_non_ref + idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i + enddo + + !sd $OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_ij, delta_ii) + do blok=1,cepa0_shortcut(0) + do i=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 + do II=1,N_det_ref + + made_hole = iand(det_cepa0_active(i), xor(det_cepa0_active(i), det_ref_active(II))) + made_particle = iand(det_ref_active(II), xor(det_cepa0_active(i), det_ref_active(II))) + + if(popcnt(made_hole) + popcnt(made_particle) > 2) cycle + + do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 + do J=1,N_det_ref + if(iand(made_hole, det_ref_active(J)) /= made_hole) cycle + if(iand(made_particle, det_ref_active(J)) /= 0) cycle + call i_h_j(psi_ref(1,1,II), psi_non_ref(1,1,det_cepa0_idx(k)),N_int,Hki) + contrib = Hki * lambda_mrcc(i_state, det_cepa0_idx(k)) * delta_cas(II,J,i_state) + delta_ij(II, det_cepa0_idx(i), i_state) += contrib + +! if(dabs(psi_ref_coef(II,i_state)).ge.5.d-5) then +! !qs$OMP CRITICAL +! delta_ii(II,i_state) -= contrib / psi_ref_coef(II, i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) +! !dsd$OMP END CRITICAL +! endif + + end do + end do + end do + end do + end do + !qsd $OMP END PARALLEL DO + deallocate(idx_sorted_bit) +END_PROVIDER + + +subroutine set_det_bit(det, p, s) + use bitmasks + implicit none + integer(bit_kind),intent(inout) :: det(N_int, 2) + integer, intent(in) :: p, s + integer :: ni, pos + + ni = (p-1)/bit_kind_size + 1 + pos = mod(p-1, bit_kind_size) + det(ni,s) = ibset(det(ni,s), pos) +end subroutine + + + +subroutine apply_excitation(det, exc, res, ok, Nint) + use bitmasks + implicit none + + integer, intent(in) :: Nint + integer, intent(in) :: exc(0:2,2,2) + integer(bit_kind),intent(in) :: det(Nint, 2) + integer(bit_kind),intent(out) :: res(Nint, 2) + logical, intent(out) :: ok + integer :: h1,p1,h2,p2,s1,s2,degree + integer :: ii, pos + + + ok = .false. + degree = exc(0,1,1) + exc(0,1,2) + if(.not. (degree > 0 .and. degree <= 2)) then + print *, "apply ex" + STOP + endif + + call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) + res = det + + ii = (h1-1)/bit_kind_size + 1 + pos = mod(h1-1, 64)!iand(h1-1,bit_kind_size-1) ! mod 64 + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s1) = ibclr(res(ii, s1), pos) + + ii = (p1-1)/bit_kind_size + 1 + pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s1) = ibset(res(ii, s1), pos) + + if(degree == 2) then + ii = (h2-1)/bit_kind_size + 1 + pos = mod(h2-1, 64)!iand(h2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s2) = ibclr(res(ii, s2), pos) + + ii = (p2-1)/bit_kind_size + 1 + pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s2) = ibset(res(ii, s2), pos) + endif + + ok = .true. +end subroutine + + + + + + + + diff --git a/plugins/mrcepa0/mrcepa0.irp.f b/plugins/mrcepa0/mrcepa0.irp.f new file mode 100644 index 00000000..b9eb2fc5 --- /dev/null +++ b/plugins/mrcepa0/mrcepa0.irp.f @@ -0,0 +1,24 @@ +program mrcepa0 + implicit none + if (.not.read_wf) then + print *, 'read_wf has to be true.' + stop 1 + endif + call print_cas_coefs + call run_mrcepa0 +end + +subroutine print_cas_coefs + implicit none + + integer :: i,j + print *, 'CAS' + print *, '===' + do i=1,N_det_cas + print *, psi_cas_coef(i,:) + call debug_det(psi_cas(1,1,i),N_int) + enddo + + call write_double(6,ci_energy(1),"Initial CI energy") +end + diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f new file mode 100644 index 00000000..3f892887 --- /dev/null +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -0,0 +1,96 @@ +subroutine run_mrcepa0 + implicit none + call set_generators_bitmasks_as_holes_and_particles + call mrcepa0_iterations +end + +subroutine mrcepa0_iterations + implicit none + + integer :: i,j + + double precision :: E_new, E_old, delta_e + integer :: iteration,i_oscillations + double precision :: E_past(4) + E_new = 0.d0 + delta_E = 1.d0 + iteration = 0 + j = 1 + i_oscillations = 0 + do while (delta_E > 1.d-7) + iteration += 1 + print *, '===========================' + print *, 'MRCEPA0 Iteration', iteration + print *, '===========================' + print *, '' + E_old = sum(ci_energy_dressed) + call write_double(6,ci_energy_dressed(1),"MRCEPA0 energy") + call diagonalize_ci_dressed + E_new = sum(ci_energy_dressed) + delta_E = dabs(E_new - E_old) + E_past(j) = E_new + j +=1 + if(j>4)then + j=1 + endif + if(iteration > 4) then + if(delta_E > 1.d-10)then + if(dabs(E_past(1) - E_past(3)) .le. delta_E .and. dabs(E_past(2) - E_past(4)).le. delta_E)then + print*,'OSCILLATIONS !!!' +! oscillations = .True. + i_oscillations +=1 + lambda_mrcc_tmp = lambda_mrcc + endif + endif + endif + call save_wavefunction +! if (i_oscillations > 5) then +! exit +! endif + if (iteration > 100) then + exit + endif + print*,'------------' + print*,'VECTOR' + do i = 1, N_det_ref + print*,'' + print*,'psi_ref_coef(i,1) = ',psi_ref_coef(i,1) + print*,'delta_ii(i,1) = ',delta_ii(i,1) + enddo + print*,'------------' + enddo + call write_double(6,ci_energy_dressed(1),"Final MRCEPA0 energy") + call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) + call save_wavefunction + +end + +subroutine set_generators_bitmasks_as_holes_and_particles + implicit none + integer :: i,k + do k = 1, N_generators_bitmask + do i = 1, N_int + ! Pure single part + generators_bitmask(i,1,1,k) = holes_operators(i,1) ! holes for pure single exc alpha + generators_bitmask(i,1,2,k) = particles_operators(i,1) ! particles for pure single exc alpha + generators_bitmask(i,2,1,k) = holes_operators(i,2) ! holes for pure single exc beta + generators_bitmask(i,2,2,k) = particles_operators(i,2) ! particles for pure single exc beta + + ! Double excitation + generators_bitmask(i,1,3,k) = holes_operators(i,1) ! holes for first single exc alpha + generators_bitmask(i,1,4,k) = particles_operators(i,1) ! particles for first single exc alpha + generators_bitmask(i,2,3,k) = holes_operators(i,2) ! holes for first single exc beta + generators_bitmask(i,2,4,k) = particles_operators(i,2) ! particles for first single exc beta + + generators_bitmask(i,1,5,k) = holes_operators(i,1) ! holes for second single exc alpha + generators_bitmask(i,1,6,k) = particles_operators(i,1) ! particles for second single exc alpha + generators_bitmask(i,2,5,k) = holes_operators(i,2) ! holes for second single exc beta + generators_bitmask(i,2,6,k) = particles_operators(i,2) ! particles for second single exc beta + + enddo + enddo + touch generators_bitmask + + + +end From 7f583946c27ccb9b4689790ce29b2f45f56d4553 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 11 Mar 2016 19:35:57 +0100 Subject: [PATCH 002/216] experimental mrcepa0/mrsc2 --- ocaml/.gitignore | 1 - ocaml/qp_edit.ml | 66 ++-- plugins/MRCC_Utils/davidson.irp.f | 1 - plugins/MRCC_Utils/mrcc_utils.irp.f | 21 +- plugins/mrcepa0/dressing.irp.f | 439 +++++++++++++++++++++++--- plugins/mrcepa0/mrcepa0_general.irp.f | 2 +- 6 files changed, 432 insertions(+), 98 deletions(-) diff --git a/ocaml/.gitignore b/ocaml/.gitignore index 45d71ee3..0f0c1ef9 100644 --- a/ocaml/.gitignore +++ b/ocaml/.gitignore @@ -4,7 +4,6 @@ ezfio.ml Git.ml Input_auto_generated.ml Input_determinants.ml -Input_foboci.ml Input_hartree_fock.ml Input_integrals_bielec.ml Input_perturbation.ml diff --git a/ocaml/qp_edit.ml b/ocaml/qp_edit.ml index 67dc9501..409387b2 100644 --- a/ocaml/qp_edit.ml +++ b/ocaml/qp_edit.ml @@ -17,13 +17,12 @@ type keyword = | Electrons | Mo_basis | Nuclei -| Hartree_fock -| Pseudo -| Integrals_bielec -| Perturbation -| Properties -| Foboci | Determinants +| Integrals_bielec +| Pseudo +| Perturbation +| Hartree_fock +| Properties ;; @@ -33,13 +32,12 @@ let keyword_to_string = function | Electrons -> "Electrons" | Mo_basis -> "MO basis" | Nuclei -> "Molecule" -| Hartree_fock -> "Hartree_fock" -| Pseudo -> "Pseudo" -| Integrals_bielec -> "Integrals_bielec" -| Perturbation -> "Perturbation" -| Properties -> "Properties" -| Foboci -> "Foboci" | Determinants -> "Determinants" +| Integrals_bielec -> "Integrals_bielec" +| Pseudo -> "Pseudo" +| Perturbation -> "Perturbation" +| Hartree_fock -> "Hartree_fock" +| Properties -> "Properties" ;; @@ -88,20 +86,18 @@ let get s = f Ao_basis.(read, to_rst) | Determinants_by_hand -> f Determinants_by_hand.(read, to_rst) - | Hartree_fock -> - f Hartree_fock.(read, to_rst) - | Pseudo -> - f Pseudo.(read, to_rst) - | Integrals_bielec -> - f Integrals_bielec.(read, to_rst) - | Perturbation -> - f Perturbation.(read, to_rst) - | Properties -> - f Properties.(read, to_rst) - | Foboci -> - f Foboci.(read, to_rst) | Determinants -> f Determinants.(read, to_rst) + | Integrals_bielec -> + f Integrals_bielec.(read, to_rst) + | Pseudo -> + f Pseudo.(read, to_rst) + | Perturbation -> + f Perturbation.(read, to_rst) + | Hartree_fock -> + f Hartree_fock.(read, to_rst) + | Properties -> + f Properties.(read, to_rst) end with | Sys_error msg -> (Printf.eprintf "Info: %s\n%!" msg ; "") @@ -139,13 +135,12 @@ let set str s = in let open Input in match s with - | Hartree_fock -> write Hartree_fock.(of_rst, write) s - | Pseudo -> write Pseudo.(of_rst, write) s - | Integrals_bielec -> write Integrals_bielec.(of_rst, write) s - | Perturbation -> write Perturbation.(of_rst, write) s - | Properties -> write Properties.(of_rst, write) s - | Foboci -> write Foboci.(of_rst, write) s | Determinants -> write Determinants.(of_rst, write) s + | Integrals_bielec -> write Integrals_bielec.(of_rst, write) s + | Pseudo -> write Pseudo.(of_rst, write) s + | Perturbation -> write Perturbation.(of_rst, write) s + | Hartree_fock -> write Hartree_fock.(of_rst, write) s + | Properties -> write Properties.(of_rst, write) s | Electrons -> write Electrons.(of_rst, write) s | Determinants_by_hand -> write Determinants_by_hand.(of_rst, write) s | Nuclei -> write Nuclei.(of_rst, write) s @@ -193,13 +188,12 @@ let run check_only ezfio_filename = Nuclei ; Ao_basis; Electrons ; - Hartree_fock ; - Pseudo ; - Integrals_bielec ; - Perturbation ; - Properties ; - Foboci ; Determinants ; + Integrals_bielec ; + Pseudo ; + Perturbation ; + Hartree_fock ; + Properties ; Mo_basis; Determinants_by_hand ; ] diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index 6752afcb..d278ba13 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -359,7 +359,6 @@ subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nin y, & lambda & ) - abort_here = abort_all end diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 866a6e3b..155c52ae 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -1,3 +1,4 @@ + BEGIN_PROVIDER [integer, pert_determinants, (N_states, psi_det_size) ] END_PROVIDER @@ -47,6 +48,7 @@ endif enddo endif + i_pert = 0 if( i_pert == 1)then pert_determinants(k,i) = i_pert endif @@ -110,7 +112,6 @@ END_PROVIDER BEGIN_PROVIDER [ double precision, delta_ij, (N_det_ref,N_det_non_ref,N_states) ] &BEGIN_PROVIDER [ double precision, delta_ii, (N_det_ref,N_states) ] -&BEGIN_PROVIDER [ double precision, delta_cas, (N_det_ref,N_det_ref,N_states) ] implicit none BEGIN_DOC ! Dressing matrix in N_det basis @@ -118,7 +119,6 @@ END_PROVIDER integer :: i,j,m delta_ij = 0.d0 delta_ii = 0.d0 - call H_apply_mrcc(delta_ij,delta_ii,N_det_ref,N_det_non_ref) double precision :: max_delta double precision :: accu @@ -135,6 +135,7 @@ END_PROVIDER endif enddo enddo + !stop "movais delta" print*,'' print*,'' print*,' = ',accu @@ -159,17 +160,6 @@ BEGIN_PROVIDER [ double precision, h_matrix_dressed, (N_det,N_det,N_states) ] h_matrix_dressed(i,j,istate) = h_matrix_all_dets(i,j) enddo enddo - - !!!!!!!!!! - do ii = 1, N_det_ref - do jj = 1, N_det_ref - i = idx_ref(ii) - j = idx_ref(jj) - h_matrix_dressed(i,j,istate) += delta_cas(ii,jj,istate) - h_matrix_dressed(j,i,istate) += delta_cas(ii,jj,istate) - end do - end do - !!!!!!!!!!!!! do ii = 1, N_det_ref i =idx_ref(ii) h_matrix_dressed(i,i,istate) += delta_ii(ii,istate) @@ -272,11 +262,14 @@ subroutine diagonalize_CI_dressed ! eigenstates of the CI matrix END_DOC integer :: i,j + double precision, parameter :: speed = 1d0 + do j=1,N_states_diag do i=1,N_det - psi_coef(i,j) = CI_eigenvectors_dressed(i,j) + psi_coef(i,j) = CI_eigenvectors_dressed(i,j) * speed + psi_coef(i,j) * (1d0 - speed) enddo enddo SOFT_TOUCH psi_coef end + diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 53a9417b..30b161d4 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -1,30 +1,63 @@ use bitmasks + + BEGIN_PROVIDER [ double precision, delta_ij, (N_det_ref,N_det_non_ref,N_states) ] +&BEGIN_PROVIDER [ double precision, delta_ii, (N_det_ref,N_states) ] + use bitmasks + implicit none + +! delta_ij(:,:,:) = delta_ij_old(:,:,:) +! delta_ii(:,:) = delta_ii_old(:,:) + delta_ij(:,:,:) = delta_mrcepa0_ij(:,:,:)! - delta_sub_ij(:,:,:) + delta_ii(:,:)= delta_mrcepa0_ii(:,:)! - delta_sub_ii(:,:) +END_PROVIDER + + + BEGIN_PROVIDER [ integer, cepa0_shortcut, (0:N_det_non_ref+1) ] &BEGIN_PROVIDER [ integer, det_cepa0_idx, (N_det_non_ref) ] &BEGIN_PROVIDER [ integer(bit_kind), det_cepa0_active, (N_det_non_ref) ] &BEGIN_PROVIDER [ integer(bit_kind), det_ref_active, (N_det_ref) ] +&BEGIN_PROVIDER [ integer(bit_kind), active_sorb, (2) ] use bitmasks implicit none - integer(bit_kind) :: det_noactive(N_int, 2, N_det_non_ref), active_sorb(2) + integer(bit_kind) :: det_noactive(N_int, 2, N_det_non_ref), nonactive_sorb(2) integer i, II, j, k logical, external :: detEq print *, "provide cepa0" - active_sorb = (/b'001100000000', b'001100000000'/) + active_sorb(:) = 0_8 + nonactive_sorb(:) = not(0_8) + + if(N_det_ref > 1) then + do i=1, N_det_ref + active_sorb(1) = ior(psi_ref(1,1,i), active_sorb(1)) + active_sorb(2) = ior(psi_ref(1,2,i), active_sorb(2)) + nonactive_sorb(1) = iand(psi_ref(1,1,i), nonactive_sorb(1)) + nonactive_sorb(2) = iand(psi_ref(1,2,i), nonactive_sorb(2)) + end do + active_sorb(1) = iand(active_sorb(1), not(nonactive_sorb(1))) + active_sorb(2) = iand(active_sorb(2), not(nonactive_sorb(2))) + end if + do i=1, N_det_non_ref det_noactive(1,1,i) = iand(psi_non_ref(1,1,i), not(active_sorb(1))) det_noactive(1,2,i) = iand(psi_non_ref(1,2,i), not(active_sorb(2))) end do call sort_dets_ab(det_noactive, det_cepa0_idx, cepa0_shortcut, N_det_non_ref, N_int) + +! do i=1, N_det_non_ref +! print "(B30,B30)", det_noactive(1,1,i), det_noactive(1,2,i) +! end do +! stop do i=1,N_det_ref det_ref_active(i) = iand(psi_ref(1,1,i), active_sorb(1)) det_ref_active(i) = det_ref_active(i) + iand(psi_ref(1,2,i), active_sorb(2)) * 2_8**32_8 end do - + cepa0_shortcut(0) = 1 cepa0_shortcut(1) = 1 det_cepa0_active(1) = iand(psi_non_ref(1,1,det_cepa0_idx(1)), active_sorb(1)) @@ -39,8 +72,8 @@ use bitmasks cepa0_shortcut(cepa0_shortcut(0)) = i end if end do - cepa0_shortcut(0) += 1 - cepa0_shortcut(cepa0_shortcut(0)) = N_det_non_ref+1 + !cepa0_shortcut(0) += 1 + cepa0_shortcut(cepa0_shortcut(0)+1) = N_det_non_ref+1 END_PROVIDER @@ -50,24 +83,22 @@ END_PROVIDER use bitmasks implicit none integer :: i,j,k - double precision :: Hjk, Hki + double precision :: Hjk, Hki, Hij, mat(2,2) integer i_state + provide lambda_mrcc i_state = 1 - do i=1,N_det_ref do j=1,i delta_cas(i,j,i_state) = 0d0 do k=1,N_det_non_ref call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,k),N_int,Hjk) - call i_h_j(psi_ref(1,1,i), psi_non_ref(1,1,k),N_int,Hki) + call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki) delta_cas(i,j,i_state) += Hjk * Hki * lambda_mrcc(i_state, k) end do delta_cas(j,i,i_state) = delta_cas(i,j,i_state) end do end do - - print *, "mrcepa0_cas_dressing", delta_cas(:,:,1) END_PROVIDER logical function detEq(a,b,Nint) @@ -88,8 +119,9 @@ end function - BEGIN_PROVIDER [ double precision, delta_ij, (N_det_ref,N_det_non_ref,N_states) ] -&BEGIN_PROVIDER [ double precision, delta_ii, (N_det_ref,N_states) ] + + BEGIN_PROVIDER [ double precision, delta_mrcepa0_ij, (N_det_ref,N_det_non_ref,N_states) ] +&BEGIN_PROVIDER [ double precision, delta_mrcepa0_ii, (N_det_ref,N_states) ] use bitmasks implicit none @@ -99,14 +131,14 @@ end function double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(1), HkI, ci_inv(1), dia_hla(1) double precision :: contrib integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ - integer(bit_kind) :: det_tmp(N_int, 2), made_hole, made_particle + integer(bit_kind) :: det_tmp(N_int, 2), made_hole, made_particle, myActive integer, allocatable :: idx_sorted_bit(:) integer, external :: get_index_in_psi_det_sorted_bit logical, external :: is_in_wavefunction integer :: II, blok - provide det_cepa0_active + provide det_cepa0_active delta_cas lambda_mrcc if(N_int /= 1) then print *, "mrcepa0 experimental N_int==1" @@ -114,11 +146,11 @@ end function end if i_state = 1 - delta_ii(:,:) = 0 - delta_ij(:,:,:) = 0 - + delta_mrcepa0_ii(:,:) = 0d0 + delta_mrcepa0_ij(:,:,:) = 0d0 + ! do i=1,N_det_ref -! delta_ii(i,i_state) = delta_cas(i,i) +! delta_ii(i,i_state) = delta_cas(i,i,i_state) ! end do provide mo_bielec_integrals_in_map @@ -128,53 +160,370 @@ end function do i=1,N_det_non_ref idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i enddo - - !sd $OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_ij, delta_ii) + !- qsd $OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_ij, delta_ii) do blok=1,cepa0_shortcut(0) do i=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 do II=1,N_det_ref - made_hole = iand(det_cepa0_active(i), xor(det_cepa0_active(i), det_ref_active(II))) - made_particle = iand(det_ref_active(II), xor(det_cepa0_active(i), det_ref_active(II))) - - if(popcnt(made_hole) + popcnt(made_particle) > 2) cycle + made_hole = iand(det_ref_active(II), xor(det_cepa0_active(i), det_ref_active(II))) + made_particle = iand(det_cepa0_active(i), xor(det_cepa0_active(i), det_ref_active(II))) + call get_excitation_degree(psi_ref(1,1,II),psi_non_ref(1,1,det_cepa0_idx(i)),degree,N_int) + if (degree > 2 .or. popcnt(made_hole) * popcnt(made_particle) /= degree*2) cycle do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 + if(iand(not(active_sorb(1)), xor(psi_non_ref(1,1,det_cepa0_idx(k)), psi_non_ref(1,1,det_cepa0_idx(i)))) /= 0) stop "STOOOP" + !do k=1,N_det_non_ref + if(iand(made_hole, det_cepa0_active(k)) /= 0) cycle + if(iand(made_particle, det_cepa0_active(k)) /= made_particle) cycle + myActive = xor(det_cepa0_active(k), made_hole) + myActive = xor(myActive, made_particle) + if(i==k .and. myActive /= det_ref_active(II)) stop "AAAA" + !if(i==k) print *, "i=k" do J=1,N_det_ref - if(iand(made_hole, det_ref_active(J)) /= made_hole) cycle - if(iand(made_particle, det_ref_active(J)) /= 0) cycle - call i_h_j(psi_ref(1,1,II), psi_non_ref(1,1,det_cepa0_idx(k)),N_int,Hki) - contrib = Hki * lambda_mrcc(i_state, det_cepa0_idx(k)) * delta_cas(II,J,i_state) - delta_ij(II, det_cepa0_idx(i), i_state) += contrib + if(det_ref_active(J) /= myActive) cycle -! if(dabs(psi_ref_coef(II,i_state)).ge.5.d-5) then -! !qs$OMP CRITICAL -! delta_ii(II,i_state) -= contrib / psi_ref_coef(II, i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) -! !dsd$OMP END CRITICAL -! endif - + !!!!! + call get_excitation_degree(psi_ref(1,1,J),psi_non_ref(1,1,det_cepa0_idx(k)),degree,N_int) + if(degree > 2) stop "BBBB" + !!!!!!!!! +! if(i/=k .and. popcnt(made_hole) /= popcnt(made_particle)) then +! print *, "=================", made_hole, made_particle +! call debug_det(psi_ref(1,1,II),N_int) +! call debug_det(psi_non_ref(1,1,det_cepa0_idx(i)),N_int) +! call debug_det(psi_ref(1,1,J),N_int) +! call debug_det(psi_non_ref(1,1,det_cepa0_idx(k)),N_int) +! print *, "=================" +! end if + + call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,II),N_int,Hki) + + contrib = Hki * lambda_mrcc(i_state, det_cepa0_idx(k)) * delta_cas(II,J,i_state) + delta_mrcepa0_ij(II, det_cepa0_idx(i), i_state) += contrib +! + if(dabs(psi_ref_coef(II,i_state)).ge.5.d-5) then + !-$OMP CRITICAL + delta_mrcepa0_ii(II,i_state) -= contrib / psi_ref_coef(II, i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) + !-$OMP END CRITICAL + endif end do end do end do end do end do - !qsd $OMP END PARALLEL DO + !- qs $OMP END PARALLEL DO + !print *, "MMMMMMMMMM ", delta_cas(2,2,i_state) , delta_ii(2,i_state) +! do i=1,N_det_ref +! delta_cas(i,i,i_state) += delta_ii(i,i_state) +! end do + + deallocate(idx_sorted_bit) +END_PROVIDER + + + + + BEGIN_PROVIDER [ double precision, delta_sub_ij, (N_det_ref,N_det_non_ref,N_states) ] +&BEGIN_PROVIDER [ double precision, delta_sub_ii, (N_det_ref, N_states) ] + use bitmasks + implicit none + + integer :: i_state, i, i_I, J, k, degree, degree2, m, l, deg, ni + integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_ + logical :: ok + double precision :: phase_Ji, phase_Ik, phase_Ii + double precision :: contrib, delta_IJk, HJk, HIk, HIl + integer, dimension(0:2,2,2) :: exc_Ik, exc_Ji, exc_Ii + integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2) + integer, allocatable :: idx_sorted_bit(:) + integer, external :: get_index_in_psi_det_sorted_bit + + integer :: II, blok + + provide det_cepa0_active delta_cas lambda_mrcc + + if(N_int /= 1) then + print *, "mrsc2 experimental N_int==1" + stop + end if + + i_state = 1 + delta_sub_ij(:,:,:) = 0d0 + delta_sub_ii(:,:) = 0d0 + + provide mo_bielec_integrals_in_map + allocate(idx_sorted_bit(N_det)) + + idx_sorted_bit(:) = -1 + do i=1,N_det_non_ref + idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i + enddo + + !$OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_sub_ij, delta_sub_ii) + do i=1,N_det_non_ref + if(mod(i,1000) == 0) print "(A,I3,A)", "♫ sloubi", i/1000, " ♪" + do J=1,N_det_ref + call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_Ji,degree,phase_Ji,N_int) + if(degree == -1) cycle + + + do II=1,N_det_ref + call apply_excitation(psi_ref(1,1,II),exc_Ji,det_tmp,ok,N_int) + !call get_excitation(psi_ref(1,1,II),psi_non_ref(1,1,i),exc_Ii,degree,phase_Ii,N_int) + + if(.not. ok) cycle + l = get_index_in_psi_det_sorted_bit(det_tmp, N_int) + if(l == 0) cycle + l = idx_sorted_bit(l) + + if(psi_non_ref(1,1,l) /= det_tmp(1,1)) stop "sdf" + call i_h_j(psi_ref(1,1,II), det_tmp, N_int, HIl) + + do k=1,N_det_non_ref + call get_excitation(psi_ref(1,1,II),psi_non_ref(1,1,k),exc_Ik,degree2,phase_Ik,N_int) + + det_tmp(:,:) = 0_bit_kind + det_tmp2(:,:) = 0_bit_kind + + det_tmp(1,1) = iand(xor(HF_bitmask(1,1), psi_non_ref(1,1,k)), not(active_sorb(1))) + det_tmp(1,2) = iand(xor(HF_bitmask(1,1), psi_non_ref(1,1,i)), not(active_sorb(1))) + ok = (popcnt(det_tmp(1,1)) + popcnt(det_tmp(1,2)) == popcnt(xor(det_tmp(1,1), det_tmp(1,2)))) + + det_tmp(1,1) = iand(xor(HF_bitmask(1,2), psi_non_ref(1,2,k)), not(active_sorb(2))) + det_tmp(1,2) = iand(xor(HF_bitmask(1,2), psi_non_ref(1,2,i)), not(active_sorb(2))) + ok = ok .and. (popcnt(det_tmp(1,1)) + popcnt(det_tmp(1,2)) == popcnt(xor(det_tmp(1,1), det_tmp(1,2)))) + + if(ok) cycle + + +! call decode_exc(exc_Ii,degree,h1_,p1_,h2_,p2_,s1_,s2_) +! call decode_exc(exc_Ik,degree2,h1,p1,h2,p2,s1,s2) +! +! +! det_tmp(:,:) = 0_bit_kind +! call set_det_bit(det_tmp, p1, s1) +! call set_det_bit(det_tmp, h1, s1) +! call set_det_bit(det_tmp, p1_, s1_) +! call set_det_bit(det_tmp, h1_, s1_) +! if(degree == 2) then +! call set_det_bit(det_tmp, p2_, s2_) +! call set_det_bit(det_tmp, h2_, s2_) +! end if +! if(degree2 == 2) then +! call set_det_bit(det_tmp, p2, s2) +! call set_det_bit(det_tmp, h2, s2) +! end if +! deg = 0 +! do ni = 1, N_int +! deg += popcnt(det_tmp(ni,1)) + popcnt(det_tmp(ni,2)) +! end do +! if(deg == 2*degree2 + 2*degree) cycle + + + + + +! if(degree == -1) cycle + call i_h_j(psi_ref(1,1,J), psi_non_ref(1,1,k), N_int, HJk) + call i_h_j(psi_ref(1,1,II), psi_non_ref(1,1,k), N_int, HIk) + if(HJk == 0) cycle + !assert HIk == 0 + delta_IJk = HJk * HIk * lambda_mrcc(i_state, k) + call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) + if(ok) cycle + contrib = delta_IJk * HIl * lambda_mrcc(i_state, l) + !$OMP CRITICAL + delta_sub_ij(II, i, i_state) += contrib + if(dabs(psi_ref_coef(II,i_state)).ge.5.d-5) then + delta_sub_ii(II,i_state) -= contrib / psi_ref_coef(II, i_state) * psi_non_ref_coef(l,i_state) + endif + !$OMP END CRITICAL + end do + end do + end do + end do + !$OMP END PARALLEL DO deallocate(idx_sorted_bit) END_PROVIDER subroutine set_det_bit(det, p, s) - use bitmasks - implicit none - integer(bit_kind),intent(inout) :: det(N_int, 2) - integer, intent(in) :: p, s - integer :: ni, pos - - ni = (p-1)/bit_kind_size + 1 - pos = mod(p-1, bit_kind_size) - det(ni,s) = ibset(det(ni,s), pos) + implicit none + integer(bit_kind),intent(inout) :: det(N_int, 2) + integer, intent(in) :: p, s + integer :: ni, pos + + ni = (p-1)/bit_kind_size + 1 + pos = mod(p-1, bit_kind_size) + det(ni,s) = ibset(det(ni,s), pos) end subroutine + + + BEGIN_PROVIDER [ double precision, delta_ij_old, (N_det_ref,N_det_non_ref,N_states) ] +&BEGIN_PROVIDER [ double precision, delta_ii_old, (N_det_ref,N_states) ] +implicit none + integer :: i_state, i, i_I, J, k, degree, degree2, m, l, deg, ni + integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_, x(2), y(2) + logical :: ok + double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(1), HkI, ci_inv(1), dia_hla(1) + double precision :: contrib + integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ + integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2) + integer, allocatable :: idx_sorted_bit(:) + integer, external :: get_index_in_psi_det_sorted_bit + logical, external :: is_in_wavefunction + + delta_ii_old(:,:) = 0 + delta_ij_old(:,:,:) = 0 + + i_state = 1 + provide mo_bielec_integrals_in_map + allocate(idx_sorted_bit(N_det)) + + idx_sorted_bit(:) = -1 + do i=1,N_det_non_ref + idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i + enddo + + !$OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_ij_old, delta_ii_old) + do i = 1 , N_det_non_ref + if(mod(i,1000) == 0) print *, i, N_det_non_ref + do i_I = 1 , N_det_ref + call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,i),exc_iI,degree2,phase_iI,N_int) + if(degree2 == -1) cycle + ci_inv(i_state) = 1.d0 / psi_ref_coef(i_I,i_state) + + call decode_exc(exc_iI,degree2,h1,p1,h2,p2,s1,s2) + + call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,i_I),N_int,hIi) + diI = hIi * lambda_mrcc(i_state,i) + do J = 1 , N_det_ref !!! + call get_excitation(psi_ref(1,1,i_I),psi_ref(1,1,J),exc_IJ,degree,phase_IJ,N_int) + call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,J),N_int,hJi) + delta_JI = hJi * diI + do k = 1 , N_det_non_ref + call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,k),exc_Ik,degree,phase_Ik,N_int) + if(degree == -1) cycle + + call decode_exc(exc_Ik,degree,h1_,p1_,h2_,p2_,s1_,s2_) + + + det_tmp(:,:) = 0_bit_kind + det_tmp2(:,:) = 0_bit_kind + + !!!!!!!!!!!!!!! + + + + + + det_tmp(1,1) = iand(xor(HF_bitmask(1,1), psi_non_ref(1,1,k)), not(active_sorb(1))) + det_tmp(1,2) = iand(xor(HF_bitmask(1,1), psi_non_ref(1,1,i)), not(active_sorb(1))) + ok = (popcnt(det_tmp(1,1)) + popcnt(det_tmp(1,2)) == popcnt(xor(det_tmp(1,1), det_tmp(1,2)))) + + det_tmp(1,1) = iand(xor(HF_bitmask(1,2), psi_non_ref(1,2,k)), not(active_sorb(2))) + det_tmp(1,2) = iand(xor(HF_bitmask(1,2), psi_non_ref(1,2,i)), not(active_sorb(2))) + ok = ok .and. (popcnt(det_tmp(1,1)) + popcnt(det_tmp(1,2)) == popcnt(xor(det_tmp(1,1), det_tmp(1,2)))) + if(.not. ok) cycle + !if(ok) cycle + + !!!!!!!!!!!!!! + + + +! call set_det_bit(det_tmp, p1, s1) +! +! call set_det_bit(det_tmp, p1_, s1_) +! +! if(degree == 2) then +! call set_det_bit(det_tmp, p2_, s2_) +! +! end if +! if(degree2 == 2) then +! call set_det_bit(det_tmp, p2, s2) +! end if +! +! x(:) = 0 +! do ni=1,N_int +! x(1) += popcnt(iand(det_tmp(ni, 1), cas_bitmask(ni, 1, 1))) +! x(2) += popcnt(iand(det_tmp(ni, 2), cas_bitmask(ni, 2, 1))) +! end do +! +! +! !det_tmp(:,:) = 0_bit_kind +! +! call set_det_bit(det_tmp, h1, s1) +! call set_det_bit(det_tmp, h1_, s1_) +! if(degree == 2) then +! call set_det_bit(det_tmp, h2_, s2_) +! end if +! if(degree2 == 2) then +! call set_det_bit(det_tmp, h2, s2) +! end if +! +! y(1) = -x(1) +! y(2) = -x(2) +! do ni=1,N_int +! y(1) += popcnt(iand(det_tmp(ni, 1), cas_bitmask(ni, 1, 1))) +! y(2) += popcnt(iand(det_tmp(ni, 2), cas_bitmask(ni, 2, 1))) +! end do +! +! ! print *, x, y +! +! if(x(1) * y(1) /= 0) cycle +! if(x(2) * y(2) /= 0) cycle +! +! +! +! deg = 0 +! do ni = 1, N_int +! deg += popcnt(det_tmp(ni,1)) + popcnt(det_tmp(ni,2)) +! end do +! if(deg /= 2*degree2 + 2*degree) cycle + + + + call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) + + call get_excitation(psi_non_ref(1,1,i), det_tmp, exc_Ik, degree, phase_al, N_int) + + + if(.not. ok) cycle + if(is_in_wavefunction(det_tmp, N_int)) cycle + + + call apply_excitation(psi_ref(1,1,J),exc_Ik,det_tmp,ok,N_int) + if(.not. ok) cycle + + call get_excitation(psi_ref(1,1,J), det_tmp, exc_Ik, degree, phase_Jl, N_int) + + l = get_index_in_psi_det_sorted_bit(det_tmp, N_int) + if(l == 0) cycle + l = idx_sorted_bit(get_index_in_psi_det_sorted_bit(det_tmp, N_int)) + + if(l ==-1) cycle + + + call i_h_j(psi_non_ref(1,1,k), psi_ref(1,1,i_I),N_int,HkI) + dkI(i_state) = HkI * lambda_mrcc(i_state,k) * phase_Jl * phase_Ik + + + !$OMP CRITICAL + contrib = dkI(i_state) * delta_JI + !erro += abs(dkI(i_state) - psi_non_ref_coef(k,i_state) / psi_ref_coef(1,i_state)) + delta_ij_old(i_I,l,i_state) += contrib + if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then + delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(k,i_state) + endif + !$OMP END CRITICAL + enddo + enddo + enddo + enddo + !$OMP END PARALLEL DO + deallocate(idx_sorted_bit) +END_PROVIDER + subroutine apply_excitation(det, exc, res, ok, Nint) diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index 3f892887..87ae25f3 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -55,7 +55,7 @@ subroutine mrcepa0_iterations do i = 1, N_det_ref print*,'' print*,'psi_ref_coef(i,1) = ',psi_ref_coef(i,1) - print*,'delta_ii(i,1) = ',delta_ii(i,1) + print*,'delta_ii(i,1) = ',delta_cas(i,i,1) enddo print*,'------------' enddo From cda419d0f78e15955ea38b5f5768e85fc387f4c1 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 11 Mar 2016 20:26:50 +0100 Subject: [PATCH 003/216] added missing files --- plugins/mrcepa0/NEEDED_CHILDREN_MODULES | 1 + plugins/mrcepa0/README.rst | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 plugins/mrcepa0/NEEDED_CHILDREN_MODULES create mode 100644 plugins/mrcepa0/README.rst diff --git a/plugins/mrcepa0/NEEDED_CHILDREN_MODULES b/plugins/mrcepa0/NEEDED_CHILDREN_MODULES new file mode 100644 index 00000000..a8404d62 --- /dev/null +++ b/plugins/mrcepa0/NEEDED_CHILDREN_MODULES @@ -0,0 +1 @@ +Perturbation Selectors_full Generators_full Psiref_CAS MRCC_Utils diff --git a/plugins/mrcepa0/README.rst b/plugins/mrcepa0/README.rst new file mode 100644 index 00000000..997d005e --- /dev/null +++ b/plugins/mrcepa0/README.rst @@ -0,0 +1,12 @@ +======= +mrcepa0 +======= + +Needed Modules +============== +.. Do not edit this section It was auto-generated +.. by the `update_README.py` script. +Documentation +============= +.. Do not edit this section It was auto-generated +.. by the `update_README.py` script. From 48cb3b3ddc9b6c44ed40da9792b2ded501175713 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 1 Apr 2016 12:00:03 +0200 Subject: [PATCH 004/216] different binaries for mrcepa0/mrsc2/mrsc2sub + corrected reversed index in mrcc_utils --- plugins/MRCC_Utils/davidson.irp.f | 4 +- plugins/MRCC_Utils/mrcc_general.irp.f | 4 +- plugins/MRCC_Utils/mrcc_utils.irp.f | 1 - plugins/mrcepa0/dressing.irp.f | 426 +++++++++++++++----------- plugins/mrcepa0/mrcepa0.irp.f | 2 + plugins/mrcepa0/mrcepa0_general.irp.f | 39 +-- 6 files changed, 275 insertions(+), 201 deletions(-) diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index d278ba13..c9dec40a 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -486,8 +486,8 @@ subroutine H_u_0_mrcc(v_0,u_0,H_jj,n,keys_tmp,Nint,istate) i = idx_ref(ii) do jj = 1, n_det_non_ref j = idx_non_ref(jj) - vt (i) = vt (i) + delta_ij(ii,jj,istate)*u_0(j) - vt (j) = vt (j) + delta_ij(ii,jj,istate)*u_0(i) + vt (i) = vt (i) + delta_ij(istate,jj,ii)*u_0(j) + vt (j) = vt (j) + delta_ij(istate,jj,ii)*u_0(i) enddo enddo !$OMP END DO diff --git a/plugins/MRCC_Utils/mrcc_general.irp.f b/plugins/MRCC_Utils/mrcc_general.irp.f index 50343fdb..647caa63 100644 --- a/plugins/MRCC_Utils/mrcc_general.irp.f +++ b/plugins/MRCC_Utils/mrcc_general.irp.f @@ -35,8 +35,8 @@ subroutine mrcc_iterations ! lambda = min(1.d0, lambda * 1.1d0) ! endif ! print *, 'energy lambda ', lambda - E_past(j) = E_new - j +=1 +! E_past(j) = E_new +! j +=1 call save_wavefunction if (iteration > 200) then exit diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 80fdd4c7..ec4b5bf8 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -191,4 +191,3 @@ subroutine diagonalize_CI_dressed(lambda) SOFT_TOUCH psi_coef end - diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 30b161d4..4014e789 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -2,19 +2,47 @@ use bitmasks - BEGIN_PROVIDER [ double precision, delta_ij, (N_det_ref,N_det_non_ref,N_states) ] -&BEGIN_PROVIDER [ double precision, delta_ii, (N_det_ref,N_states) ] + + BEGIN_PROVIDER [ double precision, delta_ij, (N_states,N_det_non_ref,N_det_ref) ] +&BEGIN_PROVIDER [ double precision, delta_ii, (N_states, N_det_ref) ] use bitmasks implicit none + integer :: i, j, i_state -! delta_ij(:,:,:) = delta_ij_old(:,:,:) -! delta_ii(:,:) = delta_ii_old(:,:) - delta_ij(:,:,:) = delta_mrcepa0_ij(:,:,:)! - delta_sub_ij(:,:,:) - delta_ii(:,:)= delta_mrcepa0_ii(:,:)! - delta_sub_ii(:,:) + !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrsc2 sub + + do i_state = 1, N_states + + if(mrmode == 3) then + do i = 1, N_det_ref + delta_ii(i_state,i)= delta_mrcepa0_ii(i,i_state) - delta_sub_ii(i,i_state) + do j = 1, N_det_non_ref + delta_ij(i_state,j,i) = delta_mrcepa0_ij(i,j,i_state) - delta_sub_ij(i,j,i_state) + end do + end do + else if(mrmode == 2) then + do i = 1, N_det_ref + delta_ii(i_state,i)= delta_ii_old(i,i_state) + do j = 1, N_det_non_ref + delta_ij(i_state,j,i) = delta_ij_old(i,j,i_state) + end do + end do + else if(mrmode == 1) then + do i = 1, N_det_ref + delta_ii(i_state,i)= delta_mrcepa0_ii(i,i_state) + do j = 1, N_det_non_ref + delta_ij(i_state,j,i) = delta_mrcepa0_ij(i,j,i_state) + end do + end do + else + stop "invalid mrmode" + end if + end do END_PROVIDER + BEGIN_PROVIDER [ integer, cepa0_shortcut, (0:N_det_non_ref+1) ] &BEGIN_PROVIDER [ integer, det_cepa0_idx, (N_det_non_ref) ] &BEGIN_PROVIDER [ integer(bit_kind), det_cepa0_active, (N_det_non_ref) ] @@ -27,7 +55,6 @@ END_PROVIDER integer i, II, j, k logical, external :: detEq - print *, "provide cepa0" active_sorb(:) = 0_8 nonactive_sorb(:) = not(0_8) @@ -49,10 +76,6 @@ END_PROVIDER call sort_dets_ab(det_noactive, det_cepa0_idx, cepa0_shortcut, N_det_non_ref, N_int) -! do i=1, N_det_non_ref -! print "(B30,B30)", det_noactive(1,1,i), det_noactive(1,2,i) -! end do -! stop do i=1,N_det_ref det_ref_active(i) = iand(psi_ref(1,1,i), active_sorb(1)) det_ref_active(i) = det_ref_active(i) + iand(psi_ref(1,2,i), active_sorb(2)) * 2_8**32_8 @@ -83,17 +106,25 @@ END_PROVIDER use bitmasks implicit none integer :: i,j,k - double precision :: Hjk, Hki, Hij, mat(2,2) - integer i_state + double precision :: Hjk, Hki, Hij + integer i_state, degree provide lambda_mrcc i_state = 1 do i=1,N_det_ref do j=1,i + call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int) + if(degree /= 2 .and. degree /= 0) cycle delta_cas(i,j,i_state) = 0d0 do k=1,N_det_non_ref +! call get_excitation_degree(psi_ref(1,1,j), psi_non_ref(1,1,k), degree, N_int) +! if(degree /= 2) cycle +! call get_excitation_degree(psi_ref(1,1,i), psi_non_ref(1,1,k), degree, N_int) +! if(degree /= 2) cycle + call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,k),N_int,Hjk) call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki) + delta_cas(i,j,i_state) += Hjk * Hki * lambda_mrcc(i_state, k) end do delta_cas(j,i,i_state) = delta_cas(i,j,i_state) @@ -101,6 +132,9 @@ END_PROVIDER end do END_PROVIDER +!-199.0906497310625 +!-199.0913388716010 + logical function detEq(a,b,Nint) use bitmasks implicit none @@ -120,8 +154,8 @@ end function - BEGIN_PROVIDER [ double precision, delta_mrcepa0_ij, (N_det_ref,N_det_non_ref,N_states) ] -&BEGIN_PROVIDER [ double precision, delta_mrcepa0_ii, (N_det_ref,N_states) ] + BEGIN_PROVIDER [ double precision, delta_mrcepa0_ij_old, (N_det_ref,N_det_non_ref,N_states) ] +&BEGIN_PROVIDER [ double precision, delta_mrcepa0_ii_old, (N_det_ref,N_states) ] use bitmasks implicit none @@ -135,11 +169,14 @@ end function integer, allocatable :: idx_sorted_bit(:) integer, external :: get_index_in_psi_det_sorted_bit logical, external :: is_in_wavefunction + double precision, allocatable :: hab(:,:) integer :: II, blok provide det_cepa0_active delta_cas lambda_mrcc + + if(N_int /= 1) then print *, "mrcepa0 experimental N_int==1" stop @@ -148,7 +185,8 @@ end function i_state = 1 delta_mrcepa0_ii(:,:) = 0d0 delta_mrcepa0_ij(:,:,:) = 0d0 - + !allocate(hab(N_det_non_ref, N_det_non_ref)) +!hab(:,:) = 0d0 ! do i=1,N_det_ref ! delta_ii(i,i_state) = delta_cas(i,i,i_state) ! end do @@ -168,7 +206,7 @@ end function made_hole = iand(det_ref_active(II), xor(det_cepa0_active(i), det_ref_active(II))) made_particle = iand(det_cepa0_active(i), xor(det_cepa0_active(i), det_ref_active(II))) call get_excitation_degree(psi_ref(1,1,II),psi_non_ref(1,1,det_cepa0_idx(i)),degree,N_int) - if (degree > 2 .or. popcnt(made_hole) * popcnt(made_particle) /= degree*2) cycle + if (degree > 2 .or. popcnt(made_hole) + popcnt(made_particle) == 7650) cycle do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 if(iand(not(active_sorb(1)), xor(psi_non_ref(1,1,det_cepa0_idx(k)), psi_non_ref(1,1,det_cepa0_idx(i)))) /= 0) stop "STOOOP" @@ -185,19 +223,24 @@ end function !!!!! call get_excitation_degree(psi_ref(1,1,J),psi_non_ref(1,1,det_cepa0_idx(k)),degree,N_int) if(degree > 2) stop "BBBB" - !!!!!!!!! -! if(i/=k .and. popcnt(made_hole) /= popcnt(made_particle)) then -! print *, "=================", made_hole, made_particle -! call debug_det(psi_ref(1,1,II),N_int) -! call debug_det(psi_non_ref(1,1,det_cepa0_idx(i)),N_int) -! call debug_det(psi_ref(1,1,J),N_int) -! call debug_det(psi_non_ref(1,1,det_cepa0_idx(k)),N_int) -! print *, "=================" -! end if + call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,II),N_int,Hki) + !call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,Hki) - contrib = Hki * lambda_mrcc(i_state, det_cepa0_idx(k)) * delta_cas(II,J,i_state) + !contrib = Hki * lambda_mrcc(i_state, det_cepa0_idx(k)) * delta_cas(II,J,i_state)! * psi_ref_coef(II, I_state)*psi_ref_coef(J, I_state)/(psi_ref_coef(1, I_state)**2 + psi_ref_coef(2, I_state)**2) + contrib = Hki * lambda_mrcc(i_state, det_cepa0_idx(k)) * delta_cas(II,J,i_state)! * psi_ref_coef(II, I_state)*psi_ref_coef(J, I_state)/(psi_ref_coef(1, I_state)**2 + psi_ref_coef(2, I_state)**2) + + + ! (psi_ref_coef(II, I_state) * psi_ref_coef(J, I_state)) / (psi_ref_coef(1, I_state)**2 + psi_ref_coef(2, I_state)**2) +! if(hab(det_cepa0_idx(k), det_cepa0_idx(i)) /= 0) then +! print *, "HAB ", contrib, hab(det_cepa0_idx(k), det_cepa0_idx(i)) +! !contrib = 0d0 +! !stop +! else +! hab(det_cepa0_idx(k), det_cepa0_idx(i)) = contrib +! hab(det_cepa0_idx(i), det_cepa0_idx(k)) = contrib +! end if delta_mrcepa0_ij(II, det_cepa0_idx(i), i_state) += contrib ! if(dabs(psi_ref_coef(II,i_state)).ge.5.d-5) then @@ -222,6 +265,152 @@ END_PROVIDER + BEGIN_PROVIDER [ double precision, delta_mrcepa0_ij, (N_det_ref,N_det_non_ref,N_states) ] +&BEGIN_PROVIDER [ double precision, delta_mrcepa0_ii, (N_det_ref,N_states) ] + use bitmasks + implicit none + + integer :: i_state, i, i_I, J, k, degree, degree2, m, l, deg, ni + integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_ + logical :: ok + double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(1), HkI, ci_inv(1), dia_hla(1) + double precision :: contrib, HIIi, HJk + integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ + integer(bit_kind) :: det_tmp(N_int, 2), made_hole, made_particle, myActive + integer, allocatable :: idx_sorted_bit(:) + integer, external :: get_index_in_psi_det_sorted_bit + logical, external :: is_in_wavefunction + + integer :: II, blok + + provide det_cepa0_active delta_cas lambda_mrcc + + + + if(N_int /= 1) then + print *, "mrcepa0 experimental N_int==1" + stop + end if + + i_state = 1 + delta_mrcepa0_ii(:,:) = 0d0 + delta_mrcepa0_ij(:,:,:) = 0d0 + + + provide mo_bielec_integrals_in_map + allocate(idx_sorted_bit(N_det)) + + idx_sorted_bit(:) = -1 + do i=1,N_det_non_ref + idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i + enddo + !- qsd $OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_mrcepa0_ij, delta_mrcepa0_ii) + do blok=1,cepa0_shortcut(0) + do i=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 + do II=1,N_det_ref + + + call get_excitation_degree(psi_ref(1,1,II),psi_non_ref(1,1,det_cepa0_idx(i)),degree,N_int) + if (degree > 2 ) cycle + + made_hole = iand(det_ref_active(II), xor(det_cepa0_active(i), det_ref_active(II))) + made_particle = iand(det_cepa0_active(i), xor(det_cepa0_active(i), det_ref_active(II))) + + + + do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 + !if(i==k) cycle + if(iand(not(active_sorb(1)), xor(psi_non_ref(1,1,det_cepa0_idx(k)), psi_non_ref(1,1,det_cepa0_idx(i)))) /= 0) stop "STOOOP" + if(iand(made_hole, det_cepa0_active(k)) /= 0) cycle + if(iand(made_particle, det_cepa0_active(k)) /= made_particle) cycle + myActive = xor(det_cepa0_active(k), made_hole) + myActive = xor(myActive, made_particle) + if(i==k .and. myActive /= det_ref_active(II)) stop "AAAA" + do J=1,N_det_ref + if(det_ref_active(J) /= myActive) cycle + call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,HJk) + contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k)) + delta_mrcepa0_ij(J, det_cepa0_idx(i), i_state) += contrib + + if(dabs(psi_ref_coef(J,i_state)).ge.5.d-5) then + delta_mrcepa0_ii(J,i_state) -= contrib / psi_ref_coef(J, i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) + end if + end do + end do + end do + end do + end do + + deallocate(idx_sorted_bit) +END_PROVIDER + + + BEGIN_PROVIDER [ double precision, delta_mrcepa0_ij_exp, (N_det_ref,N_det_non_ref,N_states) ] +&BEGIN_PROVIDER [ double precision, delta_mrcepa0_ii_exp, (N_det_ref,N_states) ] + use bitmasks + implicit none + + integer :: i_state, i, i_I, J, k, degree, degree2, m, l, deg, ni + integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_ + logical :: ok + double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(1), HkI, ci_inv(1), dia_hla(1) + double precision :: contrib, HIIi, HJk + integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ + integer(bit_kind) :: det_tmp(N_int, 2), made_hole, made_particle, myActive + integer, allocatable :: idx_sorted_bit(:) + integer, external :: get_index_in_psi_det_sorted_bit + logical, external :: is_in_wavefunction + + integer :: II, blok + + provide det_cepa0_active delta_cas lambda_mrcc + + + print *, "mrcepa0 experimental" + if(N_int /= 1) then + print *, "mrcepa0 experimental N_int==1" + stop + end if + + i_state = 1 + delta_mrcepa0_ii_exp(:,:) = 0d0 + delta_mrcepa0_ij_exp(:,:,:) = 0d0 + + + provide mo_bielec_integrals_in_map + allocate(idx_sorted_bit(N_det)) + + idx_sorted_bit(:) = -1 + do i=1,N_det_non_ref + idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i + enddo + !- qsd $OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_mrcepa0_ii_exp, delta_mrcepa0_ij_exp) + do blok=1,cepa0_shortcut(0) + do i=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 + do II=1,N_det_ref + made_hole = iand(det_ref_active(II), xor(det_cepa0_active(i), det_ref_active(II))) + made_particle = iand(det_cepa0_active(i), xor(det_cepa0_active(i), det_ref_active(II))) + do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 + do J=1,N_det_ref + if(made_hole /= iand(det_ref_active(J), xor(det_cepa0_active(k), det_ref_active(J)))) cycle + if(made_particle /= iand(det_cepa0_active(k), xor(det_cepa0_active(k), det_ref_active(J)))) cycle + call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,HJk) + contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k)) + delta_mrcepa0_ij_exp(J, det_cepa0_idx(i), i_state) += contrib + + if(dabs(psi_ref_coef(J,i_state)).ge.5.d-5) then + delta_mrcepa0_ii_exp(J,i_state) -= contrib / psi_ref_coef(J, i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) + end if + end do + end do + end do + end do + end do + + deallocate(idx_sorted_bit) +END_PROVIDER + + BEGIN_PROVIDER [ double precision, delta_sub_ij, (N_det_ref,N_det_non_ref,N_states) ] &BEGIN_PROVIDER [ double precision, delta_sub_ii, (N_det_ref, N_states) ] use bitmasks @@ -260,7 +449,7 @@ END_PROVIDER !$OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_sub_ij, delta_sub_ii) do i=1,N_det_non_ref - if(mod(i,1000) == 0) print "(A,I3,A)", "♫ sloubi", i/1000, " ♪" + if(mod(i,1000) == 0) print "(A,I3,A)", "♫ sloubi", i/1000, " ♪ (sub)" do J=1,N_det_ref call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_Ji,degree,phase_Ji,N_int) if(degree == -1) cycle @@ -279,6 +468,8 @@ END_PROVIDER call i_h_j(psi_ref(1,1,II), det_tmp, N_int, HIl) do k=1,N_det_non_ref +! if(lambda_mrcc(i_state, k) == 0d0) cycle + if(lambda_mrcc(i_state, k) == 0d0) cycle call get_excitation(psi_ref(1,1,II),psi_non_ref(1,1,k),exc_Ik,degree2,phase_Ik,N_int) det_tmp(:,:) = 0_bit_kind @@ -295,42 +486,16 @@ END_PROVIDER if(ok) cycle -! call decode_exc(exc_Ii,degree,h1_,p1_,h2_,p2_,s1_,s2_) -! call decode_exc(exc_Ik,degree2,h1,p1,h2,p2,s1,s2) -! -! -! det_tmp(:,:) = 0_bit_kind -! call set_det_bit(det_tmp, p1, s1) -! call set_det_bit(det_tmp, h1, s1) -! call set_det_bit(det_tmp, p1_, s1_) -! call set_det_bit(det_tmp, h1_, s1_) -! if(degree == 2) then -! call set_det_bit(det_tmp, p2_, s2_) -! call set_det_bit(det_tmp, h2_, s2_) -! end if -! if(degree2 == 2) then -! call set_det_bit(det_tmp, p2, s2) -! call set_det_bit(det_tmp, h2, s2) -! end if -! deg = 0 -! do ni = 1, N_int -! deg += popcnt(det_tmp(ni,1)) + popcnt(det_tmp(ni,2)) -! end do -! if(deg == 2*degree2 + 2*degree) cycle - - - - - -! if(degree == -1) cycle call i_h_j(psi_ref(1,1,J), psi_non_ref(1,1,k), N_int, HJk) call i_h_j(psi_ref(1,1,II), psi_non_ref(1,1,k), N_int, HIk) if(HJk == 0) cycle !assert HIk == 0 + !delta_IJk = HJk * HIk * lambda_mrcc(i_state, k) delta_IJk = HJk * HIk * lambda_mrcc(i_state, k) call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) if(ok) cycle - contrib = delta_IJk * HIl * lambda_mrcc(i_state, l) +! contrib = delta_IJk * HIl * lambda_mrcc(i_state, l) + contrib = delta_IJk * HIl * lambda_mrcc(i_state,l) !$OMP CRITICAL delta_sub_ij(II, i, i_state) += contrib if(dabs(psi_ref_coef(II,i_state)).ge.5.d-5) then @@ -376,6 +541,7 @@ implicit none delta_ii_old(:,:) = 0 delta_ij_old(:,:,:) = 0 + i_state = 1 provide mo_bielec_integrals_in_map allocate(idx_sorted_bit(N_det)) @@ -387,7 +553,8 @@ implicit none !$OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_ij_old, delta_ii_old) do i = 1 , N_det_non_ref - if(mod(i,1000) == 0) print *, i, N_det_non_ref + if(lambda_mrcc(i_state, i) == 0d0) cycle + if(mod(i,1000) == 0) print "(A,I3,A)", "♫ sloubi", i/1000, " ♪ (old)" do i_I = 1 , N_det_ref call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,i),exc_iI,degree2,phase_iI,N_int) if(degree2 == -1) cycle @@ -396,12 +563,14 @@ implicit none call decode_exc(exc_iI,degree2,h1,p1,h2,p2,s1,s2) call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,i_I),N_int,hIi) - diI = hIi * lambda_mrcc(i_state,i) + diI = hIi * lambda_mrcc(i_state, i) do J = 1 , N_det_ref !!! call get_excitation(psi_ref(1,1,i_I),psi_ref(1,1,J),exc_IJ,degree,phase_IJ,N_int) call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,J),N_int,hJi) delta_JI = hJi * diI do k = 1 , N_det_non_ref + if(lambda_mrcc(i_state, k) == 0d0) cycle + call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,k),exc_Ik,degree,phase_Ik,N_int) if(degree == -1) cycle @@ -411,11 +580,6 @@ implicit none det_tmp(:,:) = 0_bit_kind det_tmp2(:,:) = 0_bit_kind - !!!!!!!!!!!!!!! - - - - det_tmp(1,1) = iand(xor(HF_bitmask(1,1), psi_non_ref(1,1,k)), not(active_sorb(1))) det_tmp(1,2) = iand(xor(HF_bitmask(1,1), psi_non_ref(1,1,i)), not(active_sorb(1))) @@ -427,60 +591,6 @@ implicit none if(.not. ok) cycle !if(ok) cycle - !!!!!!!!!!!!!! - - - -! call set_det_bit(det_tmp, p1, s1) -! -! call set_det_bit(det_tmp, p1_, s1_) -! -! if(degree == 2) then -! call set_det_bit(det_tmp, p2_, s2_) -! -! end if -! if(degree2 == 2) then -! call set_det_bit(det_tmp, p2, s2) -! end if -! -! x(:) = 0 -! do ni=1,N_int -! x(1) += popcnt(iand(det_tmp(ni, 1), cas_bitmask(ni, 1, 1))) -! x(2) += popcnt(iand(det_tmp(ni, 2), cas_bitmask(ni, 2, 1))) -! end do -! -! -! !det_tmp(:,:) = 0_bit_kind -! -! call set_det_bit(det_tmp, h1, s1) -! call set_det_bit(det_tmp, h1_, s1_) -! if(degree == 2) then -! call set_det_bit(det_tmp, h2_, s2_) -! end if -! if(degree2 == 2) then -! call set_det_bit(det_tmp, h2, s2) -! end if -! -! y(1) = -x(1) -! y(2) = -x(2) -! do ni=1,N_int -! y(1) += popcnt(iand(det_tmp(ni, 1), cas_bitmask(ni, 1, 1))) -! y(2) += popcnt(iand(det_tmp(ni, 2), cas_bitmask(ni, 2, 1))) -! end do -! -! ! print *, x, y -! -! if(x(1) * y(1) /= 0) cycle -! if(x(2) * y(2) /= 0) cycle -! -! -! -! deg = 0 -! do ni = 1, N_int -! deg += popcnt(det_tmp(ni,1)) + popcnt(det_tmp(ni,2)) -! end do -! if(deg /= 2*degree2 + 2*degree) cycle - call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) @@ -500,17 +610,22 @@ implicit none l = get_index_in_psi_det_sorted_bit(det_tmp, N_int) if(l == 0) cycle l = idx_sorted_bit(get_index_in_psi_det_sorted_bit(det_tmp, N_int)) - if(l ==-1) cycle + call i_h_j(psi_non_ref(1,1,k), psi_ref(1,1,i_I),N_int,HkI) - dkI(i_state) = HkI * lambda_mrcc(i_state,k) * phase_Jl * phase_Ik - + !dkI(i_state) = HkI * lambda_mrcc(i_state,k) * phase_Jl * phase_Ik * Xref(I_i) + dkI(i_state) = HkI * lambda_mrcc(i_state, k) * phase_Jl * phase_Ik + + !!!! + call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,k),exc_Ik,degree,phase_Ik,N_int) + if(degree /= 2 .and. degree /= 0) cycle + !!!!!! + !$OMP CRITICAL contrib = dkI(i_state) * delta_JI - !erro += abs(dkI(i_state) - psi_non_ref_coef(k,i_state) / psi_ref_coef(1,i_state)) delta_ij_old(i_I,l,i_state) += contrib if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(k,i_state) @@ -521,61 +636,24 @@ implicit none enddo enddo !$OMP END PARALLEL DO + +! double precision :: error, acc +! integer :: II +! error = 0d0 +! do i=1, N_det_non_ref +! acc = 0d0 +! do II=1, N_det_ref +! call i_h_j(psi_ref(1,1,II), psi_non_ref(1,1,i), N_int, HIi) +! acc += HIi * lambda_mrcc(i_state, i) * Xref(II) * psi_ref_coef(II, i_state) +! end do +! error += (psi_non_ref_coef(i, i_state) - acc)**2 +! end do +! print *, "QUALITY ", error + + deallocate(idx_sorted_bit) END_PROVIDER - - -subroutine apply_excitation(det, exc, res, ok, Nint) - use bitmasks - implicit none - - integer, intent(in) :: Nint - integer, intent(in) :: exc(0:2,2,2) - integer(bit_kind),intent(in) :: det(Nint, 2) - integer(bit_kind),intent(out) :: res(Nint, 2) - logical, intent(out) :: ok - integer :: h1,p1,h2,p2,s1,s2,degree - integer :: ii, pos - - - ok = .false. - degree = exc(0,1,1) + exc(0,1,2) - if(.not. (degree > 0 .and. degree <= 2)) then - print *, "apply ex" - STOP - endif - - call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) - res = det - - ii = (h1-1)/bit_kind_size + 1 - pos = mod(h1-1, 64)!iand(h1-1,bit_kind_size-1) ! mod 64 - if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) return - res(ii, s1) = ibclr(res(ii, s1), pos) - - ii = (p1-1)/bit_kind_size + 1 - pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) - if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) return - res(ii, s1) = ibset(res(ii, s1), pos) - - if(degree == 2) then - ii = (h2-1)/bit_kind_size + 1 - pos = mod(h2-1, 64)!iand(h2-1,bit_kind_size-1) - if(iand(det(ii, s2), ishft(1_bit_kind, pos)) == 0_8) return - res(ii, s2) = ibclr(res(ii, s2), pos) - - ii = (p2-1)/bit_kind_size + 1 - pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) - if(iand(det(ii, s2), ishft(1_bit_kind, pos)) /= 0_8) return - res(ii, s2) = ibset(res(ii, s2), pos) - endif - - ok = .true. -end subroutine - - - diff --git a/plugins/mrcepa0/mrcepa0.irp.f b/plugins/mrcepa0/mrcepa0.irp.f index b9eb2fc5..7877cdda 100644 --- a/plugins/mrcepa0/mrcepa0.irp.f +++ b/plugins/mrcepa0/mrcepa0.irp.f @@ -1,5 +1,7 @@ program mrcepa0 implicit none + !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrsc2 sub + mrmode = 1 if (.not.read_wf) then print *, 'read_wf has to be true.' stop 1 diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index 87ae25f3..b307ca85 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -4,6 +4,10 @@ subroutine run_mrcepa0 call mrcepa0_iterations end +BEGIN_PROVIDER [ integer, mrmode ] + +END_PROVIDER + subroutine mrcepa0_iterations implicit none @@ -11,12 +15,13 @@ subroutine mrcepa0_iterations double precision :: E_new, E_old, delta_e integer :: iteration,i_oscillations - double precision :: E_past(4) + double precision :: E_past(4), lambda E_new = 0.d0 delta_E = 1.d0 iteration = 0 j = 1 i_oscillations = 0 + lambda = 1.d0 do while (delta_E > 1.d-7) iteration += 1 print *, '===========================' @@ -25,29 +30,19 @@ subroutine mrcepa0_iterations print *, '' E_old = sum(ci_energy_dressed) call write_double(6,ci_energy_dressed(1),"MRCEPA0 energy") - call diagonalize_ci_dressed + call diagonalize_ci_dressed(lambda) E_new = sum(ci_energy_dressed) delta_E = dabs(E_new - E_old) - E_past(j) = E_new - j +=1 - if(j>4)then - j=1 - endif - if(iteration > 4) then - if(delta_E > 1.d-10)then - if(dabs(E_past(1) - E_past(3)) .le. delta_E .and. dabs(E_past(2) - E_past(4)).le. delta_E)then - print*,'OSCILLATIONS !!!' -! oscillations = .True. - i_oscillations +=1 - lambda_mrcc_tmp = lambda_mrcc - endif - endif - endif +! if (E_new > E_old) then +! lambda = lambda * 0.7d0 +! else +! lambda = min(1.d0, lambda * 1.1d0) +! endif +! print *, 'energy lambda ', lambda +! E_past(j) = E_new +! j +=1 call save_wavefunction -! if (i_oscillations > 5) then -! exit -! endif - if (iteration > 100) then + if (iteration > 200) then exit endif print*,'------------' @@ -55,7 +50,7 @@ subroutine mrcepa0_iterations do i = 1, N_det_ref print*,'' print*,'psi_ref_coef(i,1) = ',psi_ref_coef(i,1) - print*,'delta_ii(i,1) = ',delta_cas(i,i,1) + print*,'delta_ii(i,1) = ',delta_ii(i,1) enddo print*,'------------' enddo From 340b89b75467a5da3ea8c5f5a0922a85bfde3fb2 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 1 Apr 2016 14:29:06 +0200 Subject: [PATCH 005/216] removed test leftover in mrsc2 --- plugins/mrcepa0/dressing.irp.f | 7 ------- 1 file changed, 7 deletions(-) diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 4014e789..44c8ea0e 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -468,7 +468,6 @@ END_PROVIDER call i_h_j(psi_ref(1,1,II), det_tmp, N_int, HIl) do k=1,N_det_non_ref -! if(lambda_mrcc(i_state, k) == 0d0) cycle if(lambda_mrcc(i_state, k) == 0d0) cycle call get_excitation(psi_ref(1,1,II),psi_non_ref(1,1,k),exc_Ik,degree2,phase_Ik,N_int) @@ -589,7 +588,6 @@ implicit none det_tmp(1,2) = iand(xor(HF_bitmask(1,2), psi_non_ref(1,2,i)), not(active_sorb(2))) ok = ok .and. (popcnt(det_tmp(1,1)) + popcnt(det_tmp(1,2)) == popcnt(xor(det_tmp(1,1), det_tmp(1,2)))) if(.not. ok) cycle - !if(ok) cycle @@ -619,11 +617,6 @@ implicit none dkI(i_state) = HkI * lambda_mrcc(i_state, k) * phase_Jl * phase_Ik - !!!! - call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,k),exc_Ik,degree,phase_Ik,N_int) - if(degree /= 2 .and. degree /= 0) cycle - !!!!!! - !$OMP CRITICAL contrib = dkI(i_state) * delta_JI delta_ij_old(i_I,l,i_state) += contrib From cdb87937c868a685f490ca825c2f922a7527f7d7 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 1 Apr 2016 23:31:48 +0200 Subject: [PATCH 006/216] added missing files --- plugins/mrcepa0/mrsc2.irp.f | 26 ++++++++++++++++++++++++++ plugins/mrcepa0/mrsc2sub.irp.f | 26 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 plugins/mrcepa0/mrsc2.irp.f create mode 100644 plugins/mrcepa0/mrsc2sub.irp.f diff --git a/plugins/mrcepa0/mrsc2.irp.f b/plugins/mrcepa0/mrsc2.irp.f new file mode 100644 index 00000000..eb34adee --- /dev/null +++ b/plugins/mrcepa0/mrsc2.irp.f @@ -0,0 +1,26 @@ +program mrcepa0 + implicit none + !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrsc2 sub + mrmode = 2 + if (.not.read_wf) then + print *, 'read_wf has to be true.' + stop 1 + endif + call print_cas_coefs + call run_mrcepa0 +end + +subroutine print_cas_coefs + implicit none + + integer :: i,j + print *, 'CAS' + print *, '===' + do i=1,N_det_cas + print *, psi_cas_coef(i,:) + call debug_det(psi_cas(1,1,i),N_int) + enddo + + call write_double(6,ci_energy(1),"Initial CI energy") +end + diff --git a/plugins/mrcepa0/mrsc2sub.irp.f b/plugins/mrcepa0/mrsc2sub.irp.f new file mode 100644 index 00000000..524bbbd7 --- /dev/null +++ b/plugins/mrcepa0/mrsc2sub.irp.f @@ -0,0 +1,26 @@ +program mrcepa0 + implicit none + !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrsc2 sub + mrmode = 3 + if (.not.read_wf) then + print *, 'read_wf has to be true.' + stop 1 + endif + call print_cas_coefs + call run_mrcepa0 +end + +subroutine print_cas_coefs + implicit none + + integer :: i,j + print *, 'CAS' + print *, '===' + do i=1,N_det_cas + print *, psi_cas_coef(i,:) + call debug_det(psi_cas(1,1,i),N_int) + enddo + + call write_double(6,ci_energy(1),"Initial CI energy") +end + From a843dae541251b35a06473b52a7ee2216da06fc5 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 4 Apr 2016 15:51:32 +0200 Subject: [PATCH 007/216] fixed openmp + support for N_int and N_states > 1 --- plugins/MRCC_Utils/davidson.irp.f | 2 +- plugins/MRCC_Utils/mrcc_general.irp.f | 3 +- plugins/mrcepa0/dressing.irp.f | 691 ++++++++++---------------- plugins/mrcepa0/mrcepa0_general.irp.f | 29 +- 4 files changed, 296 insertions(+), 429 deletions(-) diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index c9dec40a..61a38c37 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -47,7 +47,7 @@ subroutine davidson_diag_mrcc(dets_in,u_in,energies,dim_in,sze,N_st,Nint,iunit,i !$OMP END DO !$OMP DO SCHEDULE(guided) do i=1,N_det_ref - H_jj(idx_ref(i)) += delta_ii(i,istate) + H_jj(idx_ref(i)) += delta_ii(istate,i) enddo !$OMP END DO !$OMP END PARALLEL diff --git a/plugins/MRCC_Utils/mrcc_general.irp.f b/plugins/MRCC_Utils/mrcc_general.irp.f index 647caa63..a0a4c895 100644 --- a/plugins/MRCC_Utils/mrcc_general.irp.f +++ b/plugins/MRCC_Utils/mrcc_general.irp.f @@ -25,6 +25,7 @@ subroutine mrcc_iterations print *, '===========================' print *, '' E_old = sum(ci_energy_dressed) + print *, iteration, ci_energy_dressed(1) call write_double(6,ci_energy_dressed(1),"MRCC energy") call diagonalize_ci_dressed(lambda) E_new = sum(ci_energy_dressed) @@ -38,7 +39,7 @@ subroutine mrcc_iterations ! E_past(j) = E_new ! j +=1 call save_wavefunction - if (iteration > 200) then + if (iteration > 0) then exit endif print*,'------------' diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 44c8ea0e..2010750e 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -12,7 +12,6 @@ use bitmasks !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrsc2 sub do i_state = 1, N_states - if(mrmode == 3) then do i = 1, N_det_ref delta_ii(i_state,i)= delta_mrcepa0_ii(i,i_state) - delta_sub_ii(i,i_state) @@ -45,59 +44,73 @@ END_PROVIDER BEGIN_PROVIDER [ integer, cepa0_shortcut, (0:N_det_non_ref+1) ] &BEGIN_PROVIDER [ integer, det_cepa0_idx, (N_det_non_ref) ] -&BEGIN_PROVIDER [ integer(bit_kind), det_cepa0_active, (N_det_non_ref) ] -&BEGIN_PROVIDER [ integer(bit_kind), det_ref_active, (N_det_ref) ] -&BEGIN_PROVIDER [ integer(bit_kind), active_sorb, (2) ] +&BEGIN_PROVIDER [ integer(bit_kind), det_cepa0_active, (N_int,2,N_det_non_ref) ] +&BEGIN_PROVIDER [ integer(bit_kind), det_ref_active, (N_int,2,N_det_ref) ] +&BEGIN_PROVIDER [ integer(bit_kind), active_sorb, (N_int,2) ] use bitmasks implicit none - integer(bit_kind) :: det_noactive(N_int, 2, N_det_non_ref), nonactive_sorb(2) + integer(bit_kind) :: det_noactive(N_int, 2, N_det_non_ref), nonactive_sorb(N_int,2) integer i, II, j, k logical, external :: detEq - active_sorb(:) = 0_8 - nonactive_sorb(:) = not(0_8) + active_sorb(:,:) = 0_8 + nonactive_sorb(:,:) = not(0_8) if(N_det_ref > 1) then do i=1, N_det_ref - active_sorb(1) = ior(psi_ref(1,1,i), active_sorb(1)) - active_sorb(2) = ior(psi_ref(1,2,i), active_sorb(2)) - nonactive_sorb(1) = iand(psi_ref(1,1,i), nonactive_sorb(1)) - nonactive_sorb(2) = iand(psi_ref(1,2,i), nonactive_sorb(2)) + do k=1, N_int + active_sorb(k,1) = ior(psi_ref(k,1,i), active_sorb(k,1)) + active_sorb(k,2) = ior(psi_ref(k,2,i), active_sorb(k,2)) + nonactive_sorb(k,1) = iand(psi_ref(k,1,i), nonactive_sorb(k,1)) + nonactive_sorb(k,2) = iand(psi_ref(k,2,i), nonactive_sorb(k,2)) + end do + end do + do k=1, N_int + active_sorb(k,1) = iand(active_sorb(k,1), not(nonactive_sorb(k,1))) + active_sorb(k,2) = iand(active_sorb(k,2), not(nonactive_sorb(k,2))) end do - active_sorb(1) = iand(active_sorb(1), not(nonactive_sorb(1))) - active_sorb(2) = iand(active_sorb(2), not(nonactive_sorb(2))) end if do i=1, N_det_non_ref - det_noactive(1,1,i) = iand(psi_non_ref(1,1,i), not(active_sorb(1))) - det_noactive(1,2,i) = iand(psi_non_ref(1,2,i), not(active_sorb(2))) + do k=1, N_int + det_noactive(k,1,i) = iand(psi_non_ref(k,1,i), not(active_sorb(k,1))) + det_noactive(k,2,i) = iand(psi_non_ref(k,2,i), not(active_sorb(k,2))) + end do end do call sort_dets_ab(det_noactive, det_cepa0_idx, cepa0_shortcut, N_det_non_ref, N_int) do i=1,N_det_ref - det_ref_active(i) = iand(psi_ref(1,1,i), active_sorb(1)) - det_ref_active(i) = det_ref_active(i) + iand(psi_ref(1,2,i), active_sorb(2)) * 2_8**32_8 + do k=1, N_int + det_ref_active(k,1,i) = iand(psi_ref(k,1,i), active_sorb(k,1)) + det_ref_active(k,2,i) = iand(psi_ref(k,2,i), active_sorb(k,2)) + !det_ref_active(i) = det_ref_active(i) + iand(psi_ref(1,2,i), active_sorb(2)) * 2_8**32_8 + end do end do cepa0_shortcut(0) = 1 cepa0_shortcut(1) = 1 - det_cepa0_active(1) = iand(psi_non_ref(1,1,det_cepa0_idx(1)), active_sorb(1)) - det_cepa0_active(1) = det_cepa0_active(1) + iand(psi_non_ref(1,2,det_cepa0_idx(1)), active_sorb(2)) * 2_8**32_8 + do k=1, N_int + det_cepa0_active(k,1,1) = iand(psi_non_ref(k,1,det_cepa0_idx(1)), active_sorb(k,1)) + det_cepa0_active(k,2,1) = iand(psi_non_ref(k,2,det_cepa0_idx(1)), active_sorb(k,2)) + !det_cepa0_active(1) = det_cepa0_active(1) + iand(psi_non_ref(1,2,det_cepa0_idx(1)), active_sorb(2)) * 2_8**32_8 + end do do i=2,N_det_non_ref - det_cepa0_active(i) = iand(psi_non_ref(1,1,det_cepa0_idx(i)), active_sorb(1)) - det_cepa0_active(i) = det_cepa0_active(i) + iand(psi_non_ref(1,2,det_cepa0_idx(i)), active_sorb(2)) * 2_8**32_8 + do k=1, N_int + det_cepa0_active(k,1,i) = iand(psi_non_ref(k,1,det_cepa0_idx(i)), active_sorb(k,1)) + det_cepa0_active(k,2,i) = iand(psi_non_ref(k,2,det_cepa0_idx(i)), active_sorb(k,2)) + end do +! det_cepa0_active(i) = iand(psi_non_ref(1,1,det_cepa0_idx(i)), active_sorb(1)) +! det_cepa0_active(i) = det_cepa0_active(i) + iand(psi_non_ref(1,2,det_cepa0_idx(i)), active_sorb(2)) * 2_8**32_8 if(.not. detEq(det_noactive(1,1,i), det_noactive(1,1,i-1), N_int)) then cepa0_shortcut(0) += 1 cepa0_shortcut(cepa0_shortcut(0)) = i end if end do - !cepa0_shortcut(0) += 1 cepa0_shortcut(cepa0_shortcut(0)+1) = N_det_non_ref+1 - END_PROVIDER @@ -110,30 +123,27 @@ END_PROVIDER integer i_state, degree provide lambda_mrcc - i_state = 1 - do i=1,N_det_ref - do j=1,i - call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int) - if(degree /= 2 .and. degree /= 0) cycle - delta_cas(i,j,i_state) = 0d0 - do k=1,N_det_non_ref -! call get_excitation_degree(psi_ref(1,1,j), psi_non_ref(1,1,k), degree, N_int) -! if(degree /= 2) cycle -! call get_excitation_degree(psi_ref(1,1,i), psi_non_ref(1,1,k), degree, N_int) -! if(degree /= 2) cycle - - call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,k),N_int,Hjk) - call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki) - - delta_cas(i,j,i_state) += Hjk * Hki * lambda_mrcc(i_state, k) + do i_state = 1, N_states + !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas) + do i=1,N_det_ref + do j=1,i + call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int) + if(degree /= 2 .and. degree /= 0) cycle + delta_cas(i,j,i_state) = 0d0 + do k=1,N_det_non_ref + + call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,k),N_int,Hjk) + call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki) + + delta_cas(i,j,i_state) += Hjk * Hki * lambda_mrcc(i_state, k) + end do + delta_cas(j,i,i_state) = delta_cas(i,j,i_state) end do - delta_cas(j,i,i_state) = delta_cas(i,j,i_state) end do + !$OMP END PARALLEL DO end do END_PROVIDER -!-199.0906497310625 -!-199.0913388716010 logical function detEq(a,b,Nint) use bitmasks @@ -154,117 +164,6 @@ end function - BEGIN_PROVIDER [ double precision, delta_mrcepa0_ij_old, (N_det_ref,N_det_non_ref,N_states) ] -&BEGIN_PROVIDER [ double precision, delta_mrcepa0_ii_old, (N_det_ref,N_states) ] - use bitmasks - implicit none - - integer :: i_state, i, i_I, J, k, degree, degree2, m, l, deg, ni - integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_ - logical :: ok - double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(1), HkI, ci_inv(1), dia_hla(1) - double precision :: contrib - integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ - integer(bit_kind) :: det_tmp(N_int, 2), made_hole, made_particle, myActive - integer, allocatable :: idx_sorted_bit(:) - integer, external :: get_index_in_psi_det_sorted_bit - logical, external :: is_in_wavefunction - double precision, allocatable :: hab(:,:) - - integer :: II, blok - - provide det_cepa0_active delta_cas lambda_mrcc - - - - if(N_int /= 1) then - print *, "mrcepa0 experimental N_int==1" - stop - end if - - i_state = 1 - delta_mrcepa0_ii(:,:) = 0d0 - delta_mrcepa0_ij(:,:,:) = 0d0 - !allocate(hab(N_det_non_ref, N_det_non_ref)) -!hab(:,:) = 0d0 -! do i=1,N_det_ref -! delta_ii(i,i_state) = delta_cas(i,i,i_state) -! end do - - provide mo_bielec_integrals_in_map - allocate(idx_sorted_bit(N_det)) - - idx_sorted_bit(:) = -1 - do i=1,N_det_non_ref - idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i - enddo - !- qsd $OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_ij, delta_ii) - do blok=1,cepa0_shortcut(0) - do i=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 - do II=1,N_det_ref - - made_hole = iand(det_ref_active(II), xor(det_cepa0_active(i), det_ref_active(II))) - made_particle = iand(det_cepa0_active(i), xor(det_cepa0_active(i), det_ref_active(II))) - call get_excitation_degree(psi_ref(1,1,II),psi_non_ref(1,1,det_cepa0_idx(i)),degree,N_int) - if (degree > 2 .or. popcnt(made_hole) + popcnt(made_particle) == 7650) cycle - - do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 - if(iand(not(active_sorb(1)), xor(psi_non_ref(1,1,det_cepa0_idx(k)), psi_non_ref(1,1,det_cepa0_idx(i)))) /= 0) stop "STOOOP" - !do k=1,N_det_non_ref - if(iand(made_hole, det_cepa0_active(k)) /= 0) cycle - if(iand(made_particle, det_cepa0_active(k)) /= made_particle) cycle - myActive = xor(det_cepa0_active(k), made_hole) - myActive = xor(myActive, made_particle) - if(i==k .and. myActive /= det_ref_active(II)) stop "AAAA" - !if(i==k) print *, "i=k" - do J=1,N_det_ref - if(det_ref_active(J) /= myActive) cycle - - !!!!! - call get_excitation_degree(psi_ref(1,1,J),psi_non_ref(1,1,det_cepa0_idx(k)),degree,N_int) - if(degree > 2) stop "BBBB" - - - call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,II),N_int,Hki) - !call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,Hki) - - !contrib = Hki * lambda_mrcc(i_state, det_cepa0_idx(k)) * delta_cas(II,J,i_state)! * psi_ref_coef(II, I_state)*psi_ref_coef(J, I_state)/(psi_ref_coef(1, I_state)**2 + psi_ref_coef(2, I_state)**2) - contrib = Hki * lambda_mrcc(i_state, det_cepa0_idx(k)) * delta_cas(II,J,i_state)! * psi_ref_coef(II, I_state)*psi_ref_coef(J, I_state)/(psi_ref_coef(1, I_state)**2 + psi_ref_coef(2, I_state)**2) - - - ! (psi_ref_coef(II, I_state) * psi_ref_coef(J, I_state)) / (psi_ref_coef(1, I_state)**2 + psi_ref_coef(2, I_state)**2) -! if(hab(det_cepa0_idx(k), det_cepa0_idx(i)) /= 0) then -! print *, "HAB ", contrib, hab(det_cepa0_idx(k), det_cepa0_idx(i)) -! !contrib = 0d0 -! !stop -! else -! hab(det_cepa0_idx(k), det_cepa0_idx(i)) = contrib -! hab(det_cepa0_idx(i), det_cepa0_idx(k)) = contrib -! end if - delta_mrcepa0_ij(II, det_cepa0_idx(i), i_state) += contrib -! - if(dabs(psi_ref_coef(II,i_state)).ge.5.d-5) then - !-$OMP CRITICAL - delta_mrcepa0_ii(II,i_state) -= contrib / psi_ref_coef(II, i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) - !-$OMP END CRITICAL - endif - end do - end do - end do - end do - end do - !- qs $OMP END PARALLEL DO - !print *, "MMMMMMMMMM ", delta_cas(2,2,i_state) , delta_ii(2,i_state) -! do i=1,N_det_ref -! delta_cas(i,i,i_state) += delta_ii(i,i_state) -! end do - - deallocate(idx_sorted_bit) -END_PROVIDER - - - - BEGIN_PROVIDER [ double precision, delta_mrcepa0_ij, (N_det_ref,N_det_non_ref,N_states) ] &BEGIN_PROVIDER [ double precision, delta_mrcepa0_ii, (N_det_ref,N_states) ] use bitmasks @@ -276,7 +175,7 @@ END_PROVIDER double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(1), HkI, ci_inv(1), dia_hla(1) double precision :: contrib, HIIi, HJk integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ - integer(bit_kind) :: det_tmp(N_int, 2), made_hole, made_particle, myActive + integer(bit_kind) :: det_tmp(N_int, 2), made_hole(N_int,2), made_particle(N_int,2), myActive(N_int,2) integer, allocatable :: idx_sorted_bit(:) integer, external :: get_index_in_psi_det_sorted_bit logical, external :: is_in_wavefunction @@ -284,19 +183,6 @@ END_PROVIDER integer :: II, blok provide det_cepa0_active delta_cas lambda_mrcc - - - - if(N_int /= 1) then - print *, "mrcepa0 experimental N_int==1" - stop - end if - - i_state = 1 - delta_mrcepa0_ii(:,:) = 0d0 - delta_mrcepa0_ij(:,:,:) = 0d0 - - provide mo_bielec_integrals_in_map allocate(idx_sorted_bit(N_det)) @@ -304,109 +190,71 @@ END_PROVIDER do i=1,N_det_non_ref idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i enddo - !- qsd $OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_mrcepa0_ij, delta_mrcepa0_ii) - do blok=1,cepa0_shortcut(0) - do i=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 - do II=1,N_det_ref - - - call get_excitation_degree(psi_ref(1,1,II),psi_non_ref(1,1,det_cepa0_idx(i)),degree,N_int) - if (degree > 2 ) cycle - - made_hole = iand(det_ref_active(II), xor(det_cepa0_active(i), det_ref_active(II))) - made_particle = iand(det_cepa0_active(i), xor(det_cepa0_active(i), det_ref_active(II))) - - - - do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 - !if(i==k) cycle - if(iand(not(active_sorb(1)), xor(psi_non_ref(1,1,det_cepa0_idx(k)), psi_non_ref(1,1,det_cepa0_idx(i)))) /= 0) stop "STOOOP" - if(iand(made_hole, det_cepa0_active(k)) /= 0) cycle - if(iand(made_particle, det_cepa0_active(k)) /= made_particle) cycle - myActive = xor(det_cepa0_active(k), made_hole) - myActive = xor(myActive, made_particle) - if(i==k .and. myActive /= det_ref_active(II)) stop "AAAA" - do J=1,N_det_ref - if(det_ref_active(J) /= myActive) cycle - call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,HJk) - contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k)) - delta_mrcepa0_ij(J, det_cepa0_idx(i), i_state) += contrib - - if(dabs(psi_ref_coef(J,i_state)).ge.5.d-5) then - delta_mrcepa0_ii(J,i_state) -= contrib / psi_ref_coef(J, i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) - end if + + + do i_state = 1, N_states + delta_mrcepa0_ii(:,:) = 0d0 + delta_mrcepa0_ij(:,:,:) = 0d0 + + !$OMP PARALLEL DO default(none) schedule(dynamic) shared(delta_mrcepa0_ij, delta_mrcepa0_ii) & + !$OMP private(i,II,J,k,degree,myActive,made_hole,made_particle,hjk,contrib) & + !$OMP shared(active_sorb, psi_non_ref, psi_non_ref_coef, psi_ref, psi_ref_coef, cepa0_shortcut, det_cepa0_active) & + !$OMP shared(N_det_ref, N_det_non_ref,N_int,det_cepa0_idx,lambda_mrcc,det_ref_active, delta_cas) & + !$OMP shared(i_state) + do blok=1,cepa0_shortcut(0) + do i=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 + do II=1,N_det_ref + call get_excitation_degree(psi_ref(1,1,II),psi_non_ref(1,1,det_cepa0_idx(i)),degree,N_int) + if (degree > 2 ) cycle + + do ni=1,N_int + made_hole(ni,1) = iand(det_ref_active(ni,1,II), xor(det_cepa0_active(ni,1,i), det_ref_active(ni,1,II))) + made_hole(ni,2) = iand(det_ref_active(ni,2,II), xor(det_cepa0_active(ni,2,i), det_ref_active(ni,2,II))) + !made_particle = iand(det_cepa0_active(i), xor(det_cepa0_active(i), det_ref_active(II))) + made_particle(ni,1) = iand(det_cepa0_active(ni,1,i), xor(det_cepa0_active(ni,1,i), det_ref_active(ni,1,II))) + made_particle(ni,2) = iand(det_cepa0_active(ni,2,i), xor(det_cepa0_active(ni,2,i), det_ref_active(ni,2,II))) end do + + + kloop: do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 + if(lambda_mrcc(i_state, det_cepa0_idx(k)) == 0d0) cycle + + do ni=1,N_int + if(iand(made_hole(ni,1), det_cepa0_active(ni,1,k)) /= 0) cycle kloop + if(iand(made_particle(ni,1), det_cepa0_active(ni,1,k)) /= made_particle(ni,1)) cycle kloop + if(iand(made_hole(ni,2), det_cepa0_active(ni,2,k)) /= 0) cycle kloop + if(iand(made_particle(ni,2), det_cepa0_active(ni,2,k)) /= made_particle(ni,2)) cycle kloop + end do + do ni=1,N_int + myActive(ni,1) = xor(det_cepa0_active(ni,1,k), made_hole(ni,1)) + myActive(ni,1) = xor(myActive(ni,1), made_particle(ni,1)) + myActive(ni,2) = xor(det_cepa0_active(ni,2,k), made_hole(ni,2)) + myActive(ni,2) = xor(myActive(ni,2), made_particle(ni,2)) + end do + + jloop: do J=1,N_det_ref + do ni=1,N_int !!! replace with sort+search + if(det_ref_active(ni,1,J) /= myActive(ni,1)) cycle jloop + if(det_ref_active(ni,2,J) /= myActive(ni,2)) cycle jloop + end do + call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,HJk) + contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k)) + !$OMP ATOMIC + delta_mrcepa0_ij(J, det_cepa0_idx(i), i_state) += contrib + + if(dabs(psi_ref_coef(J,i_state)).ge.5.d-5) then + !$OMP ATOMIC + delta_mrcepa0_ii(J,i_state) -= contrib / psi_ref_coef(J, i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) + end if + + exit + end do jloop + end do kloop end do end do - end do - end do - - deallocate(idx_sorted_bit) -END_PROVIDER - - - BEGIN_PROVIDER [ double precision, delta_mrcepa0_ij_exp, (N_det_ref,N_det_non_ref,N_states) ] -&BEGIN_PROVIDER [ double precision, delta_mrcepa0_ii_exp, (N_det_ref,N_states) ] - use bitmasks - implicit none - - integer :: i_state, i, i_I, J, k, degree, degree2, m, l, deg, ni - integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_ - logical :: ok - double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(1), HkI, ci_inv(1), dia_hla(1) - double precision :: contrib, HIIi, HJk - integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ - integer(bit_kind) :: det_tmp(N_int, 2), made_hole, made_particle, myActive - integer, allocatable :: idx_sorted_bit(:) - integer, external :: get_index_in_psi_det_sorted_bit - logical, external :: is_in_wavefunction - - integer :: II, blok - - provide det_cepa0_active delta_cas lambda_mrcc - - - print *, "mrcepa0 experimental" - if(N_int /= 1) then - print *, "mrcepa0 experimental N_int==1" - stop - end if - - i_state = 1 - delta_mrcepa0_ii_exp(:,:) = 0d0 - delta_mrcepa0_ij_exp(:,:,:) = 0d0 - - - provide mo_bielec_integrals_in_map - allocate(idx_sorted_bit(N_det)) - - idx_sorted_bit(:) = -1 - do i=1,N_det_non_ref - idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i - enddo - !- qsd $OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_mrcepa0_ii_exp, delta_mrcepa0_ij_exp) - do blok=1,cepa0_shortcut(0) - do i=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 - do II=1,N_det_ref - made_hole = iand(det_ref_active(II), xor(det_cepa0_active(i), det_ref_active(II))) - made_particle = iand(det_cepa0_active(i), xor(det_cepa0_active(i), det_ref_active(II))) - do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 - do J=1,N_det_ref - if(made_hole /= iand(det_ref_active(J), xor(det_cepa0_active(k), det_ref_active(J)))) cycle - if(made_particle /= iand(det_cepa0_active(k), xor(det_cepa0_active(k), det_ref_active(J)))) cycle - call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,HJk) - contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k)) - delta_mrcepa0_ij_exp(J, det_cepa0_idx(i), i_state) += contrib - - if(dabs(psi_ref_coef(J,i_state)).ge.5.d-5) then - delta_mrcepa0_ii_exp(J,i_state) -= contrib / psi_ref_coef(J, i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) - end if - end do - end do end do + !$OMP END PARALLEL DO end do - end do - deallocate(idx_sorted_bit) END_PROVIDER @@ -416,7 +264,7 @@ END_PROVIDER use bitmasks implicit none - integer :: i_state, i, i_I, J, k, degree, degree2, m, l, deg, ni + integer :: i_state, i, i_I, J, k, degree, degree2, l, deg, ni integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_ logical :: ok double precision :: phase_Ji, phase_Ik, phase_Ii @@ -428,84 +276,86 @@ END_PROVIDER integer :: II, blok - provide det_cepa0_active delta_cas lambda_mrcc - - if(N_int /= 1) then - print *, "mrsc2 experimental N_int==1" - stop - end if - - i_state = 1 - delta_sub_ij(:,:,:) = 0d0 - delta_sub_ii(:,:) = 0d0 - - provide mo_bielec_integrals_in_map + provide delta_cas lambda_mrcc allocate(idx_sorted_bit(N_det)) - idx_sorted_bit(:) = -1 do i=1,N_det_non_ref idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i enddo - - !$OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_sub_ij, delta_sub_ii) - do i=1,N_det_non_ref - if(mod(i,1000) == 0) print "(A,I3,A)", "♫ sloubi", i/1000, " ♪ (sub)" - do J=1,N_det_ref - call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_Ji,degree,phase_Ji,N_int) - if(degree == -1) cycle - - - do II=1,N_det_ref - call apply_excitation(psi_ref(1,1,II),exc_Ji,det_tmp,ok,N_int) - !call get_excitation(psi_ref(1,1,II),psi_non_ref(1,1,i),exc_Ii,degree,phase_Ii,N_int) + + do i_state = 1, N_states + delta_sub_ij(:,:,:) = 0d0 + delta_sub_ii(:,:) = 0d0 + + provide mo_bielec_integrals_in_map + + + !$OMP PARALLEL DO default(none) schedule(dynamic,10) shared(delta_sub_ij, delta_sub_ii) & + !$OMP private(i, J, k, degree, degree2, l, deg, ni) & + !$OMP private(p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_) & + !$OMP private(ok, phase_Ji, phase_Ik, phase_Ii, contrib, delta_IJk, HJk, HIk, HIl, exc_Ik, exc_Ji, exc_Ii) & + !$OMP private(det_tmp, det_tmp2, II, blok) & + !$OMP shared(idx_sorted_bit, N_det_non_ref, N_det_ref, N_int, psi_non_ref, psi_non_ref_coef, psi_ref, psi_ref_coef) & + !$OMP shared(i_state,lambda_mrcc, hf_bitmask, active_sorb) + do i=1,N_det_non_ref + if(mod(i,1000) == 0) print *, i, "/", N_det_non_ref + do J=1,N_det_ref + call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_Ji,degree,phase_Ji,N_int) + if(degree == -1) cycle - if(.not. ok) cycle - l = get_index_in_psi_det_sorted_bit(det_tmp, N_int) - if(l == 0) cycle - l = idx_sorted_bit(l) - if(psi_non_ref(1,1,l) /= det_tmp(1,1)) stop "sdf" - call i_h_j(psi_ref(1,1,II), det_tmp, N_int, HIl) - - do k=1,N_det_non_ref - if(lambda_mrcc(i_state, k) == 0d0) cycle - call get_excitation(psi_ref(1,1,II),psi_non_ref(1,1,k),exc_Ik,degree2,phase_Ik,N_int) + do II=1,N_det_ref + call apply_excitation(psi_ref(1,1,II),exc_Ji,det_tmp,ok,N_int) + !call get_excitation(psi_ref(1,1,II),psi_non_ref(1,1,i),exc_Ii,degree,phase_Ii,N_int) - det_tmp(:,:) = 0_bit_kind - det_tmp2(:,:) = 0_bit_kind + if(.not. ok) cycle + l = get_index_in_psi_det_sorted_bit(det_tmp, N_int) + if(l == 0) cycle + l = idx_sorted_bit(l) - det_tmp(1,1) = iand(xor(HF_bitmask(1,1), psi_non_ref(1,1,k)), not(active_sorb(1))) - det_tmp(1,2) = iand(xor(HF_bitmask(1,1), psi_non_ref(1,1,i)), not(active_sorb(1))) - ok = (popcnt(det_tmp(1,1)) + popcnt(det_tmp(1,2)) == popcnt(xor(det_tmp(1,1), det_tmp(1,2)))) + call i_h_j(psi_ref(1,1,II), det_tmp, N_int, HIl) + + do k=1,N_det_non_ref + if(lambda_mrcc(i_state, k) == 0d0) cycle + call get_excitation(psi_ref(1,1,II),psi_non_ref(1,1,k),exc_Ik,degree2,phase_Ik,N_int) + + det_tmp(:,:) = 0_bit_kind + det_tmp2(:,:) = 0_bit_kind + + ok = .true. + do ni=1,N_int + det_tmp(ni,1) = iand(xor(HF_bitmask(ni,1), psi_non_ref(ni,1,k)), not(active_sorb(ni,1))) + det_tmp(ni,2) = iand(xor(HF_bitmask(ni,1), psi_non_ref(ni,1,i)), not(active_sorb(ni,1))) + ok = ok .and. (popcnt(det_tmp(ni,1)) + popcnt(det_tmp(ni,2)) == popcnt(xor(det_tmp(ni,1), det_tmp(ni,2)))) - det_tmp(1,1) = iand(xor(HF_bitmask(1,2), psi_non_ref(1,2,k)), not(active_sorb(2))) - det_tmp(1,2) = iand(xor(HF_bitmask(1,2), psi_non_ref(1,2,i)), not(active_sorb(2))) - ok = ok .and. (popcnt(det_tmp(1,1)) + popcnt(det_tmp(1,2)) == popcnt(xor(det_tmp(1,1), det_tmp(1,2)))) - - if(ok) cycle - - - call i_h_j(psi_ref(1,1,J), psi_non_ref(1,1,k), N_int, HJk) - call i_h_j(psi_ref(1,1,II), psi_non_ref(1,1,k), N_int, HIk) - if(HJk == 0) cycle - !assert HIk == 0 - !delta_IJk = HJk * HIk * lambda_mrcc(i_state, k) - delta_IJk = HJk * HIk * lambda_mrcc(i_state, k) - call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) - if(ok) cycle -! contrib = delta_IJk * HIl * lambda_mrcc(i_state, l) - contrib = delta_IJk * HIl * lambda_mrcc(i_state,l) - !$OMP CRITICAL - delta_sub_ij(II, i, i_state) += contrib - if(dabs(psi_ref_coef(II,i_state)).ge.5.d-5) then - delta_sub_ii(II,i_state) -= contrib / psi_ref_coef(II, i_state) * psi_non_ref_coef(l,i_state) - endif - !$OMP END CRITICAL + det_tmp(ni,1) = iand(xor(HF_bitmask(ni,2), psi_non_ref(ni,2,k)), not(active_sorb(ni,2))) + det_tmp(ni,2) = iand(xor(HF_bitmask(ni,2), psi_non_ref(ni,2,i)), not(active_sorb(ni,2))) + ok = ok .and. (popcnt(det_tmp(ni,1)) + popcnt(det_tmp(ni,2)) == popcnt(xor(det_tmp(ni,1), det_tmp(ni,2)))) + end do + + if(ok) cycle + + + call i_h_j(psi_ref(1,1,J), psi_non_ref(1,1,k), N_int, HJk) + call i_h_j(psi_ref(1,1,II), psi_non_ref(1,1,k), N_int, HIk) + if(HJk == 0) cycle + !assert HIk == 0 + delta_IJk = HJk * HIk * lambda_mrcc(i_state, k) + call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) + if(ok) cycle + contrib = delta_IJk * HIl * lambda_mrcc(i_state,l) + !$OMP ATOMIC + delta_sub_ij(II, i, i_state) += contrib + if(dabs(psi_ref_coef(II,i_state)).ge.5.d-5) then + !$OMP ATOMIC + delta_sub_ii(II,i_state) -= contrib / psi_ref_coef(II, i_state) * psi_non_ref_coef(l,i_state) + endif + end do end do end do end do + !$OMP END PARALLEL DO end do - !$OMP END PARALLEL DO deallocate(idx_sorted_bit) END_PROVIDER @@ -527,9 +377,9 @@ end subroutine implicit none integer :: i_state, i, i_I, J, k, degree, degree2, m, l, deg, ni - integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_, x(2), y(2) + integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_ logical :: ok - double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(1), HkI, ci_inv(1), dia_hla(1) + double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(N_states), HkI, ci_inv(N_states), dia_hla(N_states) double precision :: contrib integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2) @@ -537,12 +387,7 @@ implicit none integer, external :: get_index_in_psi_det_sorted_bit logical, external :: is_in_wavefunction - delta_ii_old(:,:) = 0 - delta_ij_old(:,:,:) = 0 - - - i_state = 1 - provide mo_bielec_integrals_in_map + provide mo_bielec_integrals_in_map allocate(idx_sorted_bit(N_det)) idx_sorted_bit(:) = -1 @@ -550,100 +395,102 @@ implicit none idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i enddo - !$OMP PARALLEL DO schedule(dynamic,10) default(firstprivate) shared(delta_ij_old, delta_ii_old) - do i = 1 , N_det_non_ref - if(lambda_mrcc(i_state, i) == 0d0) cycle - if(mod(i,1000) == 0) print "(A,I3,A)", "♫ sloubi", i/1000, " ♪ (old)" - do i_I = 1 , N_det_ref - call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,i),exc_iI,degree2,phase_iI,N_int) - if(degree2 == -1) cycle + + + + do i_state = 1, N_states + + delta_ii_old(:,:) = 0 + delta_ij_old(:,:,:) = 0 + + !$OMP PARALLEL DO default(none) schedule(dynamic,10) shared(delta_ij_old, delta_ii_old) & + !$OMP private(i, J, k, degree, degree2, l, deg, ni) & + !$OMP private(ok,p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_) & + !$OMP private(phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI, HkI, ci_inv, dia_hla) & + !$OMP private(contrib, exc_iI, exc_Ik, exc_IJ, det_tmp, det_tmp2) & + !$OMP shared(idx_sorted_bit, N_det_non_ref, N_det_ref, N_int, psi_non_ref, psi_non_ref_coef, psi_ref, psi_ref_coef) & + !$OMP shared(i_state, lambda_mrcc, hf_bitmask, active_sorb) + do i = 1 , N_det_non_ref + if(mod(i,1000) == 0) print *, i, "/", N_det_non_ref + if(lambda_mrcc(i_state, i) == 0d0) cycle + do i_I = 1 , N_det_ref + call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,i),exc_iI,degree2,phase_iI,N_int) + if(degree2 == -1) cycle ci_inv(i_state) = 1.d0 / psi_ref_coef(i_I,i_state) - call decode_exc(exc_iI,degree2,h1,p1,h2,p2,s1,s2) - - call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,i_I),N_int,hIi) - diI = hIi * lambda_mrcc(i_state, i) - do J = 1 , N_det_ref !!! - call get_excitation(psi_ref(1,1,i_I),psi_ref(1,1,J),exc_IJ,degree,phase_IJ,N_int) - call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,J),N_int,hJi) - delta_JI = hJi * diI - do k = 1 , N_det_non_ref - if(lambda_mrcc(i_state, k) == 0d0) cycle - - call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,k),exc_Ik,degree,phase_Ik,N_int) - if(degree == -1) cycle + call decode_exc(exc_iI,degree2,h1,p1,h2,p2,s1,s2) + + call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,i_I),N_int,hIi) + diI = hIi * lambda_mrcc(i_state, i) + do J = 1 , N_det_ref !!! + call get_excitation(psi_ref(1,1,i_I),psi_ref(1,1,J),exc_IJ,degree,phase_IJ,N_int) + call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,J),N_int,hJi) + delta_JI = hJi * diI + do k = 1 , N_det_non_ref + if(lambda_mrcc(i_state, k) == 0d0) cycle + + call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,k),exc_Ik,degree,phase_Ik,N_int) + if(degree == -1) cycle - call decode_exc(exc_Ik,degree,h1_,p1_,h2_,p2_,s1_,s2_) + call decode_exc(exc_Ik,degree,h1_,p1_,h2_,p2_,s1_,s2_) - - det_tmp(:,:) = 0_bit_kind - det_tmp2(:,:) = 0_bit_kind - - - det_tmp(1,1) = iand(xor(HF_bitmask(1,1), psi_non_ref(1,1,k)), not(active_sorb(1))) - det_tmp(1,2) = iand(xor(HF_bitmask(1,1), psi_non_ref(1,1,i)), not(active_sorb(1))) - ok = (popcnt(det_tmp(1,1)) + popcnt(det_tmp(1,2)) == popcnt(xor(det_tmp(1,1), det_tmp(1,2)))) - - det_tmp(1,1) = iand(xor(HF_bitmask(1,2), psi_non_ref(1,2,k)), not(active_sorb(2))) - det_tmp(1,2) = iand(xor(HF_bitmask(1,2), psi_non_ref(1,2,i)), not(active_sorb(2))) - ok = ok .and. (popcnt(det_tmp(1,1)) + popcnt(det_tmp(1,2)) == popcnt(xor(det_tmp(1,1), det_tmp(1,2)))) - if(.not. ok) cycle - - - - call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) - - call get_excitation(psi_non_ref(1,1,i), det_tmp, exc_Ik, degree, phase_al, N_int) + + det_tmp(:,:) = 0_bit_kind + det_tmp2(:,:) = 0_bit_kind + + ok = .true. + do ni=1,N_int + det_tmp(ni,1) = iand(xor(HF_bitmask(ni,1), psi_non_ref(ni,1,k)), not(active_sorb(ni,1))) + det_tmp(ni,2) = iand(xor(HF_bitmask(ni,1), psi_non_ref(ni,1,i)), not(active_sorb(ni,1))) + ok = ok .and. (popcnt(det_tmp(ni,1)) + popcnt(det_tmp(ni,2)) == popcnt(xor(det_tmp(ni,1), det_tmp(ni,2)))) + + det_tmp(ni,1) = iand(xor(HF_bitmask(ni,2), psi_non_ref(ni,2,k)), not(active_sorb(ni,2))) + det_tmp(ni,2) = iand(xor(HF_bitmask(ni,2), psi_non_ref(ni,2,i)), not(active_sorb(ni,2))) + ok = ok .and. (popcnt(det_tmp(ni,1)) + popcnt(det_tmp(ni,2)) == popcnt(xor(det_tmp(ni,1), det_tmp(ni,2)))) + end do + + if(.not. ok) cycle + + + + call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) + + call get_excitation(psi_non_ref(1,1,i), det_tmp, exc_Ik, degree, phase_al, N_int) - - if(.not. ok) cycle - if(is_in_wavefunction(det_tmp, N_int)) cycle - + + if(.not. ok) cycle + if(is_in_wavefunction(det_tmp, N_int)) cycle + - call apply_excitation(psi_ref(1,1,J),exc_Ik,det_tmp,ok,N_int) - if(.not. ok) cycle - - call get_excitation(psi_ref(1,1,J), det_tmp, exc_Ik, degree, phase_Jl, N_int) - - l = get_index_in_psi_det_sorted_bit(det_tmp, N_int) - if(l == 0) cycle - l = idx_sorted_bit(get_index_in_psi_det_sorted_bit(det_tmp, N_int)) - if(l ==-1) cycle - - + call apply_excitation(psi_ref(1,1,J),exc_Ik,det_tmp,ok,N_int) + if(.not. ok) cycle + + call get_excitation(psi_ref(1,1,J), det_tmp, exc_Ik, degree, phase_Jl, N_int) + + l = get_index_in_psi_det_sorted_bit(det_tmp, N_int) + if(l == 0) cycle + l = idx_sorted_bit(get_index_in_psi_det_sorted_bit(det_tmp, N_int)) + if(l ==-1) cycle + + - call i_h_j(psi_non_ref(1,1,k), psi_ref(1,1,i_I),N_int,HkI) - !dkI(i_state) = HkI * lambda_mrcc(i_state,k) * phase_Jl * phase_Ik * Xref(I_i) - dkI(i_state) = HkI * lambda_mrcc(i_state, k) * phase_Jl * phase_Ik - - - !$OMP CRITICAL - contrib = dkI(i_state) * delta_JI - delta_ij_old(i_I,l,i_state) += contrib - if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then - delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(k,i_state) - endif - !$OMP END CRITICAL + call i_h_j(psi_non_ref(1,1,k), psi_ref(1,1,i_I),N_int,HkI) + dkI(i_state) = HkI * lambda_mrcc(i_state, k) * phase_Jl * phase_Ik + + contrib = dkI(i_state) * delta_JI + !$OMP ATOMIC + delta_ij_old(i_I,l,i_state) += contrib + if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then + !$OMP ATOMIC + delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(k,i_state) + endif + + enddo enddo enddo enddo - enddo - !$OMP END PARALLEL DO - -! double precision :: error, acc -! integer :: II -! error = 0d0 -! do i=1, N_det_non_ref -! acc = 0d0 -! do II=1, N_det_ref -! call i_h_j(psi_ref(1,1,II), psi_non_ref(1,1,i), N_int, HIi) -! acc += HIi * lambda_mrcc(i_state, i) * Xref(II) * psi_ref_coef(II, i_state) -! end do -! error += (psi_non_ref_coef(i, i_state) - acc)**2 -! end do -! print *, "QUALITY ", error - - + !$OMP END PARALLEL DO + end do deallocate(idx_sorted_bit) END_PROVIDER diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index b307ca85..69ccc563 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -42,7 +42,7 @@ subroutine mrcepa0_iterations ! E_past(j) = E_new ! j +=1 call save_wavefunction - if (iteration > 200) then + if (iteration > 0) then exit endif print*,'------------' @@ -55,9 +55,9 @@ subroutine mrcepa0_iterations print*,'------------' enddo call write_double(6,ci_energy_dressed(1),"Final MRCEPA0 energy") + call write_double(6,ci_energy_dressed(1)+rest,"Final MRCEPA0+rest energy") call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) call save_wavefunction - end subroutine set_generators_bitmasks_as_holes_and_particles @@ -85,7 +85,26 @@ subroutine set_generators_bitmasks_as_holes_and_particles enddo enddo touch generators_bitmask - - - end + + +BEGIN_PROVIDER [ double precision, rest ] + integer :: i, j + double precision :: hij, c0 + + c0 = 1d0 + do i=1,N_det_non_ref + c0 += psi_non_ref_coef(i,1)**2 + end do + c0 = dsqrt(c0) + print *, "C", c0 + rest = 0d0 + do i=1, N_det_non_ref + if(lambda_mrcc(1, i) == 0d0) then + do j=1, N_det_ref + call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,i), N_int, hij) + rest += hij * psi_non_ref_coef(i,1) * psi_ref_coef(j,1) / c0 + end do + end if + end do +END_PROVIDER From 4298ab6ab03f216a7e51e25edb643edf09728d98 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 7 Apr 2016 11:13:14 +0200 Subject: [PATCH 008/216] bug in lambda_mrcc --- config/gfortran.cfg | 2 +- plugins/MRCC_Utils/mrcc_utils.irp.f | 2 +- plugins/mrcepa0/dressing.irp.f | 2 +- plugins/mrcepa0/mrcepa0_general.irp.f | 23 +---------------------- 4 files changed, 4 insertions(+), 25 deletions(-) diff --git a/config/gfortran.cfg b/config/gfortran.cfg index 694ef0df..c0aa875f 100644 --- a/config/gfortran.cfg +++ b/config/gfortran.cfg @@ -35,7 +35,7 @@ OPENMP : 1 ; Append OpenMP flags # -ffast-math and the Fortran-specific # -fno-protect-parens and -fstack-arrays. [OPT] -FCFLAGS : -Ofast +FCFLAGS : -Ofast # Profiling flags ################# diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 295e27b0..c4f5c570 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -16,7 +16,7 @@ lambda_mrcc_pt2(0) = 0 do i=1,N_det_non_ref - call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef_normalized, N_int, N_det_ref,& + call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef, N_int, N_det_ref,& size(psi_ref_coef,1), N_states,ihpsi_current) call i_H_j(psi_non_ref(1,1,i),psi_non_ref(1,1,i),N_int,hii) do k=1,N_states diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 2010750e..64b4d511 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -124,7 +124,7 @@ END_PROVIDER provide lambda_mrcc do i_state = 1, N_states - !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas) + !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) do i=1,N_det_ref do j=1,i call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int) diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index 69ccc563..525b70df 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -42,7 +42,7 @@ subroutine mrcepa0_iterations ! E_past(j) = E_new ! j +=1 call save_wavefunction - if (iteration > 0) then + if (iteration > 10) then exit endif print*,'------------' @@ -55,7 +55,6 @@ subroutine mrcepa0_iterations print*,'------------' enddo call write_double(6,ci_energy_dressed(1),"Final MRCEPA0 energy") - call write_double(6,ci_energy_dressed(1)+rest,"Final MRCEPA0+rest energy") call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) call save_wavefunction end @@ -88,23 +87,3 @@ subroutine set_generators_bitmasks_as_holes_and_particles end -BEGIN_PROVIDER [ double precision, rest ] - integer :: i, j - double precision :: hij, c0 - - c0 = 1d0 - do i=1,N_det_non_ref - c0 += psi_non_ref_coef(i,1)**2 - end do - c0 = dsqrt(c0) - print *, "C", c0 - rest = 0d0 - do i=1, N_det_non_ref - if(lambda_mrcc(1, i) == 0d0) then - do j=1, N_det_ref - call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,i), N_int, hij) - rest += hij * psi_non_ref_coef(i,1) * psi_ref_coef(j,1) / c0 - end do - end if - end do -END_PROVIDER From f2fef4a6dc37770d8c8842986c9b6f3d3488c159 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 7 Apr 2016 17:54:13 +0200 Subject: [PATCH 009/216] added pt2 to mrsc2/mrcepa0 --- plugins/MRCC_Utils/mrcc_general.irp.f | 61 -------- plugins/MRCC_Utils/mrcc_utils.irp.f | 49 +++++++ plugins/mrcepa0/mrcepa0.irp.f | 31 ++--- plugins/mrcepa0/mrcepa0_general.irp.f | 192 +++++++++++++++++++------- plugins/mrcepa0/mrsc2.irp.f | 32 ++--- plugins/mrcepa0/mrsc2sub.irp.f | 33 ++--- 6 files changed, 228 insertions(+), 170 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_general.irp.f b/plugins/MRCC_Utils/mrcc_general.irp.f index a0a4c895..d356e4b9 100644 --- a/plugins/MRCC_Utils/mrcc_general.irp.f +++ b/plugins/MRCC_Utils/mrcc_general.irp.f @@ -1,61 +1,3 @@ -subroutine run_mrcc - implicit none - call set_generators_bitmasks_as_holes_and_particles - call mrcc_iterations -end - -subroutine mrcc_iterations - implicit none - - integer :: i,j - - double precision :: E_new, E_old, delta_e - integer :: iteration,i_oscillations - double precision :: E_past(4), lambda - E_new = 0.d0 - delta_E = 1.d0 - iteration = 0 - j = 1 - i_oscillations = 0 - lambda = 1.d0 - do while (delta_E > 1.d-7) - iteration += 1 - print *, '===========================' - print *, 'MRCC Iteration', iteration - print *, '===========================' - print *, '' - E_old = sum(ci_energy_dressed) - print *, iteration, ci_energy_dressed(1) - call write_double(6,ci_energy_dressed(1),"MRCC energy") - call diagonalize_ci_dressed(lambda) - E_new = sum(ci_energy_dressed) - delta_E = dabs(E_new - E_old) -! if (E_new > E_old) then -! lambda = lambda * 0.7d0 -! else -! lambda = min(1.d0, lambda * 1.1d0) -! endif -! print *, 'energy lambda ', lambda -! E_past(j) = E_new -! j +=1 - call save_wavefunction - if (iteration > 0) then - exit - endif - print*,'------------' - print*,'VECTOR' - do i = 1, N_det_ref - print*,'' - print*,'psi_ref_coef(i,1) = ',psi_ref_coef(i,1) - print*,'delta_ii(i,1) = ',delta_ii(i,1) - enddo - print*,'------------' - enddo - call write_double(6,ci_energy_dressed(1),"Final MRCC energy") - call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) - call save_wavefunction - -end subroutine set_generators_bitmasks_as_holes_and_particles implicit none @@ -82,7 +24,4 @@ subroutine set_generators_bitmasks_as_holes_and_particles enddo enddo touch generators_bitmask - - - end diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index c4f5c570..8445a9c6 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -1,3 +1,52 @@ +! +! BEGIN_PROVIDER [ double precision, lambda_mrcc, (N_states,psi_det_size) ] +! &BEGIN_PROVIDER [ integer, lambda_mrcc_pt2, (0:psi_det_size) ] +! implicit none +! BEGIN_DOC +! cm/ or perturbative 1/Delta_E(m) +! END_DOC +! integer :: i,k +! double precision :: ihpsi_current(N_states) +! integer :: i_pert_count +! double precision :: hii, lambda_pert +! lambda_mrcc_pt2(:) = 0d0 +! i_pert_count = 0 +! lambda_mrcc = 0.d0 +! +! do i=1,N_det_non_ref +! call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef, N_int, N_det_ref, & +! size(psi_ref_coef,1), N_states,ihpsi_current) +! call i_H_j(psi_non_ref(1,1,i),psi_non_ref(1,1,i),N_int,hii) +! do k=1,N_states +! if (ihpsi_current(k) == 0.d0) then +! ihpsi_current(k) = 1.d-32 +! endif +! lambda_mrcc(k,i) = psi_non_ref_coef(i,k)/ihpsi_current(k) +! if ( dabs(psi_non_ref_coef(i,k)*ihpsi_current(k)) < 1.d-5 ) then +! i_pert_count += 1 +! lambda_mrcc(k,i) = 0.d0 +! lambda_pert = 1.d0 / (psi_ref_energy_diagonalized(k)-hii) +! if((ihpsi_current(k) * lambda_pert) < 0.5d0 * psi_non_ref_coef_restart(i,k) ) then +! lambda_mrcc(k,i) = 0.d0 +! endif +! endif +! double precision, parameter :: x = 2.d0 +! if (lambda_mrcc(k,i) > x) then +! lambda_mrcc(k,i) = x +! else if (lambda_mrcc(k,i) < -x) then +! lambda_mrcc(k,i) = -x +! endif +! enddo +! enddo +! +! print*,'N_det_non_ref = ',N_det_non_ref +! print*,'Number of ignored determinants = ',i_pert_count +! print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) +! print*,'lambda min/max = ',maxval(dabs(lambda_mrcc)), minval(dabs(lambda_mrcc)) +! +! END_PROVIDER + + BEGIN_PROVIDER [ double precision, lambda_mrcc, (N_states,psi_det_size) ] &BEGIN_PROVIDER [ integer, lambda_mrcc_pt2, (0:psi_det_size) ] implicit none diff --git a/plugins/mrcepa0/mrcepa0.irp.f b/plugins/mrcepa0/mrcepa0.irp.f index 7877cdda..9473361b 100644 --- a/plugins/mrcepa0/mrcepa0.irp.f +++ b/plugins/mrcepa0/mrcepa0.irp.f @@ -1,26 +1,19 @@ program mrcepa0 implicit none + double precision, allocatable :: energy(:) + allocate (energy(N_states)) + !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrsc2 sub mrmode = 1 - if (.not.read_wf) then - print *, 'read_wf has to be true.' - stop 1 - endif + + read_wf = .True. + SOFT_TOUCH read_wf call print_cas_coefs - call run_mrcepa0 -end - -subroutine print_cas_coefs - implicit none - - integer :: i,j - print *, 'CAS' - print *, '===' - do i=1,N_det_cas - print *, psi_cas_coef(i,:) - call debug_det(psi_cas(1,1,i),N_int) - enddo - - call write_double(6,ci_energy(1),"Initial CI energy") + call set_generators_bitmasks_as_holes_and_particles + call run(N_states,energy) + if(do_pt2_end)then + call run_pt2(N_states,energy) + endif + deallocate(energy) end diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index 525b70df..b3390577 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -1,28 +1,33 @@ -subroutine run_mrcepa0 - implicit none - call set_generators_bitmasks_as_holes_and_particles - call mrcepa0_iterations -end + BEGIN_PROVIDER [ integer, mrmode ] END_PROVIDER -subroutine mrcepa0_iterations + +subroutine run(N_st,energy) implicit none - integer :: i,j + integer, intent(in) :: N_st + double precision, intent(out) :: energy(N_st) + + integer :: i double precision :: E_new, E_old, delta_e - integer :: iteration,i_oscillations + integer :: iteration double precision :: E_past(4), lambda + + integer :: n_it_mrcc_max + double precision :: thresh_mrcc + + thresh_mrcc = 1d-7 + n_it_mrcc_max = 10 + E_new = 0.d0 delta_E = 1.d0 iteration = 0 - j = 1 - i_oscillations = 0 lambda = 1.d0 - do while (delta_E > 1.d-7) + do while (delta_E > thresh_mrcc) iteration += 1 print *, '===========================' print *, 'MRCEPA0 Iteration', iteration @@ -33,57 +38,142 @@ subroutine mrcepa0_iterations call diagonalize_ci_dressed(lambda) E_new = sum(ci_energy_dressed) delta_E = dabs(E_new - E_old) -! if (E_new > E_old) then -! lambda = lambda * 0.7d0 -! else -! lambda = min(1.d0, lambda * 1.1d0) -! endif -! print *, 'energy lambda ', lambda -! E_past(j) = E_new -! j +=1 call save_wavefunction - if (iteration > 10) then + call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) + if (iteration > n_it_mrcc_max) then exit endif - print*,'------------' - print*,'VECTOR' - do i = 1, N_det_ref - print*,'' - print*,'psi_ref_coef(i,1) = ',psi_ref_coef(i,1) - print*,'delta_ii(i,1) = ',delta_ii(i,1) - enddo - print*,'------------' enddo call write_double(6,ci_energy_dressed(1),"Final MRCEPA0 energy") - call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) - call save_wavefunction + energy(:) = ci_energy_dressed(:) + end -subroutine set_generators_bitmasks_as_holes_and_particles - implicit none - integer :: i,k - do k = 1, N_generators_bitmask - do i = 1, N_int - ! Pure single part - generators_bitmask(i,1,1,k) = holes_operators(i,1) ! holes for pure single exc alpha - generators_bitmask(i,1,2,k) = particles_operators(i,1) ! particles for pure single exc alpha - generators_bitmask(i,2,1,k) = holes_operators(i,2) ! holes for pure single exc beta - generators_bitmask(i,2,2,k) = particles_operators(i,2) ! particles for pure single exc beta - ! Double excitation - generators_bitmask(i,1,3,k) = holes_operators(i,1) ! holes for first single exc alpha - generators_bitmask(i,1,4,k) = particles_operators(i,1) ! particles for first single exc alpha - generators_bitmask(i,2,3,k) = holes_operators(i,2) ! holes for first single exc beta - generators_bitmask(i,2,4,k) = particles_operators(i,2) ! particles for first single exc beta +subroutine run_pt2(N_st,energy) + implicit none + integer :: i,j,k + double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) + integer, intent(in) :: N_st + double precision, intent(in) :: energy(N_st) + allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st)) + pt2 = 0.d0 + !if(lambda_mrcc_pt2(0) == 0) return + + print*,'Last iteration only to compute the PT2' + threshold_selectors = 1.d0 + threshold_generators = 0.999d0 + + N_det_generators = lambda_mrcc_pt2(0) + do i=1,N_det_generators + j = lambda_mrcc_pt2(i) + do k=1,N_int + psi_det_generators(k,1,i) = psi_non_ref(k,1,j) + psi_det_generators(k,2,i) = psi_non_ref(k,2,j) + enddo + do k=1,N_st + psi_coef_generators(i,k) = psi_non_ref_coef(j,k) + enddo + enddo + SOFT_TOUCH N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed + + + call H_apply_mrcc_PT2(pt2, norm_pert, H_pert_diag, N_st) + print *, 'Final step' + print *, 'N_det = ', N_det + print *, 'N_states = ', N_states + print *, 'PT2 = ', pt2 + print *, 'E = ', energy + print *, 'E+PT2 = ', energy+pt2 + print *, '-----' + - generators_bitmask(i,1,5,k) = holes_operators(i,1) ! holes for second single exc alpha - generators_bitmask(i,1,6,k) = particles_operators(i,1) ! particles for second single exc alpha - generators_bitmask(i,2,5,k) = holes_operators(i,2) ! holes for second single exc beta - generators_bitmask(i,2,6,k) = particles_operators(i,2) ! particles for second single exc beta + call ezfio_set_full_ci_energy_pt2(energy+pt2) + deallocate(pt2,norm_pert) +end + + +subroutine print_cas_coefs + implicit none + + integer :: i,j + print *, 'CAS' + print *, '===' + do i=1,N_det_cas + print *, psi_cas_coef(i,:) + call debug_det(psi_cas(1,1,i),N_int) enddo - enddo - touch generators_bitmask + call write_double(6,ci_energy(1),"Initial CI energy") + end + + + + + + + + + +! subroutine run_mrcepa0 +! implicit none +! call set_generators_bitmasks_as_holes_and_particles +! call mrcepa0_iterations +! end +! + +! +! subroutine mrcepa0_iterations +! implicit none +! +! integer :: i,j +! +! double precision :: E_new, E_old, delta_e +! integer :: iteration,i_oscillations +! double precision :: E_past(4), lambda +! E_new = 0.d0 +! delta_E = 1.d0 +! iteration = 0 +! j = 1 +! i_oscillations = 0 +! lambda = 1.d0 +! do while (delta_E > 1.d-7) +! iteration += 1 +! print *, '===========================' +! print *, 'MRCEPA0 Iteration', iteration +! print *, '===========================' +! print *, '' +! E_old = sum(ci_energy_dressed) +! call write_double(6,ci_energy_dressed(1),"MRCEPA0 energy") +! call diagonalize_ci_dressed(lambda) +! E_new = sum(ci_energy_dressed) +! delta_E = dabs(E_new - E_old) +! ! if (E_new > E_old) then +! ! lambda = lambda * 0.7d0 +! ! else +! ! lambda = min(1.d0, lambda * 1.1d0) +! ! endif +! ! print *, 'energy lambda ', lambda +! ! E_past(j) = E_new +! ! j +=1 +! call save_wavefunction +! if (iteration > 10) then +! exit +! endif +! print*,'------------' +! print*,'VECTOR' +! do i = 1, N_det_ref +! print*,'' +! print*,'psi_ref_coef(i,1) = ',psi_ref_coef(i,1) +! print*,'delta_ii(i,1) = ',delta_ii(i,1) +! enddo +! print*,'------------' +! enddo +! call write_double(6,ci_energy_dressed(1),"Final MRCEPA0 energy") +! call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) +! call save_wavefunction +! end + diff --git a/plugins/mrcepa0/mrsc2.irp.f b/plugins/mrcepa0/mrsc2.irp.f index eb34adee..d4e1b1d4 100644 --- a/plugins/mrcepa0/mrsc2.irp.f +++ b/plugins/mrcepa0/mrsc2.irp.f @@ -1,26 +1,20 @@ -program mrcepa0 +program mrsc2 implicit none + double precision, allocatable :: energy(:) + allocate (energy(N_states)) + !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrsc2 sub mrmode = 2 - if (.not.read_wf) then - print *, 'read_wf has to be true.' - stop 1 - endif + + read_wf = .True. + SOFT_TOUCH read_wf call print_cas_coefs - call run_mrcepa0 + call set_generators_bitmasks_as_holes_and_particles + call run(N_states,energy) + if(do_pt2_end)then + call run_pt2(N_states,energy) + endif + deallocate(energy) end -subroutine print_cas_coefs - implicit none - - integer :: i,j - print *, 'CAS' - print *, '===' - do i=1,N_det_cas - print *, psi_cas_coef(i,:) - call debug_det(psi_cas(1,1,i),N_int) - enddo - - call write_double(6,ci_energy(1),"Initial CI energy") -end diff --git a/plugins/mrcepa0/mrsc2sub.irp.f b/plugins/mrcepa0/mrsc2sub.irp.f index 524bbbd7..07a07c83 100644 --- a/plugins/mrcepa0/mrsc2sub.irp.f +++ b/plugins/mrcepa0/mrsc2sub.irp.f @@ -1,26 +1,19 @@ -program mrcepa0 +program mrsc2sub implicit none + double precision, allocatable :: energy(:) + allocate (energy(N_states)) + !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrsc2 sub mrmode = 3 - if (.not.read_wf) then - print *, 'read_wf has to be true.' - stop 1 - endif + + read_wf = .True. + SOFT_TOUCH read_wf call print_cas_coefs - call run_mrcepa0 -end - -subroutine print_cas_coefs - implicit none - - integer :: i,j - print *, 'CAS' - print *, '===' - do i=1,N_det_cas - print *, psi_cas_coef(i,:) - call debug_det(psi_cas(1,1,i),N_int) - enddo - - call write_double(6,ci_energy(1),"Initial CI energy") + call set_generators_bitmasks_as_holes_and_particles + call run(N_states,energy) + if(do_pt2_end)then + call run_pt2(N_states,energy) + endif + deallocate(energy) end From 2774af5bbd00db04b2dd434e1e2da1533424e56a Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 8 Apr 2016 13:25:55 +0200 Subject: [PATCH 010/216] experimental - OLD_LAMBDA and NO_MONO_DRESSING --- plugins/MRCC_Utils/mrcc_utils.irp.f | 133 ++++++++++++++++---------- plugins/mrcepa0/dressing.irp.f | 4 +- plugins/mrcepa0/mrcepa0_general.irp.f | 73 -------------- 3 files changed, 83 insertions(+), 127 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 8445a9c6..97d7e0d8 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -1,50 +1,74 @@ -! -! BEGIN_PROVIDER [ double precision, lambda_mrcc, (N_states,psi_det_size) ] -! &BEGIN_PROVIDER [ integer, lambda_mrcc_pt2, (0:psi_det_size) ] -! implicit none -! BEGIN_DOC -! cm/ or perturbative 1/Delta_E(m) -! END_DOC -! integer :: i,k -! double precision :: ihpsi_current(N_states) -! integer :: i_pert_count -! double precision :: hii, lambda_pert -! lambda_mrcc_pt2(:) = 0d0 -! i_pert_count = 0 -! lambda_mrcc = 0.d0 -! -! do i=1,N_det_non_ref -! call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef, N_int, N_det_ref, & -! size(psi_ref_coef,1), N_states,ihpsi_current) -! call i_H_j(psi_non_ref(1,1,i),psi_non_ref(1,1,i),N_int,hii) -! do k=1,N_states -! if (ihpsi_current(k) == 0.d0) then -! ihpsi_current(k) = 1.d-32 -! endif -! lambda_mrcc(k,i) = psi_non_ref_coef(i,k)/ihpsi_current(k) -! if ( dabs(psi_non_ref_coef(i,k)*ihpsi_current(k)) < 1.d-5 ) then -! i_pert_count += 1 -! lambda_mrcc(k,i) = 0.d0 -! lambda_pert = 1.d0 / (psi_ref_energy_diagonalized(k)-hii) -! if((ihpsi_current(k) * lambda_pert) < 0.5d0 * psi_non_ref_coef_restart(i,k) ) then -! lambda_mrcc(k,i) = 0.d0 -! endif -! endif -! double precision, parameter :: x = 2.d0 -! if (lambda_mrcc(k,i) > x) then -! lambda_mrcc(k,i) = x -! else if (lambda_mrcc(k,i) < -x) then -! lambda_mrcc(k,i) = -x + + BEGIN_PROVIDER [ integer, mrmode ] +&BEGIN_PROVIDER [ logical, old_lambda ] +&BEGIN_PROVIDER [ logical, no_mono_dressing ] + implicit none + CHARACTER(len=255) :: test + CALL get_environment_variable("OLD_LAMBDA", test) + old_lambda = trim(test) /= "" .and. trim(test) /= "0" + CALL get_environment_variable("NO_MONO_DRESSING", test) + no_mono_dressing = trim(test) /= "" .and. trim(test) /= "0" + print *, "old", old_lambda, "mono", no_mono_dressing + mrmode = 0 +END_PROVIDER + + + +BEGIN_PROVIDER [ double precision, lambda_mrcc_old, (N_states,psi_det_size) ] +&BEGIN_PROVIDER [ integer, lambda_mrcc_pt2_old, (0:psi_det_size) ] + implicit none + BEGIN_DOC + cm/ or perturbative 1/Delta_E(m) + END_DOC + integer :: i,k + double precision :: ihpsi_current(N_states) + integer :: i_pert_count + double precision :: hii, lambda_pert + integer :: N_lambda_mrcc_pt2 + double precision, parameter :: x = 2.d0 + + i_pert_count = 0 + lambda_mrcc_old = 0.d0 + N_lambda_mrcc_pt2 = 0 + lambda_mrcc_pt2_old(0) = 0 + + do i=1,N_det_non_ref + call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef, N_int, N_det_ref, & + size(psi_ref_coef,1), N_states,ihpsi_current) + call i_H_j(psi_non_ref(1,1,i),psi_non_ref(1,1,i),N_int,hii) + do k=1,N_states + if (ihpsi_current(k) == 0.d0) then + ihpsi_current(k) = 1.d-32 + endif + lambda_mrcc_old(k,i) = psi_non_ref_coef(i,k)/ihpsi_current(k) + if ( dabs(psi_non_ref_coef(i,k)*ihpsi_current(k)) < 1.d-5 ) then + i_pert_count += 1 + lambda_mrcc_old(k,i) = 0.d0 + if (lambda_mrcc_pt2_old(N_lambda_mrcc_pt2) /= i) then + N_lambda_mrcc_pt2 += 1 + lambda_mrcc_pt2_old(N_lambda_mrcc_pt2) = i + endif +! lambda_pert = 1.d0 / (psi_ref_energy_diagonalized(k)-hii) +! if((ihpsi_current(k) * lambda_pert) < 0.5d0 * psi_non_ref_coef_restart(i,k) ) then +! lambda_mrcc_old(k,i) = 0.d0 ! endif -! enddo -! enddo -! -! print*,'N_det_non_ref = ',N_det_non_ref -! print*,'Number of ignored determinants = ',i_pert_count -! print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) -! print*,'lambda min/max = ',maxval(dabs(lambda_mrcc)), minval(dabs(lambda_mrcc)) -! -! END_PROVIDER + endif + + if (lambda_mrcc_old(k,i) > x) then + lambda_mrcc_old(k,i) = x + else if (lambda_mrcc_old(k,i) < -x) then + lambda_mrcc_old(k,i) = -x + endif + enddo + enddo + lambda_mrcc_pt2_old(0) = N_lambda_mrcc_pt2 + + print*,'N_det_non_ref = ',N_det_non_ref + print*,'Number of ignored determinants = ',i_pert_count + print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) + print*,'lambda min/max = ',maxval(dabs(lambda_mrcc_old)), minval(dabs(lambda_mrcc_old)) + +END_PROVIDER BEGIN_PROVIDER [ double precision, lambda_mrcc, (N_states,psi_det_size) ] @@ -58,11 +82,15 @@ integer :: i_pert_count double precision :: hii, lambda_pert integer :: N_lambda_mrcc_pt2 - - i_pert_count = 0 - lambda_mrcc = 0.d0 - N_lambda_mrcc_pt2 = 0 - lambda_mrcc_pt2(0) = 0 + + if(old_lambda) then + lambda_mrcc = lambda_mrcc_old + lambda_mrcc_pt2 = lambda_mrcc_pt2_old + else + i_pert_count = 0 + lambda_mrcc = 0.d0 + N_lambda_mrcc_pt2 = 0 + lambda_mrcc_pt2(0) = 0 do i=1,N_det_non_ref call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef, N_int, N_det_ref,& @@ -85,9 +113,10 @@ enddo enddo lambda_mrcc_pt2(0) = N_lambda_mrcc_pt2 + end if print*,'N_det_non_ref = ',N_det_non_ref - print*,'Number of ignored determinants = ',i_pert_count + !print*,'Number of ignored determinants = ',i_pert_count print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) print*,'lambda max = ',maxval(dabs(lambda_mrcc)) diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 64b4d511..ca9f00d2 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -124,11 +124,11 @@ END_PROVIDER provide lambda_mrcc do i_state = 1, N_states - !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) + !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(no_mono_dressing,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) do i=1,N_det_ref do j=1,i call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int) - if(degree /= 2 .and. degree /= 0) cycle + if(no_mono_dressing .and. degree == 1) cycle delta_cas(i,j,i_state) = 0d0 do k=1,N_det_non_ref diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index b3390577..053f0262 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -1,10 +1,5 @@ -BEGIN_PROVIDER [ integer, mrmode ] - -END_PROVIDER - - subroutine run(N_st,energy) implicit none @@ -109,71 +104,3 @@ subroutine print_cas_coefs end - - - - - - - - - -! subroutine run_mrcepa0 -! implicit none -! call set_generators_bitmasks_as_holes_and_particles -! call mrcepa0_iterations -! end -! - -! -! subroutine mrcepa0_iterations -! implicit none -! -! integer :: i,j -! -! double precision :: E_new, E_old, delta_e -! integer :: iteration,i_oscillations -! double precision :: E_past(4), lambda -! E_new = 0.d0 -! delta_E = 1.d0 -! iteration = 0 -! j = 1 -! i_oscillations = 0 -! lambda = 1.d0 -! do while (delta_E > 1.d-7) -! iteration += 1 -! print *, '===========================' -! print *, 'MRCEPA0 Iteration', iteration -! print *, '===========================' -! print *, '' -! E_old = sum(ci_energy_dressed) -! call write_double(6,ci_energy_dressed(1),"MRCEPA0 energy") -! call diagonalize_ci_dressed(lambda) -! E_new = sum(ci_energy_dressed) -! delta_E = dabs(E_new - E_old) -! ! if (E_new > E_old) then -! ! lambda = lambda * 0.7d0 -! ! else -! ! lambda = min(1.d0, lambda * 1.1d0) -! ! endif -! ! print *, 'energy lambda ', lambda -! ! E_past(j) = E_new -! ! j +=1 -! call save_wavefunction -! if (iteration > 10) then -! exit -! endif -! print*,'------------' -! print*,'VECTOR' -! do i = 1, N_det_ref -! print*,'' -! print*,'psi_ref_coef(i,1) = ',psi_ref_coef(i,1) -! print*,'delta_ii(i,1) = ',delta_ii(i,1) -! enddo -! print*,'------------' -! enddo -! call write_double(6,ci_energy_dressed(1),"Final MRCEPA0 energy") -! call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) -! call save_wavefunction -! end - From 35d75d36a345eea97f87f41e982ef784f2834149 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Sun, 10 Apr 2016 12:30:22 +0200 Subject: [PATCH 011/216] bug in delta_cas --- plugins/mrcepa0/dressing.irp.f | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index ca9f00d2..f76dca37 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -128,8 +128,8 @@ END_PROVIDER do i=1,N_det_ref do j=1,i call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int) - if(no_mono_dressing .and. degree == 1) cycle delta_cas(i,j,i_state) = 0d0 + if(no_mono_dressing .and. degree == 1) cycle do k=1,N_det_non_ref call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,k),N_int,Hjk) @@ -137,10 +137,14 @@ END_PROVIDER delta_cas(i,j,i_state) += Hjk * Hki * lambda_mrcc(i_state, k) end do - delta_cas(j,i,i_state) = delta_cas(i,j,i_state) end do end do !$OMP END PARALLEL DO + do i=1,N_det_ref + do j=1,i + delta_cas(j,i,i_state) = delta_cas(i,j,i_state) + end do + end do end do END_PROVIDER From 65cdad8f189beed8ec53719412f12b777a0a5b2c Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 11 Apr 2016 17:42:15 +0200 Subject: [PATCH 012/216] dirty - noiter version --- plugins/mrcepa0/dressing.irp.f | 6 +-- plugins/mrcepa0/mrcepa0_general.irp.f | 62 ++++++++++++++++----------- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index f76dca37..7ebd712b 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -129,7 +129,7 @@ END_PROVIDER do j=1,i call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int) delta_cas(i,j,i_state) = 0d0 - if(no_mono_dressing .and. degree == 1) cycle + !if(no_mono_dressing .and. degree == 1) cycle do k=1,N_det_non_ref call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,k),N_int,Hjk) @@ -220,7 +220,7 @@ end function end do - kloop: do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 + kloop: do k=cepa0_shortcut(blok), i ! cepa0_shortcut(blok+1)-1 if(lambda_mrcc(i_state, det_cepa0_idx(k)) == 0d0) cycle do ni=1,N_int @@ -426,7 +426,7 @@ implicit none call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,i_I),N_int,hIi) diI = hIi * lambda_mrcc(i_state, i) - do J = 1 , N_det_ref !!! + do J = 1 , i_I ! N_det_ref !!! call get_excitation(psi_ref(1,1,i_I),psi_ref(1,1,J),exc_IJ,degree,phase_IJ,N_int) call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,J),N_int,hJi) delta_JI = hJi * diI diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index 053f0262..6694e80a 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -6,7 +6,7 @@ subroutine run(N_st,energy) integer, intent(in) :: N_st double precision, intent(out) :: energy(N_st) - integer :: i + integer :: i,j double precision :: E_new, E_old, delta_e integer :: iteration @@ -17,31 +17,43 @@ subroutine run(N_st,energy) thresh_mrcc = 1d-7 n_it_mrcc_max = 10 - - E_new = 0.d0 - delta_E = 1.d0 - iteration = 0 - lambda = 1.d0 - do while (delta_E > thresh_mrcc) - iteration += 1 - print *, '===========================' - print *, 'MRCEPA0 Iteration', iteration - print *, '===========================' - print *, '' - E_old = sum(ci_energy_dressed) - call write_double(6,ci_energy_dressed(1),"MRCEPA0 energy") - call diagonalize_ci_dressed(lambda) - E_new = sum(ci_energy_dressed) - delta_E = dabs(E_new - E_old) - call save_wavefunction - call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) - if (iteration > n_it_mrcc_max) then - exit - endif - enddo - call write_double(6,ci_energy_dressed(1),"Final MRCEPA0 energy") - energy(:) = ci_energy_dressed(:) + if(no_mono_dressing) then + do j=1,N_states_diag + do i=1,N_det + psi_coef(i,j) = CI_eigenvectors_dressed(i,j) + enddo + enddo + SOFT_TOUCH psi_coef ci_energy_dressed + call write_double(6,ci_energy_dressed(1),"Final MRCC energy") + call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) + call save_wavefunction + energy(:) = ci_energy_dressed(:) + else + E_new = 0.d0 + delta_E = 1.d0 + iteration = 0 + lambda = 1.d0 + do while (delta_E > thresh_mrcc) + iteration += 1 + print *, '===========================' + print *, 'MRCEPA0 Iteration', iteration + print *, '===========================' + print *, '' + E_old = sum(ci_energy_dressed) + call write_double(6,ci_energy_dressed(1),"MRCEPA0 energy") + call diagonalize_ci_dressed(lambda) + E_new = sum(ci_energy_dressed) + delta_E = dabs(E_new - E_old) + call save_wavefunction + call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) + if (iteration > n_it_mrcc_max) then + exit + endif + enddo + call write_double(6,ci_energy_dressed(1),"Final MRCEPA0 energy") + energy(:) = ci_energy_dressed(:) + endif end From 7538187cf5a20162343c8fdf6b4b9402030c26be Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 15 Apr 2016 09:16:31 +0200 Subject: [PATCH 013/216] faster mrcepa0 --- plugins/mrcepa0/dressing.irp.f | 245 +++++++++++++++++++++++++-------- 1 file changed, 191 insertions(+), 54 deletions(-) diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 7ebd712b..10b77b27 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -50,8 +50,8 @@ END_PROVIDER use bitmasks implicit none - integer(bit_kind) :: det_noactive(N_int, 2, N_det_non_ref), nonactive_sorb(N_int,2) - integer i, II, j, k + integer(bit_kind) :: det_noactive(N_int, 2, N_det_non_ref), nonactive_sorb(N_int,2), det(N_int, 2) + integer i, II, j, k, ni logical, external :: detEq active_sorb(:,:) = 0_8 @@ -115,7 +115,7 @@ END_PROVIDER - BEGIN_PROVIDER [ double precision, delta_cas, (N_det_ref, N_det_ref, N_states) ] + BEGIN_PROVIDER [ double precision, delta_cas_old, (N_det_ref, N_det_ref, N_states) ] use bitmasks implicit none integer :: i,j,k @@ -127,7 +127,7 @@ END_PROVIDER !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(no_mono_dressing,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) do i=1,N_det_ref do j=1,i - call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int) + !call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int) delta_cas(i,j,i_state) = 0d0 !if(no_mono_dressing .and. degree == 1) cycle do k=1,N_det_non_ref @@ -149,6 +149,53 @@ END_PROVIDER END_PROVIDER + BEGIN_PROVIDER [ double precision, delta_cas, (N_det_ref, N_det_ref, N_states) ] + use bitmasks + implicit none + integer :: i,j,k + double precision :: Hjk, Hki, Hij, pre(N_det_ref), wall + integer :: i_state, degree, npre, ipre(N_det_ref) + + provide lambda_mrcc + + delta_cas = 0d0 + call wall_time(wall) + print *, wall + do i_state = 1, N_states + !$OMP PARALLEL DO default(none) schedule(dynamic) private(pre,npre,ipre,j,k,Hjk,Hki,degree) shared(no_mono_dressing,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) + do k=1,N_det_non_ref + if(lambda_mrcc(i_state, k) == 0d0) cycle + npre = 0 + do i=1,N_det_ref + call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki) + if(Hki /= 0d0) then + npre += 1 + ipre(npre) = i + pre(npre) = Hki + end if + end do + do i=1,npre + do j=1,i + !$OMP ATOMIC + delta_cas(ipre(i),ipre(j),i_state) += pre(i) * pre(j) * lambda_mrcc(i_state, k) + end do + end do + end do + !$OMP END PARALLEL DO + + do i=1,N_det_ref + do j=1,i + delta_cas(j,i,i_state) = delta_cas(i,j,i_state) + end do + end do + end do + + call wall_time(wall) + print *, wall +! stop + END_PROVIDER + + logical function detEq(a,b,Nint) use bitmasks implicit none @@ -165,6 +212,93 @@ logical function detEq(a,b,Nint) detEq = .true. end function +integer function detCmp(a,b,Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer(bit_kind), intent(in) :: a(Nint,2), b(Nint,2) + integer :: ni, i + + detCmp = 0 + do i=1,2 + do ni=Nint,1,-1 + + if(a(ni,i) < b(ni,i)) then + detCmp = -1 + return + else if(a(ni,i) > b(ni,i)) then + detCmp = 1 + return + end if + + end do + end do +end function + + +integer function searchDet(dets, det, n, Nint) + implicit none + use bitmasks + + integer(bit_kind),intent(in) :: dets(Nint,2,n), det(Nint,2) + integer, intent(in) :: nint, n + integer :: l, h, c + integer, external :: detCmp + + l = 1 + h = n + do while(.true.) + searchDet = (l+h)/2 + c = detCmp(dets(1,1,searchDet), det(:,:), Nint) + if(c == 0) return + if(c == 1) then + h = searchDet-1 + else + l = searchDet+1 + end if + if(l > h) then + searchDet = -1 + return + end if + + end do +end function + + +subroutine sort_det(key, idx, N_key, Nint) + implicit none + + + integer, intent(in) :: Nint, N_key + integer(8),intent(inout) :: key(Nint,2,N_key) + integer,intent(out) :: idx(N_key) + integer(8) :: tmp(Nint, 2) + integer :: tmpidx,i,ni + + do i=1,N_key + idx(i) = i + end do + + do i=N_key/2,1,-1 + call tamiser(key, idx, i, N_key, Nint, N_key) + end do + + do i=N_key,2,-1 + do ni=1,Nint + tmp(ni,1) = key(ni,1,i) + tmp(ni,2) = key(ni,2,i) + key(ni,1,i) = key(ni,1,1) + key(ni,2,i) = key(ni,2,1) + key(ni,1,1) = tmp(ni,1) + key(ni,2,1) = tmp(ni,2) + enddo + + tmpidx = idx(i) + idx(i) = idx(1) + idx(1) = tmpidx + call tamiser(key, idx, 1, i-1, Nint, N_key) + end do +end subroutine @@ -174,15 +308,15 @@ end function implicit none integer :: i_state, i, i_I, J, k, degree, degree2, m, l, deg, ni - integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_ + integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_, sortRefIdx(N_det_ref) logical :: ok double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(1), HkI, ci_inv(1), dia_hla(1) double precision :: contrib, HIIi, HJk integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ - integer(bit_kind) :: det_tmp(N_int, 2), made_hole(N_int,2), made_particle(N_int,2), myActive(N_int,2) + integer(bit_kind) :: det_tmp(N_int, 2), made_hole(N_int,2), made_particle(N_int,2), myActive(N_int,2), sortRef(N_int,2,N_det_ref) integer, allocatable :: idx_sorted_bit(:) - integer, external :: get_index_in_psi_det_sorted_bit - logical, external :: is_in_wavefunction + integer, external :: get_index_in_psi_det_sorted_bit, searchDet + logical, external :: is_in_wavefunction, detEq integer :: II, blok @@ -190,6 +324,9 @@ end function provide mo_bielec_integrals_in_map allocate(idx_sorted_bit(N_det)) + sortRef = det_ref_active(:,:,:N_det_ref) + call sort_det(sortRef, sortRefIdx, N_det_ref, N_int) + idx_sorted_bit(:) = -1 do i=1,N_det_non_ref idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i @@ -201,10 +338,10 @@ end function delta_mrcepa0_ij(:,:,:) = 0d0 !$OMP PARALLEL DO default(none) schedule(dynamic) shared(delta_mrcepa0_ij, delta_mrcepa0_ii) & - !$OMP private(i,II,J,k,degree,myActive,made_hole,made_particle,hjk,contrib) & + !$OMP private(m,i,II,J,k,degree,myActive,made_hole,made_particle,hjk,contrib) & !$OMP shared(active_sorb, psi_non_ref, psi_non_ref_coef, psi_ref, psi_ref_coef, cepa0_shortcut, det_cepa0_active) & !$OMP shared(N_det_ref, N_det_non_ref,N_int,det_cepa0_idx,lambda_mrcc,det_ref_active, delta_cas) & - !$OMP shared(i_state) + !$OMP shared(i_state, sortRef, sortRefIdx) do blok=1,cepa0_shortcut(0) do i=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 do II=1,N_det_ref @@ -214,13 +351,13 @@ end function do ni=1,N_int made_hole(ni,1) = iand(det_ref_active(ni,1,II), xor(det_cepa0_active(ni,1,i), det_ref_active(ni,1,II))) made_hole(ni,2) = iand(det_ref_active(ni,2,II), xor(det_cepa0_active(ni,2,i), det_ref_active(ni,2,II))) - !made_particle = iand(det_cepa0_active(i), xor(det_cepa0_active(i), det_ref_active(II))) + made_particle(ni,1) = iand(det_cepa0_active(ni,1,i), xor(det_cepa0_active(ni,1,i), det_ref_active(ni,1,II))) made_particle(ni,2) = iand(det_cepa0_active(ni,2,i), xor(det_cepa0_active(ni,2,i), det_ref_active(ni,2,II))) end do - kloop: do k=cepa0_shortcut(blok), i ! cepa0_shortcut(blok+1)-1 + kloop: do k=cepa0_shortcut(blok), i if(lambda_mrcc(i_state, det_cepa0_idx(k)) == 0d0) cycle do ni=1,N_int @@ -236,23 +373,20 @@ end function myActive(ni,2) = xor(myActive(ni,2), made_particle(ni,2)) end do - jloop: do J=1,N_det_ref - do ni=1,N_int !!! replace with sort+search - if(det_ref_active(ni,1,J) /= myActive(ni,1)) cycle jloop - if(det_ref_active(ni,2,J) /= myActive(ni,2)) cycle jloop - end do - call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,HJk) - contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k)) + j = searchDet(sortRef, myActive, N_det_ref, N_int) + if(j == -1) cycle + j = sortRefIdx(j) + + call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,HJk) + contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k)) + !$OMP ATOMIC + delta_mrcepa0_ij(J, det_cepa0_idx(i), i_state) += contrib + + if(dabs(psi_ref_coef(J,i_state)).ge.5.d-5) then !$OMP ATOMIC - delta_mrcepa0_ij(J, det_cepa0_idx(i), i_state) += contrib - - if(dabs(psi_ref_coef(J,i_state)).ge.5.d-5) then - !$OMP ATOMIC - delta_mrcepa0_ii(J,i_state) -= contrib / psi_ref_coef(J, i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) - end if - - exit - end do jloop + delta_mrcepa0_ii(J,i_state) -= contrib / psi_ref_coef(J, i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) + end if + end do kloop end do end do @@ -310,8 +444,7 @@ END_PROVIDER do II=1,N_det_ref call apply_excitation(psi_ref(1,1,II),exc_Ji,det_tmp,ok,N_int) - !call get_excitation(psi_ref(1,1,II),psi_non_ref(1,1,i),exc_Ii,degree,phase_Ii,N_int) - + if(.not. ok) cycle l = get_index_in_psi_det_sorted_bit(det_tmp, N_int) if(l == 0) cycle @@ -386,7 +519,7 @@ implicit none double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(N_states), HkI, ci_inv(N_states), dia_hla(N_states) double precision :: contrib integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ - integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2) + integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2), inac, virt integer, allocatable :: idx_sorted_bit(:) integer, external :: get_index_in_psi_det_sorted_bit logical, external :: is_in_wavefunction @@ -408,7 +541,7 @@ implicit none delta_ij_old(:,:,:) = 0 !$OMP PARALLEL DO default(none) schedule(dynamic,10) shared(delta_ij_old, delta_ii_old) & - !$OMP private(i, J, k, degree, degree2, l, deg, ni) & + !$OMP private(i, J, k, degree, degree2, l, deg, ni, inac, virt) & !$OMP private(ok,p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_) & !$OMP private(phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI, HkI, ci_inv, dia_hla) & !$OMP private(contrib, exc_iI, exc_Ik, exc_IJ, det_tmp, det_tmp2) & @@ -429,6 +562,7 @@ implicit none do J = 1 , i_I ! N_det_ref !!! call get_excitation(psi_ref(1,1,i_I),psi_ref(1,1,J),exc_IJ,degree,phase_IJ,N_int) call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,J),N_int,hJi) + if(hJi == 0) cycle delta_JI = hJi * diI do k = 1 , N_det_non_ref if(lambda_mrcc(i_state, k) == 0d0) cycle @@ -442,28 +576,33 @@ implicit none det_tmp(:,:) = 0_bit_kind det_tmp2(:,:) = 0_bit_kind - ok = .true. - do ni=1,N_int - det_tmp(ni,1) = iand(xor(HF_bitmask(ni,1), psi_non_ref(ni,1,k)), not(active_sorb(ni,1))) - det_tmp(ni,2) = iand(xor(HF_bitmask(ni,1), psi_non_ref(ni,1,i)), not(active_sorb(ni,1))) - ok = ok .and. (popcnt(det_tmp(ni,1)) + popcnt(det_tmp(ni,2)) == popcnt(xor(det_tmp(ni,1), det_tmp(ni,2)))) - - det_tmp(ni,1) = iand(xor(HF_bitmask(ni,2), psi_non_ref(ni,2,k)), not(active_sorb(ni,2))) - det_tmp(ni,2) = iand(xor(HF_bitmask(ni,2), psi_non_ref(ni,2,i)), not(active_sorb(ni,2))) - ok = ok .and. (popcnt(det_tmp(ni,1)) + popcnt(det_tmp(ni,2)) == popcnt(xor(det_tmp(ni,1), det_tmp(ni,2)))) - end do - - if(.not. ok) cycle - call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) - - call get_excitation(psi_non_ref(1,1,i), det_tmp, exc_Ik, degree, phase_al, N_int) + + + if(.not. ok) cycle + !if(is_in_wavefunction(det_tmp, N_int)) cycle + inac = iand(HF_bitmask(1,1), not(active_sorb(1,1))) + virt = iand(not(HF_bitmask(1,1)), not(active_sorb(1,1))) + + deg = 0 + deg += popcnt(xor(iand(inac,det_tmp(1,1)), inac)) + deg += popcnt(xor(iand(inac,det_tmp(1,2)), inac)) + if(deg <= 2) then + deg = 0 + deg += popcnt(iand(virt, det_tmp(1,1))) + deg += popcnt(iand(virt, det_tmp(1,2))) + if(deg <= 2) then + cycle + end if + end if + + + !call get_excitation(psi_non_ref(1,1,i), det_tmp, exc_Ik, degree, phase_al, N_int) - if(.not. ok) cycle - if(is_in_wavefunction(det_tmp, N_int)) cycle + !if(is_in_wavefunction(det_tmp, N_int)) cycle call apply_excitation(psi_ref(1,1,J),exc_Ik,det_tmp,ok,N_int) @@ -473,14 +612,14 @@ implicit none l = get_index_in_psi_det_sorted_bit(det_tmp, N_int) if(l == 0) cycle - l = idx_sorted_bit(get_index_in_psi_det_sorted_bit(det_tmp, N_int)) + l = idx_sorted_bit(l) if(l ==-1) cycle call i_h_j(psi_non_ref(1,1,k), psi_ref(1,1,i_I),N_int,HkI) - dkI(i_state) = HkI * lambda_mrcc(i_state, k) * phase_Jl * phase_Ik - + dkI(i_state) = HkI * lambda_mrcc(i_state, k)! * phase_Jl * phase_Ik + !if( phase_Jl * phase_Ik < 0d0 ) stop "STOOOOOOP" contrib = dkI(i_state) * delta_JI !$OMP ATOMIC delta_ij_old(i_I,l,i_state) += contrib @@ -501,5 +640,3 @@ END_PROVIDER - - From 07077cf8835e90dc5fe2b55171f3587523638cb9 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 15 Apr 2016 15:16:46 +0200 Subject: [PATCH 014/216] faster mrsc2 --- plugins/mrcepa0/dressing.irp.f | 198 ++++++++++++++++++++++----------- 1 file changed, 132 insertions(+), 66 deletions(-) diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 10b77b27..cb0747e8 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -47,6 +47,7 @@ END_PROVIDER &BEGIN_PROVIDER [ integer(bit_kind), det_cepa0_active, (N_int,2,N_det_non_ref) ] &BEGIN_PROVIDER [ integer(bit_kind), det_ref_active, (N_int,2,N_det_ref) ] &BEGIN_PROVIDER [ integer(bit_kind), active_sorb, (N_int,2) ] +&BEGIN_PROVIDER [ integer(bit_kind), det_cepa0, (N_int,2,N_det_non_ref) ] use bitmasks implicit none @@ -111,6 +112,12 @@ END_PROVIDER end if end do cepa0_shortcut(cepa0_shortcut(0)+1) = N_det_non_ref+1 + + do i=1,N_det_non_ref + det_cepa0(:,:,i) = psi_non_ref(:,:,det_cepa0_idx(i)) + end do + + print *, "pre done" END_PROVIDER @@ -154,26 +161,30 @@ END_PROVIDER implicit none integer :: i,j,k double precision :: Hjk, Hki, Hij, pre(N_det_ref), wall - integer :: i_state, degree, npre, ipre(N_det_ref) + integer :: i_state, degree, npre, ipre(N_det_ref), npres(N_det_ref) provide lambda_mrcc - + npres = 0 delta_cas = 0d0 call wall_time(wall) - print *, wall + print *, "dcas ", wall do i_state = 1, N_states - !$OMP PARALLEL DO default(none) schedule(dynamic) private(pre,npre,ipre,j,k,Hjk,Hki,degree) shared(no_mono_dressing,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) + !$OMP PARALLEL DO default(none) schedule(dynamic) private(pre,npre,ipre,j,k,Hjk,Hki,degree) shared(npres,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) do k=1,N_det_non_ref if(lambda_mrcc(i_state, k) == 0d0) cycle npre = 0 do i=1,N_det_ref call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki) if(Hki /= 0d0) then + !$OMP ATOMIC + npres(i) += 1 npre += 1 ipre(npre) = i pre(npre) = Hki end if end do + + do i=1,npre do j=1,i !$OMP ATOMIC @@ -182,7 +193,13 @@ END_PROVIDER end do end do !$OMP END PARALLEL DO - + print *, npres + npre=0 + do i=1,N_det_ref + npre += npres(i) + end do + print *, npre + stop do i=1,N_det_ref do j=1,i delta_cas(j,i,i_state) = delta_cas(i,j,i_state) @@ -191,7 +208,7 @@ END_PROVIDER end do call wall_time(wall) - print *, wall + print *, "dcas", wall ! stop END_PROVIDER @@ -212,6 +229,39 @@ logical function detEq(a,b,Nint) detEq = .true. end function +logical function isInCassd(a,Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer(bit_kind), intent(in) :: a(Nint,2) + integer(bit_kind) :: inac, virt + integer :: ni, i, deg + + + isInCassd = .false. + + + deg = 0 + do i=1,2 + do ni=1,Nint + virt = iand(not(HF_bitmask(ni,i)), not(active_sorb(ni,i))) + deg += popcnt(iand(virt, a(ni,i))) + if(deg > 2) return + end do + end do + + deg = 0 + do i=1,2 + do ni=1,Nint + inac = iand(HF_bitmask(ni,i), not(active_sorb(ni,i))) + deg += popcnt(xor(iand(inac,a(ni,i)), inac)) + if(deg > 2) return + end do + end do + + isInCassd = .true. +end function + integer function detCmp(a,b,Nint) use bitmasks implicit none @@ -311,7 +361,7 @@ end subroutine integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_, sortRefIdx(N_det_ref) logical :: ok double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(1), HkI, ci_inv(1), dia_hla(1) - double precision :: contrib, HIIi, HJk + double precision :: contrib, HIIi, HJk, wall integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ integer(bit_kind) :: det_tmp(N_int, 2), made_hole(N_int,2), made_particle(N_int,2), myActive(N_int,2), sortRef(N_int,2,N_det_ref) integer, allocatable :: idx_sorted_bit(:) @@ -320,6 +370,8 @@ end subroutine integer :: II, blok + call wall_time(wall) + print *, "cepa0", wall provide det_cepa0_active delta_cas lambda_mrcc provide mo_bielec_integrals_in_map allocate(idx_sorted_bit(N_det)) @@ -394,6 +446,9 @@ end subroutine !$OMP END PARALLEL DO end do deallocate(idx_sorted_bit) + call wall_time(wall) + print *, "cepa0", wall + stop END_PROVIDER @@ -511,21 +566,24 @@ end subroutine BEGIN_PROVIDER [ double precision, delta_ij_old, (N_det_ref,N_det_non_ref,N_states) ] &BEGIN_PROVIDER [ double precision, delta_ii_old, (N_det_ref,N_states) ] -implicit none + implicit none - integer :: i_state, i, i_I, J, k, degree, degree2, m, l, deg, ni - integer :: p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_ + integer :: i_state, i, i_I, J, k, kk, degree, degree2, m, l, deg, ni + integer :: p1,p2,h1,h2,s1,s2, blok + integer, allocatable :: linked(:,:), blokMwen(:, :), nlink(:) logical :: ok double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(N_states), HkI, ci_inv(N_states), dia_hla(N_states) - double precision :: contrib + double precision :: contrib, wall, iwall integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2), inac, virt integer, allocatable :: idx_sorted_bit(:) - integer, external :: get_index_in_psi_det_sorted_bit - logical, external :: is_in_wavefunction + integer, external :: get_index_in_psi_det_sorted_bit, searchDet + logical, external :: is_in_wavefunction, isInCassd - provide mo_bielec_integrals_in_map + + call wall_time(iwall) allocate(idx_sorted_bit(N_det)) + allocate(linked(N_det_non_ref, N_det_ref), blokMwen(N_det_non_ref, N_det_ref), nlink(N_det_ref)) idx_sorted_bit(:) = -1 do i=1,N_det_non_ref @@ -533,99 +591,105 @@ implicit none enddo - - do i_state = 1, N_states delta_ii_old(:,:) = 0 delta_ij_old(:,:,:) = 0 + !$OMP PARALLEL DO default(none) schedule(dynamic) private(blok,k,degree) shared(linked,blokMwen,psi_ref, det_cepa0,cepa0_shortcut, N_int) + do J = 1, N_det_ref + nlink(J) = 0 + do blok=1,cepa0_shortcut(0) + do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 + call get_excitation_degree(psi_ref(1,1,J),det_cepa0(1,1,k),degree,N_int) + if(degree <= 2) then + nlink(J) += 1 + linked(nlink(J),J) = k + blokMwen(nlink(J),J) = blok + end if + end do + end do + end do + !$OMP END PARALLEL DO + + + !$OMP PARALLEL DO default(none) schedule(dynamic,10) shared(delta_ij_old, delta_ii_old) & - !$OMP private(i, J, k, degree, degree2, l, deg, ni, inac, virt) & - !$OMP private(ok,p1,p2,h1,h2,s1,s2, p1_,p2_,h1_,h2_,s1_,s2_) & - !$OMP private(phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI, HkI, ci_inv, dia_hla) & + !$OMP private(kk, i, J, k, degree, degree2, l, deg, ni, inac, virt) & + !$OMP private(ok,p1,p2,h1,h2,s1,s2, blok, wall) & + !$OMP private(phase_iI, phase_Ik, phase_Jl, phase_IJ, diI, hIi, hJi, delta_JI, dkI, HkI, ci_inv, dia_hla) & !$OMP private(contrib, exc_iI, exc_Ik, exc_IJ, det_tmp, det_tmp2) & !$OMP shared(idx_sorted_bit, N_det_non_ref, N_det_ref, N_int, psi_non_ref, psi_non_ref_coef, psi_ref, psi_ref_coef) & - !$OMP shared(i_state, lambda_mrcc, hf_bitmask, active_sorb) + !$OMP shared(i_state, lambda_mrcc, hf_bitmask, active_sorb,cepa0_shortcut,det_cepa0) & + !$OMP shared(det_cepa0_idx, linked, blokMwen, nlink, iwall) do i = 1 , N_det_non_ref - if(mod(i,1000) == 0) print *, i, "/", N_det_non_ref + if(mod(i,100) == 0) then + call wall_time(wall) + wall = wall-iwall + print *, i, "/", N_det_non_ref, wall * (dfloat(N_det_non_ref) / dfloat(i)), wall, wall * (dfloat(N_det_non_ref) / dfloat(i))-wall + end if + if(lambda_mrcc(i_state, i) == 0d0) cycle - do i_I = 1 , N_det_ref + + + do i_I = 1, N_det_ref + call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,i),exc_iI,degree2,phase_iI,N_int) if(degree2 == -1) cycle + + ci_inv(i_state) = 1.d0 / psi_ref_coef(i_I,i_state) - call decode_exc(exc_iI,degree2,h1,p1,h2,p2,s1,s2) call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,i_I),N_int,hIi) diI = hIi * lambda_mrcc(i_state, i) do J = 1 , i_I ! N_det_ref !!! - call get_excitation(psi_ref(1,1,i_I),psi_ref(1,1,J),exc_IJ,degree,phase_IJ,N_int) call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,J),N_int,hJi) if(hJi == 0) cycle delta_JI = hJi * diI - do k = 1 , N_det_non_ref - if(lambda_mrcc(i_state, k) == 0d0) cycle + + do kk = 1 , nlink(i_I) + k = linked(kk,i_I) + blok = blokMwen(kk,i_I) - call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,k),exc_Ik,degree,phase_Ik,N_int) - if(degree == -1) cycle - - call decode_exc(exc_Ik,degree,h1_,p1_,h2_,p2_,s1_,s2_) - - - det_tmp(:,:) = 0_bit_kind - det_tmp2(:,:) = 0_bit_kind + if(lambda_mrcc(i_state, det_cepa0_idx(k)) == 0d0) cycle - - call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) + + call get_excitation(psi_ref(1,1,i_I),det_cepa0(1,1,k),exc_Ik,degree,phase_Ik,N_int) + !if(degree == -1) cycle + if(degree == -1) stop "STOP; ( linked )" + call apply_excitation(det_cepa0(1,1,i),exc_Ik,det_tmp,ok,N_int) if(.not. ok) cycle - !if(is_in_wavefunction(det_tmp, N_int)) cycle - inac = iand(HF_bitmask(1,1), not(active_sorb(1,1))) - virt = iand(not(HF_bitmask(1,1)), not(active_sorb(1,1))) - - deg = 0 - deg += popcnt(xor(iand(inac,det_tmp(1,1)), inac)) - deg += popcnt(xor(iand(inac,det_tmp(1,2)), inac)) - if(deg <= 2) then - deg = 0 - deg += popcnt(iand(virt, det_tmp(1,1))) - deg += popcnt(iand(virt, det_tmp(1,2))) - if(deg <= 2) then - cycle - end if - end if - - !call get_excitation(psi_non_ref(1,1,i), det_tmp, exc_Ik, degree, phase_al, N_int) - - !if(is_in_wavefunction(det_tmp, N_int)) cycle - - call apply_excitation(psi_ref(1,1,J),exc_Ik,det_tmp,ok,N_int) + call apply_excitation(psi_ref(1,1,J),exc_Ik,det_tmp2,ok,N_int) if(.not. ok) cycle - - call get_excitation(psi_ref(1,1,J), det_tmp, exc_Ik, degree, phase_Jl, N_int) - - l = get_index_in_psi_det_sorted_bit(det_tmp, N_int) - if(l == 0) cycle + + if(isInCassd(det_tmp, N_int)) cycle + + l = searchDet(det_cepa0(1,1,cepa0_shortcut(blok)), det_tmp2, cepa0_shortcut(blok+1) - cepa0_shortcut(blok), N_int) + !print *, "LL", l + if(l == -1) cycle !! -1 pour + l += cepa0_shortcut(blok) - 1 + l = det_cepa0_idx(l) + l = idx_sorted_bit(l) if(l ==-1) cycle - call i_h_j(psi_non_ref(1,1,k), psi_ref(1,1,i_I),N_int,HkI) - dkI(i_state) = HkI * lambda_mrcc(i_state, k)! * phase_Jl * phase_Ik - !if( phase_Jl * phase_Ik < 0d0 ) stop "STOOOOOOP" + call i_h_j(det_cepa0(1,1,k), psi_ref(1,1,i_I),N_int,HkI) + dkI(i_state) = HkI * lambda_mrcc(i_state, det_cepa0_idx(k)) contrib = dkI(i_state) * delta_JI !$OMP ATOMIC delta_ij_old(i_I,l,i_state) += contrib if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then !$OMP ATOMIC - delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(k,i_state) + delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) endif enddo @@ -635,6 +699,8 @@ implicit none !$OMP END PARALLEL DO end do deallocate(idx_sorted_bit) +! call wall_time(wall) +! print *, "old ", wall END_PROVIDER From 39f7631abcafe1ccb8d4ce20c321eca7ebd9f8f5 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 26 Apr 2016 17:27:21 +0200 Subject: [PATCH 015/216] working mrsc2 --- plugins/MRCC_Utils/mrcc_dress.irp.f | 6 + plugins/MRCC_Utils/mrcc_utils.irp.f | 10 ++ plugins/mrcepa0/dressing.irp.f | 257 +++++++++++++++++++--------- 3 files changed, 189 insertions(+), 84 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_dress.irp.f b/plugins/MRCC_Utils/mrcc_dress.irp.f index b2304818..1eb4435c 100644 --- a/plugins/MRCC_Utils/mrcc_dress.irp.f +++ b/plugins/MRCC_Utils/mrcc_dress.irp.f @@ -299,6 +299,12 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Nstates, Ndet_non_ref, Ndet_ref,i_ge call omp_unset_lock( psi_ref_lock(i_I) ) enddo enddo + +! 5.7717252361566333E-005 +! -1.4525812360153183E-005 +! -3.3282906594800186E-005 +! -1.3864228814283882E-004 + !deallocate (dIa_hla,hij_cache) !deallocate(miniList, idx_miniList) end diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 97d7e0d8..71757987 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -82,6 +82,8 @@ END_PROVIDER integer :: i_pert_count double precision :: hii, lambda_pert integer :: N_lambda_mrcc_pt2 + integer :: histo(200), j + histo = 0 if(old_lambda) then lambda_mrcc = lambda_mrcc_old @@ -110,11 +112,18 @@ END_PROVIDER lambda_mrcc_pt2(N_lambda_mrcc_pt2) = i endif endif + j = int(lambda_mrcc(k,i) * 100) + if(j < -200) j = -200 + if(j > 200) j = 200 + histo(j) += 1 enddo enddo lambda_mrcc_pt2(0) = N_lambda_mrcc_pt2 end if +! do i=-200,200 +! print *, i, histo(i) +! end do print*,'N_det_non_ref = ',N_det_non_ref !print*,'Number of ignored determinants = ',i_pert_count print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) @@ -152,6 +161,7 @@ END_PROVIDER delta_ij = 0.d0 delta_ii = 0.d0 call H_apply_mrcc(delta_ij,delta_ii,N_states,N_det_non_ref,N_det_ref) + END_PROVIDER BEGIN_PROVIDER [ double precision, h_matrix_dressed, (N_det,N_det,N_states) ] diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index cb0747e8..a02635ad 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -37,6 +37,19 @@ use bitmasks stop "invalid mrmode" end if end do + do i=1,N_det_ref + print *, delta_ii(1,i) + end do + do i=1,N_det_non_ref + print *, delta_ij(1,i,:) + end do +! stop + +! 5.7717252361566333E-005 +! -1.4525812360153183E-005 +! -3.3282906594800186E-005 +! -1.3864228814283882E-004 + END_PROVIDER @@ -52,7 +65,7 @@ END_PROVIDER implicit none integer(bit_kind) :: det_noactive(N_int, 2, N_det_non_ref), nonactive_sorb(N_int,2), det(N_int, 2) - integer i, II, j, k, ni + integer i, II, j, k, n, ni, idx(N_det_non_ref), shortcut(0:N_det_non_ref+1) logical, external :: detEq active_sorb(:,:) = 0_8 @@ -82,30 +95,13 @@ END_PROVIDER call sort_dets_ab(det_noactive, det_cepa0_idx, cepa0_shortcut, N_det_non_ref, N_int) - do i=1,N_det_ref - do k=1, N_int - det_ref_active(k,1,i) = iand(psi_ref(k,1,i), active_sorb(k,1)) - det_ref_active(k,2,i) = iand(psi_ref(k,2,i), active_sorb(k,2)) - !det_ref_active(i) = det_ref_active(i) + iand(psi_ref(1,2,i), active_sorb(2)) * 2_8**32_8 - end do - end do - - cepa0_shortcut(0) = 1 - cepa0_shortcut(1) = 1 - do k=1, N_int - det_cepa0_active(k,1,1) = iand(psi_non_ref(k,1,det_cepa0_idx(1)), active_sorb(k,1)) - det_cepa0_active(k,2,1) = iand(psi_non_ref(k,2,det_cepa0_idx(1)), active_sorb(k,2)) - !det_cepa0_active(1) = det_cepa0_active(1) + iand(psi_non_ref(1,2,det_cepa0_idx(1)), active_sorb(2)) * 2_8**32_8 + do i=1,N_det_non_ref + det_cepa0(:,:,i) = psi_non_ref(:,:,det_cepa0_idx(i)) end do + cepa0_shortcut(0) = 1 + cepa0_shortcut(1) = 1 do i=2,N_det_non_ref - do k=1, N_int - det_cepa0_active(k,1,i) = iand(psi_non_ref(k,1,det_cepa0_idx(i)), active_sorb(k,1)) - det_cepa0_active(k,2,i) = iand(psi_non_ref(k,2,det_cepa0_idx(i)), active_sorb(k,2)) - end do -! det_cepa0_active(i) = iand(psi_non_ref(1,1,det_cepa0_idx(i)), active_sorb(1)) -! det_cepa0_active(i) = det_cepa0_active(i) + iand(psi_non_ref(1,2,det_cepa0_idx(i)), active_sorb(2)) * 2_8**32_8 - if(.not. detEq(det_noactive(1,1,i), det_noactive(1,1,i-1), N_int)) then cepa0_shortcut(0) += 1 cepa0_shortcut(cepa0_shortcut(0)) = i @@ -113,10 +109,35 @@ END_PROVIDER end do cepa0_shortcut(cepa0_shortcut(0)+1) = N_det_non_ref+1 - do i=1,N_det_non_ref - det_cepa0(:,:,i) = psi_non_ref(:,:,det_cepa0_idx(i)) + if(.true.) then + do i=1,cepa0_shortcut(0) + n = cepa0_shortcut(i+1) - cepa0_shortcut(i) + call sort_dets_ab(det_cepa0(1,1,cepa0_shortcut(i)), idx, shortcut, n, N_int) + do k=1,n + idx(k) = det_cepa0_idx(cepa0_shortcut(i)-1+idx(k)) + end do + det_cepa0_idx(cepa0_shortcut(i):cepa0_shortcut(i)+n-1) = idx(:n) + end do + end if + + + do i=1,N_det_ref + do k=1, N_int + det_ref_active(k,1,i) = iand(psi_ref(k,1,i), active_sorb(k,1)) + det_ref_active(k,2,i) = iand(psi_ref(k,2,i), active_sorb(k,2)) + end do end do + do i=1,N_det_non_ref + do k=1, N_int + det_cepa0_active(k,1,i) = iand(psi_non_ref(k,1,det_cepa0_idx(i)), active_sorb(k,1)) + det_cepa0_active(k,2,i) = iand(psi_non_ref(k,2,det_cepa0_idx(i)), active_sorb(k,2)) + end do + end do + + do i=1,N_det_non_ref + if(.not. detEq(psi_non_ref(1,1,det_cepa0_idx(i)), det_cepa0(1,1,i),N_int)) stop "STOOOP" + end do print *, "pre done" END_PROVIDER @@ -199,7 +220,7 @@ END_PROVIDER npre += npres(i) end do print *, npre - stop + !stop do i=1,N_det_ref do j=1,i delta_cas(j,i,i_state) = delta_cas(i,j,i_state) @@ -294,7 +315,18 @@ integer function searchDet(dets, det, n, Nint) integer, intent(in) :: nint, n integer :: l, h, c integer, external :: detCmp - + logical, external :: detEq + + !do l=1,n + ! if(detEq(det(1,1), dets(1,1,l),Nint)) then + ! searchDet = l + ! return + ! end if + !end do + !searchDet = -1 + !return + + l = 1 h = n do while(.true.) @@ -369,14 +401,15 @@ end subroutine logical, external :: is_in_wavefunction, detEq integer :: II, blok - + integer*8, save :: notf = 0 + call wall_time(wall) print *, "cepa0", wall provide det_cepa0_active delta_cas lambda_mrcc provide mo_bielec_integrals_in_map allocate(idx_sorted_bit(N_det)) - sortRef = det_ref_active(:,:,:N_det_ref) + sortRef(:,:,:) = det_ref_active(:,:,:) call sort_det(sortRef, sortRefIdx, N_det_ref, N_int) idx_sorted_bit(:) = -1 @@ -393,7 +426,7 @@ end subroutine !$OMP private(m,i,II,J,k,degree,myActive,made_hole,made_particle,hjk,contrib) & !$OMP shared(active_sorb, psi_non_ref, psi_non_ref_coef, psi_ref, psi_ref_coef, cepa0_shortcut, det_cepa0_active) & !$OMP shared(N_det_ref, N_det_non_ref,N_int,det_cepa0_idx,lambda_mrcc,det_ref_active, delta_cas) & - !$OMP shared(i_state, sortRef, sortRefIdx) + !$OMP shared(notf,i_state, sortRef, sortRefIdx) do blok=1,cepa0_shortcut(0) do i=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 do II=1,N_det_ref @@ -409,7 +442,7 @@ end subroutine end do - kloop: do k=cepa0_shortcut(blok), i + kloop: do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 !i if(lambda_mrcc(i_state, det_cepa0_idx(k)) == 0d0) cycle do ni=1,N_int @@ -426,9 +459,17 @@ end subroutine end do j = searchDet(sortRef, myActive, N_det_ref, N_int) - if(j == -1) cycle + if(j == -1) then + cycle + end if j = sortRefIdx(j) - + !$OMP ATOMIC + notf = notf+1 + !if(i/=k .and. dabs(psi_non_ref_coef(det_cepa0_idx(i),i_state)) < dabs(psi_non_ref_coef(det_cepa0_idx(k),i_state))) cycle +! if(dabs(lambda_mrcc(i_state,det_cepa0_idx(i))) > dabs(lambda_mrcc(i_state,det_cepa0_idx(k)))) cycle +! if(dabs(lambda_mrcc(i_state,det_cepa0_idx(i))) == dabs(lambda_mrcc(i_state,det_cepa0_idx(k))) .and. i < k) cycle + !if(.not. j==II .and. dabs(psi_ref_coef(II,i_state)) < dabs(psi_ref_coef(j,i_state))) cycle + call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,HJk) contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k)) !$OMP ATOMIC @@ -436,7 +477,7 @@ end subroutine if(dabs(psi_ref_coef(J,i_state)).ge.5.d-5) then !$OMP ATOMIC - delta_mrcepa0_ii(J,i_state) -= contrib / psi_ref_coef(J, i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) + delta_mrcepa0_ii(J,i_state) -= contrib / psi_ref_coef(J, i_state) * psi_non_ref_coef(det_cepa0_idx(i),i_state) end if end do kloop @@ -447,8 +488,8 @@ end subroutine end do deallocate(idx_sorted_bit) call wall_time(wall) - print *, "cepa0", wall - stop + print *, "cepa0", wall, notf + !stop END_PROVIDER @@ -564,21 +605,31 @@ subroutine set_det_bit(det, p, s) end subroutine +BEGIN_PROVIDER [ double precision, h_, (N_det_ref,N_det_non_ref) ] + integer :: i,j + do i=1,N_det_ref + do j=1,N_det_non_ref + call i_h_j(psi_ref(1,1,i), psi_non_ref(1,1,j), N_int, h_(i,j)) + end do + end do +END_PROVIDER + + BEGIN_PROVIDER [ double precision, delta_ij_old, (N_det_ref,N_det_non_ref,N_states) ] &BEGIN_PROVIDER [ double precision, delta_ii_old, (N_det_ref,N_states) ] implicit none integer :: i_state, i, i_I, J, k, kk, degree, degree2, m, l, deg, ni - integer :: p1,p2,h1,h2,s1,s2, blok + integer :: p1,p2,h1,h2,s1,s2, blok, I_s, J_s integer, allocatable :: linked(:,:), blokMwen(:, :), nlink(:) logical :: ok - double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(N_states), HkI, ci_inv(N_states), dia_hla(N_states) + double precision :: phase_iI, phase_Ik, phase_Jl, phase_Ji, phase_al, diI, hIi, hJi, delta_JI, dkI(N_states), HkI, ci_inv(N_states), dia_hla(N_states) double precision :: contrib, wall, iwall integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2), inac, virt - integer, allocatable :: idx_sorted_bit(:) - integer, external :: get_index_in_psi_det_sorted_bit, searchDet - logical, external :: is_in_wavefunction, isInCassd + integer, allocatable :: idx_sorted_bit(:) + integer, external :: get_index_in_psi_det_sorted_bit, searchDet, detCmp + logical, external :: is_in_wavefunction, isInCassd, detEq call wall_time(iwall) @@ -593,10 +644,10 @@ end subroutine do i_state = 1, N_states - delta_ii_old(:,:) = 0 - delta_ij_old(:,:,:) = 0 + delta_ii_old(:,:) = 0d0 + delta_ij_old(:,:,:) = 0d0 - !$OMP PARALLEL DO default(none) schedule(dynamic) private(blok,k,degree) shared(linked,blokMwen,psi_ref, det_cepa0,cepa0_shortcut, N_int) + !$OMP PARALLEL DO default(none) schedule(dynamic) private(blok,k,degree) shared(nlink,linked,blokMwen,psi_ref, det_cepa0,cepa0_shortcut, N_det_ref, N_int) do J = 1, N_det_ref nlink(J) = 0 do blok=1,cepa0_shortcut(0) @@ -615,13 +666,13 @@ end subroutine !$OMP PARALLEL DO default(none) schedule(dynamic,10) shared(delta_ij_old, delta_ii_old) & - !$OMP private(kk, i, J, k, degree, degree2, l, deg, ni, inac, virt) & - !$OMP private(ok,p1,p2,h1,h2,s1,s2, blok, wall) & - !$OMP private(phase_iI, phase_Ik, phase_Jl, phase_IJ, diI, hIi, hJi, delta_JI, dkI, HkI, ci_inv, dia_hla) & + !$OMP private(m,kk, i_I, i, J, k, degree, degree2, l, deg, ni, inac, virt) & + !$OMP private(ok,p1,p2,h1,h2,s1,s2, blok, wall, I_s, J_s) & + !$OMP private(phase_iI, phase_Ik, phase_Ji, phase_al, diI, hIi, hJi, delta_JI, dkI, HkI, ci_inv, dia_hla) & !$OMP private(contrib, exc_iI, exc_Ik, exc_IJ, det_tmp, det_tmp2) & !$OMP shared(idx_sorted_bit, N_det_non_ref, N_det_ref, N_int, psi_non_ref, psi_non_ref_coef, psi_ref, psi_ref_coef) & !$OMP shared(i_state, lambda_mrcc, hf_bitmask, active_sorb,cepa0_shortcut,det_cepa0) & - !$OMP shared(det_cepa0_idx, linked, blokMwen, nlink, iwall) + !$OMP shared(h_,det_cepa0_idx, linked, blokMwen, nlink, iwall) do i = 1 , N_det_non_ref if(mod(i,100) == 0) then call wall_time(wall) @@ -632,28 +683,38 @@ end subroutine if(lambda_mrcc(i_state, i) == 0d0) cycle - do i_I = 1, N_det_ref + do I_s = 1, N_det_ref + do J_s = 1, N_det_ref - call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,i),exc_iI,degree2,phase_iI,N_int) - if(degree2 == -1) cycle - - - ci_inv(i_state) = 1.d0 / psi_ref_coef(i_I,i_state) - - - call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,i_I),N_int,hIi) - diI = hIi * lambda_mrcc(i_state, i) - do J = 1 , i_I ! N_det_ref !!! - call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,J),N_int,hJi) + if(.true. .or. nlink(I_s) < nlink(J_s)) then + i_I = I_s + J = J_s + else + i_I = J_s + J = I_s + end if + + !call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,J),N_int,hJi) + !!!! + call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) + !!!!!! + hJi = h_(J,i) if(hJi == 0) cycle + hIi = h_(i_I,i) + if(hIi == 0) cycle + + diI = hIi * lambda_mrcc(i_state, i) delta_JI = hJi * diI + + call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,i),exc_iI,degree2,phase_iI,N_int) + if(degree2 == -1) cycle + !call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,i_I),N_int,hIi) do kk = 1 , nlink(i_I) k = linked(kk,i_I) blok = blokMwen(kk,i_I) - if(lambda_mrcc(i_state, det_cepa0_idx(k)) == 0d0) cycle - + !if(lambda_mrcc(i_state, det_cepa0_idx(k)) == 0d0) cycle call get_excitation(psi_ref(1,1,i_I),det_cepa0(1,1,k),exc_Ik,degree,phase_Ik,N_int) @@ -661,44 +722,72 @@ end subroutine if(degree == -1) stop "STOP; ( linked )" - call apply_excitation(det_cepa0(1,1,i),exc_Ik,det_tmp,ok,N_int) + call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) if(.not. ok) cycle - - call apply_excitation(psi_ref(1,1,J),exc_Ik,det_tmp2,ok,N_int) if(.not. ok) cycle if(isInCassd(det_tmp, N_int)) cycle + + + l = searchDet(det_cepa0(1,1,cepa0_shortcut(blok)), det_tmp2, cepa0_shortcut(blok+1)-cepa0_shortcut(blok), N_int) + if(l == -1) cycle + l = det_cepa0_idx(cepa0_shortcut(blok)-1+l) + !call i_h_j(det_cepa0(1,1,k), det_tmp, N_int, HiI) + !call i_h_j(psi_non_ref(1,1,l), det_tmp, N_int, HJi) + call get_excitation(det_tmp,psi_non_ref(1,1,l),exc_IJ,degree2,phase_al,N_int) + + diI = hIi * lambda_mrcc(i_state, i) + delta_JI = hJi * diI * phase_al * phase_Ji + + - l = searchDet(det_cepa0(1,1,cepa0_shortcut(blok)), det_tmp2, cepa0_shortcut(blok+1) - cepa0_shortcut(blok), N_int) - !print *, "LL", l - if(l == -1) cycle !! -1 pour - l += cepa0_shortcut(blok) - 1 - l = det_cepa0_idx(l) - - l = idx_sorted_bit(l) - if(l ==-1) cycle - - + + !if(psi_ref_coef(I_i,i_state) < psi_ref_coef(J,i_state)) then + ci_inv(i_state) = 1.d0 / psi_ref_coef(i_I,i_state) + HkI = h_(i_I,det_cepa0_idx(k)) + dkI(i_state) = HkI * lambda_mrcc(i_state, det_cepa0_idx(k)) + contrib = dkI(i_state) * delta_JI + !!$OMP ATOMIC + delta_ij_old(i_I,l,i_state) += contrib + if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then + !!$OMP ATOMIC + delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(l,i_state) + else + delta_ii_old(i_I,i_state) = 0.d0 + endif +! - call i_h_j(det_cepa0(1,1,k), psi_ref(1,1,i_I),N_int,HkI) - dkI(i_state) = HkI * lambda_mrcc(i_state, det_cepa0_idx(k)) - contrib = dkI(i_state) * delta_JI - !$OMP ATOMIC - delta_ij_old(i_I,l,i_state) += contrib - if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then - !$OMP ATOMIC - delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) - endif + + +! ci_inv(i_state) = 1.d0 / psi_ref_coef(J,i_state) +! HkI = h_(J,l) +! dkI(i_state) = HkI * lambda_mrcc(i_state, l) +! contrib = dkI(i_state) * delta_JI +! !!$OMP ATOMIC +! delta_ij_old(J,det_cepa0_idx(k),i_state) += contrib +! if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then +! !!$OMP ATOMIC +! delta_ii_old(J,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(l,i_state) +! + +! end if enddo enddo enddo enddo - !$OMP END PARALLEL DO + !$OMP END PARALLEL DO + +! do i=1,N_det_non_ref +! print *, delta_ij_old(:,i,i_state) +! end do +! stop end do deallocate(idx_sorted_bit) + + ! call wall_time(wall) ! print *, "old ", wall END_PROVIDER From eddc87531e538edd478acac812a4650c80f30053 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 28 Apr 2016 09:55:07 +0200 Subject: [PATCH 016/216] zmq mrsc2 - bad granularity --- config/gfortran.cfg | 2 +- plugins/MRCC_Utils/mrcc_utils.irp.f | 8 +- plugins/mrcepa0/NEEDED_CHILDREN_MODULES | 2 +- plugins/mrcepa0/dressing.irp.f | 229 +++++++++++++++++++----- 4 files changed, 195 insertions(+), 46 deletions(-) diff --git a/config/gfortran.cfg b/config/gfortran.cfg index c0aa875f..a1940bdb 100644 --- a/config/gfortran.cfg +++ b/config/gfortran.cfg @@ -22,7 +22,7 @@ IRPF90_FLAGS : --ninja --align=32 # 0 : Deactivate # [OPTION] -MODE : OPT ; [ OPT | PROFILE | DEBUG ] : Chooses the section below +MODE : DEBUG ; [ OPT | PROFILE | DEBUG ] : Chooses the section below CACHE : 1 ; Enable cache_compile.py OPENMP : 1 ; Append OpenMP flags diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 71757987..cfaf7a67 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -112,10 +112,10 @@ END_PROVIDER lambda_mrcc_pt2(N_lambda_mrcc_pt2) = i endif endif - j = int(lambda_mrcc(k,i) * 100) - if(j < -200) j = -200 - if(j > 200) j = 200 - histo(j) += 1 +! j = int(lambda_mrcc(k,i) * 100) +! if(j < -200) j = -200 +! if(j > 200) j = 200 +! histo(j) += 1 enddo enddo lambda_mrcc_pt2(0) = N_lambda_mrcc_pt2 diff --git a/plugins/mrcepa0/NEEDED_CHILDREN_MODULES b/plugins/mrcepa0/NEEDED_CHILDREN_MODULES index a8404d62..8b6c5a18 100644 --- a/plugins/mrcepa0/NEEDED_CHILDREN_MODULES +++ b/plugins/mrcepa0/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Perturbation Selectors_full Generators_full Psiref_CAS MRCC_Utils +Perturbation Selectors_full Generators_full Psiref_CAS MRCC_Utils ZMQ diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index a02635ad..6e901962 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -40,15 +40,11 @@ use bitmasks do i=1,N_det_ref print *, delta_ii(1,i) end do - do i=1,N_det_non_ref + do i=1,min(N_det_non_ref,100) print *, delta_ij(1,i,:) end do ! stop -! 5.7717252361566333E-005 -! -1.4525812360153183E-005 -! -3.3282906594800186E-005 -! -1.3864228814283882E-004 END_PROVIDER @@ -615,8 +611,9 @@ BEGIN_PROVIDER [ double precision, h_, (N_det_ref,N_det_non_ref) ] END_PROVIDER - BEGIN_PROVIDER [ double precision, delta_ij_old, (N_det_ref,N_det_non_ref,N_states) ] -&BEGIN_PROVIDER [ double precision, delta_ii_old, (N_det_ref,N_states) ] + + BEGIN_PROVIDER [ double precision, delta_ij_older, (N_det_ref,N_det_non_ref,N_states) ] +&BEGIN_PROVIDER [ double precision, delta_ii_older, (N_det_ref,N_states) ] implicit none integer :: i_state, i, i_I, J, k, kk, degree, degree2, m, l, deg, ni @@ -624,14 +621,17 @@ END_PROVIDER integer, allocatable :: linked(:,:), blokMwen(:, :), nlink(:) logical :: ok double precision :: phase_iI, phase_Ik, phase_Jl, phase_Ji, phase_al, diI, hIi, hJi, delta_JI, dkI(N_states), HkI, ci_inv(N_states), dia_hla(N_states) - double precision :: contrib, wall, iwall + double precision :: contrib, wall, iwall, searchance(N_det_ref) + double precision, allocatable :: deltaMwen(:,:,:), deltaIImwen(:,:) integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2), inac, virt integer, allocatable :: idx_sorted_bit(:) integer, external :: get_index_in_psi_det_sorted_bit, searchDet, detCmp logical, external :: is_in_wavefunction, isInCassd, detEq - + ! -459.6346665282306 + ! -459.6346665282306 + call wall_time(iwall) allocate(idx_sorted_bit(N_det)) allocate(linked(N_det_non_ref, N_det_ref), blokMwen(N_det_non_ref, N_det_ref), nlink(N_det_ref)) @@ -646,8 +646,8 @@ END_PROVIDER delta_ii_old(:,:) = 0d0 delta_ij_old(:,:,:) = 0d0 - - !$OMP PARALLEL DO default(none) schedule(dynamic) private(blok,k,degree) shared(nlink,linked,blokMwen,psi_ref, det_cepa0,cepa0_shortcut, N_det_ref, N_int) + searchance = 0d0 + !$OMP PARALLEL DO default(none) schedule(dynamic) private(blok,k,degree) shared(searchance,nlink,linked,blokMwen,psi_ref, det_cepa0,cepa0_shortcut, N_det_ref, N_int) do J = 1, N_det_ref nlink(J) = 0 do blok=1,cepa0_shortcut(0) @@ -657,6 +657,7 @@ END_PROVIDER nlink(J) += 1 linked(nlink(J),J) = k blokMwen(nlink(J),J) = blok + searchance(J) += log(dfloat(cepa0_shortcut(blok+1) - cepa0_shortcut(blok))) end if end do end do @@ -664,6 +665,10 @@ END_PROVIDER !$OMP END PARALLEL DO +! do i=1,cepa0_shortcut(0) +! print *, cepa0_shortcut(i+1) - cepa0_shortcut(i) +! end do + !$OMP PARALLEL DO default(none) schedule(dynamic,10) shared(delta_ij_old, delta_ii_old) & !$OMP private(m,kk, i_I, i, J, k, degree, degree2, l, deg, ni, inac, virt) & @@ -672,7 +677,7 @@ END_PROVIDER !$OMP private(contrib, exc_iI, exc_Ik, exc_IJ, det_tmp, det_tmp2) & !$OMP shared(idx_sorted_bit, N_det_non_ref, N_det_ref, N_int, psi_non_ref, psi_non_ref_coef, psi_ref, psi_ref_coef) & !$OMP shared(i_state, lambda_mrcc, hf_bitmask, active_sorb,cepa0_shortcut,det_cepa0) & - !$OMP shared(h_,det_cepa0_idx, linked, blokMwen, nlink, iwall) + !$OMP shared(h_,det_cepa0_idx, linked, blokMwen, nlink, iwall, searchance) do i = 1 , N_det_non_ref if(mod(i,100) == 0) then call wall_time(wall) @@ -684,9 +689,10 @@ END_PROVIDER do I_s = 1, N_det_ref - do J_s = 1, N_det_ref + do J_s = 1, I_s - if(.true. .or. nlink(I_s) < nlink(J_s)) then + if(nlink(I_s) < nlink(J_s)) then + !if(searchance(I_s) < searchance(J_s)) then i_I = I_s J = J_s else @@ -696,7 +702,7 @@ END_PROVIDER !call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,J),N_int,hJi) !!!! - call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) + !!!!!! hJi = h_(J,i) if(hJi == 0) cycle @@ -736,43 +742,38 @@ END_PROVIDER l = det_cepa0_idx(cepa0_shortcut(blok)-1+l) !call i_h_j(det_cepa0(1,1,k), det_tmp, N_int, HiI) !call i_h_j(psi_non_ref(1,1,l), det_tmp, N_int, HJi) - call get_excitation(det_tmp,psi_non_ref(1,1,l),exc_IJ,degree2,phase_al,N_int) - diI = hIi * lambda_mrcc(i_state, i) - delta_JI = hJi * diI * phase_al * phase_Ji - - - !if(psi_ref_coef(I_i,i_state) < psi_ref_coef(J,i_state)) then + call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) + call get_excitation(det_tmp,psi_non_ref(1,1,l),exc_IJ,degree2,phase_al,N_int) + delta_JI = hJi * hIi * lambda_mrcc(i_state, i) * phase_al * phase_Ji ci_inv(i_state) = 1.d0 / psi_ref_coef(i_I,i_state) HkI = h_(i_I,det_cepa0_idx(k)) dkI(i_state) = HkI * lambda_mrcc(i_state, det_cepa0_idx(k)) contrib = dkI(i_state) * delta_JI - !!$OMP ATOMIC + !$OMP ATOMIC delta_ij_old(i_I,l,i_state) += contrib if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then - !!$OMP ATOMIC + !$OMP ATOMIC delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(l,i_state) - else - delta_ii_old(i_I,i_state) = 0.d0 endif ! - - - -! ci_inv(i_state) = 1.d0 / psi_ref_coef(J,i_state) -! HkI = h_(J,l) -! dkI(i_state) = HkI * lambda_mrcc(i_state, l) -! contrib = dkI(i_state) * delta_JI -! !!$OMP ATOMIC -! delta_ij_old(J,det_cepa0_idx(k),i_state) += contrib -! if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then -! !!$OMP ATOMIC -! delta_ii_old(J,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(l,i_state) -! - -! end if + if(l == det_cepa0_idx(k)) cycle + call get_excitation(psi_ref(1,1,I_i),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) + call get_excitation(det_tmp,det_cepa0(1,1,k),exc_IJ,degree2,phase_al,N_int) + delta_JI = hJi * hIi * lambda_mrcc(i_state, i) * phase_al * phase_Ji + + ci_inv(i_state) = 1.d0 / psi_ref_coef(J,i_state) + HkI = h_(J,l) + dkI(i_state) = HkI * lambda_mrcc(i_state, l) + contrib = dkI(i_state) * delta_JI + !$OMP ATOMIC + delta_ij_old(J,det_cepa0_idx(k),i_state) += contrib + if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then + !$OMP ATOMIC + delta_ii_old(J,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) + end if enddo enddo @@ -792,6 +793,154 @@ END_PROVIDER ! print *, "old ", wall END_PROVIDER +! +! BEGIN_PROVIDER [ double precision, delta_ij_old, (N_det_ref,N_det_non_ref,N_states) ] +! &BEGIN_PROVIDER [ double precision, delta_ii_old, (N_det_ref,N_states) ] +! implicit none +! +! integer :: i_state, i, i_I, J, k, kk, degree, degree2, m, l, deg, ni, m2 +! integer :: p1,p2,h1,h2,s1,s2, blok, I_s, J_s +! integer, allocatable :: linked(:,:), blokMwen(:, :), nlink(:) +! logical :: ok +! double precision :: phase_iI, phase_Ik, phase_Jl, phase_Ji, phase_al, diI, hIi, hJi, delta_JI, dkI(N_states), HkI, ci_inv(N_states), dia_hla(N_states) +! double precision :: contrib, wall, iwall, searchance(N_det_ref) +! double precision, allocatable :: deltaMwen(:,:,:), deltaIImwen(:,:) +! integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ +! integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2), inac, virt +! integer, external :: get_index_in_psi_det_sorted_bit, searchDet, detCmp +! logical, external :: is_in_wavefunction, isInCassd, detEq +! +! ! -459.6346665282306 +! ! -459.6346665282306 +! +! call wall_time(iwall) +! allocate(linked(N_det_non_ref, N_det_ref), blokMwen(N_det_non_ref, N_det_ref), nlink(N_det_ref)) +! +! +! delta_ii_old(:,:) = 0d0 +! delta_ij_old(:,:,:) = 0d0 +! +! searchance = 0d0 +! do J = 1, N_det_ref +! nlink(J) = 0 +! do blok=1,cepa0_shortcut(0) +! do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 +! call get_excitation_degree(psi_ref(1,1,J),det_cepa0(1,1,k),degree,N_int) +! if(degree <= 2) then +! nlink(J) += 1 +! linked(nlink(J),J) = k +! blokMwen(nlink(J),J) = blok +! searchance(J) += log(dfloat(cepa0_shortcut(blok+1) - cepa0_shortcut(blok))) +! end if +! end do +! end do +! end do +! +! +! +! do I_s = 1, N_det_ref +! if(mod(I_s,1) == 0) then +! call wall_time(wall) +! wall = wall-iwall +! print *, I_s, "/", N_det_ref, wall * (dfloat(N_det_ref) / dfloat(I_s)), wall, wall * (dfloat(N_det_ref) / dfloat(I_s))-wall +! end if +! +! +! do J_s = 1, I_s +! +! +! if(searchance(I_s) < searchance(J_s)) then +! i_I = I_s +! J = J_s +! else +! i_I = J_s +! J = I_s +! end if +! +! do kk = 1 , nlink(i_I) +! k = linked(kk,i_I) +! blok = blokMwen(kk,i_I) +! +! +! call get_excitation(psi_ref(1,1,i_I),det_cepa0(1,1,k),exc_Ik,degree,phase_Ik,N_int) +! +! call apply_excitation(psi_ref(1,1,J),exc_Ik,det_tmp2,ok,N_int) +! if(.not. ok) cycle +! +! +! +! +! l = searchDet(det_cepa0(1,1,cepa0_shortcut(blok)), det_tmp2, cepa0_shortcut(blok+1)-cepa0_shortcut(blok), N_int) +! if(l == -1) cycle +! l = det_cepa0_idx(cepa0_shortcut(blok)-1+l) +! +! +! +! m = 1 +! m2 = 1 +! do while(m <= nlink(i_I) .and. m2 <= nlink(J)) +! if(linked(m, i_I) < linked(m2, J)) then +! m += 1 +! cycle +! else if(linked(m, i_I) > linked(m2, J)) then +! m2 += 1 +! cycle +! end if +! +! +! i = det_cepa0_idx(linked(m,i_I)) +! m += 1 +! m2 += 1 +! +! do i_state = 1, N_states +! if(lambda_mrcc(i_state, i) == 0d0) cycle +! +! +! hJi = h_(J,i) +! if(hJi == 0) cycle +! hIi = h_(i_I,i) +! if(hIi == 0) cycle +! +! call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) +! if(.not. ok) cycle +! +! +! if(isInCassd(det_tmp, N_int)) cycle +! +! +! call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) +! call get_excitation(det_tmp,psi_non_ref(1,1,l),exc_IJ,degree2,phase_al,N_int) +! delta_JI = hJi * hIi * lambda_mrcc(i_state, i) * phase_al * phase_Ji +! ci_inv(i_state) = 1.d0 / psi_ref_coef(i_I,i_state) +! HkI = h_(i_I,det_cepa0_idx(k)) +! dkI(i_state) = HkI * lambda_mrcc(i_state, det_cepa0_idx(k)) +! contrib = dkI(i_state) * delta_JI +! delta_ij_old(i_I,l,i_state) += contrib +! if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then +! delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(l,i_state) +! endif +! ! +! if(l == det_cepa0_idx(k)) cycle +! call get_excitation(psi_ref(1,1,I_i),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) +! call get_excitation(det_tmp,det_cepa0(1,1,k),exc_IJ,degree2,phase_al,N_int) +! delta_JI = hJi * hIi * lambda_mrcc(i_state, i) * phase_al * phase_Ji +! +! ci_inv(i_state) = 1.d0 / psi_ref_coef(J,i_state) +! HkI = h_(J,l) +! dkI(i_state) = HkI * lambda_mrcc(i_state, l) +! contrib = dkI(i_state) * delta_JI +! delta_ij_old(J,det_cepa0_idx(k),i_state) += contrib +! if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then +! delta_ii_old(J,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) +! end if +! enddo !i_state +! end do ! while +! enddo !kk +! enddo !J +! +! enddo !I +! +! END_PROVIDER From 174b5d006e4ef4c1cd0f40c0f1b0a0043b72210c Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 29 Apr 2016 16:23:20 +0200 Subject: [PATCH 017/216] optimized --- plugins/mrcepa0/dressing.irp.f | 121 ++++++++++++++++++++++----------- 1 file changed, 83 insertions(+), 38 deletions(-) diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 6e901962..9b80ae09 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -20,10 +20,16 @@ use bitmasks end do end do else if(mrmode == 2) then +! do i = 1, N_det_ref +! delta_ii(i_state,i)= delta_ii_old(i,i_state) +! do j = 1, N_det_non_ref +! delta_ij(i_state,j,i) = delta_ij_old(i,j,i_state) +! end do +! end do do i = 1, N_det_ref - delta_ii(i_state,i)= delta_ii_old(i,i_state) + delta_ii(i_state,i)= delta_ii_old(i_state,i) do j = 1, N_det_non_ref - delta_ij(i_state,j,i) = delta_ij_old(i,j,i_state) + delta_ij(i_state,j,i) = delta_ij_old(i_state,j,i) end do end do else if(mrmode == 1) then @@ -37,12 +43,12 @@ use bitmasks stop "invalid mrmode" end if end do - do i=1,N_det_ref - print *, delta_ii(1,i) - end do - do i=1,min(N_det_non_ref,100) - print *, delta_ij(1,i,:) - end do +! do i=1,N_det_ref +! print *, delta_ii(1,i) +! end do +! do i=1,min(N_det_non_ref,100) +! print *, delta_ij(1,i,:) +! end do ! stop @@ -57,11 +63,17 @@ END_PROVIDER &BEGIN_PROVIDER [ integer(bit_kind), det_ref_active, (N_int,2,N_det_ref) ] &BEGIN_PROVIDER [ integer(bit_kind), active_sorb, (N_int,2) ] &BEGIN_PROVIDER [ integer(bit_kind), det_cepa0, (N_int,2,N_det_non_ref) ] +&BEGIN_PROVIDER [ integer, nlink, (N_det_ref) ] +&BEGIN_PROVIDER [ integer, linked, (N_det_non_ref,N_det_ref) ] +&BEGIN_PROVIDER [ integer, blokMwen, (N_det_non_ref,N_det_ref) ] +&BEGIN_PROVIDER [ double precision, searchance, (N_det_ref) ] +&BEGIN_PROVIDER [ integer, child_num, (N_det_non_ref,N_det_ref) ] + use bitmasks implicit none integer(bit_kind) :: det_noactive(N_int, 2, N_det_non_ref), nonactive_sorb(N_int,2), det(N_int, 2) - integer i, II, j, k, n, ni, idx(N_det_non_ref), shortcut(0:N_det_non_ref+1) + integer i, II, j, k, n, ni, idx(N_det_non_ref), shortcut(0:N_det_non_ref+1), blok, degree logical, external :: detEq active_sorb(:,:) = 0_8 @@ -134,6 +146,25 @@ END_PROVIDER do i=1,N_det_non_ref if(.not. detEq(psi_non_ref(1,1,det_cepa0_idx(i)), det_cepa0(1,1,i),N_int)) stop "STOOOP" end do + + searchance = 0d0 + child_num = 0 + do J = 1, N_det_ref + nlink(J) = 0 + do blok=1,cepa0_shortcut(0) + do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 + call get_excitation_degree(psi_ref(1,1,J),det_cepa0(1,1,k),degree,N_int) + if(degree <= 2) then + nlink(J) += 1 + linked(nlink(J),J) = k + child_num(k, J) = nlink(J) + blokMwen(nlink(J),J) = blok + searchance(J) += 1d0 + log(dfloat(cepa0_shortcut(blok+1) - cepa0_shortcut(blok))) + end if + end do + end do + end do + print *, "pre done" END_PROVIDER @@ -186,14 +217,14 @@ END_PROVIDER call wall_time(wall) print *, "dcas ", wall do i_state = 1, N_states - !$OMP PARALLEL DO default(none) schedule(dynamic) private(pre,npre,ipre,j,k,Hjk,Hki,degree) shared(npres,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) + !!$OMP PARALLEL DO default(none) schedule(dynamic) private(pre,npre,ipre,j,k,Hjk,Hki,degree) shared(npres,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) do k=1,N_det_non_ref if(lambda_mrcc(i_state, k) == 0d0) cycle npre = 0 do i=1,N_det_ref call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki) if(Hki /= 0d0) then - !$OMP ATOMIC + !!$OMP ATOMIC npres(i) += 1 npre += 1 ipre(npre) = i @@ -204,12 +235,12 @@ END_PROVIDER do i=1,npre do j=1,i - !$OMP ATOMIC + !!$OMP ATOMIC delta_cas(ipre(i),ipre(j),i_state) += pre(i) * pre(j) * lambda_mrcc(i_state, k) end do end do end do - !$OMP END PARALLEL DO + !!$OMP END PARALLEL DO print *, npres npre=0 do i=1,N_det_ref @@ -618,10 +649,10 @@ END_PROVIDER integer :: i_state, i, i_I, J, k, kk, degree, degree2, m, l, deg, ni integer :: p1,p2,h1,h2,s1,s2, blok, I_s, J_s - integer, allocatable :: linked(:,:), blokMwen(:, :), nlink(:) +! integer, allocatable :: linked(:,:), blokMwen(:, :), nlink(:) logical :: ok double precision :: phase_iI, phase_Ik, phase_Jl, phase_Ji, phase_al, diI, hIi, hJi, delta_JI, dkI(N_states), HkI, ci_inv(N_states), dia_hla(N_states) - double precision :: contrib, wall, iwall, searchance(N_det_ref) + double precision :: contrib, wall, iwall ! , searchance(N_det_ref) double precision, allocatable :: deltaMwen(:,:,:), deltaIImwen(:,:) integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2), inac, virt @@ -634,7 +665,7 @@ END_PROVIDER call wall_time(iwall) allocate(idx_sorted_bit(N_det)) - allocate(linked(N_det_non_ref, N_det_ref), blokMwen(N_det_non_ref, N_det_ref), nlink(N_det_ref)) +! allocate(linked(N_det_non_ref, N_det_ref), blokMwen(N_det_non_ref, N_det_ref), nlink(N_det_ref)) idx_sorted_bit(:) = -1 do i=1,N_det_non_ref @@ -800,10 +831,10 @@ END_PROVIDER ! ! integer :: i_state, i, i_I, J, k, kk, degree, degree2, m, l, deg, ni, m2 ! integer :: p1,p2,h1,h2,s1,s2, blok, I_s, J_s -! integer, allocatable :: linked(:,:), blokMwen(:, :), nlink(:) +! ! integer, allocatable :: linked(:,:), blokMwen(:, :), nlink(:) ! logical :: ok ! double precision :: phase_iI, phase_Ik, phase_Jl, phase_Ji, phase_al, diI, hIi, hJi, delta_JI, dkI(N_states), HkI, ci_inv(N_states), dia_hla(N_states) -! double precision :: contrib, wall, iwall, searchance(N_det_ref) +! double precision :: contrib, wall, iwall !, searchance(N_det_ref) ! double precision, allocatable :: deltaMwen(:,:,:), deltaIImwen(:,:) ! integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ ! integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2), inac, virt @@ -814,27 +845,27 @@ END_PROVIDER ! ! -459.6346665282306 ! ! call wall_time(iwall) -! allocate(linked(N_det_non_ref, N_det_ref), blokMwen(N_det_non_ref, N_det_ref), nlink(N_det_ref)) +! !allocate(linked(N_det_non_ref, N_det_ref), blokMwen(N_det_non_ref, N_det_ref), nlink(N_det_ref)) ! ! ! delta_ii_old(:,:) = 0d0 ! delta_ij_old(:,:,:) = 0d0 ! -! searchance = 0d0 -! do J = 1, N_det_ref -! nlink(J) = 0 -! do blok=1,cepa0_shortcut(0) -! do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 -! call get_excitation_degree(psi_ref(1,1,J),det_cepa0(1,1,k),degree,N_int) -! if(degree <= 2) then -! nlink(J) += 1 -! linked(nlink(J),J) = k -! blokMwen(nlink(J),J) = blok -! searchance(J) += log(dfloat(cepa0_shortcut(blok+1) - cepa0_shortcut(blok))) -! end if -! end do -! end do -! end do +! ! searchance = 0d0 +! ! do J = 1, N_det_ref +! ! nlink(J) = 0 +! ! do blok=1,cepa0_shortcut(0) +! ! do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 +! ! call get_excitation_degree(psi_ref(1,1,J),det_cepa0(1,1,k),degree,N_int) +! ! if(degree <= 2) then +! ! nlink(J) += 1 +! ! linked(nlink(J),J) = k +! ! blokMwen(nlink(J),J) = blok +! ! searchance(J) += log(dfloat(cepa0_shortcut(blok+1) - cepa0_shortcut(blok))) +! ! end if +! ! end do +! ! end do +! ! end do ! ! ! @@ -848,7 +879,9 @@ END_PROVIDER ! ! do J_s = 1, I_s ! -! +! call get_excitation_degree(psi_ref(1,1,J_s), psi_ref(1,1,I_s), degree, N_int) +! if(degree > 3) cycle +! ! if(searchance(I_s) < searchance(J_s)) then ! i_I = I_s ! J = J_s @@ -856,7 +889,15 @@ END_PROVIDER ! i_I = J_s ! J = I_s ! end if -! +! +! !$OMP PARALLEL DO default(none) schedule(dynamic,1) shared(delta_ij_old, delta_ii_old) & +! !$OMP private(m,m2,kk, i, k, degree, degree2, l, deg, ni, inac, virt) & +! !$OMP private(ok,p1,p2,h1,h2,s1,s2, blok, wall, I_s, J_s) & +! !$OMP private(phase_iI, phase_Ik, phase_Ji, phase_al, diI, hIi, hJi, delta_JI, dkI, HkI, ci_inv, dia_hla) & +! !$OMP private(i_state, contrib, exc_iI, exc_Ik, exc_IJ, det_tmp, det_tmp2) & +! !$OMP shared(N_det_non_ref, N_det_ref, N_int, psi_non_ref, psi_non_ref_coef, psi_ref, psi_ref_coef) & +! !$OMP shared(lambda_mrcc, hf_bitmask, active_sorb,cepa0_shortcut,det_cepa0,N_states) & +! !$OMP shared(i_I, J, h_,det_cepa0_idx, linked, blokMwen, nlink, iwall, searchance) ! do kk = 1 , nlink(i_I) ! k = linked(kk,i_I) ! blok = blokMwen(kk,i_I) @@ -915,8 +956,10 @@ END_PROVIDER ! HkI = h_(i_I,det_cepa0_idx(k)) ! dkI(i_state) = HkI * lambda_mrcc(i_state, det_cepa0_idx(k)) ! contrib = dkI(i_state) * delta_JI +! !$OMP ATOMIC ! delta_ij_old(i_I,l,i_state) += contrib ! if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then +! !$OMP ATOMIC ! delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(l,i_state) ! endif ! ! @@ -929,8 +972,10 @@ END_PROVIDER ! HkI = h_(J,l) ! dkI(i_state) = HkI * lambda_mrcc(i_state, l) ! contrib = dkI(i_state) * delta_JI +! !$OMP ATOMIC ! delta_ij_old(J,det_cepa0_idx(k),i_state) += contrib ! if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then +! !$OMP ATOMIC ! delta_ii_old(J,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) ! end if ! enddo !i_state @@ -941,6 +986,6 @@ END_PROVIDER ! enddo !I ! ! END_PROVIDER - - +! ! +! From 23780fb7a9375d0d0ee7085695e838d13efedfa0 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 29 Apr 2016 16:28:12 +0200 Subject: [PATCH 018/216] forgot file --- plugins/mrcepa0/dressing_slave.irp.f | 597 +++++++++++++++++++++++++++ 1 file changed, 597 insertions(+) create mode 100644 plugins/mrcepa0/dressing_slave.irp.f diff --git a/plugins/mrcepa0/dressing_slave.irp.f b/plugins/mrcepa0/dressing_slave.irp.f new file mode 100644 index 00000000..acaf4e34 --- /dev/null +++ b/plugins/mrcepa0/dressing_slave.irp.f @@ -0,0 +1,597 @@ +subroutine mrsc2_dressing_slave_tcp(i) + implicit none + integer, intent(in) :: i + BEGIN_DOC +! Task for parallel MR-SC2 + END_DOC + call mrsc2_dressing_slave(0,i) +end + + +subroutine mrsc2_dressing_slave_inproc(i) + implicit none + integer, intent(in) :: i + BEGIN_DOC +! Task for parallel MR-SC2 + END_DOC + call mrsc2_dressing_slave(1,i) +end + +subroutine mrsc2_dressing_slave(thread,iproc) + use f77_zmq + + implicit none + BEGIN_DOC +! Task for parallel MR-SC2 + END_DOC + integer, intent(in) :: thread, iproc +! integer :: j,l + integer :: rc + + integer :: worker_id, task_id + character*(512) :: task + + integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + + integer(ZMQ_PTR), external :: new_zmq_push_socket + integer(ZMQ_PTR) :: zmq_socket_push + + double precision, allocatable :: delta(:,:,:) + + + + integer :: i_state, i, i_I, J, k, k2, k1, kk, ll, degree, degree2, m, l, deg, ni, m2 + integer :: idx(N_det_non_ref, 2), n(2) + integer :: p1,p2,h1,h2,s1,s2, blok, I_s, J_s, kn + logical :: ok + double precision :: phase_iI, phase_Ik, phase_Jl, phase_Ji, phase_al + double precision :: diI, hIi, hJi, delta_JI, dkI, HkI, ci_inv(N_states), cj_inv(N_states) + double precision :: contrib, wall, iwall, dleat(N_states,N_det_non_ref,2) + integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ + integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2), inac, virt + integer, external :: get_index_in_psi_det_sorted_bit, searchDet, detCmp + logical, external :: is_in_wavefunction, isInCassd, detEq + integer :: komon(0:N_det_non_ref) + logical :: komoned + + + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() + zmq_socket_push = new_zmq_push_socket(thread) + + call connect_to_taskserver(zmq_to_qp_run_socket,worker_id,thread) + + allocate (delta(N_states,0:N_det_non_ref, 2)) + + + do + call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id, task) + if (task_id == 0) exit + read (task,*) i_I, J, k1, k2 + do i_state=1, N_states + ci_inv(i_state) = 1.d0 / psi_ref_coef(i_I,i_state) + cj_inv(i_state) = 1.d0 / psi_ref_coef(J,i_state) + end do + !delta = 0.d0 + n = 0 + delta(:,0,:) = 0d0 + delta(:,:nlink(J),1) = 0d0 + delta(:,:nlink(i_I),2) = 0d0 + komon(0) = 0 + komoned = .false. + + + + + do kk = k1, k2 + k = det_cepa0_idx(linked(kk, i_I)) + blok = blokMwen(kk, i_I) + + call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,k),exc_Ik,degree,phase_Ik,N_int) + + if(J /= i_I) then + call apply_excitation(psi_ref(1,1,J),exc_Ik,det_tmp2,ok,N_int) + if(.not. ok) cycle + + l = searchDet(det_cepa0(1,1,cepa0_shortcut(blok)), det_tmp2, cepa0_shortcut(blok+1)-cepa0_shortcut(blok), N_int) + if(l == -1) cycle + ll = cepa0_shortcut(blok)-1+l + l = det_cepa0_idx(ll) + ll = child_num(ll, J) + else + l = k + ll = kk + end if + + + if(.not. komoned) then + m = 0 + m2 = 0 + + do while(m < nlink(i_I) .and. m2 < nlink(J)) + m += 1 + m2 += 1 + if(linked(m, i_I) < linked(m2, J)) then + m2 -= 1 + cycle + else if(linked(m, i_I) > linked(m2, J)) then + m -= 1 + cycle + end if + i = det_cepa0_idx(linked(m, i_I)) + + if(h_(J,i) == 0.d0) cycle + if(h_(i_I,i) == 0.d0) cycle + + ok = .false. + do i_state=1, N_states + if(lambda_mrcc(i_state, i) /= 0d0) then + ok = .true. + exit + end if + end do + if(.not. ok) cycle +! + + komon(0) += 1 + kn = komon(0) + komon(kn) = i + + + call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) + if(I_i /= J) call get_excitation(psi_ref(1,1,I_i),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ii,N_int) + if(I_i == J) phase_Ii = phase_Ji + + do i_state = 1,N_states + dkI = h_(J,i) * h_(i_I,i) * lambda_mrcc(i_state, i) + dleat(i_state, kn, 1) = dkI * phase_Ii + dleat(i_state, kn, 2) = dkI * phase_Ji + end do + + end do + + komoned = .true. + end if + + + do m = 1, komon(0) + + i = komon(m) + + hJi = h_(J,i) + hIi = h_(i_I,i) + + call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) + if(.not. ok) cycle + if(isInCassd(det_tmp, N_int)) cycle + + do i_state = 1, N_states + if(lambda_mrcc(i_state, i) == 0d0) cycle + + + call get_excitation(det_tmp,psi_non_ref(1,1,l),exc_IJ,degree2,phase_al,N_int) + contrib = h_(i_I,k) * lambda_mrcc(i_state, k) * dleat(i_state, m, 2) * phase_al +! if(l /= det_cepa0_idx(linked(ll, J))) stop "SPTPqsdT" + delta(i_state,ll,1) += contrib + if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then + delta(i_state,0,1) -= contrib * ci_inv(i_state) * psi_non_ref_coef(l,i_state) + endif + + if(I_i == J) cycle + call get_excitation(det_tmp,psi_non_ref(1,1,k),exc_IJ,degree2,phase_al,N_int) +! cj_inv(i_state) = 1.d0 / psi_ref_coef(J,i_state) + contrib = h_(J,l) * lambda_mrcc(i_state, l) * dleat(i_state, m, 1) * phase_al +! if(k /= linked(kk, I_i)) stop "SPTPT" + delta(i_state,kk,2) += contrib + !delta(i_state,det_cepa0_idx(k),2) += contrib + if(dabs(psi_ref_coef(J,i_state)).ge.5.d-5) then + delta(i_state,0,2) -= contrib * cj_inv(i_state) * psi_non_ref_coef(k,i_state) + end if + enddo !i_state + end do ! while + end do ! kk + + + call push_mrsc2_results(zmq_socket_push, I_i, J, delta, task_id) + call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id) + +! end if + + enddo + + deallocate(delta) + + call disconnect_from_taskserver(zmq_to_qp_run_socket,zmq_socket_push,worker_id) + call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) + call end_zmq_push_socket(zmq_socket_push,thread) + +end + + +subroutine push_mrsc2_results(zmq_socket_push, I_i, J, delta, task_id) + use f77_zmq + implicit none + BEGIN_DOC +! Push integrals in the push socket + END_DOC + + integer, intent(in) :: i_I, J + integer(ZMQ_PTR), intent(in) :: zmq_socket_push + double precision :: delta(N_states, 0:N_det_non_ref, 2) + integer, intent(in) :: task_id + integer :: rc , i_state, i, kk, li + integer :: idx(N_det_non_ref,2), n(2) + logical :: ok + + rc = f77_zmq_send( zmq_socket_push, i_I, 4, ZMQ_SNDMORE) + if (rc /= 4) then + print *, irp_here, 'f77_zmq_send( zmq_socket_push, i_I, 4, ZMQ_SNDMORE)' + stop 'error' + endif + + rc = f77_zmq_send( zmq_socket_push, J, 4, ZMQ_SNDMORE) + if (rc /= 4) then + print *, irp_here, 'f77_zmq_send( zmq_socket_push, J, 4, ZMQ_SNDMORE)' + stop 'error' + endif + + + do kk=1,2 + n(kk)=0 + if(kk == 1) li = nlink(j) + if(kk == 2) li = nlink(i_I) + do i=1, li + ok = .false. + do i_state=1,N_states + if(delta(i_state, i, kk) /= 0d0) then + ok = .true. + exit + end if + end do + + if(ok) then + n(kk) += 1 +! idx(n,kk) = i + if(kk == 1) then + idx(n(1),1) = det_cepa0_idx(linked(i, J)) + else + idx(n(2),2) = det_cepa0_idx(linked(i, i_I)) + end if + + do i_state=1, N_states + delta(i_state, n(kk), kk) = delta(i_state, i, kk) + end do + end if + end do + + rc = f77_zmq_send( zmq_socket_push, n(kk), 4, ZMQ_SNDMORE) + if (rc /= 4) then + print *, irp_here, 'f77_zmq_send( zmq_socket_push, n, 4, ZMQ_SNDMORE)' + stop 'error' + endif + + if(n(kk) /= 0) then + rc = f77_zmq_send( zmq_socket_push, delta(1,0,kk), (n(kk)+1)*8*N_states, ZMQ_SNDMORE) ! delta(1,0,1) = delta_I delta(1,0,2) = delta_J + if (rc /= (n(kk)+1)*8*N_states) then + print *, irp_here, 'f77_zmq_send( zmq_socket_push, delta, (n(kk)+1)*8*N_states, ZMQ_SNDMORE)' + stop 'error' + endif + + rc = f77_zmq_send( zmq_socket_push, idx(1,kk), n(kk)*4, ZMQ_SNDMORE) + if (rc /= n(kk)*4) then + print *, irp_here, 'f77_zmq_send( zmq_socket_push, delta, 8*n(kk), ZMQ_SNDMORE)' + stop 'error' + endif + end if + end do + + + rc = f77_zmq_send( zmq_socket_push, task_id, 4, 0) + if (rc /= 4) then + print *, irp_here, 'f77_zmq_send( zmq_socket_push, task_id, 4, 0)' + stop 'error' + endif + +! ! Activate is zmq_socket_push is a REQ +! integer :: idummy +! rc = f77_zmq_recv( zmq_socket_push, idummy, 4, 0) +! if (rc /= 4) then +! print *, irp_here, 'f77_zmq_send( zmq_socket_push, idummy, 4, 0)' +! stop 'error' +! endif +end + + + +subroutine pull_mrsc2_results(zmq_socket_pull, I_i, J, n, idx, delta, task_id) + use f77_zmq + implicit none + BEGIN_DOC +! Push integrals in the push socket + END_DOC + + integer(ZMQ_PTR), intent(in) :: zmq_socket_pull + integer, intent(out) :: i_I, J, n(2) + double precision, intent(inout) :: delta(N_states, 0:N_det_non_ref, 2) + integer, intent(out) :: task_id + integer :: rc , i, kk + integer,intent(out) :: idx(N_det_non_ref, 2) + logical :: ok + + rc = f77_zmq_recv( zmq_socket_pull, i_I, 4, ZMQ_SNDMORE) + if (rc /= 4) then + print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, i_I, 4, ZMQ_SNDMORE)' + stop 'error' + endif + + rc = f77_zmq_recv( zmq_socket_pull, J, 4, ZMQ_SNDMORE) + if (rc /= 4) then + print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, J, 4, ZMQ_SNDMORE)' + stop 'error' + endif + + do kk = 1, 2 + rc = f77_zmq_recv( zmq_socket_pull, n(kk), 4, ZMQ_SNDMORE) + if (rc /= 4) then + print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, n, 4, ZMQ_SNDMORE)' + stop 'error' + endif + + if(n(kk) /= 0) then + rc = f77_zmq_recv( zmq_socket_pull, delta(1,0,kk), (n(kk)+1)*8*N_states, ZMQ_SNDMORE) + if (rc /= (n(kk)+1)*8*N_states) then + print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, delta, (n(kk)+1)*8*N_states, ZMQ_SNDMORE)' + stop 'error' + endif + + rc = f77_zmq_recv( zmq_socket_pull, idx(1,kk), n(kk)*4, ZMQ_SNDMORE) + if (rc /= n(kk)*4) then + print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, delta, n(kk)*4, ZMQ_SNDMORE)' + stop 'error' + endif + end if + end do + + rc = f77_zmq_recv( zmq_socket_pull, task_id, 4, 0) + if (rc /= 4) then + print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, task_id, 4, 0)' + stop 'error' + endif + + +! ! Activate is zmq_socket_pull is a REP +! integer :: idummy +! rc = f77_zmq_send( zmq_socket_pull, idummy, 4, 0) +! if (rc /= 4) then +! print *, irp_here, 'f77_zmq_send( zmq_socket_pull, idummy, 4, 0)' +! stop 'error' +! endif +end + + + +subroutine mrsc2_dressing_collector(delta_ii_,delta_ij_) + use f77_zmq + implicit none + BEGIN_DOC +! Collects results from the AO integral calculation + END_DOC + + double precision,intent(inout) :: delta_ij_(N_states,N_det_non_ref,N_det_ref) + double precision,intent(inout) :: delta_ii_(N_states,N_det_ref) + +! integer :: j,l + integer :: rc + + double precision, allocatable :: delta(:,:,:) + + integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + + integer(ZMQ_PTR), external :: new_zmq_pull_socket + integer(ZMQ_PTR) :: zmq_socket_pull + + integer*8 :: control, accu + integer :: task_id, more + + integer :: I_i, J, l, i_state, n(2), kk + integer :: idx(N_det_non_ref,2) + + delta_ii_(:,:) = 0d0 + delta_ij_(:,:,:) = 0d0 + + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() + zmq_socket_pull = new_zmq_pull_socket() + + allocate ( delta(N_states,0:N_det_non_ref,2) ) + + more = 1 + do while (more == 1) + + call pull_mrsc2_results(zmq_socket_pull, I_i, J, n, idx, delta, task_id) + + + do l=1, n(1) + do i_state=1,N_states + delta_ij_(i_state,idx(l,1),i_I) += delta(i_state,l,1) + end do + end do + + do l=1, n(2) + do i_state=1,N_states + delta_ij_(i_state,idx(l,2),J) += delta(i_state,l,2) + end do + end do + + +! +! do l=1,nlink(J) +! do i_state=1,N_states +! delta_ij_(i_state,det_cepa0_idx(linked(l,J)),i_I) += delta(i_state,l,1) +! delta_ij_(i_state,det_cepa0_idx(linked(l,i_I)),j) += delta(i_state,l,2) +! end do +! end do +! + if(n(1) /= 0) then + do i_state=1,N_states + delta_ii_(i_state,i_I) += delta(i_state,0,1) + end do + end if + + if(n(2) /= 0) then + do i_state=1,N_states + delta_ii_(i_state,J) += delta(i_state,0,2) + end do + end if + + + if (task_id /= 0) then + call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more) + endif + + + enddo + print *, "-------------" , delta_ii_(1,:) + print *, "dfdf", delta_ij_(1,10,:) + deallocate( delta ) + + call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) + call end_zmq_pull_socket(zmq_socket_pull) + +end + + + + + BEGIN_PROVIDER [ double precision, delta_ij_old, (N_states,N_det_non_ref,N_det_ref) ] +&BEGIN_PROVIDER [ double precision, delta_ii_old, (N_states,N_det_ref) ] + implicit none + + integer :: i_state, i, i_I, J, k, kk, degree, degree2, m, l, deg, ni, m2 + integer :: p1,p2,h1,h2,s1,s2, blok, I_s, J_s, nex, nzer, ntot +! integer, allocatable :: linked(:,:), blokMwen(:, :), nlink(:) + logical :: ok + double precision :: phase_iI, phase_Ik, phase_Jl, phase_Ji, phase_al, diI, hIi, hJi, delta_JI, dkI(N_states), HkI, ci_inv(N_states), dia_hla(N_states) + double precision :: contrib, wall, iwall ! , searchance(N_det_ref) + integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ + integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2), inac, virt + integer, external :: get_index_in_psi_det_sorted_bit, searchDet, detCmp + logical, external :: is_in_wavefunction, isInCassd, detEq + character*(512) :: task + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + + integer :: KKsize = 1000000 + + ! -459.6346665282306 + ! -459.6346665282306 + + + call new_parallel_job(zmq_to_qp_run_socket,'mrsc2') + + + call wall_time(iwall) +! allocate(linked(N_det_non_ref, N_det_ref), blokMwen(N_det_non_ref, N_det_ref), nlink(N_det_ref)) + + +! searchance = 0d0 +! do J = 1, N_det_ref +! nlink(J) = 0 +! do blok=1,cepa0_shortcut(0) +! do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 +! call get_excitation_degree(psi_ref(1,1,J),det_cepa0(1,1,k),degree,N_int) +! if(degree <= 2) then +! nlink(J) += 1 +! linked(nlink(J),J) = k +! blokMwen(nlink(J),J) = blok +! searchance(J) += 1d0 + log(dfloat(cepa0_shortcut(blok+1) - cepa0_shortcut(blok))) +! end if +! end do +! end do +! end do + + + +! stop +nzer = 0 +ntot = 0 + do nex = 3, 0, -1 + print *, "los ",nex + do I_s = N_det_ref, 1, -1 +! if(mod(I_s,1) == 0) then +! call wall_time(wall) +! wall = wall-iwall +! print *, I_s, "/", N_det_ref, wall * (dfloat(N_det_ref) / dfloat(I_s)), wall, wall * (dfloat(N_det_ref) / dfloat(I_s))-wall +! end if + + + do J_s = 1, I_s + + call get_excitation_degree(psi_ref(1,1,J_s), psi_ref(1,1,I_s), degree, N_int) + if(degree /= nex) cycle + if(nex == 3) nzer = nzer + 1 + ntot += 1 +! if(degree > 3) then +! deg += 1 +! cycle +! else if(degree == -10) then +! KKsize = 100000 +! else +! KKsize = 1000000 +! end if + + + + if(searchance(I_s) < searchance(J_s)) then + i_I = I_s + J = J_s + else + i_I = J_s + J = I_s + end if + + KKsize = nlink(1) + if(nex == 0) KKsize = int(float(nlink(1)) / float(nlink(i_I)) * (float(nlink(1)) / 64d0)) + + !if(KKsize == 0) stop "ZZEO" + + do kk = 1 , nlink(i_I), KKsize + write(task,*) I_i, J, kk, int(min(kk+KKsize-1, nlink(i_I))) + call add_task_to_taskserver(zmq_to_qp_run_socket,task) + end do + + ! do kk = 1 , nlink(i_I) + ! k = linked(kk,i_I) + ! blok = blokMwen(kk,i_I) + ! write(task,*) I_i, J, k, blok + ! call add_task_to_taskserver(zmq_to_qp_run_socket,task) + ! + ! enddo !kk + enddo !J + + enddo !I + end do ! nex + print *, "tasked" +! integer(ZMQ_PTR) ∷ collector_thread +! external ∷ ao_bielec_integrals_in_map_collector +! rc = pthread_create(collector_thread, mrsc2_dressing_collector) + print *, nzer, ntot, float(nzer) / float(ntot) + !$OMP PARALLEL DEFAULT(none) SHARED(delta_ii_old,delta_ij_old) PRIVATE(i) + !$OMP TASK + i = omp_get_thread_num() + if (i==0) then + call mrsc2_dressing_collector(delta_ii_old,delta_ij_old) + else + call mrsc2_dressing_slave_inproc(i) + endif + !$OMP END TASK + !$OMP TASKWAIT + !$OMP END PARALLEL + +! rc = pthread_join(collector_thread) + call end_parallel_job(zmq_to_qp_run_socket, 'mrsc2') + + +END_PROVIDER + + + From f7b4a19adf23ebc32605b80026e437ec207ffa25 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 3 May 2016 11:34:03 +0200 Subject: [PATCH 019/216] better isInCassd --- plugins/mrcepa0/dressing.irp.f | 54 ++++++++++++++++++++++++---- plugins/mrcepa0/dressing_slave.irp.f | 5 ++- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 9b80ae09..d774cdd8 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -55,7 +55,12 @@ use bitmasks END_PROVIDER - +BEGIN_PROVIDER [ integer, HP, (2,N_det_non_ref) ] + integer :: i + do i=1,N_det_non_ref + call getHP(psi_non_ref(1,1,i), HP(1,i), HP(2,i), N_int) + end do +END_PROVIDER BEGIN_PROVIDER [ integer, cepa0_shortcut, (0:N_det_non_ref+1) ] &BEGIN_PROVIDER [ integer, det_cepa0_idx, (N_det_non_ref) ] @@ -93,7 +98,8 @@ END_PROVIDER active_sorb(k,2) = iand(active_sorb(k,2), not(nonactive_sorb(k,2))) end do end if - + + do i=1, N_det_non_ref do k=1, N_int det_noactive(k,1,i) = iand(psi_non_ref(k,1,i), not(active_sorb(k,1))) @@ -277,6 +283,7 @@ logical function detEq(a,b,Nint) detEq = .true. end function + logical function isInCassd(a,Nint) use bitmasks implicit none @@ -287,10 +294,9 @@ logical function isInCassd(a,Nint) isInCassd = .false. - - + deg = 0 - do i=1,2 + do i=1,2 do ni=1,Nint virt = iand(not(HF_bitmask(ni,i)), not(active_sorb(ni,i))) deg += popcnt(iand(virt, a(ni,i))) @@ -306,10 +312,46 @@ logical function isInCassd(a,Nint) if(deg > 2) return end do end do - isInCassd = .true. end function + +subroutine getHP(a,h,p,Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer(bit_kind), intent(in) :: a(Nint,2) + integer, intent(out) :: h, p + integer(bit_kind) :: inac, virt + integer :: ni, i, deg + + + !isInCassd = .false. + h = 0 + p = 0 + + deg = 0 + lp : do i=1,2 + do ni=1,Nint + virt = iand(not(HF_bitmask(ni,i)), not(active_sorb(ni,i))) + deg += popcnt(iand(virt, a(ni,i))) + if(deg > 2) exit lp + end do + end do lp + p = deg + + deg = 0 + lh : do i=1,2 + do ni=1,Nint + inac = iand(HF_bitmask(ni,i), not(active_sorb(ni,i))) + deg += popcnt(xor(iand(inac,a(ni,i)), inac)) + if(deg > 2) exit lh + end do + end do lh + h = deg + !isInCassd = .true. +end function + integer function detCmp(a,b,Nint) use bitmasks implicit none diff --git a/plugins/mrcepa0/dressing_slave.irp.f b/plugins/mrcepa0/dressing_slave.irp.f index acaf4e34..aaf9a9a6 100644 --- a/plugins/mrcepa0/dressing_slave.irp.f +++ b/plugins/mrcepa0/dressing_slave.irp.f @@ -157,13 +157,16 @@ subroutine mrsc2_dressing_slave(thread,iproc) do m = 1, komon(0) i = komon(m) + + if(HP(1,i) + HP(1,k) <= 2 .and. HP(2,i) + HP(2,k) <= 2) cycle hJi = h_(J,i) hIi = h_(i_I,i) + call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) if(.not. ok) cycle - if(isInCassd(det_tmp, N_int)) cycle + !if(isInCassd(det_tmp, N_int)) cycle do i_state = 1, N_states if(lambda_mrcc(i_state, i) == 0d0) cycle From 682d2b8f1e706653fb938ac7f35b8ea69d6bfa10 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 3 May 2016 17:55:41 +0200 Subject: [PATCH 020/216] fixed phases - no more isInCassd --- plugins/mrcepa0/dressing_slave.irp.f | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/plugins/mrcepa0/dressing_slave.irp.f b/plugins/mrcepa0/dressing_slave.irp.f index aaf9a9a6..480a0f56 100644 --- a/plugins/mrcepa0/dressing_slave.irp.f +++ b/plugins/mrcepa0/dressing_slave.irp.f @@ -138,14 +138,14 @@ subroutine mrsc2_dressing_slave(thread,iproc) komon(kn) = i - call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) - if(I_i /= J) call get_excitation(psi_ref(1,1,I_i),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ii,N_int) - if(I_i == J) phase_Ii = phase_Ji +! call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) +! if(I_i /= J) call get_excitation(psi_ref(1,1,I_i),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ii,N_int) +! if(I_i == J) phase_Ii = phase_Ji do i_state = 1,N_states dkI = h_(J,i) * h_(i_I,i) * lambda_mrcc(i_state, i) - dleat(i_state, kn, 1) = dkI * phase_Ii - dleat(i_state, kn, 2) = dkI * phase_Ji + dleat(i_state, kn, 1) = dkI + dleat(i_state, kn, 2) = dkI end do end do @@ -158,7 +158,7 @@ subroutine mrsc2_dressing_slave(thread,iproc) i = komon(m) - if(HP(1,i) + HP(1,k) <= 2 .and. HP(2,i) + HP(2,k) <= 2) cycle + !if(HP(1,i) + HP(1,k) <= 2 .and. HP(2,i) + HP(2,k) <= 2) cycle hJi = h_(J,i) hIi = h_(i_I,i) @@ -166,14 +166,18 @@ subroutine mrsc2_dressing_slave(thread,iproc) call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) if(.not. ok) cycle + if(HP(1,i) + HP(1,k) <= 2 .and. HP(2,i) + HP(2,k) <= 2) then + if(is_in_wavefunction(det_tmp, N_int)) cycle + end if + !if(isInCassd(det_tmp, N_int)) cycle do i_state = 1, N_states if(lambda_mrcc(i_state, i) == 0d0) cycle - call get_excitation(det_tmp,psi_non_ref(1,1,l),exc_IJ,degree2,phase_al,N_int) - contrib = h_(i_I,k) * lambda_mrcc(i_state, k) * dleat(i_state, m, 2) * phase_al +! call get_excitation(det_tmp,psi_non_ref(1,1,l),exc_IJ,degree2,phase_al,N_int) + contrib = h_(i_I,k) * lambda_mrcc(i_state, k) * dleat(i_state, m, 2)! * phase_al ! if(l /= det_cepa0_idx(linked(ll, J))) stop "SPTPqsdT" delta(i_state,ll,1) += contrib if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then @@ -181,9 +185,9 @@ subroutine mrsc2_dressing_slave(thread,iproc) endif if(I_i == J) cycle - call get_excitation(det_tmp,psi_non_ref(1,1,k),exc_IJ,degree2,phase_al,N_int) +! call get_excitation(det_tmp,psi_non_ref(1,1,k),exc_IJ,degree2,phase_al,N_int) ! cj_inv(i_state) = 1.d0 / psi_ref_coef(J,i_state) - contrib = h_(J,l) * lambda_mrcc(i_state, l) * dleat(i_state, m, 1) * phase_al + contrib = h_(J,l) * lambda_mrcc(i_state, l) * dleat(i_state, m, 1)! * phase_al ! if(k /= linked(kk, I_i)) stop "SPTPT" delta(i_state,kk,2) += contrib !delta(i_state,det_cepa0_idx(k),2) += contrib From d019657001bfe840b64a0b69f767db07862e66e5 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 4 May 2016 17:30:55 +0200 Subject: [PATCH 021/216] extra thread for collector --- plugins/mrcepa0/dressing_slave.irp.f | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/mrcepa0/dressing_slave.irp.f b/plugins/mrcepa0/dressing_slave.irp.f index 480a0f56..3076e2a8 100644 --- a/plugins/mrcepa0/dressing_slave.irp.f +++ b/plugins/mrcepa0/dressing_slave.irp.f @@ -582,16 +582,14 @@ ntot = 0 ! external ∷ ao_bielec_integrals_in_map_collector ! rc = pthread_create(collector_thread, mrsc2_dressing_collector) print *, nzer, ntot, float(nzer) / float(ntot) - !$OMP PARALLEL DEFAULT(none) SHARED(delta_ii_old,delta_ij_old) PRIVATE(i) - !$OMP TASK + provide nproc + !$OMP PARALLEL DEFAULT(none) SHARED(delta_ii_old,delta_ij_old) PRIVATE(i) NUM_THREADS(nproc+1) i = omp_get_thread_num() if (i==0) then call mrsc2_dressing_collector(delta_ii_old,delta_ij_old) else call mrsc2_dressing_slave_inproc(i) endif - !$OMP END TASK - !$OMP TASKWAIT !$OMP END PARALLEL ! rc = pthread_join(collector_thread) From a19543f6c743fcba74ac861c1be92eeb96b80fd9 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 4 May 2016 18:23:05 +0200 Subject: [PATCH 022/216] alpha = triple-quadruple --- plugins/mrcepa0/dressing_slave.irp.f | 9 ++---- plugins/mrcepa0/mrcepa0_general.irp.f | 45 ++++++++++++++++++++------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/plugins/mrcepa0/dressing_slave.irp.f b/plugins/mrcepa0/dressing_slave.irp.f index 3076e2a8..3491ba7f 100644 --- a/plugins/mrcepa0/dressing_slave.irp.f +++ b/plugins/mrcepa0/dressing_slave.irp.f @@ -158,16 +158,11 @@ subroutine mrsc2_dressing_slave(thread,iproc) i = komon(m) - !if(HP(1,i) + HP(1,k) <= 2 .and. HP(2,i) + HP(2,k) <= 2) cycle - - hJi = h_(J,i) - hIi = h_(i_I,i) - - call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) if(.not. ok) cycle if(HP(1,i) + HP(1,k) <= 2 .and. HP(2,i) + HP(2,k) <= 2) then - if(is_in_wavefunction(det_tmp, N_int)) cycle +! if(is_in_wavefunction(det_tmp, N_int)) cycle + cycle end if !if(isInCassd(det_tmp, N_int)) cycle diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index 6694e80a..df10de34 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -71,19 +71,40 @@ subroutine run_pt2(N_st,energy) threshold_selectors = 1.d0 threshold_generators = 0.999d0 - N_det_generators = lambda_mrcc_pt2(0) - do i=1,N_det_generators - j = lambda_mrcc_pt2(i) - do k=1,N_int - psi_det_generators(k,1,i) = psi_non_ref(k,1,j) - psi_det_generators(k,2,i) = psi_non_ref(k,2,j) - enddo - do k=1,N_st - psi_coef_generators(i,k) = psi_non_ref_coef(j,k) - enddo - enddo - SOFT_TOUCH N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed +! N_det_generators = lambda_mrcc_pt2(0) +! do i=1,N_det_generators +! j = lambda_mrcc_pt2(i) +! do k=1,N_int +! psi_det_generators(k,1,i) = psi_non_ref(k,1,j) +! psi_det_generators(k,2,i) = psi_non_ref(k,2,j) +! enddo +! do k=1,N_st +! psi_coef_generators(i,k) = psi_non_ref_coef(j,k) +! enddo +! enddo +! SOFT_TOUCH N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed + N_det_generators = lambda_mrcc_pt2(0) + N_det_cas + do i=1,N_det_cas + do k=1,N_int + psi_det_generators(k,1,i) = psi_ref(k,1,i) + psi_det_generators(k,2,i) = psi_ref(k,2,i) + enddo + do k=1,N_st + psi_coef_generators(i,k) = psi_ref_coef(i,k) + enddo + enddo + do i=N_det_cas+1,N_det_generators + j = lambda_mrcc_pt2(i - N_det_cas) + do k=1,N_int + psi_det_generators(k,1,i) = psi_non_ref(k,1,j) + psi_det_generators(k,2,i) = psi_non_ref(k,2,j) + enddo + do k=1,N_st + psi_coef_generators(i,k) = psi_non_ref_coef(j,k) + enddo + enddo + SOFT_TOUCH N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed call H_apply_mrcc_PT2(pt2, norm_pert, H_pert_diag, N_st) print *, 'Final step' From 55138005a0e97e9ef6cd1f5e75834d8caaa877b5 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 13 May 2016 19:28:50 +0200 Subject: [PATCH 023/216] mrcc 2nd version - not working --- plugins/MRCC_Utils/mrcc_dress.irp.f | 6 - plugins/mrcepa0/dressing.irp.f | 892 +++++++++++++++------------- src/Determinants/slater_rules.irp.f | 1 - 3 files changed, 493 insertions(+), 406 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_dress.irp.f b/plugins/MRCC_Utils/mrcc_dress.irp.f index 291a6bbc..1c2e8b74 100644 --- a/plugins/MRCC_Utils/mrcc_dress.irp.f +++ b/plugins/MRCC_Utils/mrcc_dress.irp.f @@ -303,12 +303,6 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Nstates, Ndet_non_ref, Ndet_ref,i_ge call omp_unset_lock( psi_ref_lock(i_I) ) enddo enddo - -! 5.7717252361566333E-005 -! -1.4525812360153183E-005 -! -3.3282906594800186E-005 -! -1.3864228814283882E-004 - !deallocate (dIa_hla,hij_cache) !deallocate(miniList, idx_miniList) end diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index d774cdd8..e0689642 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -1,6 +1,491 @@ use bitmasks +subroutine dec_exc(exc, h1, h2, p1, p2) + implicit none + integer :: exc(0:2,2,2), s1, s2, degree + integer, intent(out) :: h1, h2, p1, p2 + + degree = exc(0,1,1) + exc(0,1,2) + + h1 = 0 + h2 = 0 + p1 = 0 + p2 = 0 + + if(degree == 0) return + + call decode_exc(exc, degree, h1, p1, h2, p2, s1, s2) + + h1 += mo_tot_num * (s1-1) + p1 += mo_tot_num * (s1-1) + + if(degree == 2) then + h2 += mo_tot_num * (s2-1) + p2 += mo_tot_num * (s2-1) + if(h1 > h2) then + s1 = h1 + h1 = h2 + h2 = s1 + end if + if(p1 > p2) then + s1 = p1 + p1 = p2 + p2 = s1 + end if + else + h2 = h1 + p2 = p1 + p1 = 0 + h1 = 0 + end if +end subroutine + + + + BEGIN_PROVIDER [ integer, hh_exists, (4, N_det_ref * N_det_non_ref) ] +&BEGIN_PROVIDER [ integer, hh_shortcut, (0:N_det_ref * N_det_non_ref + 1) ] +&BEGIN_PROVIDER [ integer, pp_exists, (4, N_det_ref * N_det_non_ref) ] + implicit none + integer :: num(0:mo_tot_num*2, 0:mo_tot_num*2) + integer :: exc(0:2, 2, 2), degree, n, on, s, h1, h2, p1, p2, l, i + double precision :: phase + + hh_shortcut = 0 + hh_exists = 0 + pp_exists = 0 + num = 0 + + do i=1, N_det_ref + do l=1, N_det_non_ref + call get_excitation(psi_ref(1,1,i), psi_non_ref(1,1,l), exc, degree, phase, N_int) + if(degree == -1) cycle + call dec_exc(exc, h1, h2, p1, p2) + num(h1, h2) += 1 + end do + end do + + n = 1 + do l=0,mo_tot_num*2 + do i=0,l + on = num(i,l) + if(on /= 0) then + hh_shortcut(0) += 1 + hh_shortcut(hh_shortcut(0)) = n + hh_exists(:, hh_shortcut(0)) = (/1, i, 1, l/) + end if + + num(i,l) = n + n += on + end do + end do + + hh_shortcut(hh_shortcut(0)+1) = n + + do i=1, N_det_ref + do l=1, N_det_non_ref + call get_excitation(psi_ref(1,1,i), psi_non_ref(1,1,l), exc, degree, phase, N_int) + if(degree == -1) cycle + call dec_exc(exc, h1, h2, p1, p2) + pp_exists(:, num(h1, h2)) = (/1,p1,1,p2/) + num(h1, h2) += 1 + end do + end do + + do s=2,4,2 + do i=1,hh_shortcut(0) + if(hh_exists(s, i) == 0) then + hh_exists(s-1, i) = 0 + else if(hh_exists(s, i) > mo_tot_num) then + hh_exists(s, i) -= mo_tot_num + hh_exists(s-1, i) = 2 + end if + end do + + do i=1,hh_shortcut(hh_shortcut(0)+1)-1 + if(pp_exists(s, i) == 0) then + pp_exists(s-1, i) = 0 + else if(pp_exists(s, i) > mo_tot_num) then + pp_exists(s, i) -= mo_tot_num + pp_exists(s-1, i) = 2 + end if + end do + end do + +END_PROVIDER + + + + +subroutine apply_hole(det, exc, res, ok, Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer, intent(in) :: exc(4) + integer :: s1, s2, h1, h2 + integer(bit_kind),intent(in) :: det(Nint, 2) + integer(bit_kind),intent(out) :: res(Nint, 2) + logical, intent(out) :: ok + integer :: ii, pos + + ok = .false. + s1 = exc(1) + h1 = exc(2) + s2 = exc(3) + h2 = exc(4) + res = det + + if(h1 /= 0) then + ii = (h1-1)/bit_kind_size + 1 + pos = mod(h1-1, 64)!iand(h1-1,bit_kind_size-1) ! mod 64 + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s1) = ibclr(res(ii, s1), pos) + end if + + ii = (h2-1)/bit_kind_size + 1 + pos = mod(h2-1, 64)!iand(h2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s2) = ibclr(res(ii, s2), pos) + + + ok = .true. +end subroutine + + +subroutine apply_particle(det, exc, res, ok, Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer, intent(in) :: exc(4) + integer :: s1, s2, p1, p2 + integer(bit_kind),intent(in) :: det(Nint, 2) + integer(bit_kind),intent(out) :: res(Nint, 2) + logical, intent(out) :: ok + integer :: ii, pos + + ok = .false. + s1 = exc(1) + p1 = exc(2) + s2 = exc(3) + p2 = exc(4) + res = det + + if(p1 /= 0) then + ii = (p1-1)/bit_kind_size + 1 + pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s1) = ibset(res(ii, s1), pos) + end if + + ii = (p2-1)/bit_kind_size + 1 + pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s2) = ibset(res(ii, s2), pos) + + + ok = .true. +end subroutine + + + BEGIN_PROVIDER [ double precision, delta_ij_mrcc, (N_states,N_det_non_ref,N_det_ref) ] +&BEGIN_PROVIDER [ double precision, delta_ii_mrcc, (N_states, N_det_ref) ] + use bitmasks + implicit none + integer :: gen, h, p, i_state, n, t + integer(bit_kind) :: mask(N_int, 2), omask(N_int, 2), buf(N_int, 2, N_det_non_ref) + logical :: ok + + delta_ij_mrcc = 0d0 + delta_ii_mrcc = 0d0 + i_state = 1 + + do gen=1, N_det_generators + !print *, gen, "/", N_det_generators + do h=1, hh_shortcut(0) + call apply_hole(psi_det_generators(1,1,gen), hh_exists(1, h), mask, ok, N_int) + if(.not. ok) cycle + omask = 0 + if(hh_exists(1, h) /= 0) omask = mask + !-459.6378590456251 + !-199.0659502581943 + n = 1 + ploop : do p=hh_shortcut(h), hh_shortcut(h+1)-1 + + do t=hh_shortcut(h), p-1 + if(pp_exists(1, p) == pp_exists(1,t) .and. & + pp_exists(2, p) == pp_exists(2,t) .and. & + pp_exists(3, p) == pp_exists(3,t) .and. & + pp_exists(4, p) == pp_exists(4,t)) cycle ploop + end do + call apply_particle(mask, pp_exists(1, p), buf(1,1,n), ok, N_int) + !-459.6379081607463 + !-199.0659982685706 + if(ok) n = n + 1 + end do ploop + n = n - 1 + if(n /= 0) call mrcc_part_dress(delta_ij_mrcc, delta_ii_mrcc,gen,n,buf,N_int,omask) + end do + end do +END_PROVIDER + + + +subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffer,Nint,key_mask) + use bitmasks + implicit none + + integer, intent(in) :: i_generator,n_selected, Nint + double precision, intent(inout) :: delta_ij_(N_states,N_det_non_ref,N_det_ref) + double precision, intent(inout) :: delta_ii_(N_states,N_det_ref) + + integer(bit_kind), intent(in) :: det_buffer(Nint,2,n_selected) + integer :: i,j,k,l,m + integer :: degree_alpha(psi_det_size) + integer :: idx_alpha(0:psi_det_size) + logical :: good, fullMatch + + integer(bit_kind) :: tq(Nint,2,n_selected) + integer :: N_tq, c_ref ,degree + + double precision :: hIk, hla, hIl, dIk(N_states), dka(N_states), dIa(N_states) + double precision, allocatable :: dIa_hla(:,:) + double precision :: haj, phase, phase2 + double precision :: f(N_states), ci_inv(N_states) + integer :: exc(0:2,2,2) + integer :: h1,h2,p1,p2,s1,s2 + integer(bit_kind) :: tmp_det(Nint,2) + integer :: iint, ipos + integer :: i_state, k_sd, l_sd, i_I, i_alpha + + integer(bit_kind),allocatable :: miniList(:,:,:) + integer(bit_kind),intent(in) :: key_mask(Nint, 2) + integer,allocatable :: idx_miniList(:) + integer :: N_miniList, ni, leng + double precision, allocatable :: hij_cache(:) + + integer(bit_kind), allocatable :: microlist(:,:,:), microlist_zero(:,:,:) + integer, allocatable :: idx_microlist(:), N_microlist(:), ptr_microlist(:), idx_microlist_zero(:) + integer :: mobiles(2), smallerlist + + + + leng = max(N_det_generators, N_det_non_ref) + allocate(miniList(Nint, 2, leng), idx_minilist(leng), hij_cache(N_det_non_ref)) + + !create_minilist_find_previous(key_mask, fullList, miniList, N_fullList, N_miniList, fullMatch, Nint) + call create_minilist_find_previous(key_mask, psi_det_generators, miniList, i_generator-1, N_miniList, fullMatch, Nint) + + if(fullMatch) then + return + end if + + allocate(ptr_microlist(0:mo_tot_num*2+1), & + N_microlist(0:mo_tot_num*2) ) + allocate( microlist(Nint,2,N_minilist*4), & + idx_microlist(N_minilist*4)) + + if(key_mask(1,1) /= 0) then + call create_microlist(miniList, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, Nint) + call find_triples_and_quadruples_micro(i_generator,n_selected,det_buffer,Nint,tq,N_tq,microlist,ptr_microlist,N_microlist,key_mask) + else + call find_triples_and_quadruples(i_generator,n_selected,det_buffer,Nint,tq,N_tq,miniList,N_minilist) + end if + + + + deallocate(microlist, idx_microlist) + + allocate (dIa_hla(N_states,N_det_non_ref)) + + ! |I> + + ! |alpha> + + if(N_tq > 0) then + call create_minilist(key_mask, psi_non_ref, miniList, idx_minilist, N_det_non_ref, N_minilist, Nint) + if(N_minilist == 0) return + + + if(key_mask(1,1) /= 0) then !!!!!!!!!!! PAS GENERAL !!!!!!!!! + allocate(microlist_zero(Nint,2,N_minilist), idx_microlist_zero(N_minilist)) + + allocate( microlist(Nint,2,N_minilist*4), & + idx_microlist(N_minilist*4)) + call create_microlist(miniList, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, Nint) + + + do i=0,mo_tot_num*2 + do k=ptr_microlist(i),ptr_microlist(i+1)-1 + idx_microlist(k) = idx_minilist(idx_microlist(k)) + end do + end do + + do l=1,N_microlist(0) + do k=1,Nint + microlist_zero(k,1,l) = microlist(k,1,l) + microlist_zero(k,2,l) = microlist(k,2,l) + enddo + idx_microlist_zero(l) = idx_microlist(l) + enddo + end if + end if + + + do i_alpha=1,N_tq + if(key_mask(1,1) /= 0) then + call getMobiles(tq(1,1,i_alpha), key_mask, mobiles, Nint) + + if(N_microlist(mobiles(1)) < N_microlist(mobiles(2))) then + smallerlist = mobiles(1) + else + smallerlist = mobiles(2) + end if + + + do l=0,N_microlist(smallerlist)-1 + microlist_zero(:,:,ptr_microlist(1) + l) = microlist(:,:,ptr_microlist(smallerlist) + l) + idx_microlist_zero(ptr_microlist(1) + l) = idx_microlist(ptr_microlist(smallerlist) + l) + end do + + call get_excitation_degree_vector(microlist_zero,tq(1,1,i_alpha),degree_alpha,Nint,N_microlist(smallerlist)+N_microlist(0),idx_alpha) + do j=1,idx_alpha(0) + idx_alpha(j) = idx_microlist_zero(idx_alpha(j)) + end do + + + else + call get_excitation_degree_vector(miniList,tq(1,1,i_alpha),degree_alpha,Nint,N_minilist,idx_alpha) + do j=1,idx_alpha(0) + idx_alpha(j) = idx_miniList(idx_alpha(j)) + end do + end if + + + do l_sd=1,idx_alpha(0) + k_sd = idx_alpha(l_sd) + call i_h_j(tq(1,1,i_alpha),psi_non_ref(1,1,idx_alpha(l_sd)),Nint,hij_cache(k_sd)) + enddo + + ! |I> + do i_I=1,N_det_ref + ! Find triples and quadruple grand parents + call get_excitation_degree(tq(1,1,i_alpha),psi_ref(1,1,i_I),degree,Nint) + if (degree > 4) then + cycle + endif + + do i_state=1,N_states + dIa(i_state) = 0.d0 + enddo + + ! |alpha> + do k_sd=1,idx_alpha(0) + + ! Loop if lambda == 0 + logical :: loop + loop = .True. + do i_state=1,N_states + if (lambda_mrcc(i_state,idx_alpha(k_sd)) /= 0.d0) then + loop = .False. + exit + endif + enddo + if (loop) then + cycle + endif + + call get_excitation_degree(psi_ref(1,1,i_I),psi_non_ref(1,1,idx_alpha(k_sd)),degree,Nint) + if (degree > 2) then + cycle + endif + + ! + ! + hIk = hij_mrcc(idx_alpha(k_sd),i_I) + ! call i_h_j(psi_ref(1,1,i_I),psi_non_ref(1,1,idx_alpha(k_sd)),Nint,hIk) + do i_state=1,N_states + dIk(i_state) = hIk * lambda_mrcc(i_state,idx_alpha(k_sd)) + enddo + ! |l> = Exc(k -> alpha) |I> + call get_excitation(psi_non_ref(1,1,idx_alpha(k_sd)),tq(1,1,i_alpha),exc,degree,phase,Nint) + call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) + do k=1,N_int + tmp_det(k,1) = psi_ref(k,1,i_I) + tmp_det(k,2) = psi_ref(k,2,i_I) + enddo + + logical :: ok + call apply_excitation(psi_ref(1,1,i_I), exc, tmp_det, ok, Nint) + if(.not. ok) cycle + + ! + do i_state=1,N_states + dka(i_state) = 0.d0 + enddo + do l_sd=k_sd+1,idx_alpha(0) + + call get_excitation_degree(tmp_det,psi_non_ref(1,1,idx_alpha(l_sd)),degree,Nint) + if (degree == 0) then + + loop = .True. + do i_state=1,N_states + if (lambda_mrcc(i_state,idx_alpha(l_sd)) /= 0.d0) then + loop = .False. + exit + endif + enddo + if (.not.loop) then + call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,idx_alpha(l_sd)),exc,degree,phase2,Nint) + hIl = hij_mrcc(idx_alpha(l_sd),i_I) +! call i_h_j(psi_ref(1,1,i_I),psi_non_ref(1,1,idx_alpha(l_sd)),Nint,hIl) + do i_state=1,N_states + dka(i_state) = hIl * lambda_mrcc(i_state,idx_alpha(l_sd)) * phase * phase2 + enddo + endif + + exit + endif + enddo + do i_state=1,N_states + dIa(i_state) = dIa(i_state) + dIk(i_state) * dka(i_state) + enddo + enddo + + do i_state=1,N_states + ci_inv(i_state) = psi_ref_coef_inv(i_I,i_state) + enddo + do l_sd=1,idx_alpha(0) + k_sd = idx_alpha(l_sd) + hla = hij_cache(k_sd) +! call i_h_j(tq(1,1,i_alpha),psi_non_ref(1,1,idx_alpha(l_sd)),Nint,hla) + do i_state=1,N_states + dIa_hla(i_state,k_sd) = dIa(i_state) * hla + enddo + enddo + call omp_set_lock( psi_ref_lock(i_I) ) + do i_state=1,N_states + if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5)then + do l_sd=1,idx_alpha(0) + k_sd = idx_alpha(l_sd) + delta_ij_(i_state,k_sd,i_I) = delta_ij_(i_state,k_sd,i_I) + dIa_hla(i_state,k_sd) + delta_ii_(i_state,i_I) = delta_ii_(i_state,i_I) - dIa_hla(i_state,k_sd) * ci_inv(i_state) * psi_non_ref_coef_transp(i_state,k_sd) + enddo + else + delta_ii_(i_state,i_I) = 0.d0 + do l_sd=1,idx_alpha(0) + k_sd = idx_alpha(l_sd) + delta_ij_(i_state,k_sd,i_I) = delta_ij_(i_state,k_sd,i_I) + dIa_hla(i_state,k_sd) + enddo + endif + enddo + call omp_unset_lock( psi_ref_lock(i_I) ) + enddo + enddo + !deallocate (dIa_hla,hij_cache) + !deallocate(miniList, idx_miniList) +end + + BEGIN_PROVIDER [ double precision, delta_ij, (N_states,N_det_non_ref,N_det_ref) ] @@ -20,18 +505,18 @@ use bitmasks end do end do else if(mrmode == 2) then -! do i = 1, N_det_ref -! delta_ii(i_state,i)= delta_ii_old(i,i_state) -! do j = 1, N_det_non_ref -! delta_ij(i_state,j,i) = delta_ij_old(i,j,i_state) -! end do -! end do do i = 1, N_det_ref - delta_ii(i_state,i)= delta_ii_old(i_state,i) + delta_ii(i_state,i)= delta_ii_mrcc(i_state,i) do j = 1, N_det_non_ref - delta_ij(i_state,j,i) = delta_ij_old(i_state,j,i) + delta_ij(i_state,j,i) = delta_ij_mrcc(i_state,j,i) end do end do +! do i = 1, N_det_ref +! delta_ii(i_state,i)= delta_ii_old(i_state,i) +! do j = 1, N_det_non_ref +! delta_ij(i_state,j,i) = delta_ij_old(i_state,j,i) +! end do +! end do else if(mrmode == 1) then do i = 1, N_det_ref delta_ii(i_state,i)= delta_mrcepa0_ii(i,i_state) @@ -43,15 +528,6 @@ use bitmasks stop "invalid mrmode" end if end do -! do i=1,N_det_ref -! print *, delta_ii(1,i) -! end do -! do i=1,min(N_det_non_ref,100) -! print *, delta_ij(1,i,:) -! end do -! stop - - END_PROVIDER @@ -174,41 +650,6 @@ END_PROVIDER print *, "pre done" END_PROVIDER - - - BEGIN_PROVIDER [ double precision, delta_cas_old, (N_det_ref, N_det_ref, N_states) ] - use bitmasks - implicit none - integer :: i,j,k - double precision :: Hjk, Hki, Hij - integer i_state, degree - - provide lambda_mrcc - do i_state = 1, N_states - !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(no_mono_dressing,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) - do i=1,N_det_ref - do j=1,i - !call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int) - delta_cas(i,j,i_state) = 0d0 - !if(no_mono_dressing .and. degree == 1) cycle - do k=1,N_det_non_ref - - call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,k),N_int,Hjk) - call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki) - - delta_cas(i,j,i_state) += Hjk * Hki * lambda_mrcc(i_state, k) - end do - end do - end do - !$OMP END PARALLEL DO - do i=1,N_det_ref - do j=1,i - delta_cas(j,i,i_state) = delta_cas(i,j,i_state) - end do - end do - end do - END_PROVIDER - BEGIN_PROVIDER [ double precision, delta_cas, (N_det_ref, N_det_ref, N_states) ] use bitmasks @@ -684,350 +1125,3 @@ BEGIN_PROVIDER [ double precision, h_, (N_det_ref,N_det_non_ref) ] END_PROVIDER - - BEGIN_PROVIDER [ double precision, delta_ij_older, (N_det_ref,N_det_non_ref,N_states) ] -&BEGIN_PROVIDER [ double precision, delta_ii_older, (N_det_ref,N_states) ] - implicit none - - integer :: i_state, i, i_I, J, k, kk, degree, degree2, m, l, deg, ni - integer :: p1,p2,h1,h2,s1,s2, blok, I_s, J_s -! integer, allocatable :: linked(:,:), blokMwen(:, :), nlink(:) - logical :: ok - double precision :: phase_iI, phase_Ik, phase_Jl, phase_Ji, phase_al, diI, hIi, hJi, delta_JI, dkI(N_states), HkI, ci_inv(N_states), dia_hla(N_states) - double precision :: contrib, wall, iwall ! , searchance(N_det_ref) - double precision, allocatable :: deltaMwen(:,:,:), deltaIImwen(:,:) - integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ - integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2), inac, virt - integer, allocatable :: idx_sorted_bit(:) - integer, external :: get_index_in_psi_det_sorted_bit, searchDet, detCmp - logical, external :: is_in_wavefunction, isInCassd, detEq - - ! -459.6346665282306 - ! -459.6346665282306 - - call wall_time(iwall) - allocate(idx_sorted_bit(N_det)) -! allocate(linked(N_det_non_ref, N_det_ref), blokMwen(N_det_non_ref, N_det_ref), nlink(N_det_ref)) - - idx_sorted_bit(:) = -1 - do i=1,N_det_non_ref - idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i - enddo - - - do i_state = 1, N_states - - delta_ii_old(:,:) = 0d0 - delta_ij_old(:,:,:) = 0d0 - searchance = 0d0 - !$OMP PARALLEL DO default(none) schedule(dynamic) private(blok,k,degree) shared(searchance,nlink,linked,blokMwen,psi_ref, det_cepa0,cepa0_shortcut, N_det_ref, N_int) - do J = 1, N_det_ref - nlink(J) = 0 - do blok=1,cepa0_shortcut(0) - do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 - call get_excitation_degree(psi_ref(1,1,J),det_cepa0(1,1,k),degree,N_int) - if(degree <= 2) then - nlink(J) += 1 - linked(nlink(J),J) = k - blokMwen(nlink(J),J) = blok - searchance(J) += log(dfloat(cepa0_shortcut(blok+1) - cepa0_shortcut(blok))) - end if - end do - end do - end do - !$OMP END PARALLEL DO - - -! do i=1,cepa0_shortcut(0) -! print *, cepa0_shortcut(i+1) - cepa0_shortcut(i) -! end do - - - !$OMP PARALLEL DO default(none) schedule(dynamic,10) shared(delta_ij_old, delta_ii_old) & - !$OMP private(m,kk, i_I, i, J, k, degree, degree2, l, deg, ni, inac, virt) & - !$OMP private(ok,p1,p2,h1,h2,s1,s2, blok, wall, I_s, J_s) & - !$OMP private(phase_iI, phase_Ik, phase_Ji, phase_al, diI, hIi, hJi, delta_JI, dkI, HkI, ci_inv, dia_hla) & - !$OMP private(contrib, exc_iI, exc_Ik, exc_IJ, det_tmp, det_tmp2) & - !$OMP shared(idx_sorted_bit, N_det_non_ref, N_det_ref, N_int, psi_non_ref, psi_non_ref_coef, psi_ref, psi_ref_coef) & - !$OMP shared(i_state, lambda_mrcc, hf_bitmask, active_sorb,cepa0_shortcut,det_cepa0) & - !$OMP shared(h_,det_cepa0_idx, linked, blokMwen, nlink, iwall, searchance) - do i = 1 , N_det_non_ref - if(mod(i,100) == 0) then - call wall_time(wall) - wall = wall-iwall - print *, i, "/", N_det_non_ref, wall * (dfloat(N_det_non_ref) / dfloat(i)), wall, wall * (dfloat(N_det_non_ref) / dfloat(i))-wall - end if - - if(lambda_mrcc(i_state, i) == 0d0) cycle - - - do I_s = 1, N_det_ref - do J_s = 1, I_s - - if(nlink(I_s) < nlink(J_s)) then - !if(searchance(I_s) < searchance(J_s)) then - i_I = I_s - J = J_s - else - i_I = J_s - J = I_s - end if - - !call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,J),N_int,hJi) - !!!! - - !!!!!! - hJi = h_(J,i) - if(hJi == 0) cycle - hIi = h_(i_I,i) - if(hIi == 0) cycle - - diI = hIi * lambda_mrcc(i_state, i) - delta_JI = hJi * diI - - call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,i),exc_iI,degree2,phase_iI,N_int) - if(degree2 == -1) cycle - !call i_h_j(psi_non_ref(1,1,i), psi_ref(1,1,i_I),N_int,hIi) - - do kk = 1 , nlink(i_I) - k = linked(kk,i_I) - blok = blokMwen(kk,i_I) - - !if(lambda_mrcc(i_state, det_cepa0_idx(k)) == 0d0) cycle - - - call get_excitation(psi_ref(1,1,i_I),det_cepa0(1,1,k),exc_Ik,degree,phase_Ik,N_int) - !if(degree == -1) cycle - if(degree == -1) stop "STOP; ( linked )" - - - call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) - if(.not. ok) cycle - - call apply_excitation(psi_ref(1,1,J),exc_Ik,det_tmp2,ok,N_int) - if(.not. ok) cycle - - if(isInCassd(det_tmp, N_int)) cycle - - - l = searchDet(det_cepa0(1,1,cepa0_shortcut(blok)), det_tmp2, cepa0_shortcut(blok+1)-cepa0_shortcut(blok), N_int) - if(l == -1) cycle - l = det_cepa0_idx(cepa0_shortcut(blok)-1+l) - !call i_h_j(det_cepa0(1,1,k), det_tmp, N_int, HiI) - !call i_h_j(psi_non_ref(1,1,l), det_tmp, N_int, HJi) - - - - call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) - call get_excitation(det_tmp,psi_non_ref(1,1,l),exc_IJ,degree2,phase_al,N_int) - delta_JI = hJi * hIi * lambda_mrcc(i_state, i) * phase_al * phase_Ji - ci_inv(i_state) = 1.d0 / psi_ref_coef(i_I,i_state) - HkI = h_(i_I,det_cepa0_idx(k)) - dkI(i_state) = HkI * lambda_mrcc(i_state, det_cepa0_idx(k)) - contrib = dkI(i_state) * delta_JI - !$OMP ATOMIC - delta_ij_old(i_I,l,i_state) += contrib - if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then - !$OMP ATOMIC - delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(l,i_state) - endif -! - if(l == det_cepa0_idx(k)) cycle - call get_excitation(psi_ref(1,1,I_i),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) - call get_excitation(det_tmp,det_cepa0(1,1,k),exc_IJ,degree2,phase_al,N_int) - delta_JI = hJi * hIi * lambda_mrcc(i_state, i) * phase_al * phase_Ji - - ci_inv(i_state) = 1.d0 / psi_ref_coef(J,i_state) - HkI = h_(J,l) - dkI(i_state) = HkI * lambda_mrcc(i_state, l) - contrib = dkI(i_state) * delta_JI - !$OMP ATOMIC - delta_ij_old(J,det_cepa0_idx(k),i_state) += contrib - if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then - !$OMP ATOMIC - delta_ii_old(J,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) - end if - - enddo - enddo - enddo - enddo - !$OMP END PARALLEL DO - -! do i=1,N_det_non_ref -! print *, delta_ij_old(:,i,i_state) -! end do -! stop - end do - deallocate(idx_sorted_bit) - - -! call wall_time(wall) -! print *, "old ", wall -END_PROVIDER - -! -! BEGIN_PROVIDER [ double precision, delta_ij_old, (N_det_ref,N_det_non_ref,N_states) ] -! &BEGIN_PROVIDER [ double precision, delta_ii_old, (N_det_ref,N_states) ] -! implicit none -! -! integer :: i_state, i, i_I, J, k, kk, degree, degree2, m, l, deg, ni, m2 -! integer :: p1,p2,h1,h2,s1,s2, blok, I_s, J_s -! ! integer, allocatable :: linked(:,:), blokMwen(:, :), nlink(:) -! logical :: ok -! double precision :: phase_iI, phase_Ik, phase_Jl, phase_Ji, phase_al, diI, hIi, hJi, delta_JI, dkI(N_states), HkI, ci_inv(N_states), dia_hla(N_states) -! double precision :: contrib, wall, iwall !, searchance(N_det_ref) -! double precision, allocatable :: deltaMwen(:,:,:), deltaIImwen(:,:) -! integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ -! integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2), inac, virt -! integer, external :: get_index_in_psi_det_sorted_bit, searchDet, detCmp -! logical, external :: is_in_wavefunction, isInCassd, detEq -! -! ! -459.6346665282306 -! ! -459.6346665282306 -! -! call wall_time(iwall) -! !allocate(linked(N_det_non_ref, N_det_ref), blokMwen(N_det_non_ref, N_det_ref), nlink(N_det_ref)) -! -! -! delta_ii_old(:,:) = 0d0 -! delta_ij_old(:,:,:) = 0d0 -! -! ! searchance = 0d0 -! ! do J = 1, N_det_ref -! ! nlink(J) = 0 -! ! do blok=1,cepa0_shortcut(0) -! ! do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 -! ! call get_excitation_degree(psi_ref(1,1,J),det_cepa0(1,1,k),degree,N_int) -! ! if(degree <= 2) then -! ! nlink(J) += 1 -! ! linked(nlink(J),J) = k -! ! blokMwen(nlink(J),J) = blok -! ! searchance(J) += log(dfloat(cepa0_shortcut(blok+1) - cepa0_shortcut(blok))) -! ! end if -! ! end do -! ! end do -! ! end do -! -! -! -! do I_s = 1, N_det_ref -! if(mod(I_s,1) == 0) then -! call wall_time(wall) -! wall = wall-iwall -! print *, I_s, "/", N_det_ref, wall * (dfloat(N_det_ref) / dfloat(I_s)), wall, wall * (dfloat(N_det_ref) / dfloat(I_s))-wall -! end if -! -! -! do J_s = 1, I_s -! -! call get_excitation_degree(psi_ref(1,1,J_s), psi_ref(1,1,I_s), degree, N_int) -! if(degree > 3) cycle -! -! if(searchance(I_s) < searchance(J_s)) then -! i_I = I_s -! J = J_s -! else -! i_I = J_s -! J = I_s -! end if -! -! !$OMP PARALLEL DO default(none) schedule(dynamic,1) shared(delta_ij_old, delta_ii_old) & -! !$OMP private(m,m2,kk, i, k, degree, degree2, l, deg, ni, inac, virt) & -! !$OMP private(ok,p1,p2,h1,h2,s1,s2, blok, wall, I_s, J_s) & -! !$OMP private(phase_iI, phase_Ik, phase_Ji, phase_al, diI, hIi, hJi, delta_JI, dkI, HkI, ci_inv, dia_hla) & -! !$OMP private(i_state, contrib, exc_iI, exc_Ik, exc_IJ, det_tmp, det_tmp2) & -! !$OMP shared(N_det_non_ref, N_det_ref, N_int, psi_non_ref, psi_non_ref_coef, psi_ref, psi_ref_coef) & -! !$OMP shared(lambda_mrcc, hf_bitmask, active_sorb,cepa0_shortcut,det_cepa0,N_states) & -! !$OMP shared(i_I, J, h_,det_cepa0_idx, linked, blokMwen, nlink, iwall, searchance) -! do kk = 1 , nlink(i_I) -! k = linked(kk,i_I) -! blok = blokMwen(kk,i_I) -! -! -! call get_excitation(psi_ref(1,1,i_I),det_cepa0(1,1,k),exc_Ik,degree,phase_Ik,N_int) -! -! call apply_excitation(psi_ref(1,1,J),exc_Ik,det_tmp2,ok,N_int) -! if(.not. ok) cycle -! -! -! -! -! l = searchDet(det_cepa0(1,1,cepa0_shortcut(blok)), det_tmp2, cepa0_shortcut(blok+1)-cepa0_shortcut(blok), N_int) -! if(l == -1) cycle -! l = det_cepa0_idx(cepa0_shortcut(blok)-1+l) -! -! -! -! m = 1 -! m2 = 1 -! do while(m <= nlink(i_I) .and. m2 <= nlink(J)) -! if(linked(m, i_I) < linked(m2, J)) then -! m += 1 -! cycle -! else if(linked(m, i_I) > linked(m2, J)) then -! m2 += 1 -! cycle -! end if -! -! -! i = det_cepa0_idx(linked(m,i_I)) -! m += 1 -! m2 += 1 -! -! do i_state = 1, N_states -! if(lambda_mrcc(i_state, i) == 0d0) cycle -! -! -! hJi = h_(J,i) -! if(hJi == 0) cycle -! hIi = h_(i_I,i) -! if(hIi == 0) cycle -! -! call apply_excitation(psi_non_ref(1,1,i),exc_Ik,det_tmp,ok,N_int) -! if(.not. ok) cycle -! -! -! if(isInCassd(det_tmp, N_int)) cycle -! -! -! call get_excitation(psi_ref(1,1,J),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) -! call get_excitation(det_tmp,psi_non_ref(1,1,l),exc_IJ,degree2,phase_al,N_int) -! delta_JI = hJi * hIi * lambda_mrcc(i_state, i) * phase_al * phase_Ji -! ci_inv(i_state) = 1.d0 / psi_ref_coef(i_I,i_state) -! HkI = h_(i_I,det_cepa0_idx(k)) -! dkI(i_state) = HkI * lambda_mrcc(i_state, det_cepa0_idx(k)) -! contrib = dkI(i_state) * delta_JI -! !$OMP ATOMIC -! delta_ij_old(i_I,l,i_state) += contrib -! if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then -! !$OMP ATOMIC -! delta_ii_old(i_I,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(l,i_state) -! endif -! ! -! if(l == det_cepa0_idx(k)) cycle -! call get_excitation(psi_ref(1,1,I_i),psi_non_ref(1,1,i),exc_IJ,degree2,phase_Ji,N_int) -! call get_excitation(det_tmp,det_cepa0(1,1,k),exc_IJ,degree2,phase_al,N_int) -! delta_JI = hJi * hIi * lambda_mrcc(i_state, i) * phase_al * phase_Ji -! -! ci_inv(i_state) = 1.d0 / psi_ref_coef(J,i_state) -! HkI = h_(J,l) -! dkI(i_state) = HkI * lambda_mrcc(i_state, l) -! contrib = dkI(i_state) * delta_JI -! !$OMP ATOMIC -! delta_ij_old(J,det_cepa0_idx(k),i_state) += contrib -! if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then -! !$OMP ATOMIC -! delta_ii_old(J,i_state) -= contrib * ci_inv(i_state) * psi_non_ref_coef(det_cepa0_idx(k),i_state) -! end if -! enddo !i_state -! end do ! while -! enddo !kk -! enddo !J -! -! enddo !I -! -! END_PROVIDER -! ! -! - diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index 9bcc95f9..0b456751 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -1757,4 +1757,3 @@ subroutine apply_excitation(det, exc, res, ok, Nint) ok = .true. end subroutine - From 33bd506328796e9008bf25cbf0202570bfe61291 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 20 May 2016 09:44:22 +0200 Subject: [PATCH 024/216] working mrcc --- config/gfortran_debug.cfg | 2 +- plugins/MRCC_Utils/davidson.irp.f | 2 +- plugins/MRCC_Utils/mrcc_dress.irp.f | 78 +-- plugins/MRCC_Utils/mrcc_utils.irp.f | 455 ++++++++++++++- plugins/mrcepa0/dressing.irp.f | 521 ++++++------------ .../mrcepa0/{mrsc2sub.irp.f => mrcc.irp.f} | 2 +- plugins/mrcepa0/mrcepa0.irp.f | 2 +- plugins/mrcepa0/mrcepa0_general.irp.f | 1 + plugins/mrcepa0/mrsc2.irp.f | 3 +- src/Determinants/H_apply.template.f | 4 +- src/Determinants/connected_to_ref.irp.f | 25 +- src/Determinants/determinants.irp.f | 41 ++ src/Determinants/slater_rules.irp.f | 10 +- src/Determinants/spindeterminants.irp.f | 20 +- 14 files changed, 733 insertions(+), 433 deletions(-) rename plugins/mrcepa0/{mrsc2sub.irp.f => mrcc.irp.f} (88%) diff --git a/config/gfortran_debug.cfg b/config/gfortran_debug.cfg index 72084241..03663eea 100644 --- a/config/gfortran_debug.cfg +++ b/config/gfortran_debug.cfg @@ -51,7 +51,7 @@ FCFLAGS : -Ofast # -g : Extra debugging information # [DEBUG] -FCFLAGS : -g -pedantic -msse4.2 +FCFLAGS : -g -msse4.2 # OpenMP flags ################# diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index 15077481..66f4975a 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -269,7 +269,7 @@ subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nin to_print(2,k) = residual_norm(k) enddo - write(iunit,'(X,I3,X,100(X,F16.10,X,E16.6))'), iter, to_print(:,1:N_st) + write(iunit,'(X,I3,X,100(X,F16.10,X,E16.6))') iter, to_print(:,1:N_st) call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_st,converged) if (converged) then exit diff --git a/plugins/MRCC_Utils/mrcc_dress.irp.f b/plugins/MRCC_Utils/mrcc_dress.irp.f index 1c2e8b74..412c52e2 100644 --- a/plugins/MRCC_Utils/mrcc_dress.irp.f +++ b/plugins/MRCC_Utils/mrcc_dress.irp.f @@ -51,9 +51,9 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Nstates, Ndet_non_ref, Ndet_ref,i_ge integer(bit_kind), allocatable :: microlist(:,:,:), microlist_zero(:,:,:) integer, allocatable :: idx_microlist(:), N_microlist(:), ptr_microlist(:), idx_microlist_zero(:) integer :: mobiles(2), smallerlist + logical, external :: is_generable - - + print *, i_generator leng = max(N_det_generators, N_det_non_ref) allocate(miniList(Nint, 2, leng), idx_minilist(leng), hij_cache(N_det_non_ref)) @@ -69,7 +69,7 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Nstates, Ndet_non_ref, Ndet_ref,i_ge allocate( microlist(Nint,2,N_minilist*4), & idx_microlist(N_minilist*4)) - if(key_mask(1,1) /= 0) then + if(key_mask(1,1) /= 0_8) then call create_microlist(miniList, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, Nint) call find_triples_and_quadruples_micro(i_generator,n_selected,det_buffer,Nint,tq,N_tq,microlist,ptr_microlist,N_microlist,key_mask) else @@ -87,6 +87,7 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Nstates, Ndet_non_ref, Ndet_ref,i_ge ! |alpha> if(N_tq > 0) then + call create_minilist(key_mask, psi_non_ref, miniList, idx_minilist, N_det_non_ref, N_minilist, Nint) if(N_minilist == 0) return @@ -117,8 +118,18 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Nstates, Ndet_non_ref, Ndet_ref,i_ge - do i_alpha=1,N_tq +! ok = .false. +! do i=N_det_generators, 1, -1 +! if(is_generable(psi_det_generators(1,1,i), tq(1,1,i_alpha), Nint)) then +! ok = .true. +! exit +! end if +! end do +! if(.not. ok) then +! cycle +! end if + if(key_mask(1,1) /= 0) then call getMobiles(tq(1,1,i_alpha), key_mask, mobiles, Nint) @@ -138,37 +149,6 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Nstates, Ndet_non_ref, Ndet_ref,i_ge do j=1,idx_alpha(0) idx_alpha(j) = idx_microlist_zero(idx_alpha(j)) end do - - -! i = 1 -! j = 2 -! do j = 2, idx_alpha_tmp(0) -! if(idx_alpha_tmp(j) < idx_alpha_tmp(j-1)) exit -! end do -! -! m = j -! -! idx_alpha(0) = idx_alpha_tmp(0) -! -! do l = 1, idx_alpha(0) -! if(j > idx_alpha_tmp(0)) then -! k = i -! i += 1 -! else if(i >= m) then -! k = j -! j += 1 -! else if(idx_alpha_tmp(i) < idx_alpha_tmp(j)) then -! k = i -! i += 1 -! else -! k = j -! j += 1 -! end if -! ! k=l -! idx_alpha(l) = idx_alpha_tmp(k) -! degree_alpha(l) = degree_alpha_tmp(k) -! end do -! else call get_excitation_degree_vector(miniList,tq(1,1,i_alpha),degree_alpha,Nint,N_minilist,idx_alpha) do j=1,idx_alpha(0) @@ -177,12 +157,6 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Nstates, Ndet_non_ref, Ndet_ref,i_ge end if -! call get_excitation_degree_vector(miniList,tq(1,1,i_alpha),degree_alpha,Nint,N_minilist,idx_alpha) -! do j=1,idx_alpha(0) -! idx_alpha(j) = idx_miniList(idx_alpha(j)) -! end do - !print *, idx_alpha(:idx_alpha(0)) - do l_sd=1,idx_alpha(0) k_sd = idx_alpha(l_sd) call i_h_j(tq(1,1,i_alpha),psi_non_ref(1,1,idx_alpha(l_sd)),Nint,hij_cache(k_sd)) @@ -285,33 +259,31 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Nstates, Ndet_non_ref, Ndet_ref,i_ge enddo enddo call omp_set_lock( psi_ref_lock(i_I) ) + + do i_state=1,Nstates if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5)then do l_sd=1,idx_alpha(0) k_sd = idx_alpha(l_sd) - delta_ij_(i_state,k_sd,i_I) = delta_ij_(i_state,k_sd,i_I) + dIa_hla(i_state,k_sd) - delta_ii_(i_state,i_I) = delta_ii_(i_state,i_I) - dIa_hla(i_state,k_sd) * ci_inv(i_state) * psi_non_ref_coef_transp(i_state,k_sd) + delta_ij_(i_state,k_sd,i_I) = delta_ij_(i_state,k_sd,i_I) + dIa_hla(i_state,k_sd) + delta_ii_(i_state,i_I) = delta_ii_(i_state,i_I) - dIa_hla(i_state,k_sd) * ci_inv(i_state) * psi_non_ref_coef_transp(i_state,k_sd) enddo else - delta_ii_(i_state,i_I) = 0.d0 + !delta_ii_(i_state,i_I) = 0.d0 do l_sd=1,idx_alpha(0) k_sd = idx_alpha(l_sd) - delta_ij_(i_state,k_sd,i_I) = delta_ij_(i_state,k_sd,i_I) + dIa_hla(i_state,k_sd) + delta_ij_(i_state,k_sd,i_I) = delta_ij_(i_state,k_sd,i_I) + dIa_hla(i_state,k_sd) enddo endif enddo call omp_unset_lock( psi_ref_lock(i_I) ) enddo enddo - !deallocate (dIa_hla,hij_cache) - !deallocate(miniList, idx_miniList) + deallocate (dIa_hla,hij_cache) + deallocate(miniList, idx_miniList) end - - - - subroutine find_triples_and_quadruples(i_generator,n_selected,det_buffer,Nint,tq,N_tq,miniList,N_miniList) use bitmasks @@ -360,7 +332,7 @@ subroutine find_triples_and_quadruples(i_generator,n_selected,det_buffer,Nint,tq endif enddo if (good) then - if (.not. is_in_wavefunction(det_buffer(1,1,i),Nint,N_det)) then + if (.not. is_in_wavefunction(det_buffer(1,1,i),Nint)) then N_tq += 1 do k=1,N_int tq(k,1,N_tq) = det_buffer(k,1,i) @@ -437,7 +409,7 @@ subroutine find_triples_and_quadruples_micro(i_generator,n_selected,det_buffer,N endif enddo if (good) then - if (.not. is_in_wavefunction(det_buffer(1,1,i),Nint,N_det)) then + if (.not. is_in_wavefunction(det_buffer(1,1,i),Nint)) then N_tq += 1 do k=1,N_int tq(k,1,N_tq) = det_buffer(k,1,i) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index cfaf7a67..8873a940 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -112,20 +112,12 @@ END_PROVIDER lambda_mrcc_pt2(N_lambda_mrcc_pt2) = i endif endif -! j = int(lambda_mrcc(k,i) * 100) -! if(j < -200) j = -200 -! if(j > 200) j = 200 -! histo(j) += 1 enddo enddo lambda_mrcc_pt2(0) = N_lambda_mrcc_pt2 end if - -! do i=-200,200 -! print *, i, histo(i) -! end do print*,'N_det_non_ref = ',N_det_non_ref - !print*,'Number of ignored determinants = ',i_pert_count + print*,'Number of ignored determinants = ',i_pert_count print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) print*,'lambda max = ',maxval(dabs(lambda_mrcc)) @@ -163,6 +155,7 @@ END_PROVIDER call H_apply_mrcc(delta_ij,delta_ii,N_states,N_det_non_ref,N_det_ref) END_PROVIDER + BEGIN_PROVIDER [ double precision, h_matrix_dressed, (N_det,N_det,N_states) ] implicit none @@ -288,3 +281,447 @@ subroutine diagonalize_CI_dressed(lambda) SOFT_TOUCH psi_coef end + + +logical function is_generable(det1, det2, Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer(bit_kind) :: det1(Nint, 2), det2(Nint, 2) + integer :: degree, f, exc(0:2, 2, 2), h1, h2, p1, p2, s1, s2, t + integer, external :: searchExc + logical, external :: excEq + double precision :: phase + + is_generable = .false. + call get_excitation(det1, det2, exc, degree, phase, Nint) + if(degree == -1) return + if(degree == 0) then + is_generable = .true. + return + end if + if(degree > 2) stop "?22??" + !!!!! +! call dec_exc(exc, h1, h2, p1, p2) +! f = searchExc(toutmoun(1,1), (/h1, h2, p1, p2/), hh_shortcut(hh_shortcut(0)+1)-1) +! !print *, toutmoun(:,1), hh_shortcut(hh_shortcut(0)+1)-1, (/h1, h2, p1, p2/) +! if(f /= -1) then +! is_generable = .true. +! if(.not. excEq(toutmoun(1,f), (/h1, h2, p1, p2/))) stop "????" +! end if +! ! print *, f +! return + + call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) + + if(degree == 1) then + h2 = h1 + p2 = p1 + s2 = s1 + h1 = 0 + p1 = 0 + s1 = 0 + end if + + if(h1 + s1*mo_tot_num < h2 + s2*mo_tot_num) then + f = searchExc(hh_exists(1,1), (/s1, h1, s2, h2/), hh_shortcut(0)) + else + f = searchExc(hh_exists(1,1), (/s2, h2, s1, h1/), hh_shortcut(0)) + end if + if(f == -1) return + + if(p1 + s1*mo_tot_num < p2 + s2*mo_tot_num) then + f = searchExc(pp_exists(1,hh_shortcut(f)), (/s1, p1, s2, p2/), hh_shortcut(f+1)-hh_shortcut(f)) + else + f = searchExc(pp_exists(1,hh_shortcut(f)), (/s2, p2, s1, p1/), hh_shortcut(f+1)-hh_shortcut(f)) + end if + + if(f /= -1) is_generable = .true. +end function + + + +integer function searchDet(dets, det, n, Nint) + implicit none + use bitmasks + + integer(bit_kind),intent(in) :: dets(Nint,2,n), det(Nint,2) + integer, intent(in) :: nint, n + integer :: l, h, c + integer, external :: detCmp + logical, external :: detEq + + l = 1 + h = n + do while(.true.) + searchDet = (l+h)/2 + c = detCmp(dets(1,1,searchDet), det(:,:), Nint) + if(c == 0) return + if(c == 1) then + h = searchDet-1 + else + l = searchDet+1 + end if + if(l > h) then + searchDet = -1 + return + end if + + end do +end function + + +integer function searchExc(excs, exc, n) + implicit none + use bitmasks + + integer, intent(in) :: n + integer,intent(in) :: excs(4,n), exc(4) + integer :: l, h, c + integer, external :: excCmp + logical, external :: excEq + + l = 1 + h = n + do + searchExc = (l+h)/2 + c = excCmp(excs(1,searchExc), exc(:)) + if(c == 0) return + if(c == 1) then + h = searchExc-1 + else + l = searchExc+1 + end if + if(l > h) then + searchExc = -1 + return + end if + end do +end function + + +subroutine sort_det(key, idx, N_key, Nint) + implicit none + + + integer, intent(in) :: Nint, N_key + integer(8),intent(inout) :: key(Nint,2,N_key) + integer,intent(out) :: idx(N_key) + integer(8) :: tmp(Nint, 2) + integer :: tmpidx,i,ni + + do i=1,N_key + idx(i) = i + end do + + do i=N_key/2,1,-1 + call tamiser(key, idx, i, N_key, Nint, N_key) + end do + + do i=N_key,2,-1 + do ni=1,Nint + tmp(ni,1) = key(ni,1,i) + tmp(ni,2) = key(ni,2,i) + key(ni,1,i) = key(ni,1,1) + key(ni,2,i) = key(ni,2,1) + key(ni,1,1) = tmp(ni,1) + key(ni,2,1) = tmp(ni,2) + enddo + + tmpidx = idx(i) + idx(i) = idx(1) + idx(1) = tmpidx + call tamiser(key, idx, 1, i-1, Nint, N_key) + end do +end subroutine + + +subroutine sort_exc(key, N_key) + implicit none + + + integer, intent(in) :: N_key + integer,intent(inout) :: key(4,N_key) + integer :: tmp(4) + integer :: i,ni + + + do i=N_key/2,1,-1 + call tamise_exc(key, i, N_key, N_key) + end do + + do i=N_key,2,-1 + do ni=1,4 + tmp(ni) = key(ni,i) + key(ni,i) = key(ni,1) + key(ni,1) = tmp(ni) + enddo + + call tamise_exc(key, 1, i-1, N_key) + end do +end subroutine + + +logical function exc_inf(exc1, exc2) + implicit none + integer,intent(in) :: exc1(4), exc2(4) + integer :: i + exc_inf = .false. + do i=1,4 + if(exc1(i) < exc2(i)) then + exc_inf = .true. + return + else if(exc1(i) > exc2(i)) then + return + end if + end do +end function + + +subroutine tamise_exc(key, no, n, N_key) + use bitmasks + implicit none + + BEGIN_DOC +! Uncodumented : TODO + END_DOC + integer,intent(in) :: no, n, N_key + integer,intent(inout) :: key(4, N_key) + integer :: k,j + integer :: tmp(4) + logical :: exc_inf + integer :: ni + + k = no + j = 2*k + do while(j <= n) + if(j < n) then + if (exc_inf(key(1,j), key(1,j+1))) then + j = j+1 + endif + endif + if(exc_inf(key(1,k), key(1,j))) then + do ni=1,4 + tmp(ni) = key(ni,k) + key(ni,k) = key(ni,j) + key(ni,j) = tmp(ni) + enddo + k = j + j = k+k + else + return + endif + enddo +end subroutine + + +subroutine dec_exc(exc, h1, h2, p1, p2) + implicit none + integer :: exc(0:2,2,2), s1, s2, degree + integer, intent(out) :: h1, h2, p1, p2 + + degree = exc(0,1,1) + exc(0,1,2) + + h1 = 0 + h2 = 0 + p1 = 0 + p2 = 0 + + if(degree == 0) return + + call decode_exc(exc, degree, h1, p1, h2, p2, s1, s2) + + h1 += mo_tot_num * (s1-1) + p1 += mo_tot_num * (s1-1) + + if(degree == 2) then + h2 += mo_tot_num * (s2-1) + p2 += mo_tot_num * (s2-1) + if(h1 > h2) then + s1 = h1 + h1 = h2 + h2 = s1 + end if + if(p1 > p2) then + s1 = p1 + p1 = p2 + p2 = s1 + end if + else + h2 = h1 + p2 = p1 + p1 = 0 + h1 = 0 + end if +end subroutine + + + BEGIN_PROVIDER [ integer, hh_exists, (4, N_det_ref * N_det_non_ref) ] +&BEGIN_PROVIDER [ integer, hh_shortcut, (0:N_det_ref * N_det_non_ref + 1) ] +&BEGIN_PROVIDER [ integer, pp_exists, (4, N_det_ref * N_det_non_ref) ] + implicit none + integer,allocatable :: num(:,:) + integer :: exc(0:2, 2, 2), degree, n, on, s, h1, h2, p1, p2, l, i + double precision :: phase + logical, external :: excEq + + allocate(num(4, N_det_ref * N_det_non_ref)) + + hh_shortcut = 0 + hh_exists = 0 + pp_exists = 0 + num = 0 + + n = 0 + do i=1, N_det_ref + do l=1, N_det_non_ref + call get_excitation(psi_ref(1,1,i), psi_non_ref(1,1,l), exc, degree, phase, N_int) + if(degree == -1) cycle + call dec_exc(exc, h1, h2, p1, p2) + n += 1 + num(:, n) = (/h1, h2, p1, p2/) + end do + end do + + call sort_exc(num, n) + + hh_shortcut(0) = 1 + hh_shortcut(1) = 1 + hh_exists(:,1) = (/1, num(1,1), 1, num(2,1)/) + pp_exists(:,1) = (/1, num(3,1), 1, num(4,1)/) + s = 1 + do i=2,n + if(.not. excEq(num(1,i), num(1,s))) then + s += 1 + num(:, s) = num(:, i) + pp_exists(:,s) = (/1, num(3,s), 1, num(4,s)/) + if(hh_exists(2, hh_shortcut(0)) /= num(1,s) .or. & + hh_exists(4, hh_shortcut(0)) /= num(2,s)) then + hh_shortcut(0) += 1 + hh_shortcut(hh_shortcut(0)) = s + hh_exists(:,hh_shortcut(0)) = (/1, num(1,s), 1, num(2,s)/) + end if + end if + end do + hh_shortcut(hh_shortcut(0)+1) = s+1 + + do s=2,4,2 + do i=1,hh_shortcut(0) + if(hh_exists(s, i) == 0) then + hh_exists(s-1, i) = 0 + else if(hh_exists(s, i) > mo_tot_num) then + hh_exists(s, i) -= mo_tot_num + hh_exists(s-1, i) = 2 + end if + end do + + do i=1,hh_shortcut(hh_shortcut(0)+1)-1 + if(pp_exists(s, i) == 0) then + pp_exists(s-1, i) = 0 + else if(pp_exists(s, i) > mo_tot_num) then + pp_exists(s, i) -= mo_tot_num + pp_exists(s-1, i) = 2 + end if + end do + end do +END_PROVIDER + + +logical function excEq(exc1, exc2) + implicit none + integer, intent(in) :: exc1(4), exc2(4) + integer :: i + excEq = .false. + do i=1, 4 + if(exc1(i) /= exc2(i)) return + end do + excEq = .true. +end function + + +integer function excCmp(exc1, exc2) + implicit none + integer, intent(in) :: exc1(4), exc2(4) + integer :: i + excCmp = 0 + do i=1, 4 + if(exc1(i) > exc2(i)) then + excCmp = 1 + return + else if(exc1(i) < exc2(i)) then + excCmp = -1 + return + end if + end do +end function + + +subroutine apply_hole(det, exc, res, ok, Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer, intent(in) :: exc(4) + integer :: s1, s2, h1, h2 + integer(bit_kind),intent(in) :: det(Nint, 2) + integer(bit_kind),intent(out) :: res(Nint, 2) + logical, intent(out) :: ok + integer :: ii, pos + + ok = .false. + s1 = exc(1) + h1 = exc(2) + s2 = exc(3) + h2 = exc(4) + res = det + + if(h1 /= 0) then + ii = (h1-1)/bit_kind_size + 1 + pos = mod(h1-1, 64)!iand(h1-1,bit_kind_size-1) ! mod 64 + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s1) = ibclr(res(ii, s1), pos) + end if + + ii = (h2-1)/bit_kind_size + 1 + pos = mod(h2-1, 64)!iand(h2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s2) = ibclr(res(ii, s2), pos) + + + ok = .true. +end subroutine + + +subroutine apply_particle(det, exc, res, ok, Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer, intent(in) :: exc(4) + integer :: s1, s2, p1, p2 + integer(bit_kind),intent(in) :: det(Nint, 2) + integer(bit_kind),intent(out) :: res(Nint, 2) + logical, intent(out) :: ok + integer :: ii, pos + + ok = .false. + s1 = exc(1) + p1 = exc(2) + s2 = exc(3) + p2 = exc(4) + res = det + + if(p1 /= 0) then + ii = (p1-1)/bit_kind_size + 1 + pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s1) = ibset(res(ii, s1), pos) + end if + + ii = (p2-1)/bit_kind_size + 1 + pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s2) = ibset(res(ii, s2), pos) + + + ok = .true. +end subroutine + diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index e0689642..5d8d4850 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -1,227 +1,32 @@ use bitmasks -subroutine dec_exc(exc, h1, h2, p1, p2) - implicit none - integer :: exc(0:2,2,2), s1, s2, degree - integer, intent(out) :: h1, h2, p1, p2 - - degree = exc(0,1,1) + exc(0,1,2) - - h1 = 0 - h2 = 0 - p1 = 0 - p2 = 0 - - if(degree == 0) return - - call decode_exc(exc, degree, h1, p1, h2, p2, s1, s2) - - h1 += mo_tot_num * (s1-1) - p1 += mo_tot_num * (s1-1) - - if(degree == 2) then - h2 += mo_tot_num * (s2-1) - p2 += mo_tot_num * (s2-1) - if(h1 > h2) then - s1 = h1 - h1 = h2 - h2 = s1 - end if - if(p1 > p2) then - s1 = p1 - p1 = p2 - p2 = s1 - end if - else - h2 = h1 - p2 = p1 - p1 = 0 - h1 = 0 - end if -end subroutine - - - - BEGIN_PROVIDER [ integer, hh_exists, (4, N_det_ref * N_det_non_ref) ] -&BEGIN_PROVIDER [ integer, hh_shortcut, (0:N_det_ref * N_det_non_ref + 1) ] -&BEGIN_PROVIDER [ integer, pp_exists, (4, N_det_ref * N_det_non_ref) ] - implicit none - integer :: num(0:mo_tot_num*2, 0:mo_tot_num*2) - integer :: exc(0:2, 2, 2), degree, n, on, s, h1, h2, p1, p2, l, i - double precision :: phase - - hh_shortcut = 0 - hh_exists = 0 - pp_exists = 0 - num = 0 - - do i=1, N_det_ref - do l=1, N_det_non_ref - call get_excitation(psi_ref(1,1,i), psi_non_ref(1,1,l), exc, degree, phase, N_int) - if(degree == -1) cycle - call dec_exc(exc, h1, h2, p1, p2) - num(h1, h2) += 1 - end do - end do - - n = 1 - do l=0,mo_tot_num*2 - do i=0,l - on = num(i,l) - if(on /= 0) then - hh_shortcut(0) += 1 - hh_shortcut(hh_shortcut(0)) = n - hh_exists(:, hh_shortcut(0)) = (/1, i, 1, l/) - end if - - num(i,l) = n - n += on - end do - end do - - hh_shortcut(hh_shortcut(0)+1) = n - - do i=1, N_det_ref - do l=1, N_det_non_ref - call get_excitation(psi_ref(1,1,i), psi_non_ref(1,1,l), exc, degree, phase, N_int) - if(degree == -1) cycle - call dec_exc(exc, h1, h2, p1, p2) - pp_exists(:, num(h1, h2)) = (/1,p1,1,p2/) - num(h1, h2) += 1 - end do - end do - - do s=2,4,2 - do i=1,hh_shortcut(0) - if(hh_exists(s, i) == 0) then - hh_exists(s-1, i) = 0 - else if(hh_exists(s, i) > mo_tot_num) then - hh_exists(s, i) -= mo_tot_num - hh_exists(s-1, i) = 2 - end if - end do - - do i=1,hh_shortcut(hh_shortcut(0)+1)-1 - if(pp_exists(s, i) == 0) then - pp_exists(s-1, i) = 0 - else if(pp_exists(s, i) > mo_tot_num) then - pp_exists(s, i) -= mo_tot_num - pp_exists(s-1, i) = 2 - end if - end do - end do - -END_PROVIDER - - - - -subroutine apply_hole(det, exc, res, ok, Nint) - use bitmasks - implicit none - integer, intent(in) :: Nint - integer, intent(in) :: exc(4) - integer :: s1, s2, h1, h2 - integer(bit_kind),intent(in) :: det(Nint, 2) - integer(bit_kind),intent(out) :: res(Nint, 2) - logical, intent(out) :: ok - integer :: ii, pos - - ok = .false. - s1 = exc(1) - h1 = exc(2) - s2 = exc(3) - h2 = exc(4) - res = det - - if(h1 /= 0) then - ii = (h1-1)/bit_kind_size + 1 - pos = mod(h1-1, 64)!iand(h1-1,bit_kind_size-1) ! mod 64 - if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) return - res(ii, s1) = ibclr(res(ii, s1), pos) - end if - - ii = (h2-1)/bit_kind_size + 1 - pos = mod(h2-1, 64)!iand(h2-1,bit_kind_size-1) - if(iand(det(ii, s2), ishft(1_bit_kind, pos)) == 0_8) return - res(ii, s2) = ibclr(res(ii, s2), pos) - - - ok = .true. -end subroutine - - -subroutine apply_particle(det, exc, res, ok, Nint) - use bitmasks - implicit none - integer, intent(in) :: Nint - integer, intent(in) :: exc(4) - integer :: s1, s2, p1, p2 - integer(bit_kind),intent(in) :: det(Nint, 2) - integer(bit_kind),intent(out) :: res(Nint, 2) - logical, intent(out) :: ok - integer :: ii, pos - - ok = .false. - s1 = exc(1) - p1 = exc(2) - s2 = exc(3) - p2 = exc(4) - res = det - - if(p1 /= 0) then - ii = (p1-1)/bit_kind_size + 1 - pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) - if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) return - res(ii, s1) = ibset(res(ii, s1), pos) - end if - - ii = (p2-1)/bit_kind_size + 1 - pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) - if(iand(det(ii, s2), ishft(1_bit_kind, pos)) /= 0_8) return - res(ii, s2) = ibset(res(ii, s2), pos) - - - ok = .true. -end subroutine - BEGIN_PROVIDER [ double precision, delta_ij_mrcc, (N_states,N_det_non_ref,N_det_ref) ] &BEGIN_PROVIDER [ double precision, delta_ii_mrcc, (N_states, N_det_ref) ] use bitmasks implicit none - integer :: gen, h, p, i_state, n, t + integer :: gen, h, p, i_state, n, t, i, h1, h2, p1, p2, s1, s2 integer(bit_kind) :: mask(N_int, 2), omask(N_int, 2), buf(N_int, 2, N_det_non_ref) logical :: ok + logical, external :: detEq delta_ij_mrcc = 0d0 delta_ii_mrcc = 0d0 i_state = 1 - do gen=1, N_det_generators - !print *, gen, "/", N_det_generators + do gen= 1, N_det_generators + print *, gen, "/", N_det_generators do h=1, hh_shortcut(0) call apply_hole(psi_det_generators(1,1,gen), hh_exists(1, h), mask, ok, N_int) if(.not. ok) cycle - omask = 0 + omask = 0_bit_kind if(hh_exists(1, h) /= 0) omask = mask - !-459.6378590456251 - !-199.0659502581943 n = 1 - ploop : do p=hh_shortcut(h), hh_shortcut(h+1)-1 - - do t=hh_shortcut(h), p-1 - if(pp_exists(1, p) == pp_exists(1,t) .and. & - pp_exists(2, p) == pp_exists(2,t) .and. & - pp_exists(3, p) == pp_exists(3,t) .and. & - pp_exists(4, p) == pp_exists(4,t)) cycle ploop - end do + do p=hh_shortcut(h), hh_shortcut(h+1)-1 call apply_particle(mask, pp_exists(1, p), buf(1,1,n), ok, N_int) - !-459.6379081607463 - !-199.0659982685706 if(ok) n = n + 1 - end do ploop + end do n = n - 1 if(n /= 0) call mrcc_part_dress(delta_ij_mrcc, delta_ii_mrcc,gen,n,buf,N_int,omask) end do @@ -229,7 +34,6 @@ end subroutine END_PROVIDER - subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffer,Nint,key_mask) use bitmasks implicit none @@ -258,7 +62,7 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe integer :: i_state, k_sd, l_sd, i_I, i_alpha integer(bit_kind),allocatable :: miniList(:,:,:) - integer(bit_kind),intent(in) :: key_mask(Nint, 2) + integer(bit_kind) :: key_mask(Nint, 2) integer,allocatable :: idx_miniList(:) integer :: N_miniList, ni, leng double precision, allocatable :: hij_cache(:) @@ -266,18 +70,18 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe integer(bit_kind), allocatable :: microlist(:,:,:), microlist_zero(:,:,:) integer, allocatable :: idx_microlist(:), N_microlist(:), ptr_microlist(:), idx_microlist_zero(:) integer :: mobiles(2), smallerlist - - - + logical, external :: detEq, is_generable + + leng = max(N_det_generators, N_det_non_ref) allocate(miniList(Nint, 2, leng), idx_minilist(leng), hij_cache(N_det_non_ref)) !create_minilist_find_previous(key_mask, fullList, miniList, N_fullList, N_miniList, fullMatch, Nint) call create_minilist_find_previous(key_mask, psi_det_generators, miniList, i_generator-1, N_miniList, fullMatch, Nint) - if(fullMatch) then - return - end if +! if(fullMatch) then +! return +! end if allocate(ptr_microlist(0:mo_tot_num*2+1), & N_microlist(0:mo_tot_num*2) ) @@ -286,9 +90,9 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe if(key_mask(1,1) /= 0) then call create_microlist(miniList, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, Nint) - call find_triples_and_quadruples_micro(i_generator,n_selected,det_buffer,Nint,tq,N_tq,microlist,ptr_microlist,N_microlist,key_mask) + call filter_tq_micro(i_generator,n_selected,det_buffer,Nint,tq,N_tq,microlist,ptr_microlist,N_microlist,key_mask) else - call find_triples_and_quadruples(i_generator,n_selected,det_buffer,Nint,tq,N_tq,miniList,N_minilist) + call filter_tq(i_generator,n_selected,det_buffer,Nint,tq,N_tq,miniList,N_minilist) end if @@ -332,7 +136,7 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe do i_alpha=1,N_tq - if(key_mask(1,1) /= 0) then + if(key_mask(1,1) /= 0) then call getMobiles(tq(1,1,i_alpha), key_mask, mobiles, Nint) if(N_microlist(mobiles(1)) < N_microlist(mobiles(2))) then @@ -463,26 +267,27 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe enddo enddo call omp_set_lock( psi_ref_lock(i_I) ) + do i_state=1,N_states if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5)then do l_sd=1,idx_alpha(0) k_sd = idx_alpha(l_sd) - delta_ij_(i_state,k_sd,i_I) = delta_ij_(i_state,k_sd,i_I) + dIa_hla(i_state,k_sd) - delta_ii_(i_state,i_I) = delta_ii_(i_state,i_I) - dIa_hla(i_state,k_sd) * ci_inv(i_state) * psi_non_ref_coef_transp(i_state,k_sd) + delta_ij_(i_state,k_sd,i_I) = delta_ij_(i_state,k_sd,i_I) + dIa_hla(i_state,k_sd) + delta_ii_(i_state,i_I) = delta_ii_(i_state,i_I) - dIa_hla(i_state,k_sd) * ci_inv(i_state) * psi_non_ref_coef_transp(i_state,k_sd) enddo else delta_ii_(i_state,i_I) = 0.d0 do l_sd=1,idx_alpha(0) k_sd = idx_alpha(l_sd) - delta_ij_(i_state,k_sd,i_I) = delta_ij_(i_state,k_sd,i_I) + dIa_hla(i_state,k_sd) + delta_ij_(i_state,k_sd,i_I) = delta_ij_(i_state,k_sd,i_I) + dIa_hla(i_state,k_sd) enddo endif enddo call omp_unset_lock( psi_ref_lock(i_I) ) enddo enddo - !deallocate (dIa_hla,hij_cache) - !deallocate(miniList, idx_miniList) + deallocate (dIa_hla,hij_cache) + deallocate(miniList, idx_miniList) end @@ -494,29 +299,30 @@ end implicit none integer :: i, j, i_state - !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrsc2 sub + !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrcc do i_state = 1, N_states if(mrmode == 3) then - do i = 1, N_det_ref - delta_ii(i_state,i)= delta_mrcepa0_ii(i,i_state) - delta_sub_ii(i,i_state) - do j = 1, N_det_non_ref - delta_ij(i_state,j,i) = delta_mrcepa0_ij(i,j,i_state) - delta_sub_ij(i,j,i_state) - end do - end do - else if(mrmode == 2) then - do i = 1, N_det_ref - delta_ii(i_state,i)= delta_ii_mrcc(i_state,i) - do j = 1, N_det_non_ref - delta_ij(i_state,j,i) = delta_ij_mrcc(i_state,j,i) - end do + do i = 1, N_det_ref + delta_ii(i_state,i)= delta_ii_mrcc(i_state,i) + do j = 1, N_det_non_ref + delta_ij(i_state,j,i) = delta_ij_mrcc(i_state,j,i) end do + end do +! ! do i = 1, N_det_ref -! delta_ii(i_state,i)= delta_ii_old(i_state,i) +! delta_ii(i_state,i)= delta_mrcepa0_ii(i,i_state) - delta_sub_ii(i,i_state) ! do j = 1, N_det_non_ref -! delta_ij(i_state,j,i) = delta_ij_old(i_state,j,i) +! delta_ij(i_state,j,i) = delta_mrcepa0_ij(i,j,i_state) - delta_sub_ij(i,j,i_state) ! end do ! end do + else if(mrmode == 2) then + do i = 1, N_det_ref + delta_ii(i_state,i)= delta_ii_old(i_state,i) + do j = 1, N_det_non_ref + delta_ij(i_state,j,i) = delta_ij_old(i_state,j,i) + end do + end do else if(mrmode == 1) then do i = 1, N_det_ref delta_ii(i_state,i)= delta_mrcepa0_ii(i,i_state) @@ -646,7 +452,6 @@ END_PROVIDER end do end do end do - print *, "pre done" END_PROVIDER @@ -708,21 +513,6 @@ END_PROVIDER END_PROVIDER -logical function detEq(a,b,Nint) - use bitmasks - implicit none - integer, intent(in) :: Nint - integer(bit_kind), intent(in) :: a(Nint,2), b(Nint,2) - integer :: ni, i - - detEq = .false. - do i=1,2 - do ni=1,Nint - if(a(ni,i) /= b(ni,i)) return - end do - end do - detEq = .true. -end function logical function isInCassd(a,Nint) @@ -793,106 +583,6 @@ subroutine getHP(a,h,p,Nint) !isInCassd = .true. end function -integer function detCmp(a,b,Nint) - use bitmasks - implicit none - integer, intent(in) :: Nint - integer(bit_kind), intent(in) :: a(Nint,2), b(Nint,2) - integer :: ni, i - - detCmp = 0 - do i=1,2 - do ni=Nint,1,-1 - - if(a(ni,i) < b(ni,i)) then - detCmp = -1 - return - else if(a(ni,i) > b(ni,i)) then - detCmp = 1 - return - end if - - end do - end do -end function - - -integer function searchDet(dets, det, n, Nint) - implicit none - use bitmasks - - integer(bit_kind),intent(in) :: dets(Nint,2,n), det(Nint,2) - integer, intent(in) :: nint, n - integer :: l, h, c - integer, external :: detCmp - logical, external :: detEq - - !do l=1,n - ! if(detEq(det(1,1), dets(1,1,l),Nint)) then - ! searchDet = l - ! return - ! end if - !end do - !searchDet = -1 - !return - - - l = 1 - h = n - do while(.true.) - searchDet = (l+h)/2 - c = detCmp(dets(1,1,searchDet), det(:,:), Nint) - if(c == 0) return - if(c == 1) then - h = searchDet-1 - else - l = searchDet+1 - end if - if(l > h) then - searchDet = -1 - return - end if - - end do -end function - - -subroutine sort_det(key, idx, N_key, Nint) - implicit none - - - integer, intent(in) :: Nint, N_key - integer(8),intent(inout) :: key(Nint,2,N_key) - integer,intent(out) :: idx(N_key) - integer(8) :: tmp(Nint, 2) - integer :: tmpidx,i,ni - - do i=1,N_key - idx(i) = i - end do - - do i=N_key/2,1,-1 - call tamiser(key, idx, i, N_key, Nint, N_key) - end do - - do i=N_key,2,-1 - do ni=1,Nint - tmp(ni,1) = key(ni,1,i) - tmp(ni,2) = key(ni,2,i) - key(ni,1,i) = key(ni,1,1) - key(ni,2,i) = key(ni,2,1) - key(ni,1,1) = tmp(ni,1) - key(ni,2,1) = tmp(ni,2) - enddo - - tmpidx = idx(i) - idx(i) = idx(1) - idx(1) = tmpidx - call tamiser(key, idx, 1, i-1, Nint, N_key) - end do -end subroutine - - BEGIN_PROVIDER [ double precision, delta_mrcepa0_ij, (N_det_ref,N_det_non_ref,N_states) ] &BEGIN_PROVIDER [ double precision, delta_mrcepa0_ii, (N_det_ref,N_states) ] @@ -1116,6 +806,7 @@ end subroutine BEGIN_PROVIDER [ double precision, h_, (N_det_ref,N_det_non_ref) ] + implicit none integer :: i,j do i=1,N_det_ref do j=1,N_det_non_ref @@ -1125,3 +816,135 @@ BEGIN_PROVIDER [ double precision, h_, (N_det_ref,N_det_non_ref) ] END_PROVIDER + +subroutine filter_tq(i_generator,n_selected,det_buffer,Nint,tq,N_tq,miniList,N_miniList) + + use bitmasks + implicit none + + integer, intent(in) :: i_generator,n_selected, Nint + + integer(bit_kind), intent(in) :: det_buffer(Nint,2,n_selected) + integer :: i,j,k,m + logical :: is_in_wavefunction + integer :: degree(psi_det_size) + integer :: idx(0:psi_det_size) + logical :: good + + integer(bit_kind), intent(out) :: tq(Nint,2,n_selected) + integer, intent(out) :: N_tq + + integer :: nt,ni + logical, external :: is_connected_to, is_generable + + integer(bit_kind),intent(in) :: miniList(Nint,2,N_det_generators) + integer,intent(in) :: N_miniList + + + N_tq = 0 + + i_loop : do i=1,N_selected + do k=1, N_minilist + if(is_generable(miniList(1,1,k), det_buffer(1,1,i), Nint)) cycle i_loop + end do + + ! Select determinants that are triple or quadruple excitations + ! from the ref + good = .True. + call get_excitation_degree_vector(psi_ref,det_buffer(1,1,i),degree,Nint,N_det_ref,idx) + !good=(idx(0) == 0) tant que degree > 2 pas retourné par get_excitation_degree_vector + do k=1,idx(0) + if (degree(k) < 3) then + good = .False. + exit + endif + enddo + if (good) then + if (.not. is_in_wavefunction(det_buffer(1,1,i),Nint)) then + N_tq += 1 + do k=1,N_int + tq(k,1,N_tq) = det_buffer(k,1,i) + tq(k,2,N_tq) = det_buffer(k,2,i) + enddo + endif + endif + enddo i_loop +end + + +subroutine filter_tq_micro(i_generator,n_selected,det_buffer,Nint,tq,N_tq,microlist,ptr_microlist,N_microlist,key_mask) + + use bitmasks + implicit none + + integer, intent(in) :: i_generator,n_selected, Nint + + integer(bit_kind), intent(in) :: det_buffer(Nint,2,n_selected) + integer :: i,j,k,m + logical :: is_in_wavefunction + integer :: degree(psi_det_size) + integer :: idx(0:psi_det_size) + logical :: good + + integer(bit_kind), intent(out) :: tq(Nint,2,n_selected) + integer, intent(out) :: N_tq + + integer :: nt,ni + logical, external :: is_connected_to, is_generable + + integer(bit_kind),intent(in) :: microlist(Nint,2,*) + integer,intent(in) :: ptr_microlist(0:*) + integer,intent(in) :: N_microlist(0:*) + integer(bit_kind),intent(in) :: key_mask(Nint, 2) + + integer :: mobiles(2), smallerlist + + + N_tq = 0 + + i_loop : do i=1,N_selected + call getMobiles(det_buffer(1,1,i), key_mask, mobiles, Nint) + if(N_microlist(mobiles(1)) < N_microlist(mobiles(2))) then + smallerlist = mobiles(1) + else + smallerlist = mobiles(2) + end if + + if(N_microlist(smallerlist) > 0) then + do k=ptr_microlist(smallerlist), ptr_microlist(smallerlist)+N_microlist(smallerlist)-1 + if(is_generable(microlist(1,1,k), det_buffer(1,1,i), Nint)) cycle i_loop + end do + end if + + if(N_microlist(0) > 0) then + do k=1, N_microlist(0) + if(is_generable(microlist(1,1,k), det_buffer(1,1,i), Nint)) cycle i_loop + end do + end if + + ! Select determinants that are triple or quadruple excitations + ! from the ref + good = .True. + call get_excitation_degree_vector(psi_ref,det_buffer(1,1,i),degree,Nint,N_det_ref,idx) + !good=(idx(0) == 0) tant que degree > 2 pas retourné par get_excitation_degree_vector + do k=1,idx(0) + if (degree(k) < 3) then + good = .False. + exit + endif + enddo + if (good) then + if (.not. is_in_wavefunction(det_buffer(1,1,i),Nint)) then + N_tq += 1 + do k=1,N_int + tq(k,1,N_tq) = det_buffer(k,1,i) + tq(k,2,N_tq) = det_buffer(k,2,i) + enddo + endif + endif + enddo i_loop +end + + + + diff --git a/plugins/mrcepa0/mrsc2sub.irp.f b/plugins/mrcepa0/mrcc.irp.f similarity index 88% rename from plugins/mrcepa0/mrsc2sub.irp.f rename to plugins/mrcepa0/mrcc.irp.f index 07a07c83..91592e62 100644 --- a/plugins/mrcepa0/mrsc2sub.irp.f +++ b/plugins/mrcepa0/mrcc.irp.f @@ -3,7 +3,7 @@ program mrsc2sub double precision, allocatable :: energy(:) allocate (energy(N_states)) - !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrsc2 sub + !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrcc mrmode = 3 read_wf = .True. diff --git a/plugins/mrcepa0/mrcepa0.irp.f b/plugins/mrcepa0/mrcepa0.irp.f index 9473361b..34d3dec5 100644 --- a/plugins/mrcepa0/mrcepa0.irp.f +++ b/plugins/mrcepa0/mrcepa0.irp.f @@ -3,7 +3,7 @@ program mrcepa0 double precision, allocatable :: energy(:) allocate (energy(N_states)) - !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrsc2 sub + !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrcc mrmode = 1 read_wf = .True. diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index df10de34..82b1fc9b 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -15,6 +15,7 @@ subroutine run(N_st,energy) integer :: n_it_mrcc_max double precision :: thresh_mrcc + thresh_mrcc = 1d-7 n_it_mrcc_max = 10 diff --git a/plugins/mrcepa0/mrsc2.irp.f b/plugins/mrcepa0/mrsc2.irp.f index d4e1b1d4..d0f44a33 100644 --- a/plugins/mrcepa0/mrsc2.irp.f +++ b/plugins/mrcepa0/mrsc2.irp.f @@ -3,9 +3,8 @@ program mrsc2 double precision, allocatable :: energy(:) allocate (energy(N_states)) - !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrsc2 sub + !mrmode : 1=mrcepa0, 2=mrsc2 add, 3=mrcc mrmode = 2 - read_wf = .True. SOFT_TOUCH read_wf call print_cas_coefs diff --git a/src/Determinants/H_apply.template.f b/src/Determinants/H_apply.template.f index 4e419af5..c46a5bb0 100644 --- a/src/Determinants/H_apply.template.f +++ b/src/Determinants/H_apply.template.f @@ -11,7 +11,7 @@ subroutine $subroutine_diexc(key_in, key_prev, hole_1,particl_1, hole_2, particl integer(bit_kind), intent(in) :: key_prev(N_int, 2, *) PROVIDE N_int PROVIDE N_det - + $declarations @@ -184,7 +184,7 @@ subroutine $subroutine_diexcOrg(key_in,key_mask,hole_1,particl_1,hole_2, particl $initialization - + $omp_parallel !$ iproc = omp_get_thread_num() allocate (keys_out(N_int,2,size_max), hole_save(N_int,2), & diff --git a/src/Determinants/connected_to_ref.irp.f b/src/Determinants/connected_to_ref.irp.f index 7a54bdbc..2f53c799 100644 --- a/src/Determinants/connected_to_ref.irp.f +++ b/src/Determinants/connected_to_ref.irp.f @@ -165,7 +165,7 @@ logical function is_connected_to(key,keys,Nint,Ndet) integer :: i, l integer :: degree_x2 - + logical, external :: is_generable_cassd ASSERT (Nint > 0) ASSERT (Nint == N_int) @@ -183,12 +183,35 @@ logical function is_connected_to(key,keys,Nint,Ndet) if (degree_x2 > 4) then cycle else +! if(.not. is_generable_cassd(keys(1,1,i), key(1,1), Nint)) cycle !!!Nint==1 !!!!! is_connected_to = .true. return endif enddo end + +logical function is_generable_cassd(det1, det2, Nint) !!! TEST Cl HARD !!!!! + use bitmasks + implicit none + integer, intent(in) :: Nint + integer(bit_kind) :: det1(Nint, 2), det2(Nint, 2) + integer :: degree, f, exc(0:2, 2, 2), h1, h2, p1, p2, s1, s2, t + double precision :: phase + + is_generable_cassd = .false. + call get_excitation(det1, det2, exc, degree, phase, Nint) + if(degree == -1) return + if(degree == 0) then + is_generable_cassd = .true. + return + end if + call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) + if(degree == 1 .and. h1 <= 11) is_generable_cassd = .true. + if(degree == 2 .and. h1 <= 11 .and. h2 <= 11) is_generable_cassd = .true. +end function + + logical function is_connected_to_by_mono(key,keys,Nint,Ndet) use bitmasks implicit none diff --git a/src/Determinants/determinants.irp.f b/src/Determinants/determinants.irp.f index 4476ed45..400345c1 100644 --- a/src/Determinants/determinants.irp.f +++ b/src/Determinants/determinants.irp.f @@ -664,3 +664,44 @@ subroutine save_wavefunction_specified(ndet,nstates,psidet,psicoef,ndetsave,inde end +logical function detEq(a,b,Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer(bit_kind), intent(in) :: a(Nint,2), b(Nint,2) + integer :: ni, i + + detEq = .false. + do i=1,2 + do ni=1,Nint + if(a(ni,i) /= b(ni,i)) return + end do + end do + detEq = .true. +end function + + +integer function detCmp(a,b,Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer(bit_kind), intent(in) :: a(Nint,2), b(Nint,2) + integer :: ni, i + + detCmp = 0 + do i=1,2 + do ni=Nint,1,-1 + + if(a(ni,i) < b(ni,i)) then + detCmp = -1 + return + else if(a(ni,i) > b(ni,i)) then + detCmp = 1 + return + end if + + end do + end do +end function + + diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index 0b456751..2b5ae4f1 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -914,7 +914,6 @@ subroutine create_minilist_find_previous(key_mask, fullList, miniList, N_fullLis fullMatch = .false. N_miniList = 0 N_subList = 0 - l = popcnt(key_mask(1,1)) + popcnt(key_mask(1,2)) do ni = 2,Nint l = l + popcnt(key_mask(ni,1)) + popcnt(key_mask(ni,2)) @@ -947,8 +946,13 @@ subroutine create_minilist_find_previous(key_mask, fullList, miniList, N_fullLis miniList(ni,2,N_minilist) = fullList(ni,2,i) enddo else if(k == 0) then - fullMatch = .true. - return + N_minilist += 1 + do ni=1,Nint + miniList(ni,1,N_minilist) = fullList(ni,1,i) + miniList(ni,2,N_minilist) = fullList(ni,2,i) + enddo +! fullMatch = .true. +! return end if end do end if diff --git a/src/Determinants/spindeterminants.irp.f b/src/Determinants/spindeterminants.irp.f index 8d5726f5..2eec0dea 100644 --- a/src/Determinants/spindeterminants.irp.f +++ b/src/Determinants/spindeterminants.irp.f @@ -10,7 +10,7 @@ integer*8 function spin_det_search_key(det,Nint) use bitmasks implicit none BEGIN_DOC -! Return an integer*8 corresponding to a determinant index for searching +! Return an integer(8) corresponding to a determinant index for searching END_DOC integer, intent(in) :: Nint integer(bit_kind), intent(in) :: det(Nint) @@ -64,9 +64,9 @@ BEGIN_TEMPLATE integer :: i,j,k integer, allocatable :: iorder(:) - integer*8, allocatable :: bit_tmp(:) - integer*8 :: last_key - integer*8, external :: spin_det_search_key + integer(8), allocatable :: bit_tmp(:) + integer(8) :: last_key + integer(8), external :: spin_det_search_key logical,allocatable :: duplicate(:) allocate ( iorder(N_det), bit_tmp(N_det), duplicate(N_det) ) @@ -149,8 +149,8 @@ integer function get_index_in_psi_det_alpha_unique(key,Nint) integer(bit_kind), intent(in) :: key(Nint) integer :: i, ibegin, iend, istep, l - integer*8 :: det_ref, det_search - integer*8, external :: spin_det_search_key + integer(8) :: det_ref, det_search + integer(8), external :: spin_det_search_key logical :: in_wavefunction in_wavefunction = .False. @@ -231,8 +231,8 @@ integer function get_index_in_psi_det_beta_unique(key,Nint) integer(bit_kind), intent(in) :: key(Nint) integer :: i, ibegin, iend, istep, l - integer*8 :: det_ref, det_search - integer*8, external :: spin_det_search_key + integer(8) :: det_ref, det_search + integer(8), external :: spin_det_search_key logical :: in_wavefunction in_wavefunction = .False. @@ -305,10 +305,10 @@ end subroutine write_spindeterminants use bitmasks implicit none - integer*8, allocatable :: tmpdet(:,:) + integer(8), allocatable :: tmpdet(:,:) integer :: N_int2 integer :: i,j,k - integer*8 :: det_8(100) + integer(8) :: det_8(100) integer(bit_kind) :: det_bk((100*8)/bit_kind) equivalence (det_8, det_bk) From f8ece7d40b3cd11f7df81a16460735d2a236ef8e Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 20 May 2016 11:27:39 +0200 Subject: [PATCH 025/216] added OMP - excitations as integer2 --- plugins/MRCC_Utils/mrcc_utils.irp.f | 54 +++++++++++------------ plugins/mrcepa0/dressing.irp.f | 35 ++++++++++++--- src/Determinants/slater_rules.irp.f | 66 +++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 32 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 8873a940..42058145 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -288,7 +288,8 @@ logical function is_generable(det1, det2, Nint) implicit none integer, intent(in) :: Nint integer(bit_kind) :: det1(Nint, 2), det2(Nint, 2) - integer :: degree, f, exc(0:2, 2, 2), h1, h2, p1, p2, s1, s2, t + integer :: degree, f, exc(0:2, 2, 2), t + integer*2 :: h1, h2, p1, p2, s1, s2 integer, external :: searchExc logical, external :: excEq double precision :: phase @@ -312,7 +313,7 @@ logical function is_generable(det1, det2, Nint) ! ! print *, f ! return - call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) + call decode_exc_int2(exc,degree,h1,p1,h2,p2,s1,s2) if(degree == 1) then h2 = h1 @@ -323,14 +324,14 @@ logical function is_generable(det1, det2, Nint) s1 = 0 end if - if(h1 + s1*mo_tot_num < h2 + s2*mo_tot_num) then + if(h1 + (s1-1)*mo_tot_num < h2 + (s2-1)*mo_tot_num) then f = searchExc(hh_exists(1,1), (/s1, h1, s2, h2/), hh_shortcut(0)) else f = searchExc(hh_exists(1,1), (/s2, h2, s1, h1/), hh_shortcut(0)) end if if(f == -1) return - if(p1 + s1*mo_tot_num < p2 + s2*mo_tot_num) then + if(p1 + (s1-1)*mo_tot_num < p2 + (s2-1)*mo_tot_num) then f = searchExc(pp_exists(1,hh_shortcut(f)), (/s1, p1, s2, p2/), hh_shortcut(f+1)-hh_shortcut(f)) else f = searchExc(pp_exists(1,hh_shortcut(f)), (/s2, p2, s1, p1/), hh_shortcut(f+1)-hh_shortcut(f)) @@ -376,7 +377,7 @@ integer function searchExc(excs, exc, n) use bitmasks integer, intent(in) :: n - integer,intent(in) :: excs(4,n), exc(4) + integer*2,intent(in) :: excs(4,n), exc(4) integer :: l, h, c integer, external :: excCmp logical, external :: excEq @@ -441,8 +442,8 @@ subroutine sort_exc(key, N_key) integer, intent(in) :: N_key - integer,intent(inout) :: key(4,N_key) - integer :: tmp(4) + integer*2,intent(inout) :: key(4,N_key) + integer*2 :: tmp(4) integer :: i,ni @@ -464,7 +465,7 @@ end subroutine logical function exc_inf(exc1, exc2) implicit none - integer,intent(in) :: exc1(4), exc2(4) + integer*2,intent(in) :: exc1(4), exc2(4) integer :: i exc_inf = .false. do i=1,4 @@ -486,9 +487,9 @@ subroutine tamise_exc(key, no, n, N_key) ! Uncodumented : TODO END_DOC integer,intent(in) :: no, n, N_key - integer,intent(inout) :: key(4, N_key) + integer*2,intent(inout) :: key(4, N_key) integer :: k,j - integer :: tmp(4) + integer*2 :: tmp(4) logical :: exc_inf integer :: ni @@ -518,7 +519,7 @@ end subroutine subroutine dec_exc(exc, h1, h2, p1, p2) implicit none integer :: exc(0:2,2,2), s1, s2, degree - integer, intent(out) :: h1, h2, p1, p2 + integer*2, intent(out) :: h1, h2, p1, p2 degree = exc(0,1,1) + exc(0,1,2) @@ -529,7 +530,7 @@ subroutine dec_exc(exc, h1, h2, p1, p2) if(degree == 0) return - call decode_exc(exc, degree, h1, p1, h2, p2, s1, s2) + call decode_exc_int2(exc, degree, h1, p1, h2, p2, s1, s2) h1 += mo_tot_num * (s1-1) p1 += mo_tot_num * (s1-1) @@ -556,12 +557,13 @@ subroutine dec_exc(exc, h1, h2, p1, p2) end subroutine - BEGIN_PROVIDER [ integer, hh_exists, (4, N_det_ref * N_det_non_ref) ] + BEGIN_PROVIDER [ integer*2, hh_exists, (4, N_det_ref * N_det_non_ref) ] &BEGIN_PROVIDER [ integer, hh_shortcut, (0:N_det_ref * N_det_non_ref + 1) ] -&BEGIN_PROVIDER [ integer, pp_exists, (4, N_det_ref * N_det_non_ref) ] +&BEGIN_PROVIDER [ integer*2, pp_exists, (4, N_det_ref * N_det_non_ref) ] implicit none - integer,allocatable :: num(:,:) - integer :: exc(0:2, 2, 2), degree, n, on, s, h1, h2, p1, p2, l, i + integer*2,allocatable :: num(:,:) + integer :: exc(0:2, 2, 2), degree, n, on, s, l, i + integer*2 :: h1, h2, p1, p2 double precision :: phase logical, external :: excEq @@ -587,19 +589,19 @@ end subroutine hh_shortcut(0) = 1 hh_shortcut(1) = 1 - hh_exists(:,1) = (/1, num(1,1), 1, num(2,1)/) - pp_exists(:,1) = (/1, num(3,1), 1, num(4,1)/) + hh_exists(:,1) = (/1_2, num(1,1), 1_2, num(2,1)/) + pp_exists(:,1) = (/1_2, num(3,1), 1_2, num(4,1)/) s = 1 do i=2,n if(.not. excEq(num(1,i), num(1,s))) then s += 1 num(:, s) = num(:, i) - pp_exists(:,s) = (/1, num(3,s), 1, num(4,s)/) + pp_exists(:,s) = (/1_2, num(3,s), 1_2, num(4,s)/) if(hh_exists(2, hh_shortcut(0)) /= num(1,s) .or. & hh_exists(4, hh_shortcut(0)) /= num(2,s)) then hh_shortcut(0) += 1 hh_shortcut(hh_shortcut(0)) = s - hh_exists(:,hh_shortcut(0)) = (/1, num(1,s), 1, num(2,s)/) + hh_exists(:,hh_shortcut(0)) = (/1_2, num(1,s), 1_2, num(2,s)/) end if end if end do @@ -629,7 +631,7 @@ END_PROVIDER logical function excEq(exc1, exc2) implicit none - integer, intent(in) :: exc1(4), exc2(4) + integer*2, intent(in) :: exc1(4), exc2(4) integer :: i excEq = .false. do i=1, 4 @@ -641,7 +643,7 @@ end function integer function excCmp(exc1, exc2) implicit none - integer, intent(in) :: exc1(4), exc2(4) + integer*2, intent(in) :: exc1(4), exc2(4) integer :: i excCmp = 0 do i=1, 4 @@ -660,8 +662,8 @@ subroutine apply_hole(det, exc, res, ok, Nint) use bitmasks implicit none integer, intent(in) :: Nint - integer, intent(in) :: exc(4) - integer :: s1, s2, h1, h2 + integer*2, intent(in) :: exc(4) + integer*2 :: s1, s2, h1, h2 integer(bit_kind),intent(in) :: det(Nint, 2) integer(bit_kind),intent(out) :: res(Nint, 2) logical, intent(out) :: ok @@ -695,8 +697,8 @@ subroutine apply_particle(det, exc, res, ok, Nint) use bitmasks implicit none integer, intent(in) :: Nint - integer, intent(in) :: exc(4) - integer :: s1, s2, p1, p2 + integer*2, intent(in) :: exc(4) + integer*2 :: s1, s2, p1, p2 integer(bit_kind),intent(in) :: det(Nint, 2) integer(bit_kind),intent(out) :: res(Nint, 2) logical, intent(out) :: ok diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 5d8d4850..4f99f6e1 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -6,16 +6,28 @@ use bitmasks &BEGIN_PROVIDER [ double precision, delta_ii_mrcc, (N_states, N_det_ref) ] use bitmasks implicit none - integer :: gen, h, p, i_state, n, t, i, h1, h2, p1, p2, s1, s2 - integer(bit_kind) :: mask(N_int, 2), omask(N_int, 2), buf(N_int, 2, N_det_non_ref) + integer :: gen, h, p, i_state, n, t, i, h1, h2, p1, p2, s1, s2, iproc + integer(bit_kind) :: mask(N_int, 2), omask(N_int, 2) + integer(bit_kind), allocatable :: buf(:,:,:) + double precision, allocatable :: delta_ij_mwen(:,:,:,:), delta_ii_mwen(:,:,:) logical :: ok logical, external :: detEq delta_ij_mrcc = 0d0 delta_ii_mrcc = 0d0 i_state = 1 + provide hh_shortcut psi_det_size + allocate(delta_ij_mwen(N_states,N_det_non_ref,N_det_ref,nproc), delta_ii_mwen(N_states,N_det_ref,nproc)) + allocate(buf(N_int, 2, N_det_non_ref)) + delta_ij_mwen = 0d0 + delta_ii_mwen = 0d0 + !$OMP PARALLEL DO default(none) schedule(dynamic) & + !$OMP shared(psi_det_generators, N_det_generators, hh_exists, pp_exists, N_int, hh_shortcut) & + !$OMP shared(N_states, N_det_non_ref, N_det_ref, delta_ii_mwen, delta_ij_mwen) & + !$OMP private(h, n, mask, omask, buf, ok, iproc) do gen= 1, N_det_generators + iproc = omp_get_thread_num() + 1 print *, gen, "/", N_det_generators do h=1, hh_shortcut(0) call apply_hole(psi_det_generators(1,1,gen), hh_exists(1, h), mask, ok, N_int) @@ -28,12 +40,23 @@ use bitmasks if(ok) n = n + 1 end do n = n - 1 - if(n /= 0) call mrcc_part_dress(delta_ij_mrcc, delta_ii_mrcc,gen,n,buf,N_int,omask) + if(n /= 0) call mrcc_part_dress(delta_ij_mwen(1,1,1,iproc), delta_ii_mwen(1,1,iproc),gen,n,buf,N_int,omask) end do end do + !$OMP END PARALLEL DO + do iproc=1, nproc + delta_ij_mrcc = delta_ij_mrcc + delta_ij_mwen(:,:,:,iproc) + delta_ii_mrcc = delta_ii_mrcc + delta_ii_mwen(:,:,iproc) + end do END_PROVIDER +! subroutine blit(b1, b2) +! double precision :: b1(N_states,N_det_non_ref,N_det_ref), b2(N_states,N_det_non_ref,N_det_ref) +! b1 = b1 + b2 +! end subroutine + + subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffer,Nint,key_mask) use bitmasks implicit none @@ -463,7 +486,7 @@ END_PROVIDER double precision :: Hjk, Hki, Hij, pre(N_det_ref), wall integer :: i_state, degree, npre, ipre(N_det_ref), npres(N_det_ref) - provide lambda_mrcc +! provide lambda_mrcc npres = 0 delta_cas = 0d0 call wall_time(wall) @@ -605,8 +628,8 @@ end function call wall_time(wall) print *, "cepa0", wall - provide det_cepa0_active delta_cas lambda_mrcc - provide mo_bielec_integrals_in_map +! provide det_cepa0_active delta_cas lambda_mrcc +! provide mo_bielec_integrals_in_map allocate(idx_sorted_bit(N_det)) sortRef(:,:,:) = det_ref_active(:,:,:) diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index 2b5ae4f1..3374dfb2 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -139,6 +139,72 @@ subroutine decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) end +subroutine decode_exc_int2(exc,degree,h1,p1,h2,p2,s1,s2) + use bitmasks + implicit none + BEGIN_DOC + ! 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 + END_DOC + integer, intent(in) :: exc(0:2,2,2),degree + integer*2, intent(out) :: h1,h2,p1,p2,s1,s2 + ASSERT (degree > 0) + ASSERT (degree < 3) + + select case(degree) + case(2) + if (exc(0,1,1) == 2) then + h1 = exc(1,1,1) + h2 = exc(2,1,1) + p1 = exc(1,2,1) + p2 = exc(2,2,1) + s1 = 1 + s2 = 1 + else if (exc(0,1,2) == 2) then + h1 = exc(1,1,2) + h2 = exc(2,1,2) + p1 = exc(1,2,2) + p2 = exc(2,2,2) + s1 = 2 + s2 = 2 + else + h1 = exc(1,1,1) + h2 = exc(1,1,2) + p1 = exc(1,2,1) + p2 = exc(1,2,2) + s1 = 1 + s2 = 2 + endif + case(1) + if (exc(0,1,1) == 1) then + h1 = exc(1,1,1) + h2 = 0 + p1 = exc(1,2,1) + p2 = 0 + s1 = 1 + s2 = 0 + else + h1 = exc(1,1,2) + h2 = 0 + p1 = exc(1,2,2) + p2 = 0 + s1 = 2 + s2 = 0 + endif + case(0) + h1 = 0 + p1 = 0 + h2 = 0 + p2 = 0 + s1 = 0 + s2 = 0 + end select +end + + subroutine get_double_excitation(det1,det2,exc,phase,Nint) use bitmasks implicit none From c7c3e9d64be679cdba9effeb8102e638a11276d4 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 20 May 2016 12:28:20 +0200 Subject: [PATCH 026/216] corrected OMP --- plugins/mrcepa0/dressing.irp.f | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 4f99f6e1..639b62e4 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -8,23 +8,18 @@ use bitmasks implicit none integer :: gen, h, p, i_state, n, t, i, h1, h2, p1, p2, s1, s2, iproc integer(bit_kind) :: mask(N_int, 2), omask(N_int, 2) - integer(bit_kind), allocatable :: buf(:,:,:) - double precision, allocatable :: delta_ij_mwen(:,:,:,:), delta_ii_mwen(:,:,:) + integer(bit_kind) :: buf(N_int, 2, N_det_non_ref) logical :: ok logical, external :: detEq delta_ij_mrcc = 0d0 delta_ii_mrcc = 0d0 i_state = 1 - provide hh_shortcut psi_det_size - allocate(delta_ij_mwen(N_states,N_det_non_ref,N_det_ref,nproc), delta_ii_mwen(N_states,N_det_ref,nproc)) - allocate(buf(N_int, 2, N_det_non_ref)) - delta_ij_mwen = 0d0 - delta_ii_mwen = 0d0 + provide hh_shortcut psi_det_size lambda_mrcc !$OMP PARALLEL DO default(none) schedule(dynamic) & !$OMP shared(psi_det_generators, N_det_generators, hh_exists, pp_exists, N_int, hh_shortcut) & - !$OMP shared(N_states, N_det_non_ref, N_det_ref, delta_ii_mwen, delta_ij_mwen) & + !$OMP shared(N_states, N_det_non_ref, N_det_ref, delta_ii_mrcc, delta_ij_mrcc) & !$OMP private(h, n, mask, omask, buf, ok, iproc) do gen= 1, N_det_generators iproc = omp_get_thread_num() + 1 @@ -40,14 +35,10 @@ use bitmasks if(ok) n = n + 1 end do n = n - 1 - if(n /= 0) call mrcc_part_dress(delta_ij_mwen(1,1,1,iproc), delta_ii_mwen(1,1,iproc),gen,n,buf,N_int,omask) + if(n /= 0) call mrcc_part_dress(delta_ij_mrcc, delta_ii_mrcc,gen,n,buf,N_int,omask) end do end do !$OMP END PARALLEL DO - do iproc=1, nproc - delta_ij_mrcc = delta_ij_mrcc + delta_ij_mwen(:,:,:,iproc) - delta_ii_mrcc = delta_ii_mrcc + delta_ii_mwen(:,:,iproc) - end do END_PROVIDER From 39618c4300f8aaf64fac22317f99e632051422c0 Mon Sep 17 00:00:00 2001 From: Yann GARNIRON Date: Thu, 26 May 2016 13:52:48 +0200 Subject: [PATCH 027/216] corrected mrsc2 for large systems --- config/ifort.cfg | 6 ++-- plugins/MRCC_Utils/mrcc_utils.irp.f | 51 +++++++++++++++++++++++----- plugins/mrcepa0/dressing.irp.f | 49 +++++++++++++------------- plugins/mrcepa0/dressing_slave.irp.f | 30 ++++++++-------- src/Determinants/davidson.irp.f | 4 +-- 5 files changed, 90 insertions(+), 50 deletions(-) diff --git a/config/ifort.cfg b/config/ifort.cfg index 2b2fe0a2..acbfde1f 100644 --- a/config/ifort.cfg +++ b/config/ifort.cfg @@ -31,14 +31,14 @@ OPENMP : 1 ; Append OpenMP flags # -ftz : Flushes denormal results to zero # [OPT] -FCFLAGS : -xSSE4.2 -O2 -ip -ftz -g +FCFLAGS : -C -xAVX -O2 -ip -ftz -g -traceback # Profiling flags ################# # [PROFILE] FC : -p -g -FCFLAGS : -xSSE4.2 -O2 -ip -ftz +FCFLAGS : -xAVX -O2 -ip -ftz # Debugging flags ################# @@ -51,7 +51,7 @@ FCFLAGS : -xSSE4.2 -O2 -ip -ftz # [DEBUG] FC : -g -traceback -FCFLAGS : -xSSE2 -C -fpe0 +FCFLAGS : -xAVX -C -fpe0 IRPF90_FLAGS : --openmp # OpenMP flags diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 42058145..cfd6481e 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -102,7 +102,7 @@ END_PROVIDER if (ihpsi_current(k) == 0.d0) then ihpsi_current(k) = 1.d-32 endif - lambda_mrcc(k,i) = min(0.d0,psi_non_ref_coef(i,k)/ihpsi_current(k) ) + lambda_mrcc(k,i) = min(1.d-32,psi_non_ref_coef(i,k)/ihpsi_current(k) ) lambda_pert = 1.d0 / (psi_ref_energy_diagonalized(k)-hii) if (lambda_pert / lambda_mrcc(k,i) < 0.5d0) then i_pert_count += 1 @@ -356,7 +356,7 @@ integer function searchDet(dets, det, n, Nint) h = n do while(.true.) searchDet = (l+h)/2 - c = detCmp(dets(1,1,searchDet), det(:,:), Nint) + c = detCmp(dets(1,1,searchDet), det(1,1), Nint) if(c == 0) return if(c == 1) then h = searchDet-1 @@ -386,7 +386,7 @@ integer function searchExc(excs, exc, n) h = n do searchExc = (l+h)/2 - c = excCmp(excs(1,searchExc), exc(:)) + c = excCmp(excs(1,searchExc), exc(1)) if(c == 0) return if(c == 1) then h = searchExc-1 @@ -407,7 +407,7 @@ subroutine sort_det(key, idx, N_key, Nint) integer, intent(in) :: Nint, N_key integer(8),intent(inout) :: key(Nint,2,N_key) - integer,intent(out) :: idx(N_key) + integer,intent(inout) :: idx(N_key) integer(8) :: tmp(Nint, 2) integer :: tmpidx,i,ni @@ -557,9 +557,44 @@ subroutine dec_exc(exc, h1, h2, p1, p2) end subroutine - BEGIN_PROVIDER [ integer*2, hh_exists, (4, N_det_ref * N_det_non_ref) ] -&BEGIN_PROVIDER [ integer, hh_shortcut, (0:N_det_ref * N_det_non_ref + 1) ] -&BEGIN_PROVIDER [ integer*2, pp_exists, (4, N_det_ref * N_det_non_ref) ] + BEGIN_PROVIDER [ integer, N_hh_exists ] +&BEGIN_PROVIDER [ integer, N_pp_exists ] +&BEGIN_PROVIDER [ integer, N_ex_exists ] + implicit none + integer :: exc(0:2, 2, 2), degree, n, on, s, l, i + integer*2 :: h1, h2, p1, p2 + double precision :: phase + logical,allocatable :: hh(:,:) , pp(:,:) + + allocate(hh(0:mo_tot_num*2, 0:mo_tot_num*2)) + allocate(pp(0:mo_tot_num*2, 0:mo_tot_num*2)) + hh = .false. + pp = .false. + N_hh_exists = 0 + N_pp_exists = 0 + N_ex_exists = 0 + + n = 0 + do i=1, N_det_ref + do l=1, N_det_non_ref + call get_excitation(psi_ref(1,1,i), psi_non_ref(1,1,l), exc, degree, phase, N_int) + if(degree == -1) cycle + call dec_exc(exc, h1, h2, p1, p2) + N_ex_exists += 1 + if(.not. hh(h1,h2)) N_hh_exists = N_hh_exists + 1 + if(.not. pp(p1,p2)) N_pp_exists = N_pp_exists + 1 + hh(h1,h2) = .true. + pp(p1,p2) = .true. + end do + end do + N_pp_exists = min(N_ex_exists, N_pp_exists * N_hh_exists) +END_PROVIDER + + + + BEGIN_PROVIDER [ integer*2, hh_exists, (4, N_hh_exists) ] +&BEGIN_PROVIDER [ integer, hh_shortcut, (0:N_hh_exists + 1) ] +&BEGIN_PROVIDER [ integer*2, pp_exists, (4, N_pp_exists) ] implicit none integer*2,allocatable :: num(:,:) integer :: exc(0:2, 2, 2), degree, n, on, s, l, i @@ -567,7 +602,7 @@ end subroutine double precision :: phase logical, external :: excEq - allocate(num(4, N_det_ref * N_det_non_ref)) + allocate(num(4, N_ex_exists+1)) hh_shortcut = 0 hh_exists = 0 diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 639b62e4..d2e88d96 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -8,7 +8,7 @@ use bitmasks implicit none integer :: gen, h, p, i_state, n, t, i, h1, h2, p1, p2, s1, s2, iproc integer(bit_kind) :: mask(N_int, 2), omask(N_int, 2) - integer(bit_kind) :: buf(N_int, 2, N_det_non_ref) + integer(bit_kind),allocatable :: buf(:,:,:) logical :: ok logical, external :: detEq @@ -16,27 +16,29 @@ use bitmasks delta_ii_mrcc = 0d0 i_state = 1 provide hh_shortcut psi_det_size lambda_mrcc - !$OMP PARALLEL DO default(none) schedule(dynamic) & !$OMP shared(psi_det_generators, N_det_generators, hh_exists, pp_exists, N_int, hh_shortcut) & !$OMP shared(N_states, N_det_non_ref, N_det_ref, delta_ii_mrcc, delta_ij_mrcc) & !$OMP private(h, n, mask, omask, buf, ok, iproc) do gen= 1, N_det_generators + allocate(buf(N_int, 2, N_det_non_ref)) iproc = omp_get_thread_num() + 1 print *, gen, "/", N_det_generators do h=1, hh_shortcut(0) call apply_hole(psi_det_generators(1,1,gen), hh_exists(1, h), mask, ok, N_int) if(.not. ok) cycle omask = 0_bit_kind - if(hh_exists(1, h) /= 0) omask = mask + !if(hh_exists(1, h) /= 0) omask = mask n = 1 do p=hh_shortcut(h), hh_shortcut(h+1)-1 call apply_particle(mask, pp_exists(1, p), buf(1,1,n), ok, N_int) if(ok) n = n + 1 + if(n > N_det_non_ref) stop "MRCC..." end do n = n - 1 if(n /= 0) call mrcc_part_dress(delta_ij_mrcc, delta_ii_mrcc,gen,n,buf,N_int,omask) end do + deallocate(buf) end do !$OMP END PARALLEL DO END_PROVIDER @@ -58,11 +60,10 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe integer(bit_kind), intent(in) :: det_buffer(Nint,2,n_selected) integer :: i,j,k,l,m - integer :: degree_alpha(psi_det_size) - integer :: idx_alpha(0:psi_det_size) + integer,allocatable :: idx_alpha(:), degree_alpha(:) logical :: good, fullMatch - integer(bit_kind) :: tq(Nint,2,n_selected) + integer(bit_kind),allocatable :: tq(:,:,:) integer :: N_tq, c_ref ,degree double precision :: hIk, hla, hIl, dIk(N_states), dka(N_states), dIa(N_states) @@ -76,7 +77,7 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe integer :: i_state, k_sd, l_sd, i_I, i_alpha integer(bit_kind),allocatable :: miniList(:,:,:) - integer(bit_kind) :: key_mask(Nint, 2) + integer(bit_kind),intent(in) :: key_mask(Nint, 2) integer,allocatable :: idx_miniList(:) integer :: N_miniList, ni, leng double precision, allocatable :: hij_cache(:) @@ -88,8 +89,8 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe leng = max(N_det_generators, N_det_non_ref) - allocate(miniList(Nint, 2, leng), idx_minilist(leng), hij_cache(N_det_non_ref)) - + allocate(miniList(Nint, 2, leng), tq(Nint,2,n_selected), idx_minilist(leng), hij_cache(N_det_non_ref)) + allocate(idx_alpha(0:psi_det_size), degree_alpha(psi_det_size)) !create_minilist_find_previous(key_mask, fullList, miniList, N_fullList, N_miniList, fullMatch, Nint) call create_minilist_find_previous(key_mask, psi_det_generators, miniList, i_generator-1, N_miniList, fullMatch, Nint) @@ -373,10 +374,15 @@ END_PROVIDER use bitmasks implicit none - integer(bit_kind) :: det_noactive(N_int, 2, N_det_non_ref), nonactive_sorb(N_int,2), det(N_int, 2) - integer i, II, j, k, n, ni, idx(N_det_non_ref), shortcut(0:N_det_non_ref+1), blok, degree + integer(bit_kind),allocatable :: det_noactive(:,:,:) + integer, allocatable :: shortcut(:), idx(:) + integer(bit_kind) :: nonactive_sorb(N_int,2), det(N_int, 2) + integer i, II, j, k, n, ni, blok, degree logical, external :: detEq + allocate(det_noactive(N_int, 2, N_det_non_ref)) + allocate(idx(N_det_non_ref), shortcut(0:N_det_non_ref+1)) + print *, "pre start" active_sorb(:,:) = 0_8 nonactive_sorb(:,:) = not(0_8) @@ -507,12 +513,10 @@ END_PROVIDER end do end do !!$OMP END PARALLEL DO - print *, npres npre=0 do i=1,N_det_ref npre += npres(i) end do - print *, npre !stop do i=1,N_det_ref do j=1,i @@ -609,7 +613,8 @@ end function double precision :: phase_iI, phase_Ik, phase_Jl, phase_IJ, phase_al, diI, hIi, hJi, delta_JI, dkI(1), HkI, ci_inv(1), dia_hla(1) double precision :: contrib, HIIi, HJk, wall integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ - integer(bit_kind) :: det_tmp(N_int, 2), made_hole(N_int,2), made_particle(N_int,2), myActive(N_int,2), sortRef(N_int,2,N_det_ref) + integer(bit_kind) :: det_tmp(N_int, 2), made_hole(N_int,2), made_particle(N_int,2), myActive(N_int,2) + integer(bit_kind),allocatable :: sortRef(:,:,:) integer, allocatable :: idx_sorted_bit(:) integer, external :: get_index_in_psi_det_sorted_bit, searchDet logical, external :: is_in_wavefunction, detEq @@ -618,10 +623,7 @@ end function integer*8, save :: notf = 0 call wall_time(wall) - print *, "cepa0", wall -! provide det_cepa0_active delta_cas lambda_mrcc -! provide mo_bielec_integrals_in_map - allocate(idx_sorted_bit(N_det)) + allocate(idx_sorted_bit(N_det), sortRef(N_int,2,N_det_ref)) sortRef(:,:,:) = det_ref_active(:,:,:) call sort_det(sortRef, sortRefIdx, N_det_ref, N_int) @@ -842,10 +844,10 @@ subroutine filter_tq(i_generator,n_selected,det_buffer,Nint,tq,N_tq,miniList,N_m integer :: i,j,k,m logical :: is_in_wavefunction integer :: degree(psi_det_size) - integer :: idx(0:psi_det_size) + integer,allocatable :: idx(:) logical :: good - integer(bit_kind), intent(out) :: tq(Nint,2,n_selected) + integer(bit_kind), intent(inout) :: tq(Nint,2,n_selected) !! intent(out) integer, intent(out) :: N_tq integer :: nt,ni @@ -854,7 +856,7 @@ subroutine filter_tq(i_generator,n_selected,det_buffer,Nint,tq,N_tq,miniList,N_m integer(bit_kind),intent(in) :: miniList(Nint,2,N_det_generators) integer,intent(in) :: N_miniList - + allocate(idx(0:psi_det_size)) N_tq = 0 i_loop : do i=1,N_selected @@ -897,10 +899,10 @@ subroutine filter_tq_micro(i_generator,n_selected,det_buffer,Nint,tq,N_tq,microl integer :: i,j,k,m logical :: is_in_wavefunction integer :: degree(psi_det_size) - integer :: idx(0:psi_det_size) + integer,allocatable :: idx(:) logical :: good - integer(bit_kind), intent(out) :: tq(Nint,2,n_selected) + integer(bit_kind), intent(inout) :: tq(Nint,2,n_selected) !! intent(out) integer, intent(out) :: N_tq integer :: nt,ni @@ -914,6 +916,7 @@ subroutine filter_tq_micro(i_generator,n_selected,det_buffer,Nint,tq,N_tq,microl integer :: mobiles(2), smallerlist + allocate(idx(0:psi_det_size)) N_tq = 0 i_loop : do i=1,N_selected diff --git a/plugins/mrcepa0/dressing_slave.irp.f b/plugins/mrcepa0/dressing_slave.irp.f index 3491ba7f..08099341 100644 --- a/plugins/mrcepa0/dressing_slave.irp.f +++ b/plugins/mrcepa0/dressing_slave.irp.f @@ -42,17 +42,18 @@ subroutine mrsc2_dressing_slave(thread,iproc) integer :: i_state, i, i_I, J, k, k2, k1, kk, ll, degree, degree2, m, l, deg, ni, m2 - integer :: idx(N_det_non_ref, 2), n(2) + integer :: n(2) integer :: p1,p2,h1,h2,s1,s2, blok, I_s, J_s, kn logical :: ok double precision :: phase_iI, phase_Ik, phase_Jl, phase_Ji, phase_al double precision :: diI, hIi, hJi, delta_JI, dkI, HkI, ci_inv(N_states), cj_inv(N_states) - double precision :: contrib, wall, iwall, dleat(N_states,N_det_non_ref,2) + double precision :: contrib, wall, iwall + double precision, allocatable :: dleat(:,:,:) integer, dimension(0:2,2,2) :: exc_iI, exc_Ik, exc_IJ integer(bit_kind) :: det_tmp(N_int, 2), det_tmp2(N_int, 2), inac, virt integer, external :: get_index_in_psi_det_sorted_bit, searchDet, detCmp logical, external :: is_in_wavefunction, isInCassd, detEq - integer :: komon(0:N_det_non_ref) + integer,allocatable :: komon(:) logical :: komoned @@ -61,8 +62,8 @@ subroutine mrsc2_dressing_slave(thread,iproc) call connect_to_taskserver(zmq_to_qp_run_socket,worker_id,thread) - allocate (delta(N_states,0:N_det_non_ref, 2)) - + allocate (dleat(N_states, N_det_non_ref, 2), delta(N_states,0:N_det_non_ref, 2)) + allocate(komon(0:N_det_non_ref)) do call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id, task) @@ -219,12 +220,14 @@ subroutine push_mrsc2_results(zmq_socket_push, I_i, J, delta, task_id) integer, intent(in) :: i_I, J integer(ZMQ_PTR), intent(in) :: zmq_socket_push - double precision :: delta(N_states, 0:N_det_non_ref, 2) + double precision,intent(inout) :: delta(N_states, 0:N_det_non_ref, 2) integer, intent(in) :: task_id integer :: rc , i_state, i, kk, li - integer :: idx(N_det_non_ref,2), n(2) + integer,allocatable :: idx(:,:) + integer ::n(2) logical :: ok + allocate(idx(N_det_non_ref,2)) rc = f77_zmq_send( zmq_socket_push, i_I, 4, ZMQ_SNDMORE) if (rc /= 4) then print *, irp_here, 'f77_zmq_send( zmq_socket_push, i_I, 4, ZMQ_SNDMORE)' @@ -317,9 +320,9 @@ subroutine pull_mrsc2_results(zmq_socket_pull, I_i, J, n, idx, delta, task_id) double precision, intent(inout) :: delta(N_states, 0:N_det_non_ref, 2) integer, intent(out) :: task_id integer :: rc , i, kk - integer,intent(out) :: idx(N_det_non_ref, 2) + integer,intent(inout) :: idx(N_det_non_ref,2) logical :: ok - + rc = f77_zmq_recv( zmq_socket_pull, i_I, 4, ZMQ_SNDMORE) if (rc /= 4) then print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, i_I, 4, ZMQ_SNDMORE)' @@ -397,7 +400,7 @@ subroutine mrsc2_dressing_collector(delta_ii_,delta_ij_) integer :: task_id, more integer :: I_i, J, l, i_state, n(2), kk - integer :: idx(N_det_non_ref,2) + integer,allocatable :: idx(:,:) delta_ii_(:,:) = 0d0 delta_ij_(:,:,:) = 0d0 @@ -406,10 +409,11 @@ subroutine mrsc2_dressing_collector(delta_ii_,delta_ij_) zmq_socket_pull = new_zmq_pull_socket() allocate ( delta(N_states,0:N_det_non_ref,2) ) - + + allocate(idx(N_det_non_ref,2)) more = 1 do while (more == 1) - + call pull_mrsc2_results(zmq_socket_pull, I_i, J, n, idx, delta, task_id) @@ -453,8 +457,6 @@ subroutine mrsc2_dressing_collector(delta_ii_,delta_ij_) enddo - print *, "-------------" , delta_ii_(1,:) - print *, "dfdf", delta_ij_(1,10,:) deallocate( delta ) call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) diff --git a/src/Determinants/davidson.irp.f b/src/Determinants/davidson.irp.f index c78a3826..3d074563 100644 --- a/src/Determinants/davidson.irp.f +++ b/src/Determinants/davidson.irp.f @@ -241,8 +241,8 @@ subroutine sort_dets_ab(key, idx, shortcut, N_key, Nint) END_DOC integer, intent(in) :: Nint, N_key integer(bit_kind),intent(inout) :: key(Nint,2,N_key) - integer,intent(out) :: idx(N_key) - integer,intent(out) :: shortcut(0:N_key+1) + integer,intent(inout) :: idx(N_key) + integer,intent(inout) :: shortcut(0:N_key+1) integer(bit_kind) :: tmp(Nint, 2) integer :: tmpidx,i,ni From 42dc21372503b96ab0ecd0a2afba8b04cee8aebd Mon Sep 17 00:00:00 2001 From: Yann GARNIRON Date: Fri, 27 May 2016 14:48:27 +0200 Subject: [PATCH 028/216] corrected mrcc for lage systems --- config/ifort.cfg | 2 +- plugins/mrcepa0/dressing.irp.f | 6 ++++-- src/Utils/LinearAlgebra.irp.f | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/config/ifort.cfg b/config/ifort.cfg index acbfde1f..60b771ea 100644 --- a/config/ifort.cfg +++ b/config/ifort.cfg @@ -31,7 +31,7 @@ OPENMP : 1 ; Append OpenMP flags # -ftz : Flushes denormal results to zero # [OPT] -FCFLAGS : -C -xAVX -O2 -ip -ftz -g -traceback +FCFLAGS : -xAVX -O2 -ip -ftz -g # Profiling flags ################# diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index d2e88d96..f6a4015d 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -843,7 +843,7 @@ subroutine filter_tq(i_generator,n_selected,det_buffer,Nint,tq,N_tq,miniList,N_m integer(bit_kind), intent(in) :: det_buffer(Nint,2,n_selected) integer :: i,j,k,m logical :: is_in_wavefunction - integer :: degree(psi_det_size) + integer,allocatable :: degree(:) integer,allocatable :: idx(:) logical :: good @@ -856,6 +856,7 @@ subroutine filter_tq(i_generator,n_selected,det_buffer,Nint,tq,N_tq,miniList,N_m integer(bit_kind),intent(in) :: miniList(Nint,2,N_det_generators) integer,intent(in) :: N_miniList + allocate(degree(psi_det_size)) allocate(idx(0:psi_det_size)) N_tq = 0 @@ -898,7 +899,7 @@ subroutine filter_tq_micro(i_generator,n_selected,det_buffer,Nint,tq,N_tq,microl integer(bit_kind), intent(in) :: det_buffer(Nint,2,n_selected) integer :: i,j,k,m logical :: is_in_wavefunction - integer :: degree(psi_det_size) + integer,allocatable :: degree(:) integer,allocatable :: idx(:) logical :: good @@ -916,6 +917,7 @@ subroutine filter_tq_micro(i_generator,n_selected,det_buffer,Nint,tq,N_tq,microl integer :: mobiles(2), smallerlist + allocate(degree(psi_det_size)) allocate(idx(0:psi_det_size)) N_tq = 0 diff --git a/src/Utils/LinearAlgebra.irp.f b/src/Utils/LinearAlgebra.irp.f index 13138499..86a58729 100644 --- a/src/Utils/LinearAlgebra.irp.f +++ b/src/Utils/LinearAlgebra.irp.f @@ -144,13 +144,14 @@ subroutine ortho_lowdin(overlap,LDA,N,C,LDC,m) integer, intent(in) :: LDA, ldc, n, m double precision, intent(in) :: overlap(lda,n) double precision, intent(inout) :: C(ldc,n) - double precision :: U(ldc,n) + double precision,allocatable :: U(:,:) double precision :: Vt(lda,n) double precision :: D(n) double precision :: S_half(lda,n) !DEC$ ATTRIBUTES ALIGN : 64 :: U, Vt, D integer :: info, i, j, k + allocate(U(ldc,n)) call svd(overlap,lda,U,ldc,D,Vt,lda,m,n) !$OMP PARALLEL DEFAULT(NONE) & From acc8a8bb7e688ffcb5b2a05c74b0169bd1dad738 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 2 Jun 2016 12:47:35 +0200 Subject: [PATCH 029/216] dirty - corrected mrcepa/mrcc final PT2 --- config/gfortran.cfg | 2 +- plugins/MRCC_Utils/H_apply.irp.f | 6 ++ plugins/MRCC_Utils/mrcc_utils.irp.f | 13 +++- plugins/mrcepa0/mrcepa0_general.irp.f | 92 +++++++++++++++++++++++---- 4 files changed, 96 insertions(+), 17 deletions(-) diff --git a/config/gfortran.cfg b/config/gfortran.cfg index a1940bdb..c0aa875f 100644 --- a/config/gfortran.cfg +++ b/config/gfortran.cfg @@ -22,7 +22,7 @@ IRPF90_FLAGS : --ninja --align=32 # 0 : Deactivate # [OPTION] -MODE : DEBUG ; [ OPT | PROFILE | DEBUG ] : Chooses the section below +MODE : OPT ; [ OPT | PROFILE | DEBUG ] : Chooses the section below CACHE : 1 ; Enable cache_compile.py OPENMP : 1 ; Append OpenMP flags diff --git a/plugins/MRCC_Utils/H_apply.irp.f b/plugins/MRCC_Utils/H_apply.irp.f index df2b67a0..57d6d5c1 100644 --- a/plugins/MRCC_Utils/H_apply.irp.f +++ b/plugins/MRCC_Utils/H_apply.irp.f @@ -31,5 +31,11 @@ s.set_perturbation("epstein_nesbet_2x2") s.unset_openmp() print s +s = H_apply_zmq("mrcepa_PT2") +s.energy = "psi_ref_energy_diagonalized" +s.set_perturbation("epstein_nesbet_2x2") +s.unset_openmp() +print s + END_SHELL diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index cfd6481e..e0dcac62 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -73,6 +73,7 @@ END_PROVIDER BEGIN_PROVIDER [ double precision, lambda_mrcc, (N_states,psi_det_size) ] &BEGIN_PROVIDER [ integer, lambda_mrcc_pt2, (0:psi_det_size) ] +&BEGIN_PROVIDER [ integer, lambda_mrcc_pt3, (0:psi_det_size) ] implicit none BEGIN_DOC ! cm/ or perturbative 1/Delta_E(m) @@ -81,7 +82,7 @@ END_PROVIDER double precision :: ihpsi_current(N_states) integer :: i_pert_count double precision :: hii, lambda_pert - integer :: N_lambda_mrcc_pt2 + integer :: N_lambda_mrcc_pt2, N_lambda_mrcc_pt3 integer :: histo(200), j histo = 0 @@ -92,7 +93,9 @@ END_PROVIDER i_pert_count = 0 lambda_mrcc = 0.d0 N_lambda_mrcc_pt2 = 0 + N_lambda_mrcc_pt3 = 0 lambda_mrcc_pt2(0) = 0 + lambda_mrcc_pt3(0) = 0 do i=1,N_det_non_ref call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef, N_int, N_det_ref,& @@ -111,15 +114,21 @@ END_PROVIDER N_lambda_mrcc_pt2 += 1 lambda_mrcc_pt2(N_lambda_mrcc_pt2) = i endif + else + if (lambda_mrcc_pt3(N_lambda_mrcc_pt3) /= i) then + N_lambda_mrcc_pt3 += 1 + lambda_mrcc_pt3(N_lambda_mrcc_pt3) = i + endif endif enddo enddo lambda_mrcc_pt2(0) = N_lambda_mrcc_pt2 + lambda_mrcc_pt3(0) = N_lambda_mrcc_pt3 end if print*,'N_det_non_ref = ',N_det_non_ref - print*,'Number of ignored determinants = ',i_pert_count print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) print*,'lambda max = ',maxval(dabs(lambda_mrcc)) + print*,'Number of ignored determinants = ',i_pert_count END_PROVIDER diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index 82b1fc9b..0ef4c92b 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -64,8 +64,10 @@ subroutine run_pt2(N_st,energy) double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) integer, intent(in) :: N_st double precision, intent(in) :: energy(N_st) + double precision :: pt3(N_st) allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st)) pt2 = 0.d0 + pt3 = 0d0 !if(lambda_mrcc_pt2(0) == 0) return print*,'Last iteration only to compute the PT2' @@ -85,29 +87,91 @@ subroutine run_pt2(N_st,energy) ! enddo ! SOFT_TOUCH N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed - N_det_generators = lambda_mrcc_pt2(0) + N_det_cas - do i=1,N_det_cas - do k=1,N_int - psi_det_generators(k,1,i) = psi_ref(k,1,i) - psi_det_generators(k,2,i) = psi_ref(k,2,i) - enddo - do k=1,N_st - psi_coef_generators(i,k) = psi_ref_coef(i,k) - enddo - enddo - do i=N_det_cas+1,N_det_generators - j = lambda_mrcc_pt2(i - N_det_cas) + +! +! N_det_generators = lambda_mrcc_pt2(0) + N_det_cas +! do i=1,N_det_cas +! do k=1,N_int +! psi_det_generators(k,1,i) = psi_ref(k,1,i) +! psi_det_generators(k,2,i) = psi_ref(k,2,i) +! enddo +! do k=1,N_st +! psi_coef_generators(i,k) = psi_ref_coef(i,k) +! enddo +! enddo +! do i=N_det_cas+1,N_det_generators +! j = lambda_mrcc_pt2(i - N_det_cas) +! do k=1,N_int +! psi_det_generators(k,1,i) = psi_non_ref(k,1,j) +! psi_det_generators(k,2,i) = psi_non_ref(k,2,j) +! enddo +! do k=1,N_st +! psi_coef_generators(i,k) = psi_non_ref_coef(j,k) +! enddo +! enddo +! SOFT_TOUCH N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed + + N_det_generators = lambda_mrcc_pt3(0) + N_det_ref + N_det_selectors = lambda_mrcc_pt3(0) + N_det_ref + + psi_det_generators(:,:,:N_det_ref) = psi_ref(:,:,:N_det_ref) + psi_selectors(:,:,:N_det_ref) = psi_ref(:,:,:N_det_ref) + psi_coef_generators(:N_det_ref,:) = psi_ref_coef(:N_det_ref,:) + psi_selectors_coef(:N_det_ref,:) = psi_ref_coef(:N_det_ref,:) + + do i=N_det_ref+1,N_det_generators + j = lambda_mrcc_pt3(i-N_det_ref) do k=1,N_int psi_det_generators(k,1,i) = psi_non_ref(k,1,j) psi_det_generators(k,2,i) = psi_non_ref(k,2,j) + psi_selectors(k,1,i) = psi_non_ref(k,1,j) + psi_selectors(k,2,i) = psi_non_ref(k,2,j) enddo do k=1,N_st psi_coef_generators(i,k) = psi_non_ref_coef(j,k) + psi_selectors_coef(i,k) = psi_non_ref_coef(j,k) enddo enddo - SOFT_TOUCH N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed + + SOFT_TOUCH N_det_selectors psi_selectors_coef psi_selectors N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed + SOFT_TOUCH psi_ref_coef_diagonalized psi_ref_energy_diagonalized! psi_coef_energy_diagonalized + call H_apply_mrcepa_PT2(pt2, norm_pert, H_pert_diag, N_st) + + N_det_generators = N_det_non_ref + N_det_ref + N_det_selectors = N_det_non_ref + N_det_ref + + psi_det_generators(:,:,:N_det_ref) = psi_ref(:,:,:N_det_ref) + psi_selectors(:,:,:N_det_ref) = psi_ref(:,:,:N_det_ref) + psi_coef_generators(:N_det_ref,:) = psi_ref_coef(:N_det_ref,:) + psi_selectors_coef(:N_det_ref,:) = psi_ref_coef(:N_det_ref,:) + + do i=N_det_ref+1,N_det_generators + j = i-N_det_ref + do k=1,N_int + psi_det_generators(k,1,i) = psi_non_ref(k,1,j) + psi_det_generators(k,2,i) = psi_non_ref(k,2,j) + psi_selectors(k,1,i) = psi_non_ref(k,1,j) + psi_selectors(k,2,i) = psi_non_ref(k,2,j) + enddo + do k=1,N_st + psi_coef_generators(i,k) = psi_non_ref_coef(j,k) + psi_selectors_coef(i,k) = psi_non_ref_coef(j,k) + enddo + enddo + + SOFT_TOUCH N_det_selectors psi_selectors_coef psi_selectors N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed + SOFT_TOUCH psi_ref_coef_diagonalized psi_ref_energy_diagonalized! psi_coef_energy_diagonalized + call H_apply_mrcepa_PT2(pt3, norm_pert, H_pert_diag, N_st) - call H_apply_mrcc_PT2(pt2, norm_pert, H_pert_diag, N_st) + +!!!!!!!!!!!!!!!! + + + + print *, "2-3 :",pt2, pt3 + print *, lambda_mrcc_pt3(0), N_det, N_det_ref, psi_coef(1,1), psi_ref_coef(1,1) + pt2 = pt2 - pt3 + print *, 'Final step' print *, 'N_det = ', N_det print *, 'N_states = ', N_states From d296285946f762eafe91768d5921f701c78d9ef8 Mon Sep 17 00:00:00 2001 From: Yann GARNIRON Date: Fri, 3 Jun 2016 16:45:11 +0200 Subject: [PATCH 030/216] changes in lambda --- plugins/MRCC_Utils/mrcc_utils.irp.f | 32 +++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index e0dcac62..2c214328 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -16,6 +16,7 @@ END_PROVIDER BEGIN_PROVIDER [ double precision, lambda_mrcc_old, (N_states,psi_det_size) ] &BEGIN_PROVIDER [ integer, lambda_mrcc_pt2_old, (0:psi_det_size) ] +&BEGIN_PROVIDER [ integer, lambda_mrcc_pt3_old, (0:psi_det_size) ] implicit none BEGIN_DOC cm/ or perturbative 1/Delta_E(m) @@ -24,14 +25,21 @@ BEGIN_PROVIDER [ double precision, lambda_mrcc_old, (N_states,psi_det_size) ] double precision :: ihpsi_current(N_states) integer :: i_pert_count double precision :: hii, lambda_pert - integer :: N_lambda_mrcc_pt2 + integer :: N_lambda_mrcc_pt2, N_lambda_mrcc_pt3 double precision, parameter :: x = 2.d0 - + double precision :: nurm i_pert_count = 0 lambda_mrcc_old = 0.d0 N_lambda_mrcc_pt2 = 0 + N_lambda_mrcc_pt3 = 0 lambda_mrcc_pt2_old(0) = 0 - + lambda_mrcc_pt3_old(0) = 0 + if(N_states > 1) stop "old lambda N_states == 1" + nurm = 0d0 + do i=1,N_det_ref + nurm += psi_ref_coef(i,1)**2 + end do + do i=1,N_det_non_ref call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef, N_int, N_det_ref, & size(psi_ref_coef,1), N_states,ihpsi_current) @@ -41,18 +49,24 @@ BEGIN_PROVIDER [ double precision, lambda_mrcc_old, (N_states,psi_det_size) ] ihpsi_current(k) = 1.d-32 endif lambda_mrcc_old(k,i) = psi_non_ref_coef(i,k)/ihpsi_current(k) - if ( dabs(psi_non_ref_coef(i,k)*ihpsi_current(k)) < 1.d-5 ) then + !if ( dabs(psi_non_ref_coef(i,k)*ihpsi_current(k)) < 1.d-5 .or. lambda_mrcc_old(k,i) > 0d0) then + if ( dabs(ihpsi_current(k))*sqrt(psi_non_ref_coef(i,k)**2 / nurm) < 1.d-5 .or. lambda_mrcc_old(k,i) > 0d0) then i_pert_count += 1 lambda_mrcc_old(k,i) = 0.d0 if (lambda_mrcc_pt2_old(N_lambda_mrcc_pt2) /= i) then - N_lambda_mrcc_pt2 += 1 - lambda_mrcc_pt2_old(N_lambda_mrcc_pt2) = i + N_lambda_mrcc_pt2 += 1 + lambda_mrcc_pt2_old(N_lambda_mrcc_pt2) = i endif + else + if (lambda_mrcc_pt3_old(N_lambda_mrcc_pt3) /= i) then + N_lambda_mrcc_pt3 += 1 + lambda_mrcc_pt3_old(N_lambda_mrcc_pt3) = i + endif + endif ! lambda_pert = 1.d0 / (psi_ref_energy_diagonalized(k)-hii) ! if((ihpsi_current(k) * lambda_pert) < 0.5d0 * psi_non_ref_coef_restart(i,k) ) then ! lambda_mrcc_old(k,i) = 0.d0 ! endif - endif if (lambda_mrcc_old(k,i) > x) then lambda_mrcc_old(k,i) = x @@ -62,6 +76,7 @@ BEGIN_PROVIDER [ double precision, lambda_mrcc_old, (N_states,psi_det_size) ] enddo enddo lambda_mrcc_pt2_old(0) = N_lambda_mrcc_pt2 + lambda_mrcc_pt3_old(0) = N_lambda_mrcc_pt3 print*,'N_det_non_ref = ',N_det_non_ref print*,'Number of ignored determinants = ',i_pert_count @@ -89,6 +104,7 @@ END_PROVIDER if(old_lambda) then lambda_mrcc = lambda_mrcc_old lambda_mrcc_pt2 = lambda_mrcc_pt2_old + lambda_mrcc_pt3 = lambda_mrcc_pt3_old else i_pert_count = 0 lambda_mrcc = 0.d0 @@ -105,7 +121,7 @@ END_PROVIDER if (ihpsi_current(k) == 0.d0) then ihpsi_current(k) = 1.d-32 endif - lambda_mrcc(k,i) = min(1.d-32,psi_non_ref_coef(i,k)/ihpsi_current(k) ) + lambda_mrcc(k,i) = min(-1.d-32,psi_non_ref_coef(i,k)/ihpsi_current(k) ) lambda_pert = 1.d0 / (psi_ref_energy_diagonalized(k)-hii) if (lambda_pert / lambda_mrcc(k,i) < 0.5d0) then i_pert_count += 1 From 9b2343087291c2f44120856178084e74a85685f9 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 14 Jun 2016 09:22:32 +0200 Subject: [PATCH 031/216] reactivated microlists --- plugins/mrcepa0/dressing.irp.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index f6a4015d..648d2877 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -28,7 +28,7 @@ use bitmasks call apply_hole(psi_det_generators(1,1,gen), hh_exists(1, h), mask, ok, N_int) if(.not. ok) cycle omask = 0_bit_kind - !if(hh_exists(1, h) /= 0) omask = mask + if(hh_exists(1, h) /= 0) omask = mask n = 1 do p=hh_shortcut(h), hh_shortcut(h+1)-1 call apply_particle(mask, pp_exists(1, p), buf(1,1,n), ok, N_int) From 5db286b027fc96fbafdcf814df15efaaa69ddd97 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 14 Jun 2016 14:37:46 +0200 Subject: [PATCH 032/216] experimental lambda --- plugins/MRCC_Utils/mrcc_utils.irp.f | 175 +++++++++++++++++++++++++++- plugins/mrcepa0/dressing.irp.f | 128 ++++++++++++-------- 2 files changed, 249 insertions(+), 54 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 2c214328..489082eb 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -148,10 +148,44 @@ END_PROVIDER END_PROVIDER - - - - +! BEGIN_PROVIDER [ double precision, lambda_mrcc, (N_states,psi_det_size) ] +! &BEGIN_PROVIDER [ integer, lambda_mrcc_pt2, (0:psi_det_size) ] +! &BEGIN_PROVIDER [ integer, lambda_mrcc_pt3, (0:psi_det_size) ] +! implicit none +! BEGIN_DOC +! ! cm/ or perturbative 1/Delta_E(m) +! END_DOC +! integer :: i,ii,k +! double precision :: ihpsi_current(N_states) +! integer :: i_pert_count +! double precision :: hii, lambda_pert, phase +! integer :: N_lambda_mrcc_pt2, N_lambda_mrcc_pt3, degree +! integer :: exc(N_int, 2) +! histo = 0 +! +! i_pert_count = 0 +! lambda_mrcc = 0.d0 +! N_lambda_mrcc_pt2 = 0 +! N_lambda_mrcc_pt3 = 0 +! lambda_mrcc_pt2(0) = 0 +! lambda_mrcc_pt3(0) = 0 +! +! do ii=1, N_det_ref +! do i=1,N_det_non_ref +! call get_excitation(psi_ref(1,1,II), psi_non_ref(1,1,i), exc, degree, phase, N_int) +! if(degree == -1) cycle +! call i_H_j(psi_non_ref(1,1,ii),psi_non_ref(1,1,i),N_int,hii) +! +! +! lambda_mrcc_pt2(0) = N_lambda_mrcc_pt2 +! lambda_mrcc_pt3(0) = N_lambda_mrcc_pt3 +! +! print*,'N_det_non_ref = ',N_det_non_ref +! print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) +! print*,'lambda max = ',maxval(dabs(lambda_mrcc)) +! print*,'Number of ignored determinants = ',i_pert_count +! +! END_PROVIDER BEGIN_PROVIDER [ double precision, hij_mrcc, (N_det_non_ref,N_det_ref) ] @@ -397,6 +431,26 @@ integer function searchDet(dets, det, n, Nint) end function +integer function unsortedSearchDet(dets, det, n, Nint) + implicit none + use bitmasks + + integer(bit_kind),intent(in) :: dets(Nint,2,n), det(Nint,2) + integer, intent(in) :: nint, n + integer :: l, h, c + integer, external :: detCmp + logical, external :: detEq + + do l=1, n + if(detEq(det, dets(1,1,l), N_int)) then + unsortedSearchDet = l + return + end if + end do + unsortedSearchDet = -1 +end function + + integer function searchExc(excs, exc, n) implicit none use bitmasks @@ -617,6 +671,119 @@ END_PROVIDER +BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] + implicit none + logical :: ok + integer :: II, pp, hh, ind, wk + integer, external :: unsortedSearchDet + integer(bit_kind) :: myDet(N_int, 2), myMask(N_int, 2) + double precision, allocatable :: A(:,:) + integer :: N, IPIV(N_det_non_ref), INFO + double precision, allocatable :: WORK(:) + integer, allocatable :: IWORK(:) + + print *, "TI", hh_shortcut(hh_shortcut(0)+1)-1, N_det_non_ref + allocate(A(N_det_non_ref, hh_shortcut(hh_shortcut(0)+1)-1)) + A = 0d0 + do II = 1, N_det_ref + do hh = 1, hh_shortcut(0) + call apply_hole(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) + if(.not. ok) cycle + do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 + call apply_particle(myMask, pp_exists(1, pp), myDet, ok, N_int) + if(.not. ok) cycle + ind = unsortedSearchDet(psi_non_ref(1,1,1), myDet, N_det_non_ref, N_int) + if(ind /= -1) then + A(ind, pp) += psi_ref_coef(II, 1) + end if + end do + end do + end do + + double precision :: B(N_det_non_ref), S(N_det_non_ref) + integer :: rank + B = psi_non_ref_coef(:,1) + allocate(WORK(1), IWORK(1)) + call DGELSD(N_det_non_ref, & + hh_shortcut(hh_shortcut(0)+1)-1, & + 1, & + A, N_det_non_ref, & + B, N_det_non_ref, & + S, & + 1d-6, & + rank, & + WORK, -1, & + IWORK, & + INFO ) + wk = int(work(1)) + print *, "WORK:", wk + deallocate(WORK, IWORK) + allocate(WORK(wk), IWORK(wk)) + call DGELSD(N_det_non_ref, & + hh_shortcut(hh_shortcut(0)+1)-1, & + 1, & + A, N_det_non_ref, & + B, N_det_non_ref, & + S, & + 1d-6, & + rank, & + WORK, size(WORK), & + IWORK, & + INFO ) + print *, INFO, size(dIj), size(B) + dIj(:size(dIj)) = B(:size(dIj)) + print *, "diden" +END_PROVIDER + + +double precision function get_dij(det1, det2, Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer(bit_kind) :: det1(Nint, 2), det2(Nint, 2) + integer :: degree, f, exc(0:2, 2, 2), t + integer*2 :: h1, h2, p1, p2, s1, s2 + integer, external :: searchExc + logical, external :: excEq + double precision :: phase + + get_dij = 0d0 + call get_excitation(det1, det2, exc, degree, phase, Nint) + if(degree == -1) return + if(degree == 0) then + stop "get_dij" + end if + + call decode_exc_int2(exc,degree,h1,p1,h2,p2,s1,s2) + + if(degree == 1) then + h2 = h1 + p2 = p1 + s2 = s1 + h1 = 0 + p1 = 0 + s1 = 0 + end if + + if(h1 + (s1-1)*mo_tot_num < h2 + (s2-1)*mo_tot_num) then + f = searchExc(hh_exists(1,1), (/s1, h1, s2, h2/), hh_shortcut(0)) + else + f = searchExc(hh_exists(1,1), (/s2, h2, s1, h1/), hh_shortcut(0)) + end if + if(f == -1) return + + if(p1 + (s1-1)*mo_tot_num < p2 + (s2-1)*mo_tot_num) then + t = searchExc(pp_exists(1,hh_shortcut(f)), (/s1, p1, s2, p2/), hh_shortcut(f+1)-hh_shortcut(f)) + else + t = searchExc(pp_exists(1,hh_shortcut(f)), (/s2, p2, s1, p1/), hh_shortcut(f+1)-hh_shortcut(f)) + end if + + if(t /= -1) then + get_dij = dIj(t - 1 + hh_shortcut(f)) + end if +end function + + BEGIN_PROVIDER [ integer*2, hh_exists, (4, N_hh_exists) ] &BEGIN_PROVIDER [ integer, hh_shortcut, (0:N_hh_exists + 1) ] &BEGIN_PROVIDER [ integer*2, pp_exists, (4, N_pp_exists) ] diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 648d2877..931d9db3 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -476,58 +476,89 @@ END_PROVIDER END_PROVIDER +! BEGIN_PROVIDER [ double precision, delta_cas, (N_det_ref, N_det_ref, N_states) ] +! use bitmasks +! implicit none +! integer :: i,j,k +! double precision :: Hjk, Hki, Hij, pre(N_det_ref), wall +! integer :: i_state, degree, npre, ipre(N_det_ref), npres(N_det_ref) +! +! ! provide lambda_mrcc +! npres = 0 +! delta_cas = 0d0 +! call wall_time(wall) +! print *, "dcas ", wall +! do i_state = 1, N_states +! !!$OMP PARALLEL DO default(none) schedule(dynamic) private(pre,npre,ipre,j,k,Hjk,Hki,degree) shared(npres,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) +! do k=1,N_det_non_ref +! if(lambda_mrcc(i_state, k) == 0d0) cycle +! npre = 0 +! do i=1,N_det_ref +! call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki) +! if(Hki /= 0d0) then +! !!$OMP ATOMIC +! npres(i) += 1 +! npre += 1 +! ipre(npre) = i +! pre(npre) = Hki +! end if +! end do +! +! +! do i=1,npre +! do j=1,i +! !!$OMP ATOMIC +! delta_cas(ipre(i),ipre(j),i_state) += pre(i) * pre(j) * lambda_mrcc(i_state, k) +! end do +! end do +! end do +! !!$OMP END PARALLEL DO +! npre=0 +! do i=1,N_det_ref +! npre += npres(i) +! end do +! !stop +! do i=1,N_det_ref +! do j=1,i +! delta_cas(j,i,i_state) = delta_cas(i,j,i_state) +! end do +! end do +! end do +! +! call wall_time(wall) +! print *, "dcas", wall +! ! stop +! END_PROVIDER + + BEGIN_PROVIDER [ double precision, delta_cas, (N_det_ref, N_det_ref, N_states) ] use bitmasks implicit none integer :: i,j,k - double precision :: Hjk, Hki, Hij, pre(N_det_ref), wall - integer :: i_state, degree, npre, ipre(N_det_ref), npres(N_det_ref) + double precision :: Hjk, Hki, Hij + double precision, external :: get_dij + integer i_state, degree -! provide lambda_mrcc - npres = 0 - delta_cas = 0d0 - call wall_time(wall) - print *, "dcas ", wall + provide lambda_mrcc do i_state = 1, N_states - !!$OMP PARALLEL DO default(none) schedule(dynamic) private(pre,npre,ipre,j,k,Hjk,Hki,degree) shared(npres,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) - do k=1,N_det_non_ref - if(lambda_mrcc(i_state, k) == 0d0) cycle - npre = 0 - do i=1,N_det_ref - call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki) - if(Hki /= 0d0) then - !!$OMP ATOMIC - npres(i) += 1 - npre += 1 - ipre(npre) = i - pre(npre) = Hki - end if - end do - - - do i=1,npre + !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(no_mono_dressing,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) + do i=1,N_det_ref do j=1,i - !!$OMP ATOMIC - delta_cas(ipre(i),ipre(j),i_state) += pre(i) * pre(j) * lambda_mrcc(i_state, k) - end do - end do - end do - !!$OMP END PARALLEL DO - npre=0 - do i=1,N_det_ref - npre += npres(i) - end do - !stop - do i=1,N_det_ref - do j=1,i + call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int) + delta_cas(i,j,i_state) = 0d0 + do k=1,N_det_non_ref + + call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,k),N_int,Hjk) + call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki) + + delta_cas(i,j,i_state) += Hjk * get_dij(psi_ref(1,1,i), psi_non_ref(1,1,k), N_int) ! * Hki * lambda_mrcc(i_state, k) + !print *, Hjk * get_dij(psi_ref(1,1,i), psi_non_ref(1,1,k), N_int), Hki * get_dij(psi_ref(1,1,j), psi_non_ref(1,1,k), N_int) + end do delta_cas(j,i,i_state) = delta_cas(i,j,i_state) + end do end do - end do + !$OMP END PARALLEL DO end do - - call wall_time(wall) - print *, "dcas", wall -! stop END_PROVIDER @@ -618,7 +649,7 @@ end function integer, allocatable :: idx_sorted_bit(:) integer, external :: get_index_in_psi_det_sorted_bit, searchDet logical, external :: is_in_wavefunction, detEq - + double precision, external :: get_dij integer :: II, blok integer*8, save :: notf = 0 @@ -659,7 +690,7 @@ end function kloop: do k=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 !i - if(lambda_mrcc(i_state, det_cepa0_idx(k)) == 0d0) cycle + !if(lambda_mrcc(i_state, det_cepa0_idx(k)) == 0d0) cycle do ni=1,N_int if(iand(made_hole(ni,1), det_cepa0_active(ni,1,k)) /= 0) cycle kloop @@ -681,13 +712,10 @@ end function j = sortRefIdx(j) !$OMP ATOMIC notf = notf+1 - !if(i/=k .and. dabs(psi_non_ref_coef(det_cepa0_idx(i),i_state)) < dabs(psi_non_ref_coef(det_cepa0_idx(k),i_state))) cycle -! if(dabs(lambda_mrcc(i_state,det_cepa0_idx(i))) > dabs(lambda_mrcc(i_state,det_cepa0_idx(k)))) cycle -! if(dabs(lambda_mrcc(i_state,det_cepa0_idx(i))) == dabs(lambda_mrcc(i_state,det_cepa0_idx(k))) .and. i < k) cycle - !if(.not. j==II .and. dabs(psi_ref_coef(II,i_state)) < dabs(psi_ref_coef(j,i_state))) cycle - + call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,HJk) - contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k)) + !contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k)) + contrib = delta_cas(II, J, i_state) * get_dij(psi_ref(1,1,J), psi_non_ref(1,1,det_cepa0_idx(k)), N_int) !$OMP ATOMIC delta_mrcepa0_ij(J, det_cepa0_idx(i), i_state) += contrib From 8be7b966335fb78e4c858307d13ada9680197454 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 14 Jun 2016 15:26:50 +0200 Subject: [PATCH 033/216] experimental lambda mrcc --- plugins/mrcepa0/dressing.irp.f | 46 +++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 931d9db3..76ac59c3 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -86,7 +86,7 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe integer, allocatable :: idx_microlist(:), N_microlist(:), ptr_microlist(:), idx_microlist_zero(:) integer :: mobiles(2), smallerlist logical, external :: detEq, is_generable - + double precision, external :: get_dij leng = max(N_det_generators, N_det_non_ref) allocate(miniList(Nint, 2, leng), tq(Nint,2,n_selected), idx_minilist(leng), hij_cache(N_det_non_ref)) @@ -202,16 +202,16 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe ! Loop if lambda == 0 logical :: loop - loop = .True. - do i_state=1,N_states - if (lambda_mrcc(i_state,idx_alpha(k_sd)) /= 0.d0) then - loop = .False. - exit - endif - enddo - if (loop) then - cycle - endif +! loop = .True. +! do i_state=1,N_states +! if (lambda_mrcc(i_state,idx_alpha(k_sd)) /= 0.d0) then +! loop = .False. +! exit +! endif +! enddo +! if (loop) then +! cycle +! endif call get_excitation_degree(psi_ref(1,1,i_I),psi_non_ref(1,1,idx_alpha(k_sd)),degree,Nint) if (degree > 2) then @@ -222,9 +222,14 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe ! hIk = hij_mrcc(idx_alpha(k_sd),i_I) ! call i_h_j(psi_ref(1,1,i_I),psi_non_ref(1,1,idx_alpha(k_sd)),Nint,hIk) + + do i_state=1,N_states - dIk(i_state) = hIk * lambda_mrcc(i_state,idx_alpha(k_sd)) + dIk(i_state) = get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,idx_alpha(k_sd)), N_int) !!hIk * lambda_mrcc(i_state,idx_alpha(k_sd)) enddo + + + ! |l> = Exc(k -> alpha) |I> call get_excitation(psi_non_ref(1,1,idx_alpha(k_sd)),tq(1,1,i_alpha),exc,degree,phase,Nint) call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) @@ -246,19 +251,20 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe call get_excitation_degree(tmp_det,psi_non_ref(1,1,idx_alpha(l_sd)),degree,Nint) if (degree == 0) then - loop = .True. - do i_state=1,N_states - if (lambda_mrcc(i_state,idx_alpha(l_sd)) /= 0.d0) then - loop = .False. - exit - endif - enddo +! loop = .True. +! do i_state=1,N_states +! if (lambda_mrcc(i_state,idx_alpha(l_sd)) /= 0.d0) then +! loop = .False. +! exit +! endif +! enddo + loop = .false. if (.not.loop) then call get_excitation(psi_ref(1,1,i_I),psi_non_ref(1,1,idx_alpha(l_sd)),exc,degree,phase2,Nint) hIl = hij_mrcc(idx_alpha(l_sd),i_I) ! call i_h_j(psi_ref(1,1,i_I),psi_non_ref(1,1,idx_alpha(l_sd)),Nint,hIl) do i_state=1,N_states - dka(i_state) = hIl * lambda_mrcc(i_state,idx_alpha(l_sd)) * phase * phase2 + dka(i_state) = get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,idx_alpha(l_sd)), N_int) * phase * phase2 !hIl * lambda_mrcc(i_state,idx_alpha(l_sd)) * phase * phase2 enddo endif From 79cbe7b7f1563fde45fbd51aeedd7aa35cecb907 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 15 Jun 2016 10:07:00 +0200 Subject: [PATCH 034/216] slow but working experimental lambda --- config/ifort.cfg | 4 ++-- plugins/mrcepa0/dressing.irp.f | 4 ++-- plugins/mrcepa0/dressing_slave.irp.f | 35 +++++++++++++--------------- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/config/ifort.cfg b/config/ifort.cfg index 60b771ea..03199923 100644 --- a/config/ifort.cfg +++ b/config/ifort.cfg @@ -31,14 +31,14 @@ OPENMP : 1 ; Append OpenMP flags # -ftz : Flushes denormal results to zero # [OPT] -FCFLAGS : -xAVX -O2 -ip -ftz -g +FCFLAGS : -xSSE4.2 -O2 -ip -ftz -g # Profiling flags ################# # [PROFILE] FC : -p -g -FCFLAGS : -xAVX -O2 -ip -ftz +FCFLAGS : -xSSE4.2 -O2 -ip -ftz # Debugging flags ################# diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 76ac59c3..f289fec0 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -15,7 +15,7 @@ use bitmasks delta_ij_mrcc = 0d0 delta_ii_mrcc = 0d0 i_state = 1 - provide hh_shortcut psi_det_size lambda_mrcc + provide hh_shortcut psi_det_size! lambda_mrcc !$OMP PARALLEL DO default(none) schedule(dynamic) & !$OMP shared(psi_det_generators, N_det_generators, hh_exists, pp_exists, N_int, hh_shortcut) & !$OMP shared(N_states, N_det_non_ref, N_det_ref, delta_ii_mrcc, delta_ij_mrcc) & @@ -545,7 +545,7 @@ END_PROVIDER double precision, external :: get_dij integer i_state, degree - provide lambda_mrcc + !provide lambda_mrcc do i_state = 1, N_states !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(no_mono_dressing,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) do i=1,N_det_ref diff --git a/plugins/mrcepa0/dressing_slave.irp.f b/plugins/mrcepa0/dressing_slave.irp.f index 08099341..7d64aa5e 100644 --- a/plugins/mrcepa0/dressing_slave.irp.f +++ b/plugins/mrcepa0/dressing_slave.irp.f @@ -55,7 +55,7 @@ subroutine mrsc2_dressing_slave(thread,iproc) logical, external :: is_in_wavefunction, isInCassd, detEq integer,allocatable :: komon(:) logical :: komoned - + double precision, external :: get_dij zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() zmq_socket_push = new_zmq_push_socket(thread) @@ -124,14 +124,14 @@ subroutine mrsc2_dressing_slave(thread,iproc) if(h_(J,i) == 0.d0) cycle if(h_(i_I,i) == 0.d0) cycle - ok = .false. - do i_state=1, N_states - if(lambda_mrcc(i_state, i) /= 0d0) then - ok = .true. - exit - end if - end do - if(.not. ok) cycle + !ok = .false. + !do i_state=1, N_states + ! if(lambda_mrcc(i_state, i) /= 0d0) then + ! ok = .true. + ! exit + ! end if + !end do + !if(.not. ok) cycle ! komon(0) += 1 @@ -144,7 +144,8 @@ subroutine mrsc2_dressing_slave(thread,iproc) ! if(I_i == J) phase_Ii = phase_Ji do i_state = 1,N_states - dkI = h_(J,i) * h_(i_I,i) * lambda_mrcc(i_state, i) + dkI = h_(J,i) * get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,i), N_int) + !dkI = h_(J,i) * h_(i_I,i) * lambda_mrcc(i_state, i) dleat(i_state, kn, 1) = dkI dleat(i_state, kn, 2) = dkI end do @@ -169,24 +170,20 @@ subroutine mrsc2_dressing_slave(thread,iproc) !if(isInCassd(det_tmp, N_int)) cycle do i_state = 1, N_states - if(lambda_mrcc(i_state, i) == 0d0) cycle + !if(lambda_mrcc(i_state, i) == 0d0) cycle -! call get_excitation(det_tmp,psi_non_ref(1,1,l),exc_IJ,degree2,phase_al,N_int) - contrib = h_(i_I,k) * lambda_mrcc(i_state, k) * dleat(i_state, m, 2)! * phase_al -! if(l /= det_cepa0_idx(linked(ll, J))) stop "SPTPqsdT" + !contrib = h_(i_I,k) * lambda_mrcc(i_state, k) * dleat(i_state, m, 2)! * phase_al + contrib = get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,k), N_int) * dleat(i_state, m, 2) delta(i_state,ll,1) += contrib if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then delta(i_state,0,1) -= contrib * ci_inv(i_state) * psi_non_ref_coef(l,i_state) endif if(I_i == J) cycle -! call get_excitation(det_tmp,psi_non_ref(1,1,k),exc_IJ,degree2,phase_al,N_int) -! cj_inv(i_state) = 1.d0 / psi_ref_coef(J,i_state) - contrib = h_(J,l) * lambda_mrcc(i_state, l) * dleat(i_state, m, 1)! * phase_al -! if(k /= linked(kk, I_i)) stop "SPTPT" + !contrib = h_(J,l) * lambda_mrcc(i_state, l) * dleat(i_state, m, 1)! * phase_al + contrib = get_dij(psi_ref(1,1,J), psi_non_ref(1,1,l), N_int) * dleat(i_state, m, 1) delta(i_state,kk,2) += contrib - !delta(i_state,det_cepa0_idx(k),2) += contrib if(dabs(psi_ref_coef(J,i_state)).ge.5.d-5) then delta(i_state,0,2) -= contrib * cj_inv(i_state) * psi_non_ref_coef(k,i_state) end if From d55b0a0b5e20dffeae3bb8749e1b47c05789445a Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 16 Jun 2016 11:58:59 +0200 Subject: [PATCH 035/216] lambda using matrix products --- plugins/MRCC_Utils/mrcc_utils.irp.f | 71 ++++++++++++++--------------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 489082eb..f576a346 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -674,7 +674,7 @@ END_PROVIDER BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] implicit none logical :: ok - integer :: II, pp, hh, ind, wk + integer :: i, j, k, II, pp, hh, ind, wk, nex integer, external :: unsortedSearchDet integer(bit_kind) :: myDet(N_int, 2), myMask(N_int, 2) double precision, allocatable :: A(:,:) @@ -682,8 +682,9 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] double precision, allocatable :: WORK(:) integer, allocatable :: IWORK(:) - print *, "TI", hh_shortcut(hh_shortcut(0)+1)-1, N_det_non_ref - allocate(A(N_det_non_ref, hh_shortcut(hh_shortcut(0)+1)-1)) + nex = hh_shortcut(hh_shortcut(0)+1)-1 + print *, "TI", nex, N_det_non_ref + allocate(A(N_det_non_ref, nex)) A = 0d0 do II = 1, N_det_ref do hh = 1, hh_shortcut(0) @@ -700,39 +701,37 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] end do end do - double precision :: B(N_det_non_ref), S(N_det_non_ref) - integer :: rank - B = psi_non_ref_coef(:,1) - allocate(WORK(1), IWORK(1)) - call DGELSD(N_det_non_ref, & - hh_shortcut(hh_shortcut(0)+1)-1, & - 1, & - A, N_det_non_ref, & - B, N_det_non_ref, & - S, & - 1d-6, & - rank, & - WORK, -1, & - IWORK, & - INFO ) - wk = int(work(1)) - print *, "WORK:", wk - deallocate(WORK, IWORK) - allocate(WORK(wk), IWORK(wk)) - call DGELSD(N_det_non_ref, & - hh_shortcut(hh_shortcut(0)+1)-1, & - 1, & - A, N_det_non_ref, & - B, N_det_non_ref, & - S, & - 1d-6, & - rank, & - WORK, size(WORK), & - IWORK, & - INFO ) - print *, INFO, size(dIj), size(B) - dIj(:size(dIj)) = B(:size(dIj)) - print *, "diden" + double precision, allocatable :: IAtA(:,:), AtB(:), X(:), X_new(:) + double precision :: norm + allocate(IAtA(nex, nex), AtB(nex), X(nex), X_new(nex)) + print *, "allocated", size(IAtA, 1), size(A, 2) + !IAtA = -matmul(transpose(A), A) + + IAtA = 0.d0 + do i=1, size(A,2) + IAtA(i,i) = 1d0 + end do + call dgemm('T','N',nex,nex,N_det_non_ref,1.d0,A,size(A,1),A,size(A,1),-1.d0,IAtA,size(IAtA,1)) + IaTa = -IATa + + call dgemv('T',N_det_non_ref,nex,1.d0,A,size(A,1),psi_non_ref_coef(1,1),1,0.d0,AtB,1) + + !AtB = matmul(transpose(A), psi_non_ref_coef(:,1)) + + X = AtB + do k=1, 1000 + !X_new = matmul(IAtA, X) + AtB + x_new = AtB + call dgemv('N',nex,nex,1.d0,IAtA,size(IAtA,1),X,1,1.d0,x_new,1) + norm = 0d0 + do j=1, size(X) + norm += (X_new(j) - X(j))**2 + X(j) = X_new(j) + end do + print *, "resudu ", norm + end do + dIj = X + print *, "done" END_PROVIDER From 0e18a2790b9432531a93d37972e24cb5054c9f9d Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 20 Jun 2016 10:52:54 +0200 Subject: [PATCH 036/216] parallel AtA*X --- config/ifort.cfg | 2 +- plugins/MRCC_Utils/mrcc_utils.irp.f | 213 +++++++++++++++++++++++----- plugins/mrcepa0/dressing.irp.f | 6 +- 3 files changed, 180 insertions(+), 41 deletions(-) diff --git a/config/ifort.cfg b/config/ifort.cfg index 03199923..47a654c3 100644 --- a/config/ifort.cfg +++ b/config/ifort.cfg @@ -6,7 +6,7 @@ # --align=32 : Align all provided arrays on a 32-byte boundary # [COMMON] -FC : ifort +FC : ifort -g LAPACK_LIB : -mkl=parallel IRPF90 : irpf90 IRPF90_FLAGS : --ninja --align=32 diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index f576a346..c4bfcbc2 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -1,3 +1,4 @@ +use bitmasks BEGIN_PROVIDER [ integer, mrmode ] &BEGIN_PROVIDER [ logical, old_lambda ] @@ -671,66 +672,202 @@ END_PROVIDER + BEGIN_PROVIDER [ integer(bit_kind), psi_non_ref_sorted, (N_int, 2, N_det_non_ref) ] +&BEGIN_PROVIDER [ integer, psi_non_ref_sorted_idx, (N_det_non_ref) ] + implicit none + psi_non_ref_sorted = psi_non_ref + call sort_det(psi_non_ref_sorted, psi_non_ref_sorted_idx, N_det_non_ref, N_int) +END_PROVIDER + + BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] implicit none logical :: ok - integer :: i, j, k, II, pp, hh, ind, wk, nex - integer, external :: unsortedSearchDet + integer :: i, j, k, II, pp, hh, ind, wk, nex, a_col, at_row + integer, external :: searchDet, unsortedSearchDet integer(bit_kind) :: myDet(N_int, 2), myMask(N_int, 2) - double precision, allocatable :: A(:,:) - integer :: N, IPIV(N_det_non_ref), INFO - double precision, allocatable :: WORK(:) - integer, allocatable :: IWORK(:) + integer :: N, INFO, AtA_size, r1, r2 + double precision , allocatable:: AtB(:), AtA_val(:), A_dense(:), A_val(:,:), x(:), x_new(:), A_val_mwen(:) + double precision :: t, norm, cx + integer, allocatable :: A_ind(:,:), AtA_ind(:), A_ind_mwen(:), col_shortcut(:), N_col(:) + nex = hh_shortcut(hh_shortcut(0)+1)-1 print *, "TI", nex, N_det_non_ref - allocate(A(N_det_non_ref, nex)) - A = 0d0 - do II = 1, N_det_ref - do hh = 1, hh_shortcut(0) - call apply_hole(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) - if(.not. ok) cycle - do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 + allocate(A_ind(N_det_ref+1, nex), A_val(N_det_ref+1, nex)) + allocate(AtA_ind(N_det_ref * nex), AtA_val(N_det_ref * nex)) !!!!! MAY BE TOO SMALL !!!!!!!! + allocate(x(nex), AtB(nex), A_dense(N_det_non_ref)) + allocate(A_val_mwen(nex), A_ind_mwen(nex)) + allocate(N_col(nex), col_shortcut(nex)) + A_val = 0d0 + A_ind = 0 + !$OMP PARALLEL DO schedule(static,10) default(none) shared(psi_non_ref, hh_exists, pp_exists, N_int, A_val, A_ind) & + !$OMP shared(hh_shortcut, psi_ref_coef, N_det_non_ref, psi_non_ref_sorted, psi_non_ref_sorted_idx, psi_ref, N_det_ref) & + !$OMP private(pp, II, ok, myMask, myDet, ind, wk) + do hh = 1, hh_shortcut(0) + !print *, hh, "/", hh_shortcut(0) + do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 + wk = 0 + do II = 1, N_det_ref + call apply_hole(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) + if(.not. ok) cycle call apply_particle(myMask, pp_exists(1, pp), myDet, ok, N_int) if(.not. ok) cycle - ind = unsortedSearchDet(psi_non_ref(1,1,1), myDet, N_det_non_ref, N_int) + !ind = unsortedSearchDet(psi_non_ref(1,1,1), myDet, N_det_non_ref, N_int) + ind = searchDet(psi_non_ref_sorted(1,1,1), myDet(1,1), N_det_non_ref, N_int) if(ind /= -1) then - A(ind, pp) += psi_ref_coef(II, 1) + wk = wk+1 + A_val(wk, pp) = psi_ref_coef(II, 1) + A_ind(wk, pp) = psi_non_ref_sorted_idx(ind) end if end do end do end do - - double precision, allocatable :: IAtA(:,:), AtB(:), X(:), X_new(:) - double precision :: norm - allocate(IAtA(nex, nex), AtB(nex), X(nex), X_new(nex)) - print *, "allocated", size(IAtA, 1), size(A, 2) - !IAtA = -matmul(transpose(A), A) - - IAtA = 0.d0 - do i=1, size(A,2) - IAtA(i,i) = 1d0 + !$OMP END PARALLEL DO + + A_dense = 0d0 + AtB = 0d0 + AtA_size = 0 + wk = 0 + col_shortcut = 0 + N_col = 0 + !$OMP PARALLEL DO schedule(dynamic, 100) default(none) shared(k, psi_non_ref_coef, A_ind, A_val, x, N_det_ref, nex, N_det_non_ref) & + !$OMP private(at_row, a_col, t, i, r1, r2, wk, A_ind_mwen, A_val_mwen) & + !$OMP shared(col_shortcut, N_col, AtB, AtA_size, AtA_val, AtA_ind) + do at_row = 1, nex + wk = 0 + if(mod(at_row, 1000) == 0) print *, "AtA", at_row, "/", nex + !A_dense = 0d0 + do i=1,N_det_ref + if(A_ind(i, at_row) == 0) exit + AtB(at_row) = AtB(at_row) + psi_non_ref_coef(A_ind(i, at_row), 1) * A_val(i, at_row) + end do + do a_col = 1, nex + t = 0d0 + r1 = 1 + r2 = 1 + do while(A_ind(r1, at_row) * A_ind(r2, a_col) /= 0) + if(A_ind(r1, at_row) < A_ind(r2, a_col)) then + r1 += 1 + else if(A_ind(r1, at_row) > A_ind(r2, a_col)) then + r2 += 1 + else + t = t - A_val(r1, at_row) * A_val(r2, a_col) + r1 += 1 + r2 += 1 + end if + end do + + if(a_col == at_row) t = (t + 1d0)! / 2d0 + if(t /= 0d0) then + wk += 1 + !AtA_ind(1, wk) = at_row + !AtA_ind(2, wk) = a_col + A_ind_mwen(wk) = a_col + !AtA_val(wk) = t + A_val_mwen(wk) = t + end if + end do + + if(wk /= 0) then + !$OMP CRITICAL + col_shortcut(at_row) = AtA_size+1 + N_col(at_row) = wk + AtA_ind(AtA_size+1:AtA_size+wk) = A_ind_mwen(:wk) + AtA_val(AtA_size+1:AtA_size+wk) = A_val_mwen(:wk) + AtA_size += wk + !$OMP END CRITICAL + end if end do - call dgemm('T','N',nex,nex,N_det_non_ref,1.d0,A,size(A,1),A,size(A,1),-1.d0,IAtA,size(IAtA,1)) - IaTa = -IATa + + x = AtB + if(AtA_size > size(AtA_val)) stop "SIZA" + print *, "ATA SIZE", ata_size + allocate (x_new(nex)) + integer :: iproc, omp_get_thread_num + iproc = omp_get_thread_num() + do i=1,nex + x_new(i) = 0.D0 + enddo - call dgemv('T',N_det_non_ref,nex,1.d0,A,size(A,1),psi_non_ref_coef(1,1),1,0.d0,AtB,1) + do k=0,100000 + !$OMP PARALLEL DO default(shared) + do i=1,nex + x_new(i) = AtB(i) + enddo + !$OMP PARALLEL DO default(shared) private(cx, i) + do a_col = 1, nex + cx = 0d0 + do i=col_shortcut(a_col), col_shortcut(a_col) + N_col(a_col) - 1 + cx += x(AtA_ind(i)) * AtA_val(i) + end do + x_new(a_col) += cx + end do + !$OMP END PARALLEL DO - !AtB = matmul(transpose(A), psi_non_ref_coef(:,1)) - - X = AtB - do k=1, 1000 - !X_new = matmul(IAtA, X) + AtB - x_new = AtB - call dgemv('N',nex,nex,1.d0,IAtA,size(IAtA,1),X,1,1.d0,x_new,1) norm = 0d0 + do j=1, size(X) norm += (X_new(j) - X(j))**2 - X(j) = X_new(j) + x(j) = x_new(j) end do - print *, "resudu ", norm + + if(mod(k, 1000) == 0) print *, "residu ", k, norm + if(norm < 1d-9) exit end do - dIj = X + print *, "CONVERGENCE : ", norm + + +!do k=0,500 +! if(k == 1) print *, X(:10) +! x_new = 0d0 +! A_dense = 0d0 +! !!$OMP PARALLEL DO schedule(dynamic, 10) default(none) shared(k, psi_non_ref_coef, x_new, A_ind, A_val, x, N_det_ref, nex, N_det_non_ref) & +! !!$OMP private(a_col, t, i, cx) & +! !!$OMP firstprivate(A_dense) +! do at_row = 1, nex +! ! ! d DIR$ IVDEP +! cx = 0d0 +! do i=1,N_det_ref +! if(A_ind(i, at_row) == 0) exit +! if(k /= 0) A_dense(A_ind(i, at_row)) = A_val(i, at_row) +! cx = cx + psi_non_ref_coef(A_ind(i, at_row), 1) * A_val(i, at_row) +! !x_new(at_row) = x_new(at_row) + psi_non_ref_coef(A_ind(i, at_row), 1) * A_val(i, at_row) +! end do +! if(k == 0) then +! x_new(at_row) = cx +! cycle +! end if +! do a_col = 1, nex +! t = 0d0 +! do i = 1, N_det_ref +! if(A_ind(i, a_col) == 0) exit +! t = t - A_val(i, a_col) * A_dense(A_ind(i, a_col)) ! -= pcq I-A +! end do +! if(a_col == at_row) t = t + 1d0 +! cx = cx + t * x(a_col) +! !x_new(at_row) = x_new(at_row) + t * x(a_col) +! end do +! x_new(at_row) = cx +! do i=1,N_det_ref +! if(A_ind(i, at_row) == 0) exit +! A_dense(A_ind(i, at_row)) = 0d0 +! end do +! end do +! !!$OMP END PARALLEL DO + +! norm = 0d0 +! do j=1, size(X) +! norm += (X_new(j) - X(j))**2 +! X(j) = X_new(j) +! end do +! print *, "residu ", k, norm +! if(norm < 1d-10) exit +!end do +! + + dIj(:size(X)) = X(:) + !print *, X print *, "done" END_PROVIDER diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index f289fec0..74a572f5 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -544,8 +544,8 @@ END_PROVIDER double precision :: Hjk, Hki, Hij double precision, external :: get_dij integer i_state, degree - - !provide lambda_mrcc + + provide lambda_mrcc dIj do i_state = 1, N_states !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(no_mono_dressing,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) do i=1,N_det_ref @@ -670,6 +670,8 @@ end function idx_sorted_bit(get_index_in_psi_det_sorted_bit(psi_non_ref(1,1,i), N_int)) = i enddo + ! To provide everything + contrib = get_dij(psi_ref(1,1,1), psi_non_ref(1,1,1), N_int) do i_state = 1, N_states delta_mrcepa0_ii(:,:) = 0d0 From c7f96406b33609711f5aa4bacc2417998d899b78 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 20 Jun 2016 14:09:40 +0200 Subject: [PATCH 037/216] bug in dIj - unsorted index --- plugins/MRCC_Utils/mrcc_utils.irp.f | 36 ++++++++++++++++++----------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index c4bfcbc2..ef3d02cb 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -687,27 +687,28 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] integer, external :: searchDet, unsortedSearchDet integer(bit_kind) :: myDet(N_int, 2), myMask(N_int, 2) integer :: N, INFO, AtA_size, r1, r2 - double precision , allocatable:: AtB(:), AtA_val(:), A_dense(:), A_val(:,:), x(:), x_new(:), A_val_mwen(:) + double precision , allocatable:: AtB(:), AtA_val(:), A_val(:,:), x(:), x_new(:), A_val_mwen(:) double precision :: t, norm, cx - integer, allocatable :: A_ind(:,:), AtA_ind(:), A_ind_mwen(:), col_shortcut(:), N_col(:) + integer, allocatable :: A_ind(:,:), lref(:), AtA_ind(:), A_ind_mwen(:), col_shortcut(:), N_col(:) nex = hh_shortcut(hh_shortcut(0)+1)-1 print *, "TI", nex, N_det_non_ref allocate(A_ind(N_det_ref+1, nex), A_val(N_det_ref+1, nex)) allocate(AtA_ind(N_det_ref * nex), AtA_val(N_det_ref * nex)) !!!!! MAY BE TOO SMALL !!!!!!!! - allocate(x(nex), AtB(nex), A_dense(N_det_non_ref)) + allocate(x(nex), AtB(nex)) allocate(A_val_mwen(nex), A_ind_mwen(nex)) allocate(N_col(nex), col_shortcut(nex)) A_val = 0d0 A_ind = 0 !$OMP PARALLEL DO schedule(static,10) default(none) shared(psi_non_ref, hh_exists, pp_exists, N_int, A_val, A_ind) & !$OMP shared(hh_shortcut, psi_ref_coef, N_det_non_ref, psi_non_ref_sorted, psi_non_ref_sorted_idx, psi_ref, N_det_ref) & - !$OMP private(pp, II, ok, myMask, myDet, ind, wk) + !$OMP private(lref, pp, II, ok, myMask, myDet, ind, wk) do hh = 1, hh_shortcut(0) !print *, hh, "/", hh_shortcut(0) do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 - wk = 0 + allocate(lref(N_det_non_ref)) + lref = 0 do II = 1, N_det_ref call apply_hole(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) if(.not. ok) cycle @@ -716,16 +717,25 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] !ind = unsortedSearchDet(psi_non_ref(1,1,1), myDet, N_det_non_ref, N_int) ind = searchDet(psi_non_ref_sorted(1,1,1), myDet(1,1), N_det_non_ref, N_int) if(ind /= -1) then - wk = wk+1 - A_val(wk, pp) = psi_ref_coef(II, 1) - A_ind(wk, pp) = psi_non_ref_sorted_idx(ind) + !iwk = wk+1 + !A_val(wk, pp) = psi_ref_coef(II, 1) + !A_ind(wk, pp) = psi_non_ref_sorted_idx(ind) + lref(psi_non_ref_sorted_idx(ind)) = II end if end do + wk = 0 + do i=1, N_det_non_ref + if(lref(i) /= 0) then + wk += 1 + A_val(wk, pp) = psi_ref_coef(lref(i), 1) + A_ind(wk, pp) = i + end if + end do + deallocate(lref) end do end do !$OMP END PARALLEL DO - A_dense = 0d0 AtB = 0d0 AtA_size = 0 wk = 0 @@ -737,7 +747,6 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] do at_row = 1, nex wk = 0 if(mod(at_row, 1000) == 0) print *, "AtA", at_row, "/", nex - !A_dense = 0d0 do i=1,N_det_ref if(A_ind(i, at_row) == 0) exit AtB(at_row) = AtB(at_row) + psi_non_ref_coef(A_ind(i, at_row), 1) * A_val(i, at_row) @@ -791,11 +800,12 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] enddo do k=0,100000 - !$OMP PARALLEL DO default(shared) + ! df $ fg OMP PARALLEL DO default(shared) do i=1,nex x_new(i) = AtB(i) enddo - !$OMP PARALLEL DO default(shared) private(cx, i) + + ! sdf $OMP PARALLEL DO default(shared) private(cx, i) do a_col = 1, nex cx = 0d0 do i=col_shortcut(a_col), col_shortcut(a_col) + N_col(a_col) - 1 @@ -803,7 +813,7 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] end do x_new(a_col) += cx end do - !$OMP END PARALLEL DO + ! sdf $OMP END PARALLEL DO norm = 0d0 From df83a33cac9e5bbcf1d9d6d54b9e644c3f63f069 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 20 Jun 2016 15:02:47 +0200 Subject: [PATCH 038/216] renormalize x_new --- plugins/MRCC_Utils/mrcc_utils.irp.f | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index ef3d02cb..bf5b7694 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -767,7 +767,10 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] end if end do - if(a_col == at_row) t = (t + 1d0)! / 2d0 + if(a_col == at_row) then + t = (t + 1d0)! / 2d0 + !print *, a_col, t-1d0 + end if if(t /= 0d0) then wk += 1 !AtA_ind(1, wk) = at_row @@ -814,16 +817,29 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] x_new(a_col) += cx end do ! sdf $OMP END PARALLEL DO + double precision :: norm_cas + norm_cas = 0d0 + do i = 1, N_det_ref + norm_cas += psi_ref_coef(i,1)**2 + end do norm = 0d0 + t = 0d0 + do j=1, size(X) + t = t + X_new(j) * X_new(j) + end do + + x_new = x_new / sqrt(norm_cas + t) + do j=1, size(X) norm += (X_new(j) - X(j))**2 x(j) = x_new(j) end do - + !print *, "NORM X_new", t + if(mod(k, 1000) == 0) print *, "residu ", k, norm - if(norm < 1d-9) exit + if(norm < 1d-16) exit end do print *, "CONVERGENCE : ", norm From 1157e22fab6dec2a06cba15d81d4fffce7e3e8a1 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 4 Jul 2016 18:01:04 +0200 Subject: [PATCH 039/216] Periodic table up to Xe --- ocaml/Element.ml | 219 ++++++++++++++++++++++++++++++++++++++-------- ocaml/Element.mli | 1 + 2 files changed, 183 insertions(+), 37 deletions(-) diff --git a/ocaml/Element.ml b/ocaml/Element.ml index 6bc2de4e..df85663f 100644 --- a/ocaml/Element.ml +++ b/ocaml/Element.ml @@ -9,6 +9,7 @@ type t = |Li|Be |B |C |N |O |F |Ne |Na|Mg |Al|Si|P |S |Cl|Ar |K |Ca|Sc|Ti|V |Cr|Mn|Fe|Co|Ni|Cu|Zn|Ga|Ge|As|Se|Br|Kr +|Rb|Sr|Y |Zr|Nb|Mo|Tc|Ru|Rh|Pd|Ag|Cd|In|Sn|Sb|Te|I |Xe with sexp let of_string x = @@ -50,6 +51,24 @@ let of_string x = | "Se" | "Selenium" -> Se | "Br" | "Bromine" -> Br | "Kr" | "Krypton" -> Kr +| "Rb" | "Rubidium" -> Rb +| "Sr" | "Strontium" -> Sr +| "Y" | "Yttrium" -> Y +| "Zr" | "Zirconium" -> Zr +| "Nb" | "Niobium" -> Nb +| "Mo" | "Molybdenum" -> Mo +| "Tc" | "Technetium" -> Tc +| "Ru" | "Ruthenium" -> Ru +| "Rh" | "Rhodium" -> Rh +| "Pd" | "Palladium" -> Pd +| "Ag" | "Silver" -> Ag +| "Cd" | "Cadmium" -> Cd +| "In" | "Indium" -> In +| "Sn" | "Tin" -> Sn +| "Sb" | "Antimony" -> Sb +| "Te" | "Tellurium" -> Te +| "I" | "Iodine" -> I +| "Xe" | "Xenon" -> Xe | x -> raise (ElementError ("Element "^x^" unknown")) @@ -91,6 +110,24 @@ let to_string = function | Se -> "Se" | Br -> "Br" | Kr -> "Kr" +| Rb -> "Rb" +| Sr -> "Sr" +| Y -> "Y" +| Zr -> "Zr" +| Nb -> "Nb" +| Mo -> "Mo" +| Tc -> "Tc" +| Ru -> "Ru" +| Rh -> "Rh" +| Pd -> "Pd" +| Ag -> "Ag" +| Cd -> "Cd" +| In -> "In" +| Sn -> "Sn" +| Sb -> "Sb" +| Te -> "Te" +| I -> "I" +| Xe -> "Xe" let to_long_string = function @@ -131,6 +168,24 @@ let to_long_string = function | Se -> "Selenium" | Br -> "Bromine" | Kr -> "Krypton" +| Rb -> "Rubidium" +| Sr -> "Strontium" +| Y -> "Yttrium" +| Zr -> "Zirconium" +| Nb -> "Niobium" +| Mo -> "Molybdenum" +| Tc -> "Technetium" +| Ru -> "Ruthenium" +| Rh -> "Rhodium" +| Pd -> "Palladium" +| Ag -> "Silver" +| Cd -> "Cadmium" +| In -> "Indium" +| Sn -> "Tin" +| Sb -> "Antimony" +| Te -> "Tellurium" +| I -> "Iodine" +| Xe -> "Xenon" let to_charge c = @@ -172,47 +227,83 @@ let to_charge c = | Se -> 34 | Br -> 35 | Kr -> 36 + | Rb -> 37 + | Sr -> 38 + | Y -> 39 + | Zr -> 40 + | Nb -> 41 + | Mo -> 42 + | Tc -> 43 + | Ru -> 44 + | Rh -> 45 + | Pd -> 46 + | Ag -> 47 + | Cd -> 48 + | In -> 49 + | Sn -> 50 + | Sb -> 51 + | Te -> 52 + | I -> 53 + | Xe -> 54 in Charge.of_int result let of_charge c = match (Charge.to_int c) with -| 0 -> X -| 1 -> H -| 2 -> He -| 3 -> Li -| 4 -> Be -| 5 -> B -| 6 -> C -| 7 -> N -| 8 -> O -| 9 -> F -| 10 -> Ne -| 11 -> Na -| 12 -> Mg -| 13 -> Al -| 14 -> Si -| 15 -> P -| 16 -> S -| 17 -> Cl -| 18 -> Ar -| 19 -> K -| 20 -> Ca -| 21 -> Sc -| 22 -> Ti -| 23 -> V -| 24 -> Cr -| 25 -> Mn -| 26 -> Fe -| 27 -> Co -| 28 -> Ni -| 29 -> Cu -| 30 -> Zn -| 31 -> Ga -| 32 -> Ge -| 33 -> As -| 34 -> Se -| 35 -> Br -| 36 -> Kr +| 0 -> X +| 1 -> H +| 2 -> He +| 3 -> Li +| 4 -> Be +| 5 -> B +| 6 -> C +| 7 -> N +| 8 -> O +| 9 -> F +| 10 -> Ne +| 11 -> Na +| 12 -> Mg +| 13 -> Al +| 14 -> Si +| 15 -> P +| 16 -> S +| 17 -> Cl +| 18 -> Ar +| 19 -> K +| 20 -> Ca +| 21 -> Sc +| 22 -> Ti +| 23 -> V +| 24 -> Cr +| 25 -> Mn +| 26 -> Fe +| 27 -> Co +| 28 -> Ni +| 29 -> Cu +| 30 -> Zn +| 31 -> Ga +| 32 -> Ge +| 33 -> As +| 34 -> Se +| 35 -> Br +| 36 -> Kr +| 37 -> Rb +| 38 -> Sr +| 39 -> Y +| 40 -> Zr +| 41 -> Nb +| 42 -> Mo +| 43 -> Tc +| 44 -> Ru +| 45 -> Rh +| 46 -> Pd +| 47 -> Ag +| 48 -> Cd +| 49 -> In +| 50 -> Sn +| 51 -> Sb +| 52 -> Te +| 53 -> I +| 54 -> Xe | x -> raise (ElementError ("Element of charge "^(string_of_int x)^" unknown")) @@ -255,6 +346,24 @@ let covalent_radius x = | Se -> 0.70 | Br -> 1.24 | Kr -> 1.91 + | Rb -> 2.20 + | Sr -> 1.95 + | Y -> 1.90 + | Zr -> 1.75 + | Nb -> 1.64 + | Mo -> 1.54 + | Tc -> 1.47 + | Ru -> 1.46 + | Rh -> 1.42 + | Pd -> 1.39 + | Ag -> 1.45 + | Cd -> 1.44 + | In -> 1.42 + | Sn -> 1.39 + | Sb -> 1.39 + | Te -> 1.38 + | I -> 1.39 + | Xe -> 1.40 in Units.angstrom_to_bohr *. (result x) |> Positive_float.of_float @@ -298,6 +407,24 @@ let vdw_radius x = | Se -> 1.70 | Br -> 2.10 | Kr -> 1.70 + | Rb -> 3.03 + | Sr -> 2.49 + | Y -> 0. + | Zr -> 0. + | Nb -> 0. + | Mo -> 0. + | Tc -> 0. + | Ru -> 0. + | Rh -> 0. + | Pd -> 1.63 + | Ag -> 1.72 + | Cd -> 1.58 + | In -> 1.93 + | Sn -> 2.17 + | Sb -> 2.06 + | Te -> 2.06 + | I -> 1.98 + | Xe -> 2.16 in Units.angstrom_to_bohr *. (result x) |> Positive_float.of_float @@ -341,6 +468,24 @@ let mass x = | Se -> 78.96 | Br -> 79.904 | Kr -> 83.80 + | Rb -> 85.4678 + | Sr -> 87.62 + | Y -> 88.90584 + | Zr -> 91.224 + | Nb -> 92.90637 + | Mo -> 95.95 + | Tc -> 98. + | Ru -> 101.07 + | Rh -> 102.90550 + | Pd -> 106.42 + | Ag -> 107.8682 + | Cd -> 112.414 + | In -> 114.818 + | Sn -> 118.710 + | Sb -> 121.760 + | Te -> 127.60 + | I -> 126.90447 + | Xe -> 131.293 in result x |> Positive_float.of_float diff --git a/ocaml/Element.mli b/ocaml/Element.mli index 8d9862c9..5edfdf31 100644 --- a/ocaml/Element.mli +++ b/ocaml/Element.mli @@ -6,6 +6,7 @@ type t = |Li|Be |B |C |N |O |F |Ne |Na|Mg |Al|Si|P |S |Cl|Ar |K |Ca|Sc|Ti|V |Cr|Mn|Fe|Co|Ni|Cu|Zn|Ga|Ge|As|Se|Br|Kr +|Rb|Sr|Y |Zr|Nb|Mo|Tc|Ru|Rh|Pd|Ag|Cd|In|Sn|Sb|Te|I |Xe with sexp (** String conversion functions *) From 1aeaa392bb109bcc4c5afbd35d60dc895537701a Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 4 Jul 2016 18:26:08 +0200 Subject: [PATCH 040/216] Added Trouiller-Martins Ag and Au pseudos --- data/pseudo/tm | 32 ++++++++++++++++++++++++++++++++ data/pseudo/tn_df | 23 ++++++++++++++++++++++- src/Utils/fortran_mmap.c | 4 ++-- 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 data/pseudo/tm diff --git a/data/pseudo/tm b/data/pseudo/tm new file mode 100644 index 00000000..531445f8 --- /dev/null +++ b/data/pseudo/tm @@ -0,0 +1,32 @@ +Ag GEN 36 2 +4 +11.074 1 1.712 +-166.201 2 1.391 +255.676 2 1.194 +-91.757 2 1.033 +3 +11.074 1 0.897 +-22.6472 2 1.226 +16.8557 2 0.9789 +4 +9.524 1 12.668 +227.659 2 1.662 +-363.576 2 1.4 +150.286 2 1.205 + +Au GEN 68 2 +4 +10.881 1 2.286 +-97.386 2 1.088 +270.134 2 1.267 +-171.733 2 1.499 +3 +10.721 1 1.38 +-63.222 2 1.111 +60.634 2 0.987 +4 +9.383 1 11. +225.822 2 1.66 +286.233 2 1.342 +-497.561 2 1.437 + diff --git a/data/pseudo/tn_df b/data/pseudo/tn_df index 2ba941be..988312b0 100644 --- a/data/pseudo/tn_df +++ b/data/pseudo/tn_df @@ -780,6 +780,27 @@ Ar GEN 10 2 -1386.79918148 2 4.23753203 1350.57102634 2 6.12344921 - +Ag GEN 36 2 + 6 + 11.00000000 1 7.02317516 + 178.71479273 2 1.36779344 + -206.54166000 2 1.85990342 + 92.80009949 2 2.70385827 + -91.80009949 2 1.21149868 + 77.25492677 3 2.46247055 + 6 + -19159.46923372 2 2.56205947 + 19178.09022506 2 3.28075183 + -19956.12207989 2 3.86486918 + 12405.48540805 2 2.42437953 + -8569.95659418 2 5.14643113 + 16121.59197935 2 4.79642660 + 6 + -1054.66284551 2 1.92427691 + 1072.38275494 2 1.94184452 + -1.15533162 2 27.95704514 + 88.48945385 2 1.25545336 + -0.36033231 2 10.04954095 + -85.97371403 2 1.49011553 diff --git a/src/Utils/fortran_mmap.c b/src/Utils/fortran_mmap.c index 2748dcba..eee8337e 100644 --- a/src/Utils/fortran_mmap.c +++ b/src/Utils/fortran_mmap.c @@ -22,7 +22,7 @@ void* mmap_fortran(char* filename, size_t bytes, int* file_descr, int read_only) perror("Error opening mmap file for reading"); exit(EXIT_FAILURE); } - map = mmap(0, bytes, PROT_READ, MAP_SHARED, fd, 0); + map = mmap(NULL, bytes, PROT_READ, MAP_SHARED, fd, 0); } else { @@ -49,7 +49,7 @@ void* mmap_fortran(char* filename, size_t bytes, int* file_descr, int read_only) exit(EXIT_FAILURE); } - map = mmap(0, bytes, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + map = mmap(NULL, bytes, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); } if (map == MAP_FAILED) { From e319cb7f1d4f7761fa223988971983a362018b96 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 6 Jul 2016 11:28:52 +0200 Subject: [PATCH 041/216] ref-dependent amplitudes --- plugins/MRCC_Utils/mrcc_utils.irp.f | 59 +++++++++++++++++++++++------ plugins/mrcepa0/dressing.irp.f | 10 +++-- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index bf5b7694..513e7d09 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -687,18 +687,19 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] integer, external :: searchDet, unsortedSearchDet integer(bit_kind) :: myDet(N_int, 2), myMask(N_int, 2) integer :: N, INFO, AtA_size, r1, r2 - double precision , allocatable:: AtB(:), AtA_val(:), A_val(:,:), x(:), x_new(:), A_val_mwen(:) + double precision , allocatable:: B(:), AtB(:), AtA_val(:), A_val(:,:), x(:), x_new(:), A_val_mwen(:) double precision :: t, norm, cx integer, allocatable :: A_ind(:,:), lref(:), AtA_ind(:), A_ind_mwen(:), col_shortcut(:), N_col(:) - + if(n_states /= 1) stop "n_states /= 1" + nex = hh_shortcut(hh_shortcut(0)+1)-1 print *, "TI", nex, N_det_non_ref allocate(A_ind(N_det_ref+1, nex), A_val(N_det_ref+1, nex)) allocate(AtA_ind(N_det_ref * nex), AtA_val(N_det_ref * nex)) !!!!! MAY BE TOO SMALL !!!!!!!! allocate(x(nex), AtB(nex)) allocate(A_val_mwen(nex), A_ind_mwen(nex)) - allocate(N_col(nex), col_shortcut(nex)) + allocate(N_col(nex), col_shortcut(nex), B(N_det_non_ref)) A_val = 0d0 A_ind = 0 !$OMP PARALLEL DO schedule(static,10) default(none) shared(psi_non_ref, hh_exists, pp_exists, N_int, A_val, A_ind) & @@ -746,7 +747,7 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] !$OMP shared(col_shortcut, N_col, AtB, AtA_size, AtA_val, AtA_ind) do at_row = 1, nex wk = 0 - if(mod(at_row, 1000) == 0) print *, "AtA", at_row, "/", nex + if(mod(at_row, 10000) == 0) print *, "AtA", at_row, "/", nex do i=1,N_det_ref if(A_ind(i, at_row) == 0) exit AtB(at_row) = AtB(at_row) + psi_non_ref_coef(A_ind(i, at_row), 1) * A_val(i, at_row) @@ -803,12 +804,12 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] enddo do k=0,100000 - ! df $ fg OMP PARALLEL DO default(shared) + !$OMP PARALLEL DO default(shared) do i=1,nex x_new(i) = AtB(i) enddo - ! sdf $OMP PARALLEL DO default(shared) private(cx, i) + !$OMP PARALLEL DO default(shared) private(cx, i) do a_col = 1, nex cx = 0d0 do i=col_shortcut(a_col), col_shortcut(a_col) + N_col(a_col) - 1 @@ -816,13 +817,13 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] end do x_new(a_col) += cx end do - ! sdf $OMP END PARALLEL DO + !$OMP END PARALLEL DO double precision :: norm_cas norm_cas = 0d0 do i = 1, N_det_ref norm_cas += psi_ref_coef(i,1)**2 end do - + norm = 0d0 t = 0d0 @@ -830,15 +831,37 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] t = t + X_new(j) * X_new(j) end do - x_new = x_new / sqrt(norm_cas + t) - + !t = (1d0 - norm_cas) / t + !x_new = x_new * sqrt(t) + !!!!!!!!!!!!!! + !B = 0d0 + !do i=1, nex + ! do j=1, N_det_ref + ! if(A_ind(j, i) == 0) exit + ! B(A_ind(j, i)) += A_val(j, i) * x(i) + ! end do + !end do + !t = 0d0 + !do i=1, size(B) + ! t += B(i)**2 + !end do + !print *, "NORMT", sqrt(t + norm_cas) + !x_new = x_new / sqrt(t + norm_cas) +!!!!!!!!!! + + t = (1d0 / norm_cas - 1d0) / t + x_new = x_new * sqrt(t) + do j=1, size(X) norm += (X_new(j) - X(j))**2 x(j) = x_new(j) end do - !print *, "NORM X_new", t - if(mod(k, 1000) == 0) print *, "residu ", k, norm + + if(mod(k, 50) == 0) then + print *, "residu ", k, norm, "norm t", sqrt(t) + end if + if(norm < 1d-16) exit end do print *, "CONVERGENCE : ", norm @@ -898,6 +921,18 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] END_PROVIDER +double precision function get_dij_index(II, i, Nint) + integer, intent(in) :: II, i, Nint + double precision, external :: get_dij + + if(dabs(psi_ref_coef(II, 1)) > 1d-1) then + get_dij_index = psi_non_ref_coef(i, 1) / psi_ref_coef(II, 1) + else + get_dij_index = get_dij(psi_ref(1,1,II), psi_non_ref(1,1,i), Nint) + end if +end function + + double precision function get_dij(det1, det2, Nint) use bitmasks implicit none diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 74a572f5..e4b63208 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -86,7 +86,7 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe integer, allocatable :: idx_microlist(:), N_microlist(:), ptr_microlist(:), idx_microlist_zero(:) integer :: mobiles(2), smallerlist logical, external :: detEq, is_generable - double precision, external :: get_dij + double precision, external :: get_dij, get_dij_index leng = max(N_det_generators, N_det_non_ref) allocate(miniList(Nint, 2, leng), tq(Nint,2,n_selected), idx_minilist(leng), hij_cache(N_det_non_ref)) @@ -225,7 +225,9 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe do i_state=1,N_states - dIk(i_state) = get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,idx_alpha(k_sd)), N_int) !!hIk * lambda_mrcc(i_state,idx_alpha(k_sd)) + dIK(i_state) = get_dij_index(i_I, idx_alpha(k_sd), Nint) + !dIk(i_state) = get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,idx_alpha(k_sd)), N_int) !!hIk * lambda_mrcc(i_state,idx_alpha(k_sd)) + !dIk(i_state) = psi_non_ref_coef(idx_alpha(k_sd), i_state) / psi_ref_coef(i_I, i_state) enddo @@ -264,7 +266,9 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe hIl = hij_mrcc(idx_alpha(l_sd),i_I) ! call i_h_j(psi_ref(1,1,i_I),psi_non_ref(1,1,idx_alpha(l_sd)),Nint,hIl) do i_state=1,N_states - dka(i_state) = get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,idx_alpha(l_sd)), N_int) * phase * phase2 !hIl * lambda_mrcc(i_state,idx_alpha(l_sd)) * phase * phase2 + dka(i_state) = get_dij_index(i_I, idx_alpha(l_sd), N_int) * phase * phase2 + !dka(i_state) = get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,idx_alpha(l_sd)), N_int) * phase * phase2 !hIl * lambda_mrcc(i_state,idx_alpha(l_sd)) * phase * phase2 + !dka(i_state) = psi_non_ref_coef(idx_alpha(l_sd), i_state) / psi_ref_coef(i_I, i_state) * phase * phase2 enddo endif From 6481083bc3c04d380029fa06175c1bc4c6b91a58 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 6 Jul 2016 15:43:21 +0200 Subject: [PATCH 042/216] N_states > 1 --- plugins/MRCC_Utils/mrcc_utils.irp.f | 351 +++++++------------------- plugins/mrcepa0/dressing.irp.f | 43 ++-- plugins/mrcepa0/dressing_slave.irp.f | 11 +- plugins/mrcepa0/mrcepa0_general.irp.f | 43 +--- 4 files changed, 114 insertions(+), 334 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 513e7d09..6c2eb133 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -1,93 +1,11 @@ use bitmasks BEGIN_PROVIDER [ integer, mrmode ] -&BEGIN_PROVIDER [ logical, old_lambda ] -&BEGIN_PROVIDER [ logical, no_mono_dressing ] - implicit none - CHARACTER(len=255) :: test - CALL get_environment_variable("OLD_LAMBDA", test) - old_lambda = trim(test) /= "" .and. trim(test) /= "0" - CALL get_environment_variable("NO_MONO_DRESSING", test) - no_mono_dressing = trim(test) /= "" .and. trim(test) /= "0" - print *, "old", old_lambda, "mono", no_mono_dressing mrmode = 0 END_PROVIDER - -BEGIN_PROVIDER [ double precision, lambda_mrcc_old, (N_states,psi_det_size) ] -&BEGIN_PROVIDER [ integer, lambda_mrcc_pt2_old, (0:psi_det_size) ] -&BEGIN_PROVIDER [ integer, lambda_mrcc_pt3_old, (0:psi_det_size) ] - implicit none - BEGIN_DOC - cm/ or perturbative 1/Delta_E(m) - END_DOC - integer :: i,k - double precision :: ihpsi_current(N_states) - integer :: i_pert_count - double precision :: hii, lambda_pert - integer :: N_lambda_mrcc_pt2, N_lambda_mrcc_pt3 - double precision, parameter :: x = 2.d0 - double precision :: nurm - i_pert_count = 0 - lambda_mrcc_old = 0.d0 - N_lambda_mrcc_pt2 = 0 - N_lambda_mrcc_pt3 = 0 - lambda_mrcc_pt2_old(0) = 0 - lambda_mrcc_pt3_old(0) = 0 - if(N_states > 1) stop "old lambda N_states == 1" - nurm = 0d0 - do i=1,N_det_ref - nurm += psi_ref_coef(i,1)**2 - end do - - do i=1,N_det_non_ref - call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef, N_int, N_det_ref, & - size(psi_ref_coef,1), N_states,ihpsi_current) - call i_H_j(psi_non_ref(1,1,i),psi_non_ref(1,1,i),N_int,hii) - do k=1,N_states - if (ihpsi_current(k) == 0.d0) then - ihpsi_current(k) = 1.d-32 - endif - lambda_mrcc_old(k,i) = psi_non_ref_coef(i,k)/ihpsi_current(k) - !if ( dabs(psi_non_ref_coef(i,k)*ihpsi_current(k)) < 1.d-5 .or. lambda_mrcc_old(k,i) > 0d0) then - if ( dabs(ihpsi_current(k))*sqrt(psi_non_ref_coef(i,k)**2 / nurm) < 1.d-5 .or. lambda_mrcc_old(k,i) > 0d0) then - i_pert_count += 1 - lambda_mrcc_old(k,i) = 0.d0 - if (lambda_mrcc_pt2_old(N_lambda_mrcc_pt2) /= i) then - N_lambda_mrcc_pt2 += 1 - lambda_mrcc_pt2_old(N_lambda_mrcc_pt2) = i - endif - else - if (lambda_mrcc_pt3_old(N_lambda_mrcc_pt3) /= i) then - N_lambda_mrcc_pt3 += 1 - lambda_mrcc_pt3_old(N_lambda_mrcc_pt3) = i - endif - endif -! lambda_pert = 1.d0 / (psi_ref_energy_diagonalized(k)-hii) -! if((ihpsi_current(k) * lambda_pert) < 0.5d0 * psi_non_ref_coef_restart(i,k) ) then -! lambda_mrcc_old(k,i) = 0.d0 -! endif - - if (lambda_mrcc_old(k,i) > x) then - lambda_mrcc_old(k,i) = x - else if (lambda_mrcc_old(k,i) < -x) then - lambda_mrcc_old(k,i) = -x - endif - enddo - enddo - lambda_mrcc_pt2_old(0) = N_lambda_mrcc_pt2 - lambda_mrcc_pt3_old(0) = N_lambda_mrcc_pt3 - - print*,'N_det_non_ref = ',N_det_non_ref - print*,'Number of ignored determinants = ',i_pert_count - print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) - print*,'lambda min/max = ',maxval(dabs(lambda_mrcc_old)), minval(dabs(lambda_mrcc_old)) - -END_PROVIDER - - - BEGIN_PROVIDER [ double precision, lambda_mrcc, (N_states,psi_det_size) ] + BEGIN_PROVIDER [ double precision, lambda_mrcc, (N_states, N_det_non_ref) ] &BEGIN_PROVIDER [ integer, lambda_mrcc_pt2, (0:psi_det_size) ] &BEGIN_PROVIDER [ integer, lambda_mrcc_pt3, (0:psi_det_size) ] implicit none @@ -99,49 +17,41 @@ END_PROVIDER integer :: i_pert_count double precision :: hii, lambda_pert integer :: N_lambda_mrcc_pt2, N_lambda_mrcc_pt3 - integer :: histo(200), j - histo = 0 - if(old_lambda) then - lambda_mrcc = lambda_mrcc_old - lambda_mrcc_pt2 = lambda_mrcc_pt2_old - lambda_mrcc_pt3 = lambda_mrcc_pt3_old - else - i_pert_count = 0 - lambda_mrcc = 0.d0 - N_lambda_mrcc_pt2 = 0 - N_lambda_mrcc_pt3 = 0 - lambda_mrcc_pt2(0) = 0 - lambda_mrcc_pt3(0) = 0 + i_pert_count = 0 + lambda_mrcc = 0.d0 + N_lambda_mrcc_pt2 = 0 + N_lambda_mrcc_pt3 = 0 + lambda_mrcc_pt2(0) = 0 + lambda_mrcc_pt3(0) = 0 - do i=1,N_det_non_ref - call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef, N_int, N_det_ref,& - size(psi_ref_coef,1), N_states,ihpsi_current) - call i_H_j(psi_non_ref(1,1,i),psi_non_ref(1,1,i),N_int,hii) - do k=1,N_states - if (ihpsi_current(k) == 0.d0) then - ihpsi_current(k) = 1.d-32 + do i=1,N_det_non_ref + call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef, N_int, N_det_ref,& + size(psi_ref_coef,1), N_states,ihpsi_current) + call i_H_j(psi_non_ref(1,1,i),psi_non_ref(1,1,i),N_int,hii) + do k=1,N_states + if (ihpsi_current(k) == 0.d0) then + ihpsi_current(k) = 1.d-32 + endif + lambda_mrcc(k,i) = min(-1.d-32,psi_non_ref_coef(i,k)/ihpsi_current(k) ) + lambda_pert = 1.d0 / (psi_ref_energy_diagonalized(k)-hii) + if (lambda_pert / lambda_mrcc(k,i) < 0.5d0) then + i_pert_count += 1 + lambda_mrcc(k,i) = 0.d0 + if (lambda_mrcc_pt2(N_lambda_mrcc_pt2) /= i) then + N_lambda_mrcc_pt2 += 1 + lambda_mrcc_pt2(N_lambda_mrcc_pt2) = i endif - lambda_mrcc(k,i) = min(-1.d-32,psi_non_ref_coef(i,k)/ihpsi_current(k) ) - lambda_pert = 1.d0 / (psi_ref_energy_diagonalized(k)-hii) - if (lambda_pert / lambda_mrcc(k,i) < 0.5d0) then - i_pert_count += 1 - lambda_mrcc(k,i) = 0.d0 - if (lambda_mrcc_pt2(N_lambda_mrcc_pt2) /= i) then - N_lambda_mrcc_pt2 += 1 - lambda_mrcc_pt2(N_lambda_mrcc_pt2) = i - endif - else - if (lambda_mrcc_pt3(N_lambda_mrcc_pt3) /= i) then - N_lambda_mrcc_pt3 += 1 - lambda_mrcc_pt3(N_lambda_mrcc_pt3) = i - endif + else + if (lambda_mrcc_pt3(N_lambda_mrcc_pt3) /= i) then + N_lambda_mrcc_pt3 += 1 + lambda_mrcc_pt3(N_lambda_mrcc_pt3) = i endif - enddo + endif enddo - lambda_mrcc_pt2(0) = N_lambda_mrcc_pt2 - lambda_mrcc_pt3(0) = N_lambda_mrcc_pt3 - end if + enddo + lambda_mrcc_pt2(0) = N_lambda_mrcc_pt2 + lambda_mrcc_pt3(0) = N_lambda_mrcc_pt3 print*,'N_det_non_ref = ',N_det_non_ref print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) print*,'lambda max = ',maxval(dabs(lambda_mrcc)) @@ -149,44 +59,6 @@ END_PROVIDER END_PROVIDER -! BEGIN_PROVIDER [ double precision, lambda_mrcc, (N_states,psi_det_size) ] -! &BEGIN_PROVIDER [ integer, lambda_mrcc_pt2, (0:psi_det_size) ] -! &BEGIN_PROVIDER [ integer, lambda_mrcc_pt3, (0:psi_det_size) ] -! implicit none -! BEGIN_DOC -! ! cm/ or perturbative 1/Delta_E(m) -! END_DOC -! integer :: i,ii,k -! double precision :: ihpsi_current(N_states) -! integer :: i_pert_count -! double precision :: hii, lambda_pert, phase -! integer :: N_lambda_mrcc_pt2, N_lambda_mrcc_pt3, degree -! integer :: exc(N_int, 2) -! histo = 0 -! -! i_pert_count = 0 -! lambda_mrcc = 0.d0 -! N_lambda_mrcc_pt2 = 0 -! N_lambda_mrcc_pt3 = 0 -! lambda_mrcc_pt2(0) = 0 -! lambda_mrcc_pt3(0) = 0 -! -! do ii=1, N_det_ref -! do i=1,N_det_non_ref -! call get_excitation(psi_ref(1,1,II), psi_non_ref(1,1,i), exc, degree, phase, N_int) -! if(degree == -1) cycle -! call i_H_j(psi_non_ref(1,1,ii),psi_non_ref(1,1,i),N_int,hii) -! -! -! lambda_mrcc_pt2(0) = N_lambda_mrcc_pt2 -! lambda_mrcc_pt3(0) = N_lambda_mrcc_pt3 -! -! print*,'N_det_non_ref = ',N_det_non_ref -! print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) -! print*,'lambda max = ',maxval(dabs(lambda_mrcc)) -! print*,'Number of ignored determinants = ',i_pert_count -! -! END_PROVIDER BEGIN_PROVIDER [ double precision, hij_mrcc, (N_det_non_ref,N_det_ref) ] @@ -362,16 +234,6 @@ logical function is_generable(det1, det2, Nint) return end if if(degree > 2) stop "?22??" - !!!!! -! call dec_exc(exc, h1, h2, p1, p2) -! f = searchExc(toutmoun(1,1), (/h1, h2, p1, p2/), hh_shortcut(hh_shortcut(0)+1)-1) -! !print *, toutmoun(:,1), hh_shortcut(hh_shortcut(0)+1)-1, (/h1, h2, p1, p2/) -! if(f /= -1) then -! is_generable = .true. -! if(.not. excEq(toutmoun(1,f), (/h1, h2, p1, p2/))) stop "????" -! end if -! ! print *, f -! return call decode_exc_int2(exc,degree,h1,p1,h2,p2,s1,s2) @@ -680,10 +542,10 @@ END_PROVIDER END_PROVIDER -BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] +BEGIN_PROVIDER [ double precision, dIj_unique, (hh_shortcut(hh_shortcut(0)+1)-1, N_states) ] implicit none logical :: ok - integer :: i, j, k, II, pp, hh, ind, wk, nex, a_col, at_row + integer :: i, j, k, s, II, pp, hh, ind, wk, nex, a_col, at_row integer, external :: searchDet, unsortedSearchDet integer(bit_kind) :: myDet(N_int, 2), myMask(N_int, 2) integer :: N, INFO, AtA_size, r1, r2 @@ -691,22 +553,36 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] double precision :: t, norm, cx integer, allocatable :: A_ind(:,:), lref(:), AtA_ind(:), A_ind_mwen(:), col_shortcut(:), N_col(:) - if(n_states /= 1) stop "n_states /= 1" + nex = hh_shortcut(hh_shortcut(0)+1)-1 print *, "TI", nex, N_det_non_ref allocate(A_ind(N_det_ref+1, nex), A_val(N_det_ref+1, nex)) - allocate(AtA_ind(N_det_ref * nex), AtA_val(N_det_ref * nex)) !!!!! MAY BE TOO SMALL !!!!!!!! + allocate(AtA_ind(N_det_ref * nex), AtA_val(N_det_ref * nex)) !!!!! MAY BE TOO SMALL ? !!!!!!!! allocate(x(nex), AtB(nex)) allocate(A_val_mwen(nex), A_ind_mwen(nex)) allocate(N_col(nex), col_shortcut(nex), B(N_det_non_ref)) + allocate (x_new(nex)) + + do s = 1, N_states + A_val = 0d0 A_ind = 0 + AtA_ind = 0 + AtA_val = 0d0 + x = 0d0 + AtB = 0d0 + A_val_mwen = 0d0 + A_ind_mwen = 0 + N_col = 0 + col_shortcut = 0 + B = 0d0 + x_new = 0d0 + !$OMP PARALLEL DO schedule(static,10) default(none) shared(psi_non_ref, hh_exists, pp_exists, N_int, A_val, A_ind) & - !$OMP shared(hh_shortcut, psi_ref_coef, N_det_non_ref, psi_non_ref_sorted, psi_non_ref_sorted_idx, psi_ref, N_det_ref) & + !$OMP shared(s, hh_shortcut, psi_ref_coef, N_det_non_ref, psi_non_ref_sorted, psi_non_ref_sorted_idx, psi_ref, N_det_ref) & !$OMP private(lref, pp, II, ok, myMask, myDet, ind, wk) do hh = 1, hh_shortcut(0) - !print *, hh, "/", hh_shortcut(0) do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 allocate(lref(N_det_non_ref)) lref = 0 @@ -715,12 +591,8 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] if(.not. ok) cycle call apply_particle(myMask, pp_exists(1, pp), myDet, ok, N_int) if(.not. ok) cycle - !ind = unsortedSearchDet(psi_non_ref(1,1,1), myDet, N_det_non_ref, N_int) ind = searchDet(psi_non_ref_sorted(1,1,1), myDet(1,1), N_det_non_ref, N_int) if(ind /= -1) then - !iwk = wk+1 - !A_val(wk, pp) = psi_ref_coef(II, 1) - !A_ind(wk, pp) = psi_non_ref_sorted_idx(ind) lref(psi_non_ref_sorted_idx(ind)) = II end if end do @@ -728,7 +600,7 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] do i=1, N_det_non_ref if(lref(i) /= 0) then wk += 1 - A_val(wk, pp) = psi_ref_coef(lref(i), 1) + A_val(wk, pp) = psi_ref_coef(lref(i), s) A_ind(wk, pp) = i end if end do @@ -744,13 +616,13 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] N_col = 0 !$OMP PARALLEL DO schedule(dynamic, 100) default(none) shared(k, psi_non_ref_coef, A_ind, A_val, x, N_det_ref, nex, N_det_non_ref) & !$OMP private(at_row, a_col, t, i, r1, r2, wk, A_ind_mwen, A_val_mwen) & - !$OMP shared(col_shortcut, N_col, AtB, AtA_size, AtA_val, AtA_ind) + !$OMP shared(col_shortcut, N_col, AtB, AtA_size, AtA_val, AtA_ind, s) do at_row = 1, nex wk = 0 if(mod(at_row, 10000) == 0) print *, "AtA", at_row, "/", nex do i=1,N_det_ref if(A_ind(i, at_row) == 0) exit - AtB(at_row) = AtB(at_row) + psi_non_ref_coef(A_ind(i, at_row), 1) * A_val(i, at_row) + AtB(at_row) = AtB(at_row) + psi_non_ref_coef(A_ind(i, at_row), s) * A_val(i, at_row) end do do a_col = 1, nex t = 0d0 @@ -769,15 +641,11 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] end do if(a_col == at_row) then - t = (t + 1d0)! / 2d0 - !print *, a_col, t-1d0 + t = (t + 1d0) end if if(t /= 0d0) then wk += 1 - !AtA_ind(1, wk) = at_row - !AtA_ind(2, wk) = a_col A_ind_mwen(wk) = a_col - !AtA_val(wk) = t A_val_mwen(wk) = t end if end do @@ -796,7 +664,6 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] x = AtB if(AtA_size > size(AtA_val)) stop "SIZA" print *, "ATA SIZE", ata_size - allocate (x_new(nex)) integer :: iproc, omp_get_thread_num iproc = omp_get_thread_num() do i=1,nex @@ -821,7 +688,7 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] double precision :: norm_cas norm_cas = 0d0 do i = 1, N_det_ref - norm_cas += psi_ref_coef(i,1)**2 + norm_cas += psi_ref_coef(i,s)**2 end do norm = 0d0 @@ -831,23 +698,6 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] t = t + X_new(j) * X_new(j) end do - !t = (1d0 - norm_cas) / t - !x_new = x_new * sqrt(t) - !!!!!!!!!!!!!! - !B = 0d0 - !do i=1, nex - ! do j=1, N_det_ref - ! if(A_ind(j, i) == 0) exit - ! B(A_ind(j, i)) += A_val(j, i) * x(i) - ! end do - !end do - !t = 0d0 - !do i=1, size(B) - ! t += B(i)**2 - !end do - !print *, "NORMT", sqrt(t + norm_cas) - !x_new = x_new / sqrt(t + norm_cas) -!!!!!!!!!! t = (1d0 / norm_cas - 1d0) / t x_new = x_new * sqrt(t) @@ -858,7 +708,7 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] end do - if(mod(k, 50) == 0) then + if(mod(k, 100) == 0) then print *, "residu ", k, norm, "norm t", sqrt(t) end if @@ -866,77 +716,50 @@ BEGIN_PROVIDER [ double precision, dIj, (hh_shortcut(hh_shortcut(0)+1)-1) ] end do print *, "CONVERGENCE : ", norm + dIj_unique(:size(X), s) = X(:) + -!do k=0,500 -! if(k == 1) print *, X(:10) -! x_new = 0d0 -! A_dense = 0d0 -! !!$OMP PARALLEL DO schedule(dynamic, 10) default(none) shared(k, psi_non_ref_coef, x_new, A_ind, A_val, x, N_det_ref, nex, N_det_non_ref) & -! !!$OMP private(a_col, t, i, cx) & -! !!$OMP firstprivate(A_dense) -! do at_row = 1, nex -! ! ! d DIR$ IVDEP -! cx = 0d0 -! do i=1,N_det_ref -! if(A_ind(i, at_row) == 0) exit -! if(k /= 0) A_dense(A_ind(i, at_row)) = A_val(i, at_row) -! cx = cx + psi_non_ref_coef(A_ind(i, at_row), 1) * A_val(i, at_row) -! !x_new(at_row) = x_new(at_row) + psi_non_ref_coef(A_ind(i, at_row), 1) * A_val(i, at_row) -! end do -! if(k == 0) then -! x_new(at_row) = cx -! cycle -! end if -! do a_col = 1, nex -! t = 0d0 -! do i = 1, N_det_ref -! if(A_ind(i, a_col) == 0) exit -! t = t - A_val(i, a_col) * A_dense(A_ind(i, a_col)) ! -= pcq I-A -! end do -! if(a_col == at_row) t = t + 1d0 -! cx = cx + t * x(a_col) -! !x_new(at_row) = x_new(at_row) + t * x(a_col) -! end do -! x_new(at_row) = cx -! do i=1,N_det_ref -! if(A_ind(i, at_row) == 0) exit -! A_dense(A_ind(i, at_row)) = 0d0 -! end do -! end do -! !!$OMP END PARALLEL DO + end do -! norm = 0d0 -! do j=1, size(X) -! norm += (X_new(j) - X(j))**2 -! X(j) = X_new(j) -! end do -! print *, "residu ", k, norm -! if(norm < 1d-10) exit -!end do -! - dIj(:size(X)) = X(:) - !print *, X print *, "done" END_PROVIDER -double precision function get_dij_index(II, i, Nint) - integer, intent(in) :: II, i, Nint - double precision, external :: get_dij +BEGIN_PROVIDER [ double precision, dij, (N_det_ref, N_det_non_ref, N_states) ] + integer :: s,i,j + print *, "computing amplitudes..." + do s=1, N_states + do i=1, N_det_non_ref + do j=1, N_det_ref + dij(j, i, s) = get_dij_index(j, i, s, N_int) + end do + end do + end do + print *, "done computing amplitudes" +END_PROVIDER - if(dabs(psi_ref_coef(II, 1)) > 1d-1) then - get_dij_index = psi_non_ref_coef(i, 1) / psi_ref_coef(II, 1) + + + +double precision function get_dij_index(II, i, s, Nint) + integer, intent(in) :: II, i, s, Nint + double precision, external :: get_dij + double precision :: HIi + + if(lambda_type == 0) then + get_dij_index = get_dij(psi_ref(1,1,II), psi_non_ref(1,1,i), s, Nint) else - get_dij_index = get_dij(psi_ref(1,1,II), psi_non_ref(1,1,i), Nint) + call i_h_j(psi_ref(1,1,II), psi_non_ref(1,1,i), Nint, HIi) + get_dij_index = HIi * lambda_mrcc(s, i) end if end function -double precision function get_dij(det1, det2, Nint) +double precision function get_dij(det1, det2, s, Nint) use bitmasks implicit none - integer, intent(in) :: Nint + integer, intent(in) :: s, Nint integer(bit_kind) :: det1(Nint, 2), det2(Nint, 2) integer :: degree, f, exc(0:2, 2, 2), t integer*2 :: h1, h2, p1, p2, s1, s2 @@ -976,7 +799,7 @@ double precision function get_dij(det1, det2, Nint) end if if(t /= -1) then - get_dij = dIj(t - 1 + hh_shortcut(f)) + get_dij = dIj_unique(t - 1 + hh_shortcut(f), s) end if end function diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index e4b63208..3a91f42e 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -6,7 +6,7 @@ use bitmasks &BEGIN_PROVIDER [ double precision, delta_ii_mrcc, (N_states, N_det_ref) ] use bitmasks implicit none - integer :: gen, h, p, i_state, n, t, i, h1, h2, p1, p2, s1, s2, iproc + integer :: gen, h, p, n, t, i, h1, h2, p1, p2, s1, s2, iproc integer(bit_kind) :: mask(N_int, 2), omask(N_int, 2) integer(bit_kind),allocatable :: buf(:,:,:) logical :: ok @@ -14,16 +14,16 @@ use bitmasks delta_ij_mrcc = 0d0 delta_ii_mrcc = 0d0 - i_state = 1 + print *, "Dij", dij(1,1,1) provide hh_shortcut psi_det_size! lambda_mrcc !$OMP PARALLEL DO default(none) schedule(dynamic) & !$OMP shared(psi_det_generators, N_det_generators, hh_exists, pp_exists, N_int, hh_shortcut) & - !$OMP shared(N_states, N_det_non_ref, N_det_ref, delta_ii_mrcc, delta_ij_mrcc) & + !$OMP shared(N_det_non_ref, N_det_ref, delta_ii_mrcc, delta_ij_mrcc) & !$OMP private(h, n, mask, omask, buf, ok, iproc) do gen= 1, N_det_generators allocate(buf(N_int, 2, N_det_non_ref)) iproc = omp_get_thread_num() + 1 - print *, gen, "/", N_det_generators + if(mod(gen, 10) == 0) print *, "mrcc ", gen, "/", N_det_generators do h=1, hh_shortcut(0) call apply_hole(psi_det_generators(1,1,gen), hh_exists(1, h), mask, ok, N_int) if(.not. ok) cycle @@ -36,7 +36,9 @@ use bitmasks if(n > N_det_non_ref) stop "MRCC..." end do n = n - 1 + if(n /= 0) call mrcc_part_dress(delta_ij_mrcc, delta_ii_mrcc,gen,n,buf,N_int,omask) + end do deallocate(buf) end do @@ -86,7 +88,8 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe integer, allocatable :: idx_microlist(:), N_microlist(:), ptr_microlist(:), idx_microlist_zero(:) integer :: mobiles(2), smallerlist logical, external :: detEq, is_generable - double precision, external :: get_dij, get_dij_index + !double precision, external :: get_dij, get_dij_index + leng = max(N_det_generators, N_det_non_ref) allocate(miniList(Nint, 2, leng), tq(Nint,2,n_selected), idx_minilist(leng), hij_cache(N_det_non_ref)) @@ -171,7 +174,6 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe idx_alpha(j) = idx_microlist_zero(idx_alpha(j)) end do - else call get_excitation_degree_vector(miniList,tq(1,1,i_alpha),degree_alpha,Nint,N_minilist,idx_alpha) do j=1,idx_alpha(0) @@ -184,7 +186,6 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe k_sd = idx_alpha(l_sd) call i_h_j(tq(1,1,i_alpha),psi_non_ref(1,1,idx_alpha(l_sd)),Nint,hij_cache(k_sd)) enddo - ! |I> do i_I=1,N_det_ref ! Find triples and quadruple grand parents @@ -199,7 +200,6 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe ! |alpha> do k_sd=1,idx_alpha(0) - ! Loop if lambda == 0 logical :: loop ! loop = .True. @@ -220,18 +220,16 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe ! ! - hIk = hij_mrcc(idx_alpha(k_sd),i_I) + !hIk = hij_mrcc(idx_alpha(k_sd),i_I) ! call i_h_j(psi_ref(1,1,i_I),psi_non_ref(1,1,idx_alpha(k_sd)),Nint,hIk) - do i_state=1,N_states - dIK(i_state) = get_dij_index(i_I, idx_alpha(k_sd), Nint) + dIK(i_state) = dij(i_I, idx_alpha(k_sd), i_state) !dIk(i_state) = get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,idx_alpha(k_sd)), N_int) !!hIk * lambda_mrcc(i_state,idx_alpha(k_sd)) !dIk(i_state) = psi_non_ref_coef(idx_alpha(k_sd), i_state) / psi_ref_coef(i_I, i_state) enddo - ! |l> = Exc(k -> alpha) |I> call get_excitation(psi_non_ref(1,1,idx_alpha(k_sd)),tq(1,1,i_alpha),exc,degree,phase,Nint) call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) @@ -239,7 +237,6 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe tmp_det(k,1) = psi_ref(k,1,i_I) tmp_det(k,2) = psi_ref(k,2,i_I) enddo - logical :: ok call apply_excitation(psi_ref(1,1,i_I), exc, tmp_det, ok, Nint) if(.not. ok) cycle @@ -249,7 +246,6 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe dka(i_state) = 0.d0 enddo do l_sd=k_sd+1,idx_alpha(0) - call get_excitation_degree(tmp_det,psi_non_ref(1,1,idx_alpha(l_sd)),degree,Nint) if (degree == 0) then @@ -266,7 +262,7 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe hIl = hij_mrcc(idx_alpha(l_sd),i_I) ! call i_h_j(psi_ref(1,1,i_I),psi_non_ref(1,1,idx_alpha(l_sd)),Nint,hIl) do i_state=1,N_states - dka(i_state) = get_dij_index(i_I, idx_alpha(l_sd), N_int) * phase * phase2 + dka(i_state) = dij(i_I, idx_alpha(l_sd), i_state) * phase * phase2 !dka(i_state) = get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,idx_alpha(l_sd)), N_int) * phase * phase2 !hIl * lambda_mrcc(i_state,idx_alpha(l_sd)) * phase * phase2 !dka(i_state) = psi_non_ref_coef(idx_alpha(l_sd), i_state) / psi_ref_coef(i_I, i_state) * phase * phase2 enddo @@ -279,7 +275,7 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe dIa(i_state) = dIa(i_state) + dIk(i_state) * dka(i_state) enddo enddo - + do i_state=1,N_states ci_inv(i_state) = psi_ref_coef_inv(i_I,i_state) enddo @@ -292,7 +288,6 @@ subroutine mrcc_part_dress(delta_ij_, delta_ii_,i_generator,n_selected,det_buffe enddo enddo call omp_set_lock( psi_ref_lock(i_I) ) - do i_state=1,N_states if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5)then do l_sd=1,idx_alpha(0) @@ -546,12 +541,12 @@ END_PROVIDER implicit none integer :: i,j,k double precision :: Hjk, Hki, Hij - double precision, external :: get_dij + !double precision, external :: get_dij integer i_state, degree provide lambda_mrcc dIj do i_state = 1, N_states - !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(no_mono_dressing,lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref) + !$OMP PARALLEL DO default(none) schedule(dynamic) private(j,k,Hjk,Hki,degree) shared(lambda_mrcc,i_state, N_det_non_ref,psi_ref, psi_non_ref,N_int,delta_cas,N_det_ref,dij) do i=1,N_det_ref do j=1,i call get_excitation_degree(psi_ref(1,1,i), psi_ref(1,1,j), degree, N_int) @@ -561,7 +556,7 @@ END_PROVIDER call i_h_j(psi_ref(1,1,j), psi_non_ref(1,1,k),N_int,Hjk) call i_h_j(psi_non_ref(1,1,k),psi_ref(1,1,i), N_int,Hki) - delta_cas(i,j,i_state) += Hjk * get_dij(psi_ref(1,1,i), psi_non_ref(1,1,k), N_int) ! * Hki * lambda_mrcc(i_state, k) + delta_cas(i,j,i_state) += Hjk * dij(i, k, i_state) ! * Hki * lambda_mrcc(i_state, k) !print *, Hjk * get_dij(psi_ref(1,1,i), psi_non_ref(1,1,k), N_int), Hki * get_dij(psi_ref(1,1,j), psi_non_ref(1,1,k), N_int) end do delta_cas(j,i,i_state) = delta_cas(i,j,i_state) @@ -659,7 +654,7 @@ end function integer, allocatable :: idx_sorted_bit(:) integer, external :: get_index_in_psi_det_sorted_bit, searchDet logical, external :: is_in_wavefunction, detEq - double precision, external :: get_dij + !double precision, external :: get_dij integer :: II, blok integer*8, save :: notf = 0 @@ -675,7 +670,7 @@ end function enddo ! To provide everything - contrib = get_dij(psi_ref(1,1,1), psi_non_ref(1,1,1), N_int) + contrib = dij(1, 1, 1) do i_state = 1, N_states delta_mrcepa0_ii(:,:) = 0d0 @@ -685,7 +680,7 @@ end function !$OMP private(m,i,II,J,k,degree,myActive,made_hole,made_particle,hjk,contrib) & !$OMP shared(active_sorb, psi_non_ref, psi_non_ref_coef, psi_ref, psi_ref_coef, cepa0_shortcut, det_cepa0_active) & !$OMP shared(N_det_ref, N_det_non_ref,N_int,det_cepa0_idx,lambda_mrcc,det_ref_active, delta_cas) & - !$OMP shared(notf,i_state, sortRef, sortRefIdx) + !$OMP shared(notf,i_state, sortRef, sortRefIdx, dij) do blok=1,cepa0_shortcut(0) do i=cepa0_shortcut(blok), cepa0_shortcut(blok+1)-1 do II=1,N_det_ref @@ -727,7 +722,7 @@ end function call i_h_j(psi_non_ref(1,1,det_cepa0_idx(k)),psi_ref(1,1,J),N_int,HJk) !contrib = delta_cas(II, J, i_state) * HJk * lambda_mrcc(i_state, det_cepa0_idx(k)) - contrib = delta_cas(II, J, i_state) * get_dij(psi_ref(1,1,J), psi_non_ref(1,1,det_cepa0_idx(k)), N_int) + contrib = delta_cas(II, J, i_state) * dij(J, det_cepa0_idx(k), i_state) !$OMP ATOMIC delta_mrcepa0_ij(J, det_cepa0_idx(i), i_state) += contrib diff --git a/plugins/mrcepa0/dressing_slave.irp.f b/plugins/mrcepa0/dressing_slave.irp.f index 7d64aa5e..7c9d7fe0 100644 --- a/plugins/mrcepa0/dressing_slave.irp.f +++ b/plugins/mrcepa0/dressing_slave.irp.f @@ -55,7 +55,7 @@ subroutine mrsc2_dressing_slave(thread,iproc) logical, external :: is_in_wavefunction, isInCassd, detEq integer,allocatable :: komon(:) logical :: komoned - double precision, external :: get_dij + !double precision, external :: get_dij zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() zmq_socket_push = new_zmq_push_socket(thread) @@ -144,7 +144,7 @@ subroutine mrsc2_dressing_slave(thread,iproc) ! if(I_i == J) phase_Ii = phase_Ji do i_state = 1,N_states - dkI = h_(J,i) * get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,i), N_int) + dkI = h_(J,i) * dij(i_I, i, i_state)!get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,i), N_int) !dkI = h_(J,i) * h_(i_I,i) * lambda_mrcc(i_state, i) dleat(i_state, kn, 1) = dkI dleat(i_state, kn, 2) = dkI @@ -174,7 +174,7 @@ subroutine mrsc2_dressing_slave(thread,iproc) !contrib = h_(i_I,k) * lambda_mrcc(i_state, k) * dleat(i_state, m, 2)! * phase_al - contrib = get_dij(psi_ref(1,1,i_I), psi_non_ref(1,1,k), N_int) * dleat(i_state, m, 2) + contrib = dij(i_I, k, i_state) * dleat(i_state, m, 2) delta(i_state,ll,1) += contrib if(dabs(psi_ref_coef(i_I,i_state)).ge.5.d-5) then delta(i_state,0,1) -= contrib * ci_inv(i_state) * psi_non_ref_coef(l,i_state) @@ -182,7 +182,7 @@ subroutine mrsc2_dressing_slave(thread,iproc) if(I_i == J) cycle !contrib = h_(J,l) * lambda_mrcc(i_state, l) * dleat(i_state, m, 1)! * phase_al - contrib = get_dij(psi_ref(1,1,J), psi_non_ref(1,1,l), N_int) * dleat(i_state, m, 1) + contrib = dij(J, l, i_state) * dleat(i_state, m, 1) delta(i_state,kk,2) += contrib if(dabs(psi_ref_coef(J,i_state)).ge.5.d-5) then delta(i_state,0,2) -= contrib * cj_inv(i_state) * psi_non_ref_coef(k,i_state) @@ -483,9 +483,6 @@ end integer :: KKsize = 1000000 - ! -459.6346665282306 - ! -459.6346665282306 - call new_parallel_job(zmq_to_qp_run_socket,'mrsc2') diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index 0ef4c92b..53a0822d 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -16,10 +16,11 @@ subroutine run(N_st,energy) double precision :: thresh_mrcc + thresh_mrcc = 1d-7 n_it_mrcc_max = 10 - if(no_mono_dressing) then + if(n_it_mrcc_max == 1) then do j=1,N_states_diag do i=1,N_det psi_coef(i,j) = CI_eigenvectors_dressed(i,j) @@ -73,44 +74,8 @@ subroutine run_pt2(N_st,energy) print*,'Last iteration only to compute the PT2' threshold_selectors = 1.d0 threshold_generators = 0.999d0 - -! N_det_generators = lambda_mrcc_pt2(0) -! do i=1,N_det_generators -! j = lambda_mrcc_pt2(i) -! do k=1,N_int -! psi_det_generators(k,1,i) = psi_non_ref(k,1,j) -! psi_det_generators(k,2,i) = psi_non_ref(k,2,j) -! enddo -! do k=1,N_st -! psi_coef_generators(i,k) = psi_non_ref_coef(j,k) -! enddo -! enddo -! SOFT_TOUCH N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed - - -! -! N_det_generators = lambda_mrcc_pt2(0) + N_det_cas -! do i=1,N_det_cas -! do k=1,N_int -! psi_det_generators(k,1,i) = psi_ref(k,1,i) -! psi_det_generators(k,2,i) = psi_ref(k,2,i) -! enddo -! do k=1,N_st -! psi_coef_generators(i,k) = psi_ref_coef(i,k) -! enddo -! enddo -! do i=N_det_cas+1,N_det_generators -! j = lambda_mrcc_pt2(i - N_det_cas) -! do k=1,N_int -! psi_det_generators(k,1,i) = psi_non_ref(k,1,j) -! psi_det_generators(k,2,i) = psi_non_ref(k,2,j) -! enddo -! do k=1,N_st -! psi_coef_generators(i,k) = psi_non_ref_coef(j,k) -! enddo -! enddo -! SOFT_TOUCH N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed - + + N_det_generators = lambda_mrcc_pt3(0) + N_det_ref N_det_selectors = lambda_mrcc_pt3(0) + N_det_ref From 1bc8bb0a062f979505f7bb7031d7d90d330f285a Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 6 Jul 2016 15:53:16 +0200 Subject: [PATCH 043/216] added lambda_type --- plugins/mrcepa0/EZFIO.cfg | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 plugins/mrcepa0/EZFIO.cfg diff --git a/plugins/mrcepa0/EZFIO.cfg b/plugins/mrcepa0/EZFIO.cfg new file mode 100644 index 00000000..9979f537 --- /dev/null +++ b/plugins/mrcepa0/EZFIO.cfg @@ -0,0 +1,5 @@ +[lambda_type] +type: Strictly_positive_int +doc: lambda type ( 0 = none, 1 = last version ) +interface: ezfio,provider,ocaml +default: 0 From ee257c3d6fca7d5b3c707499b3756c0dc5013739 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 6 Jul 2016 16:15:47 +0200 Subject: [PATCH 044/216] merge with LCPQ --- README.md | 6 +- config/ifort.cfg | 2 +- configure | 4 +- data/pseudo/tn_df | 785 ++++++++++++++++++ data/pseudo/tn_df_sc | 292 +++++++ data/pseudo/tn_hf | 785 ++++++++++++++++++ data/qp.png | Bin 0 -> 42781 bytes install/scripts/install_ocaml.sh | 1 + install/scripts/install_zeromq.sh | 12 +- ocaml/Atom.ml | 12 +- ocaml/Atom.mli | 1 + ocaml/Basis.ml | 20 +- ocaml/Basis.mli | 2 +- ocaml/Gto.ml | 35 +- ocaml/Gto.mli | 6 +- ocaml/Input_ao_basis.ml | 1 + ocaml/Input_nuclei.ml | 17 + ocaml/Molecule.ml | 11 +- ocaml/Molecule.mli | 1 + ocaml/TaskServer.mli | 84 ++ ocaml/_tags | 2 +- plugins/All_singles/H_apply.irp.f | 3 +- plugins/All_singles/all_singles.irp.f | 2 +- plugins/CAS_SD/H_apply.irp.f | 4 - plugins/DDCI_selected/ddci.irp.f | 23 +- plugins/FOBOCI/EZFIO.cfg | 25 +- plugins/FOBOCI/H_apply.irp.f | 16 +- plugins/FOBOCI/NEEDED_CHILDREN_MODULES | 2 +- plugins/FOBOCI/all_singles.irp.f | 335 ++++++-- plugins/FOBOCI/all_singles_split.irp.f | 442 ++++++++-- plugins/FOBOCI/collect_all_lmct.irp.f | 436 ++++++++++ plugins/FOBOCI/corr_energy_2h2p.irp.f | 425 ++++++++++ plugins/FOBOCI/diag_fock_inactiv_virt.irp.f | 48 ++ plugins/FOBOCI/dress_simple.irp.f | 61 +- plugins/FOBOCI/fobo_scf.irp.f | 59 ++ .../foboci_lmct_mlct_threshold_old.irp.f | 124 ++- plugins/FOBOCI/foboci_reunion.irp.f | 18 + plugins/FOBOCI/generators_restart_save.irp.f | 158 ++-- plugins/FOBOCI/hcc_1h1p.irp.f | 83 ++ plugins/FOBOCI/modify_generators.irp.f | 1 + plugins/FOBOCI/new_approach.irp.f | 339 +++++++- plugins/FOBOCI/new_new_approach.irp.f | 132 +++ plugins/FOBOCI/routines_dressing.irp.f | 497 ++++++++++- plugins/FOBOCI/routines_foboci.irp.f | 262 +++++- plugins/Full_CI/H_apply.irp.f | 5 + plugins/Full_CI/micro_pt2.irp.f | 4 + plugins/Generators_restart/generators.irp.f | 28 +- plugins/Hartree_Fock/damping_SCF.irp.f | 4 +- plugins/MRCC_CASSD/mrcc_cassd.irp.f | 13 +- plugins/MRCC_Utils/H_apply.irp.f | 7 +- plugins/Molden/NEEDED_CHILDREN_MODULES | 2 +- plugins/Molden/aos.irp.f | 196 ----- plugins/Molden/print_mo.irp.f | 6 +- plugins/Perturbation/pt2_equations.irp.f | 2 + plugins/Properties/hyperfine_constants.irp.f | 13 + plugins/Properties/mulliken.irp.f | 31 + plugins/Properties/print_hcc.irp.f | 15 +- plugins/Properties/print_mulliken.irp.f | 31 +- plugins/QmcChem/e_curve_qmc.irp.f | 102 +++ plugins/QmcChem/save_for_qmcchem.irp.f | 51 +- plugins/loc_cele/loc.f | 4 +- plugins/loc_cele/loc_cele.irp.f | 502 ++++++----- .../qmcpack/qp_convert_qmcpack_to_ezfio.py | 27 +- scripts/compilation/qp_create_ninja.py | 7 +- scripts/ezfio_interface/ei_handler.py | 2 +- .../ezfio_generate_provider.py | 33 +- scripts/ezfio_interface/qp_edit_template | 10 +- scripts/generate_h_apply.py | 65 +- src/AO_Basis/aos.irp.f | 211 ++++- src/Bitmask/bitmask_cas_routines.irp.f | 17 + src/Bitmask/bitmasks.irp.f | 43 +- src/Determinants/H_apply.irp.f | 41 +- src/Determinants/H_apply.template.f | 26 +- src/Determinants/H_apply_nozmq.template.f | 8 +- src/Determinants/H_apply_zmq.template.f | 68 +- src/Determinants/SC2.irp.f | 6 +- src/Determinants/davidson.irp.f | 77 +- src/Determinants/determinants.irp.f | 2 +- src/Determinants/diagonalize_CI_SC2.irp.f | 8 +- src/Determinants/s2.irp.f | 44 +- src/Determinants/save_natorb.irp.f | 1 + src/Determinants/slater_rules.irp.f | 5 +- src/Integrals_Bielec/ao_bi_integrals.irp.f | 19 +- src/Integrals_Bielec/map_integrals.irp.f | 1 - src/Integrals_Bielec/mo_bi_integrals.irp.f | 13 +- src/Integrals_Monoelec/mo_mono_ints.irp.f | 1 + .../pot_ao_pseudo_ints.irp.f | 10 +- src/Utils/util.irp.f | 12 - src/ZMQ/utils.irp.f | 27 +- tests/bats/qp.bats | 4 +- 90 files changed, 6161 insertions(+), 1217 deletions(-) create mode 100644 data/pseudo/tn_df create mode 100644 data/pseudo/tn_df_sc create mode 100644 data/pseudo/tn_hf create mode 100644 data/qp.png create mode 100644 ocaml/TaskServer.mli create mode 100644 plugins/FOBOCI/collect_all_lmct.irp.f create mode 100644 plugins/FOBOCI/corr_energy_2h2p.irp.f create mode 100644 plugins/FOBOCI/fobo_scf.irp.f create mode 100644 plugins/FOBOCI/foboci_reunion.irp.f create mode 100644 plugins/FOBOCI/hcc_1h1p.irp.f create mode 100644 plugins/FOBOCI/new_new_approach.irp.f delete mode 100644 plugins/Molden/aos.irp.f create mode 100644 plugins/QmcChem/e_curve_qmc.irp.f diff --git a/README.md b/README.md index e313f444..5372b7ac 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,7 @@ -Quantum package -=============== - +![QP](https://raw.githubusercontent.com/LCPQ/quantum_package/master/data/qp.png) [![Build Status](https://travis-ci.org/LCPQ/quantum_package.svg?branch=master)](https://travis-ci.org/LCPQ/quantum_package) - [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/LCPQ/quantum_package?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - Set of quantum chemistry programs and libraries. (under GNU GENERAL PUBLIC LICENSE v2) diff --git a/config/ifort.cfg b/config/ifort.cfg index 47a654c3..b7d03fbb 100644 --- a/config/ifort.cfg +++ b/config/ifort.cfg @@ -51,7 +51,7 @@ FCFLAGS : -xSSE4.2 -O2 -ip -ftz # [DEBUG] FC : -g -traceback -FCFLAGS : -xAVX -C -fpe0 +FCFLAGS : -xAVX -C -fpe0 IRPF90_FLAGS : --openmp # OpenMP flags diff --git a/configure b/configure index c3a22683..de5b3d56 100755 --- a/configure +++ b/configure @@ -142,7 +142,7 @@ ezfio = Info( default_path=join(QP_ROOT_INSTALL, "EZFIO")) zeromq = Info( - url='http://download.zeromq.org/zeromq-4.0.7.tar.gz', + url='https://github.com/zeromq/zeromq4-1/releases/download/v4.1.4/zeromq-4.1.4.tar.gz', description=' ZeroMQ', default_path=join(QP_ROOT_LIB, "libzmq.a")) @@ -166,7 +166,7 @@ d_info = dict() for m in ["ocaml", "m4", "curl", "zlib", "patch", "irpf90", "docopt", "resultsFile", "ninja", "emsl", "ezfio", "p_graphviz", - "zeromq", "f77zmq","bats" ]: + "zeromq", "f77zmq","bats"]: exec ("d_info['{0}']={0}".format(m)) diff --git a/data/pseudo/tn_df b/data/pseudo/tn_df new file mode 100644 index 00000000..2ba941be --- /dev/null +++ b/data/pseudo/tn_df @@ -0,0 +1,785 @@ +H GEN 0 2 +6 + 1.00000000 1 34.44662515 + -0.89096601 2 40.13885591 + -4.35250792 2 24.66307521 + -11.58011743 2 20.49225491 + 12.58011743 2 30.23909011 + 34.44662515 3 22.28419700 +6 + -262.22422461 2 17.87367530 + 258.22981252 2 28.75598991 + 5613.63467960 2 19.10096571 + -4192.30569417 2 18.88256059 + -1341.04802395 2 20.95302325 + -79.28421640 2 34.10653707 +6 + -199.48848662 2 37.85954681 + 197.31066276 2 28.79454664 + 4870247.22276531 2 40.22839783 + -5277181.77014563 2 40.34690459 + -196566.81095176 2 39.13989706 + 603502.35555458 2 40.91315002 + +He GEN 0 2 +6 + 2.00000000 1 22.64777484 + -0.00700692 2 23.54196640 + -8.90169316 2 18.71556903 + 113.56926776 2 15.15150658 + -112.56926776 2 13.80465850 + 45.29554968 3 12.54192267 +6 + 747.63794984 2 13.33611411 + -753.70091072 2 23.45392111 + -397.08293819 2 12.23651194 + 10.35341837 2 14.87987639 + -1430.53848568 2 18.32138342 + 1818.26602949 2 21.24054054 +6 + 305.67933642 2 21.32319132 + -307.98355807 2 12.22370696 + 5957.66379729 2 14.11720170 + -6099.62872267 2 14.41269814 + 523.59639310 2 17.66028106 + -380.63505659 2 21.52626637 + +Li GEN 2 2 +6 + 1.00000000 1 0.78732101 + -2.23999912 2 0.79224763 + 0.10376190 2 1.79622268 + 4.27489122 2 1.83637465 + -3.27489122 2 1.91213904 + 0.78732101 3 0.79291624 +6 + 256.80790655 2 1.78312879 + -255.81956741 2 0.95553059 + 90.30361668 2 0.87617279 + 272.13155048 2 1.09621549 + -180.73373018 2 1.43900642 + -180.70146573 2 1.83085147 +6 + -4.80714862 2 1.53942961 + 3.36281864 2 0.84742021 + -305.38012622 2 0.78976831 + -509.40184487 2 0.98031681 + 436.16121675 2 0.81548364 + 379.61797456 2 1.02582853 + +Be GEN 2 2 +6 + 2.00000000 1 1.20639978 + -5.40313229 2 1.18425537 + 1.72394027 2 2.81826911 + 2.83884922 2 2.37513515 + -1.83884922 2 2.82920954 + 2.41279956 3 1.18219335 +6 + -1045.63679908 2 2.59240356 + 1047.85482764 2 1.41685787 + -1899.15859219 2 1.48536566 + 1398.06780686 2 1.70076501 + -696.13481389 2 2.03898674 + 1198.22571139 2 2.57766211 +6 + 630.90931326 2 1.84421403 + -632.78437074 2 1.13419132 + 441.35012255 2 1.13393716 + 435.97021325 2 1.22419150 + -353.63284449 2 1.39760436 + -522.69065435 2 1.88595068 + +B GEN 2 2 +6 + 3.00000000 1 2.72292969 + -11.78419674 2 2.41356794 + 5.22993640 2 4.60628004 + 0.42834165 2 3.81569642 + 0.57165835 2 4.75281449 + 8.16878907 3 2.42655010 +6 + -260.26050710 2 2.55536939 + 265.37594882 2 4.54575013 + 76.89512909 2 2.14992133 + -57.25691791 2 2.71845869 + 4293.37943873 2 3.54567059 + -4312.01708538 2 3.65811356 +6 + 236.98381086 2 3.86703012 + -239.59777090 2 2.15409783 + 4347.09682018 2 2.51320631 + -4637.07702775 2 2.58243237 + 786.10765740 2 3.15459528 + -495.13181880 2 3.69673537 + +C GEN 2 2 +6 + 4.00000000 1 6.85914037 + -69.31783111 2 7.66877502 + 58.73619595 2 8.89164866 + -5.11066199 2 4.63398124 + 6.11066199 2 5.40104250 + 27.43656147 3 6.79273179 +6 + 430.61454744 2 8.62389774 + -421.35054055 2 5.03244470 + -33212.40034531 2 6.89861917 + 44.12655159 2 3.96628687 + 96.39927700 2 5.01313881 + 33072.87650778 2 6.85964729 +6 + -104389.58452246 2 4.75057662 + 104386.03365951 2 8.95366858 + 690570.92310077 2 7.84605551 + 105067.78650436 2 4.75435948 + -142604.06718444 2 8.80450514 + -653033.64724842 2 7.81116996 + +N GEN 2 2 +6 + 5.00000000 1 11.01983025 + -747.65378590 2 7.70260962 + 731.28815439 2 7.83791198 + -3.54162255 2 8.41784728 + 4.54162255 2 12.53426384 + 55.09915125 3 6.76845507 +6 + 189.29450948 2 10.95064006 + -174.81483163 2 7.48980682 + 148422.74289741 2 6.18035270 + -167161.90534269 2 6.21695388 + 34280.43140051 2 6.81408633 + -15540.26812247 2 7.23413705 +6 + -5338.70218681 2 6.15987128 + 5334.35386770 2 7.49726635 + -1839.21100223 2 8.80963870 + 16010.85000728 2 6.52067091 + -16722.95522386 2 6.97790252 + 2552.31199840 2 8.37871646 + +O GEN 2 2 +6 + 6.00000000 1 8.86932353 + -28.04199287 2 6.05326172 + 11.15704031 2 5.51480979 + 180.82432510 2 10.77878397 + -179.82432510 2 10.23693413 + 53.21594115 3 7.90462675 +6 + -9212.20980516 2 7.28893859 + 9226.86567950 2 6.05971190 + 58203.26727502 2 10.83143357 + -5120.48607364 2 5.75281092 + -93321.50266843 2 10.51155711 + 40239.72318888 2 9.72227746 +6 + 10001.55649464 2 7.43321349 + -10012.86801601 2 5.85047476 + 8554.95973537 2 5.79011164 + -20342.33136146 2 8.08750969 + 11739.44079236 2 8.43229920 + 48.92837040 2 4.71055456 + +F GEN 2 2 +6 + 7.00000000 1 16.52048840 + -10.46754024 2 13.26693551 + -11.21567917 2 18.77563836 + -32.41582195 2 10.96778594 + 33.41582195 2 21.09729680 + 115.64341877 3 13.46927525 +6 + 1201.43391413 2 19.92490215 + -1182.60889584 2 11.77163137 + -8770.99026936 2 12.30043337 + 5336.21358848 2 11.63810105 + 8729.77565724 2 14.12189391 + -5293.99672165 2 16.53091209 +6 + 92.58757506 2 8.66992000 + -108.46085404 2 9.40009036 + -319.30686222 2 9.08633595 + 524.57586653 2 9.90194004 + -443.63347077 2 13.57164540 + 239.36118945 2 16.47995554 + +Ne GEN 2 2 +6 + 8.00000000 1 21.64664513 + 1794.02959527 2 14.45731213 + -1828.03241002 2 14.11697591 + 23.90491418 2 14.10774236 + -22.90491418 2 20.42359560 + 173.17316107 3 11.93940404 +6 + -5911.13460210 2 12.24993716 + 5941.26076308 2 20.24332306 + 2840.09993994 2 12.20646543 + 1742.40556167 2 11.50431394 + 8834.09207695 2 16.82066882 + -13415.59681607 2 18.72208419 +6 + 53626.32637171 2 20.56468824 + -53639.90888359 2 19.92390926 + -576.65341012 2 13.02834964 + 1907.80575476 2 15.43385134 + 5623.71426075 2 18.06950435 + -6953.86800222 2 22.66963993 + +K GEN 18 2 +6 + 1.00000000 1 0.50008727 + 1416.76952428 2 0.63134777 + -1419.89095139 2 0.60241926 + -302.74307268 2 0.68724573 + 303.74307268 2 0.55624069 + 0.50008727 3 0.50008691 +6 + -854959.33457742 2 0.55297829 + 854960.96236303 2 0.59508099 + -2735051.37932036 2 0.55136787 + -797902.82136562 2 0.59254779 + -90621.33409241 2 0.60683509 + 3623576.53510235 2 0.55188848 +6 + 5366450.44923246 2 0.56834617 + -5366449.39460951 2 0.57395202 + 506392.75510780 2 0.65188562 + 1065012.45735119 2 0.60395254 + -764583.36396565 2 0.55451976 + -806820.84832728 2 0.64359720 + +Ca GEN 18 2 +6 + 2.00000000 1 0.74758765 + 308735.40641498 2 0.72269274 + -308740.90975833 2 0.72197603 + 7202.81432103 2 0.70435779 + -7201.81432103 2 0.73462875 + 1.49517531 3 0.98521314 +6 + 3358.40551562 2 0.85820603 + -3354.33378202 2 0.50055931 + 645.82930380 2 0.77593512 + -4032.30085432 2 0.85197466 + 3315.68514964 2 0.50005881 + 71.78714429 2 1.01826143 +6 + 3797.10880911 2 0.54666026 + -3794.15970380 2 0.55760964 + 1988.78457523 2 0.66771019 + 13912.48066729 2 0.71662858 + -408.96685813 2 0.50701325 + -15491.29677996 2 0.71335086 + +Sc GEN 18 2 +6 + 3.00000000 1 6.99258598 + -124.50237230 2 4.24128187 + 97.21802227 2 1.68870852 + -87.09390293 2 1.51321231 + 88.09390293 2 5.62659050 + 20.97775795 3 2.67617421 +6 + 375.73920548 2 5.45654024 + -350.54708476 2 5.82486421 + -11.58800164 2 0.51173797 + 12.31935173 2 0.56805032 + 20.80334597 2 0.78399590 + -20.53480959 2 1.25273408 +6 + 6092.78689761 2 1.30970450 + -6068.65474455 2 6.97688197 + 6074.16548241 2 6.96312742 + -2.71306889 2 0.50000000 + 562.44223581 2 1.09627007 + -6632.89448781 2 1.28901234 + +Ti GEN 18 2 +6 + 4.00000000 1 4.58962911 + 29.78882355 2 12.99080675 + -64.03604684 2 6.47044482 + 4.09908827 2 7.32890448 + -3.09908827 2 0.86508310 + 18.35851644 3 11.66884823 +6 + 204.54741131 2 6.98984163 + -173.26765359 2 1.14387234 + -179.62280834 2 7.98041969 + 81.98571631 2 1.30274954 + -105.23530836 2 0.79373704 + 203.87378660 2 0.87617820 +6 + 47.21398743 2 4.46327869 + -17.03315162 2 12.03758238 + -1.80345968 2 1.82986618 + -67.65022794 2 0.85432599 + 83.23157126 2 0.75234069 + -12.77614240 2 0.56466795 + +V GEN 18 2 +6 + 5.00000000 1 4.80344323 + 22.35774108 2 18.78787979 + -64.07198704 2 7.13216682 + 4.33388926 2 9.27213879 + -3.33388926 2 0.97989891 + 24.01721615 3 16.08839186 +6 + 180.61077610 2 8.25076842 + -142.94184574 2 0.97905818 + -150.64642751 2 9.92043295 + -6.71407277 2 0.62363714 + 176.09329684 2 0.95148528 + -17.73131270 2 1.07801133 +6 + 57.45110361 2 5.32960287 + -20.81111514 2 14.24980571 + -8.29286428 2 1.85925508 + -5.73287020 2 0.58593750 + 29.10022105 2 0.79878530 + -14.07269455 2 1.00225258 + +Cr GEN 18 2 +6 + 6.00000000 1 12.84308988 + -3.09604991 2 0.99382054 + -44.89504234 2 7.58819115 + -170.55613293 2 14.51774012 + 171.55613293 2 16.43682827 + 77.05853926 3 12.82491986 +6 + -18202.34922306 2 1.98782159 + 18244.42867028 2 31.32646602 + 30868.09979612 2 30.37846452 + 17868.98085600 2 1.97809129 + -49114.96837018 2 30.73273877 + 378.88775116 2 2.67913288 +6 + 29.20236180 2 19.25203633 + 12.37319603 2 0.97567458 + 4072.48148684 2 17.43196546 + -17623.52674725 2 16.30880219 + 0.00000000 2 1.00000000 + 13552.04578438 2 15.92770430 + +Mn GEN 18 2 +6 + 7.00000000 1 15.05016398 + 76.06668034 2 15.84783194 + -134.18719488 2 9.80426007 + 5.15310013 2 22.40715541 + -4.15310013 2 1.28870598 + 105.35114786 3 9.24698903 +6 + 5.29793560 2 36.81344701 + 46.23395617 2 10.22325416 + -60.32817992 2 19.40077237 + 47.36691946 2 10.31192728 + -593.48022661 2 0.82035751 + 607.44155846 2 0.82499832 +6 + 43.56050065 2 39.11191097 + 6.67450664 2 5.89010993 + 273.74198710 2 12.39309544 + -27.45450618 2 46.10455298 + -256.40166892 2 15.13448958 + 11.11513392 2 0.96513012 + +Fe GEN 18 2 +6 + 8.00000000 1 15.22430826 + 44.74166498 2 23.61492800 + -111.48295214 2 10.92989564 + 4.87905385 2 34.25190536 + -3.87905385 2 1.33822720 + 121.79446608 3 12.33553803 +6 + -19.50464924 2 30.77395752 + 78.13974335 2 10.21396062 + -93.51149367 2 7.16717891 + -5331.00729306 2 2.86167947 + 2973.12062964 2 2.65030718 + 2452.39961633 2 3.20024669 +6 + 24692.89537881 2 35.68878072 + -24635.37117467 2 1.90446408 + 67.20321584 2 9.50100295 + -24719.85685234 2 35.67756831 + 155.45498669 2 2.48480944 + 24498.19947049 2 1.90126047 + +Co GEN 18 2 +6 + 9.00000000 1 16.99448342 + 49.13807967 2 27.18614115 + -125.28324533 2 12.21218102 + 5.11388765 2 39.14513799 + -4.11388765 2 1.47717612 + 152.95035078 3 13.67966454 +6 + -14.42629264 2 42.14707531 + 80.80701231 2 9.38147677 + -241.37463154 2 5.80599555 + -2375.49390008 2 3.20236619 + 1470.87516654 2 3.85735739 + 1146.99509265 2 2.77670509 +6 + 136.98013925 2 35.88691706 + -71.59603354 2 2.32679268 + 69.29537053 2 14.47120857 + -182.97334302 2 33.48566094 + 53.73921710 2 5.03596368 + 60.93980797 2 1.71252673 + +Ni GEN 18 2 +6 + 10.00000000 1 22.08639324 + -144.93688782 2 14.51813938 + 58.56151708 2 31.72005545 + 5.46467869 2 46.47610840 + -4.46467869 2 1.64348434 + 220.86393239 3 17.23929992 +6 + -1037.96291767 2 23.63013626 + 1112.68285967 2 22.54579447 + -202.88667032 2 10.67846148 + -1992.46747856 2 2.78611652 + 261.70081349 2 7.26891690 + 1934.65478930 2 2.71695433 +6 + -53.30731307 2 26.78098186 + 127.09013633 2 3.54449677 + -4806.85555998 2 9.97427088 + 4887.04372410 2 10.06368893 + -212.17359382 2 2.46160888 + 132.98697057 2 1.97486742 + +Cu GEN 18 2 +6 + 11.00000000 1 2.82733696 + -34.48196386 2 1.92614044 + -60.25585479 2 16.36117816 + 95.74606505 2 26.07073787 + -94.74606505 2 15.23964803 + 31.10070652 3 2.17204001 +6 + -45.62927216 2 31.69953680 + 125.91417027 2 1.14930323 + -14.54702824 2 1.62190112 + 4.20903863 2 5.04037704 + 108.15433753 2 13.02666762 + -96.81611101 2 1.08245080 +6 + 95.22440516 2 11.30741812 + -15.05535618 2 0.88219501 + 50.51809351 2 1.10244974 + -44.11033096 2 1.38963093 + 24.77977412 2 1.74927941 + -30.18619193 2 36.48037929 + +Zn GEN 18 2 +6 + 12.00000000 1 31.07239014 + -200.01988966 2 17.28158695 + 92.10229536 2 34.39655496 + 5.98135501 2 49.89939973 + -4.98135501 2 1.96865590 + 372.86868168 3 19.34259724 +6 + -36.14038802 2 38.52109994 + 128.37782465 2 12.00212013 + -1.61496737 2 1.07625274 + -1.83786181 2 49.67118376 + 65.46563590 2 2.17772473 + -61.01291439 2 3.24812913 +6 + -65.64354860 2 18.09701361 + 156.02859885 2 36.00255883 + 172.20201747 2 14.96596000 + -192.17040837 2 36.71242576 + 4.39165632 2 5.39429237 + 16.57829500 2 1.49031308 + +Ga GEN 28 2 +6 + 3.00000000 1 1.13608798 + 164.07678897 2 1.26217688 + -167.28328999 2 1.14858151 + -669.79177234 2 1.15353581 + 670.79177234 2 1.12952095 + 3.40826394 3 1.10744970 +6 + 2326.37321481 2 0.75031475 + -2323.38047364 2 0.75000124 + 386.83516033 2 2.39556890 + 3373.92258044 2 1.92296729 + -3444.97340674 2 2.01243025 + -314.78429931 2 1.54022372 +6 + -49.00749762 2 0.97248539 + 49.23559677 2 1.12030491 + 13.15736344 2 1.17799318 + 125.85888665 2 1.43966818 + -194.32447492 2 1.61975153 + 56.31063114 2 1.96345236 + +Ge GEN 28 2 +6 + 4.00000000 1 1.37803409 + 19.62241898 2 1.39153725 + -23.72148814 2 1.27769848 + 2.49161805 2 1.59279926 + -1.49161805 2 0.64699203 + 5.51213636 3 0.92923210 +6 + -2.74466220 2 0.87224298 + 6.62035166 2 1.17293014 + -2420.40847648 2 1.99495027 + -82306.43955717 2 2.42954180 + 6740.23721390 2 2.16484262 + 77987.61073589 2 2.43883104 +6 + -2107.38453991 2 1.16911036 + 2108.21076604 2 1.46731756 + 1481.43044167 2 1.13494844 + -5605.67944848 2 1.57427397 + 1698.46708565 2 1.69705377 + 2426.78290985 2 1.49642085 + +As GEN 28 2 +6 + 5.00000000 1 1.43022249 + -9.34297986 2 1.49610460 + 4.21498088 2 6.47107540 + 10.09813510 2 3.25241162 + -9.09813510 2 5.07144325 + 7.15111245 3 1.33657021 +6 + 13218.94379269 2 1.93743539 + -13214.39886844 2 1.06114866 + -12968.43207956 2 1.94924972 + 13915.97822491 2 1.06566409 + -954.00698285 2 1.23265097 + 7.46088753 2 4.89271387 +6 + 1464.46500602 2 1.99905491 + -1463.07044815 2 1.47578217 + 368.93680276 2 1.30626554 + -20015.22902646 2 1.76510607 + -4931.41969774 2 1.62454622 + 24578.71284776 2 1.71245824 + +Se GEN 28 2 +6 + 6.00000000 1 1.51096144 + 18985.66456772 2 2.92355341 + -18994.15945825 2 2.92032845 + -67662.27071451 2 3.11248219 + 67663.27071451 2 3.11189793 + 9.06576863 3 1.65761092 +6 + 9.98441274 2 1.51889669 + -2.50844675 2 1.97738476 + -180236.05319146 2 2.70806322 + 388717.66809223 2 2.76186155 + -395809.31847294 2 2.85646715 + 187328.70401255 2 2.90992434 +6 + -0.64003892 2 1.60286011 + 4.75615253 2 1.39335643 + -1221.08696720 2 2.09669307 + -10412.15615824 2 2.41527013 + 11345.50935270 2 2.36453165 + 288.73492615 2 3.03391531 + +Br GEN 28 2 +6 + 7.00000000 1 1.41289916 + -7.52651514 2 1.15658370 + -0.55005317 2 2.42725255 + 32.50767838 2 2.88316202 + -31.50767838 2 2.65601102 + 9.89029412 3 1.40346702 +6 + 28526.73706896 2 2.34791729 + -28520.73498833 2 2.45113975 + -99003.29767895 2 2.50553756 + 749850.19071550 2 2.81179865 + -1128475.81390516 2 2.78141408 + 477629.92118992 2 2.68265676 +6 + 17.76908748 2 1.31119911 + -15.01578842 2 1.60289186 + -18723.09651802 2 2.55330648 + -655.15159005 2 2.02749820 + 16349.83148583 2 2.49321553 + 3029.41777740 2 2.76331597 + +Kr GEN 28 2 +6 + 8.00000000 1 8.52108317 + -122698.81335772 2 3.24264497 + 122687.31930993 2 3.40822193 + -118092.31104849 2 3.40804203 + 118093.31104849 2 3.23631062 + 68.16866536 3 4.68396906 +6 + -494.70169718 2 5.76331362 + 503.25343741 2 2.73098609 + -367021.57369848 2 3.66759371 + -1529686.47073208 2 3.83008505 + 1834642.13235417 2 3.78655002 + 62066.91317383 2 4.17980892 +6 + -73.83484449 2 5.20603747 + 79.00632901 2 4.70236432 + 1062.70264892 2 4.15470411 + -40873.21549348 2 3.08586486 + 43280.45283221 2 3.10363880 + -3468.93856436 2 3.63224008 + +Al GEN 10 2 +6 + 3.00000000 1 0.91821413 + -12.79791788 2 1.10715442 + 7.32796626 2 2.03989390 + -52053.92058080 2 2.04204466 + 52054.92058080 2 2.04199047 + 2.75464240 3 0.94029840 +6 + -42.72903905 2 1.99445589 + 47.15203530 2 1.12469986 + 3231.39534748 2 1.72843552 + -398.06113457 2 1.37872018 + 6652.21368423 2 1.92811339 + -9484.54780105 2 1.87995009 +6 + 830.07508675 2 1.87943518 + -827.97758021 2 1.42508183 + -1235.04705829 2 1.80941062 + -21.40768628 2 0.95469299 + 154.21154335 2 1.20079877 + 1103.24388863 2 1.53169350 + +Si GEN 10 2 +6 + 4.00000000 1 1.22418085 + 40.72596063 2 2.05337336 + -48.11509746 2 1.71412850 + -37.28006653 2 2.41395005 + 38.28006653 2 2.32084434 + 4.89672339 3 1.35299631 +6 + -7.68509694 2 1.13070385 + 13.98411213 2 1.16859753 + -116498.38332824 2 2.36994226 + -9121.48068622 2 2.16734100 + 31941.11999828 2 2.44879942 + 93679.74429067 2 2.32322104 +6 + 41248.64599856 2 1.86811003 + -41245.51022334 2 2.10179754 + -60.37864776 2 1.33467919 + 4180.55486914 2 2.29835912 + -142125.41164262 2 1.93345601 + 138006.23630568 2 1.99192523 + +P GEN 10 2 +6 + 5.00000000 1 3.71332384 + -13724.87406260 2 3.31759335 + 13714.20593187 2 3.65850189 + -19470.81568886 2 3.61426447 + 19471.81568886 2 3.37579099 + 18.56661922 3 2.21831587 +6 + -1411.99322697 2 3.20289077 + 1421.31824558 2 2.14807352 + 576236.74902855 2 2.65372234 + -397754.23263905 2 2.69778221 + -194403.08693812 2 2.58386669 + 15921.57087605 2 2.99361065 +6 + 64.03084909 2 2.59482433 + -58.63734715 2 3.43313766 + 365.80442210 2 2.95557705 + -12.13895471 2 1.75387879 + 158.27628825 2 3.69699906 + -510.94109430 2 3.15077203 + +S GEN 10 2 +6 + 6.00000000 1 2.51977085 + -84.83332404 2 3.22007986 + 70.54487302 2 4.71655238 + 3581.56671658 2 4.39998291 + -3580.56671658 2 4.41784559 + 15.11862509 3 2.54586294 +6 + -231.72652822 2 4.61819246 + 244.26248418 2 2.30938314 + -920.53494189 2 2.65072450 + 2410.83323256 2 3.31119070 + -2429.46016726 2 3.80226712 + 940.16251250 2 4.46824294 +6 + 957.88712772 2 4.48874898 + -950.12559451 2 3.37845034 + 6481.05990210 2 3.83307173 + -157.23448173 2 1.92699416 + 186.18956071 2 1.98946862 + -6509.01396292 2 3.99439281 + +Cl GEN 10 2 +6 + 7.00000000 1 6.06473582 + -454.17116717 2 5.57110302 + 436.13184861 2 5.26917938 + -712.97599461 2 4.62455647 + 713.97599461 2 4.94326867 + 42.45315074 3 3.47635853 +6 + 3561.38023524 2 4.48278574 + -3545.84042135 2 3.43372818 + -348465.51723117 2 3.74855830 + 12627.08188052 2 3.20650110 + 404246.19776785 2 3.70673786 + -68406.76197098 2 3.45681590 +6 + 19.30024745 2 3.79400952 + -9.26766424 2 3.06020678 + 508.81151546 2 4.47438492 + -7.59455659 2 2.43219723 + -757.15587217 2 4.97983429 + 256.93953188 2 5.71145786 + +Ar GEN 10 2 +6 + 8.00000000 1 3.61306766 + 326.13269394 2 4.01911273 + -346.66642426 2 5.31624938 + -7083.13498801 2 4.62848435 + 7084.13498801 2 4.70295676 + 28.90454131 3 3.84612203 +6 + 323.59441180 2 3.28236424 + -306.35028843 2 3.72212609 + -6283.46399338 2 4.23452843 + 435312.63926384 2 4.90386840 + 20087.00527001 2 5.30220051 + -449115.17955704 2 4.93088566 +6 + -2470.88386165 2 5.66191962 + 2481.68427537 2 4.62960722 + 48097.69821672 2 2.45115265 + -48060.46858390 2 2.45082141 + -1386.79918148 2 4.23753203 + 1350.57102634 2 6.12344921 + + + + diff --git a/data/pseudo/tn_df_sc b/data/pseudo/tn_df_sc new file mode 100644 index 00000000..aa3234af --- /dev/null +++ b/data/pseudo/tn_df_sc @@ -0,0 +1,292 @@ +Sc GEN 12 2 +8 + 9.00000000 1 18.44478556 + -28.08765281 2 1.72227091 + 6.39250114 2 38.78217945 + 135.57316128 3 4.25767220 + 30.42990876 3 30.59237471 + 732.69856731 4 3.04901650 + -839.18407578 4 3.26586693 + 306.02608763 4 19.55311974 +8 + -0.66275990 2 28.84167604 + 15.34001225 2 2.35022973 + -2135.70086146 3 2.36887926 + -272.32226474 3 1.53860208 + 2408.02312621 3 2.24659807 + 101.49528202 4 3.20659052 + 2308.19070504 4 1.65816906 + -2392.74854053 4 1.70062176 +8 + 253.56902450 2 1.38158346 + -244.79525414 2 7.79906720 + 613.28437434 3 3.46268859 + -167.40250936 3 1.44953060 + -445.88186498 3 4.19986338 + -558.92885001 4 2.84253773 + -139.52186395 4 8.10103826 + -860.39715397 4 5.29686620 + +Ti GEN 12 2 +8 + 10.00000000 1 22.29649672 + -72305.15340277 2 6.07562013 + 72279.39956641 2 7.08549167 + -5.38004642 3 1.85317121 + 228.34501358 3 11.48488557 + 72347.84359974 4 6.58565089 + -36.31015055 4 10.79509368 + 524.90430538 4 4.36759114 +8 + -1486.27686725 2 1.90199524 + 1504.05739312 2 3.17280244 + -346.63236251 3 7.28185273 + 297.60206194 3 1.60782556 + 49.03030057 3 31.70876802 + 1363.17044217 4 2.57136209 + 173.13661454 4 15.10326471 + 408.87838151 4 10.51280239 +8 + 770.58828172 2 4.79017059 + -760.06500844 2 16.39428027 + 4131.47101858 3 2.73641831 + -2.86068712 3 1.26533109 + -4128.61033146 3 2.75566672 + -4681.55429918 4 13.54811035 + -216.64417046 4 3.18165696 + -3871.27097394 4 7.38011991 + +V GEN 12 2 +8 + 11.00000000 1 7.61152016 + -2254.24090893 2 3.39807975 + 2224.02899636 2 6.97361870 + -110446453.80565737 3 4.55862146 + 110446537.53237911 3 4.55862102 + 3279.23908558 4 3.96488312 + 110445429.80748074 4 5.79893896 + -110440859.60674113 4 5.79892709 +8 + 793493.20383269 2 1.90936932 + -793472.27490442 2 1.96341714 + -208.86387558 3 5.49944355 + 258.48298732 3 4.42141770 + -49.61911175 3 2.27427679 + -42873.55595686 4 1.93670396 + -750668.26686351 4 13.81929388 + 750696.33209725 4 13.81951796 +8 + 563.75098077 2 2.73920868 + -551.25384718 2 8.34159772 + 565.60881231 3 6.86565518 + -552.54712531 3 7.02672916 + -13.06168700 3 1.72160118 + 766.15325384 4 5.21722741 + -1341.96583800 4 3.64504781 + -2478.29367021 4 6.45896159 + +Cr GEN 12 2 +8 + 12.00000000 1 37.30558989 + -31.65683900 2 2.72495980 + -3.82112970 2 82.35078893 + -1340.05228092 3 5.03605834 + 1787.71935961 3 8.49223479 + 1670.38275859 4 5.05934149 + -297.67363866 4 11.22316422 + -1773.64577915 4 12.78798168 +8 + 1321.32584937 2 2.01494487 + -1297.16280545 2 9.11769637 + 172456.79432585 3 2.74640213 + -172130.54143941 3 2.73601029 + -326.25288644 3 8.22966405 + 3318.19479259 4 8.93660753 + -4964.77333719 4 4.18996691 + -7518.15931266 4 8.08712175 +8 + 426.08303476 2 2.13852920 + -410.95463497 2 6.95873057 + -26339.61341213 3 10.51865586 + 27348.01671881 3 10.59655900 + -1008.40330668 3 12.57249470 + -1190.97633771 4 3.81958382 + -242.50982893 4 2.30397730 + -515.04540222 4 8.50147041 + +Mn GEN 12 2 +8 + 13.00000000 1 5.18371402 + -578541.89058487 2 5.06065032 + 578503.38848415 2 6.70792867 + -51913.84692424 3 6.17952209 + 51981.23520653 3 6.17539491 + 363344.02202434 4 6.42176078 + 267112.71548476 4 5.85884127 + 322304.52239107 4 5.30004030 +8 + 1419.16815158 2 2.36735511 + -1393.80593768 2 10.44777616 + 90835.30824196 3 3.38832573 + -87236.54130341 3 3.33976449 + -3598.76693855 3 4.59371397 + -6244.54083570 4 4.53305698 + 1227.60592152 4 6.80451212 + -6185.56255228 4 8.40561309 +8 + 4024.75281098 2 2.94114594 + -4009.68099577 2 7.86104996 + 6036.24229971 3 5.47734943 + 597.55987937 3 7.26632213 + -6633.80217908 3 5.64966653 + -8536.73955532 4 4.35053539 + -2120.81538582 4 3.10976563 + -9025.36229250 4 6.88076377 + +Fe GEN 12 2 +8 + 14.00000000 1 5.12237041 + -40.17016318 2 2.51511645 + -1.31093574 2 68.88205922 + 233.53970769 3 8.04518971 + -161.82652195 3 11.87602774 + -1791.82033120 4 5.09693593 + 1599.45078669 4 4.72210640 + 1.03695301 4 1.70594204 +8 + 26.70612465 2 1.98046097 + 0.57578912 2 129.99498266 + 3039.39666376 3 2.39996246 + -3165.32503397 3 2.43500497 + 125.92837021 3 5.42607639 + -291.65810402 4 8.00515516 + 391.88052787 4 5.38996549 + 27.51771082 4 21.57361672 +8 + 624.99065580 2 2.73200743 + -610.14663705 2 8.14205971 + 1017.89543597 3 6.81776145 + -40.92293045 3 25.88593190 + -976.97250552 3 5.88766735 + -1433.26030940 4 3.94271278 + -167.70300401 4 2.68547503 + -1659.40792313 4 8.24853344 + +Co GEN 12 2 +8 + 15.00000000 1 7.54679164 + 144513.79744165 2 3.67362404 + -144558.25171900 2 4.84501436 + 107.53071842 3 2.40342575 + 5.67115611 3 26.17864786 + -58433.23776581 4 3.80837544 + -86187.09039425 4 4.51680318 + -24877.11683436 4 4.40937071 +8 + 95.23258759 2 2.24610518 + -66.50913381 2 5.03497074 + 5039.10184384 3 3.22714612 + 106438.82887427 3 4.39051698 + -111477.93071810 3 4.34028955 + -3416.23892647 4 3.35420522 + -108155.92422115 4 5.08283495 + 111451.19401338 4 5.04411598 +8 + 595.60664332 2 4.48956443 + -581.05689813 2 7.69628175 + -1377.49199281 3 3.90883087 + 825.53641688 3 4.85597858 + 551.95557593 3 2.42496884 + -403.44284159 4 2.48937518 + 360.79216631 4 7.08237042 + -1755.31252545 4 7.01264199 + +Ni GEN 12 2 +8 + 16.00000000 1 7.69817381 + 1050.11428773 2 7.53303210 + -1144.28791364 2 25.60798551 + 13641.04856576 3 13.90272560 + -13517.87778478 3 14.02243059 + -99.93959073 4 5.40919366 + -14590.22326277 4 19.39187326 + -6702.20081903 4 10.04177364 +8 + -137324.04248861 2 3.00959957 + 137399.59146577 2 2.97820277 + 137895.50489379 3 3.20429852 + -1036.38091066 3 8.22563766 + -136859.12398313 3 3.17346613 + 1370.72380067 4 18.22958633 + -904.80564965 4 6.63637638 + -4552.45338879 4 4.01705177 +8 + -315.28909178 2 15.14825706 + 371.76324185 2 5.57172908 + 471.27416207 3 2.88437623 + 165.43855728 3 3.75784965 + -636.71271936 3 3.41699124 + -172.18113847 4 5.67830819 + -148.24251004 4 2.70288433 + -2384.29249546 4 8.91177457 + +Cu GEN 12 2 +8 + 17.00000000 1 14.72121260 + 0.43564135 2 173.23217215 + -51.26559465 2 2.58024469 + 3.82433122 3 80.09883693 + 246.43628291 3 9.08368916 + 6456.72306266 4 4.49885474 + -6459.98303523 4 4.56436500 + -53.55070822 4 20.14135032 +8 + -7.61322720 2 104.42478595 + 38.51618543 2 3.64199543 + -12.00344193 3 52.46064977 + 288.99573247 3 4.33410703 + -276.99229053 3 8.38373584 + 876.14551285 4 3.01347300 + -1144.52462196 4 3.25680498 + -386.35474053 4 59.52152812 +8 + 142.97388030 2 48.08520852 + -128.80933064 2 49.90034500 + -186.15554307 3 11.18440029 + 180.45159943 3 5.04653753 + 5.70394364 3 85.01391269 + 101.90155258 4 3.06268644 + -238.17133323 4 3.55821337 + 583.56858981 4 22.24622222 + +Zn GEN 12 2 +8 + 18.00000000 1 16.25309578 + -62.06001046 2 3.04359000 + 8.22443626 2 52.31604625 + 284.31836352 3 4.12635237 + 8.23736049 3 129.68855961 + 11442.99692797 4 7.94323624 + -11664.25528103 4 7.74821809 + 462.64311342 4 34.44853266 +8 + 140.30017448 2 3.16683649 + -108.24959569 2 14.80839343 + 88.79372352 3 43.94225321 + 949.52154936 3 3.34122685 + -1038.31527288 3 8.34153430 + 780.81282740 4 18.34782011 + -1958.42831296 4 4.00418064 + 18.92059615 4 597.07325481 +8 + 664.93623774 2 5.16678579 + -651.12455824 2 11.88724380 + 930.96426186 3 7.96788974 + -913.07841414 3 5.27302550 + -17.88584772 3 127.63757255 + 3275.61040524 4 37.54266998 + -3957.43240479 4 9.90068894 + -3622.67126499 4 37.33250038 + + + diff --git a/data/pseudo/tn_hf b/data/pseudo/tn_hf new file mode 100644 index 00000000..a036558a --- /dev/null +++ b/data/pseudo/tn_hf @@ -0,0 +1,785 @@ +H GEN 0 2 +6 + 1.00000000 1 33.97261756 + -5.73227574 2 41.31028903 + -0.09126064 2 25.25940941 + -20.89980944 2 22.55290552 + 21.89980945 2 32.44131356 + 33.97261756 3 21.12884239 +6 + -792.10375913 2 18.05333002 + 788.69064150 2 28.72271273 + 243.76232429 2 17.34000000 + 1971.45741618 2 20.31094085 + -1795.56663560 2 22.08154655 + -418.65661775 2 30.98799599 +6 + 20.17177614 2 43.35000000 + -21.74798121 2 30.58059209 + 81.48044293 2 43.35000000 + -250.69197995 2 42.07548166 + 88.72115024 2 36.90496619 + 81.48044293 2 43.35000000 + +He GEN 0 2 +6 + 2.00000000 1 20.98762121 + -33.61186426 2 22.14709418 + 24.51669349 2 23.61790706 + 130.14113834 2 15.38761786 + -129.14113834 2 14.22621787 + 41.97524242 3 12.59257273 +6 + 1056.41263785 2 13.17618363 + -1062.28560366 2 23.62254131 + -463.87351954 2 12.04168890 + -676.20404915 2 15.14280380 + -595.21618656 2 19.81607243 + 1736.29130578 2 22.34342328 +6 + 428.21432838 2 21.71652417 + -430.31401911 2 12.32378638 + 7327.65357096 2 14.04426129 + -7501.20178041 2 14.34477832 + 827.37705616 2 17.58948890 + -652.83515208 2 21.22706329 + +Li GEN 2 2 +6 + 1.00000000 1 0.78732101 + -2.23995793 2 0.79224763 + 0.10336496 2 1.79622268 + 4.26591073 2 1.83637465 + -3.26591073 2 1.91213904 + 0.78732101 3 0.79291624 +6 + 256.06005883 2 1.78312879 + -255.07112703 2 0.95553059 + 89.99417499 2 0.87617279 + 271.48958394 2 1.09621549 + -180.35430387 2 1.43900642 + -180.12948429 2 1.83085147 +6 + -6.15265886 2 1.51120608 + 4.70876577 2 0.76936375 + -145.31681550 2 0.76874061 + -238.21930857 2 0.99080928 + 219.67347903 2 0.80457655 + 164.85986038 2 1.07164892 + +Be GEN 2 2 +6 + 2.00000000 1 1.20639978 + -5.40210132 2 1.18425537 + 1.72285109 2 2.81826911 + 2.83477794 2 2.37513515 + -1.83477794 2 2.82920954 + 2.41279956 3 1.18219335 +6 + -1045.56923435 2 2.59240549 + 1047.78889524 2 1.41686040 + -1899.02207714 2 1.48536195 + 1398.02036098 2 1.70076266 + -696.17508584 2 2.03898393 + 1198.17691383 2 2.57766021 +6 + 630.77503458 2 1.84421403 + -632.64959849 2 1.13419132 + 441.30858401 2 1.13393716 + 435.76647651 2 1.22419150 + -353.48689426 2 1.39760436 + -522.59133089 2 1.88595068 + +B GEN 2 2 +6 + 3.00000000 1 2.72292969 + -11.77602579 2 2.41356794 + 5.22133296 2 4.60628004 + 0.40709712 2 3.81569642 + 0.59290288 2 4.75281449 + 8.16878906 3 2.42655010 +6 + -259.65579181 2 2.54943794 + 264.77623108 2 4.54559309 + 79.19161122 2 2.15270531 + -59.67150303 2 2.71820746 + 4276.39654293 2 3.54458188 + -4294.91608677 2 3.65732479 +6 + 236.40878048 2 3.85965228 + -239.02058908 2 2.15130911 + 4065.68265375 2 2.50786619 + -4354.92616892 2 2.58144728 + 782.08428825 2 3.14947869 + -491.84514677 2 3.69136935 + +C GEN 2 2 +6 + 4.00000000 1 6.85924392 + -68.83281650 2 7.67473342 + 58.31001518 2 8.89832626 + -5.23010100 2 4.63334409 + 6.23010100 2 5.40036758 + 27.43697568 3 6.78357071 +6 + 15927.37261280 2 7.83879438 + -15918.16480090 2 5.19308059 + 2266.75441213 2 7.53204263 + 199.75030501 2 9.76960112 + 15915.92435302 2 5.19521204 + -18381.42723477 2 7.82847044 +6 + -153360.42295057 2 4.77965478 + 153356.81223147 2 7.75552602 + -369415.66050006 2 7.39994991 + 152547.92039307 2 4.77641318 + -50035.07991665 2 8.01352516 + 266903.80850142 2 7.30461659 + +N GEN 2 2 +6 + 5.00000000 1 11.01983025 + -745.67280403 2 7.70260962 + 729.30210222 2 7.83791198 + -3.61639106 2 8.41784728 + 4.61639106 2 12.53426384 + 55.09915126 3 6.76845507 +6 + 190.73305357 2 10.95092720 + -176.25003778 2 7.48977970 + 138618.50426238 2 6.17989888 + -156031.83911197 2 6.21713643 + 33624.66842989 2 6.84042808 + -16210.33273520 2 7.23938652 +6 + -6963.78021671 2 6.00000000 + 6959.42174113 2 6.82157159 + -1881.92821431 2 8.95497565 + 13576.39988827 2 6.21477468 + -14307.35309373 2 6.69426410 + 2613.87687182 2 8.63240466 + +O GEN 2 2 +6 + 6.00000000 1 8.86965578 + -28.03502457 2 6.05347085 + 11.15565054 2 5.51487970 + 180.73182495 2 10.77996678 + -179.73182495 2 10.23800841 + 53.21793471 3 7.90307811 +6 + -9301.89903913 2 7.28355994 + 9316.57793048 2 6.06026884 + 59864.04331135 2 10.82203807 + -5153.55178109 2 5.75221581 + -94673.29831259 2 10.51025188 + 39963.80850689 2 9.71187643 +6 + 1682.75815189 2 6.93414347 + -1694.05800561 2 5.70161443 + 848.47217112 2 5.90927487 + -8787.11179775 2 8.69956320 + 7632.94108771 2 8.89513889 + 306.69604455 2 4.97067782 + +F GEN 2 2 +6 + 7.00000000 1 16.52363418 + -6.34751135 2 13.25777643 + -15.15415075 2 18.76649923 + -34.29784879 2 10.97564997 + 35.29784879 2 21.10568925 + 115.66543928 3 13.45706123 +6 + 3851.10542697 2 18.85020393 + -3832.40250429 2 12.48878559 + -237433.87385812 2 13.23599298 + 4380.91891820 2 11.79852686 + 240164.95590264 2 13.28196243 + -7110.99868861 2 17.38283172 +6 + -154.12048513 2 8.59949907 + 138.11297468 2 9.44224375 + 90.42851925 2 8.92886754 + 24.83173716 2 10.18592724 + -424.59591732 2 14.47166344 + 310.33244840 2 16.45175456 + +Ne GEN 2 2 +6 + 8.00000000 1 21.65168713 + 1792.30188007 2 14.45374325 + -1826.14661180 2 14.11313946 + 24.26469360 2 14.10779016 + -23.26469360 2 20.42281751 + 173.21349705 3 11.94458523 +6 + -3233.03788910 2 12.39056574 + 3263.09949012 2 20.60119535 + 1065.47298248 2 11.30677784 + 846.05067282 2 12.27737462 + -34052.05079344 2 17.82669542 + 32141.52790433 2 17.34318949 +6 + 64989.42116117 2 20.31242587 + -65003.08394100 2 20.05277414 + -486.55828399 2 12.87396775 + 2895.04182579 2 15.84533388 + -261.91821074 2 19.42277681 + -2145.56672184 2 23.82700477 + +K GEN 18 2 +6 + 1.00000000 1 0.68724959 + 7665.13435390 2 0.62381187 + -7668.26785841 2 0.59278246 + -3877.60874288 2 0.63961163 + 3878.60874288 2 0.57860350 + 0.68724959 3 0.50008691 +6 + 477943.00813868 2 0.60446875 + -477941.36080643 2 0.55281419 + -533027.54468668 2 0.57763214 + 644866.44840953 2 0.56624742 + -347063.87255621 2 0.60823749 + 235225.96911606 2 0.54903924 +6 + 5177368.01138896 2 0.56835236 + -5177366.94506877 2 0.57395949 + 479730.23987439 2 0.65183506 + 1027151.48932830 2 0.60393420 + -737636.25038898 2 0.55451546 + -769244.47868615 2 0.64345811 + +Ca GEN 18 2 +6 + 2.00000000 1 1.02097432 + -10036.20006734 2 0.76570985 + 10030.67757963 2 0.83608195 + -8136.00883920 2 0.84362927 + 8137.00883920 2 0.75729596 + 2.04194863 3 0.94514267 +6 + -34706.02643508 2 0.85912364 + 34710.12533681 2 0.50000000 + 860.68953329 2 0.79227941 + 33806.87817612 2 0.85997136 + -34747.30927870 2 0.50004940 + 80.74228959 2 1.01833438 +6 + 514.89542915 2 0.50045897 + -511.93073005 2 0.57886998 + -1374495660.24999190 2 0.50000000 + 687246875.87136328 2 0.50000000 + 595.96081232 2 0.56402502 + 687248189.41960287 2 0.50000000 + +Sc GEN 18 2 +6 + 3.00000000 1 8.57059896 + 39.59298139 2 7.59719947 + -67.37349200 2 5.06179469 + 3.54689568 2 11.85222547 + -2.54689568 2 0.70815643 + 25.71179688 3 5.04858060 +6 + 414.99811890 2 5.58945823 + -389.30527335 2 5.93611719 + 8.74915776 2 0.56803113 + -23.92388226 2 0.60868170 + 42.12589000 2 0.76957270 + -25.95178014 2 1.21300456 +6 + 87.05758924 2 1.12946939 + -62.19670511 2 8.56362761 + 66.37833241 2 7.27494713 + 16.41391965 2 0.74327556 + 43.70031508 2 2.03252459 + -125.49197853 2 1.19227023 + +Ti GEN 18 2 +6 + 4.00000000 1 4.77516915 + 28.34758957 2 10.86929502 + -63.21363466 2 5.37319310 + 5.17935660 2 6.86168513 + -4.17935660 2 0.95669336 + 19.10067660 3 3.52162434 +6 + 211.66189616 2 7.01854391 + -179.82099411 2 1.03880358 + -185.28466640 2 8.02474194 + 43.44334388 2 1.22490803 + -44.06205312 2 0.73917909 + 186.90335758 2 0.89595855 +6 + 49.26886952 2 4.65596397 + -18.32131307 2 12.03001514 + -5.50633295 2 2.16547114 + -342.25486254 2 0.92182600 + 304.90681508 2 0.90099079 + 43.85505055 2 0.99684289 + +V GEN 18 2 +6 + 5.00000000 1 7.54069430 + 35.58763613 2 13.63949328 + -78.03044429 2 6.35551182 + 6.53716910 2 2.59423528 + -5.53716910 2 1.16176108 + 37.70347150 3 6.00940761 +6 + 194.57815114 2 8.18606241 + -156.25972501 2 0.95585889 + -162.29334861 2 9.81441300 + -7.74379387 2 0.70017858 + 244.84040986 2 0.97854682 + -73.80312462 2 1.14925292 +6 + 58.91069981 2 5.48333809 + -21.55840127 2 14.40777862 + -10.12891199 2 2.12080402 + 2.52953175 2 0.69388688 + 109.28174657 2 1.01378564 + -100.68144081 2 1.02780261 + +Cr GEN 18 2 +6 + 6.00000000 1 5.86829616 + -3.09900314 2 0.98487638 + -44.94655388 2 6.96616660 + 135.46731129 2 13.59887742 + -134.46731129 2 11.34882544 + 35.20977696 3 8.91110617 +6 + -526.12421414 2 1.73784849 + 568.24328209 2 32.55674074 + -4019.88240027 2 29.55364033 + 495.64908693 2 1.64707294 + 3445.48735974 2 29.05037955 + 79.74580069 2 3.85284016 +6 + 31.31844062 2 19.50625909 + 10.30743573 2 0.86978393 + -81.88780266 2 15.20370471 + 461.22634080 2 10.28610919 + 1.00599253 2 29.84121604 + -379.34381792 2 10.93761710 + +Mn GEN 18 2 +6 + 7.00000000 1 15.05016398 + 76.91199595 2 15.84783194 + -135.08366030 2 9.80426007 + 5.12036990 2 21.62193241 + -4.12036990 2 1.26331891 + 105.35114786 3 9.24698903 +6 + 4.45077705 2 37.07900996 + 46.93892122 2 10.09409180 + -59.63952162 2 18.98557107 + 47.25376130 2 10.16267391 + 2270.38024432 2 0.79460121 + -2256.99438460 2 0.79345224 +6 + 43.65884288 2 39.18960573 + 6.58957965 2 5.88646925 + 273.41973132 2 12.35978155 + -27.85882166 2 45.92825074 + -255.64090683 2 15.10051906 + 11.08093098 2 0.96083847 + +Fe GEN 18 2 +6 + 8.00000000 1 20.13246747 + 61.79343671 2 20.09868712 + -128.55600523 2 10.70685691 + 4.84472314 2 28.79726611 + -3.84472314 2 1.31374323 + 161.05973977 3 11.74858936 +6 + -20.21006220 2 30.42214774 + 78.68908034 2 10.18491881 + -104.38370168 2 6.69228251 + 11879.61125830 2 2.98725076 + 4067.63536025 2 2.63900793 + -15841.86182474 2 2.88538957 +6 + 52.35701571 2 38.26448010 + 4.85142656 2 5.90250183 + 2169.08154283 2 14.09502191 + -40.04038813 2 42.65213493 + -2140.34005623 2 14.44188153 + 12.29991314 2 1.06050818 + +Co GEN 18 2 +6 + 9.00000000 1 18.31609159 + 47.84627034 2 26.91264651 + -123.98809879 2 11.91957078 + 5.09540361 2 38.50128360 + -4.09540361 2 1.45636943 + 164.84482431 3 13.41744556 +6 + -22.55314559 2 34.07535172 + 88.75521276 2 10.45260699 + -158.32924566 2 5.91087540 + -53402.80058080 2 3.13684604 + 49767.17959800 2 3.16692544 + 3794.95155282 2 2.81533596 +6 + 61.92019742 2 38.11279103 + 2.85881103 2 5.82898971 + -387.27158530 2 15.59733227 + -64.65478412 2 38.57519906 + 439.30094674 2 13.98109833 + 13.62664636 2 1.17046441 + +Ni GEN 18 2 +6 + 10.00000000 1 19.84291404 + -195.32353012 2 16.02128656 + 108.98533897 2 26.59513762 + 6.08469364 2 39.39261550 + -5.08469364 2 1.73812596 + 198.42914037 3 16.63287860 +6 + 636.14358475 2 21.00974643 + -561.54325704 2 22.88188409 + -146.65571659 2 11.08963477 + 1590.91833845 2 2.66405882 + 203.15470938 2 6.84512029 + -1646.41568069 2 2.74451213 +6 + 67.70992628 2 28.31556957 + 5.37743585 2 4.16521410 + 374.49405320 2 17.37825451 + -389.83846114 2 21.96153313 + 1.91671522 2 49.74424984 + 14.42906054 2 1.27579002 + +Cu GEN 18 2 +6 + 11.00000000 1 35.47715926 + -18105.91023962 2 21.73013363 + 18011.23386368 2 21.83870561 + 6.01228206 2 18.42008793 + -5.01228206 2 1.78198604 + 390.24875182 3 20.58922180 +6 + -51.41016015 2 31.92243640 + 131.47547623 2 14.07215286 + -100490.54220540 2 4.21909683 + 20675.75763691 2 3.56801887 + 263590.56712535 2 4.06536588 + -183774.78117039 2 3.92650866 +6 + 68.62159615 2 31.47726702 + 10.70810140 2 4.95987737 + 233.01753836 2 17.95562228 + -258.78181256 2 26.97191776 + 12.01106739 2 46.85069031 + 14.75422657 2 1.35614623 + +Zn GEN 18 2 +6 + 12.00000000 1 26.60492300 + -196.98442222 2 17.93401272 + 89.18558790 2 36.25784521 + 6.19159911 2 49.96784160 + -5.19159911 2 1.99109193 + 319.25907600 3 19.77027094 +6 + -177.37971474 2 32.01501166 + 269.42130045 2 23.08836163 + 60361.29701582 2 4.67975974 + 1343973.13568915 2 5.29114502 + -619902.07009680 2 5.11539109 + -784431.36064381 2 5.38368747 +6 + 46.22045015 2 19.08371294 + 43.98275320 2 50.00000000 + 103.59052598 2 16.88459979 + -129.86700605 2 37.83300205 + 11.83058445 2 5.11918008 + 15.44716451 2 1.45112568 + +Ga GEN 28 2 +6 + 3.00000000 1 1.29464779 + 1852.96920182 2 1.20541500 + -1856.15440251 2 1.17879070 + -513.51787928 2 1.21964580 + 514.51787928 2 1.12868888 + 3.88394338 3 1.06946118 +6 + -10.41248284 2 0.75266853 + 13.44253658 2 0.82344143 + -163070.82529640 2 1.96346903 + 118782.06261627 2 1.90761481 + 72439.51450979 2 2.00432013 + -28149.75180125 2 1.83309310 +6 + -55.43707314 2 0.98715132 + 55.68679311 2 1.18143237 + 95.35935510 2 1.24163917 + -111.55606197 2 1.48647971 + 6.22134153 2 1.87957113 + 10.97737885 2 2.24689865 + +Ge GEN 28 2 +6 + 4.00000000 1 0.64699203 + 1042.65966555 2 1.17600365 + -1045.50742663 2 1.40672708 + -522.21837337 2 1.06148136 + 523.21837337 2 1.52689039 + 2.58796812 3 0.70634661 +6 + 298.52031462 2 1.37488700 + -295.91758286 2 3.05395101 + -65778.83466330 2 1.99750874 + 253302.61962618 2 2.10159773 + 25864.29161720 2 2.35028323 + -213387.07659768 2 2.16152517 +6 + -1416.87913796 2 1.43279054 + 1416.49405157 2 1.27947333 + -4677.12774504 2 1.39756889 + 6758.57740664 2 1.50728327 + -2630.12555402 2 1.70834188 + 549.67778384 2 1.92912262 + +As GEN 28 2 +6 + 5.00000000 1 1.90897798 + -8.55267316 2 1.59326524 + 3.44617934 2 1.10844459 + -8.94709126 2 1.02625257 + 9.94709126 2 1.90897549 + 9.54488990 3 1.18318262 +6 + -299.57003383 2 1.31601774 + 303.89084920 2 0.88992491 + 34018.91875930 2 0.82417957 + -44808.38727678 2 0.87058735 + 19528.43031171 2 0.91644709 + -8737.95845690 2 0.77833472 +6 + 46094.50987530 2 1.90902784 + -46093.10097169 2 1.56895782 + -1934.82978262 2 1.41134047 + -240427.05172601 2 1.84187044 + 36043.17172862 2 1.53235052 + 206319.71069040 2 1.81590910 + +Se GEN 28 2 +6 + 6.00000000 1 1.73885845 + -4868.76631948 2 3.10952817 + 4860.07291481 2 2.76656612 + 247376.94576273 2 2.93723435 + -247375.94576273 2 2.93039894 + 10.43315069 3 1.80783830 +6 + 43.48906338 2 1.54256367 + -36.07303722 2 1.99876644 + -1338.16209913 2 2.22244851 + 88855.15492433 2 3.01653570 + -93322.17292948 2 3.00370283 + 5806.18068397 2 2.62760372 +6 + 101.24952978 2 1.51703915 + -96.89194467 2 1.50669503 + -561.81915381 2 2.17759706 + 1474.30831735 2 2.47900419 + -87533.83638244 2 3.02701983 + 86622.34849171 2 3.03071493 + +Br GEN 28 2 +6 + 7.00000000 1 1.29861066 + -8.22129971 2 1.15959643 + 0.21335410 2 2.29768788 + -14617.16154553 2 2.88622041 + 14618.16154553 2 2.88664159 + 9.09027461 3 1.38987227 +6 + 1993.56030565 2 1.99554365 + -1988.14839885 2 2.18330258 + 62338.94920254 2 2.78298975 + 91516.94063906 2 2.50252605 + -109846.25447802 2 2.70576408 + -44008.63516555 2 2.38434210 +6 + 17.36412726 2 1.29580803 + -14.67327121 2 1.60078690 + -6128.76923065 2 2.16344915 + 12563.02678529 2 2.26961184 + 757.63553722 2 2.83383736 + -7190.89195704 2 2.41971949 + +Kr GEN 28 2 +6 + 8.00000000 1 6.82429532 + 2245.94610147 2 4.82301962 + -2257.24927570 2 3.38163452 + 1889.52842356 2 3.29088128 + -1888.52842356 2 4.98656184 + 54.59436254 3 3.01373570 +6 + -2003.10975854 2 6.01573226 + 2010.79212346 2 4.07497664 + 13467772.94730707 2 4.47273823 + -18464141.82809087 2 4.45030979 + -2607955.84552628 2 4.28291762 + 7604325.72641131 2 4.35368575 +6 + -6512.57971257 2 5.33963561 + 6517.54562224 2 4.41831473 + 55170.14413687 2 3.66247372 + -35314.20447418 2 3.56293692 + -27094.88743738 2 3.99199621 + 7239.94695795 2 5.23539786 + +Al GEN 10 2 +6 + 3.00000000 1 0.90167530 + -12.07740634 2 1.08338853 + 6.60507677 2 2.07851308 + -13877404.00590185 2 2.08053590 + 13877405.00590186 2 2.08053570 + 2.70502591 3 0.92748596 +6 + -41.26842670 2 2.04866185 + 45.70193781 2 1.11866688 + 2946.69575922 2 1.71721106 + -376.01922297 2 1.36753958 + 4331.41613799 2 1.93292012 + -6901.09265568 2 1.86705782 +6 + 504.79904464 2 1.88548919 + -502.69536383 2 1.42616967 + -769.46860271 2 1.80548694 + -17.66088618 2 0.95520911 + 101.43853505 2 1.20112583 + 686.69150206 2 1.52824179 + +Si GEN 10 2 +6 + 4.00000000 1 2.54461774 + -2902.58084906 2 2.24978528 + 2895.18838752 2 2.53789008 + 7161.72254279 2 2.34887222 + -7160.72254279 2 2.46336277 + 10.17847098 3 1.52421025 +6 + 4.24352962 2 1.08064949 + 2.05989979 2 1.33341749 + 88608.14855737 2 2.39993059 + -849.93508619 2 1.92845396 + -1434647.87047626 2 2.35634772 + 1346890.65714548 2 2.35320332 +6 + -15264.86061936 2 1.82998100 + 15267.99758945 2 1.91566514 + -0.49522434 2 1.35066217 + 2807.17037795 2 2.16756956 + 6912.45723497 2 1.79762600 + -9718.13169060 2 2.03990309 + +P GEN 10 2 +6 + 5.00000000 1 2.20104239 + -14571.76154266 2 3.30954781 + 14561.08785293 2 3.65491917 + -21023.88213100 2 3.60582863 + 21024.88213100 2 3.36814532 + 11.00521195 3 2.06883762 +6 + -214.99423753 2 3.00175595 + 224.31212541 2 1.90508764 + -1320.42895216 2 2.23252373 + 2262.27394007 2 2.56842585 + -5217.11058123 2 3.22957222 + 4276.26614237 2 3.32169865 +6 + -4655.41288683 2 1.51251059 + 4660.80718311 2 1.51289861 + -994.25816078 2 3.31761981 + -19.30793578 2 2.04639527 + 311.57919748 2 3.70626860 + 702.98798215 2 3.09154453 + +S GEN 10 2 +6 + 6.00000000 1 3.76431332 + 518.21506704 2 2.91975646 + -532.35656437 2 2.26777538 + 14394.84387811 2 2.49556645 + -14393.84387811 2 2.51698479 + 22.58587994 3 2.71241239 +6 + -104.19902150 2 4.55895180 + 116.57081427 2 2.10503756 + -994.81335242 2 2.63814508 + 2203.13414043 2 3.11140569 + -1617.61176296 2 3.62963239 + 410.29160018 2 4.55921172 +6 + 723.09548214 2 4.48128068 + -715.46568241 2 3.35956681 + 9063.41201304 2 3.83857196 + -16.38228027 2 1.92699416 + 44.06704522 2 2.30670170 + -9090.09577098 2 3.92706305 + +Cl GEN 10 2 +6 + 7.00000000 1 4.77392870 + 719885.76609499 2 4.74019033 + -719903.82223984 2 4.74189768 + -37102.89380181 2 4.67979490 + 37103.89380181 2 4.71510215 + 33.41750090 3 3.29732864 +6 + 959.05010082 2 5.01134618 + -943.54843009 2 3.64529189 + -6456.16063099 2 4.20510279 + 637.70704529 2 2.74283267 + -1479.66774202 2 3.00605599 + 7299.12201388 2 3.90198120 +6 + -121.63220275 2 3.86324469 + 131.70125226 2 3.08695111 + 5447.27282828 2 5.92092153 + -52.94814165 2 2.63467524 + 559.83762330 2 5.08437179 + -5953.16139883 2 5.86183616 + +Ar GEN 10 2 +6 + 8.00000000 1 5.17746158 + -76.72264736 2 5.90884243 + 56.16280755 2 3.53735685 + -660.63282107 2 4.53072721 + 661.63282107 2 4.90879705 + 41.41969264 3 3.95156133 +6 + 496.48392385 2 3.21092458 + -479.29969508 2 3.39224537 + -12086.26924659 2 4.28061928 + 37151.97923364 2 4.62803105 + 496310.90908097 2 5.10487541 + -521375.61810527 2 5.08995306 +6 + -1901.02320099 2 5.53714820 + 1911.87432982 2 4.52372637 + -127.53875733 2 2.45115265 + 198.78501467 2 2.62001527 + -976.26297293 2 3.97593759 + 906.01814260 2 6.12659776 + + + + diff --git a/data/qp.png b/data/qp.png new file mode 100644 index 0000000000000000000000000000000000000000..777e5ac0cc72347072c2ac8464e868dd05b17c24 GIT binary patch literal 42781 zcmV*WKv}Oospf02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{03ZNKL_t(|+U&hokYw3;=l473 zT$8@CT-)ldaU2H>W?(oV7KQ>r03w&cSSZL3l z2X3s9Vin6JxdcUmSc2jZ0AU7WyJy-|S5tp8T9bN#nLGTgZaK(+l8psBQ<{6}tW{-1iaxyLu_ zV{nMap#O-0d${orgPrTYKis}S9BdE|H;?rhesh7w+$X8D7ypqz_2fTw+{)t{`xx|( zj}rs#-5b9j?A{<8Y>)(-kLJs?p+56GmG&a_`A>>U>(b)|cntc-$D=yp!6xx=yl(h#)=ny)>eLg|=3b;a^@OOjEiNpQ!H2;3)SMJvrqRN9MFT8q?XKOxj(e&8|aKdML2 zSt1#3?8N=`si1q4c(7i8TYtpwcX4$B1Oid|-DnMJ9>4iCj@O`h_PNEznP-+B@0iD+ zKULt42kRyoY|z_!leoVDX?P;f^^pr30dfR!5RgVG=`dh89FPVv#&Pi~O?i{#0+-3q#{KM0SJUBZ+LOc4^2;( zHWvap0eFKT2}9CeNEi)>1_{b@k!}sYQbVZA_!vU44Gc?Y= zK=aJcG5f@;LV2~vo9{8`Kcpkwh2D1!fbMq~bhionL%Q89;v_;MFhU?Q^Y*?4!3QSA zjv#O{u*yl02Sbv6L>LT6VvSNR((_Sn1;_CanXzvW7@ge@sqJ%mbU&n0qYt*vAP~gq zfM_^C4+kV^Ol9gE?Zwa2I{(~m>)i8g=dmDo4Ejfk^*Cg(bNwIgtp51-XPZN6XU{@v ztQVW#!#E=9?l2tm81#4O?Q{@|%nF#W22PkDCw_IER(yGOt`n2h2RN}zRN~!h% z2W)S4*x207@19j#+F;Pk&(E`Pd4c&eXSuj|8QE%E0bok{EslwHcNhje2E82yyIoLX zw3#z7$&&xP$ESXfpxhp}!~UMeA#o6q1QBsCLPINi?Fj~qV5vW?oHxw`_T8R9CSh;MWzXbU~6lKZg0T$PKV949pY4% z1cAY5LvyOh-25DuE?;JTexCLdPhnM?8MAYBr^{fFaRY;G(l8pi0~6X`7{NG;c5f{% z_95Y-;Se3i41$e=N)u^K$p2%Uk}q!ye2A|*+avA@sX zH!0MLTbhGEG5HxGv_UFCrP;)9HmJ6$xV2^`WDWVg-fw@qm1+FeB3^5eO6&5+P7r*g zK_3sdh&oHJhn=OD;_ec|?yU#o8Xh)fYB4gTlO~wK{^bGgODf+ zNcz^2(MlqW0iB!V`+!g9!eVlt=**-S7VO2BGiJt{oG26&nz?Mfh;099J+8rXz~?WR z#2`IMrQX1ws!^>qaO>6Lo|X5p$?xSc4zIaDrFof3YjMe&T3qz1Gmk-k@`<*9sI&B? zsJHZ&!;QCz`zw!{`5Hr<%ouz7oFqv@dffp#oemr8`?v&HYhZqUj`?%*T)4Qv{JFE# z&YlBpN^XG$1G?9zKiDQ32K4*eBw^# z&A#qJ23HE@Jo)+onz{Hr698K4L*F+7ycxYi8&Yk*)A1CZU#HS;P^s4N>NSKhq{b9~ z3;C^j`1{yzUZghr0$%g-ulcRTKm4d<6rNhphn*FIt+!0ry+yEn^#So~9=afqnKd8^ z!cNld_t@FmWplg3_Ewi5jP_UquIqB)@&)G4o#W!d0<%v(Y1LjX1agg<#6*KG!JtpS z+r#nO_>Bde>O66Om(IpjdK)+Bt}h{lDnL(a8FQg?-EL_$J#jA{Dd00TZn7^j*?Xn$ zQmNOeH=B6PDz58i=Q0lRw4}*D=%#HYnet+N@ElHwuvFnS+HDaDZQa5)NZPNFRS{k=pF@_*09gLJ*ud z(8s|R(eBdg!PYx3g`FjmX!}E4)kh!*CU}8d2v}{K(An*=-RZEov0JzVjcSEP&8OEN z5XUL!&dzaex6@%?n2D`WD ztX-qCc8#RJYuR@rtu+7`A+ux}3-~e}co5)CDbXhftI!1pk5mqoW}RxYNwrZ$xqjh} zjPFD9!1q4=5cjp~PvcE3;x(;B;8tcHgMQ?PhlE>izaDmPy%hGANP0)}!#@f|D`TvB z$psJ^bP^E73F$B*3WxTZQ&S3I8Pa`-Gl4(|2OJO2tD-73oQkyqJimeR8o0GOj@QER zYAC0IQi@@Jlg`@v40mtSx%(c&?Yn?PNkM7^N@kxfB&pFzG7F&u_%s9j$WPZuD6(iOOgZ(wwKwxeU<*kHFnl+AVi*V zCv7+{b6ZTBX2hVuaeTaHm0G<)wOK_t6-;(kq6BjEe$jvrXv1@I1dLn1NOkT7yvF4( zd#%gg`=E%zM+W+^w?eq}wu!pSguNxq2T^^dPnO0oVlrh#f=-E|AxS?bjw6ydwqd{A zm(8fPgG}kkYn)s^qYXlsLI9Y=GVvIlX={N|3deQv{2J12;8yD>r$MFGL{?jPl?G15 zS_VQ@kd9)wy+mj2eR{XA)8Aet8g^02#c$Uw$QuWP{Kz4+k9f++y#$VsK7Q*mUh6WI z*%yTWi1>kr0{XCfi==zYguPpYn{Q)G#AG_D{%Efzq@(zADUgRrV!|LmhcRiKkfa)8 z((+0dntBg_%bVl~U?2NEHDens2cF6PmD6UGP~bW!r-JX-kbcwh0bUKa(!{MaP?ZK= zrH&FI-Sum9*WX0>)sGHnPw2S|=~A0{5vO$t{~;w39UJs%91w25eKYRfx*Tl2i4h4> zx+Gx-($s1bDN1PIL(3_Dqyk4^iLa6p7ep=z;->4TI)QOnHTX|mp*0G%+HS7n(WA+AFTc4_0IJ_c**sr zaO=}Zw}r?`B83nr1W7U=4LijB9g<{+G_naKxtW{$sPQ>xL(0N!Y}@ZB0ty+)F2@?i342Kai58q|l#-y4v^Rt}0c!7n* zMW*M@P?>5J`R+v~VfM{Yze^Mi2?sr*a6l5rWE-Uj0q)yaP0I&Q6s=X+UAKuLkvf&!8#Wn*ib?X6vQdwn+6x68Yx$RKP?HJF{7W#Q5#E?&Gu zieyxh@ds*(fE)~+~!bC5-Fe2k9gvuL$!1mS_TbmuWJ3Tfwc8KG2 zLJ-&t!t)CkxODj<7ZxrtJ97r=E<}1{5tNQ-*dvUFM1wwYI3UfU8GC?#L_wfG1RY*p zLQ9g4D*USTDLlW5SF7QBb!0v3_M_86*=30j^lsl}ePfL~t1E1-ZLq$vSzNm7cudXC zG2Nb{)t;kPZ(-1wc*rmqkVZpH5~2-Ue&shf^XxB)`vU#$oBzTj-5W=`Py;CGA{`&$ z_z2%eIaPEf1afn}5ClSCghU$qf26J5*1-;G&?AkyB*_j&k3vl#5w`Erv4udsiOZWP z3}bW>69thiN=eOFTwG)eGVTw5_<%RU6lJExXKRD1xKt}O{8kOWTE+3aQ3anKx!_0T zamv<@F0TZ?Qls6TV|s3mT5XC(a|)w1X*?v30^*=g8ixhvQ0~9bJo6mS z{^Eaif1uxa{dY||xN~fYSFpiC;y6{LTS53fcwPotku9`S2!hd~N|+fK!#?RCAPTyeEaxBxeX-#WQ3A&!j3@I7GIGs~0Pa@n zcwUWaqlN2u$YvWz?e@(9UTAT}*3wOuZ!NR6xyHuY2Hj4txR(N`wWet{TFlJN(rC|8 z@#`3^(NUk_aEM8UBylvpP-4#y0My!-dH(DF{r!VJJ~HUp3zmJX0Y_C(eifm7WTj%w z%X}jlRkTvh1%VVY^L6ZN+QcN`4(YH%ns!N}&@M#j1{!HCf+*0WVMwAiNtm(DV>fD? zf!#3+H%pOX@+S)dq z-hlOuT{hM?$6Nv_GBQgWE?l%lMGKb}xp46!R5AgU>haD)KpI61!)}(r*dqysb~UqJ zge5QTNYJQ|L!{L>vy@cyu!x%2J7n^ zNFfR>4p48kX-~~DH9ODr^ejRujM3;Y19?0kj)Mbw7anfi)MhU8{MYUi^jkmuXUEX= zhclPs;2Pan$EhHFALZ1Lo@W)A;<%m-n^8`w_D=*tMnTzCC8+cw7uUf(L8_0Td1n^vvBnF%j*|xH}%+~rk zt2b|Pd-XO5+sxC*krmROnWZ%|PrcD*sy&aC(rWU!PcZD0#C_5@D%{_Z^>Tdor9OR` z7ry=>gZ@xqFabOvJsh`!<5m!riUqtV^@o=c@#quQ+E`!$@3)#TcYgIt*Xn_ry7 zL+tUxM*=_yK^Z*0-;^;louEnI>kzbms5J;!BwevXC97dd}nf%%J zG>QnqF3B(?jQi+dIL8b=q>s;f5_JIPuX7n2^fV` zGV6BZ6oLRaGDCkXuusI>O%^*>()#3;W-SA`Q)u}zcO*_AxF1B|j0u8_6A;p_ffR!E z^=&%cUf~j?Ny;8aQCouW+`>hsXXm)Mc$sQ5>yekFBTHZus2~b@2(3o|&m5=XMk`@E z8fReduC24Vc9)IKHSXM6Wqo6FUw|ver9C@OdwQN$dyaZ@$_jR!5C=Via6lUMNt4+2 zAuPEcwgKqFB_nIom-)ok|A*56`g^gZIis$?@p1hs%J&h;BDOZxSXo(N_2w-$HaAG3xJXdSm4dV;Mc=c&2%~{-98?Q2p+nA%$oPo+5P~9U0;_bKCzWKN8EdPXIXRQzdMP-^4 z2%~KNyadd6{=6=+sv@g*SB^uqQKMF`;rdk^-?hy1A(?ik{xFY75Xe#TRvf16bUJKp zZ?V3%OSjiYDn%OG#1);j;L;e*oxi|^h4akL&vWMD0$#)V=vzxSSzljcYh#03OUv{- zU4)c2p>(3ku~MtkZqGA4dzRMp9G+K2YmG?*qF_Kg=n%(&?fUy6fP9=&5wzwOdG?q7 zyZZxuaP{}iVCxo%)|}kEY2hz~WaZi$6FuD(p5r2FP5fFLx6;C|weg$txb=A|^)|9L z3u8A?%KO_@7^ft3=j$_WR{;UK3JHhHm+B-LL?1{g8{*yLlO^0tbN%Il#H41AN1iU!OYpGdEzVo z^?@hh9QFZjUgw>j^rD!|T$2(houX>QU`U8Dy-mXI1_+5GU6kviYE3G&X}tOjZoN&V zI*VJM#jDLibq;s>CC*O2#M%5ShBw(*`T^TFen=;4Dj}7kTCY)UwW!vsIIc5po}012 zU`9}heIqXV1IQ!)u!>xcDr`hiY%&5kTBD7@uePZ+YIv0Z@-Gwl||| zrO1Y4S~Gv`?p<8ZDfWlKP;IqoPoH6WdXDzYS)>x^)R4w~f?kJyyh;)eOE}2HgcJq9 z%?WU=WX5kvd3c!eP|%A)YMyXEF(cwUuR@w6`N<=MMhF)v^ZIccuG7(gBaJBF{gMcA6|H!YMYNvg~=W=@R0>7D;atji9Ssq+i3W)bOg)c=c)g`YcXu z1~*wFPP;huy6tK!=kS0u?vn&vFcERw2a}-n-ui))R#N&w3maofAkXSJ${_drCQiLM zirM8LmszT|(e&3gSYBS@`qlSYSzbjcg(D?G%1q;rl71Y=p*?$+TC2@;>kKpVXGnEQ znrhOpM`vw?BtG3BKeh{S6pz^mILYo{QR^lIQi(Al<}mGJ#)ehMqMqDf&|!}t>@wKB zYdr_oWq#pVXir&kPp4>^f{tzYP&ugj3<8NS9FlZ^j)s`HPn`51CwWXM5^zEV!6O5C zsnSeIAFpN0NS(&?1juc16GDN}gxwA|uU=(kX_@8aRoh|=iBJO9b+S&vwzk}H9HwW_ z(VUrQX66jd<`jue(WxOBcG$UllQ6QGoQxam#f~q2*C#VvdMLZ4&7PvHV}t%QZAa<4 zm?X(6!;T^>$~R0F&xsO&q_V2D;V=LsX)i`r9B@)QIKq|==90sj`6fX~iC1kxwTWjW znv^sepralp2}yO3b+4UFvlK@I(kTPER0_W_WkK#Y!1u}rGR0~jrXpwy1LBL z%@z8+-iUCM0-@~O0FA+`)R~=`r#*Xy#?&;8#tf;B3XpHzT_P@lTp;%S|HtV#6!b|p zLg>R}oR22qtoBsOBO!QTQC0K=u%3Xe8?V&~db>>Nai6G?m6F7T7j?Ea9O5s+U_>~5( z*FaV)`5$C8%eyVG)Ogb)Z_nk@4W@F7*k z0B4nZ#u#)Q62>7>QHJZ`R6LwY1=p*fT#1kdkxGyPjV9H3HkY)+FP$p1Y8V6+3`sIT zheLE4q0_-W(_zIugrEKZ?l1eK`rET~{U)_W3+305l?jk%M4GLI5NzDK#p?1B%S$WV zUReQ|kNglQCu3W*p<0__e*PTo*|W4~&LD*gB0)zn!LUPT_YQH;C61!f#9e`qs#veb z$8m_fob5J-lOEy~0;J#TCY;8g4QUIW*w zBI}J2$SHwb2vCyV+8QgjZgT79GRw=$=p?Zaml7pap>d~X&oVQ2hN<=$T2nI!$HOEM zCQS&sTSP&hFzk{hL2dp^Q-5Lx#ior0DUMQTe`vuZ#`NpPldtJz7UF-g)x zMhNvRjTMSHuJI8z;$alwK^zg1aez{Z0l{6B;4I)`Q}aTtgLYL z>U*|HsvM2Vl2V|xVR~ks_WW7eGv}C@Ifpjd`r}cberJPlxQmGcl1!7E4C)d!)^gnN z_$VA1@t~kLr{s>Nj5Pdx?EAyWKSMT~-W(M&<2PO!t0&ViAPobC#vp{mQ69>7@hcUC z?;;#ogoyH)vP!CAA+;1Je+tJJcnHuDaXi2zF*+Hbb+V5TIEpZs0C}ddmGbcG%@N3@ z$|}%A)|V^IKrUdAa(nd_D>rZO-qrW%_j*O1hd>~u!u1^5^XHkKK0|x{JdMVTtszfh zk~m~{V}&r-B@TL+Br4X<`05=103ZNKL_t*3?BUntgjMnQ$RQvxduu~J%9>tC2dTuv zA-YPRAs>*(G!y5OTLVcNk_tn>TLo{*`xG zU0G%A&N|8yg~=_X#IMzvn>$ORHN(uA3)Jh=R+A^1IPTFYgIq^h$JY$xN)|55W3T+^ z7O9PRJ^<+L6jHON3(g7UEp6(h*w3ebFkjaQZHG8c%t?O;YgGEdkeZNTKP2dNGeP0t z*DClG4=G)g@7RvKS%(;noii_`%t}+ibt>Rg3h*V#5S<2?ARyJzm=)om@ETQIuYu!d zAkU9UkmJ(3v&QnRn_Rp49!pCrNGXbDn!;67Di-8ZXU@}}J&#|hBQlVOVUO)QHwnWX z;;0XC))=xVN+~fCV$>DNd~7}R``b^NdneW0lgP_UKTm@pB@9U6a9IAJybmiNHz$oT zA6SUThF)TVeoWBQ*|~c-RS&P~<0=p7J0JwwqzEl+uDY=!r}O-4<+v!v1Ahu36meo( zF*%N)I&;C^v?8ZGZ(Sz9a|w5Lxpwsmw{9(QdwGR$5LuR8*usw1^eoeJ=b4>7OLKY_ z$E_norpbdYoz5oVaC-!DDN4kfEUcit$+M4-N6LMD)Fd6sMd;{Ap_(JR0S1sC+^yO( z_)@5BB1%FuOo#@(kr1f3IKGGH`L;1;#^35RABCA)J`yQY6bj?Fs5X2^k}PH}!BGr% zc38c!#OmrTZrxa+*Xi0}6v6_1_QC~PtyyMf&oO=G!f0G|stJc%^tbL3gmM?UyI`4BZkJP>&k2FTg<`(5-BCWID z0#=Ae;eeg39$VX8+GiI~O3~ZAOW5y_1Utmxu*5Bh!s>Yp@{fUeZ;Ei8K24}UR%F*4 zO8}hK@R7j?%kB$fQ)7jM{?2U%ojaq7Gntng+rlC1i;J<#e{8Iu+(Tv>&V1Z7ecn>} z7;hiv0}eRSQ|_J?Rs6a3HWuVUs-iJ$IrHr?xR2pZa&HUB7?bsIFdw?LbSUU`K4|n5 zNq8Y2Ug_z0lMR^YhIM*2XPzE!O6V7&=o6=<_-M6;`H+CW=QV96tY%SC$&W^`YpowF zBhThTou1?z47je?-@JKHGM}v9+9`Btg|TF;F}7ErlpjoQypI#W4+8wyWTO+H z)wQuxV1+1VOWw=MJ*qh@kqm|*t!jO5kG#`h(Px!HqSU!ot7Be=Il|8;Ueh0U2bkji z>9UTWn5L{tCVigXq_GvtCQo;gV$4c-P~YEZ!?mk-`TqB=vV3!c?#_@;ymHxs{^O+S z9VN3)E62N`hjDpA2!s-JdIQeQ%$#OjKmKcK!*)WM`}XO}dtZo0ClvAyKk^6^ggj7V z@4X-L5J|5wc5p;V@8=owt1k>oAgOWfFEgXJ0DdQX1whSV9;6= z0z^xJ(WA~pn4Z{bR$<5?zEiigIP z2qaPnf?;5{mlT{vM$a6yzUF8NM>){J&H->72haBbh@%Lt(=iQmkhU@TFpp#V;|GD& z9N|jydJMCtMYP;caFm$f(LIvI-{%@%>rp!|orUm(7{$r+n7ok&jX;f^(O%Xc;QN1h zh4-%9Vfn^7J6i)j|BKJ^YrpZiiM24i@uQmu+zs3Fp#0v+`|a#q-0?SM7RiZ+zw0Wb zk!Yb0T>kqd_#}dUFSLbr=JXQZ<^lM%d`l=L@qM3Kt%mD)#8E^X#|J8lbf3fS!jf>@Q_5Wm6&hps{`ao(v%kH`oz-n#{_GR{`ak%5woZEmWWN{k{l9vT zZ~Xep#U)&QdzCmzICH+updZrf49i|U_abSIgb;Ir(@%9~TDgAB#?{5ceJCZlv$lcj zsE=1Id6tMNCAf~n_Z+IVngx8d3PKQuAwdw3rfF8vY4(`*xs1%4iWdL$_(Nn5U0T!f z*3D-E%HkmoNv=7V%o9=+-(fPXEpnY+5-M^Zr05BYNr;h_H+yegfg4#me+0bt-FLb1 z{#}A$bPxW?3chRa+-7^LUp)JrKYkN{=U=)=YpQyD!u!xy(*%*&8TBVox8<$5{aOV_ z*{&}Sb>4cG>?4JsQLWlWlBaCsp}=HAb#2=#n~5ti!W6voL9-F06!?AxzvAO42ha2H zD?U<4y1g!g!H_79N8Ob&=f7-mj`7nb*MuXg>&WY@4Mqyv;yL@U(Pxau-*t(Z*Exxn zokyCzFLznRr2oz+tX7<5HZeCX?v*G2Z~M&K-;FkeVZze;>%8-`RTiI_=hLq~m7T*# zaFm6jpj4bQApp)VOmlmAi}gDl-g|SE&wl9{wzv9h+}TA4!80$O=h~IK3IzDpLk(w!uxw{LOvP6p+#sjWkVmuKSUs`CrQ{?v-DY9^>4{V+3U% z-Ao9dv?L%*(JG|e=dV1Ueq8&Tl51d$L2JXx%}tU-^Tab}_&@%aKc%xXz!<~X^X*Jv zjJ{iP^wRGyefALsqhMSE`JE6WR z7^$dM8$60^xqPTZnxrFR(ma@u`cOOsa|~MCSPftCE3~KDv|24(*Cm&FX&jTp36A67 zCMXzO6v`c>*W{V?ZfIwOVDWJ%v)r?o_2f2$a?+rSLot&+~|) zumt+?-FHyUMs6DG2|=As*eCnnnu+*#DJFiH<5dQ{HU@>rTpW?L1~Uh61BT%+;`-G! zuDrF%t?L`?ZViazWbA#8tH#3|xv8ynk)Q84$1@j`IOR*f`~ugm+#w2MzWb+d((eT* zrFiMpC+>TV?-{4pn3L(n8iO$@?V0J(v7<`sQt}UA@c3-44Mp9$Q4$b?~b$t#*~O z=cjn~ljrx988$D$AOs{j#gTHNu|`%GvCq!Z+Hm=)d7ggmJnz4Io8@ck0Mwg4i%-oz z8ql9~EnjUi!y!2LH9fEPv-{R75z zg(!=YRWiZe8C%7Z)-9r88%m{K8kB<l)Jif|sJjG}K&eOdA?w#TsKL4ekJHQ=%NSfZ9z&O3p2CY+O=4bB-^7{?5 z*`|?_t*uP}YSl`i>F#A7iwVtF{yi^i&3~SJ&)EAOmVC@&^p?FZm4(Rt1%ok$IF1<( zhoosbnmcCw@=B(XJJMK*DApH_SOUB_Ym{Q(zH2!Pz*AEO~AA~yS`N>4Vr z$k@a0{PCN-@uMX=+XG&Bd4Z>&KS#e80O0v9wT939*%nLJ)(Hcfg!IxYmw4q1Pi9%Q z2k$T;vU+<-VIwB{5S2L@dQdUf`AgGWerk?8D?3!{KA-*a{-7W9qeDOENT5#>Q&bC` zAgdl@pgGgVsW_PQn8h_m76Jk#CA-@_Te7Qd?z%q8y_g`gMEUn}J;pwTDPrP%55pMH z22|l+XMoq)NMj+!xDaC?j$;P>0YV7UG{tcoq*Q2~5@i{9Q4|q|5owxc8dVe{ueB-r z_2$5JydP$?hzgX}Q)J=1Jme+z5eQoE6Cf1u-dnfXTJIL`(ZJaYZJvJa98W!amP=30 zQLX#@t8t=n9BVwNv{?KvDrjYR~?A;-y@=Kk)5DV=*hN1nWap*YyAHxCgu z8iUM;ygcL0B$){yC(V0E(gdwjq>?B{p|vK;O#UDU&{~sf>u1}JMG|B3T<~N+m0nz1 zZY_yNxUc^3U;l_Ve{_o^u_9n=z02a$b1XhJH>!5id)G;p2sLp8f}~L3+Uy}Wa`#x6 zk&qemLc$=)+y{qC&&(g<)#!V201Hpfj*)=YgZqeS`uynaba{XGZO%V&nO1wsY8g0I zrq?}GJyD_w`vFo4Tp`CYosRu+!m{Fy;}lvTP17vFLw~rm$t2l`1+nXSxSop?k|>S{ zf`A|hh@xbaJ1;EZX-k@Qk=sxX+dU{haj;8evi4|uGckLepa48TcX!B-Uc1iuOVhY+ z=FsnB!Rd0bK~@-K_9P(f%_!8_#Y#s(WI;U`M5LuGQKJn%{Qur(*bf1iKi6VmaqhtD zR_f7YggN)}pNnZ1C+sj;LC4j%uV5U>%b$A%*HxrxW?t(1H;$#WB@%aT-$rB^U^>gb zI_kYB{Bi+~^28l^i3h{A~P{KNc` zKl0w3B;14)IIe^5`*@y*loF-X2>8aJGtftIOcaL1NkW<=MNa!+iB{&Q!oZZZ)IR4r z!MMAwi|>0lN|B@~aU2oF5!#HZ@^b4$3ajavD9aX;OtLxHOupCg|Nh&baplcb2EC9Z zNpT#-7ry#zQE-xL`~BA3aTJYqm7R?qul>bUo_zKU)3dcg_>G;B9xuMxZ(58fadNqJ znNJIP`nfY~+};6T`T8b*^soMw_H3Q?yB)SSdVpZ@=`(!wS6|}NlXK(!AEe+{fAg~z zy!z3NQ<9uo)Jx(xCQTC@N1+hB_Lr~m)|>C(c^*nS838579@g*79%BCo(ss*PU)w?f zo^p-^_DOIGVViY2$|(SDv?fi{tkaA^3W4i-RI4>w%_i-3o2jWO8jXf6ba9-K#^(VU z{mJGCy7VxkM}E$p zb_RvXo+K$heeHS{i^z&^v@U)wAM@v0y!grjQc8NAA%FI7e>Tb@G~=f2q-M=as}BN> z%misJ8b19CPZss@U|74e%au1**YTlpp zO48kKZ`55BaB;bLV~Nd;4L~xaI#SXf25fEZ;U}lZnJi0m!)ePy#4wrFMa0Ho;_|Y221IQ+!8SR zEOus9h_N~VLwmZ$*ZCAd%G)5zjMQ@-#}==+wtywibyu!SMM{)%a2=Px35mkYr%v^OLq*L# zVL*%_6$W=Ax;$!ut;bAz$5D8$gOUQBro>@L9NU&yd*wx5rB*5&$z%0n?X&hL=He*j z_x{OWOoX|{k01QiwJ}pY%>;RGcgVFXYrOFCg?n-u)3bG6{LCfR{-{Her2OQsuk-YC zXZDa~lkT5wGP0*iCL8E&>jz|(0_e-pu;Itw{|P_)$?HhZL%I&ak)XuAAC6>oWu?f< zGddH12mQ-m6XVZoqe*m1oW%B#CPYb05QPkbA^ky*Zm&yk&}T3hFbD>OQAnD^7^4x6 z!mCwjOtqMvZqsT{Wo@clgk=2t#KgIj{(oSYQS99TLP%W4#dTezl$L9VB9bIIU@wW0 zAS-3=G}=k+{x?1e{b( z;!)IU%cEHjr?>^S!K*mb6PJD%j~2;fKA6-vxZHUECQ%ge>Ce4VWR;minR^97aqH&o zj6H>By?P|KU=OQS)?E7}ZloDooa&S$j&WR<#7%Hrw|Gcp2Y4vYrLGj7=MoHqB3_ zfBwIJkIwFpU>Nb={?ET&Xj6SeLg}raEEn2wX1>9zUwMYxx3&wg-nq5I&gOu*v(0-_ zgsvm`$~RwN>Dney81s`K++=rau&=q6>Jc{}q+mFRig#3M9;5I?1~dse(I9Q|Sl;5= z#x(DvNb3++>cB8))_d<>HTKTE{J@hszcRn@M!i9j^a+zFi*aR@WLhGnMth3YTesQS z?(ns5{t{9-R@;;cFUnd@D#e}UmCQ$VvbIfzBM*2jmnxVeyf`FX$jlUv0rb7xzeJ=fyN zpPSE^aM)Pya(j7)*)xqpn^WYlo1Jg))nEGr-~KnRb9Z%TOz?}(Jn_sKs&#MA?0H*Qll9A=Y=Qj{3Mrx}W%>Fh@4mIluYBv32cqUr^{|WF>}pTd z>Goj|M0V2&vIYnesloAJFzEB0Kl=;5`paKMx^6ap#7x?@;7G2&_a2V41fJH0TGc;t zJlITt?Wlh<3f-keQHz%(c%Db0kR#KRagL3ptUrBSGkqxnB&nR0j0% zL9a2~S=r^ryx4H7>ZFV;MAO(&R{NMlVuldT?U*Z#=US$4!!)6$2vxfjK`^fgT zi#_)#w@3_d^ZgA5J)7uKskl7(+!+AQoNw{sr!Vo=kF6DO{pvdXZn(FT%=l(53?SEc zdG*Urb7y&nL6#jid#1^YFJC0@8R*DSM_f7CxI^qSmP%)SyDtAOj}-#j-5GG>>KgC8 zb(`gzoAf%tSj0q1S=0_3E->_iX?k-C2059`v}#W^+1c%qNKHPIB5$)KwB68yewXk3 z$)EDoZ+-(D2PyQ(S5S(T>o*XNL}d%;SKSY#iHOlwTWYN{3&57LT7Y|ao{Pwse#iG| z2pa-)9G4&%5=AlN31@l~UJ_Yb4O6sh&pPHv9LGf|2ZJDv6QU>~i8ZUsJACikZ*%L~ z#zfZ`d;ICY`!Vldxy?7f^=TSyXAgV7mpc)Mj<*N6d2LkF{=%mh09d`X!?kzsa^uR{ z$n*_k-uUq{U;Ns$_tc(XlMpX1&hUk=J;zkL%H^l#@O>vE;U+EQQHQ09?qk-O} z#b!D2rhaB}O;0u0?e>V%)b>I%*=Qo$f(7L|^t(O2^QYhDtKax0IF2>-r2xm{o!8&M z%~@z^@RYQT9`2FRzu&;t1GzOZ;u6d~#$=_bLFA_F?*p&({d8!*!Jf+S9e(uEHrcBmzO%@<{U|iL1i6p1pCL? z^PdF*EkQAA)G?;bw=HovHC@}wtCn&R+B0=7KRwUl({o&UYVLTguEjBY`u#@Wh|@H( zF=MGMY03ZNKL_t)hrxA^+z0Ut?>{)}+7x&MGhc`~_-_eHf)|Fht&)ZomDR zx8>ek@3FPsE1uuXKHqT^m8wgrPDlU_IA>YKND;pK~#a|mMQ&$f8_#dCb( zGnXt>vx>m60K~*p%+XX?vd+8KS5MK|Xw>n}xrcIT0(Q5Dy#LN^Zd_fXyF0{nY&2$P ztIu!!H(x(+KmF=&eum3W%{>&(>qzE({^mS)<5Z1qOYP#;8#U4{L}{Fv`kDBW2BU5A z%V4|9>p%EgKJ|-VvYP6>8@6GF0<=PCgYWxUx#E#s@;#b<@@JKy&9dFLqs^fy>iKi2 zAx#s~RA+==TIBS5o`+-HtbwJ%uhz3vWQTsQN30>%qtLt%qUZ;o3wI?Yp6lW$TS~jS zw9X&?Uq2)YV`_Duul?Om^7Qj(3-iGD9oma^e)(5k=3o8Z_W)SC-64&wQ$CqrlBQYP z>(u5L2n11F?%*LvjUY}8?_XUj&du{(no|{;Q&r~9wYYd`nsWu7zqiiQ&z?EFc3y)>_eQ4f33?$;_av8GXtkO(qA;X8 z9A;fmGbx;9Pf1sC^Zjce1fTl+&vWy=Ye?nTg_S@Aj#7{09P_4gO zU;Xkk1>h$I;ES&;LI!%B+H9T>91lEl82!aG zEGS9oL@OL;*|ygeIhs0yd+F_oWgRmWOVlPBIGQeVw$p%MO~7ky@%C$%@Zul8jw=_} zVXZ|Z1d^15G}A1CF&3*=wzkz~h+>Hg=hpD%D;M$RtCz68N>$H){XhRQtQjDk(CPLN?|x0 zp;o$45OyOwE;wW)!3FiM@4t5m@4Rsl0MK8|@bG7jwe;Cr0nLG>#k_k_2@WB6XKj@3 zDi9|mz2zqaKm6Vg!~Z}1-2LeHb9{JtGxWZ365)$qekfdz#z{(B3#7dW&wur?sl%n4 zv{-P}3GIwwFsvn;=R`CcL&ye@v#uIqt?{A>1|1g609H7qe8%y{56|Lv{`p^lGg8dG z@AM%&_{b5QdiXFF7E)|%j8T`WL-v_QT@K@2YK$TK%Ga+_P{yMJ5W1U~uYiEuH` z+;gz=e}{&JwKZi}H{Vav6sbuNQObiA0&*e2Vg(2uVKf?`E(B@kwJxeSjv*u+K;Qq) zTOk1Qeu9-F{Xn&CeNt&ICyvk2M;fT*|hVtFP|IYi(h^Wb)_*LRrubw-^NRB z-hS-FGXBQTeI5%-8UEz=eiVM@i(h#RD=UYZ_s4B1(%hf$4PWtSt;05B$mMJTXmguN z)=n-hIiGpn?e75+!?8w%E(CI?!%B z)$A~Hc!n5_So{aUVG&0k&D%pl4JMqzo&`r6Y3hb&{Dkn+Meo0i)`*otk|f|!4Dbj@ zWAr!&=M1W<5XF*KOf4Vy}g&z|~8e zcp^Q@CX0u+nwI|iKkEDZ~q5h!s$ouA*!#n_>F(~ z3+`a%ZqbQGg;I#lNYr{`Rpv9Nn{3oIs=7i|)zC^o8|{{Twi&EiKTf3o{@4H4cd_PF za{cW`-}?a1{nY8Ea`2{>c+%#@1K_E5FAMyp;R?3h)iUC+tOOo#v+ZAn|8{Yhl%=Z z?@LlYBlnr?Mgzb7yOh!}W*jv5tTr%QAZ9U`jbNojwwUAC@nhJ^2N0Yi%Ti=n77n2} zja$zZ;4DVJ-w$I#tu>4_c=xsQ_{%@18Ge#TJo&j(SYKZc2hX$5-H$7muH)+Eb!=^o zvAI6R%E26uJ##Of`rQ3E`M@Cv!Exovm4Jd{k_5w;qwNZ(Qq00d%^3p|0@6KiDJ8kj zn3QxAtvd*+I>>h`rLeV8;L-zBj7f9%T-K^xO)CI8v~`b}Iqzt;J=l_LvtIWSsvMKO)Bs0xMAu*AW`{cW!EJqlw6 z;)u5|`jljRXp1aPQPs-rL^p&R+tNkX#vqo?AJ6VhX47JOq7Gc9GD^X?ahc!(NfZ-- z#5m#18^95|OEeb7UF=$jW@XiFP+1|dxVVTc?Gd6bXuHlU-yAuz9K40V$+=4{03B1^u675;7JrQetzxz_nvNP!3u>HIk>XuHGX`I3|b zU6@ndjUXc#X83U&gUQG#InZIo8QD?$>}`wztU+DZxbLCEh$4=%G}u@lKA`}-gwfxd;Rn;J&BX| zAH;Y5?YnrRHIAHz#9utWj?0%eaq-+5uAE;Ft~);K&%M6g>ct zBUDU5S=I2Vy#c1v8jEAm8f)E(-#cUTj!_!{rJNQU5b@YC#)Y+K+F~l>fnh_jh1Xp;bMU*-jceYgqsB1uL7*}=|^%&Q$ zUkAXNURX-xJ>rCyWr?5pTTkIH{^Sk3|MpdsCCPMMzPJGnKt>{Dx4KgJ<{!R{=l`ag znFn3GY4;e`DOuRI^JK>6ym8?WWuX^m4EU%2%QsNhBm(`^=k7&SDS#1g|4)AJfiq$r4ojU>7@3!Hi9Dh?f649q_6 zcnR7OpI&?UJbvuU4|OQLQVLi@grat(w;d9H^uz%?@|oi}{n*hdk&xX2d9$dv+t2A4 z3re4#rfd%ofh3M3N=1t~0mCpHQ6ylo^XTJ-8vO0*ehXNwX{x{(5}uNFUK~SO@>jE3 zkxH$Ul+n`^X_6pL5=0RZaUcY#`C1DY4X7GW8g*5nQW{2clCxGdii(21*UJNdmu4Ay zy&igb4#pTBeApmKBV4__f%WSnT)#HJ@=A_V4;{w&_gC@aAH5MW;Me}&Z$n6ihn_q% zMJ8xWI$Kqhojuy<>>$k0Bv@Y^V*T0(*Cx;osxsUx@XfEk z8V;r>K6?_6KYIdN8;pwrg4a%&C<2!P!_5*`E^KthW&m*Nffd|yY8hwVq;=lQAFN~T z+5r7Lh6RzAPMtm!f_`&jgm3=AYk29~XK>{B5{82kS1zuT1_5I@c5)fde)0Yw3gU17 z;D7j=&GoqpORIVD?tkuvfxOP0@1RAy8v^wN5JwVPX{u^m6h<<-63>6U7!F94h|2D!+VLB!IJri?LAx<(`|SS%bLoxy0JsudEYf)kH* zns|(Ha4vA*04cggQH1sNb&SVF2+SxF_`;V?V{x&Mr2~sNbaV+KHUKZf>zS0|^6oJ~ zPS&)FeD^KZk|irEg>Qf39lZI&OHNFq`cWl%zVY?f@WFf60Fd4DPyO6u zv?A+P4z)F~wuY(|xD>c>ZWY4;VHL|OISwAmVXQ?lR*2Jv!!Xz?aQ@7796zxPDH+l% z!joUP57(}2;r#p8VT{4%`UsorBb;|zfW`u8BJudMC-LOx?!~baOE<)>yQNj`PU*>- zorU)9^fJG4Wub+IU;==~t_?o_rEi*9niUI^N9i{l7snjlRRNLRKyqCQ1YRiZ9Q z6Thy=d8RBY(#q31Sa5~1+FBT4!EGZLLUvlUL+l$~dtKMC)N8V4cwNaodRj}Kh{EgrE+N-$g_Wb(`DSrM}o^jx88*>1x)zGj&Rpaf~FNWuS z==dVO@%7j7{@Yh6Lr>h^{NY7B^Tkt;l7P8m_blP7fA<-@^8ItT^uanTEH+k0V1ncH zqet+_XO82Z`<6Qr+uKT;?UDL!cJZ@!C6L!0;W0!)ke(aEjkECBE)IkV!e8fGoH^1^ zf~=Pz%X&zY1W}q$pUxO%^tyts6^gPzF(zF+Z-1qzXPHA&{mimY0{2rYVvn!RqQNHa9l|uRHH&h$0z$>cgTgvmFn^8pVqJofZGSUS)P z%P6dkHMqB}7*%-p^+q%A?H^t0yqifX5ygT8IRIR}vWZLQ*6_fiM<9rsh=Ygw_^F?L z3`J36v{hm8K!zldv`BS3CAwWS2%pN*zWov-AxQGrSj2(^ByI{onWL!Twcj|S3L}bR zByo&1O_63P(lmpJWMe26XK#H`NpbUJgei z6yq_ZqvUF1kh(G8%ArHxLVyc_&5aGRvEm$DIEyi3TWyR}s$oD?DO^0ehWFpPiX@A+ zm9?r$g+KlMSFyG_1Y-Lp_dTT7}IQ5*%2`arDFzjvQOSzx=1)32)*zzWy2>eE4t}_cD;! zXWmPY_mW$N{oZJ%H#ZgZpYE2v$@ZK~o2Zn1K70iXSeQ**7T{_P*X zfmO$Dd-}Qi@Yye&nhNOl!M3v@sm12{2rvHO8@T@A7M^+TJ{&)}+&P~a1Ag$==fY1M zzxMzhc=#}m-**6qjx8d~;=nz4;L#&kyEedsj~>BePv0{YC&t*@-XU_^px4Yo!N7c~ zL*8XyXK%Et*SZ6F#7k3kdv-uNU@p&lNK=QHM-kahX^pBFqpB(t#TespfvPHDj13Dh zy(C8BY?6reWua}+NK0d$>W+0n5lww>nQ4}N9A03QLQxbL4hE2J>rZP^=G9uG*Xtok z5*#{2$bK;{5GORY(n<%_T>nO_ULE4xyVp9;YOqn@{kN~-v8Sg=CR-Z?Ui&_=)v{h3 z?5eh_j(s;jsf>5}v7@+hVFQD$BD@Q)y>uSeu596RUwQx!KXD9^Q=nmBc;~f-JOA^) z@(d2H^kKAtVU3p^;|#y}D^Eej((U52;946TY-b!opVYWJ(CBwFr-%J?2l?!5zjs7_ zp2od*jfq`W@AZ0QOXV!1thH3Cmj#NVY@zQo4{kH%IOnLU%28}3(lm7+C>*NZHHvKi zIXTgy@6(E{-;1}fsOp+zueF9UI+$1L7G_|w6mb+IiAfZ5!C8yZf{k{jj;^eJ<fs(knLE8zfJI@rUZqx~JPMGsn;iO=sdpFfFbo;!t?zWqMVw3Kr{ zytsis{oNm7?aBa;K6?U(k1pWsJJ+DyNOEbphct--c+D*%VAQ$z2q_#Juo2}84iggk*(6*?&{;1yxn(tg$|G7i}=A`z8`*nT`Bz4pTC0-&R)mk&z!)^ ze{~iIk1XJ!$ByFhXHOu>BDXWpeN@w4zH0Rc2F?SN-&!PoPdB#nfw4o->)qQt-$g;* z`Os(B82i56XZH54dQlW)KV4NW%X>i1PJz$?bJIX=RGYC5%!e`E7vpwK3j*`zp@8a}^(6+Qe|HoOvz0{=+l)&;HxL zjUy*|5H8@?J{(}^O6%prIgXz^fY)9+4*9E!&af9~vmDVVV zBK+zsO%X*A`u#pQV;BsFD8^&T_>(}agZEoTR-#OdLxQFn>v-jY&mo9|I zdiT{Uc;tzr9c5SEdIPFbp%~S))i>iJ9uF#f1WM!naUifmLvj?KXVV3 z5A|^M;uaow^e`5dGAe-#wNH#w6{H>Z9h7ZZ1Jd~ZeV$0dyo`RkrOcgetv+R2cDEKN zX^r3_2e$dXJ&s7?S=Fe@k}`Z*psr{RZftkig0Y<^1l9mG6i^ly;y2N%QhK6z>x2M_1C|Ix#E-%(jFynh|**GJU1yWi43 zkOnw%{rU(OK3Ky84t}ma~ox)hBk-n5xj*fS&9Cc17uJn=|M zWLbt@-a{|zA&z4xtx%L@=+{FT?}B}jW8Mbc=Gw_K7x+p6B?E6oLmbD*dp$QcqP1Dm zaaL^}n{k)v1&L4i>4DeO_W)%3>VEde@5krA^ZLgUEs1splLh_^^I2TRNS08+m9 z_NCB2FC56Qe2CO?pMLJ%5cEoGy!OM3`0~#_5~`6Cr4h5C$_dk3HryoCx`%WK%wr)7dJb!=@JFzoaAzcB^ zIgB>oj6*|F)^_igu@;=!;F9Byfp!~jKknXr7t^IZWqRgDj@s-8{;Vu71Va)h6zsh` zjMK&=8o3ok8=y1Y&&1C7oF<7-cFyN%09Dl}-2FKi1+f&!dpQ^wHa9n&f4!xQXqw3k zcesF%#OF64Hyh<7u)NP*`&QKo#u^w6*s?@bDV#miFxZ~`u?I04kC4PM{`$qY!}pKf zvxubw35+&4dEWut```*bc#rt#uf22;U;3Gc0$}&RqlaclGTgC9}|LDst@Q;P^TpQM@a^O4=NWVak(hgW4Kl#4h zQ+EA1%qJ>)9z5vV&N%j#An|)8i216f5gxG}v6!i#Z~y0hrk`KZGe_4=GaAFuYAP-6 zlvRoG*!S&~1K8#ZWZum4sOvg>ZUB&F8KNjcp6B5b7>`FVhE~}8G7E#N5*%`GOf#Bm zKmNSia8Tkq-+T`roVn(*e2y>u^b;5ihNxqOAN}Axy0|3A7r*=jjAeN5%@1+r&8xV0 zw$X`GWsO%~x`?MfeWIy84JNr?+JI{B@4UvftG9=Tth|@f{_5H(VCWUT298H@Um=%gIzn=*lm=fwvXYt zwpMUuqBeJVPe0?O3n7qXDe``wB&In>T@y$*ZjIk25qUdL_iB=#ze^-Y8^GAAAz?Tj zxhQrbmhe6P2qcz6QO`kSBrnKev_|ceV~v@;QmiVCv+rEPJFi~G*>|pCI3T&P2Om0$ zfA817jJmEc*wT3Qy))QaZx&R({;$60R!(P&3cUKg^LYHJ<6+}$@j!+z|NLY4@FMxK zU%xtllpH4?SjO>t4?srz#!hE9s`Nm-|II=$q91eODOOdDT5EFtac&-j^ECp5tmX2- z9FE{6u($oF_EPrmG3i=kruz9w{rgVPw?T-Y$&OnnCUGYP`J82tC=!Iu_xs2kgK}Ky z001BWNklWh%Z6G9X zW%FH>#m0LHxE|YOeEK_c8-xr}CP?B0OmJvNh|+Z(eCDk&fqg?uLX3hO9{+P@DK7AD zE9&jd^z^iIZ0}fyn_HgYr3lQrB#xn!LRtE9z6kU7T|chf!~f5kAZVbrmAA!gc=2(J ze%^<*z+fOSDr;zEVTC0gzgtPw+Mre%Wz{V3%t|yXM;CDH+y z`rwo{9upvZVOQ6m>%Cc{nPxPyUlJ~QLr>}{_@04`eS{TwUsnKax+*l>Sj=c`011=5t(U!yo8bbg|o|0sI* z-Ja^&099SVQc{A2Mb5~}Z($*K2J|IH{p@%jgPKS>oac*Kp~BwSY7H>aYJhc=(C?aP0UBz!-+ZA+BA!ip}*gKKqlW zaN^WK96Pz#nbmJs)$Sx+;QMv!fx5PmE(|!ANV6XDULG{<%CbULRnWDDVH2IP!vc&y zP+TOEEtv=NOvw1SP5SzI!M-k^Gyg&blM(`(O;r<(I^tG>?WISr8JaQ zxcI?_6Q%@?9ACt#hYo@Zjm^z1;xA+w4zC=Be#GG5p&X;pH~?&&49~iUrt%kVvMpX=)i7)*&(}o)ZRHHQF%|SJnmL$+kd~cNc>HR zXzb7qZBNeed7j-xK|eW4<3NCU-`ZH% zs&tP54^;yT-1>$>(b!u1B`xE6dI7d~`s^*QP+eQjZvef& z>qd670?@6)CUG1rr##`Nsw#4ry_vU(?eTu|iZAzlt!)R@2V-Ch5=ojO%X(nkEz;B^ z!dX`ps>*55+3lm=JK@kOvV~P-mRS}R?z!&(p8x8@IC^{mTyhMDLujWQ(ilf_^s)?g z`5*w``t|F9K{)GUU^`^J$-_ZA;uFaUO4q+T@_jOw zFK5%qd)MXt-M(4pFCrlXq_eB8$_iCk&E1H*-EKZGYE=VcKys4HHbw_SNMjkaCONCB zRM5Knnv7~%7gZaV**G|t5Ih1bhpIKIg4!IvV(R_jt+lA?3WLFbn105P?X=Nht@prz z<&fD1gJGa3w<{MjaV`3Pw*RES1EMHKp7*e@uz(~y}$q(zS6_qd-}Tyznjpv_YJ)UQ!6WGmDoL3qlF|{1nnNRBO7ZxE zD>(h=5ga+O)XDV1jr_FMD9Vypex44*2+uZ7e7CAAuu-e^HU`LmIF67c5f&F0V2py% z3gdABtzE{pyFHv~%{Yz|^!qvb{XQb6{8N<`hNB_221AU8qtI@I=VEQg_rSWtgLMD{ z|7Nz(GEnnxT}8||3;35Y>=Q}|o;YMWoSR8W`?=&CV?O;dSu^`&+gL|QDc#AbNzuj` zMX()6Gat+JhVB0QT3eJ=4WIyL0+Ean#pIo5p^^0xEG{j;G8-hWEr4JBjptf!GcMCJ z>-_ULm;kiZsOpjsV`j-oOSfA>>&!LEu8f%59*Ujl=F-xV%iPy79v7WbenNULeBW1N zUZ^C`bM!KjA*<>dqtO_H!2qMt$N`2Hf=^(7Zq7*nqgsc6IZTW!C)|e)@Eu8kaPFG2p$9_+EQAqB`ed|O}B%!#9*uC z?&?m^D2k9K84fNx%{sP$;c(FTS^szcJiI)&UuDj+3~>}e8-uOE0K?%BqtPgAH0FGyGwFTbAjBYt91;{a3Tg{ zEQnoLSfoixjxkE1uJz6o+uNaf@qM1Lkd9=+y>vC_7!@N(A&?|74jx<%rQpWK2F?9D z0f1nG&AEWqI+$bF7WnIu(MZ)(qJs(!l?&EoXjs2jPh|t^7*R~?Ci(-Qi`7|haOZezCy#}j zLgGKF+m1cGy~}90(v^#G9HXvP*goT&BTY$@jwrXPW0tTTl74$kBZ#GDoJl-$!kk4> zfC0fHZ)Ii0QFAr6T*ePp*-nOAx{U`3_Yh?kYyPyJ28&Z@g@daTNn<9qyXfC-M0agqbpCX zwXS8ERoc(I8S*;B#vnL+>VY=3XaeUNohh;decuz}EG4LRJ)FIQf*N5QyX0Wqcb{gBKST z(C;sx*UJ#c35+!;ivnAtQRv%?vP50go%60c=5xu14~QD z^Bf144+bfzwY9a5$DNnO_PPOWz;NCL*DkTW%ywPVrlOQ&lId?z6cKGVOT%+et~wYF zhZwZ__KsO6>kebMW5zPDPFPd_Zo?fIqt?D@>p8XQW_~X8upkEu#GTn@7v^I=>u-X4 zZ|^2B&t)p^`b_D1SL@telv2SA!f0ABF?NogmAyR6f)j$ky(n^=dtJ9A(oF-3O@bW$`_}ELw~&7B%6Y;FICQO0 zS%-id>f?nF(9kHxV{C415lA;0qpmBoS68_;{Jj0sboo2ir;_AY_VI=*Ta#+c55I%7`ng#zr&*BW=&&1k0xt2DH5g}ZZk zscItUl;Z+bSwU5bK%L3!!rn$e-o&BigN!>y9soxvHqaU<%d(ZN>CZgRk>`B~A(7`f zx!ekY%8`}mnrSK2xOrw6vAK9-3=l5Z$%;Eg-pi5o915SNU;wtZ2B;iX03;!OTlZYa zGoYMWWA04gTE@7r4Uk1Kz$m#h3uYbru7k`o*Q%SjJz5j+oOlWDe#TJjpu^L@4Z&*c z-#Uk0Q4|fp#JH-YDJrzI;3$ zqpm8bx~6Q>>EnH=ODK693q&$P6jQIB=Q;8|5owYnMI1YfpeTciaKjTxf|Yih#BQoW zwqNtm>q&5$k{I{(4lU7u)7*ZJkcn~Ye$#xF)&zhz|F)cg8B3E6&N_*5FG&1e(R=I2 zOr+p@13_u2_E3Z20A*E% zK1gc=tyNIRA^N8b)q&Qk!ydcc$c$bL#k|<*D+~rh_u4g-(pc#C zk)$a&=MX|7PEtfsjJl$U2F=-{u3=}MBaIWtNQT~BIq=YLEe-|)jEgbKq9pYnV~GOI z8eq@^eZ4Fro&K60Ln**JTeWowttAlF2I{ag_0!a@`o7${GT*WZuRlB8xch^VcY6C~ zTahyUH1Pd#Mvm^xD%ngRRkqRksTxNs7^`9LBH?>ufl5`V%c`@a;Ef$UFCWYVsxF5N z2!ET*w3iNmZDWINCvCLY_V?-BH}(J?Wi8`YVkhs{u6m47FlN|HF90yk!&q(k;4;7% zM#CY55QyW1B*h$Y#`pi$&}Lmxl&Go#!{I25+Pqx2(ly#n*Tz=B$a%{cS`q??x!3FU z+yQK9k;qP?S&YwqFF2s`n z$T@!h+B>Bf+=Yub?lUCE)*1bt(O`yw2?ow-x7=Fe*lQ;6(PvFRc035|{HHaA7fx0d zbAHyiUlhA=3)d5;^C<;u3mU4^>&h0`4%7 zjus1Ot%$WZ8e?3H-MDRl@z^sOO`!U6-rY>IhSr%0VATODh+^Uj^m@6o^M=#*pU8OH zWpdwlTRYXl`oL&JF?-4WNZXz*DJY&c5-rCzo=_Ie3oq9)5#^2y|o0pxqs8AI$YWTdCX<{TGdc3R-u#v z3{E7Yr5GfogmB~}!UPQJT0u&pEa!P14!f$Vu(7cj=IO)H2z6CaHg{b34qMHS@@6{2 z098@K8h-(^knN=u$n#zYXbq~>tdY86e!RjgtYIBj*Y-BGZp+_V0_FU8GnDeKC$QnC zn&-_NK6*P~Jl6S?`-;Vn?0f|vyIJ0ZlZi5b>wotB>8FCp7z4vC8BQ1rDJcWdN-jqf z#UVQxquoJ3XgCQ&n1FH<-Pz3jU2UwOUH<#;w--a&-}CJW&7uVu7Xag~bf@vs!omU= z+`%PfU>^DsK9VvJaio-BU{JNfa5MyC3~8E@Yp&Z!EXxwBtJko$wuaGY45c-RXXpmm zo0MJ8R%}>+RHlpS%5; zE^=>SIiHg9+Kue>o(_VWK<_=k%#DHNyOhB0lsfxrxZ8f1)b~=B6OL#iWkmCE!NZ8l z_^dw_>^f8f{y^w%$90uT+Wk}K#vCHO+ zb3`uag=lnOv@xj4l0ZO4<{BFt8?e?Q%Q9GN(d+dB=%%#^%SuW$4wFpG=Bv!wm+u?` z#-Kt)uhZ=gM4;!K#0mNfeblPP*p9;}&zHCUaPv0P#>rbTSTJi~ErXrfi*qC%N3?0g zDQxHOW=<>hi6^B_W!WV3Dc9QeH*H8G8qAozvxDyNY`zmf*1X9Yb)}&>hgJ$o)KCs> zZhysb#rr4Z=lIqCGdbzx)B(gSEtZ6DAUt z(m+v6?}$r@UX}&yq^jyLsO( z;M=x6|M(=ZjUUzB=$4&nvGMjnyVm9w+uiJavPx)X_${es(FA#C*L^bR{piKJ(zyE> zx8%~UG_3;!Z7V(c%A=nzU}0$iaTJ4bhPtY;xwYwpDD`~gpSz8>IEIvx=*W(vPh1~{ zs;aQHMb(2x=<_^Bnk4AwIpp!1q-jc(haQovx5Z4Jy&G&b&!OeiOf+0)R>^3G z9!~Ufvh%f;ksB~)p_14MiT^0&@i~}NGrA$O3$KLY%r5rJ`<9Ws1_aJSsV9GSvYqh3JL&AgwwZH#nP|pYFpE@LLmLA=#m%06Tn|D9 z9r>!-cFRy}i}8p|AxKScWGgP%gS=G*~pj(=?_u%38<~f644AwAkVf_Hh#gcWNcf@Ywtz>9{ z&S-C5z@ruHAImkkdxx7An(AKItP|{R2lbepA85ASm(CdQcym}|x5uxh9>aEjzFjTM zDvLu>5-k+m0d}gcp&ZVzT}8sZG#KYlN;}YQhAsERFRrSZP<^eSjX|vx78d$Ql9ZHp zmk%Iz!N0M&fzfCLr6|env{T^!?I#XpSp|^OGxwy70!N>`@+LnZUzWE{)Zk2OVXbhp z_%>bF19yasGbgUeEDNJQBDC4S3uyQGY(g5_ZsT>k*UfF?F*(~DpMDhV@eet3L}&b5 zb3fF#>!tVl|2O)(>k4&Ub*`0J6^joP zr8LZF45Phlc;!Snazrx1;?feCOlB!IHa0LA3{lVY3AA$$01A8s;tn;h(T_-zB%wpj z8I?@;zX;_#sqau}$99NzP{yc9T0dQFvpz7jS*>F zm$;I>bmos{?kPixRIH=XW;IY*1+53Ds~UB!P*f%Q{XWt(bIUXRz*<~iU#F~J>kj&D zClAsI@=j$dH>gI~$>)qiiU?W8pfwSRYF!84KCg(&*#z?5a%=7|RcuqL8<)MkUp>i$ zJ2MSyn?9_K-nP|tjNKJ?e@|t;F|gLm9NWq1JKLb&tsMbmAHCmu;BNP#b=9W?7qFc>49Jfk(V9tGx~ zs%!M}3cX$raU7x7%R)(>Wt$ib24oFhnoe-DId6(F7PYD&Y7ur11gFVEnkEk9;~0+% zXL~h-(S{5+TLEv{0)K4w=g55T&V5d|FxvI#j(KPTv8s92S~n70e9m^^b|Bo2N4wsc zU$d`~cbg*oJNIkdpYMziCs26Kc}I!ev^?h6Ha&!Qv-PrJv_PY#wB=3fLiN;CJMkL1 z1G$V7;Ph1GvMiyL3gVb)N}73DmLbbBY`R{*EK3;O)!St=-V?1&DDwdZD=3@hd5)z6 zOGu&^MOEVZ+8X$Ej=|P|1UJm|taZYbdJ4DTq^A}1^el5ac@wheZ9^3HF>v;cKZH#4 zPPJ$CospfNWmqq)V4AP}+ih4$*cqk%1c8XGohT=3hu~@_J>8b1a-ttp&MBeWc!k?xXYz;6R4MTM>4}$W0260RR9|sOB z;oyN~FU>SpUnbulM#tbtq3sSRbkb7-3`NY+ASjy_&-%kL#G?Y&59~xl* zrd#CtRbHhO_4=wtukImDNq95MQYW^VARVL_4h9&tSAR|Wup({$EKQL2bM*T;78e(h zw8lnvsq!O&OYWVXG&+yK>4Pe@Ruecl2d6j*u{rhYiDsOB5-Uq(t1AHWh zf5)K1&Wzk?vkQMePA9d-K9G0Emi!jMmYF%FNINOmF(ci393V*=PrtG#oX`8jzJQ$o zB-^r6j=$ap3ui6Z0Dx8oT9;7H=4v<`A%Z?7C2BYB4 zlQ7FNq-hG_TAHeI8voilhazfKLJ#hpuG|ylp&v#dK$$K8-&t&7?L{YRS^?kCZ$FM| zZ?ekrpSM?c?vQhWjBg7B;J9lHZa!6k&sbM!CnR21S6f)rnp9!iKw#*t!j@EJKtz@XM?pTjtVmB!)iuhpK$a#@bxa1AMu)9DqiOTVC=H_&?IMJA@>X!N>4@SXs2jE& zYZ-bmc%z91q4#3a+CR`o7*G*+m`RJ3$2r?AdQT=7)>yE88txrg<6BGcGlM6Nn6O`O z_52D!IJ@XLCPy0|fLfa=zP}HCW+$&@%AQ8IBAd_bh^JZ-A7T}3gcpo!C>IPNoR)9ae4L?jcq_SW6e zgL4`dnzOL5;dw2L#m}LUe6lt3h{FbUPP? z-+~i@tfY(5t-#u;7Q#D3HQ5aT)T2ta5yotGK-i={_Y}vV{c9%1z=%5U%Od0!}b+wJJ{zTLE+qBGqwX; zHq%q!A{w7PrBpDw^gegKX9wW?_f(M1@?$;j%r%+2=B-;!Va#WHpSj&DFtiD0t?S?Y z@{Ki(sRp)d-PtE_z*`t&my9tRGb_0!;9KjG6#Ps3@ZFu+&rb_>T7UXCz6LE*i1yD4 zE|4T~Sh8uvGR-c8D;XHK6M>KJVZnC)ymva>e9vE1RY!P~aDzsfIJ7qIIgZMc4nR6Mp0(qwVb9+OMv-ygbn7!A((}it={+&X*YMsO%+6N%R zOV7tD4lw+;KZV1f&qqiJhiL`7~Qx|w*g4jIvki&&6zj}+3iGPw|1!=wQZLh**+DG z+y7;p??=q1>}IT)%1)D^$rwi*MTjB^#z3=dM|EXv8f_1;-&&_NGj`vBuIJm0=wQxw zy_p^SJEL51J--F#mR4A8_pk^8m|<_2b$X$u1@Htm_kGsR^q)|5?9_XVu}j3G-$4!6 zzj1B>|32%82m8JKom16MYUTNjH?%Uaw#I>bT@g;sITA;CHHMsGs;VLe8+Ojfv*K%8 zk%(PJ{&pITH*#e%=G1MiA7K(Q-+nEevqteYtP*zN#xB>NebUwZj$Pi&^4_DJp*LX` zjPY}3vXtAu-PXa*Ccnp8Ag#reZML-<#xlT?lPs;%Mvy`}Z}}0bvJC6A?Z=(WtY)Ir z-zh5XCwNVTU(H$?0PcT`H{!5eYWn;Ns=5D8ZOzB>x}2p|``_WDa#CWl>E~!Efroy@ z+$WO*s0UZ}bNw9<^_I;C@<``i1IEB;)k;;2lw9Gcw^8i)?F>a(5og_tW}vG=J2TUV zGI)o8zEO>Pm~AkN`ThSSRk*=5od8B_C#Zv8xp7=L1T4Glcg{QNyTQSeHSWD=coAV_ z*ZyhWmqghLO3vKw^M2Uhwl_9Ev-;9bo0h$nqmYnLm7*rEKyc9YOOlU zB$#9JG1aRx1b+HQ_OjXR9)D8Rm#Xy%`tXeFnF%@s!;9d%W72(cAh*Y87>prWHPb*; zwhGk)-(I+}7Fv`0j8>Ygt=u8r($_!~ z5o%BR_M{bG*VW9dzTIfeTReS|eeSLquM-?%3%?8BYL+Z+n=J1)1FTsZ%q;J4Hbdc6g0N&25UdIFKaEdqSj1%lTcF!@n4 z9{E`eFTV^mUWL)LR%Hx#luHI}Sa1np``P~!?(Syvn}#McwKm|=jq5@xrpT0126dXc zu4z5BEITFqu4uAzI>4I_cw_hcewZ1OQM0a7CfICD1T!3H1^XzX++{K>iu9$uwHAgk2;oEpBZ*RoSMsF; zFP{8~fB5|QAN~tq>m5|JCY>?s`X0leIR}il17acj?;ipmFP1mY{KB~L9F^-`2#a%s zZ8a+GOB7BTYaTkjZML8E)B2bXy`2u2_BBb;*DbEXqz8cMRtXIDmMYj9kE|=@{O=sU z-`Z|ASM{_^F8GJI>r^PIx!hCk|Yp9I)Tc<*-CAXj^9-Iaf7et*0crz25UuK zi-Oyl-PzUw(Dt?W-nwF5OSPLo*RJXE=CDCykAgY`z4B;m9kRKBbynOd;zUC9jw4xq z6o*fJ0V^vCaT31}%Lq{vL(0bHYs$cqa|Y#pkq`_bijY_ftTY9Ku^@D1C8`9s8{P+pVkjeJ^hu5T}g> zV}O(bNs=H*QUE|P9%DQj1xe^VqvCrg&F4A%?)ulX9>LRMgCWJ7N42n_I-RUyf*Y;( zs1F4E8_o7jZ|)U#I)UzY^ZlQ&q-xX(bSVU6FGZHdQ1J=y{{2`y@)`7cIr@t^@*epG zBx!c8m-T)t&9V(HBUf?r&i3I{PtX0Hu@w-)0&#@Y^ZcM5m@;$`j3SvR)j#?R5&0(BDAajR+c9lR-3Ei&(KC=Fv`F_zT7$Y14 zPZyvN9B~wbfuSlZY;6rN9F9;|$}OPWn#65){Qp@NpS#BcCTH&LfBV3nHJ9h!gO1O5 zvToPjwoBu`Le%RM2Z{!32kN{}m+$ zU^zG!|3panVjRc+IE|C%d)XL8F+#6jqAL3+mKITzr%)9Y#-mjj^FDHR0ZCLk)502t zF>uXb&>)KKL!d2Bw12zF9>2w&BTFg`&NY>|hWzEY;E+-Viz$+mR=0>yV`m2B?tXIj zKeJaw8a}61oKt z`_WrGN=(U=DzYd}kY)+8G((&w=wE; zta}RjTX2AEtLMOWej1ZHen7KP+i26zejsg|VD=A0*4^$Uc7mLIB3R4HyA$L-`&-)X zv)m$0Go)#RiX8^aPa$47jjX?fG)V|=N#h^{8fOV&86(M3#BuUUlBWM8j^h_dGK@S5 zqBuq*CAc^6>_~`h6Z9eQje#*5O4FZOYt#5N0Fp41$dSsO?!wUNe4obLPikF?{7w3`UGGb{^m&$pj(-eTUM}V#hV3svn z(Jv=(A-cTh840-Dmlk z=h<$8K5Xjvg$>*IoNJ?C6xkSSqoJsOzfT$Uyi)4gsRB4sIDs% zBa$kv1|I_DC1f~{ETRgau4@M_x>2Ab0C{<0#(5)7xQ_!&rrK_nb`+P4#2KJPWmXf31^ZN1v5?9QzN{U*zH+o0`jq#aIZ)Zd?5^2tk+ z2(p)e^Bi@0Kcf6WWJ`w-$0?FHL6Rj%q8Pn2gG>^ny##5JA)@~MYl6!cWfZ><#qyjK zk?YerWp!uJ$ryv+42%o+S#dX-qwP9AM+}GUs7f)$RbO zplZET>-v{eRsT{|6~9(hHQ5!7OH_4%aY^NWS(GTp1;%9wU9Q25FCo^Kun=!Sl?qi| z!!kfv4#qf)6J2NRN`U!n*4iV!TZ4TfnEVCdBU!1BCg|Ixz4bjYyNQ4gCCCmX{dNR` z*0*IO=N=G~y*a#Hdpn!A0^PcJ@Peahk|F6y)X`y>=mgTmhYfYzE&pCU;S;r2#3kEz51Dvt2*1%W?&6eQDmgq?94s>mxm4ea=nus&H zl$Yl1)BJtn!luesyyZ<3zr>n%GXP9qvnWF;yr9z>?`*eMAa|(d(4tjwcZ|BegV;^rMl*v_ckrQ+jl~z72Vr< zb1{=}4d{FCQ`xRm16c<}grXmy4G&@N@4_waW8nrEYv6`~?;5OyGyIx$4x}}Vbw^~) zq0#108x5@pN(yLAkXk`WH4}0YfKcm;X2=reK`m5mI3;^@@rF3hZsTJThAeYRG z2qhz?+=-)bkW1Q6J{*LYkURUIVnT=`{EB&ikOJc9;YW{r@dI@E4g;R^K7fzBlMD_3 zef_7~m%bSUKGoG=sbpWBeiQUpd-$vO=)Wf0zc0|gEzsRm@LZbRU&-dRb~b&pH%A}2 zwNBbKKz12vw;Yg#LNgB`-QQvV{4JbaV6X5FHWG zITLUiS}I7%nH^oaOesB+utJFLOK|ykM*ND%{Hs8JTLo~b5-3~-@!i1G0uiC$5P#22YMj{a>;n{(+QLmx2nzlFByLZ{Y`&Zdv|%Q>HpzZkNh@E z_O_AD^JdB3$8DJY9d2cf)3DYdNsD6s1-kb)(DDHWXEE3T+8GSp8rvERB70{ES16@LCf>s;ZT*`jDwr1Y1W^(Zxw5`7h=-(v(u>5XA&h=6NK&>pZ zTq|m38=_j%eu$k1$ZO<*x7=)obB zKcfxbKrJ7_EIs(eB}6L-F<(w1Qb0)s+)xRuf%1`nev`-pv-c-wr!(=nnSAde=xggj zez^m^vVOpu1l-1^T+jAgwo8!Fkk+Eg2WZ3JA@6;I#qb&2U@$lfYlprOXJG9BO$6sG zj2SRkb1scJG-M8qF~>^j?yuJ~y4E}{?AcswWb&(Ee;+{q-9Z1g0B{-n>lC zd+_1jU)~f1T3-^9;!4K6gP`ww4>Rav#LKhu-Xq>Ezzd*{(B7WS+f=rf#;s;!7aM^J zr3KuuK!rjve?xP-a61oS$zm8BjNvlf4!k5ogMl*^MBJ-8>z)~B4vEa66zZw9_7VX% zdFx3np&ggZkkH{ z5E0^tueRSFm{Jj(bS6n}sf|HVB@$SEPD(iKA`@1z5O(9jB(If1s;WV&nj z0kQ|Qd1RLoUY?w-#Ut(t=-&b4?V4&Gs7Q@29ISV%| z;q0{QZkUBP4u*wB&aJag$e2T^^ixX)QZvBUV3!a=aX`HW>mMxOJE8V2*}Ro$ zTdrHw^v{)Z3S9&1HMWc0Bi zd#nvF$mo8>rj&xx5`Y9L#V6%gZrJ~5pnq_nzl{joXjeX;dR%#un^&W~p#NGz zz&Zkm(DYwX^k1Ow{}aRFKJT#i`8l)gto5%4hk+cA*)#*4tbL-DdTPi%)x?=xYYn9p zCxTAGO}+Yu4D=5g^lz&Gra&NCLq4*s7J`&yt0>@75NJyLVa^CjuY3AS zp#K9$l_jsORX@5V2nW!7R`PQ>2_h3f8*Qp!NOU`S8K+=xS^k@T3&s% z7S0e1*+VksP?J6;W6qgz*U*}JkKV1IHnRCuGVVhM`JDy*bwS|jHsEC8lsE1HS}n-A z>jUJ81dJ%9Jc=Pa&N=VJ;2(t$8R&jQj2j42|lR`4+(UYvo__ZY-;Ea?I< z6{N@(-x$DZ(i5>`jeCt zYC}^Eju_}Gu>+W|&=wD27hhoE79dAh4g;*^Og^}2e$HSg<6w*ikv%llKG9k|HDu4H zvs9%ulmKMER@0)7*shtMUuE9!)FkJwg8p5IKn?^Ish{hzif==Xi8lcYR{$mFM=8aF z=;J}oVK=0N7(Alqk)V$rF^uruV;p^dEx@mSh6>+d5HDcG&k!xH0{~bfVCwxYRRT={ z>di{vy}r>>PS%W&N+70$)6+AqR^I1(!ymHsPJ6-HKw|^s^DI3BP1M=JMM#0c5+DiL ze1)RFgk1g;Zn%fVFz~gSb8u#2-W`nLahtIN_v?nvjiDpb=1?0t(o(}vUzX`wa+(xc z2&)le@)*Ye<^K;3&*5+iB{E9PtT*3HL?Gon=a(I9?J6-S`;PT* z48@y3|6bU;PQ*=O5;M?er`!(owGGZ};vjN`G7?5>6y?zD7s&KA=-$6rO~x547fTRP zAF(a?n8mq%&1RUabM{z~KGsqnTWgP$)=*lrs!ZRAlS)E&St)TvQtGDfKZfU{1O3$i zAo}HBYil>YoY}dxZ0M8KTKgVAM6Lxj6{M7QVhoQ{PWw5hJ>CH1E5P7Ad>Ro$g1;Ey zgJ-AL@il^vDB%Sb?K_xujzN3G$W?_9at;9NOF(gHG602HLHM@{0!_-<*Gwvb5F$=a z&wjIggF0E;*0+GXn{2dF`M;@bz+tU|afB=uDD)*N{R8g)*Kh-8Yr9~{s9_jj$-+4c zvOGI?JXV7-^o+2CZJ_^h!_Jg2+(T^+#HfaN_Rv2T1_xyW#bqZU5gp)6E zU%f_%nR$ka^|-I!LtknIgqRuQi4Wk+^D8c^gq*XwfJDrk>HindzpXE?t<44zvy$v2 z8`T;NX^_!~`cEkO0kV0B#qtXb1ItO-VZhMkqpac8SGzE<#=*IPW!jB7CNhV{nnR`3 zIgthFezB$$gz9s2spg#u7N3ywTJ|N;$WK6r;gbOUP5u8S4Be<$LLq^i7x|VNVs@C!p9L|dv#~{YJ@-xAo@Trn;g3JWGYv5=0VG z5(;tI-rPeh7k^^L-7R39#n2_A77Lb1jAn#@Sl+h<)iOD?UHlP!6f8Nx9Y(7U(4dN8HyxL5hSN*ov4*xXCS;wF2cv5SZGP$u(-9f!8J%y?l~T~8fF>^KyWf<_#a2Xh3;JKu2DA-N^4d56h{pPFrIgwK zJ?Dg+`#Nw=C@JlwlJ{bY2XPFKYRT|^g%J1(FvX0~Um$wlMM46`(PQ)@l0OIK?{Qzg zz`{fX9}#n6rXK=zk_Mj$z#A%oDF`UiP#al2gp9LS9rPO@U;EKxCgHHbv^T7QE?PtB zl2VowtRqCRz^J~4G!J3#eK{}541;BGy9EX}G3+cl;fw_tg0}YD=&t-~%#rSFyHFZN zYbY%tq`qX{aMKL^Q!LxJpnuOi09u=gKz^;D6e0qx9smFaNl8RORGtKsQcw%u1mu+1 z=P%~nl;S~3;c<#-H^hh>`VK%07*``728{u$u!0{0ydM!_gui$V%HLrjPI2G;j5J21 zm>7Ul*2j7k7@L&%jcC4RcUA?A(iTarvQ|M6ta6CZu|2s=s(~9FnO7kX;xj^IsoLv)j-OKHSMIB_H&2_ zF{k|)JYtIQE0zeK{NjBN1gmk{6Bw}y9`)iUEadmNr_MksBdj8Fsa)bq$)pw-^g^lG z3x)D=P-#pA zrd&`;LP}{Tr@WVPJP1DRmlSq<@O%>xMx+?wFIEUCz^?+vF!D<9IKqdBv^s;SKjJg` z309AYA;ZT62`-JLCY}gL1@Apxo&MY{ncG~pqgI%Og*6JPEpee90QMW0#TN|pfzMB! zU7x1f!NRyDU$mL&sHI=6kvX)^9x5rJ4M8dDTXA6Ky#pOL0DW7wZ$W=2fIn?@T@3_v zlLP3oVC)pc6+kNmxpqP@W~7| z&(5{h&`LvV1tBj>M=>e4F>bt))we+3g8rip0Gk}ZJQe5xpqA3T<#`#Xl!}xBaw(5e zhzB8s$0^30Ss=8VgnA#4x+0Jdo|lMXL{1sGaD{9ya zOLgR6oCR5eAzqfTWS=OaW8H~3Juk{g$Ua)T4&+ybC$>P}g8q}~{Wp(+=GUk7-z)Oq zlUPV988x#@P^}puL^cXd@gRrzC?pmKO_3FVl4rFbRu|4|ZGnbfTJv7M)(WI83scxx z?UjWgjRhI=Of%bl=!lLbX-s}=b2gWPuhvxG4cHi~-9*4`fxZR(CmjSfe|=pQFj=U)5?IXh9LuO2!`B| z*6Jx4`$Q@AjEJB#fpkA+=|?R}uv(B1-9+&gpl?CG1^xE9B>-GE3M^MV0w%A(c@?;@ zSZFF~C#JMtOWiFw@8uHrbIR-)Us<36m3Q`~)_?%Crl-cxk$`$?EFEd3&y~`%J@Vwv zGWF)_hKzm{+*_b;LBD-|(*V#(!JPYUJez~$T2XRBtNeSp<(*pUE^6DUt?e`+&P8iG zQi^j3`AiD=OldYv1(<`t raise (AtomError s) -;; + let to_string ~units a = [ Element.to_string a.element ; Charge.to_string a.charge ; Point3d.to_string ~units a.coord ] |> String.concat ~sep:" " -;; + + +let to_xyz a = + Printf.sprintf "%-3s %s" + (Element.to_string a.element) + (Point3d.to_string ~units:Units.Angstrom a.coord) + diff --git a/ocaml/Atom.mli b/ocaml/Atom.mli index 28915993..4b1963d5 100644 --- a/ocaml/Atom.mli +++ b/ocaml/Atom.mli @@ -7,3 +7,4 @@ val sexp_of_t : t -> Sexplib.Sexp.t val of_string : units:Units.units -> string -> t val to_string : units:Units.units -> t -> string +val to_xyz : t -> string diff --git a/ocaml/Basis.ml b/ocaml/Basis.ml index 237e5547..869fb132 100644 --- a/ocaml/Basis.ml +++ b/ocaml/Basis.ml @@ -35,11 +35,11 @@ let read_element in_channel at_number element = read in_channel at_number -let to_string b = + +let to_string_general ~fmt ~atom_sep b = let new_nucleus n = Printf.sprintf "Atom %d" n in - let rec do_work accu current_nucleus = function | [] -> List.rev accu | (g,n)::tail -> @@ -47,15 +47,27 @@ let to_string b = in let accu = if (n <> current_nucleus) then - (new_nucleus n)::""::accu + (new_nucleus n)::atom_sep::accu else accu in - do_work ((Gto.to_string g)::accu) n tail + do_work ((Gto.to_string ~fmt g)::accu) n tail in do_work [new_nucleus 1] 1 b |> String.concat ~sep:"\n" +let to_string_gamess = + to_string_general ~fmt:Gto.Gamess ~atom_sep:"" + +let to_string_gaussian b = + String.concat ~sep:"\n" + [ to_string_general ~fmt:Gto.Gaussian ~atom_sep:"****" b ; "****" ] + +let to_string ?(fmt=Gto.Gamess) = + match fmt with + | Gto.Gamess -> to_string_gamess + | Gto.Gaussian -> to_string_gaussian + include To_md5 let to_md5 = to_md5 sexp_of_t diff --git a/ocaml/Basis.mli b/ocaml/Basis.mli index 4da99266..249c14f9 100644 --- a/ocaml/Basis.mli +++ b/ocaml/Basis.mli @@ -14,7 +14,7 @@ val read_element : in_channel -> Nucl_number.t -> Element.t -> (Gto.t * Nucl_number.t) list (** Convert the basis to a string *) -val to_string : (Gto.t * Nucl_number.t) list -> string +val to_string : ?fmt:Gto.fmt -> (Gto.t * Nucl_number.t) list -> string (** Convert the basis to an MD5 hash *) val to_md5 : (Gto.t * Nucl_number.t) list -> MD5.t diff --git a/ocaml/Gto.ml b/ocaml/Gto.ml index 69aeba37..fb576ee7 100644 --- a/ocaml/Gto.ml +++ b/ocaml/Gto.ml @@ -4,6 +4,10 @@ open Qptypes exception GTO_Read_Failure of string exception End_Of_Basis +type fmt = +| Gamess +| Gaussian + type t = { sym : Symmetry.t ; lc : ((Primitive.t * AO_coef.t) list) @@ -68,8 +72,8 @@ let read_one in_channel = -(** Transform the gto to a string *) -let to_string { sym = sym ; lc = lc } = +(** Write the GTO in Gamess format *) +let to_string_gamess { sym = sym ; lc = lc } = let result = Printf.sprintf "%s %3d" (Symmetry.to_string sym) (List.length lc) in @@ -88,3 +92,30 @@ let to_string { sym = sym ; lc = lc } = |> String.concat ~sep:"\n" +(** Write the GTO in Gaussian format *) +let to_string_gaussian { sym = sym ; lc = lc } = + let result = + Printf.sprintf "%s %3d 1.00" (Symmetry.to_string sym) (List.length lc) + in + let rec do_work accu i = function + | [] -> List.rev accu + | (p,c)::tail -> + let p = AO_expo.to_float p.Primitive.expo + and c = AO_coef.to_float c + in + let result = + Printf.sprintf "%15.7f %15.7f" p c + in + do_work (result::accu) (i+1) tail + in + (do_work [result] 1 lc) + |> String.concat ~sep:"\n" + + +(** Transform the gto to a string *) +let to_string ?(fmt=Gamess) = + match fmt with + | Gamess -> to_string_gamess + | Gaussian -> to_string_gaussian + + diff --git a/ocaml/Gto.mli b/ocaml/Gto.mli index fad133a3..753cd81a 100644 --- a/ocaml/Gto.mli +++ b/ocaml/Gto.mli @@ -1,5 +1,9 @@ exception GTO_Read_Failure of string exception End_Of_Basis +type fmt = +| Gamess +| Gaussian + type t = { sym : Symmetry.t ; lc : (Primitive.t * Qptypes.AO_coef.t) list; @@ -13,4 +17,4 @@ val of_prim_coef_list : val read_one : in_channel -> t (** Convert to string for printing *) -val to_string : t -> string +val to_string : ?fmt:fmt -> t -> string diff --git a/ocaml/Input_ao_basis.ml b/ocaml/Input_ao_basis.ml index 82bc4964..88e277ee 100644 --- a/ocaml/Input_ao_basis.ml +++ b/ocaml/Input_ao_basis.ml @@ -17,6 +17,7 @@ module Ao_basis : sig ;; val read : unit -> t option val to_string : t -> string + val to_basis : t -> Basis.t val write : t -> unit val to_md5 : t -> MD5.t val to_rst : t -> Rst_string.t diff --git a/ocaml/Input_nuclei.ml b/ocaml/Input_nuclei.ml index d050ded9..ca81629e 100644 --- a/ocaml/Input_nuclei.ml +++ b/ocaml/Input_nuclei.ml @@ -13,6 +13,7 @@ module Nuclei : sig val read : unit -> t option val write : t -> unit val to_string : t -> string + val to_atom_list : t -> Atom.t list val to_rst : t -> Rst_string.t val of_rst : Rst_string.t -> t option end = struct @@ -134,6 +135,22 @@ end = struct ;; + let to_atom_list b = + let rec loop accu (coord, charge, label) = function + | -1 -> accu + | i -> + let atom = + { Atom.element = label.(i) ; + Atom.charge = charge.(i) ; + Atom.coord = coord.(i) ; + } + in + loop (atom::accu) (coord, charge, label) (i-1) + in + loop [] (b.nucl_coord, b.nucl_charge, b.nucl_label) + ( (Nucl_number.to_int b.nucl_num) - 1) + ;; + let to_string b = Printf.sprintf " nucl_num = %s diff --git a/ocaml/Molecule.ml b/ocaml/Molecule.ml index f0800f7f..a9d73432 100644 --- a/ocaml/Molecule.ml +++ b/ocaml/Molecule.ml @@ -85,7 +85,7 @@ let name m = String.concat (result) -let to_string m = +let to_string_general ~f m = let { nuclei ; elec_alpha ; elec_beta } = m in let n = @@ -94,10 +94,15 @@ let to_string m = let title = name m in - [ Int.to_string n ; title ] @ - (List.map ~f:(fun x -> Atom.to_string Units.Angstrom x) nuclei) + [ Int.to_string n ; title ] @ (List.map ~f nuclei) |> String.concat ~sep:"\n" +let to_string = + to_string_general ~f:(fun x -> Atom.to_string Units.Angstrom x) + +let to_xyz = + to_string_general ~f:Atom.to_xyz + let of_xyz_string ?(charge=(Charge.of_int 0)) ?(multiplicity=(Multiplicity.of_int 1)) diff --git a/ocaml/Molecule.mli b/ocaml/Molecule.mli index 1a3d9715..f81f28a3 100644 --- a/ocaml/Molecule.mli +++ b/ocaml/Molecule.mli @@ -20,6 +20,7 @@ val name : t -> string (** Conversion for printing *) val to_string : t -> string +val to_xyz : t -> string (** Creates a molecule from an xyz file *) diff --git a/ocaml/TaskServer.mli b/ocaml/TaskServer.mli new file mode 100644 index 00000000..f16ddaab --- /dev/null +++ b/ocaml/TaskServer.mli @@ -0,0 +1,84 @@ +type t = +{ + queue : Queuing_system.t ; + state : Message.State.t option ; + address_tcp : Address.Tcp.t option ; + address_inproc : Address.Inproc.t option ; + psi : Message.Psi.t option; + progress_bar : Progress_bar.t option ; + running : bool; +} + + +(** {1} Debugging *) + +(** Fetch the QP_TASK_DEBUG environment variable *) +val debug_env : bool + +(** Print a debug message *) +val debug : string -> unit + +(** {1} ZMQ *) + +(** ZeroMQ context *) +val zmq_context : ZMQ.Context.t + +(** Bind a ZMQ socket *) +val bind_socket : + socket_type:string -> socket:'a ZMQ.Socket.t -> address:string -> unit + +(** Name of the host on which the server runs *) +val hostname : string lazy_t + +(** IP address of the current host *) +val ip_address : string lazy_t + +(** Standard messages *) +val reply_ok : [> `Req ] ZMQ.Socket.t -> unit +val reply_wrong_state : [> `Req ] ZMQ.Socket.t -> unit + +(** Stop server *) +val stop : port:int -> unit + +(** {1} Server functions *) + +(** Create a new job *) +val new_job : Message.Newjob_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t + +(** Finish a running job *) +val end_job : Message.Endjob_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t + +(** Connect a client *) +val connect: Message.Connect_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t + +(** Disconnect a client *) +val disconnect: Message.Disconnect_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t + +(** Add a task to the pool *) +val add_task: Message.AddTask_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t + +(** Mark the task as done by the client *) +val task_done: Message.TaskDone_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t + +(** Delete a task when it has been pulled by the collector *) +val del_task: Message.DelTask_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t + +(** The client get a new task to execute *) +val get_task: Message.GetTask_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t + +(** Terminate server *) +val terminate : t -> [> `Req ] ZMQ.Socket.t -> t + +(** Put a wave function in the task server *) +val put_psi : + Message.PutPsi_msg.t -> string list -> t -> [> `Req ] ZMQ.Socket.t -> t + +(** Get the wave function stored in the task server *) +val get_psi : Message.GetPsi_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t + +(** Reply an Error message *) +val error : string -> t -> [> `Req ] ZMQ.Socket.t -> t + +(** Run server *) +val run : port:int -> unit + diff --git a/ocaml/_tags b/ocaml/_tags index fd4c4804..3f5cd9b6 100644 --- a/ocaml/_tags +++ b/ocaml/_tags @@ -1,3 +1,3 @@ -true: package(core,sexplib.syntax,cryptokit,ZMQ) +true: package(core,cryptokit,ZMQ,sexplib.syntax) true: thread false: profile diff --git a/plugins/All_singles/H_apply.irp.f b/plugins/All_singles/H_apply.irp.f index d0a41f90..f34f003c 100644 --- a/plugins/All_singles/H_apply.irp.f +++ b/plugins/All_singles/H_apply.irp.f @@ -8,10 +8,9 @@ s.unset_skip() s.filter_only_1h1p() print s -s = H_apply("just_mono") +s = H_apply("just_mono",do_double_exc=False) s.set_selection_pt2("epstein_nesbet_2x2") s.unset_skip() -s.unset_double_excitations() print s END_SHELL diff --git a/plugins/All_singles/all_singles.irp.f b/plugins/All_singles/all_singles.irp.f index 3b5c5cce..ad8648c7 100644 --- a/plugins/All_singles/all_singles.irp.f +++ b/plugins/All_singles/all_singles.irp.f @@ -15,7 +15,7 @@ subroutine routine integer :: N_st, degree double precision,allocatable :: E_before(:) integer :: n_det_before - N_st = N_states + N_st = N_states_diag allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st),E_before(N_st)) i = 0 print*,'N_det = ',N_det diff --git a/plugins/CAS_SD/H_apply.irp.f b/plugins/CAS_SD/H_apply.irp.f index aa393bc7..35c45fb6 100644 --- a/plugins/CAS_SD/H_apply.irp.f +++ b/plugins/CAS_SD/H_apply.irp.f @@ -20,22 +20,18 @@ print s s = H_apply("CAS_S",do_double_exc=False) -s.unset_double_excitations() print s s = H_apply("CAS_S_selected_no_skip",do_double_exc=False) -s.unset_double_excitations() s.set_selection_pt2("epstein_nesbet_2x2") s.unset_skip() print s s = H_apply("CAS_S_selected",do_double_exc=False) -s.unset_double_excitations() s.set_selection_pt2("epstein_nesbet_2x2") print s s = H_apply("CAS_S_PT2",do_double_exc=False) -s.unset_double_excitations() s.set_perturbation("epstein_nesbet_2x2") print s diff --git a/plugins/DDCI_selected/ddci.irp.f b/plugins/DDCI_selected/ddci.irp.f index 248671b1..0bfb324f 100644 --- a/plugins/DDCI_selected/ddci.irp.f +++ b/plugins/DDCI_selected/ddci.irp.f @@ -3,10 +3,10 @@ program ddci integer :: i,k - double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) + double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:),E_before(:) integer :: N_st, degree - N_st = N_states - allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st)) + N_st = N_states_diag + allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st),E_before(N_st)) character*(64) :: perturbation pt2 = 1.d0 @@ -27,6 +27,8 @@ program ddci print *, 'E+PT2 = ', CI_energy+pt2 print *, '-----' endif + call set_bitmask_particl_as_input(reunion_of_bitmask) + call set_bitmask_hole_as_input(reunion_of_bitmask) do while (N_det < N_det_max.and.maxval(abs(pt2(1:N_st))) > pt2_max) call H_apply_DDCI_selection(pt2, norm_pert, H_pert_diag, N_st) @@ -47,8 +49,21 @@ program ddci print *, 'N_states = ', N_states print *, 'PT2 = ', pt2 print *, 'E = ', CI_energy - print *, 'E+PT2 = ', CI_energy+pt2 + print *, 'E+PT2 = ', E_before+pt2 print *, '-----' + if(N_states_diag.gt.1)then + print*,'Variational Energy difference' + do i = 2, N_st + 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_st + print*,'Delta E = ',E_before(i)+ pt2(i) - (E_before(1) + pt2(1)) + enddo + endif + E_before = CI_energy call ezfio_set_ddci_selected_energy(CI_energy) enddo if(do_pt2_end)then diff --git a/plugins/FOBOCI/EZFIO.cfg b/plugins/FOBOCI/EZFIO.cfg index d4a10add..88189608 100644 --- a/plugins/FOBOCI/EZFIO.cfg +++ b/plugins/FOBOCI/EZFIO.cfg @@ -1,6 +1,13 @@ -[threshold_singles] +[threshold_lmct] type: double precision -doc: threshold to select the pertinent single excitations at second order +doc: threshold to select the pertinent LMCT excitations at second order +interface: ezfio,provider,ocaml +default: 0.01 + + +[threshold_mlct] +type: double precision +doc: threshold to select the pertinent MLCT excitations at second order interface: ezfio,provider,ocaml default: 0.01 @@ -16,6 +23,20 @@ doc: if true, you do the FOBOCI calculation perturbatively interface: ezfio,provider,ocaml default: .False. + +[speed_up_convergence_foboscf] +type: logical +doc: if true, the threshold of the FOBO-SCF algorithms are increased with the iterations +interface: ezfio,provider,ocaml +default: .True. + + +[dressing_2h2p] +type: logical +doc: if true, you do dress with 2h2p excitations each FOBOCI matrix +interface: ezfio,provider,ocaml +default: .False. + [second_order_h] type: logical doc: if true, you do the FOBOCI calculation using second order intermediate Hamiltonian diff --git a/plugins/FOBOCI/H_apply.irp.f b/plugins/FOBOCI/H_apply.irp.f index 0a488753..d8ab02f1 100644 --- a/plugins/FOBOCI/H_apply.irp.f +++ b/plugins/FOBOCI/H_apply.irp.f @@ -18,8 +18,22 @@ print s -s = H_apply("standard") +s = H_apply("only_1h2p") s.set_selection_pt2("epstein_nesbet") +s.filter_only_1h2p() +s.unset_skip() +print s + +s = H_apply("only_2h2p") +s.set_selection_pt2("epstein_nesbet") +s.filter_only_2h2p() +s.unset_skip() +print s + + +s = H_apply("only_2p") +s.set_selection_pt2("epstein_nesbet") +s.filter_only_2p() s.unset_skip() print s diff --git a/plugins/FOBOCI/NEEDED_CHILDREN_MODULES b/plugins/FOBOCI/NEEDED_CHILDREN_MODULES index adeefe99..f6c0c1c4 100644 --- a/plugins/FOBOCI/NEEDED_CHILDREN_MODULES +++ b/plugins/FOBOCI/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Perturbation Generators_restart Selectors_no_sorted +Perturbation Selectors_no_sorted Hartree_Fock diff --git a/plugins/FOBOCI/all_singles.irp.f b/plugins/FOBOCI/all_singles.irp.f index e2c4c01e..0594e56e 100644 --- a/plugins/FOBOCI/all_singles.irp.f +++ b/plugins/FOBOCI/all_singles.irp.f @@ -6,9 +6,9 @@ subroutine all_single double precision,allocatable :: E_before(:) N_st = N_states allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st),E_before(N_st)) - selection_criterion = 1.d-8 + selection_criterion = 0.d0 soft_touch selection_criterion - threshold_davidson = 1.d-5 + threshold_davidson = 1.d-9 soft_touch threshold_davidson davidson_criterion i = 0 print*,'Doing all the mono excitations !' @@ -52,10 +52,173 @@ subroutine all_single enddo endif E_before = CI_energy + !!!!!!!!!!!!!!!!!!!!!!!!!!! DOING ONLY ONE ITERATION OF SELECTION AS THE SELECTION CRITERION IS SET TO ZERO + exit enddo - threshold_davidson = 1.d-10 +! threshold_davidson = 1.d-8 +! soft_touch threshold_davidson davidson_criterion +! call diagonalize_CI + print*,'Final Step ' + print*,'N_det = ',N_det + do i = 1, N_states_diag + print*,'' + print*,'i = ',i + print*,'E = ',CI_energy(i) + print*,'S^2 = ',CI_eigenvectors_s2(i) + enddo + do i = 1, max(2,N_det_generators) + print*,'psi_coef = ',psi_coef(i,1) + enddo + deallocate(pt2,norm_pert,E_before) +end + +subroutine all_1h2p + implicit none + integer :: i,k + double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) + integer :: N_st, degree + double precision,allocatable :: E_before(:) + N_st = N_states + allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st),E_before(N_st)) + selection_criterion = 0.d0 + soft_touch selection_criterion + threshold_davidson = 1.d-5 soft_touch threshold_davidson davidson_criterion - call diagonalize_CI + i = 0 + print*,'' + print*,'' + print*,'' + print*,'' + print*,'' + print*,'*****************************' + print*,'Doing all the 1h2P excitations' + print*,'*****************************' + print*,'' + print*,'' + print*,'N_det = ',N_det + print*,'n_det_max = ',n_det_max + print*,'pt2_max = ',pt2_max + print*,'N_det_generators = ',N_det_generators + pt2=-1.d0 + E_before = ref_bitmask_energy + + print*,'Initial Step ' + print*,'Inital determinants ' + print*,'N_det = ',N_det + do i = 1, N_states_diag + print*,'' + print*,'i = ',i + print*,'E = ',CI_energy(i) + print*,'S^2 = ',CI_eigenvectors_s2(i) + enddo + n_det_max = 100000 + i = 0 + do while (N_det < n_det_max.and.maxval(abs(pt2(1:N_st))) > pt2_max) + i += 1 + print*,'-----------------------' + print*,'i = ',i + call H_apply_only_1h2p(pt2, norm_pert, H_pert_diag, N_st) + call diagonalize_CI + print*,'N_det = ',N_det + print*,'E = ',CI_energy(1) + print*,'pt2 = ',pt2(1) + print*,'E+PT2 = ',E_before + pt2(1) + if(N_states_diag.gt.1)then + print*,'Variational Energy difference' + do i = 2, N_st + 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_st + print*,'Delta E = ',E_before(i)+ pt2(i) - (E_before(1) + pt2(1)) + enddo + endif + E_before = CI_energy + + enddo + print*,'Final Step ' + print*,'N_det = ',N_det + do i = 1, N_states_diag + print*,'' + print*,'i = ',i + print*,'E = ',CI_energy(i) + print*,'S^2 = ',CI_eigenvectors_s2(i) + enddo + + do i = 1, 2 + print*,'psi_coef = ',psi_coef(i,1) + enddo + deallocate(pt2,norm_pert,E_before) +end + +subroutine all_2h2p + implicit none + integer :: i,k + double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) + integer :: N_st, degree + double precision,allocatable :: E_before(:) + N_st = N_states + allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st),E_before(N_st)) + selection_criterion = 0.d0 + soft_touch selection_criterion + threshold_davidson = 1.d-5 + soft_touch threshold_davidson davidson_criterion + i = 0 + print*,'' + print*,'' + print*,'' + print*,'' + print*,'' + print*,'*****************************' + print*,'Doing all the 2h2P excitations' + print*,'*****************************' + print*,'' + print*,'' + print*,'N_det = ',N_det + print*,'n_det_max = ',n_det_max + print*,'pt2_max = ',pt2_max + print*,'N_det_generators = ',N_det_generators + pt2=-1.d0 + E_before = ref_bitmask_energy + + print*,'Initial Step ' + print*,'Inital determinants ' + print*,'N_det = ',N_det + do i = 1, N_states_diag + print*,'' + print*,'i = ',i + print*,'E = ',CI_energy(i) + print*,'S^2 = ',CI_eigenvectors_s2(i) + enddo + n_det_max = 100000 + i = 0 + do while (N_det < n_det_max.and.maxval(abs(pt2(1:N_st))) > pt2_max) + i += 1 + print*,'-----------------------' + print*,'i = ',i + call H_apply_only_2h2p(pt2, norm_pert, H_pert_diag, N_st) + call diagonalize_CI + print*,'N_det = ',N_det + print*,'E = ',CI_energy(1) + print*,'pt2 = ',pt2(1) + print*,'E+PT2 = ',E_before + pt2(1) + if(N_states_diag.gt.1)then + print*,'Variational Energy difference' + do i = 2, N_st + 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_st + print*,'Delta E = ',E_before(i)+ pt2(i) - (E_before(1) + pt2(1)) + enddo + endif + E_before = CI_energy + + enddo print*,'Final Step ' print*,'N_det = ',N_det do i = 1, N_states_diag @@ -67,10 +230,89 @@ subroutine all_single do i = 1, 2 print*,'psi_coef = ',psi_coef(i,1) enddo -! call save_wavefunction deallocate(pt2,norm_pert,E_before) end +subroutine all_2p + implicit none + integer :: i,k + double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) + integer :: N_st, degree + double precision,allocatable :: E_before(:) + N_st = N_states + allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st),E_before(N_st)) + selection_criterion = 0.d0 + soft_touch selection_criterion + threshold_davidson = 1.d-5 + soft_touch threshold_davidson davidson_criterion + i = 0 + print*,'' + print*,'' + print*,'' + print*,'' + print*,'' + print*,'*****************************' + print*,'Doing all the 2P excitations' + print*,'*****************************' + print*,'' + print*,'' + print*,'N_det = ',N_det + print*,'n_det_max = ',n_det_max + print*,'pt2_max = ',pt2_max + print*,'N_det_generators = ',N_det_generators + pt2=-1.d0 + E_before = ref_bitmask_energy + + print*,'Initial Step ' + print*,'Inital determinants ' + print*,'N_det = ',N_det + do i = 1, N_states_diag + print*,'' + print*,'i = ',i + print*,'E = ',CI_energy(i) + print*,'S^2 = ',CI_eigenvectors_s2(i) + enddo + n_det_max = 100000 + i = 0 + do while (N_det < n_det_max.and.maxval(abs(pt2(1:N_st))) > pt2_max) + i += 1 + print*,'-----------------------' + print*,'i = ',i + call H_apply_only_2p(pt2, norm_pert, H_pert_diag, N_st) + call diagonalize_CI + print*,'N_det = ',N_det + print*,'E = ',CI_energy(1) + print*,'pt2 = ',pt2(1) + print*,'E+PT2 = ',E_before + pt2(1) + if(N_states_diag.gt.1)then + print*,'Variational Energy difference' + do i = 2, N_st + 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_st + print*,'Delta E = ',E_before(i)+ pt2(i) - (E_before(1) + pt2(1)) + enddo + endif + E_before = CI_energy + + enddo + print*,'Final Step ' + print*,'N_det = ',N_det + do i = 1, N_states_diag + print*,'' + print*,'i = ',i + print*,'E = ',CI_energy(i) + print*,'S^2 = ',CI_eigenvectors_s2(i) + enddo + deallocate(pt2,norm_pert,E_before) + do i = 1, 2 + print*,'psi_coef = ',psi_coef(i,1) + enddo +end + subroutine all_single_no_1h_or_1p implicit none integer :: i,k @@ -79,6 +321,8 @@ subroutine all_single_no_1h_or_1p double precision,allocatable :: E_before(:) N_st = N_states allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st),E_before(N_st)) + selection_criterion = 0.d0 + soft_touch selection_criterion threshold_davidson = 1.d-5 soft_touch threshold_davidson davidson_criterion i = 0 @@ -124,7 +368,7 @@ subroutine all_single_no_1h_or_1p endif E_before = CI_energy enddo - threshold_davidson = 1.d-10 + threshold_davidson = 1.d-16 soft_touch threshold_davidson davidson_criterion call diagonalize_CI print*,'Final Step ' @@ -215,85 +459,6 @@ subroutine all_single_no_1h_or_1p_or_2p deallocate(pt2,norm_pert,E_before) end - -subroutine all_2p - implicit none - integer :: i,k - double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) - integer :: N_st, degree - double precision,allocatable :: E_before(:) - N_st = N_states - allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st),E_before(N_st)) - selection_criterion = 0.d0 - soft_touch selection_criterion - threshold_davidson = 1.d-5 - soft_touch threshold_davidson davidson_criterion - i = 0 - print*,'' - print*,'' - print*,'' - print*,'' - print*,'' - print*,'*****************************' - print*,'Doing all the 2P excitations' - print*,'*****************************' - print*,'' - print*,'' - print*,'N_det = ',N_det - print*,'n_det_max = ',n_det_max - print*,'pt2_max = ',pt2_max - print*,'N_det_generators = ',N_det_generators - pt2=-1.d0 - E_before = ref_bitmask_energy - - print*,'Initial Step ' - print*,'Inital determinants ' - print*,'N_det = ',N_det - do i = 1, N_states_diag - print*,'' - print*,'i = ',i - print*,'E = ',CI_energy(i) - print*,'S^2 = ',CI_eigenvectors_s2(i) - enddo - n_det_max = 100000 - i = 0 - do while (N_det < n_det_max.and.maxval(abs(pt2(1:N_st))) > pt2_max) - i += 1 - print*,'-----------------------' - print*,'i = ',i - call H_apply_standard(pt2, norm_pert, H_pert_diag, N_st) - call diagonalize_CI - print*,'N_det = ',N_det - print*,'E = ',CI_energy(1) - print*,'pt2 = ',pt2(1) - print*,'E+PT2 = ',E_before + pt2(1) - if(N_states_diag.gt.1)then - print*,'Variational Energy difference' - do i = 2, N_st - 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_st - print*,'Delta E = ',E_before(i)+ pt2(i) - (E_before(1) + pt2(1)) - enddo - endif - E_before = CI_energy - - enddo - print*,'Final Step ' - print*,'N_det = ',N_det - do i = 1, N_states_diag - print*,'' - print*,'i = ',i - print*,'E = ',CI_energy(i) - print*,'S^2 = ',CI_eigenvectors_s2(i) - enddo -! call save_wavefunction - deallocate(pt2,norm_pert,E_before) -end - subroutine all_1h_1p_routine implicit none integer :: i,k diff --git a/plugins/FOBOCI/all_singles_split.irp.f b/plugins/FOBOCI/all_singles_split.irp.f index e7b0943f..9ddf369a 100644 --- a/plugins/FOBOCI/all_singles_split.irp.f +++ b/plugins/FOBOCI/all_singles_split.irp.f @@ -5,7 +5,7 @@ subroutine all_single_split(psi_det_generators_input,psi_coef_generators_input,N integer(bit_kind), intent(in) :: psi_det_generators_input(N_int,2,Ndet_generators_input) double precision, intent(inout) :: dressing_matrix(Ndet_generators_input,Ndet_generators_input) double precision, intent(in) :: psi_coef_generators_input(ndet_generators_input,n_states) - integer :: i,i_hole + integer :: i,i_hole,j n_det_max_jacobi = 50 soft_touch n_det_max_jacobi do i = 1, n_inact_orb @@ -22,56 +22,339 @@ subroutine all_single_split(psi_det_generators_input,psi_coef_generators_input,N call set_generators_as_input_psi(ndet_generators_input,psi_det_generators_input,psi_coef_generators_input) call set_psi_det_as_input_psi(ndet_generators_input,psi_det_generators_input,psi_coef_generators_input) call all_single - threshold_davidson = 1.d-10 - soft_touch threshold_davidson davidson_criterion - call diagonalize_CI +! call diagonalize_CI_SC2 +! call update_matrix_dressing_sc2(dressing_matrix,ndet_generators_input,psi_det_generators_input,Diag_H_elements_SC2) call provide_matrix_dressing(dressing_matrix,ndet_generators_input,psi_det_generators_input) enddo + + do i = 1, n_act_orb + i_hole = list_act(i) + print*,'' + print*,'Doing all the single excitations from the orbital ' + print*,i_hole + print*,'' + print*,'' + threshold_davidson = 1.d-4 + soft_touch threshold_davidson davidson_criterion + call modify_bitmasks_for_hole(i_hole) + call set_bitmask_particl_as_input(reunion_of_bitmask) + call set_generators_as_input_psi(ndet_generators_input,psi_det_generators_input,psi_coef_generators_input) + call set_psi_det_as_input_psi(ndet_generators_input,psi_det_generators_input,psi_coef_generators_input) + call all_single +! call diagonalize_CI_SC2 +! call update_matrix_dressing_sc2(dressing_matrix,ndet_generators_input,psi_det_generators_input,Diag_H_elements_SC2) + call provide_matrix_dressing(dressing_matrix,ndet_generators_input,psi_det_generators_input) + enddo + + do i = 1, n_virt_orb + i_hole = list_virt(i) + print*,'' + print*,'Doing all the single excitations from the orbital ' + print*,i_hole + print*,'' + print*,'' + threshold_davidson = 1.d-4 + soft_touch threshold_davidson davidson_criterion + call modify_bitmasks_for_hole(i_hole) + call set_bitmask_particl_as_input(reunion_of_bitmask) + call set_generators_as_input_psi(ndet_generators_input,psi_det_generators_input,psi_coef_generators_input) + call set_psi_det_as_input_psi(ndet_generators_input,psi_det_generators_input,psi_coef_generators_input) + call all_single +! call diagonalize_CI_SC2 +! call update_matrix_dressing_sc2(dressing_matrix,ndet_generators_input,psi_det_generators_input,Diag_H_elements_SC2) + call provide_matrix_dressing(dressing_matrix,ndet_generators_input,psi_det_generators_input) + enddo + n_det_max_jacobi = 1000 soft_touch n_det_max_jacobi end -subroutine all_single_for_1h(dressing_matrix_1h1p,dressing_matrix_2h1p) + +subroutine all_single_for_1p(i_particl,dressing_matrix_1h1p,dressing_matrix_1h2p,dressing_matrix_extra_1h_or_1p) implicit none use bitmasks + integer, intent(in) :: i_particl double precision, intent(inout) :: dressing_matrix_1h1p(N_det_generators,N_det_generators) - double precision, intent(inout) :: dressing_matrix_2h1p(N_det_generators,N_det_generators) - integer :: i,i_hole + double precision, intent(inout) :: dressing_matrix_1h2p(N_det_generators,N_det_generators) + double precision, intent(inout) :: dressing_matrix_extra_1h_or_1p(N_det_generators,N_det_generators) + integer :: i,j n_det_max_jacobi = 50 soft_touch n_det_max_jacobi - integer :: n_det_1h1p,n_det_2h1p - integer(bit_kind), allocatable :: psi_ref_out(:,:,:) - integer(bit_kind), allocatable :: psi_1h1p(:,:,:) - integer(bit_kind), allocatable :: psi_2h1p(:,:,:) - double precision, allocatable :: psi_ref_coef_out(:,:) - double precision, allocatable :: psi_coef_1h1p(:,:) - double precision, allocatable :: psi_coef_2h1p(:,:) - call all_single_no_1h_or_1p + call all_single threshold_davidson = 1.d-12 soft_touch threshold_davidson davidson_criterion call diagonalize_CI - call give_n_1h1p_and_n_2h1p_in_psi_det(n_det_1h1p,n_det_2h1p) - allocate(psi_ref_out(N_int,2,N_det_generators)) - allocate(psi_1h1p(N_int,2,n_det_1h1p)) - allocate(psi_2h1p(N_int,2,n_det_2h1p)) - allocate(psi_ref_coef_out(N_det_generators,N_states)) - allocate(psi_coef_1h1p(n_det_1h1p,N_states)) - allocate(psi_coef_2h1p(n_det_2h1p,N_states)) - call split_wf_generators_and_1h1p_and_2h1p(n_det_1h1p,n_det_2h1p,psi_ref_out,psi_ref_coef_out,psi_1h1p,psi_coef_1h1p,psi_2h1p,psi_coef_2h1p) - call provide_matrix_dressing_general(dressing_matrix_1h1p,psi_ref_out,psi_ref_coef_out,N_det_generators, & - psi_1h1p,psi_coef_1h1p,n_det_1h1p) - call provide_matrix_dressing_general(dressing_matrix_2h1p,psi_ref_out,psi_ref_coef_out,N_det_generators, & - psi_2h1p,psi_coef_2h1p,n_det_2h1p) - deallocate(psi_ref_out) - deallocate(psi_1h1p) - deallocate(psi_2h1p) - deallocate(psi_ref_coef_out) - deallocate(psi_coef_1h1p) - deallocate(psi_coef_2h1p) + + + double precision, allocatable :: matrix_ref_1h_1p(:,:) + double precision, allocatable :: matrix_ref_1h_1p_dressing_1h1p(:,:) + double precision, allocatable :: matrix_ref_1h_1p_dressing_1h2p(:,:) + double precision, allocatable :: psi_coef_ref_1h_1p(:,:) + double precision, allocatable :: psi_coef_1h1p(:,:) + double precision, allocatable :: psi_coef_1h2p(:,:) + integer(bit_kind), allocatable :: psi_det_1h2p(:,:,:) + integer(bit_kind), allocatable :: psi_det_ref_1h_1p(:,:,:) + integer(bit_kind), allocatable :: psi_det_1h1p(:,:,:) + integer :: n_det_ref_1h_1p,n_det_1h2p,n_det_1h1p + double precision :: hka + double precision,allocatable :: eigenvectors(:,:), eigenvalues(:) + + + call give_n_ref_1h_1p_and_n_1h2p_1h1p_in_psi_det(n_det_ref_1h_1p,n_det_1h2p,n_det_1h1p) + + allocate(matrix_ref_1h_1p(n_det_ref_1h_1p,n_det_ref_1h_1p)) + allocate(matrix_ref_1h_1p_dressing_1h1p(n_det_ref_1h_1p,n_det_ref_1h_1p)) + allocate(matrix_ref_1h_1p_dressing_1h2p(n_det_ref_1h_1p,n_det_ref_1h_1p)) + allocate(psi_det_ref_1h_1p(N_int,2,n_det_ref_1h_1p), psi_coef_ref_1h_1p(n_det_ref_1h_1p,N_states)) + allocate(psi_det_1h2p(N_int,2,n_det_1h2p), psi_coef_1h2p(n_det_1h2p,N_states)) + allocate(psi_det_1h1p(N_int,2,n_det_1h1p), psi_coef_1h1p(n_det_1h1p,N_states)) + + call give_wf_n_ref_1h_1p_and_n_1h2p_1h1p_in_psi_det(n_det_ref_1h_1p,n_det_1h2p,n_det_1h1p,psi_det_ref_1h_1p,psi_coef_ref_1h_1p,& + psi_det_1h2p,psi_coef_1h2p,psi_det_1h1p,psi_coef_1h1p) + + do i = 1, n_det_ref_1h_1p + do j = 1, n_det_ref_1h_1p + call i_h_j(psi_det_ref_1h_1p(1,1,i),psi_det_ref_1h_1p(1,1,j),N_int,hka) + matrix_ref_1h_1p(i,j) = hka + enddo + enddo + matrix_ref_1h_1p_dressing_1h1p = 0.d0 + matrix_ref_1h_1p_dressing_1h2p = 0.d0 + call provide_matrix_dressing_general(matrix_ref_1h_1p_dressing_1h2p,psi_det_ref_1h_1p,psi_coef_ref_1h_1p,n_det_ref_1h_1p, & + psi_det_1h2p,psi_coef_1h2p,n_det_1h2p) + call provide_matrix_dressing_general(matrix_ref_1h_1p_dressing_1h1p,psi_det_ref_1h_1p,psi_coef_ref_1h_1p,n_det_ref_1h_1p, & + psi_det_1h1p,psi_coef_1h1p,n_det_1h1p) + do i = 1, n_det_ref_1h_1p + do j = 1, n_det_ref_1h_1p + matrix_ref_1h_1p(i,j) += matrix_ref_1h_1p_dressing_1h2p(i,j) + matrix_ref_1h_1p_dressing_1h1p(i,j) + enddo + enddo + + allocate(eigenvectors(n_det_ref_1h_1p,n_det_ref_1h_1p), eigenvalues(n_det_ref_1h_1p)) + call lapack_diag(eigenvalues,eigenvectors,matrix_ref_1h_1p,n_det_ref_1h_1p,n_det_ref_1h_1p) +!do j = 1, n_det_ref_1h_1p +! print*,'coef = ',eigenvectors(j,1) +!enddo + print*,'' + print*,'-----------------------' + print*,'-----------------------' + print*,'e_dressed = ',eigenvalues(1)+nuclear_repulsion + print*,'-----------------------' + ! Extract the + integer, allocatable :: index_generator(:) + integer :: n_det_generators_tmp,degree + n_det_generators_tmp = 0 + allocate(index_generator(n_det_ref_1h_1p)) + do i = 1, n_det_ref_1h_1p + do j = 1, N_det_generators + call get_excitation_degree(psi_det_generators(1,1,j),psi_det_ref_1h_1p(1,1,i), degree, N_int) + if(degree == 0)then + n_det_generators_tmp +=1 + index_generator(n_det_generators_tmp) = i + endif + enddo + enddo + if(n_det_generators_tmp .ne. n_det_generators)then + print*,'PB !!!' + print*,'if(n_det_generators_tmp .ne. n_det_genrators)then' + stop + endif + do i = 1, N_det_generators + print*,'psi_coef_dressed = ',eigenvectors(index_generator(i),1) + do j = 1, N_det_generators + dressing_matrix_1h1p(i,j) += matrix_ref_1h_1p_dressing_1h1p(index_generator(i),index_generator(j)) + dressing_matrix_1h2p(i,j) += matrix_ref_1h_1p_dressing_1h2p(index_generator(i),index_generator(j)) + enddo + enddo + print*,'-----------------------' + print*,'-----------------------' + + + deallocate(matrix_ref_1h_1p) + deallocate(matrix_ref_1h_1p_dressing_1h1p) + deallocate(matrix_ref_1h_1p_dressing_1h2p) + deallocate(psi_det_ref_1h_1p, psi_coef_ref_1h_1p) + deallocate(psi_det_1h2p, psi_coef_1h2p) + deallocate(psi_det_1h1p, psi_coef_1h1p) + deallocate(eigenvectors,eigenvalues) + deallocate(index_generator) + + +end + +subroutine all_single_for_1h(i_hole,dressing_matrix_1h1p,dressing_matrix_2h1p,dressing_matrix_extra_1h_or_1p) + implicit none + use bitmasks + integer, intent(in) :: i_hole + double precision, intent(inout) :: dressing_matrix_1h1p(N_det_generators,N_det_generators) + double precision, intent(inout) :: dressing_matrix_2h1p(N_det_generators,N_det_generators) + double precision, intent(inout) :: dressing_matrix_extra_1h_or_1p(N_det_generators,N_det_generators) + integer :: i,j + n_det_max_jacobi = 50 + soft_touch n_det_max_jacobi + + call all_single + + threshold_davidson = 1.d-12 + soft_touch threshold_davidson davidson_criterion + call diagonalize_CI + + + + double precision, allocatable :: matrix_ref_1h_1p(:,:) + double precision, allocatable :: matrix_ref_1h_1p_dressing_1h1p(:,:) + double precision, allocatable :: matrix_ref_1h_1p_dressing_2h1p(:,:) + double precision, allocatable :: psi_coef_ref_1h_1p(:,:) + double precision, allocatable :: psi_coef_1h1p(:,:) + double precision, allocatable :: psi_coef_2h1p(:,:) + integer(bit_kind), allocatable :: psi_det_2h1p(:,:,:) + integer(bit_kind), allocatable :: psi_det_ref_1h_1p(:,:,:) + integer(bit_kind), allocatable :: psi_det_1h1p(:,:,:) + integer :: n_det_ref_1h_1p,n_det_2h1p,n_det_1h1p + double precision :: hka + double precision,allocatable :: eigenvectors(:,:), eigenvalues(:) + + + call give_n_ref_1h_1p_and_n_2h1p_1h1p_in_psi_det(n_det_ref_1h_1p,n_det_2h1p,n_det_1h1p) + + allocate(matrix_ref_1h_1p(n_det_ref_1h_1p,n_det_ref_1h_1p)) + allocate(matrix_ref_1h_1p_dressing_1h1p(n_det_ref_1h_1p,n_det_ref_1h_1p)) + allocate(matrix_ref_1h_1p_dressing_2h1p(n_det_ref_1h_1p,n_det_ref_1h_1p)) + allocate(psi_det_ref_1h_1p(N_int,2,n_det_ref_1h_1p), psi_coef_ref_1h_1p(n_det_ref_1h_1p,N_states)) + allocate(psi_det_2h1p(N_int,2,n_det_2h1p), psi_coef_2h1p(n_det_2h1p,N_states)) + allocate(psi_det_1h1p(N_int,2,n_det_1h1p), psi_coef_1h1p(n_det_1h1p,N_states)) + + call give_wf_n_ref_1h_1p_and_n_2h1p_1h1p_in_psi_det(n_det_ref_1h_1p,n_det_2h1p,n_det_1h1p,psi_det_ref_1h_1p,psi_coef_ref_1h_1p,& + psi_det_2h1p,psi_coef_2h1p,psi_det_1h1p,psi_coef_1h1p) + + do i = 1, n_det_ref_1h_1p + do j = 1, n_det_ref_1h_1p + call i_h_j(psi_det_ref_1h_1p(1,1,i),psi_det_ref_1h_1p(1,1,j),N_int,hka) + matrix_ref_1h_1p(i,j) = hka + enddo + enddo + matrix_ref_1h_1p_dressing_1h1p = 0.d0 + matrix_ref_1h_1p_dressing_2h1p = 0.d0 + call provide_matrix_dressing_general(matrix_ref_1h_1p_dressing_2h1p,psi_det_ref_1h_1p,psi_coef_ref_1h_1p,n_det_ref_1h_1p, & + psi_det_2h1p,psi_coef_2h1p,n_det_2h1p) + call provide_matrix_dressing_general(matrix_ref_1h_1p_dressing_1h1p,psi_det_ref_1h_1p,psi_coef_ref_1h_1p,n_det_ref_1h_1p, & + psi_det_1h1p,psi_coef_1h1p,n_det_1h1p) + do i = 1, n_det_ref_1h_1p + do j = 1, n_det_ref_1h_1p + matrix_ref_1h_1p(i,j) += matrix_ref_1h_1p_dressing_2h1p(i,j) + matrix_ref_1h_1p_dressing_1h1p(i,j) + enddo + enddo + + allocate(eigenvectors(n_det_ref_1h_1p,n_det_ref_1h_1p), eigenvalues(n_det_ref_1h_1p)) + call lapack_diag(eigenvalues,eigenvectors,matrix_ref_1h_1p,n_det_ref_1h_1p,n_det_ref_1h_1p) +!do j = 1, n_det_ref_1h_1p +! print*,'coef = ',eigenvectors(j,1) +!enddo + print*,'' + print*,'-----------------------' + print*,'-----------------------' + print*,'e_dressed = ',eigenvalues(1)+nuclear_repulsion + print*,'-----------------------' + ! Extract the + integer, allocatable :: index_generator(:) + integer :: n_det_generators_tmp,degree + n_det_generators_tmp = 0 + allocate(index_generator(n_det_ref_1h_1p)) + do i = 1, n_det_ref_1h_1p + do j = 1, N_det_generators + call get_excitation_degree(psi_det_generators(1,1,j),psi_det_ref_1h_1p(1,1,i), degree, N_int) + if(degree == 0)then + n_det_generators_tmp +=1 + index_generator(n_det_generators_tmp) = i + endif + enddo + enddo + if(n_det_generators_tmp .ne. n_det_generators)then + print*,'PB !!!' + print*,'if(n_det_generators_tmp .ne. n_det_genrators)then' + stop + endif + do i = 1, N_det_generators + print*,'psi_coef_dressed = ',eigenvectors(index_generator(i),1) + do j = 1, N_det_generators + dressing_matrix_1h1p(i,j) += matrix_ref_1h_1p_dressing_1h1p(index_generator(i),index_generator(j)) + dressing_matrix_2h1p(i,j) += matrix_ref_1h_1p_dressing_2h1p(index_generator(i),index_generator(j)) + enddo + enddo + print*,'-----------------------' + print*,'-----------------------' + + + deallocate(matrix_ref_1h_1p) + deallocate(matrix_ref_1h_1p_dressing_1h1p) + deallocate(matrix_ref_1h_1p_dressing_2h1p) + deallocate(psi_det_ref_1h_1p, psi_coef_ref_1h_1p) + deallocate(psi_det_2h1p, psi_coef_2h1p) + deallocate(psi_det_1h1p, psi_coef_1h1p) + deallocate(eigenvectors,eigenvalues) + deallocate(index_generator) +!return +! + +!integer(bit_kind), allocatable :: psi_ref_out(:,:,:) +!integer(bit_kind), allocatable :: psi_1h1p(:,:,:) +!integer(bit_kind), allocatable :: psi_2h1p(:,:,:) +!integer(bit_kind), allocatable :: psi_extra_1h_or_1p(:,:,:) +!double precision, allocatable :: psi_ref_coef_out(:,:) +!double precision, allocatable :: psi_coef_extra_1h_or_1p(:,:) + +!call all_single_no_1h_or_1p + +!call give_n_1h1p_and_n_2h1p_in_psi_det(i_hole,n_det_extra_1h_or_1p,n_det_1h1p,n_det_2h1p) +!allocate(psi_ref_out(N_int,2,N_det_generators)) +!allocate(psi_1h1p(N_int,2,n_det_1h1p)) +!allocate(psi_2h1p(N_int,2,n_det_2h1p)) +!allocate(psi_extra_1h_or_1p(N_int,2,n_det_extra_1h_or_1p)) +!allocate(psi_ref_coef_out(N_det_generators,N_states)) +!allocate(psi_coef_1h1p(n_det_1h1p,N_states)) +!allocate(psi_coef_2h1p(n_det_2h1p,N_states)) +!allocate(psi_coef_extra_1h_or_1p(n_det_extra_1h_or_1p,N_states)) +!call split_wf_generators_and_1h1p_and_2h1p(i_hole,n_det_extra_1h_or_1p,n_det_1h1p,n_det_2h1p,psi_ref_out,psi_ref_coef_out,psi_1h1p,psi_coef_1h1p,psi_2h1p,psi_coef_2h1p,psi_extra_1h_or_1p,psi_coef_extra_1h_or_1p) +!do i = 1, n_det_extra_1h_or_1p +! print*,'----' +! print*,'c = ',psi_coef_extra_1h_or_1p(i,1) +! call debug_det(psi_extra_1h_or_1p(1,1,i),N_int) +! print*,'----' +!enddo +!call provide_matrix_dressing_general(dressing_matrix_1h1p,psi_ref_out,psi_ref_coef_out,N_det_generators, & +! psi_1h1p,psi_coef_1h1p,n_det_1h1p) +!print*,'Dressing 1h1p ' +!do j =1, N_det_generators +! print*,' dressing ',dressing_matrix_1h1p(j,:) +!enddo + +!call provide_matrix_dressing_general(dressing_matrix_2h1p,psi_ref_out,psi_ref_coef_out,N_det_generators, & +! psi_2h1p,psi_coef_2h1p,n_det_2h1p) +!print*,'Dressing 2h1p ' +!do j =1, N_det_generators +! print*,' dressing ',dressing_matrix_2h1p(j,:) +!enddo + +!call provide_matrix_dressing_for_extra_1h_or_1p(dressing_matrix_extra_1h_or_1p,psi_ref_out,psi_ref_coef_out,N_det_generators, & +! psi_extra_1h_or_1p,psi_coef_extra_1h_or_1p,n_det_extra_1h_or_1p) +!print*,',dressing_matrix_extra_1h_or_1p' +!do j =1, N_det_generators +! print*,' dressing ',dressing_matrix_extra_1h_or_1p(j,:) +!enddo + + +!deallocate(psi_ref_out) +!deallocate(psi_1h1p) +!deallocate(psi_2h1p) +!deallocate(psi_extra_1h_or_1p) +!deallocate(psi_ref_coef_out) +!deallocate(psi_coef_1h1p) +!deallocate(psi_coef_2h1p) +!deallocate(psi_coef_extra_1h_or_1p) end @@ -197,47 +480,56 @@ subroutine all_single_split_for_1p(dressing_matrix_1h1p,dressing_matrix_1h2p) soft_touch n_det_max_jacobi end -subroutine all_single_for_1p(dressing_matrix_1h1p,dressing_matrix_1h2p) - implicit none - use bitmasks - double precision, intent(inout) :: dressing_matrix_1h1p(N_det_generators,N_det_generators) - double precision, intent(inout) :: dressing_matrix_1h2p(N_det_generators,N_det_generators) - integer :: i,i_hole - n_det_max_jacobi = 50 - soft_touch n_det_max_jacobi - - integer :: n_det_1h1p,n_det_1h2p - integer(bit_kind), allocatable :: psi_ref_out(:,:,:) - integer(bit_kind), allocatable :: psi_1h1p(:,:,:) - integer(bit_kind), allocatable :: psi_1h2p(:,:,:) - double precision, allocatable :: psi_ref_coef_out(:,:) - double precision, allocatable :: psi_coef_1h1p(:,:) - double precision, allocatable :: psi_coef_1h2p(:,:) - call all_single_no_1h_or_1p_or_2p - - threshold_davidson = 1.d-12 - soft_touch threshold_davidson davidson_criterion - call diagonalize_CI - call give_n_1h1p_and_n_1h2p_in_psi_det(n_det_1h1p,n_det_1h2p) - allocate(psi_ref_out(N_int,2,N_det_generators)) - allocate(psi_1h1p(N_int,2,n_det_1h1p)) - allocate(psi_1h2p(N_int,2,n_det_1h2p)) - allocate(psi_ref_coef_out(N_det_generators,N_states)) - allocate(psi_coef_1h1p(n_det_1h1p,N_states)) - allocate(psi_coef_1h2p(n_det_1h2p,N_states)) - call split_wf_generators_and_1h1p_and_1h2p(n_det_1h1p,n_det_1h2p,psi_ref_out,psi_ref_coef_out,psi_1h1p,psi_coef_1h1p,psi_1h2p,psi_coef_1h2p) - call provide_matrix_dressing_general(dressing_matrix_1h1p,psi_ref_out,psi_ref_coef_out,N_det_generators, & - psi_1h1p,psi_coef_1h1p,n_det_1h1p) - call provide_matrix_dressing_general(dressing_matrix_1h2p,psi_ref_out,psi_ref_coef_out,N_det_generators, & - psi_1h2p,psi_coef_1h2p,n_det_1h2p) - - deallocate(psi_ref_out) - deallocate(psi_1h1p) - deallocate(psi_1h2p) - deallocate(psi_ref_coef_out) - deallocate(psi_coef_1h1p) - deallocate(psi_coef_1h2p) - -end +! subroutine all_single_for_1p(i_particl,dressing_matrix_1h1p,dressing_matrix_1h2p,dressing_matrix_extra_1h_or_1p) +! implicit none +! use bitmasks +! integer, intent(in ) :: i_particl +! double precision, intent(inout) :: dressing_matrix_1h1p(N_det_generators,N_det_generators) +! double precision, intent(inout) :: dressing_matrix_1h2p(N_det_generators,N_det_generators) +! double precision, intent(inout) :: dressing_matrix_extra_1h_or_1p(N_det_generators,N_det_generators) +! integer :: i +! n_det_max_jacobi = 50 +! soft_touch n_det_max_jacobi +! +! integer :: n_det_1h1p,n_det_1h2p,n_det_extra_1h_or_1p +! integer(bit_kind), allocatable :: psi_ref_out(:,:,:) +! integer(bit_kind), allocatable :: psi_1h1p(:,:,:) +! integer(bit_kind), allocatable :: psi_1h2p(:,:,:) +! integer(bit_kind), allocatable :: psi_extra_1h_or_1p(:,:,:) +! double precision, allocatable :: psi_ref_coef_out(:,:) +! double precision, allocatable :: psi_coef_1h1p(:,:) +! double precision, allocatable :: psi_coef_1h2p(:,:) +! double precision, allocatable :: psi_coef_extra_1h_or_1p(:,:) +!!!!call all_single_no_1h_or_1p_or_2p +! call all_single +! +! threshold_davidson = 1.d-12 +! soft_touch threshold_davidson davidson_criterion +! call diagonalize_CI +! call give_n_1h1p_and_n_1h2p_in_psi_det(i_particl,n_det_extra_1h_or_1p,n_det_1h1p,n_det_1h2p) +! allocate(psi_ref_out(N_int,2,N_det_generators)) +! allocate(psi_1h1p(N_int,2,n_det_1h1p)) +! allocate(psi_1h2p(N_int,2,n_det_1h2p)) +! allocate(psi_extra_1h_or_1p(N_int,2,n_det_extra_1h_or_1p)) +! allocate(psi_ref_coef_out(N_det_generators,N_states)) +! allocate(psi_coef_1h1p(n_det_1h1p,N_states)) +! allocate(psi_coef_1h2p(n_det_1h2p,N_states)) +! allocate(psi_coef_extra_1h_or_1p(n_det_extra_1h_or_1p,N_states)) +! call split_wf_generators_and_1h1p_and_1h2p(i_particl,n_det_extra_1h_or_1p,n_det_1h1p,n_det_1h2p,psi_ref_out,psi_ref_coef_out,psi_1h1p,psi_coef_1h1p,psi_1h2p,psi_coef_1h2p,psi_extra_1h_or_1p,psi_coef_extra_1h_or_1p) +! call provide_matrix_dressing_general(dressing_matrix_1h1p,psi_ref_out,psi_ref_coef_out,N_det_generators, & +! psi_1h1p,psi_coef_1h1p,n_det_1h1p) +! call provide_matrix_dressing_general(dressing_matrix_1h2p,psi_ref_out,psi_ref_coef_out,N_det_generators, & +! psi_1h2p,psi_coef_1h2p,n_det_1h2p) +! call provide_matrix_dressing_for_extra_1h_or_1p(dressing_matrix_extra_1h_or_1p,psi_ref_out,psi_ref_coef_out,N_det_generators, & +! psi_extra_1h_or_1p,psi_coef_extra_1h_or_1p,n_det_extra_1h_or_1p) +! +! deallocate(psi_ref_out) +! deallocate(psi_1h1p) +! deallocate(psi_1h2p) +! deallocate(psi_ref_coef_out) +! deallocate(psi_coef_1h1p) +! deallocate(psi_coef_1h2p) +! +! end diff --git a/plugins/FOBOCI/collect_all_lmct.irp.f b/plugins/FOBOCI/collect_all_lmct.irp.f new file mode 100644 index 00000000..96eb2858 --- /dev/null +++ b/plugins/FOBOCI/collect_all_lmct.irp.f @@ -0,0 +1,436 @@ +use bitmasks + +subroutine collect_lmct(hole_particle,n_couples) + implicit none + integer, intent(out) :: hole_particle(1000,2), n_couples + BEGIN_DOC + ! Collect all the couple holes/particles of the important LMCT + ! hole_particle(i,1) = ith hole + ! hole_particle(i,2) = ith particle + ! n_couples is the number of important excitations + END_DOC + print*,'COLLECTING THE PERTINENT LMCT (1h)' + double precision, allocatable :: tmp(:,:) + allocate(tmp(size(one_body_dm_mo_alpha_osoci,1),size(one_body_dm_mo_alpha_osoci,2))) + tmp = one_body_dm_mo_alpha_osoci + one_body_dm_mo_beta_osoci + integer :: i,j,iorb,jorb + n_couples = 0 + do i = 1,n_act_orb + iorb = list_act(i) + do j = 1, n_inact_orb + jorb = list_inact(j) + if(dabs(tmp(iorb,jorb)).gt.1.d-2)then + n_couples +=1 + hole_particle(n_couples,1) = jorb + hole_particle(n_couples,2) = iorb + print*,'DM' + print*,hole_particle(n_couples,1),hole_particle(n_couples,2),tmp(iorb,jorb) + endif + enddo + enddo + deallocate(tmp) + print*,'number of meaning full couples of holes/particles ' + print*,'n_couples = ',n_couples + + +end + + +subroutine collect_mlct(hole_particle,n_couples) + implicit none + integer, intent(out) :: hole_particle(1000,2), n_couples + BEGIN_DOC + ! Collect all the couple holes/particles of the important LMCT + ! hole_particle(i,1) = ith hole + ! hole_particle(i,2) = ith particle + ! n_couples is the number of important excitations + END_DOC + print*,'COLLECTING THE PERTINENT MLCT (1p)' + double precision, allocatable :: tmp(:,:) + allocate(tmp(size(one_body_dm_mo_alpha_osoci,1),size(one_body_dm_mo_alpha_osoci,2))) + tmp = one_body_dm_mo_alpha_osoci + one_body_dm_mo_beta_osoci + integer :: i,j,iorb,jorb + n_couples = 0 + do i = 1,n_act_orb + iorb = list_act(i) + do j = 1, n_virt_orb + jorb = list_virt(j) + if(dabs(tmp(iorb,jorb)).gt.1.d-3)then + n_couples +=1 + hole_particle(n_couples,1) = iorb + hole_particle(n_couples,2) = jorb + print*,'DM' + print*,hole_particle(n_couples,1),hole_particle(n_couples,2),tmp(iorb,jorb) + endif + enddo + enddo + deallocate(tmp) + print*,'number of meaning full couples of holes/particles ' + print*,'n_couples = ',n_couples + + +end + + +subroutine collect_lmct_mlct(hole_particle,n_couples) + implicit none + integer, intent(out) :: hole_particle(1000,2), n_couples + BEGIN_DOC + ! Collect all the couple holes/particles of the important LMCT + ! hole_particle(i,1) = ith hole + ! hole_particle(i,2) = ith particle + ! n_couples is the number of important excitations + END_DOC + double precision, allocatable :: tmp(:,:) + print*,'COLLECTING THE PERTINENT LMCT (1h)' + print*,'AND THE PERTINENT MLCT (1p)' + allocate(tmp(size(one_body_dm_mo_alpha_osoci,1),size(one_body_dm_mo_alpha_osoci,2))) + tmp = one_body_dm_mo_alpha_osoci + one_body_dm_mo_beta_osoci + integer :: i,j,iorb,jorb + n_couples = 0 + do i = 1,n_act_orb + iorb = list_act(i) + do j = 1, n_inact_orb + jorb = list_inact(j) + if(dabs(tmp(iorb,jorb)).gt.threshold_lmct)then + n_couples +=1 + hole_particle(n_couples,1) = jorb + hole_particle(n_couples,2) = iorb + print*,'DM' + print*,hole_particle(n_couples,1),hole_particle(n_couples,2),tmp(iorb,jorb) + endif + enddo + do j = 1, n_virt_orb + jorb = list_virt(j) + if(dabs(tmp(iorb,jorb)).gt.threshold_mlct)then + n_couples +=1 + hole_particle(n_couples,1) = iorb + hole_particle(n_couples,2) = jorb + print*,'DM' + print*,hole_particle(n_couples,1),hole_particle(n_couples,2),tmp(iorb,jorb) + endif + enddo + enddo + deallocate(tmp) + print*,'number of meaning full couples of holes/particles ' + print*,'n_couples = ',n_couples + + +end + + +subroutine collect_1h1p(hole_particle,n_couples) + implicit none + integer, intent(out) :: hole_particle(1000,2), n_couples + BEGIN_DOC + ! Collect all the couple holes/particles of the important LMCT + ! hole_particle(i,1) = ith hole + ! hole_particle(i,2) = ith particle + ! n_couples is the number of important excitations + END_DOC + double precision, allocatable :: tmp(:,:) + print*,'COLLECTING THE PERTINENT 1h1p' + allocate(tmp(size(one_body_dm_mo_alpha_osoci,1),size(one_body_dm_mo_alpha_osoci,2))) + tmp = one_body_dm_mo_alpha_osoci + one_body_dm_mo_beta_osoci + integer :: i,j,iorb,jorb + n_couples = 0 + do i = 1,n_virt_orb + iorb = list_virt(i) + do j = 1, n_inact_orb + jorb = list_inact(j) + if(dabs(tmp(iorb,jorb)).gt.1.d-2)then + n_couples +=1 + hole_particle(n_couples,1) = jorb + hole_particle(n_couples,2) = iorb + print*,'DM' + print*,hole_particle(n_couples,1),hole_particle(n_couples,2),tmp(iorb,jorb) + endif + enddo + enddo + deallocate(tmp) + print*,'number of meaning full couples of holes/particles ' + print*,'n_couples = ',n_couples + + +end + + + +subroutine set_lmct_to_generators_restart + implicit none + integer :: i,j,m,n,i_hole,i_particle + integer :: hole_particle(1000,2), n_couples + integer(bit_kind) :: key_tmp(N_int,2) + integer :: N_det_total,i_ok + + call collect_lmct(hole_particle,n_couples) + call set_generators_to_generators_restart + N_det_total = N_det_generators_restart + do i = 1, n_couples + i_hole = hole_particle(i,1) + i_particle = hole_particle(i,2) + do m = 1, N_det_cas + do n = 1, N_int + key_tmp(n,1) = psi_cas(n,1,m) + key_tmp(n,2) = psi_cas(n,2,m) + enddo + ! You excite the beta electron from i_hole to i_particle + print*,'i_hole,i_particle 2 = ',i_hole,i_particle + call do_mono_excitation(key_tmp,i_hole,i_particle,2,i_ok) + print*,'i_ok = ',i_ok + if(i_ok==1)then + N_det_total +=1 + do n = 1, N_int + psi_det_generators(n,1,N_det_total) = key_tmp(n,1) + psi_det_generators(n,2,N_det_total) = key_tmp(n,2) + enddo + endif + + do n = 1, N_int + key_tmp(n,1) = psi_cas(n,1,m) + key_tmp(n,2) = psi_cas(n,2,m) + enddo + + ! You excite the alpha electron from i_hole to i_particle + print*,'i_hole,i_particle 1 = ',i_hole,i_particle + call do_mono_excitation(key_tmp,i_hole,i_particle,1,i_ok) + print*,'i_ok = ',i_ok + if(i_ok==1)then + N_det_total +=1 + do n = 1, N_int + psi_det_generators(n,1,N_det_total) = key_tmp(n,1) + psi_det_generators(n,2,N_det_total) = key_tmp(n,2) + enddo + endif + enddo + enddo + N_det_generators = N_det_total + do i = 1, N_det_generators + psi_coef_generators(i,1) = 1.d0/dsqrt(dble(N_det_total)) + enddo + print*,'number of generators in total = ',N_det_generators + touch N_det_generators psi_coef_generators psi_det_generators +end + +subroutine set_mlct_to_generators_restart + implicit none + integer :: i,j,m,n,i_hole,i_particle + integer :: hole_particle(1000,2), n_couples + integer(bit_kind) :: key_tmp(N_int,2) + integer :: N_det_total,i_ok + + call collect_mlct(hole_particle,n_couples) + call set_generators_to_generators_restart + N_det_total = N_det_generators_restart + do i = 1, n_couples + i_hole = hole_particle(i,1) + i_particle = hole_particle(i,2) + do m = 1, N_det_cas + do n = 1, N_int + key_tmp(n,1) = psi_cas(n,1,m) + key_tmp(n,2) = psi_cas(n,2,m) + enddo + ! You excite the beta electron from i_hole to i_particle + print*,'i_hole,i_particle 2 = ',i_hole,i_particle + call do_mono_excitation(key_tmp,i_hole,i_particle,2,i_ok) + print*,'i_ok = ',i_ok + if(i_ok==1)then + N_det_total +=1 + do n = 1, N_int + psi_det_generators(n,1,N_det_total) = key_tmp(n,1) + psi_det_generators(n,2,N_det_total) = key_tmp(n,2) + enddo + endif + + do n = 1, N_int + key_tmp(n,1) = psi_cas(n,1,m) + key_tmp(n,2) = psi_cas(n,2,m) + enddo + + ! You excite the alpha electron from i_hole to i_particle + print*,'i_hole,i_particle 1 = ',i_hole,i_particle + call do_mono_excitation(key_tmp,i_hole,i_particle,1,i_ok) + print*,'i_ok = ',i_ok + if(i_ok==1)then + N_det_total +=1 + do n = 1, N_int + psi_det_generators(n,1,N_det_total) = key_tmp(n,1) + psi_det_generators(n,2,N_det_total) = key_tmp(n,2) + enddo + endif + enddo + enddo + N_det_generators = N_det_total + do i = 1, N_det_generators + psi_coef_generators(i,1) = 1.d0/dsqrt(dble(N_det_total)) + enddo + print*,'number of generators in total = ',N_det_generators + touch N_det_generators psi_coef_generators psi_det_generators +end + +subroutine set_lmct_mlct_to_generators_restart + implicit none + integer :: i,j,m,n,i_hole,i_particle + integer :: hole_particle(1000,2), n_couples + integer(bit_kind) :: key_tmp(N_int,2) + integer :: N_det_total,i_ok + + call collect_lmct_mlct(hole_particle,n_couples) + call set_generators_to_generators_restart + N_det_total = N_det_generators_restart + do i = 1, n_couples + i_hole = hole_particle(i,1) + i_particle = hole_particle(i,2) + do m = 1, N_det_cas + do n = 1, N_int + key_tmp(n,1) = psi_cas(n,1,m) + key_tmp(n,2) = psi_cas(n,2,m) + enddo + ! You excite the beta electron from i_hole to i_particle + call do_mono_excitation(key_tmp,i_hole,i_particle,2,i_ok) + if(i_ok==1)then + N_det_total +=1 + do n = 1, N_int + psi_det_generators(n,1,N_det_total) = key_tmp(n,1) + psi_det_generators(n,2,N_det_total) = key_tmp(n,2) + enddo + endif + + do n = 1, N_int + key_tmp(n,1) = psi_cas(n,1,m) + key_tmp(n,2) = psi_cas(n,2,m) + enddo + + ! You excite the alpha electron from i_hole to i_particle + call do_mono_excitation(key_tmp,i_hole,i_particle,1,i_ok) + if(i_ok==1)then + N_det_total +=1 + do n = 1, N_int + psi_det_generators(n,1,N_det_total) = key_tmp(n,1) + psi_det_generators(n,2,N_det_total) = key_tmp(n,2) + enddo + endif + enddo + enddo + N_det_generators = N_det_total + do i = 1, N_det_generators + psi_coef_generators(i,1) = 1.d0/dsqrt(dble(N_det_total)) + enddo + print*,'number of generators in total = ',N_det_generators + touch N_det_generators psi_coef_generators psi_det_generators +end + +subroutine set_lmct_mlct_to_psi_det + implicit none + integer :: i,j,m,n,i_hole,i_particle + integer :: hole_particle(1000,2), n_couples + integer(bit_kind) :: key_tmp(N_int,2) + integer :: N_det_total,i_ok + + call collect_lmct_mlct(hole_particle,n_couples) + call set_psi_det_to_generators_restart + N_det_total = N_det_generators_restart + do i = 1, n_couples + i_hole = hole_particle(i,1) + i_particle = hole_particle(i,2) + do m = 1, N_det_generators_restart + do n = 1, N_int + key_tmp(n,1) = psi_det_generators_restart(n,1,m) + key_tmp(n,2) = psi_det_generators_restart(n,2,m) + enddo + ! You excite the beta electron from i_hole to i_particle + call do_mono_excitation(key_tmp,i_hole,i_particle,2,i_ok) + if(i_ok==1)then + N_det_total +=1 + do n = 1, N_int + psi_det(n,1,N_det_total) = key_tmp(n,1) + psi_det(n,2,N_det_total) = key_tmp(n,2) + enddo + endif + + do n = 1, N_int + key_tmp(n,1) = psi_det_generators_restart(n,1,m) + key_tmp(n,2) = psi_det_generators_restart(n,2,m) + enddo + + ! You excite the alpha electron from i_hole to i_particle + call do_mono_excitation(key_tmp,i_hole,i_particle,1,i_ok) + if(i_ok==1)then + N_det_total +=1 + do n = 1, N_int + psi_det(n,1,N_det_total) = key_tmp(n,1) + psi_det(n,2,N_det_total) = key_tmp(n,2) + enddo + endif + enddo + enddo + + N_det = N_det_total + integer :: k + do k = 1, N_states + do i = 1, N_det + psi_coef(i,k) = 1.d0/dsqrt(dble(N_det_total)) + enddo + enddo + SOFT_TOUCH N_det psi_det psi_coef + logical :: found_duplicates + call remove_duplicates_in_psi_det(found_duplicates) +end + +subroutine set_1h1p_to_psi_det + implicit none + integer :: i,j,m,n,i_hole,i_particle + integer :: hole_particle(1000,2), n_couples + integer(bit_kind) :: key_tmp(N_int,2) + integer :: N_det_total,i_ok + + call collect_1h1p(hole_particle,n_couples) + call set_psi_det_to_generators_restart + N_det_total = N_det_generators_restart + do i = 1, n_couples + i_hole = hole_particle(i,1) + i_particle = hole_particle(i,2) + do m = 1, N_det_generators_restart + do n = 1, N_int + key_tmp(n,1) = psi_det_generators_restart(n,1,m) + key_tmp(n,2) = psi_det_generators_restart(n,2,m) + enddo + ! You excite the beta electron from i_hole to i_particle + call do_mono_excitation(key_tmp,i_hole,i_particle,2,i_ok) + if(i_ok==1)then + N_det_total +=1 + do n = 1, N_int + psi_det(n,1,N_det_total) = key_tmp(n,1) + psi_det(n,2,N_det_total) = key_tmp(n,2) + enddo + endif + + do n = 1, N_int + key_tmp(n,1) = psi_det_generators_restart(n,1,m) + key_tmp(n,2) = psi_det_generators_restart(n,2,m) + enddo + + ! You excite the alpha electron from i_hole to i_particle + call do_mono_excitation(key_tmp,i_hole,i_particle,1,i_ok) + if(i_ok==1)then + N_det_total +=1 + do n = 1, N_int + psi_det(n,1,N_det_total) = key_tmp(n,1) + psi_det(n,2,N_det_total) = key_tmp(n,2) + enddo + endif + enddo + enddo + + N_det = N_det_total + integer :: k + do k = 1, N_states + do i = 1, N_det + psi_coef(i,k) = 1.d0/dsqrt(dble(N_det_total)) + enddo + enddo + SOFT_TOUCH N_det psi_det psi_coef + logical :: found_duplicates + call remove_duplicates_in_psi_det(found_duplicates) +end + diff --git a/plugins/FOBOCI/corr_energy_2h2p.irp.f b/plugins/FOBOCI/corr_energy_2h2p.irp.f new file mode 100644 index 00000000..ada46bf2 --- /dev/null +++ b/plugins/FOBOCI/corr_energy_2h2p.irp.f @@ -0,0 +1,425 @@ + BEGIN_PROVIDER [double precision, corr_energy_2h2p_per_orb_ab, (mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h2p_ab_2_orb, (mo_tot_num,mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h2p_bb_2_orb, (mo_tot_num,mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h2p_for_1h1p_a, (mo_tot_num,mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h2p_for_1h1p_b, (mo_tot_num,mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h2p_for_1h1p_double, (mo_tot_num,mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h2p_per_orb_aa, (mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h2p_per_orb_bb, (mo_tot_num)] +&BEGIN_PROVIDER [ double precision, total_corr_e_2h2p] + use bitmasks + print*,'' + print*,'Providing the 2h2p correlation energy' + print*,'' + implicit none + integer(bit_kind) :: key_tmp(N_int,2) + integer :: i,j,k,l + integer :: i_hole,j_hole,k_part,l_part + double precision :: get_mo_bielec_integral_schwartz,hij,delta_e,exc,contrib + double precision :: diag_H_mat_elem + integer :: i_ok,ispin + ! Alpha - Beta correlation energy + total_corr_e_2h2p = 0.d0 + corr_energy_2h2p_ab_2_orb = 0.d0 + corr_energy_2h2p_bb_2_orb = 0.d0 + corr_energy_2h2p_per_orb_ab = 0.d0 + corr_energy_2h2p_per_orb_aa = 0.d0 + corr_energy_2h2p_per_orb_bb = 0.d0 + corr_energy_2h2p_for_1h1p_a = 0.d0 + corr_energy_2h2p_for_1h1p_b = 0.d0 + corr_energy_2h2p_for_1h1p_double = 0.d0 + do i = 1, n_inact_orb ! beta + i_hole = list_inact(i) + do k = 1, n_virt_orb ! beta + k_part = list_virt(k) + do j = 1, n_inact_orb ! alpha + j_hole = list_inact(j) + do l = 1, n_virt_orb ! alpha + l_part = list_virt(l) + + key_tmp = ref_bitmask + ispin = 2 + call do_mono_excitation(key_tmp,i_hole,k_part,ispin,i_ok) + if(i_ok .ne.1)cycle + ispin = 1 + call do_mono_excitation(key_tmp,j_hole,l_part,ispin,i_ok) + if(i_ok .ne.1)cycle + delta_e = (ref_bitmask_energy - diag_H_mat_elem(key_tmp,N_int)) + + hij = get_mo_bielec_integral_schwartz(i_hole,j_hole,k_part,l_part,mo_integrals_map) + contrib = hij*hij/delta_e + total_corr_e_2h2p += contrib + ! Single orbital contribution + corr_energy_2h2p_per_orb_ab(i_hole) += contrib + corr_energy_2h2p_per_orb_ab(k_part) += contrib + ! Couple of orbital contribution for the single 1h1p + corr_energy_2h2p_for_1h1p_a(j_hole,l_part) += contrib + corr_energy_2h2p_for_1h1p_a(l_part,j_hole) += contrib + corr_energy_2h2p_for_1h1p_b(j_hole,l_part) += contrib + corr_energy_2h2p_for_1h1p_b(l_part,j_hole) += contrib + ! Couple of orbital contribution for the double 1h1p + corr_energy_2h2p_for_1h1p_double(i_hole,l_part) += contrib + corr_energy_2h2p_for_1h1p_double(l_part,i_hole) += contrib + + corr_energy_2h2p_ab_2_orb(i_hole,j_hole) += contrib + corr_energy_2h2p_ab_2_orb(j_hole,i_hole) += contrib + corr_energy_2h2p_ab_2_orb(i_hole,k_part) += contrib + corr_energy_2h2p_ab_2_orb(k_part,i_hole) += contrib + corr_energy_2h2p_ab_2_orb(k_part,l_part) += contrib + corr_energy_2h2p_ab_2_orb(l_part,k_part) += contrib + enddo + enddo + enddo + enddo + + ! alpha alpha correlation energy + do i = 1, n_inact_orb + i_hole = list_inact(i) + do j = i+1, n_inact_orb + j_hole = list_inact(j) + do k = 1, n_virt_orb + k_part = list_virt(k) + do l = k+1,n_virt_orb + l_part = list_virt(l) + hij = get_mo_bielec_integral_schwartz(i_hole,j_hole,k_part,l_part,mo_integrals_map) + exc = get_mo_bielec_integral_schwartz(i_hole,j_hole,l_part,k_part,mo_integrals_map) + key_tmp = ref_bitmask + ispin = 1 + call do_mono_excitation(key_tmp,i_hole,k_part,ispin,i_ok) + if(i_ok .ne.1)cycle + ispin = 1 + call do_mono_excitation(key_tmp,j_hole,l_part,ispin,i_ok) + if(i_ok .ne.1)cycle + delta_e = -(ref_bitmask_energy - diag_H_mat_elem(key_tmp,N_int)) + hij = hij - exc + contrib = 0.5d0 * (delta_e - dsqrt(delta_e * delta_e + 4.d0 * hij*hij)) + total_corr_e_2h2p += contrib + ! Single orbital contribution + corr_energy_2h2p_per_orb_aa(i_hole) += contrib + corr_energy_2h2p_per_orb_aa(k_part) += contrib + ! Couple of orbital contribution for the single 1h1p + corr_energy_2h2p_for_1h1p_a(i_hole,k_part) += contrib + corr_energy_2h2p_for_1h1p_a(k_part,i_hole) += contrib + enddo + enddo + enddo + enddo + + ! beta beta correlation energy + do i = 1, n_inact_orb + i_hole = list_inact(i) + do j = i+1, n_inact_orb + j_hole = list_inact(j) + do k = 1, n_virt_orb + k_part = list_virt(k) + do l = k+1,n_virt_orb + l_part = list_virt(l) + hij = get_mo_bielec_integral_schwartz(i_hole,j_hole,k_part,l_part,mo_integrals_map) + exc = get_mo_bielec_integral_schwartz(i_hole,j_hole,l_part,k_part,mo_integrals_map) + key_tmp = ref_bitmask + ispin = 2 + call do_mono_excitation(key_tmp,i_hole,k_part,ispin,i_ok) + if(i_ok .ne.1)cycle + ispin = 2 + call do_mono_excitation(key_tmp,j_hole,l_part,ispin,i_ok) + if(i_ok .ne.1)cycle + delta_e = -(ref_bitmask_energy - diag_H_mat_elem(key_tmp,N_int)) + hij = hij - exc + contrib = 0.5d0 * (delta_e - dsqrt(delta_e * delta_e + 4.d0 * hij*hij)) + total_corr_e_2h2p += contrib + ! Single orbital contribution + corr_energy_2h2p_per_orb_bb(i_hole) += contrib + corr_energy_2h2p_per_orb_bb(k_part) += contrib + corr_energy_2h2p_for_1h1p_b(i_hole,k_part) += contrib + corr_energy_2h2p_for_1h1p_b(k_part,i_hole) += contrib + + ! Two particle correlation energy + corr_energy_2h2p_bb_2_orb(i_hole,j_hole) += contrib + corr_energy_2h2p_bb_2_orb(j_hole,i_hole) += contrib + corr_energy_2h2p_bb_2_orb(i_hole,k_part) += contrib + corr_energy_2h2p_bb_2_orb(k_part,i_hole) += contrib + corr_energy_2h2p_bb_2_orb(k_part,l_part) += contrib + corr_energy_2h2p_bb_2_orb(l_part,k_part) += contrib + + enddo + enddo + enddo + enddo + +END_PROVIDER + + BEGIN_PROVIDER [double precision, corr_energy_2h1p_ab_bb_per_2_orb, (mo_tot_num,mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h1p_for_1h1p_a, (mo_tot_num,mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h1p_for_1h1p_b, (mo_tot_num,mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h1p_for_1h1p_double, (mo_tot_num,mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h1p_per_orb_ab, (mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h1p_per_orb_aa, (mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_2h1p_per_orb_bb, (mo_tot_num)] +&BEGIN_PROVIDER [ double precision, total_corr_e_2h1p] + use bitmasks + implicit none + integer(bit_kind) :: key_tmp(N_int,2) + integer :: i,j,k,l + integer :: i_hole,j_hole,k_part,l_part + double precision :: get_mo_bielec_integral_schwartz,hij,delta_e,exc,contrib + double precision :: diag_H_mat_elem + integer :: i_ok,ispin + ! Alpha - Beta correlation energy + total_corr_e_2h1p = 0.d0 + corr_energy_2h1p_per_orb_ab = 0.d0 + corr_energy_2h1p_per_orb_aa = 0.d0 + corr_energy_2h1p_per_orb_bb = 0.d0 + corr_energy_2h1p_ab_bb_per_2_orb = 0.d0 + corr_energy_2h1p_for_1h1p_a = 0.d0 + corr_energy_2h1p_for_1h1p_b = 0.d0 + corr_energy_2h1p_for_1h1p_double = 0.d0 + do i = 1, n_inact_orb + i_hole = list_inact(i) + do k = 1, n_act_orb + k_part = list_act(k) + do j = 1, n_inact_orb + j_hole = list_inact(j) + do l = 1, n_virt_orb + l_part = list_virt(l) + + key_tmp = ref_bitmask + ispin = 2 + call do_mono_excitation(key_tmp,i_hole,k_part,ispin,i_ok) + if(i_ok .ne.1)cycle + ispin = 1 + call do_mono_excitation(key_tmp,j_hole,l_part,ispin,i_ok) + if(i_ok .ne.1)cycle + delta_e = -(ref_bitmask_energy - diag_H_mat_elem(key_tmp,N_int)) + + hij = get_mo_bielec_integral_schwartz(i_hole,j_hole,k_part,l_part,mo_integrals_map) + contrib = 0.5d0 * (delta_e - dsqrt(delta_e * delta_e + 4.d0 * hij*hij)) + total_corr_e_2h1p += contrib + corr_energy_2h1p_ab_bb_per_2_orb(i_hole,j_hole) += contrib + corr_energy_2h1p_per_orb_ab(i_hole) += contrib + corr_energy_2h1p_per_orb_ab(l_part) += contrib + enddo + enddo + enddo + enddo + + ! Alpha Alpha spin correlation energy + do i = 1, n_inact_orb + i_hole = list_inact(i) + do j = i+1, n_inact_orb + j_hole = list_inact(j) + do k = 1, n_act_orb + k_part = list_act(k) + do l = 1,n_virt_orb + l_part = list_virt(l) + hij = get_mo_bielec_integral_schwartz(i_hole,j_hole,k_part,l_part,mo_integrals_map) + exc = get_mo_bielec_integral_schwartz(i_hole,j_hole,l_part,k_part,mo_integrals_map) + key_tmp = ref_bitmask + ispin = 1 + call do_mono_excitation(key_tmp,i_hole,k_part,ispin,i_ok) + if(i_ok .ne.1)cycle + ispin = 1 + call do_mono_excitation(key_tmp,j_hole,l_part,ispin,i_ok) + if(i_ok .ne.1)cycle + delta_e = -(ref_bitmask_energy - diag_H_mat_elem(key_tmp,N_int)) + hij = hij - exc + contrib = 0.5d0 * (delta_e - dsqrt(delta_e * delta_e + 4.d0 * hij*hij)) + + total_corr_e_2h1p += contrib + corr_energy_2h1p_per_orb_aa(i_hole) += contrib + corr_energy_2h1p_per_orb_aa(l_part) += contrib + enddo + enddo + enddo + enddo + + ! Beta Beta correlation energy + do i = 1, n_inact_orb + i_hole = list_inact(i) + do j = i+1, n_inact_orb + j_hole = list_inact(j) + do k = 1, n_act_orb + k_part = list_act(k) + do l = 1,n_virt_orb + l_part = list_virt(l) + hij = get_mo_bielec_integral_schwartz(i_hole,j_hole,k_part,l_part,mo_integrals_map) + exc = get_mo_bielec_integral_schwartz(i_hole,j_hole,l_part,k_part,mo_integrals_map) + key_tmp = ref_bitmask + ispin = 2 + call do_mono_excitation(key_tmp,i_hole,k_part,ispin,i_ok) + if(i_ok .ne.1)cycle + ispin = 2 + call do_mono_excitation(key_tmp,j_hole,l_part,ispin,i_ok) + if(i_ok .ne.1)cycle + delta_e = -(ref_bitmask_energy - diag_H_mat_elem(key_tmp,N_int)) + hij = hij - exc + contrib = 0.5d0 * (delta_e - dsqrt(delta_e * delta_e + 4.d0 * hij*hij)) + corr_energy_2h1p_ab_bb_per_2_orb(i_hole,j_hole) += contrib + + total_corr_e_2h1p += contrib + corr_energy_2h1p_per_orb_bb(i_hole) += contrib + corr_energy_2h1p_per_orb_aa(l_part) += contrib + enddo + enddo + enddo + enddo + +END_PROVIDER + + + BEGIN_PROVIDER [double precision, corr_energy_1h2p_per_orb_ab, (mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_1h2p_two_orb, (mo_tot_num,mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_1h2p_per_orb_aa, (mo_tot_num)] +&BEGIN_PROVIDER [double precision, corr_energy_1h2p_per_orb_bb, (mo_tot_num)] +&BEGIN_PROVIDER [ double precision, total_corr_e_1h2p] + use bitmasks + implicit none + integer(bit_kind) :: key_tmp(N_int,2) + integer :: i,j,k,l + integer :: i_hole,j_hole,k_part,l_part + double precision :: get_mo_bielec_integral_schwartz,hij,delta_e,exc,contrib + double precision :: diag_H_mat_elem + integer :: i_ok,ispin + ! Alpha - Beta correlation energy + total_corr_e_1h2p = 0.d0 + corr_energy_1h2p_per_orb_ab = 0.d0 + corr_energy_1h2p_per_orb_aa = 0.d0 + corr_energy_1h2p_per_orb_bb = 0.d0 + do i = 1, n_virt_orb + i_hole = list_virt(i) + do k = 1, n_act_orb + k_part = list_act(k) + do j = 1, n_inact_orb + j_hole = list_inact(j) + do l = 1, n_virt_orb + l_part = list_virt(l) + + key_tmp = ref_bitmask + ispin = 2 + call do_mono_excitation(key_tmp,i_hole,k_part,ispin,i_ok) + if(i_ok .ne.1)cycle + ispin = 1 + call do_mono_excitation(key_tmp,j_hole,l_part,ispin,i_ok) + if(i_ok .ne.1)cycle + delta_e = -(ref_bitmask_energy - diag_H_mat_elem(key_tmp,N_int)) + + hij = get_mo_bielec_integral_schwartz(i_hole,j_hole,k_part,l_part,mo_integrals_map) + contrib = 0.5d0 * (delta_e - dsqrt(delta_e * delta_e + 4.d0 * hij*hij)) + + total_corr_e_1h2p += contrib + corr_energy_1h2p_per_orb_ab(i_hole) += contrib + corr_energy_1h2p_per_orb_ab(j_hole) += contrib + corr_energy_1h2p_two_orb(k_part,l_part) += contrib + corr_energy_1h2p_two_orb(l_part,k_part) += contrib + enddo + enddo + enddo + enddo + + ! Alpha Alpha correlation energy + do i = 1, n_virt_orb + i_hole = list_virt(i) + do j = 1, n_inact_orb + j_hole = list_inact(j) + do k = 1, n_act_orb + k_part = list_act(k) + do l = i+1,n_virt_orb + l_part = list_virt(l) + hij = get_mo_bielec_integral_schwartz(i_hole,j_hole,k_part,l_part,mo_integrals_map) + exc = get_mo_bielec_integral_schwartz(i_hole,j_hole,l_part,k_part,mo_integrals_map) + + key_tmp = ref_bitmask + ispin = 1 + call do_mono_excitation(key_tmp,i_hole,k_part,ispin,i_ok) + if(i_ok .ne.1)cycle + ispin = 1 + call do_mono_excitation(key_tmp,j_hole,l_part,ispin,i_ok) + if(i_ok .ne.1)cycle + delta_e = -(ref_bitmask_energy - diag_H_mat_elem(key_tmp,N_int)) + hij = hij - exc + contrib = 0.5d0 * (delta_e - dsqrt(delta_e * delta_e + 4.d0 * hij*hij)) + total_corr_e_1h2p += contrib + corr_energy_1h2p_per_orb_aa(i_hole) += contrib + corr_energy_1h2p_per_orb_ab(j_hole) += contrib + corr_energy_1h2p_two_orb(k_part,l_part) += contrib + corr_energy_1h2p_two_orb(l_part,k_part) += contrib + enddo + enddo + enddo + enddo + + ! Beta Beta correlation energy + do i = 1, n_virt_orb + i_hole = list_virt(i) + do j = 1, n_inact_orb + j_hole = list_inact(j) + do k = 1, n_act_orb + k_part = list_act(k) + do l = i+1,n_virt_orb + l_part = list_virt(l) + hij = get_mo_bielec_integral_schwartz(i_hole,j_hole,k_part,l_part,mo_integrals_map) + exc = get_mo_bielec_integral_schwartz(i_hole,j_hole,l_part,k_part,mo_integrals_map) + + key_tmp = ref_bitmask + ispin = 2 + call do_mono_excitation(key_tmp,i_hole,k_part,ispin,i_ok) + if(i_ok .ne.1)cycle + ispin = 2 + call do_mono_excitation(key_tmp,j_hole,l_part,ispin,i_ok) + if(i_ok .ne.1)cycle + delta_e = -(ref_bitmask_energy - diag_H_mat_elem(key_tmp,N_int)) + hij = hij - exc + contrib = 0.5d0 * (delta_e - dsqrt(delta_e * delta_e + 4.d0 * hij*hij)) + total_corr_e_1h2p += contrib + corr_energy_1h2p_per_orb_bb(i_hole) += contrib + corr_energy_1h2p_per_orb_ab(j_hole) += contrib + corr_energy_1h2p_two_orb(k_part,l_part) += contrib + corr_energy_1h2p_two_orb(l_part,k_part) += contrib + enddo + enddo + enddo + enddo + +END_PROVIDER + + BEGIN_PROVIDER [double precision, corr_energy_1h1p_spin_flip_per_orb, (mo_tot_num)] +&BEGIN_PROVIDER [ double precision, total_corr_e_1h1p_spin_flip] + use bitmasks + implicit none + integer(bit_kind) :: key_tmp(N_int,2) + integer :: i,j,k,l + integer :: i_hole,j_hole,k_part,l_part + double precision :: get_mo_bielec_integral_schwartz,hij,delta_e,exc,contrib + double precision :: diag_H_mat_elem + integer :: i_ok,ispin + ! Alpha - Beta correlation energy + total_corr_e_1h1p_spin_flip = 0.d0 + corr_energy_1h1p_spin_flip_per_orb = 0.d0 + do i = 1, n_inact_orb + i_hole = list_inact(i) + do k = 1, n_act_orb + k_part = list_act(k) + do j = 1, n_act_orb + j_hole = list_act(j) + do l = 1, n_virt_orb + l_part = list_virt(l) + + key_tmp = ref_bitmask + ispin = 2 + call do_mono_excitation(key_tmp,i_hole,k_part,ispin,i_ok) + if(i_ok .ne.1)cycle + ispin = 1 + call do_mono_excitation(key_tmp,j_hole,l_part,ispin,i_ok) + if(i_ok .ne.1)cycle + delta_e = -(ref_bitmask_energy - diag_H_mat_elem(key_tmp,N_int)) + + hij = get_mo_bielec_integral_schwartz(i_hole,j_hole,k_part,l_part,mo_integrals_map) + contrib = 0.5d0 * (delta_e - dsqrt(delta_e * delta_e + 4.d0 * hij*hij)) + + total_corr_e_1h1p_spin_flip += contrib + corr_energy_1h1p_spin_flip_per_orb(i_hole) += contrib + enddo + enddo + enddo + enddo + +END_PROVIDER diff --git a/plugins/FOBOCI/diag_fock_inactiv_virt.irp.f b/plugins/FOBOCI/diag_fock_inactiv_virt.irp.f index a4c6b652..83955e61 100644 --- a/plugins/FOBOCI/diag_fock_inactiv_virt.irp.f +++ b/plugins/FOBOCI/diag_fock_inactiv_virt.irp.f @@ -3,6 +3,7 @@ subroutine diag_inactive_virt_and_update_mos integer :: i,j,i_inact,j_inact,i_virt,j_virt double precision :: tmp(mo_tot_num_align,mo_tot_num) character*(64) :: label + print*,'Diagonalizing the occ and virt Fock operator' tmp = 0.d0 do i = 1, mo_tot_num tmp(i,i) = Fock_matrix_mo(i,i) @@ -33,3 +34,50 @@ subroutine diag_inactive_virt_and_update_mos end + +subroutine diag_inactive_virt_new_and_update_mos + implicit none + integer :: i,j,i_inact,j_inact,i_virt,j_virt,k,k_act + double precision :: tmp(mo_tot_num_align,mo_tot_num),accu,get_mo_bielec_integral_schwartz + character*(64) :: label + tmp = 0.d0 + do i = 1, mo_tot_num + tmp(i,i) = Fock_matrix_mo(i,i) + enddo + + do i = 1, n_inact_orb + i_inact = list_inact(i) + do j = i+1, n_inact_orb + j_inact = list_inact(j) + accu =0.d0 + do k = 1, n_act_orb + k_act = list_act(k) + accu += get_mo_bielec_integral_schwartz(i_inact,k_act,j_inact,k_act,mo_integrals_map) + accu -= get_mo_bielec_integral_schwartz(i_inact,k_act,k_act,j_inact,mo_integrals_map) + enddo + tmp(i_inact,j_inact) = Fock_matrix_mo(i_inact,j_inact) + accu + tmp(j_inact,i_inact) = Fock_matrix_mo(j_inact,i_inact) + accu + enddo + enddo + + do i = 1, n_virt_orb + i_virt = list_virt(i) + do j = i+1, n_virt_orb + j_virt = list_virt(j) + accu =0.d0 + do k = 1, n_act_orb + k_act = list_act(k) + accu += get_mo_bielec_integral_schwartz(i_virt,k_act,j_virt,k_act,mo_integrals_map) + enddo + tmp(i_virt,j_virt) = Fock_matrix_mo(i_virt,j_virt) - accu + tmp(j_virt,i_virt) = Fock_matrix_mo(j_virt,i_virt) - accu + enddo + enddo + + + label = "Canonical" + call mo_as_eigvectors_of_mo_matrix(tmp,size(tmp,1),size(tmp,2),label,1) + soft_touch mo_coef + + +end diff --git a/plugins/FOBOCI/dress_simple.irp.f b/plugins/FOBOCI/dress_simple.irp.f index 2f662f4d..99566a8e 100644 --- a/plugins/FOBOCI/dress_simple.irp.f +++ b/plugins/FOBOCI/dress_simple.irp.f @@ -58,24 +58,24 @@ subroutine standard_dress(delta_ij_generators_,size_buffer,Ndet_generators,i_gen call i_h_j(det_buffer(1,1,i),det_buffer(1,1,i),Nint,haa) f = 1.d0/(E_ref-haa) - if(second_order_h)then +! if(second_order_h)then lambda_i = f - else - ! You write the new Hamiltonian matrix - do k = 1, Ndet_generators - H_matrix_tmp(k,Ndet_generators+1) = H_array(k) - H_matrix_tmp(Ndet_generators+1,k) = H_array(k) - enddo - H_matrix_tmp(Ndet_generators+1,Ndet_generators+1) = haa - ! Then diagonalize it - call lapack_diag(eigenvalues,eigenvectors,H_matrix_tmp,Ndet_generators+1,Ndet_generators+1) - ! Then you extract the effective denominator - accu = 0.d0 - do k = 1, Ndet_generators - accu += eigenvectors(k,1) * H_array(k) - enddo - lambda_i = eigenvectors(Ndet_generators+1,1)/accu - endif +! else +! ! You write the new Hamiltonian matrix +! do k = 1, Ndet_generators +! H_matrix_tmp(k,Ndet_generators+1) = H_array(k) +! H_matrix_tmp(Ndet_generators+1,k) = H_array(k) +! enddo +! H_matrix_tmp(Ndet_generators+1,Ndet_generators+1) = haa +! ! Then diagonalize it +! call lapack_diag(eigenvalues,eigenvectors,H_matrix_tmp,Ndet_generators+1,Ndet_generators+1) +! ! Then you extract the effective denominator +! accu = 0.d0 +! do k = 1, Ndet_generators +! accu += eigenvectors(k,1) * H_array(k) +! enddo +! lambda_i = eigenvectors(Ndet_generators+1,1)/accu +! endif do k=1,idx(0) contrib = H_array(idx(k)) * H_array(idx(k)) * lambda_i delta_ij_generators_(idx(k), idx(k)) += contrib @@ -85,33 +85,6 @@ subroutine standard_dress(delta_ij_generators_,size_buffer,Ndet_generators,i_gen delta_ij_generators_(idx(j), idx(k)) += contrib enddo enddo -! H_matrix_tmp_bis(idx(k),idx(k)) += contrib -! H_matrix_tmp_bis(idx(k),idx(j)) += contrib -! H_matrix_tmp_bis(idx(j),idx(k)) += contrib -! do k = 1, Ndet_generators -! do j = 1, Ndet_generators -! H_matrix_tmp_bis(k,j) = H_matrix_tmp(k,j) -! enddo -! enddo -! double precision :: H_matrix_tmp_bis(Ndet_generators,Ndet_generators) -! double precision :: eigenvectors_bis(Ndet_generators,Ndet_generators), eigenvalues_bis(Ndet_generators) -! call lapack_diag(eigenvalues_bis,eigenvectors_bis,H_matrix_tmp_bis,Ndet_generators,Ndet_generators) -! print*,'f,lambda_i = ',f,lambda_i -! print*,'eigenvalues_bi(1)',eigenvalues_bis(1) -! print*,'eigenvalues ',eigenvalues(1) -! do k = 1, Ndet_generators -! print*,'coef,coef_dres = ', eigenvectors(k,1), eigenvectors_bis(k,1) -! enddo -! pause -! accu = 0.d0 -! do k = 1, Ndet_generators -! do j = 1, Ndet_generators -! accu += eigenvectors(k,1) * eigenvectors(j,1) * (H_matrix_tmp(k,j) + delta_ij_generators_(k,j)) -! enddo -! enddo -! print*,'accu,eigv = ',accu,eigenvalues(1) -! pause - enddo end diff --git a/plugins/FOBOCI/fobo_scf.irp.f b/plugins/FOBOCI/fobo_scf.irp.f new file mode 100644 index 00000000..8656b633 --- /dev/null +++ b/plugins/FOBOCI/fobo_scf.irp.f @@ -0,0 +1,59 @@ +program foboscf + implicit none + call run_prepare + no_oa_or_av_opt = .True. + touch no_oa_or_av_opt + call routine_fobo_scf + call save_mos + +end + +subroutine run_prepare + implicit none + no_oa_or_av_opt = .False. + touch no_oa_or_av_opt + call damping_SCF + call diag_inactive_virt_and_update_mos +end + +subroutine routine_fobo_scf + implicit none + integer :: i,j + print*,'' + print*,'' + character*(64) :: label + label = "Natural" + do i = 1, 5 + print*,'*******************************************************************************' + print*,'*******************************************************************************' + print*,'FOBO-SCF Iteration ',i + print*,'*******************************************************************************' + print*,'*******************************************************************************' + if(speed_up_convergence_foboscf)then + if(i==3)then + threshold_lmct = max(threshold_lmct,0.001) + threshold_mlct = max(threshold_mlct,0.05) + soft_touch threshold_lmct threshold_mlct + endif + if(i==4)then + threshold_lmct = max(threshold_lmct,0.005) + threshold_mlct = max(threshold_mlct,0.07) + soft_touch threshold_lmct threshold_mlct + endif + if(i==5)then + threshold_lmct = max(threshold_lmct,0.01) + threshold_mlct = max(threshold_mlct,0.1) + soft_touch threshold_lmct threshold_mlct + endif + endif + call FOBOCI_lmct_mlct_old_thr + call save_osoci_natural_mos + call damping_SCF + call diag_inactive_virt_and_update_mos + call clear_mo_map + call provide_properties + enddo + + + +end diff --git a/plugins/FOBOCI/foboci_lmct_mlct_threshold_old.irp.f b/plugins/FOBOCI/foboci_lmct_mlct_threshold_old.irp.f index 087f791b..dc6519b8 100644 --- a/plugins/FOBOCI/foboci_lmct_mlct_threshold_old.irp.f +++ b/plugins/FOBOCI/foboci_lmct_mlct_threshold_old.irp.f @@ -9,12 +9,9 @@ subroutine FOBOCI_lmct_mlct_old_thr double precision :: norm_tmp(N_states),norm_total(N_states) logical :: test_sym double precision :: thr,hij - double precision :: threshold double precision, allocatable :: dressing_matrix(:,:) logical :: verbose,is_ok verbose = .True. - threshold = threshold_singles - print*,'threshold = ',threshold thr = 1.d-12 allocate(unpaired_bitmask(N_int,2)) allocate (occ(N_int*bit_kind_size,2)) @@ -36,7 +33,14 @@ subroutine FOBOCI_lmct_mlct_old_thr print*,'' print*,'' print*,'DOING FIRST LMCT !!' + print*,'Threshold_lmct = ',threshold_lmct + integer(bit_kind) , allocatable :: zero_bitmask(:,:) + integer(bit_kind) , allocatable :: psi_singles(:,:,:) + logical :: lmct + double precision, allocatable :: psi_singles_coef(:,:) + allocate( zero_bitmask(N_int,2) ) do i = 1, n_inact_orb + lmct = .True. integer :: i_hole_osoci i_hole_osoci = list_inact(i) print*,'--------------------------' @@ -51,27 +55,91 @@ subroutine FOBOCI_lmct_mlct_old_thr print*,'Passed set generators' call set_bitmask_particl_as_input(reunion_of_bitmask) call set_bitmask_hole_as_input(reunion_of_bitmask) - call is_a_good_candidate(threshold,is_ok,verbose) + call is_a_good_candidate(threshold_lmct,is_ok,verbose) print*,'is_ok = ',is_ok if(.not.is_ok)cycle - ! so all the mono excitation on the new generators allocate(dressing_matrix(N_det_generators,N_det_generators)) + dressing_matrix = 0.d0 if(.not.do_it_perturbative)then -! call all_single - dressing_matrix = 0.d0 + do k = 1, N_det_generators do l = 1, N_det_generators call i_h_j(psi_det_generators(1,1,k),psi_det_generators(1,1,l),N_int,hkl) dressing_matrix(k,l) = hkl enddo enddo - double precision :: hkl -! call all_single_split(psi_det_generators,psi_coef_generators,N_det_generators,dressing_matrix) -! call diag_dressed_matrix_and_set_to_psi_det(psi_det_generators,N_det_generators,dressing_matrix) - call debug_det(reunion_of_bitmask,N_int) + hkl = dressing_matrix(1,1) + do k = 1, N_det_generators + dressing_matrix(k,k) = dressing_matrix(k,k) - hkl + enddo + print*,'Naked matrix' + do k = 1, N_det_generators + write(*,'(100(F12.5,X))')dressing_matrix(k,:) + enddo + + ! Do all the single excitations on top of the CAS and 1h determinants + call set_bitmask_particl_as_input(reunion_of_bitmask) + call set_bitmask_hole_as_input(reunion_of_bitmask) call all_single +! if(dressing_2h2p)then +! call diag_dressed_2h2p_hamiltonian_and_update_psi_det(i_hole_osoci,lmct) +! endif + +! ! Change the mask of the holes and particles to perform all the +! ! double excitations that starts from the active space in order +! ! to introduce the Coulomb hole in the active space +! ! These are the 1h2p excitations that have the i_hole_osoci hole in common +! ! and the 2p if there is more than one electron in the active space +! do k = 1, N_int +! zero_bitmask(k,1) = 0_bit_kind +! zero_bitmask(k,2) = 0_bit_kind +! enddo +! ! hole is possible only in the orbital i_hole_osoci +! call set_bit_to_integer(i_hole_osoci,zero_bitmask(1,1),N_int) +! call set_bit_to_integer(i_hole_osoci,zero_bitmask(1,2),N_int) +! ! and in the active space +! do k = 1, n_act_orb +! call set_bit_to_integer(list_act(k),zero_bitmask(1,1),N_int) +! call set_bit_to_integer(list_act(k),zero_bitmask(1,2),N_int) +! enddo +! call set_bitmask_hole_as_input(zero_bitmask) + +! call set_bitmask_particl_as_input(reunion_of_bitmask) + +! call all_1h2p +! call diagonalize_CI_SC2 +! call provide_matrix_dressing(dressing_matrix,n_det_generators,psi_det_generators) + +! ! Change the mask of the holes and particles to perform all the +! ! double excitations that from the orbital i_hole_osoci +! do k = 1, N_int +! zero_bitmask(k,1) = 0_bit_kind +! zero_bitmask(k,2) = 0_bit_kind +! enddo +! ! hole is possible only in the orbital i_hole_osoci +! call set_bit_to_integer(i_hole_osoci,zero_bitmask(1,1),N_int) +! call set_bit_to_integer(i_hole_osoci,zero_bitmask(1,2),N_int) +! call set_bitmask_hole_as_input(zero_bitmask) + +! call set_bitmask_particl_as_input(reunion_of_bitmask) + +! call set_psi_det_to_generators +! call all_2h2p +! call diagonalize_CI_SC2 + double precision :: hkl + call provide_matrix_dressing(dressing_matrix,n_det_generators,psi_det_generators) + hkl = dressing_matrix(1,1) + do k = 1, N_det_generators + dressing_matrix(k,k) = dressing_matrix(k,k) - hkl + enddo + print*,'Dressed matrix' + do k = 1, N_det_generators + write(*,'(100(F12.5,X))')dressing_matrix(k,:) + enddo +! call diag_dressed_matrix_and_set_to_psi_det(psi_det_generators,N_det_generators,dressing_matrix) endif call set_intermediate_normalization_lmct_old(norm_tmp,i_hole_osoci) + do k = 1, N_states print*,'norm_tmp = ',norm_tmp(k) norm_total(k) += norm_tmp(k) @@ -83,9 +151,12 @@ subroutine FOBOCI_lmct_mlct_old_thr if(.True.)then print*,'' print*,'DOING THEN THE MLCT !!' + print*,'Threshold_mlct = ',threshold_mlct + lmct = .False. do i = 1, n_virt_orb integer :: i_particl_osoci i_particl_osoci = list_virt(i) + print*,'--------------------------' ! First set the current generators to the one of restart call set_generators_to_generators_restart @@ -107,7 +178,7 @@ subroutine FOBOCI_lmct_mlct_old_thr call set_bitmask_particl_as_input(reunion_of_bitmask) call set_bitmask_hole_as_input(reunion_of_bitmask) !! ! so all the mono excitation on the new generators - call is_a_good_candidate(threshold,is_ok,verbose) + call is_a_good_candidate(threshold_mlct,is_ok,verbose) print*,'is_ok = ',is_ok if(.not.is_ok)cycle allocate(dressing_matrix(N_det_generators,N_det_generators)) @@ -122,6 +193,9 @@ subroutine FOBOCI_lmct_mlct_old_thr ! call all_single_split(psi_det_generators,psi_coef_generators,N_det_generators,dressing_matrix) ! call diag_dressed_matrix_and_set_to_psi_det(psi_det_generators,N_det_generators,dressing_matrix) call all_single +! if(dressing_2h2p)then +! call diag_dressed_2h2p_hamiltonian_and_update_psi_det(i_particl_osoci,lmct) +! endif endif call set_intermediate_normalization_mlct_old(norm_tmp,i_particl_osoci) do k = 1, N_states @@ -132,24 +206,6 @@ subroutine FOBOCI_lmct_mlct_old_thr deallocate(dressing_matrix) enddo endif - if(.False.)then - print*,'LAST loop for all the 1h-1p' - print*,'--------------------------' - ! First set the current generators to the one of restart - call set_generators_to_generators_restart - call set_psi_det_to_generators - call initialize_bitmask_to_restart_ones - ! Impose that only the hole i_hole_osoci can be done - call set_bitmask_particl_as_input(inact_virt_bitmask) - call set_bitmask_hole_as_input(inact_virt_bitmask) -! call set_bitmask_particl_as_input(reunion_of_bitmask) -! call set_bitmask_hole_as_input(reunion_of_bitmask) - call all_single - call set_intermediate_normalization_1h1p(norm_tmp) - norm_total += norm_tmp - call update_density_matrix_osoci - endif - print*,'norm_total = ',norm_total norm_total = norm_generators_restart @@ -174,10 +230,8 @@ subroutine FOBOCI_mlct_old double precision :: norm_tmp,norm_total logical :: test_sym double precision :: thr - double precision :: threshold logical :: verbose,is_ok verbose = .False. - threshold = 1.d-2 thr = 1.d-12 allocate(unpaired_bitmask(N_int,2)) allocate (occ(N_int*bit_kind_size,2)) @@ -216,7 +270,7 @@ subroutine FOBOCI_mlct_old call set_bitmask_particl_as_input(reunion_of_bitmask) call set_bitmask_hole_as_input(reunion_of_bitmask) ! ! so all the mono excitation on the new generators - call is_a_good_candidate(threshold,is_ok,verbose) + call is_a_good_candidate(threshold_mlct,is_ok,verbose) print*,'is_ok = ',is_ok is_ok =.True. if(.not.is_ok)cycle @@ -250,10 +304,8 @@ subroutine FOBOCI_lmct_old double precision :: norm_tmp,norm_total logical :: test_sym double precision :: thr - double precision :: threshold logical :: verbose,is_ok verbose = .False. - threshold = 1.d-2 thr = 1.d-12 allocate(unpaired_bitmask(N_int,2)) allocate (occ(N_int*bit_kind_size,2)) @@ -290,7 +342,7 @@ subroutine FOBOCI_lmct_old call set_generators_to_psi_det call set_bitmask_particl_as_input(reunion_of_bitmask) call set_bitmask_hole_as_input(reunion_of_bitmask) - call is_a_good_candidate(threshold,is_ok,verbose) + call is_a_good_candidate(threshold_lmct,is_ok,verbose) print*,'is_ok = ',is_ok if(.not.is_ok)cycle ! ! so all the mono excitation on the new generators diff --git a/plugins/FOBOCI/foboci_reunion.irp.f b/plugins/FOBOCI/foboci_reunion.irp.f new file mode 100644 index 00000000..fcfaff58 --- /dev/null +++ b/plugins/FOBOCI/foboci_reunion.irp.f @@ -0,0 +1,18 @@ +program osoci_program +implicit none + do_it_perturbative = .True. + touch do_it_perturbative + call FOBOCI_lmct_mlct_old_thr + call provide_all_the_rest +end +subroutine provide_all_the_rest +implicit none +integer :: i + call update_one_body_dm_mo + call set_lmct_mlct_to_psi_det + call diagonalize_CI + call save_wavefunction + + +end + diff --git a/plugins/FOBOCI/generators_restart_save.irp.f b/plugins/FOBOCI/generators_restart_save.irp.f index dca4c901..09d4aa2b 100644 --- a/plugins/FOBOCI/generators_restart_save.irp.f +++ b/plugins/FOBOCI/generators_restart_save.irp.f @@ -1,126 +1,74 @@ -use bitmasks +use bitmasks + BEGIN_PROVIDER [ integer, N_det_generators_restart ] implicit none BEGIN_DOC - ! Number of determinants in the wave function + ! Read the wave function END_DOC - logical :: exists - character*64 :: label + integer :: i integer, save :: ifirst = 0 -!if(ifirst == 0)then - PROVIDE ezfio_filename - call ezfio_has_determinants_n_det(exists) - print*,'exists = ',exists - if(.not.exists)then - print*,'The OSOCI needs a restart WF' - print*,'There are none in the EZFIO file ...' - print*,'Stopping ...' - stop - endif - print*,'passed N_det_generators_restart' - call ezfio_get_determinants_n_det(N_det_generators_restart) - ASSERT (N_det_generators_restart > 0) + double precision :: norm + if(ifirst == 0)then + call ezfio_get_determinants_n_det(N_det_generators_restart) ifirst = 1 -!endif + else + print*,'PB in generators_restart restart !!!' + endif + call write_int(output_determinants,N_det_generators_restart,'Number of generators_restart') END_PROVIDER - BEGIN_PROVIDER [ integer(bit_kind), psi_det_generators_restart, (N_int,2,psi_det_size) ] + BEGIN_PROVIDER [ integer(bit_kind), psi_det_generators_restart, (N_int,2,N_det_generators_restart) ] &BEGIN_PROVIDER [ integer(bit_kind), ref_generators_restart, (N_int,2) ] +&BEGIN_PROVIDER [ double precision, psi_coef_generators_restart, (N_det_generators_restart,N_states) ] implicit none BEGIN_DOC - ! The wave function determinants. Initialized with Hartree-Fock if the EZFIO file - ! is empty + ! read wf + ! END_DOC - integer :: i - logical :: exists - character*64 :: label - + integer :: i, k integer, save :: ifirst = 0 -!if(ifirst == 0)then - provide N_det_generators_restart - if(.True.)then - call ezfio_has_determinants_N_int(exists) - if (exists) then - call ezfio_has_determinants_bit_kind(exists) - if (exists) then - call ezfio_has_determinants_N_det(exists) - if (exists) then - call ezfio_has_determinants_N_states(exists) - if (exists) then - call ezfio_has_determinants_psi_det(exists) - endif - endif - endif - endif - - if(.not.exists)then - print*,'The OSOCI needs a restart WF' - print*,'There are none in the EZFIO file ...' - print*,'Stopping ...' - stop - endif - print*,'passed psi_det_generators_restart' - - call read_dets(psi_det_generators_restart,N_int,N_det_generators_restart) - do i = 1, N_int - ref_generators_restart(i,1) = psi_det_generators_restart(i,1,1) - ref_generators_restart(i,2) = psi_det_generators_restart(i,2,1) - enddo - endif + double precision, allocatable :: psi_coef_read(:,:) + if(ifirst == 0)then + call read_dets(psi_det_generators_restart,N_int,N_det_generators_restart) + do k = 1, N_int + ref_generators_restart(k,1) = psi_det_generators_restart(k,1,1) + ref_generators_restart(k,2) = psi_det_generators_restart(k,2,1) + enddo + allocate (psi_coef_read(N_det_generators_restart,N_states)) + call ezfio_get_determinants_psi_coef(psi_coef_read) + do k = 1, N_states + do i = 1, N_det_generators_restart + psi_coef_generators_restart(i,k) = psi_coef_read(i,k) + enddo + enddo ifirst = 1 -!endif + deallocate(psi_coef_read) + else + print*,'PB in generators_restart restart !!!' + endif END_PROVIDER - - -BEGIN_PROVIDER [ double precision, psi_coef_generators_restart, (psi_det_size,N_states_diag) ] - implicit none - BEGIN_DOC - ! The wave function coefficients. Initialized with Hartree-Fock if the EZFIO file - ! is empty - END_DOC - - integer :: i,k, N_int2 - logical :: exists - double precision, allocatable :: psi_coef_read(:,:) - character*(64) :: label - - integer, save :: ifirst = 0 -!if(ifirst == 0)then - psi_coef_generators_restart = 0.d0 - do i=1,N_states_diag - psi_coef_generators_restart(i,i) = 1.d0 - enddo - - call ezfio_has_determinants_psi_coef(exists) - - if(.not.exists)then - print*,'The OSOCI needs a restart WF' - print*,'There are none in the EZFIO file ...' - print*,'Stopping ...' - stop - endif - print*,'passed psi_coef_generators_restart' - - if (exists) then - - allocate (psi_coef_read(N_det_generators_restart,N_states)) - call ezfio_get_determinants_psi_coef(psi_coef_read) - do k=1,N_states - do i=1,N_det_generators_restart - psi_coef_generators_restart(i,k) = psi_coef_read(i,k) - enddo - enddo - deallocate(psi_coef_read) - - endif - ifirst = 1 -!endif - - - +BEGIN_PROVIDER [ integer, size_select_max] + implicit none + BEGIN_DOC + ! Size of the select_max array + END_DOC + size_select_max = 10000 END_PROVIDER +BEGIN_PROVIDER [ double precision, select_max, (size_select_max) ] + implicit none + BEGIN_DOC + ! Memo to skip useless selectors + END_DOC + select_max = huge(1.d0) +END_PROVIDER + + BEGIN_PROVIDER [ integer, N_det_generators ] +&BEGIN_PROVIDER [ integer(bit_kind), psi_det_generators, (N_int,2,10000) ] +&BEGIN_PROVIDER [ double precision, psi_coef_generators, (10000,N_states) ] + +END_PROVIDER diff --git a/plugins/FOBOCI/hcc_1h1p.irp.f b/plugins/FOBOCI/hcc_1h1p.irp.f new file mode 100644 index 00000000..66cf2fd4 --- /dev/null +++ b/plugins/FOBOCI/hcc_1h1p.irp.f @@ -0,0 +1,83 @@ +program test_sc2 + implicit none + read_wf = .True. + touch read_wf + call routine + + +end + +subroutine routine + implicit none + double precision, allocatable :: energies(:),diag_H_elements(:) + double precision, allocatable :: H_matrix(:,:) + allocate(energies(N_states),diag_H_elements(N_det)) + call diagonalize_CI + call test_hcc + call test_mulliken +! call SC2_1h1p(psi_det,psi_coef,energies, & +! diag_H_elements,size(psi_coef,1),N_det,N_states_diag,N_int,threshold_convergence_SC2) + allocate(H_matrix(N_det,N_det)) + call SC2_1h1p_full(psi_det,psi_coef,energies, & + H_matrix,size(psi_coef,1),N_det,N_states_diag,N_int,threshold_convergence_SC2) + deallocate(H_matrix) + integer :: i,j + double precision :: accu,coef_hf +! coef_hf = 1.d0/psi_coef(1,1) +! do i = 1, N_det +! psi_coef(i,1) *= coef_hf +! enddo + touch psi_coef + call pouet +end + +subroutine pouet + implicit none + double precision :: accu,coef_hf +! provide one_body_dm_mo_alpha one_body_dm_mo_beta +! call density_matrix_1h1p(psi_det,psi_coef,one_body_dm_mo_alpha,one_body_dm_mo_beta,accu,size(psi_coef,1),N_det,N_states_diag,N_int) +! touch one_body_dm_mo_alpha one_body_dm_mo_beta + call test_hcc + call test_mulliken +! call save_wavefunction + +end + +subroutine test_hcc + implicit none + double precision :: accu + integer :: i,j + print*,'Z AU GAUSS MHZ cm^-1' + do i = 1, nucl_num + write(*,'(I2,X,F3.1,X,4(F16.6,X))')i,nucl_charge(i),spin_density_at_nucleous(i),iso_hcc_gauss(i),iso_hcc_mhz(i),iso_hcc_cm_1(i) + enddo + +end + +subroutine test_mulliken + double precision :: accu + integer :: i + integer :: j + accu= 0.d0 + do i = 1, nucl_num + print*,i,nucl_charge(i),mulliken_spin_densities(i) + accu += mulliken_spin_densities(i) + enddo + print*,'Sum of Mulliken SD = ',accu +!print*,'AO SPIN POPULATIONS' + accu = 0.d0 +!do i = 1, ao_num +! accu += spin_gross_orbital_product(i) +! write(*,'(X,I3,X,A4,X,I2,X,A4,X,F10.7)')i,trim(element_name(int(nucl_charge(ao_nucl(i))))),ao_nucl(i),trim(l_to_charater(ao_l(i))),spin_gross_orbital_product(i) +!enddo +!print*,'sum = ',accu +!accu = 0.d0 +!print*,'Angular momentum analysis' +!do i = 0, ao_l_max +! accu += spin_population_angular_momentum(i) +! print*,' ',trim(l_to_charater(i)),spin_population_angular_momentum(i) +!print*,'sum = ',accu +!enddo + +end + diff --git a/plugins/FOBOCI/modify_generators.irp.f b/plugins/FOBOCI/modify_generators.irp.f index c756f0c2..359b6405 100644 --- a/plugins/FOBOCI/modify_generators.irp.f +++ b/plugins/FOBOCI/modify_generators.irp.f @@ -6,6 +6,7 @@ subroutine set_generators_to_psi_det END_DOC N_det_generators = N_det integer :: i,k + print*,'N_det = ',N_det do i=1,N_det_generators do k=1,N_int psi_det_generators(k,1,i) = psi_det(k,1,i) diff --git a/plugins/FOBOCI/new_approach.irp.f b/plugins/FOBOCI/new_approach.irp.f index 49dcafc3..8e2f2e53 100644 --- a/plugins/FOBOCI/new_approach.irp.f +++ b/plugins/FOBOCI/new_approach.irp.f @@ -24,6 +24,7 @@ subroutine new_approach double precision, allocatable :: dressing_matrix_1h1p(:,:) double precision, allocatable :: dressing_matrix_2h1p(:,:) double precision, allocatable :: dressing_matrix_1h2p(:,:) + double precision, allocatable :: dressing_matrix_extra_1h_or_1p(:,:) double precision, allocatable :: H_matrix_tmp(:,:) logical :: verbose,is_ok @@ -45,7 +46,7 @@ subroutine new_approach verbose = .True. - threshold = threshold_singles + threshold = threshold_lmct print*,'threshold = ',threshold thr = 1.d-12 print*,'' @@ -81,12 +82,14 @@ subroutine new_approach ! so all the mono excitation on the new generators allocate(dressing_matrix_1h1p(N_det_generators,N_det_generators)) allocate(dressing_matrix_2h1p(N_det_generators,N_det_generators)) + allocate(dressing_matrix_extra_1h_or_1p(N_det_generators,N_det_generators)) dressing_matrix_1h1p = 0.d0 dressing_matrix_2h1p = 0.d0 + dressing_matrix_extra_1h_or_1p = 0.d0 if(.not.do_it_perturbative)then n_good_hole +=1 ! call all_single_split_for_1h(dressing_matrix_1h1p,dressing_matrix_2h1p) - call all_single_for_1h(dressing_matrix_1h1p,dressing_matrix_2h1p) + call all_single_for_1h(i_hole_foboci,dressing_matrix_1h1p,dressing_matrix_2h1p,dressing_matrix_extra_1h_or_1p) allocate(H_matrix_tmp(N_det_generators,N_det_generators)) do j = 1,N_det_generators do k = 1, N_det_generators @@ -96,7 +99,7 @@ subroutine new_approach enddo do j = 1, N_det_generators do k = 1, N_det_generators - H_matrix_tmp(j,k) += dressing_matrix_1h1p(j,k) + dressing_matrix_2h1p(j,k) + H_matrix_tmp(j,k) += dressing_matrix_1h1p(j,k) + dressing_matrix_2h1p(j,k) + dressing_matrix_extra_1h_or_1p(j,k) enddo enddo hjk = H_matrix_tmp(1,1) @@ -130,6 +133,7 @@ subroutine new_approach endif deallocate(dressing_matrix_1h1p) deallocate(dressing_matrix_2h1p) + deallocate(dressing_matrix_extra_1h_or_1p) enddo print*,'' @@ -155,12 +159,14 @@ subroutine new_approach ! so all the mono excitation on the new generators allocate(dressing_matrix_1h1p(N_det_generators,N_det_generators)) allocate(dressing_matrix_1h2p(N_det_generators,N_det_generators)) + allocate(dressing_matrix_extra_1h_or_1p(N_det_generators,N_det_generators)) dressing_matrix_1h1p = 0.d0 dressing_matrix_1h2p = 0.d0 + dressing_matrix_extra_1h_or_1p = 0.d0 if(.not.do_it_perturbative)then n_good_hole +=1 ! call all_single_split_for_1p(dressing_matrix_1h1p,dressing_matrix_1h2p) - call all_single_for_1p(dressing_matrix_1h1p,dressing_matrix_1h2p) + call all_single_for_1p(i_particl_osoci,dressing_matrix_1h1p,dressing_matrix_1h2p,dressing_matrix_extra_1h_or_1p) allocate(H_matrix_tmp(N_det_generators,N_det_generators)) do j = 1,N_det_generators do k = 1, N_det_generators @@ -170,7 +176,7 @@ subroutine new_approach enddo do j = 1, N_det_generators do k = 1, N_det_generators - H_matrix_tmp(j,k) += dressing_matrix_1h1p(j,k) + dressing_matrix_1h2p(j,k) + H_matrix_tmp(j,k) += dressing_matrix_1h1p(j,k) + dressing_matrix_1h2p(j,k) + dressing_matrix_extra_1h_or_1p(j,k) enddo enddo hjk = H_matrix_tmp(1,1) @@ -205,7 +211,10 @@ subroutine new_approach endif deallocate(dressing_matrix_1h1p) deallocate(dressing_matrix_1h2p) + deallocate(dressing_matrix_extra_1h_or_1p) enddo + + double precision, allocatable :: H_matrix_total(:,:) integer :: n_det_total n_det_total = N_det_generators_restart + n_good_det @@ -221,7 +230,7 @@ subroutine new_approach !!! Adding the averaged dressing coming from the 1h1p that are redundant for each of the "n_good_hole" 1h H_matrix_total(i,j) += dressing_matrix_restart_1h1p(i,j)/dble(n_good_hole+n_good_particl) !!! Adding the dressing coming from the 2h1p that are not redundant for the any of CI calculations - H_matrix_total(i,j) += dressing_matrix_restart_2h1p(i,j) + H_matrix_total(i,j) += dressing_matrix_restart_2h1p(i,j) + dressing_matrix_restart_1h2p(i,j) enddo enddo do i = 1, n_good_det @@ -244,25 +253,79 @@ subroutine new_approach H_matrix_total(n_det_generators_restart+j,n_det_generators_restart+i) = hij enddo enddo - print*,'H matrix to diagonalize' - double precision :: href - href = H_matrix_total(1,1) - do i = 1, n_det_total - H_matrix_total(i,i) -= href + + ! Adding the correlation energy + logical :: orb_taken_good_det(mo_tot_num) + double precision :: phase + integer :: n_h,n_p,number_of_holes,number_of_particles + integer :: exc(0:2,2,2) + integer :: degree + integer :: h1,h2,p1,p2,s1,s2 + logical, allocatable :: one_hole_or_one_p(:) + integer, allocatable :: holes_or_particle(:) + allocate(one_hole_or_one_p(n_good_det), holes_or_particle(n_good_det)) + orb_taken_good_det = .False. + do i = 1, n_good_det + n_h = number_of_holes(psi_good_det(1,1,i)) + n_p = number_of_particles(psi_good_det(1,1,i)) + call get_excitation(ref_bitmask,psi_good_det(1,1,i),exc,degree,phase,N_int) + call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) + if(n_h == 0 .and. n_p == 1)then + orb_taken_good_det(h1) = .True. + one_hole_or_one_p(i) = .True. + holes_or_particle(i) = h1 + endif + if(n_h == 1 .and. n_p == 0)then + orb_taken_good_det(p1) = .True. + one_hole_or_one_p(i) = .False. + holes_or_particle(i) = p1 + endif enddo - do i = 1, n_det_total - write(*,'(100(X,F16.8))')H_matrix_total(i,:) - enddo - double precision, allocatable :: eigvalues(:),eigvectors(:,:) - allocate(eigvalues(n_det_total),eigvectors(n_det_total,n_det_total)) - call lapack_diag(eigvalues,eigvectors,H_matrix_total,n_det_total,n_det_total) - print*,'e_dressed = ',eigvalues(1) + nuclear_repulsion + href - do i = 1, n_det_total - print*,'coef = ',eigvectors(i,1) - enddo - integer(bit_kind), allocatable :: psi_det_final(:,:,:) - double precision, allocatable :: psi_coef_final(:,:) - double precision :: norm + + do i = 1, N_det_generators_restart + ! Add the 2h2p, 2h1p and 1h2p correlation energy + H_matrix_total(i,i) += total_corr_e_2h2p + total_corr_e_2h1p + total_corr_e_1h2p + total_corr_e_1h1p_spin_flip + ! Substract the 2h1p part that have already been taken into account + do j = 1, n_inact_orb + iorb = list_inact(j) + if(.not.orb_taken_good_det(iorb))cycle + H_matrix_total(i,i) -= corr_energy_2h1p_per_orb_ab(iorb) - corr_energy_2h1p_per_orb_bb(iorb) - corr_energy_1h1p_spin_flip_per_orb(iorb) + enddo + ! Substract the 1h2p part that have already been taken into account + do j = 1, n_virt_orb + iorb = list_virt(j) + if(.not.orb_taken_good_det(iorb))cycle + H_matrix_total(i,i) -= corr_energy_1h2p_per_orb_ab(iorb) - corr_energy_1h2p_per_orb_aa(iorb) + enddo + enddo + + do i = 1, N_good_det + ! Repeat the 2h2p correlation energy + H_matrix_total(N_det_generators_restart+i,N_det_generators_restart+i) += total_corr_e_2h2p + ! Substract the part that can not be repeated + ! If it is a 1h + if(one_hole_or_one_p(i))then + ! 2h2p + H_matrix_total(N_det_generators_restart+i,N_det_generators_restart+i) += -corr_energy_2h2p_per_orb_ab(holes_or_particle(i)) & + -corr_energy_2h2p_per_orb_bb(holes_or_particle(i)) + ! You can repeat a certain part of the 1h2p correlation energy + ! that is everything except the part that involves the hole of the 1h + H_matrix_total(N_det_generators_restart+i,N_det_generators_restart+i) += total_corr_e_1h2p + H_matrix_total(N_det_generators_restart+i,N_det_generators_restart+i) += -corr_energy_1h2p_per_orb_ab(holes_or_particle(i)) & + -corr_energy_1h2p_per_orb_bb(holes_or_particle(i)) + + else + ! 2h2p + H_matrix_total(N_det_generators_restart+i,N_det_generators_restart+i) += -corr_energy_2h2p_per_orb_ab(holes_or_particle(i)) & + -corr_energy_2h2p_per_orb_aa(holes_or_particle(i)) + ! You can repeat a certain part of the 2h1p correlation energy + ! that is everything except the part that involves the hole of the 1p + ! 2h1p + H_matrix_total(N_det_generators_restart+i,N_det_generators_restart+i) += -corr_energy_2h1p_per_orb_ab(holes_or_particle(i)) & + -corr_energy_2h1p_per_orb_aa(holes_or_particle(i)) + endif + enddo + allocate(psi_coef_final(n_det_total, N_states)) allocate(psi_det_final(N_int,2,n_det_total)) do i = 1, N_det_generators_restart @@ -277,22 +340,222 @@ subroutine new_approach psi_det_final(j,2,n_det_generators_restart+i) = psi_good_det(j,2,i) enddo enddo - norm = 0.d0 + + + double precision :: href + double precision, allocatable :: eigvalues(:),eigvectors(:,:) + integer(bit_kind), allocatable :: psi_det_final(:,:,:) + double precision, allocatable :: psi_coef_final(:,:) + double precision :: norm + allocate(eigvalues(n_det_total),eigvectors(n_det_total,n_det_total)) + + call lapack_diag(eigvalues,eigvectors,H_matrix_total,n_det_total,n_det_total) + print*,'' + print*,'' + print*,'H_matrix_total(1,1) = ',H_matrix_total(1,1) + print*,'e_dressed = ',eigvalues(1) + nuclear_repulsion do i = 1, n_det_total - do j = 1, N_states - psi_coef_final(i,j) = eigvectors(i,j) - enddo - norm += psi_coef_final(i,1)**2 -! call debug_det(psi_det_final(1, 1, i), N_int) + print*,'coef = ',eigvectors(i,1),H_matrix_total(i,i) - H_matrix_total(1,1) enddo - print*,'norm = ',norm + + integer(bit_kind), allocatable :: psi_det_remaining_1h_or_1p(:,:,:) + integer(bit_kind), allocatable :: key_tmp(:,:) + integer :: n_det_remaining_1h_or_1p + integer :: ispin,i_ok + allocate(key_tmp(N_int,2),psi_det_remaining_1h_or_1p(N_int,2,n_inact_orb*n_act_orb+n_virt_orb*n_act_orb)) + logical :: is_already_present + logical, allocatable :: one_hole_or_one_p_bis(:) + integer, allocatable :: holes_or_particle_bis(:) + double precision,allocatable :: H_array(:) + allocate(one_hole_or_one_p_bis(n_inact_orb*n_act_orb+n_virt_orb*n_act_orb), holes_or_particle_bis(n_inact_orb*n_act_orb+n_virt_orb*n_act_orb)) + allocate(H_array(n_det_total)) + ! Dressing with the remaining 1h determinants + print*,'' + print*,'' + print*,'Dressing with the remaining 1h determinants' + n_det_remaining_1h_or_1p = 0 + do i = 1, n_inact_orb + iorb = list_inact(i) + if(orb_taken_good_det(iorb))cycle + do j = 1, n_act_orb + jorb = list_act(j) + ispin = 2 + key_tmp = ref_bitmask + call do_mono_excitation(key_tmp,iorb,jorb,ispin,i_ok) + if(i_ok .ne.1)cycle + is_already_present = .False. + H_array = 0.d0 + call i_h_j(key_tmp,key_tmp,N_int,hij) + href = ref_bitmask_energy - hij + href = 1.d0/href + do k = 1, n_det_total + call get_excitation_degree(psi_det_final(1,1,k),key_tmp,degree,N_int) + if(degree == 0)then + is_already_present = .True. + exit + endif + enddo + if(is_already_present)cycle + n_det_remaining_1h_or_1p +=1 + one_hole_or_one_p_bis(n_det_remaining_1h_or_1p) = .True. + holes_or_particle_bis(n_det_remaining_1h_or_1p) = iorb + do k = 1, N_int + psi_det_remaining_1h_or_1p(k,1,n_det_remaining_1h_or_1p) = key_tmp(k,1) + psi_det_remaining_1h_or_1p(k,2,n_det_remaining_1h_or_1p) = key_tmp(k,2) + enddo + ! do k = 1, n_det_total + ! call i_h_j(psi_det_final(1,1,k),key_tmp,N_int,hij) + ! H_array(k) = hij + ! enddo + ! do k = 1, n_det_total + ! do l = 1, n_det_total + ! H_matrix_total(k,l) += H_array(k) * H_array(l) * href + ! enddo + ! enddo + enddo + enddo + ! Dressing with the remaining 1p determinants + print*,'n_det_remaining_1h_or_1p = ',n_det_remaining_1h_or_1p + print*,'Dressing with the remaining 1p determinants' + do i = 1, n_virt_orb + iorb = list_virt(i) + if(orb_taken_good_det(iorb))cycle + do j = 1, n_act_orb + jorb = list_act(j) + ispin = 1 + key_tmp = ref_bitmask + call do_mono_excitation(key_tmp,jorb,iorb,ispin,i_ok) + if(i_ok .ne.1)cycle + is_already_present = .False. + H_array = 0.d0 + call i_h_j(key_tmp,key_tmp,N_int,hij) + href = ref_bitmask_energy - hij + href = 1.d0/href + do k = 1, n_det_total + call get_excitation_degree(psi_det_final(1,1,k),key_tmp,degree,N_int) + if(degree == 0)then + is_already_present = .True. + exit + endif + enddo + if(is_already_present)cycle + n_det_remaining_1h_or_1p +=1 + one_hole_or_one_p_bis(n_det_remaining_1h_or_1p) = .False. + holes_or_particle_bis(n_det_remaining_1h_or_1p) = iorb + do k = 1, N_int + psi_det_remaining_1h_or_1p(k,1,n_det_remaining_1h_or_1p) = key_tmp(k,1) + psi_det_remaining_1h_or_1p(k,2,n_det_remaining_1h_or_1p) = key_tmp(k,2) + enddo +! do k = 1, n_det_total +! call i_h_j(psi_det_final(1,1,k),key_tmp,N_int,hij) +! H_array(k) = hij +! enddo +! do k = 1, n_det_total +! do l = 1, n_det_total +! H_matrix_total(k,l) += H_array(k) * H_array(l) * href +! enddo +! enddo + enddo + enddo + print*,'n_det_remaining_1h_or_1p = ',n_det_remaining_1h_or_1p + deallocate(key_tmp,H_array) + + double precision, allocatable :: eigvalues_bis(:),eigvectors_bis(:,:),H_matrix_total_bis(:,:) + integer :: n_det_final + n_det_final = n_det_total + n_det_remaining_1h_or_1p + allocate(eigvalues_bis(n_det_final),eigvectors_bis(n_det_final,n_det_final),H_matrix_total_bis(n_det_final,n_det_final)) + print*,'passed the allocate, building the big matrix' + do i = 1, n_det_total + do j = 1, n_det_total + H_matrix_total_bis(i,j) = H_matrix_total(i,j) + enddo + enddo + do i = 1, n_det_remaining_1h_or_1p + do j = 1, n_det_remaining_1h_or_1p + call i_h_j(psi_det_remaining_1h_or_1p(1,1,i),psi_det_remaining_1h_or_1p(1,1,j),N_int,hij) + H_matrix_total_bis(n_det_total+i,n_det_total+j) = hij + enddo + enddo + do i = 1, n_det_total + do j = 1, n_det_remaining_1h_or_1p + call i_h_j(psi_det_final(1,1,i),psi_det_remaining_1h_or_1p(1,1,j),N_int,hij) + H_matrix_total_bis(i,n_det_total+j) = hij + H_matrix_total_bis(n_det_total+j,i) = hij + enddo + enddo + print*,'passed the matrix' + do i = 1, n_det_remaining_1h_or_1p + if(one_hole_or_one_p_bis(i))then + H_matrix_total_bis(n_det_total+i,n_det_total+i) += total_corr_e_2h2p -corr_energy_2h2p_per_orb_ab(holes_or_particle_bis(i)) & + -corr_energy_2h2p_per_orb_bb(holes_or_particle_bis(i)) + H_matrix_total_bis(n_det_total+i,n_det_total+i) += total_corr_e_1h2p -corr_energy_1h2p_per_orb_ab(holes_or_particle_bis(i)) & + -corr_energy_1h2p_per_orb_bb(holes_or_particle_bis(i)) + else + H_matrix_total_bis(n_det_total+i,n_det_total+i) += total_corr_e_2h2p -corr_energy_2h2p_per_orb_ab(holes_or_particle_bis(i)) & + -corr_energy_2h2p_per_orb_aa(holes_or_particle_bis(i)) + H_matrix_total_bis(n_det_total+i,n_det_total+i) += total_corr_e_1h2p -corr_energy_2h1p_per_orb_ab(holes_or_particle_bis(i)) & + -corr_energy_2h1p_per_orb_aa(holes_or_particle_bis(i)) + + endif + enddo + do i = 2, n_det_final + do j = i+1, n_det_final + H_matrix_total_bis(i,j) = 0.d0 + H_matrix_total_bis(j,i) = 0.d0 + enddo + enddo + do i = 1, n_det_final + write(*,'(500(F10.5,X))')H_matrix_total_bis(i,:) + enddo + call lapack_diag(eigvalues_bis,eigvectors_bis,H_matrix_total_bis,n_det_final,n_det_final) + print*,'e_dressed = ',eigvalues_bis(1) + nuclear_repulsion + do i = 1, n_det_final + print*,'coef = ',eigvectors_bis(i,1),H_matrix_total_bis(i,i) - H_matrix_total_bis(1,1) + enddo + do j = 1, N_states + do i = 1, n_det_total + psi_coef_final(i,j) = eigvectors_bis(i,j) + norm += psi_coef_final(i,j)**2 + enddo + norm = 1.d0/dsqrt(norm) + do i = 1, n_det_total + psi_coef_final(i,j) = psi_coef_final(i,j) * norm + enddo + enddo + + + deallocate(eigvalues_bis,eigvectors_bis,H_matrix_total_bis) + + +!print*,'H matrix to diagonalize' +!href = H_matrix_total(1,1) +!do i = 1, n_det_total +! H_matrix_total(i,i) -= href +!enddo +!do i = 1, n_det_total +! write(*,'(100(X,F16.8))')H_matrix_total(i,:) +!enddo +!call lapack_diag(eigvalues,eigvectors,H_matrix_total,n_det_total,n_det_total) +!print*,'H_matrix_total(1,1) = ',H_matrix_total(1,1) +!print*,'e_dressed = ',eigvalues(1) + nuclear_repulsion +!do i = 1, n_det_total +! print*,'coef = ',eigvectors(i,1),H_matrix_total(i,i) - H_matrix_total(1,1) +!enddo +!norm = 0.d0 +!do i = 1, n_det_total +! do j = 1, N_states +! psi_coef_final(i,j) = eigvectors(i,j) +! enddo +! norm += psi_coef_final(i,1)**2 +!enddo +!print*,'norm = ',norm call set_psi_det_as_input_psi(n_det_total,psi_det_final,psi_coef_final) - print*,'' -!do i = 1, N_det -! call debug_det(psi_det(1,1,i),N_int) -! print*,'coef = ',psi_coef(i,1) -!enddo + + do i = 1, N_det + call debug_det(psi_det(1,1,i),N_int) + print*,'coef = ',psi_coef(i,1) + enddo provide one_body_dm_mo integer :: i_core,iorb,jorb,i_inact,j_inact,i_virt,j_virt,j_core @@ -360,14 +623,14 @@ subroutine new_approach print*,'ACTIVE ORBITAL ',iorb do j = 1, n_inact_orb jorb = list_inact(j) - if(dabs(one_body_dm_mo(iorb,jorb)).gt.threshold_singles)then + if(dabs(one_body_dm_mo(iorb,jorb)).gt.threshold_lmct)then print*,'INACTIVE ' print*,'DM ',iorb,jorb,dabs(one_body_dm_mo(iorb,jorb)) endif enddo do j = 1, n_virt_orb jorb = list_virt(j) - if(dabs(one_body_dm_mo(iorb,jorb)).gt.threshold_singles)then + if(dabs(one_body_dm_mo(iorb,jorb)).gt.threshold_mlct)then print*,'VIRT ' print*,'DM ',iorb,jorb,dabs(one_body_dm_mo(iorb,jorb)) endif diff --git a/plugins/FOBOCI/new_new_approach.irp.f b/plugins/FOBOCI/new_new_approach.irp.f new file mode 100644 index 00000000..b904a5b3 --- /dev/null +++ b/plugins/FOBOCI/new_new_approach.irp.f @@ -0,0 +1,132 @@ +program test_new_new + implicit none + read_wf = .True. + touch read_wf + call test +end + + +subroutine test + implicit none + integer :: i,j,k,l + call diagonalize_CI + call set_generators_to_psi_det + print*,'Initial coefficients' + do i = 1, N_det + print*,'' + call debug_det(psi_det(1,1,i),N_int) + print*,'psi_coef = ',psi_coef(i,1) + print*,'' + enddo + double precision, allocatable :: dressing_matrix(:,:) + double precision :: hij + double precision :: phase + integer :: n_h,n_p,number_of_holes,number_of_particles + integer :: exc(0:2,2,2) + integer :: degree + integer :: h1,h2,p1,p2,s1,s2 + allocate(dressing_matrix(N_det_generators,N_det_generators)) + do i = 1, N_det_generators + do j = 1, N_det_generators + call i_h_j(psi_det_generators(1,1,i),psi_det_generators(1,1,j),N_int,hij) + dressing_matrix(i,j) = hij + enddo + enddo + href = dressing_matrix(1,1) + print*,'Diagonal part of the dressing' + do i = 1, N_det_generators + print*,'delta e = ',dressing_matrix(i,i) - href + enddo + call all_single_split(psi_det_generators,psi_coef_generators,N_det_generators,dressing_matrix) + double precision :: href + print*,'' + ! One considers that the following excitation classes are not repeatable on the 1h and 1p determinants : + ! + 1h1p spin flip + ! + 2h1p + ! + 1h2p + ! But the 2h2p are correctly taken into account +!dressing_matrix(1,1) += total_corr_e_1h2p + total_corr_e_2h1p + total_corr_e_1h1p_spin_flip +!do i = 1, N_det_generators +! dressing_matrix(i,i) += total_corr_e_2h2p +! n_h = number_of_holes(psi_det(1,1,i)) +! n_p = number_of_particles(psi_det(1,1,i)) +! if(n_h == 1 .and. n_p ==0)then +! +! call get_excitation(ref_bitmask,psi_det_generators(1,1,i),exc,degree,phase,N_int) +! call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) +! print*,'' +! print*,' 1h det ' +! print*,'' +! call debug_det(psi_det_generators(1,1,i),N_int) +! print*,'h1,p1 = ',h1,p1 +! print*,'total_corr_e_2h2p ',total_corr_e_2h2p +! print*,'corr_energy_2h2p_per_orb_ab(h1)',corr_energy_2h2p_per_orb_ab(h1) +! print*,'corr_energy_2h2p_per_orb_bb(h1)',corr_energy_2h2p_per_orb_bb(h1) +! dressing_matrix(i,i) += -corr_energy_2h2p_per_orb_ab(h1) - corr_energy_2h2p_per_orb_bb(h1) +! dressing_matrix(1,1) += -corr_energy_2h1p_per_orb_aa(h1) - corr_energy_2h1p_per_orb_ab(h1) -corr_energy_2h1p_per_orb_bb(h1) & +! -corr_energy_1h1p_spin_flip_per_orb(h1) +! endif +! if(n_h == 0 .and. n_p ==1)then +! call get_excitation(ref_bitmask,psi_det_generators(1,1,i),exc,degree,phase,N_int) +! call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) +! print*,'' +! print*,' 1p det ' +! print*,'' +! call debug_det(psi_det_generators(1,1,i),N_int) +! print*,'h1,p1 = ',h1,p1 +! print*,'total_corr_e_2h2p ',total_corr_e_2h2p +! print*,'corr_energy_2h2p_per_orb_ab(p1)',corr_energy_2h2p_per_orb_ab(p1) +! print*,'corr_energy_2h2p_per_orb_aa(p1)',corr_energy_2h2p_per_orb_aa(p1) +! dressing_matrix(i,i) += -corr_energy_2h2p_per_orb_ab(p1) - corr_energy_2h2p_per_orb_aa(p1) +! dressing_matrix(1,1) += -corr_energy_1h2p_per_orb_aa(p1) - corr_energy_1h2p_per_orb_ab(p1) -corr_energy_1h2p_per_orb_bb(p1) +! endif +!enddo +!href = dressing_matrix(1,1) +!print*,'Diagonal part of the dressing' +!do i = 1, N_det_generators +! print*,'delta e = ',dressing_matrix(i,i) - href +!enddo + call diag_dressed_matrix_and_set_to_psi_det(psi_det_generators,N_det_generators,dressing_matrix) + print*,'After dressing matrix' + print*,'' + print*,'' + do i = 1, N_det + print*,'psi_coef = ',psi_coef(i,1) + enddo +!print*,'' +!print*,'' +!print*,'Canceling the dressing part of the interaction between 1h and 1p' +!do i = 2, N_det_generators +! do j = i+1, N_det_generators +! call i_h_j(psi_det_generators(1,1,i),psi_det_generators(1,1,j),N_int,hij) +! dressing_matrix(i,j) = hij +! dressing_matrix(j,i) = hij +! enddo +!enddo +!call diag_dressed_matrix_and_set_to_psi_det(psi_det_generators,N_det_generators,dressing_matrix) +!print*,'' +!print*,'' +!do i = 1, N_det +! print*,'psi_coef = ',psi_coef(i,1) +!enddo +!print*,'' +!print*,'' +!print*,'Canceling the interaction between 1h and 1p' + +!print*,'' +!print*,'' +!do i = 2, N_det_generators +! do j = i+1, N_det_generators +! dressing_matrix(i,j) = 0.d0 +! dressing_matrix(j,i) = 0.d0 +! enddo +!enddo +!call diag_dressed_matrix_and_set_to_psi_det(psi_det_generators,N_det_generators,dressing_matrix) +!do i = 1, N_det +! print*,'psi_coef = ',psi_coef(i,1) +!enddo + call save_natural_mos + deallocate(dressing_matrix) + + +end diff --git a/plugins/FOBOCI/routines_dressing.irp.f b/plugins/FOBOCI/routines_dressing.irp.f index 910f1109..125143da 100644 --- a/plugins/FOBOCI/routines_dressing.irp.f +++ b/plugins/FOBOCI/routines_dressing.irp.f @@ -55,15 +55,11 @@ subroutine provide_matrix_dressing(dressing_matrix,ndet_generators_input,psi_det i_pert = 0 endif do j = 1, ndet_generators_input - if(dabs(H_array(j)*lambda_i).gt.0.5d0)then + if(dabs(H_array(j)*lambda_i).gt.0.1d0)then i_pert = 1 exit endif enddo -! print*,'' -! print*,'lambda_i,f = ',lambda_i,f -! print*,'i_pert = ',i_pert -! print*,'' if(i_pert==1)then lambda_i = f i_pert_count +=1 @@ -79,9 +75,122 @@ subroutine provide_matrix_dressing(dressing_matrix,ndet_generators_input,psi_det enddo enddo enddo + href = dressing_matrix(1,1) + print*,'Diagonal part of the dressing' + do i = 1, ndet_generators_input + print*,'delta e = ',dressing_matrix(i,i) - href + enddo !print*,'i_pert_count = ',i_pert_count end +subroutine update_matrix_dressing_sc2(dressing_matrix,ndet_generators_input,psi_det_generators_input,H_jj_in) + use bitmasks + implicit none + integer, intent(in) :: ndet_generators_input + integer(bit_kind), intent(in) :: psi_det_generators_input(N_int,2,ndet_generators_input) + double precision, intent(in) :: H_jj_in(N_det) + double precision, intent(inout) :: dressing_matrix(ndet_generators_input,ndet_generators_input) + integer :: i,j,n_det_ref_tmp,degree + double precision :: href + n_det_ref_tmp = 0 + do i = 1, N_det + do j = 1, Ndet_generators_input + call get_excitation_degree(psi_det(1,1,i),psi_det_generators_input(1,1,j),degree,N_int) + if(degree == 0)then + dressing_matrix(j,j) += H_jj_in(i) + n_det_ref_tmp +=1 + exit + endif + enddo + enddo + if( ndet_generators_input .ne. n_det_ref_tmp)then + print*,'Problem !!!! ' + print*,' ndet_generators .ne. n_det_ref_tmp !!!' + print*,'ndet_generators,n_det_ref_tmp' + print*,ndet_generators_input,n_det_ref_tmp + stop + endif + + href = dressing_matrix(1,1) + print*,'' + print*,'Update with the SC2 dressing' + print*,'' + print*,'Diagonal part of the dressing' + do i = 1, ndet_generators_input + print*,'delta e = ',dressing_matrix(i,i) - href + enddo +end + +subroutine provide_matrix_dressing_for_extra_1h_or_1p(dressing_matrix,psi_det_ref_input,psi_coef_ref_input,n_det_ref_input, & + psi_det_outer_input,psi_coef_outer_input,n_det_outer_input) + use bitmasks + implicit none + integer, intent(in) :: n_det_ref_input + integer(bit_kind), intent(in) :: psi_det_ref_input(N_int,2,n_det_ref_input) + double precision, intent(in) :: psi_coef_ref_input(n_det_ref_input,N_states) + integer, intent(in) :: n_det_outer_input + integer(bit_kind), intent(in) :: psi_det_outer_input(N_int,2,n_det_outer_input) + double precision, intent(in) :: psi_coef_outer_input(n_det_outer_input,N_states) + + double precision, intent(inout) :: dressing_matrix(n_det_ref_input,n_det_ref_input) + + + integer :: i_pert, i_pert_count,i,j,k + double precision :: f,href,hka,lambda_i + double precision :: H_array(n_det_ref_input),accu + integer :: n_h_out,n_p_out,n_p_in,n_h_in,number_of_holes,number_of_particles + call i_h_j(psi_det_ref_input(1,1,1),psi_det_ref_input(1,1,1),N_int,href) + i_pert_count = 0 + do i = 1, n_det_outer_input + call i_h_j(psi_det_outer_input(1,1,i),psi_det_outer_input(1,1,i),N_int,hka) + f = 1.d0/(href - hka) + H_array = 0.d0 + accu = 0.d0 +! n_h_out = number_of_holes(psi_det_outer_input(1,1,i)) +! n_p_out = number_of_particles(psi_det_outer_input(1,1,i)) + do j=1,n_det_ref_input + n_h_in = number_of_holes(psi_det_ref_input(1,1,j)) + n_p_in = number_of_particles(psi_det_ref_input(1,1,j)) +! if(n_h_in == 0 .and. n_h_in == 0)then + call i_h_j(psi_det_outer_input(1,1,i),psi_det_ref_input(1,1,j),N_int,hka) +! else +! hka = 0.d0 +! endif + H_array(j) = hka + accu += psi_coef_ref_input(j,1) * hka + enddo + lambda_i = psi_coef_outer_input(i,1)/accu + i_pert = 1 + if(accu * f / psi_coef_outer_input(i,1) .gt. 0.5d0 .and. accu * f/psi_coef_outer_input(i,1).gt.0.d0)then + i_pert = 0 + endif + do j = 1, n_det_ref_input + if(dabs(H_array(j)*lambda_i).gt.0.5d0)then + i_pert = 1 + exit + endif + enddo + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! i_pert = 0 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + if(i_pert==1)then + lambda_i = f + i_pert_count +=1 + endif + do k=1,n_det_ref_input + double precision :: contrib + contrib = H_array(k) * H_array(k) * lambda_i + dressing_matrix(k, k) += contrib + do j=k+1,n_det_ref_input + contrib = H_array(k) * H_array(j) * lambda_i + dressing_matrix(k, j) += contrib + dressing_matrix(j, k) += contrib + enddo + enddo + enddo +end + + subroutine provide_matrix_dressing_general(dressing_matrix,psi_det_ref_input,psi_coef_ref_input,n_det_ref_input, & psi_det_outer_input,psi_coef_outer_input,n_det_outer_input) use bitmasks @@ -112,16 +221,17 @@ subroutine provide_matrix_dressing_general(dressing_matrix,psi_det_ref_input,psi accu += psi_coef_ref_input(j,1) * hka enddo lambda_i = psi_coef_outer_input(i,1)/accu - i_pert = 1 + i_pert = 0 if(accu * f / psi_coef_outer_input(i,1) .gt. 0.5d0 .and. accu * f/psi_coef_outer_input(i,1).gt.0.d0)then i_pert = 0 endif do j = 1, n_det_ref_input - if(dabs(H_array(j)*lambda_i).gt.0.3d0)then + if(dabs(H_array(j)*lambda_i).gt.0.5d0)then i_pert = 1 exit endif enddo +! i_pert = 0 if(i_pert==1)then lambda_i = f i_pert_count +=1 @@ -170,114 +280,379 @@ subroutine diag_dressed_matrix_and_set_to_psi_det(psi_det_generators_input,Ndet_ end -subroutine give_n_1h1p_and_n_2h1p_in_psi_det(n_det_1h1p,n_det_2h1p) +subroutine give_n_1h1p_and_n_2h1p_in_psi_det(i_hole,n_det_extra_1h_or_1p,n_det_1h1p,n_det_2h1p) use bitmasks implicit none - integer, intent(out) :: n_det_1h1p, n_det_2h1p + integer, intent(in) :: i_hole + integer, intent(out) :: n_det_1h1p, n_det_2h1p,n_det_extra_1h_or_1p integer :: i integer :: n_det_ref_restart_tmp,n_det_1h integer :: number_of_holes,n_h, number_of_particles,n_p + logical :: is_the_hole_in_det n_det_ref_restart_tmp = 0 n_det_1h = 0 n_det_1h1p = 0 n_det_2h1p = 0 + n_det_extra_1h_or_1p = 0 do i = 1, N_det n_h = number_of_holes(psi_det(1,1,i)) n_p = number_of_particles(psi_det(1,1,i)) if(n_h == 0 .and. n_p == 0)then n_det_ref_restart_tmp +=1 else if (n_h ==1 .and. n_p==0)then - n_det_1h +=1 + if(is_the_hole_in_det(psi_det(1,1,i),1,i_hole).or.is_the_hole_in_det(psi_det(1,1,i),2,i_hole))then + n_det_1h +=1 + else + n_det_extra_1h_or_1p +=1 + endif + else if (n_h ==0 .and. n_p==1)then + n_det_extra_1h_or_1p +=1 else if (n_h ==1 .and. n_p==1)then n_det_1h1p +=1 else if (n_h ==2 .and. n_p==1)then n_det_2h1p +=1 else print*,'PB !!!!' - print*,'You have something else than a 1h, 1h1p or 2h1p' + print*,'You have something else than a 1h, 1p, 1h1p or 2h1p' + print*,'n_h,n_p = ',n_h,n_p call debug_det(psi_det(1,1,i),N_int) stop endif enddo -! if(n_det_1h.ne.1)then -! print*,'PB !! You have more than one 1h' -! stop -! endif if(n_det_ref_restart_tmp + n_det_1h .ne. n_det_generators)then print*,'PB !!!!' print*,'You have forgotten something in your generators ... ' stop endif - + if(n_det_2h1p + n_det_1h1p + n_det_extra_1h_or_1p + n_det_generators .ne. N_det)then + print*,'PB !!!!' + print*,'You have forgotten something in your generators ... ' + stop + endif end -subroutine give_n_1h1p_and_n_1h2p_in_psi_det(n_det_1h1p,n_det_1h2p) +subroutine give_n_ref_1h_1p_and_n_2h1p_1h1p_in_psi_det(n_det_ref_1h_1p,n_det_2h1p,n_det_1h1p) use bitmasks implicit none - integer, intent(out) :: n_det_1h1p, n_det_1h2p + integer, intent(out) :: n_det_ref_1h_1p,n_det_2h1p,n_det_1h1p integer :: i integer :: n_det_ref_restart_tmp,n_det_1h integer :: number_of_holes,n_h, number_of_particles,n_p - n_det_ref_restart_tmp = 0 - n_det_1h = 0 + logical :: is_the_hole_in_det + n_det_ref_1h_1p = 0 + n_det_2h1p = 0 n_det_1h1p = 0 - n_det_1h2p = 0 do i = 1, N_det n_h = number_of_holes(psi_det(1,1,i)) n_p = number_of_particles(psi_det(1,1,i)) if(n_h == 0 .and. n_p == 0)then - n_det_ref_restart_tmp +=1 + n_det_ref_1h_1p +=1 + else if (n_h ==1 .and. n_p==0)then + n_det_ref_1h_1p +=1 else if (n_h ==0 .and. n_p==1)then - n_det_1h +=1 + n_det_ref_1h_1p +=1 + else if (n_h ==1 .and. n_p==1)then + n_det_1h1p +=1 + else if (n_h ==2 .and. n_p==1)then + n_det_2h1p +=1 + else + print*,'PB !!!!' + print*,'You have something else than a 1h, 1p, 1h1p or 2h1p' + print*,'n_h,n_p = ',n_h,n_p + call debug_det(psi_det(1,1,i),N_int) + stop + endif + enddo + +end + +subroutine give_n_ref_1h_1p_and_n_1h2p_1h1p_in_psi_det(n_det_ref_1h_1p,n_det_1h2p,n_det_1h1p) + use bitmasks + implicit none + integer, intent(out) :: n_det_ref_1h_1p,n_det_1h2p,n_det_1h1p + integer :: i + integer :: n_det_ref_restart_tmp,n_det_1h + integer :: number_of_holes,n_h, number_of_particles,n_p + logical :: is_the_hole_in_det + n_det_ref_1h_1p = 0 + n_det_1h2p = 0 + n_det_1h1p = 0 + do i = 1, N_det + n_h = number_of_holes(psi_det(1,1,i)) + n_p = number_of_particles(psi_det(1,1,i)) + if(n_h == 0 .and. n_p == 0)then + n_det_ref_1h_1p +=1 + else if (n_h ==1 .and. n_p==0)then + n_det_ref_1h_1p +=1 + else if (n_h ==0 .and. n_p==1)then + n_det_ref_1h_1p +=1 else if (n_h ==1 .and. n_p==1)then n_det_1h1p +=1 else if (n_h ==1 .and. n_p==2)then n_det_1h2p +=1 else print*,'PB !!!!' - print*,'You have something else than a 1p, 1h1p or 1h2p' + print*,'You have something else than a 1h, 1p, 1h1p or 1h2p' + print*,'n_h,n_p = ',n_h,n_p call debug_det(psi_det(1,1,i),N_int) stop endif enddo - if(n_det_ref_restart_tmp + n_det_1h .ne. n_det_generators)then + +end + +subroutine give_wf_n_ref_1h_1p_and_n_2h1p_1h1p_in_psi_det(n_det_ref_1h_1p,n_det_2h1p,n_det_1h1p,psi_det_ref_1h_1p,psi_coef_ref_1h_1p,& + psi_det_2h1p,psi_coef_2h1p,psi_det_1h1p,psi_coef_1h1p) + use bitmasks + implicit none + integer, intent(in) :: n_det_ref_1h_1p,n_det_2h1p,n_det_1h1p + integer(bit_kind), intent(out) :: psi_det_ref_1h_1p(N_int,2,n_det_ref_1h_1p) + integer(bit_kind), intent(out) :: psi_det_2h1p(N_int,2,n_det_2h1p) + integer(bit_kind), intent(out) :: psi_det_1h1p(N_int,2,n_det_1h1p) + double precision, intent(out) :: psi_coef_ref_1h_1p(n_det_ref_1h_1p,N_states) + double precision, intent(out) :: psi_coef_2h1p(n_det_2h1p,N_states) + double precision, intent(out) :: psi_coef_1h1p(n_det_1h1p,N_states) + integer :: n_det_ref_1h_1p_tmp,n_det_2h1p_tmp,n_det_1h1p_tmp + integer :: i,j + integer :: n_det_ref_restart_tmp,n_det_1h + integer :: number_of_holes,n_h, number_of_particles,n_p + logical :: is_the_hole_in_det + integer, allocatable :: index_ref_1h_1p(:) + integer, allocatable :: index_2h1p(:) + integer, allocatable :: index_1h1p(:) + allocate(index_ref_1h_1p(n_det)) + allocate(index_2h1p(n_det)) + allocate(index_1h1p(n_det)) + n_det_ref_1h_1p_tmp = 0 + n_det_2h1p_tmp = 0 + n_det_1h1p_tmp = 0 + do i = 1, N_det + n_h = number_of_holes(psi_det(1,1,i)) + n_p = number_of_particles(psi_det(1,1,i)) + if(n_h == 0 .and. n_p == 0)then + n_det_ref_1h_1p_tmp +=1 + index_ref_1h_1p(n_det_ref_1h_1p_tmp) = i + else if (n_h ==1 .and. n_p==0)then + n_det_ref_1h_1p_tmp +=1 + index_ref_1h_1p(n_det_ref_1h_1p_tmp) = i + else if (n_h ==0 .and. n_p==1)then + n_det_ref_1h_1p_tmp +=1 + index_ref_1h_1p(n_det_ref_1h_1p_tmp) = i + else if (n_h ==1 .and. n_p==1)then + n_det_1h1p_tmp +=1 + index_1h1p(n_det_1h1p_tmp) = i + else if (n_h ==2 .and. n_p==1)then + n_det_2h1p_tmp +=1 + index_2h1p(n_det_2h1p_tmp) = i + else print*,'PB !!!!' - print*,'You have forgotten something in your generators ... ' - stop - endif + print*,'You have something else than a 1h, 1p, 1h1p or 2h1p' + print*,'n_h,n_p = ',n_h,n_p + call debug_det(psi_det(1,1,i),N_int) + stop + endif + enddo + do i = 1, n_det_2h1p + do j = 1, N_int + psi_det_2h1p(j,1,i) = psi_det(j,1,index_2h1p(i)) + psi_det_2h1p(j,2,i) = psi_det(j,2,index_2h1p(i)) + enddo + do j = 1, N_states + psi_coef_2h1p(i,j) = psi_coef(index_2h1p(i),j) + enddo + enddo + + do i = 1, n_det_1h1p + do j = 1, N_int + psi_det_1h1p(j,1,i) = psi_det(j,1,index_1h1p(i)) + psi_det_1h1p(j,2,i) = psi_det(j,2,index_1h1p(i)) + enddo + do j = 1, N_states + psi_coef_1h1p(i,j) = psi_coef(index_1h1p(i),j) + enddo + enddo + + do i = 1, n_det_ref_1h_1p + do j = 1, N_int + psi_det_ref_1h_1p(j,1,i) = psi_det(j,1,index_ref_1h_1p(i)) + psi_det_ref_1h_1p(j,2,i) = psi_det(j,2,index_ref_1h_1p(i)) + enddo + do j = 1, N_states + psi_coef_ref_1h_1p(i,j) = psi_coef(index_ref_1h_1p(i),j) + enddo + enddo + +end + +subroutine give_wf_n_ref_1h_1p_and_n_1h2p_1h1p_in_psi_det(n_det_ref_1h_1p,n_det_1h2p,n_det_1h1p,psi_det_ref_1h_1p,psi_coef_ref_1h_1p,& + psi_det_1h2p,psi_coef_1h2p,psi_det_1h1p,psi_coef_1h1p) + use bitmasks + implicit none + integer, intent(in) :: n_det_ref_1h_1p,n_det_1h2p,n_det_1h1p + integer(bit_kind), intent(out) :: psi_det_ref_1h_1p(N_int,2,n_det_ref_1h_1p) + integer(bit_kind), intent(out) :: psi_det_1h2p(N_int,2,n_det_1h2p) + integer(bit_kind), intent(out) :: psi_det_1h1p(N_int,2,n_det_1h1p) + double precision, intent(out) :: psi_coef_ref_1h_1p(n_det_ref_1h_1p,N_states) + double precision, intent(out) :: psi_coef_1h2p(n_det_1h2p,N_states) + double precision, intent(out) :: psi_coef_1h1p(n_det_1h1p,N_states) + integer :: n_det_ref_1h_1p_tmp,n_det_1h2p_tmp,n_det_1h1p_tmp + integer :: i,j + integer :: n_det_ref_restart_tmp,n_det_1h + integer :: number_of_holes,n_h, number_of_particles,n_p + logical :: is_the_hole_in_det + integer, allocatable :: index_ref_1h_1p(:) + integer, allocatable :: index_1h2p(:) + integer, allocatable :: index_1h1p(:) + allocate(index_ref_1h_1p(n_det)) + allocate(index_1h2p(n_det)) + allocate(index_1h1p(n_det)) + n_det_ref_1h_1p_tmp = 0 + n_det_1h2p_tmp = 0 + n_det_1h1p_tmp = 0 + do i = 1, N_det + n_h = number_of_holes(psi_det(1,1,i)) + n_p = number_of_particles(psi_det(1,1,i)) + if(n_h == 0 .and. n_p == 0)then + n_det_ref_1h_1p_tmp +=1 + index_ref_1h_1p(n_det_ref_1h_1p_tmp) = i + else if (n_h ==1 .and. n_p==0)then + n_det_ref_1h_1p_tmp +=1 + index_ref_1h_1p(n_det_ref_1h_1p_tmp) = i + else if (n_h ==0 .and. n_p==1)then + n_det_ref_1h_1p_tmp +=1 + index_ref_1h_1p(n_det_ref_1h_1p_tmp) = i + else if (n_h ==1 .and. n_p==1)then + n_det_1h1p_tmp +=1 + index_1h1p(n_det_1h1p_tmp) = i + else if (n_h ==1 .and. n_p==2)then + n_det_1h2p_tmp +=1 + index_1h2p(n_det_1h2p_tmp) = i + else + print*,'PB !!!!' + print*,'You have something else than a 1h, 1p, 1h1p or 1h2p' + print*,'n_h,n_p = ',n_h,n_p + call debug_det(psi_det(1,1,i),N_int) + stop + endif + enddo + do i = 1, n_det_1h2p + do j = 1, N_int + psi_det_1h2p(j,1,i) = psi_det(j,1,index_1h2p(i)) + psi_det_1h2p(j,2,i) = psi_det(j,2,index_1h2p(i)) + enddo + do j = 1, N_states + psi_coef_1h2p(i,j) = psi_coef(index_1h2p(i),j) + enddo + enddo + + do i = 1, n_det_1h1p + do j = 1, N_int + psi_det_1h1p(j,1,i) = psi_det(j,1,index_1h1p(i)) + psi_det_1h1p(j,2,i) = psi_det(j,2,index_1h1p(i)) + enddo + do j = 1, N_states + psi_coef_1h1p(i,j) = psi_coef(index_1h1p(i),j) + enddo + enddo + + do i = 1, n_det_ref_1h_1p + do j = 1, N_int + psi_det_ref_1h_1p(j,1,i) = psi_det(j,1,index_ref_1h_1p(i)) + psi_det_ref_1h_1p(j,2,i) = psi_det(j,2,index_ref_1h_1p(i)) + enddo + do j = 1, N_states + psi_coef_ref_1h_1p(i,j) = psi_coef(index_ref_1h_1p(i),j) + enddo + enddo + +end + + + +subroutine give_n_1h1p_and_n_1h2p_in_psi_det(i_particl,n_det_extra_1h_or_1p,n_det_1h1p,n_det_1h2p) + use bitmasks + implicit none + integer, intent(in) ::i_particl + integer, intent(out) :: n_det_1h1p, n_det_1h2p,n_det_extra_1h_or_1p + integer :: i + integer :: n_det_ref_restart_tmp,n_det_1p + integer :: number_of_holes,n_h, number_of_particles,n_p + logical :: is_the_particl_in_det + n_det_ref_restart_tmp = 0 + n_det_1p = 0 + n_det_1h1p = 0 + n_det_1h2p = 0 + n_det_extra_1h_or_1p = 0 + do i = 1, N_det + n_h = number_of_holes(psi_det(1,1,i)) + n_p = number_of_particles(psi_det(1,1,i)) + if(n_h == 0 .and. n_p == 0)then + n_det_ref_restart_tmp +=1 + else if (n_h ==0 .and. n_p==1)then + if(is_the_particl_in_det(psi_det(1,1,i),1,i_particl).or.is_the_particl_in_det(psi_det(1,1,i),2,i_particl))then + n_det_1p +=1 + else + n_det_extra_1h_or_1p +=1 + endif + else if (n_h ==1 .and. n_p==0)then + n_det_extra_1h_or_1p +=1 + else if (n_h ==1 .and. n_p==1)then + n_det_1h1p +=1 + else if (n_h ==1 .and. n_p==2)then + n_det_1h2p +=1 + else + print*,'PB !!!!' + print*,'You have something else than a 1h, 1p, 1h1p or 1h2p' + call debug_det(psi_det(1,1,i),N_int) + stop + endif + enddo +!if(n_det_ref_restart_tmp + n_det_1h .ne. n_det_generators)then +! print*,'PB !!!!' +! print*,'You have forgotten something in your generators ... ' +! stop +!endif end -subroutine split_wf_generators_and_1h1p_and_2h1p(n_det_1h1p,n_det_2h1p,psi_ref_out,psi_ref_coef_out,psi_1h1p,psi_coef_1h1p,psi_2h1p,psi_coef_2h1p) +subroutine split_wf_generators_and_1h1p_and_2h1p(i_hole,n_det_extra_1h_or_1p,n_det_1h1p,n_det_2h1p,psi_ref_out,psi_ref_coef_out,psi_1h1p,psi_coef_1h1p,psi_2h1p,psi_coef_2h1p,psi_extra_1h_or_1p,psi_coef_extra_1h_or_1p) use bitmasks implicit none - integer, intent(in) :: n_det_1h1p,n_det_2h1p + integer, intent(in) :: n_det_1h1p,n_det_2h1p,n_det_extra_1h_or_1p,i_hole integer(bit_kind), intent(out) :: psi_ref_out(N_int,2,N_det_generators) integer(bit_kind), intent(out) :: psi_1h1p(N_int,2,n_det_1h1p) integer(bit_kind), intent(out) :: psi_2h1p(N_int,2,n_det_2h1p) + integer(bit_kind), intent(out) :: psi_extra_1h_or_1p(N_int,2,n_det_extra_1h_or_1p) double precision, intent(out) :: psi_ref_coef_out(N_det_generators,N_states) double precision, intent(out) :: psi_coef_1h1p(n_det_1h1p, N_states) double precision, intent(out) :: psi_coef_2h1p(n_det_2h1p, N_states) + double precision, intent(out) :: psi_coef_extra_1h_or_1p(n_det_extra_1h_or_1p, N_states) integer :: i,j integer :: degree integer :: number_of_holes,n_h, number_of_particles,n_p - integer :: n_det_generators_tmp,n_det_1h1p_tmp,n_det_2h1p_tmp + integer :: n_det_generators_tmp,n_det_1h1p_tmp,n_det_2h1p_tmp,n_det_extra_1h_or_1p_tmp + integer :: n_det_1h_tmp integer, allocatable :: index_generator(:) integer, allocatable :: index_1h1p(:) integer, allocatable :: index_2h1p(:) + integer, allocatable :: index_extra_1h_or_1p(:) + logical :: is_the_hole_in_det allocate(index_1h1p(n_det)) allocate(index_2h1p(n_det)) + allocate(index_extra_1h_or_1p(n_det)) allocate(index_generator(N_det)) n_det_generators_tmp = 0 n_det_1h1p_tmp = 0 n_det_2h1p_tmp = 0 + n_det_extra_1h_or_1p_tmp = 0 + n_det_1h_tmp = 0 do i = 1, n_det n_h = number_of_holes(psi_det(1,1,i)) n_p = number_of_particles(psi_det(1,1,i)) @@ -287,6 +662,16 @@ subroutine split_wf_generators_and_1h1p_and_2h1p(n_det_1h1p,n_det_2h1p,psi_ref_o else if (n_h ==2 .and. n_p==1)then n_det_2h1p_tmp +=1 index_2h1p(n_det_2h1p_tmp) = i + else if (n_h ==0 .and. n_p==1)then + n_det_extra_1h_or_1p_tmp +=1 + index_extra_1h_or_1p(n_det_extra_1h_or_1p_tmp) = i + else if (n_h ==1 .and. n_p==0)then + if(is_the_hole_in_det(psi_det(1,1,i),1,i_hole).or.is_the_hole_in_det(psi_det(1,1,i),2,i_hole))then + n_det_1h_tmp +=1 + else + n_det_extra_1h_or_1p_tmp +=1 + index_extra_1h_or_1p(n_det_extra_1h_or_1p_tmp) = i + endif endif do j = 1, N_det_generators call get_excitation_degree(psi_det_generators(1,1,j),psi_det(1,1,i), degree, N_int) @@ -315,6 +700,12 @@ subroutine split_wf_generators_and_1h1p_and_2h1p(n_det_1h1p,n_det_2h1p,psi_ref_o stop endif + if(n_det_extra_1h_or_1p.ne.n_det_extra_1h_or_1p_tmp)then + print*,'PB !!!' + print*,'n_det_extra_1h_or_1p.ne.n_det_extra_1h_or_1p_tmp' + stop + endif + do i = 1,N_det_generators do j = 1, N_int psi_ref_out(j,1,i) = psi_det(j,1,index_generator(i)) @@ -345,41 +736,59 @@ subroutine split_wf_generators_and_1h1p_and_2h1p(n_det_1h1p,n_det_2h1p,psi_ref_o enddo enddo + do i = 1, n_det_extra_1h_or_1p + do j = 1, N_int + psi_extra_1h_or_1p(j,1,i) = psi_det(j,1,index_extra_1h_or_1p(i)) + psi_extra_1h_or_1p(j,2,i) = psi_det(j,2,index_extra_1h_or_1p(i)) + enddo + do j = 1, N_states + psi_coef_extra_1h_or_1p(i,j) = psi_coef(index_extra_1h_or_1p(i),j) + enddo + enddo deallocate(index_generator) deallocate(index_1h1p) deallocate(index_2h1p) + deallocate(index_extra_1h_or_1p) end -subroutine split_wf_generators_and_1h1p_and_1h2p(n_det_1h1p,n_det_1h2p,psi_ref_out,psi_ref_coef_out,psi_1h1p,psi_coef_1h1p,psi_1h2p,psi_coef_1h2p) +subroutine split_wf_generators_and_1h1p_and_1h2p(i_particl,n_det_extra_1h_or_1p,n_det_1h1p,n_det_1h2p,psi_ref_out,psi_ref_coef_out,psi_1h1p,psi_coef_1h1p,psi_1h2p,psi_coef_1h2p,psi_extra_1h_or_1p,psi_coef_extra_1h_or_1p) use bitmasks implicit none - integer, intent(in) :: n_det_1h1p,n_det_1h2p + integer, intent(in) :: n_det_1h1p,n_det_1h2p,n_det_extra_1h_or_1p,i_particl integer(bit_kind), intent(out) :: psi_ref_out(N_int,2,N_det_generators) integer(bit_kind), intent(out) :: psi_1h1p(N_int,2,n_det_1h1p) integer(bit_kind), intent(out) :: psi_1h2p(N_int,2,n_det_1h2p) + integer(bit_kind), intent(out) :: psi_extra_1h_or_1p(N_int,2,n_det_extra_1h_or_1p) double precision, intent(out) :: psi_ref_coef_out(N_det_generators,N_states) double precision, intent(out) :: psi_coef_1h1p(n_det_1h1p, N_states) double precision, intent(out) :: psi_coef_1h2p(n_det_1h2p, N_states) + double precision, intent(out) :: psi_coef_extra_1h_or_1p(n_det_extra_1h_or_1p, N_states) integer :: i,j integer :: degree integer :: number_of_holes,n_h, number_of_particles,n_p - integer :: n_det_generators_tmp,n_det_1h1p_tmp,n_det_1h2p_tmp + integer :: n_det_generators_tmp,n_det_1h1p_tmp,n_det_1h2p_tmp,n_det_extra_1h_or_1p_tmp integer, allocatable :: index_generator(:) integer, allocatable :: index_1h1p(:) integer, allocatable :: index_1h2p(:) + integer, allocatable :: index_extra_1h_or_1p(:) + logical :: is_the_particl_in_det + integer :: n_det_1p_tmp allocate(index_1h1p(n_det)) allocate(index_1h2p(n_det)) + allocate(index_extra_1h_or_1p(n_det)) allocate(index_generator(N_det)) n_det_generators_tmp = 0 n_det_1h1p_tmp = 0 n_det_1h2p_tmp = 0 + n_det_extra_1h_or_1p_tmp = 0 + n_det_1p_tmp = 0 do i = 1, n_det n_h = number_of_holes(psi_det(1,1,i)) n_p = number_of_particles(psi_det(1,1,i)) @@ -389,6 +798,15 @@ subroutine split_wf_generators_and_1h1p_and_1h2p(n_det_1h1p,n_det_1h2p,psi_ref_o else if (n_h ==1 .and. n_p==2)then n_det_1h2p_tmp +=1 index_1h2p(n_det_1h2p_tmp) = i + else if (n_h ==1 .and. n_p==0)then + n_det_extra_1h_or_1p_tmp +=1 + index_extra_1h_or_1p(n_det_extra_1h_or_1p_tmp) = i + else if (n_h ==0 .and. n_p==1)then + if(is_the_particl_in_det(psi_det(1,1,i),1,i_particl).or.is_the_particl_in_det(psi_det(1,1,i),2,i_particl))then + n_det_1p_tmp +=1 + else + n_det_extra_1h_or_1p_tmp +=1 + endif endif do j = 1, N_det_generators call get_excitation_degree(psi_det_generators(1,1,j),psi_det(1,1,i), degree, N_int) @@ -448,9 +866,20 @@ subroutine split_wf_generators_and_1h1p_and_1h2p(n_det_1h1p,n_det_1h2p,psi_ref_o enddo + do i = 1, n_det_extra_1h_or_1p + do j = 1, N_int + psi_extra_1h_or_1p(j,1,i) = psi_det(j,1,index_extra_1h_or_1p(i)) + psi_extra_1h_or_1p(j,2,i) = psi_det(j,2,index_extra_1h_or_1p(i)) + enddo + do j = 1, N_states + psi_coef_extra_1h_or_1p(i,j) = psi_coef(index_extra_1h_or_1p(i),j) + enddo + enddo + deallocate(index_generator) deallocate(index_1h1p) deallocate(index_1h2p) + deallocate(index_extra_1h_or_1p) end diff --git a/plugins/FOBOCI/routines_foboci.irp.f b/plugins/FOBOCI/routines_foboci.irp.f index 696011a9..4aca60d7 100644 --- a/plugins/FOBOCI/routines_foboci.irp.f +++ b/plugins/FOBOCI/routines_foboci.irp.f @@ -332,20 +332,20 @@ subroutine save_osoci_natural_mos enddo tmp = tmp_bis -!! Symetrization act-virt - do j = 1, n_virt_orb - j_virt= list_virt(j) - accu = 0.d0 - do i = 1, n_act_orb - jorb = list_act(i) - accu += dabs(tmp_bis(j_virt,jorb)) - enddo - do i = 1, n_act_orb - iorb = list_act(i) - tmp(j_virt,iorb) = dsign(accu/dble(n_act_orb),tmp_bis(j_virt,iorb)) - tmp(iorb,j_virt) = dsign(accu/dble(n_act_orb),tmp_bis(j_virt,iorb)) - enddo - enddo +!!! Symetrization act-virt +! do j = 1, n_virt_orb +! j_virt= list_virt(j) +! accu = 0.d0 +! do i = 1, n_act_orb +! jorb = list_act(i) +! accu += dabs(tmp_bis(j_virt,jorb)) +! enddo +! do i = 1, n_act_orb +! iorb = list_act(i) +! tmp(j_virt,iorb) = dsign(accu/dble(n_act_orb),tmp_bis(j_virt,iorb)) +! tmp(iorb,j_virt) = dsign(accu/dble(n_act_orb),tmp_bis(j_virt,iorb)) +! enddo +! enddo !! Symetrization act-inact !do j = 1, n_inact_orb @@ -387,16 +387,16 @@ subroutine save_osoci_natural_mos print*,'ACTIVE ORBITAL ',iorb do j = 1, n_inact_orb jorb = list_inact(j) - if(dabs(tmp(iorb,jorb)).gt.threshold_singles)then + if(dabs(tmp(iorb,jorb)).gt.threshold_lmct)then print*,'INACTIVE ' - print*,'DM ',iorb,jorb,dabs(tmp(iorb,jorb)) + print*,'DM ',iorb,jorb,(tmp(iorb,jorb)) endif enddo do j = 1, n_virt_orb jorb = list_virt(j) - if(dabs(tmp(iorb,jorb)).gt.threshold_singles)then + if(dabs(tmp(iorb,jorb)).gt.threshold_mlct)then print*,'VIRT ' - print*,'DM ',iorb,jorb,dabs(tmp(iorb,jorb)) + print*,'DM ',iorb,jorb,(tmp(iorb,jorb)) endif enddo enddo @@ -410,8 +410,9 @@ subroutine save_osoci_natural_mos enddo label = "Natural" + call mo_as_eigvectors_of_mo_matrix(tmp,size(tmp,1),size(tmp,2),label,1) - soft_touch mo_coef +!soft_touch mo_coef deallocate(tmp,occ) @@ -518,16 +519,16 @@ subroutine set_osoci_natural_mos print*,'ACTIVE ORBITAL ',iorb do j = 1, n_inact_orb jorb = list_inact(j) - if(dabs(tmp(iorb,jorb)).gt.threshold_singles)then + if(dabs(tmp(iorb,jorb)).gt.threshold_lmct)then print*,'INACTIVE ' - print*,'DM ',iorb,jorb,dabs(tmp(iorb,jorb)) + print*,'DM ',iorb,jorb,(tmp(iorb,jorb)) endif enddo do j = 1, n_virt_orb jorb = list_virt(j) - if(dabs(tmp(iorb,jorb)).gt.threshold_singles)then + if(dabs(tmp(iorb,jorb)).gt.threshold_mlct)then print*,'VIRT ' - print*,'DM ',iorb,jorb,dabs(tmp(iorb,jorb)) + print*,'DM ',iorb,jorb,(tmp(iorb,jorb)) endif enddo enddo @@ -602,15 +603,210 @@ end subroutine provide_properties implicit none - integer :: i - double precision :: accu - if(.True.)then - accu= 0.d0 - do i = 1, nucl_num - accu += mulliken_spin_densities(i) - print*,i,nucl_charge(i),mulliken_spin_densities(i) - enddo - print*,'Sum of Mulliken SD = ',accu - endif + call print_mulliken_sd + call print_hcc end + + + subroutine dress_diag_elem_2h1p(dressing_H_mat_elem,ndet,lmct,i_hole) + use bitmasks + double precision, intent(inout) :: dressing_H_mat_elem(Ndet) + integer, intent(in) :: ndet,i_hole + logical, intent(in) :: lmct + ! if lmct = .True. ===> LMCT + ! else ===> MLCT + implicit none + integer :: i + integer :: n_p,n_h,number_of_holes,number_of_particles + integer :: exc(0:2,2,2) + integer :: degree + double precision :: phase + integer :: h1,h2,p1,p2,s1,s2 + do i = 1, N_det + + n_h = number_of_holes(psi_det(1,1,i)) + n_p = number_of_particles(psi_det(1,1,i)) + call get_excitation(ref_bitmask,psi_det(1,1,i),exc,degree,phase,N_int) + call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) + if (n_h == 0.and.n_p==0)then ! CAS + dressing_H_mat_elem(i)+= total_corr_e_2h1p + if(lmct)then + dressing_H_mat_elem(i) += - corr_energy_2h1p_per_orb_ab(i_hole) - corr_energy_2h1p_per_orb_bb(i_hole) + endif + endif + if (n_h == 1.and.n_p==0)then ! 1h + dressing_H_mat_elem(i)+= 0.d0 + else if (n_h == 0.and.n_p==1)then ! 1p + dressing_H_mat_elem(i)+= total_corr_e_2h1p + dressing_H_mat_elem(i) += - corr_energy_2h1p_per_orb_ab(p1) - corr_energy_2h1p_per_orb_aa(p1) + else if (n_h == 1.and.n_p==1)then ! 1h1p +! if(degree==1)then + dressing_H_mat_elem(i)+= total_corr_e_2h1p + dressing_H_mat_elem(i)+= - corr_energy_2h1p_per_orb_ab(h1) +! else +! dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(h1) & +! - 0.5d0 * (corr_energy_2h2p_per_orb_aa(h1) + corr_energy_2h2p_per_orb_bb(h1)) +! dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(p2) & +! - 0.5d0 * (corr_energy_2h2p_per_orb_aa(p2) + corr_energy_2h2p_per_orb_bb(p2)) +! dressing_H_mat_elem(i) += 0.5d0 * (corr_energy_2h2p_for_1h1p_double(h1,p1)) +! endif + else if (n_h == 2.and.n_p==1)then ! 2h1p + dressing_H_mat_elem(i)+= 0.d0 + else if (n_h == 1.and.n_p==2)then ! 1h2p + dressing_H_mat_elem(i)+= total_corr_e_2h1p + dressing_H_mat_elem(i) += - corr_energy_2h1p_per_orb_ab(h1) + endif + enddo + + end + + subroutine dress_diag_elem_1h2p(dressing_H_mat_elem,ndet,lmct,i_hole) + use bitmasks + double precision, intent(inout) :: dressing_H_mat_elem(Ndet) + integer, intent(in) :: ndet,i_hole + logical, intent(in) :: lmct + ! if lmct = .True. ===> LMCT + ! else ===> MLCT + implicit none + integer :: i + integer :: n_p,n_h,number_of_holes,number_of_particles + integer :: exc(0:2,2,2) + integer :: degree + double precision :: phase + integer :: h1,h2,p1,p2,s1,s2 + do i = 1, N_det + + n_h = number_of_holes(psi_det(1,1,i)) + n_p = number_of_particles(psi_det(1,1,i)) + call get_excitation(ref_bitmask,psi_det(1,1,i),exc,degree,phase,N_int) + call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) + if (n_h == 0.and.n_p==0)then ! CAS + dressing_H_mat_elem(i)+= total_corr_e_1h2p + if(.not.lmct)then + dressing_H_mat_elem(i) += - corr_energy_1h2p_per_orb_ab(i_hole) - corr_energy_1h2p_per_orb_aa(i_hole) + endif + endif + if (n_h == 1.and.n_p==0)then ! 1h + dressing_H_mat_elem(i)+= total_corr_e_1h2p - corr_energy_1h2p_per_orb_ab(h1) + else if (n_h == 0.and.n_p==1)then ! 1p + dressing_H_mat_elem(i)+= 0.d0 + else if (n_h == 1.and.n_p==1)then ! 1h1p + if(degree==1)then + dressing_H_mat_elem(i)+= total_corr_e_1h2p + dressing_H_mat_elem(i)+= - corr_energy_1h2p_per_orb_ab(h1) + else + dressing_H_mat_elem(i) +=0.d0 + endif +! dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(h1) & +! - 0.5d0 * (corr_energy_2h2p_per_orb_aa(h1) + corr_energy_2h2p_per_orb_bb(h1)) +! dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(p2) & +! - 0.5d0 * (corr_energy_2h2p_per_orb_aa(p2) + corr_energy_2h2p_per_orb_bb(p2)) +! dressing_H_mat_elem(i) += 0.5d0 * (corr_energy_2h2p_for_1h1p_double(h1,p1)) +! endif + else if (n_h == 2.and.n_p==1)then ! 2h1p + dressing_H_mat_elem(i)+= total_corr_e_1h2p + dressing_H_mat_elem(i)+= - corr_energy_1h2p_per_orb_ab(h1) - corr_energy_1h2p_per_orb_ab(h1) + else if (n_h == 1.and.n_p==2)then ! 1h2p + dressing_H_mat_elem(i) += 0.d0 + endif + enddo + + end + + subroutine dress_diag_elem_2h2p(dressing_H_mat_elem,ndet) + use bitmasks + double precision, intent(inout) :: dressing_H_mat_elem(Ndet) + integer, intent(in) :: ndet + implicit none + integer :: i + integer :: n_p,n_h,number_of_holes,number_of_particles + integer :: exc(0:2,2,2) + integer :: degree + double precision :: phase + integer :: h1,h2,p1,p2,s1,s2 + do i = 1, N_det + dressing_H_mat_elem(i)+= total_corr_e_2h2p + + n_h = number_of_holes(psi_det(1,1,i)) + n_p = number_of_particles(psi_det(1,1,i)) + call get_excitation(ref_bitmask,psi_det(1,1,i),exc,degree,phase,N_int) + call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) + if (n_h == 1.and.n_p==0)then ! 1h + dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(h1) & + - 0.5d0 * (corr_energy_2h2p_per_orb_aa(h1) + corr_energy_2h2p_per_orb_bb(h1)) + else if (n_h == 0.and.n_p==1)then ! 1p + dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(p1) & + - 0.5d0 * (corr_energy_2h2p_per_orb_aa(p1) + corr_energy_2h2p_per_orb_bb(p1)) + else if (n_h == 1.and.n_p==1)then ! 1h1p + if(degree==1)then + dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(h1) & + - 0.5d0 * (corr_energy_2h2p_per_orb_aa(h1) + corr_energy_2h2p_per_orb_bb(h1)) + dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(p1) & + - 0.5d0 * (corr_energy_2h2p_per_orb_aa(p1) + corr_energy_2h2p_per_orb_bb(p1)) + dressing_H_mat_elem(i) += 0.5d0 * (corr_energy_2h2p_for_1h1p_a(h1,p1) + corr_energy_2h2p_for_1h1p_b(h1,p1)) + else + dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(h1) & + - 0.5d0 * (corr_energy_2h2p_per_orb_aa(h1) + corr_energy_2h2p_per_orb_bb(h1)) + dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(p2) & + - 0.5d0 * (corr_energy_2h2p_per_orb_aa(p2) + corr_energy_2h2p_per_orb_bb(p2)) + dressing_H_mat_elem(i) += 0.5d0 * (corr_energy_2h2p_for_1h1p_double(h1,p1)) + endif + else if (n_h == 2.and.n_p==1)then ! 2h1p + dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(h1) - corr_energy_2h2p_per_orb_bb(h1) & + - corr_energy_2h2p_per_orb_ab(h2) & + - 0.5d0 * ( corr_energy_2h2p_per_orb_bb(h2) + corr_energy_2h2p_per_orb_bb(h2)) + dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(p1) + if(s1.ne.s2)then + dressing_H_mat_elem(i) += corr_energy_2h2p_ab_2_orb(h1,h2) + else + dressing_H_mat_elem(i) += corr_energy_2h2p_bb_2_orb(h1,h2) + endif + else if (n_h == 1.and.n_p==2)then ! 1h2p + dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(h1) & + - 0.5d0 * (corr_energy_2h2p_per_orb_aa(h1) + corr_energy_2h2p_per_orb_bb(h1)) + dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(p1) & + - 0.5d0 * (corr_energy_2h2p_per_orb_aa(p1) + corr_energy_2h2p_per_orb_bb(p1)) + dressing_H_mat_elem(i) += - corr_energy_2h2p_per_orb_ab(p2) & + - 0.5d0 * (corr_energy_2h2p_per_orb_aa(p2) + corr_energy_2h2p_per_orb_bb(p2)) + if(s1.ne.s2)then + dressing_H_mat_elem(i) += corr_energy_2h2p_ab_2_orb(p1,p2) + else + dressing_H_mat_elem(i) += corr_energy_2h2p_bb_2_orb(p1,p2) + endif + endif + enddo + + end + + subroutine diag_dressed_2h2p_hamiltonian_and_update_psi_det(i_hole,lmct) + implicit none + double precision, allocatable :: dressing_H_mat_elem(:),energies(:) + integer, intent(in) :: i_hole + logical, intent(in) :: lmct + ! if lmct = .True. ===> LMCT + ! else ===> MLCT + integer :: i + double precision :: hij + allocate(dressing_H_mat_elem(N_det),energies(N_states_diag)) + print*,'' + print*,'dressing with the 2h2p in a CC logic' + print*,'' + do i = 1, N_det + call i_h_j(psi_det(1,1,i),psi_det(1,1,i),N_int,hij) + dressing_H_mat_elem(i) = hij + enddo + call dress_diag_elem_2h2p(dressing_H_mat_elem,N_det) + call dress_diag_elem_2h1p(dressing_H_mat_elem,N_det,lmct,i_hole) + call dress_diag_elem_1h2p(dressing_H_mat_elem,N_det,lmct,i_hole) + call davidson_diag_hjj(psi_det,psi_coef,dressing_H_mat_elem,energies,size(psi_coef,1),N_det,N_states_diag,N_int,output_determinants) + do i = 1, 2 + print*,'psi_coef = ',psi_coef(i,1) + enddo + + + deallocate(dressing_H_mat_elem) + + + + end diff --git a/plugins/Full_CI/H_apply.irp.f b/plugins/Full_CI/H_apply.irp.f index d6888dc3..596c947a 100644 --- a/plugins/Full_CI/H_apply.irp.f +++ b/plugins/Full_CI/H_apply.irp.f @@ -7,6 +7,11 @@ s.set_selection_pt2("epstein_nesbet_2x2") #s.unset_openmp() print s +#s = H_apply("FCI_PT2") +#s.set_perturbation("epstein_nesbet_2x2") +#s.unset_openmp() +#print s + s = H_apply_zmq("FCI_PT2") s.set_perturbation("epstein_nesbet_2x2") s.unset_openmp() diff --git a/plugins/Full_CI/micro_pt2.irp.f b/plugins/Full_CI/micro_pt2.irp.f index d78a942d..14cc52bf 100644 --- a/plugins/Full_CI/micro_pt2.irp.f +++ b/plugins/Full_CI/micro_pt2.irp.f @@ -24,6 +24,8 @@ subroutine run_wf integer(ZMQ_PTR) :: zmq_to_qp_run_socket print *, 'Getting wave function' + zmq_context = f77_zmq_ctx_new () + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() call zmq_get_psi(zmq_to_qp_run_socket, 1) @@ -33,6 +35,8 @@ subroutine run_wf call provide_everything integer :: rc, i + print *, 'Contribution to PT2 running' + !$OMP PARALLEL PRIVATE(i) i = omp_get_thread_num() call H_apply_FCI_PT2_slave_tcp(i) diff --git a/plugins/Generators_restart/generators.irp.f b/plugins/Generators_restart/generators.irp.f index 0a82e6f9..17854330 100644 --- a/plugins/Generators_restart/generators.irp.f +++ b/plugins/Generators_restart/generators.irp.f @@ -1,5 +1,5 @@ use bitmasks - + BEGIN_PROVIDER [ integer, N_det_generators ] implicit none BEGIN_DOC @@ -8,17 +8,18 @@ BEGIN_PROVIDER [ integer, N_det_generators ] integer :: i integer, save :: ifirst = 0 double precision :: norm - read_wf = .True. if(ifirst == 0)then - N_det_generators = N_det + call ezfio_get_determinants_n_det(N_det_generators) ifirst = 1 + else + print*,'PB in generators restart !!!' endif call write_int(output_determinants,N_det_generators,'Number of generators') END_PROVIDER - BEGIN_PROVIDER [ integer(bit_kind), psi_det_generators, (N_int,2,psi_det_size) ] -&BEGIN_PROVIDER [ double precision, psi_coef_generators, (psi_det_size,N_states) ] + BEGIN_PROVIDER [ integer(bit_kind), psi_det_generators, (N_int,2,N_det_generators) ] +&BEGIN_PROVIDER [ double precision, psi_coef_generators, (N_det_generators,N_states) ] implicit none BEGIN_DOC ! read wf @@ -26,17 +27,20 @@ END_PROVIDER END_DOC integer :: i, k integer, save :: ifirst = 0 + double precision, allocatable :: psi_coef_read(:,:) if(ifirst == 0)then - do i=1,N_det_generators - do k=1,N_int - psi_det_generators(k,1,i) = psi_det(k,1,i) - psi_det_generators(k,2,i) = psi_det(k,2,i) - enddo + call read_dets(psi_det_generators,N_int,N_det_generators) + allocate (psi_coef_read(N_det_generators,N_states)) + call ezfio_get_determinants_psi_coef(psi_coef_read) do k = 1, N_states - psi_coef_generators(i,k) = psi_coef(i,k) + do i = 1, N_det_generators + psi_coef_generators(i,k) = psi_coef_read(i,k) + enddo enddo - enddo ifirst = 1 + deallocate(psi_coef_read) + else + print*,'PB in generators restart !!!' endif END_PROVIDER diff --git a/plugins/Hartree_Fock/damping_SCF.irp.f b/plugins/Hartree_Fock/damping_SCF.irp.f index 6a532b25..d383eb74 100644 --- a/plugins/Hartree_Fock/damping_SCF.irp.f +++ b/plugins/Hartree_Fock/damping_SCF.irp.f @@ -119,7 +119,9 @@ subroutine damping_SCF write(output_hartree_fock,'(A4,1X,A16, 1X, A16, 1X, A16, 1X, A4 )') '====','================','================','================', '====' write(output_hartree_fock,*) - call mo_as_eigvectors_of_mo_matrix(Fock_matrix_mo,size(Fock_matrix_mo,1),size(Fock_matrix_mo,2),mo_label,1) + if(.not.no_oa_or_av_opt)then + call mo_as_eigvectors_of_mo_matrix(Fock_matrix_mo,size(Fock_matrix_mo,1),size(Fock_matrix_mo,2),mo_label,1) + endif call write_double(output_hartree_fock, E_min, 'Hartree-Fock energy') call ezfio_set_hartree_fock_energy(E_min) diff --git a/plugins/MRCC_CASSD/mrcc_cassd.irp.f b/plugins/MRCC_CASSD/mrcc_cassd.irp.f index 38cd3c55..0d49be89 100644 --- a/plugins/MRCC_CASSD/mrcc_cassd.irp.f +++ b/plugins/MRCC_CASSD/mrcc_cassd.irp.f @@ -65,8 +65,17 @@ subroutine run_pt2(N_st,energy) threshold_selectors = 1.d0 threshold_generators = 0.999d0 - N_det_generators = lambda_mrcc_pt2(0) - do i=1,N_det_generators + N_det_generators = lambda_mrcc_pt2(0) + N_det_cas + do i=1,N_det_cas + do k=1,N_int + psi_det_generators(k,1,i) = psi_ref(k,1,i) + psi_det_generators(k,2,i) = psi_ref(k,2,i) + enddo + do k=1,N_st + psi_coef_generators(i,k) = psi_ref_coef(i,k) + enddo + enddo + do i=N_det_cas+1,N_det_generators j = lambda_mrcc_pt2(i) do k=1,N_int psi_det_generators(k,1,i) = psi_non_ref(k,1,j) diff --git a/plugins/MRCC_Utils/H_apply.irp.f b/plugins/MRCC_Utils/H_apply.irp.f index 57d6d5c1..0a8f55fe 100644 --- a/plugins/MRCC_Utils/H_apply.irp.f +++ b/plugins/MRCC_Utils/H_apply.irp.f @@ -25,7 +25,7 @@ print s -s = H_apply_zmq("mrcc_PT2") +s = H_apply("mrcc_PT2") s.energy = "ci_electronic_energy_dressed" s.set_perturbation("epstein_nesbet_2x2") s.unset_openmp() @@ -36,6 +36,11 @@ s.energy = "psi_ref_energy_diagonalized" s.set_perturbation("epstein_nesbet_2x2") s.unset_openmp() print s +#s = H_apply_zmq("mrcc_PT2") +#s.energy = "ci_electronic_energy_dressed" +#s.set_perturbation("epstein_nesbet_2x2") +#s.unset_openmp() +#print s END_SHELL diff --git a/plugins/Molden/NEEDED_CHILDREN_MODULES b/plugins/Molden/NEEDED_CHILDREN_MODULES index 305dfb78..80d0af12 100644 --- a/plugins/Molden/NEEDED_CHILDREN_MODULES +++ b/plugins/Molden/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -MO_Basis Utils +MO_Basis Utils diff --git a/plugins/Molden/aos.irp.f b/plugins/Molden/aos.irp.f deleted file mode 100644 index 71f8c5b8..00000000 --- a/plugins/Molden/aos.irp.f +++ /dev/null @@ -1,196 +0,0 @@ -BEGIN_PROVIDER [ character*(128), ao_l_char, (ao_num) ] - implicit none - BEGIN_DOC -! ao_l = l value of the AO: a+b+c in x^a y^b z^c - END_DOC - integer :: i - do i=1,ao_num - ao_l_char(i) = l_to_character(ao_l(i)) - enddo -END_PROVIDER - - -BEGIN_PROVIDER [ character*(128), l_to_character, (0:4)] - BEGIN_DOC - ! character corresponding to the "L" value of an AO orbital - END_DOC - implicit none - l_to_character(0)='S' - l_to_character(1)='P' - l_to_character(2)='D' - l_to_character(3)='F' - l_to_character(4)='G' -END_PROVIDER - - BEGIN_PROVIDER [ integer, Nucl_N_Aos, (nucl_num)] -&BEGIN_PROVIDER [ integer, N_AOs_max ] - implicit none - integer :: i - BEGIN_DOC - ! Number of AOs per atom - END_DOC - Nucl_N_Aos = 0 - do i = 1, ao_num - Nucl_N_Aos(ao_nucl(i)) +=1 - enddo - N_AOs_max = maxval(Nucl_N_Aos) -END_PROVIDER - - BEGIN_PROVIDER [ integer, Nucl_Aos, (nucl_num,N_AOs_max)] - implicit none - BEGIN_DOC - ! List of AOs attached on each atom - END_DOC - integer :: i - integer, allocatable :: nucl_tmp(:) - allocate(nucl_tmp(nucl_num)) - nucl_tmp = 0 - Nucl_Aos = 0 - do i = 1, ao_num - nucl_tmp(ao_nucl(i))+=1 - Nucl_Aos(ao_nucl(i),nucl_tmp(ao_nucl(i))) = i - enddo - deallocate(nucl_tmp) -END_PROVIDER - - - BEGIN_PROVIDER [ integer, Nucl_list_shell_Aos, (nucl_num,N_AOs_max)] -&BEGIN_PROVIDER [ integer, Nucl_num_shell_Aos, (nucl_num)] - implicit none - integer :: i,j,k - BEGIN_DOC - ! Index of the shell type Aos and of the corresponding Aos - ! Per convention, for P,D,F and G AOs, we take the index - ! of the AO with the the corresponding power in the "X" axis - END_DOC - do i = 1, nucl_num - Nucl_num_shell_Aos(i) = 0 - - do j = 1, Nucl_N_Aos(i) - if(ao_l(Nucl_Aos(i,j))==0)then - ! S type function - Nucl_num_shell_Aos(i)+=1 - Nucl_list_shell_Aos(i,Nucl_num_shell_Aos(i))=Nucl_Aos(i,j) - elseif(ao_l(Nucl_Aos(i,j))==1)then - ! P type function - if(ao_power(Nucl_Aos(i,j),1)==1)then - Nucl_num_shell_Aos(i)+=1 - Nucl_list_shell_Aos(i,Nucl_num_shell_Aos(i))=Nucl_Aos(i,j) - endif - elseif(ao_l(Nucl_Aos(i,j))==2)then - ! D type function - if(ao_power(Nucl_Aos(i,j),1)==2)then - Nucl_num_shell_Aos(i)+=1 - Nucl_list_shell_Aos(i,Nucl_num_shell_Aos(i))=Nucl_Aos(i,j) - endif - elseif(ao_l(Nucl_Aos(i,j))==3)then - ! F type function - if(ao_power(Nucl_Aos(i,j),1)==3)then - Nucl_num_shell_Aos(i)+=1 - Nucl_list_shell_Aos(i,Nucl_num_shell_Aos(i))=Nucl_Aos(i,j) - endif - elseif(ao_l(Nucl_Aos(i,j))==4)then - ! G type function - if(ao_power(Nucl_Aos(i,j),1)==4)then - Nucl_num_shell_Aos(i)+=1 - Nucl_list_shell_Aos(i,Nucl_num_shell_Aos(i))=Nucl_Aos(i,j) - endif - endif - - enddo - enddo - -END_PROVIDER - - -BEGIN_PROVIDER [ character*(4), ao_l_char_space, (ao_num) ] - implicit none - integer :: i - character*(4) :: give_ao_character_space - do i=1,ao_num - - if(ao_l(i)==0)then - ! S type AO - give_ao_character_space = 'S ' - elseif(ao_l(i) == 1)then - ! P type AO - if(ao_power(i,1)==1)then - give_ao_character_space = 'X ' - elseif(ao_power(i,2) == 1)then - give_ao_character_space = 'Y ' - else - give_ao_character_space = 'Z ' - endif - elseif(ao_l(i) == 2)then - ! D type AO - if(ao_power(i,1)==2)then - give_ao_character_space = 'XX ' - elseif(ao_power(i,2) == 2)then - give_ao_character_space = 'YY ' - elseif(ao_power(i,3) == 2)then - give_ao_character_space = 'ZZ ' - elseif(ao_power(i,1) == 1 .and. ao_power(i,2) == 1)then - give_ao_character_space = 'XY ' - elseif(ao_power(i,1) == 1 .and. ao_power(i,3) == 1)then - give_ao_character_space = 'XZ ' - else - give_ao_character_space = 'YZ ' - endif - elseif(ao_l(i) == 3)then - ! F type AO - if(ao_power(i,1)==3)then - give_ao_character_space = 'XXX ' - elseif(ao_power(i,2) == 3)then - give_ao_character_space = 'YYY ' - elseif(ao_power(i,3) == 3)then - give_ao_character_space = 'ZZZ ' - elseif(ao_power(i,1) == 2 .and. ao_power(i,2) == 1)then - give_ao_character_space = 'XXY ' - elseif(ao_power(i,1) == 2 .and. ao_power(i,3) == 1)then - give_ao_character_space = 'XXZ ' - elseif(ao_power(i,2) == 2 .and. ao_power(i,1) == 1)then - give_ao_character_space = 'YYX ' - elseif(ao_power(i,2) == 2 .and. ao_power(i,3) == 1)then - give_ao_character_space = 'YYZ ' - elseif(ao_power(i,3) == 2 .and. ao_power(i,1) == 1)then - give_ao_character_space = 'ZZX ' - elseif(ao_power(i,3) == 2 .and. ao_power(i,2) == 1)then - give_ao_character_space = 'ZZY ' - elseif(ao_power(i,3) == 1 .and. ao_power(i,2) == 1 .and. ao_power(i,3) == 1)then - give_ao_character_space = 'XYZ ' - endif - elseif(ao_l(i) == 4)then - ! G type AO - if(ao_power(i,1)==4)then - give_ao_character_space = 'XXXX' - elseif(ao_power(i,2) == 4)then - give_ao_character_space = 'YYYY' - elseif(ao_power(i,3) == 4)then - give_ao_character_space = 'ZZZZ' - elseif(ao_power(i,1) == 3 .and. ao_power(i,2) == 1)then - give_ao_character_space = 'XXXY' - elseif(ao_power(i,1) == 3 .and. ao_power(i,3) == 1)then - give_ao_character_space = 'XXXZ' - elseif(ao_power(i,2) == 3 .and. ao_power(i,1) == 1)then - give_ao_character_space = 'YYYX' - elseif(ao_power(i,2) == 3 .and. ao_power(i,3) == 1)then - give_ao_character_space = 'YYYZ' - elseif(ao_power(i,3) == 3 .and. ao_power(i,1) == 1)then - give_ao_character_space = 'ZZZX' - elseif(ao_power(i,3) == 3 .and. ao_power(i,2) == 1)then - give_ao_character_space = 'ZZZY' - elseif(ao_power(i,1) == 2 .and. ao_power(i,2) == 2)then - give_ao_character_space = 'XXYY' - elseif(ao_power(i,2) == 2 .and. ao_power(i,3) == 2)then - give_ao_character_space = 'YYZZ' - elseif(ao_power(i,1) == 2 .and. ao_power(i,2) == 1 .and. ao_power(i,3) == 1)then - give_ao_character_space = 'XXYZ' - elseif(ao_power(i,2) == 2 .and. ao_power(i,1) == 1 .and. ao_power(i,3) == 1)then - give_ao_character_space = 'YYXZ' - elseif(ao_power(i,3) == 2 .and. ao_power(i,1) == 1 .and. ao_power(i,2) == 1)then - give_ao_character_space = 'ZZXY' - endif - endif - ao_l_char_space(i) = give_ao_character_space - enddo -END_PROVIDER diff --git a/plugins/Molden/print_mo.irp.f b/plugins/Molden/print_mo.irp.f index b147fe50..6ac51bdb 100644 --- a/plugins/Molden/print_mo.irp.f +++ b/plugins/Molden/print_mo.irp.f @@ -104,6 +104,8 @@ subroutine write_Ao_basis(i_unit_output) write(i_unit_output,*)'' write(i_unit_output,'(A47,2X,I3)')'TOTAL NUMBER OF BASIS SET SHELLS =', i_shell write(i_unit_output,'(A47,2X,I3)')'NUMBER OF CARTESIAN GAUSSIAN BASIS FUNCTIONS =', ao_num +! this is for the new version of molden + write(i_unit_output,'(A12)')'PP =NONE' write(i_unit_output,*)'' @@ -126,7 +128,9 @@ subroutine write_Mo_basis(i_unit_output) write(i_unit_output,'(18X,F8.5)')-1.d0 write(i_unit_output,*)'' do i = 1, ao_num - write(i_unit_output,'(2X,I3, 2X A1, I3, 2X A4 , F9.6)')i,trim(element_name(int(nucl_charge(ao_nucl(i))))),ao_nucl(i),(ao_l_char_space(i)),mo_coef(i,j) +! write(i_unit_output,'(2X,I3, 2X A1, I3, 2X A4 , F9.6)')i,trim(element_name(int(nucl_charge(ao_nucl(i))))),ao_nucl(i),(ao_l_char_space(i)),mo_coef(i,j) +! F12.6 for larger coefficients... + write(i_unit_output,'(2X,I3, 2X A1, I3, 2X A4 , F12.6)')i,trim(element_name(int(nucl_charge(ao_nucl(i))))),ao_nucl(i),(ao_l_char_space(i)),mo_coef(i,j) ! write(i_unit_output,'(I3, X A1, X I3, X A4 X F16.8)')i,trim(element_name(int(nucl_charge(ao_nucl(i))))),ao_nucl(i),(ao_l_char_space(i)) enddo write(i_unit_output,*)'' diff --git a/plugins/Perturbation/pt2_equations.irp.f b/plugins/Perturbation/pt2_equations.irp.f index e990a37c..e406cd03 100644 --- a/plugins/Perturbation/pt2_equations.irp.f +++ b/plugins/Perturbation/pt2_equations.irp.f @@ -125,6 +125,8 @@ subroutine pt2_moller_plesset ($arguments) delta_e = (Fock_matrix_diag_mo(h1) - Fock_matrix_diag_mo(p1)) + & (Fock_matrix_diag_mo(h2) - Fock_matrix_diag_mo(p2)) delta_e = 1.d0/delta_e +! print*,'h1,p1',h1,p1 +! print*,'h2,p2',h2,p2 else if (degree == 1) then call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) delta_e = Fock_matrix_diag_mo(h1) - Fock_matrix_diag_mo(p1) diff --git a/plugins/Properties/hyperfine_constants.irp.f b/plugins/Properties/hyperfine_constants.irp.f index c1d88d2c..e31b3ba4 100644 --- a/plugins/Properties/hyperfine_constants.irp.f +++ b/plugins/Properties/hyperfine_constants.irp.f @@ -133,3 +133,16 @@ END_PROVIDER enddo END_PROVIDER + + +subroutine print_hcc + implicit none + double precision :: accu + integer :: i,j + print*,'Z AU GAUSS MHZ cm^-1' + do i = 1, nucl_num + write(*,'(I2,X,F3.1,X,4(F16.6,X))')i,nucl_charge(i),spin_density_at_nucleous(i),iso_hcc_gauss(i),iso_hcc_mhz(i),iso_hcc_cm_1(i) + enddo + +end + diff --git a/plugins/Properties/mulliken.irp.f b/plugins/Properties/mulliken.irp.f index d56c9a44..cc0a2f8e 100644 --- a/plugins/Properties/mulliken.irp.f +++ b/plugins/Properties/mulliken.irp.f @@ -105,3 +105,34 @@ END_PROVIDER enddo END_PROVIDER + + +subroutine print_mulliken_sd + implicit none + double precision :: accu + integer :: i + integer :: j + print*,'Mulliken spin densities' + accu= 0.d0 + do i = 1, nucl_num + print*,i,nucl_charge(i),mulliken_spin_densities(i) + accu += mulliken_spin_densities(i) + enddo + print*,'Sum of Mulliken SD = ',accu + print*,'AO SPIN POPULATIONS' + accu = 0.d0 + do i = 1, ao_num + accu += spin_gross_orbital_product(i) + write(*,'(X,I3,X,A4,X,I2,X,A4,X,F10.7)')i,trim(element_name(int(nucl_charge(ao_nucl(i))))),ao_nucl(i),trim(l_to_charater(ao_l(i))),spin_gross_orbital_product(i) + enddo + print*,'sum = ',accu + accu = 0.d0 + print*,'Angular momentum analysis' + do i = 0, ao_l_max + accu += spin_population_angular_momentum(i) + print*,' ',trim(l_to_charater(i)),spin_population_angular_momentum(i) + print*,'sum = ',accu + enddo + +end + diff --git a/plugins/Properties/print_hcc.irp.f b/plugins/Properties/print_hcc.irp.f index f0091e1e..45bca5e6 100644 --- a/plugins/Properties/print_hcc.irp.f +++ b/plugins/Properties/print_hcc.irp.f @@ -1,17 +1,6 @@ -program print_hcc +program print_hcc_main implicit none read_wf = .True. touch read_wf - call test + call print_hcc end -subroutine test - implicit none - double precision :: accu - integer :: i,j - print*,'Z AU GAUSS MHZ cm^-1' - do i = 1, nucl_num - write(*,'(I2,X,F3.1,X,4(F16.6,X))')i,nucl_charge(i),spin_density_at_nucleous(i),iso_hcc_gauss(i),iso_hcc_mhz(i),iso_hcc_cm_1(i) - enddo - -end - diff --git a/plugins/Properties/print_mulliken.irp.f b/plugins/Properties/print_mulliken.irp.f index 100c8556..d4be534a 100644 --- a/plugins/Properties/print_mulliken.irp.f +++ b/plugins/Properties/print_mulliken.irp.f @@ -2,34 +2,5 @@ program print_mulliken implicit none read_wf = .True. touch read_wf - print*,'Mulliken spin densities' - - call test + call print_mulliken_sd end -subroutine test - double precision :: accu - integer :: i - integer :: j - accu= 0.d0 - do i = 1, nucl_num - print*,i,nucl_charge(i),mulliken_spin_densities(i) - accu += mulliken_spin_densities(i) - enddo - print*,'Sum of Mulliken SD = ',accu - print*,'AO SPIN POPULATIONS' - accu = 0.d0 - do i = 1, ao_num - accu += spin_gross_orbital_product(i) - write(*,'(X,I3,X,A4,X,I2,X,A4,X,F10.7)')i,trim(element_name(int(nucl_charge(ao_nucl(i))))),ao_nucl(i),trim(l_to_charater(ao_l(i))),spin_gross_orbital_product(i) - enddo - print*,'sum = ',accu - accu = 0.d0 - print*,'Angular momentum analysis' - do i = 0, ao_l_max - accu += spin_population_angular_momentum(i) - print*,' ',trim(l_to_charater(i)),spin_population_angular_momentum(i) - print*,'sum = ',accu - enddo - -end - diff --git a/plugins/QmcChem/e_curve_qmc.irp.f b/plugins/QmcChem/e_curve_qmc.irp.f new file mode 100644 index 00000000..4beed3fa --- /dev/null +++ b/plugins/QmcChem/e_curve_qmc.irp.f @@ -0,0 +1,102 @@ +program e_curve + use bitmasks + implicit none + integer :: i,j,k, nab, m, l + double precision :: norm, E, hij, num, ci, cj + integer, allocatable :: iorder(:) + double precision , allocatable :: norm_sort(:) + nab = n_det_alpha_unique+n_det_beta_unique + allocate ( norm_sort(0:nab), iorder(0:nab) ) + + + norm_sort(0) = 0.d0 + iorder(0) = 0 + do i=1,n_det_alpha_unique + norm_sort(i) = det_alpha_norm(i) + iorder(i) = i + enddo + + do i=1,n_det_beta_unique + norm_sort(i+n_det_alpha_unique) = det_beta_norm(i) + iorder(i+n_det_alpha_unique) = -i + enddo + + call dsort(norm_sort(1),iorder(1),nab) + + if (.not.read_wf) then + stop 'Please set read_wf to true' + endif + + PROVIDE psi_bilinear_matrix_values nuclear_repulsion + print *, '' + print *, '==============================' + print *, 'Energies at different cut-offs' + print *, '==============================' + print *, '' + print *, '==========================================================' + print '(A8,2X,A8,2X,A12,2X,A10,2X,A12)', 'Thresh.', 'Ndet', 'Cost', 'Norm', 'E' + print *, '==========================================================' + double precision :: thresh + integer(bit_kind), allocatable :: det_i(:,:), det_j(:,:) + thresh = 1.d-10 + do j=0,nab + i = iorder(j) + if (i<0) then + do k=1,n_det + if (psi_bilinear_matrix_columns(k) == -i) then + psi_bilinear_matrix_values(k,1) = 0.d0 + endif + enddo + else + do k=1,n_det + if (psi_bilinear_matrix_rows(k) == i) then + psi_bilinear_matrix_values(k,1) = 0.d0 + endif + enddo + endif + if (thresh > norm_sort(j)) then + cycle + endif + num = 0.d0 + norm = 0.d0 + m = 0 + !$OMP PARALLEL DEFAULT(SHARED) PRIVATE(k,l,det_i,det_j,ci,cj,hij) REDUCTION(+:norm,m,num) + allocate( det_i(N_int,2), det_j(N_int,2)) + !$OMP DO SCHEDULE(guided) + do k=1,n_det + if (psi_bilinear_matrix_values(k,1) == 0.d0) then + cycle + endif + ci = psi_bilinear_matrix_values(k,1) + det_i(:,1) = psi_det_alpha_unique(:,psi_bilinear_matrix_rows(k)) + det_i(:,2) = psi_det_beta_unique(:,psi_bilinear_matrix_columns(k)) + do l=1,n_det + if (psi_bilinear_matrix_values(l,1) == 0.d0) then + cycle + endif + cj = psi_bilinear_matrix_values(l,1) + det_j(:,1) = psi_det_alpha_unique(:,psi_bilinear_matrix_rows(l)) + det_j(:,2) = psi_det_beta_unique(:,psi_bilinear_matrix_columns(l)) + call i_h_j(det_i, det_j, N_int, hij) + num = num + ci*cj*hij + enddo + norm = norm + ci*ci + m = m+1 + enddo + !$OMP END DO + deallocate (det_i,det_j) + !$OMP END PARALLEL + if (m == 0) then + exit + endif + E = num / norm + nuclear_repulsion + print '(E9.1,2X,I8,2X,F10.2,2X,F10.8,2X,F12.6)', thresh, m, & + dble( elec_alpha_num**3 + elec_alpha_num**2 * (nab-1) ) / & + dble( elec_alpha_num**3 + elec_alpha_num**2 * (j-1)), norm, E + thresh = thresh * 2.d0 + enddo + print *, '==========================================================' + + deallocate (iorder, norm_sort) +end + diff --git a/plugins/QmcChem/save_for_qmcchem.irp.f b/plugins/QmcChem/save_for_qmcchem.irp.f index c8ddb4d9..a281a184 100644 --- a/plugins/QmcChem/save_for_qmcchem.irp.f +++ b/plugins/QmcChem/save_for_qmcchem.irp.f @@ -1,9 +1,46 @@ program save_for_qmc - read_wf = .True. - TOUCH read_wf - print *, "N_det = ", N_det - call write_spindeterminants - if (do_pseudo) then - call write_pseudopotential - endif + + integer :: iunit + integer, external :: get_unit_and_open + logical :: exists + double precision :: e_ref + + ! Determinants + read_wf = .True. + TOUCH read_wf + print *, "N_det = ", N_det + call write_spindeterminants + + ! Reference Energy + if (do_pseudo) then + call write_pseudopotential + endif + call system( & + 'mkdir -p '//trim(ezfio_filename)//'/simulation ;' // & + 'cp '//trim(ezfio_filename)//'/.version '//trim(ezfio_filename)//'/simulation/.version ; ' // & + 'mkdir -p '//trim(ezfio_filename)//'/properties ;' // & + 'cp '//trim(ezfio_filename)//'/.version '//trim(ezfio_filename)//'/properties/.version ; ' // & + 'echo T > '//trim(ezfio_filename)//'/properties/e_loc' & + ) + iunit = 13 + open(unit=iunit,file=trim(ezfio_filename)//'/simulation/e_ref',action='write') + call ezfio_has_full_ci_energy_pt2(exists) + if (exists) then + call ezfio_get_full_ci_energy_pt2(e_ref) + else + call ezfio_has_full_ci_energy(exists) + if (exists) then + call ezfio_get_full_ci_energy(e_ref) + else + call ezfio_has_hartree_fock_energy(exists) + if (exists) then + call ezfio_get_hartree_fock_energy(e_ref) + else + e_ref = 0.d0 + endif + endif + endif + write(iunit,*) e_ref + close(iunit) + end diff --git a/plugins/loc_cele/loc.f b/plugins/loc_cele/loc.f index 575932a3..edc3aa7a 100644 --- a/plugins/loc_cele/loc.f +++ b/plugins/loc_cele/loc.f @@ -17,9 +17,11 @@ C data small/1.d-6/ zprt=.true. - niter=500 + niter=1000000 conv=1.d-8 +C niter=1000000 +C conv=1.d-6 write (6,5) n,m,conv 5 format (//5x,'Unitary transformation of',i3,' vectors'/ * 5x,'following the principle of maximum overlap with a set of', diff --git a/plugins/loc_cele/loc_cele.irp.f b/plugins/loc_cele/loc_cele.irp.f index e9c26f9d..c9036aa1 100644 --- a/plugins/loc_cele/loc_cele.irp.f +++ b/plugins/loc_cele/loc_cele.irp.f @@ -92,13 +92,182 @@ - nrot(1) = 6 ! number of orbitals to be localized + nrot(1) = 64 ! number of orbitals to be localized integer :: index_rot(1000,1) cmoref = 0.d0 + irot = 0 + +! H2 molecule for the mixed localization + do i=1,64 + irot(i,1) = i+2 + enddo + + do i=1,17 + cmoref(i+1,i,1)=1.d0 + enddo + cmoref(19,19-1,1)=1.d0 + cmoref(20,19-1,1)=-1.d0 + cmoref(19,20-1,1)=-1.d0 + cmoref(20,20-1,1)=-1.d0 + cmoref(21,20-1,1)=2.d0 + cmoref(22,21-1,1)=1.d0 + cmoref(23,22-1,1)=1.d0 + cmoref(24,23-1,1)=1.d0 + + + cmoref(25,24-1,1)=1.d0 + cmoref(26,24-1,1)=-1.d0 + cmoref(25,25-1,1)=-1.d0 + cmoref(26,25-1,1)=-1.d0 + cmoref(27,25-1,1)=2.d0 + cmoref(28,26-1,1)=1.d0 + cmoref(29,27-1,1)=1.d0 + cmoref(30,28-1,1)=1.d0 + + cmoref(31,29-1,1)=1.d0 + cmoref(32,29-1,1)=-1.d0 + cmoref(31,30-1,1)=-1.d0 + cmoref(32,30-1,1)=-1.d0 + cmoref(33,30-1,1)=2.d0 + cmoref(34,31-1,1)=1.d0 + cmoref(35,32-1,1)=1.d0 + cmoref(36,33-1,1)=1.d0 + + do i=33,49 + cmoref(i+5,i,1)= 1.d0 + enddo + + cmoref(55,52-2,1)=1.d0 + cmoref(56,52-2,1)=-1.d0 + cmoref(55,53-2,1)=-1.d0 + cmoref(56,53-2,1)=-1.d0 + cmoref(57,53-2,1)=2.d0 + cmoref(58,54-2,1)=1.d0 + cmoref(59,55-2,1)=1.d0 + cmoref(60,56-2,1)=1.d0 + + cmoref(61,57-2,1)=1.d0 + cmoref(62,57-2,1)=-1.d0 + cmoref(61,58-2,1)=-1.d0 + cmoref(62,58-2,1)=-1.d0 + cmoref(63,58-2,1)=2.d0 + cmoref(64,59-2,1)=1.d0 + cmoref(65,60-2,1)=1.d0 + cmoref(66,61-2,1)=1.d0 + + cmoref(67,62-2,1)=1.d0 + cmoref(68,62-2,1)=-1.d0 + cmoref(67,63-2,1)=-1.d0 + cmoref(68,63-2,1)=-1.d0 + cmoref(69,63-2,1)=2.d0 + cmoref(70,64-2,1)=1.d0 + cmoref(71,65-2,1)=1.d0 + cmoref(72,66-2,1)=1.d0 +! H2 molecule +! do i=1,66 +! irot(i,1) = i +! enddo +! +! do i=1,18 +! cmoref(i,i,1)=1.d0 +! enddo +! cmoref(19,19,1)=1.d0 +! cmoref(20,19,1)=-1.d0 +! cmoref(19,20,1)=-1.d0 +! cmoref(20,20,1)=-1.d0 +! cmoref(21,20,1)=2.d0 +! cmoref(22,21,1)=1.d0 +! cmoref(23,22,1)=1.d0 +! cmoref(24,23,1)=1.d0 +! +! +! cmoref(25,24,1)=1.d0 +! cmoref(26,24,1)=-1.d0 +! cmoref(25,25,1)=-1.d0 +! cmoref(26,25,1)=-1.d0 +! cmoref(27,25,1)=2.d0 +! cmoref(28,26,1)=1.d0 +! cmoref(29,27,1)=1.d0 +! cmoref(30,28,1)=1.d0 +! +! cmoref(31,29,1)=1.d0 +! cmoref(32,29,1)=-1.d0 +! cmoref(31,30,1)=-1.d0 +! cmoref(32,30,1)=-1.d0 +! cmoref(33,30,1)=2.d0 +! cmoref(34,31,1)=1.d0 +! cmoref(35,32,1)=1.d0 +! cmoref(36,33,1)=1.d0 +! +! do i=34,51 +! cmoref(i+3,i,1)= 1.d0 +! enddo +! +! cmoref(55,52,1)=1.d0 +! cmoref(56,52,1)=-1.d0 +! cmoref(55,53,1)=-1.d0 +! cmoref(56,53,1)=-1.d0 +! cmoref(57,53,1)=2.d0 +! cmoref(58,54,1)=1.d0 +! cmoref(59,55,1)=1.d0 +! cmoref(60,56,1)=1.d0 +! +! cmoref(61,57,1)=1.d0 +! cmoref(62,57,1)=-1.d0 +! cmoref(61,58,1)=-1.d0 +! cmoref(62,58,1)=-1.d0 +! cmoref(63,58,1)=2.d0 +! cmoref(64,59,1)=1.d0 +! cmoref(65,60,1)=1.d0 +! cmoref(66,61,1)=1.d0 +! +! cmoref(67,62,1)=1.d0 +! cmoref(68,62,1)=-1.d0 +! cmoref(67,63,1)=-1.d0 +! cmoref(68,63,1)=-1.d0 +! cmoref(69,63,1)=2.d0 +! cmoref(70,64,1)=1.d0 +! cmoref(71,65,1)=1.d0 +! cmoref(72,66,1)=1.d0 +! H atom +! do i=1,33 +! irot(i,1) = i +! enddo +! +! do i=1,18 +! cmoref(i,i,1)=1.d0 +! enddo +! cmoref(19,19,1)=1.d0 +! cmoref(20,19,1)=-1.d0 +! cmoref(19,20,1)=-1.d0 +! cmoref(20,20,1)=-1.d0 +! cmoref(21,20,1)=2.d0 +! cmoref(22,21,1)=1.d0 +! cmoref(23,22,1)=1.d0 +! cmoref(24,23,1)=1.d0 + + +! cmoref(25,24,1)=1.d0 +! cmoref(26,24,1)=-1.d0 +! cmoref(25,25,1)=-1.d0 +! cmoref(26,25,1)=-1.d0 +! cmoref(27,25,1)=2.d0 +! cmoref(28,26,1)=1.d0 +! cmoref(29,27,1)=1.d0 +! cmoref(30,28,1)=1.d0 +! +! cmoref(31,29,1)=1.d0 +! cmoref(32,29,1)=-1.d0 +! cmoref(31,30,1)=-1.d0 +! cmoref(32,30,1)=-1.d0 +! cmoref(33,30,1)=2.d0 +! cmoref(34,31,1)=1.d0 +! cmoref(35,32,1)=1.d0 +! cmoref(36,33,1)=1.d0 ! Definition of the index of the MO to be rotated ! irot(2,1) = 21 ! the first mo to be rotated is the 21 th MO @@ -106,25 +275,67 @@ ! irot(4,1) = 23 ! ! irot(5,1) = 24 ! ! irot(6,1) = 25 ! -! do i = 1,12 -! irot(i,1) = i+6 -! enddo - irot(1,1) = 5 - irot(2,1) = 6 - irot(3,1) = 7 - irot(4,1) = 8 - irot(5,1) = 9 - irot(6,1) = 10 + +!N2 +! irot(1,1) = 5 +! irot(2,1) = 6 +! irot(3,1) = 7 +! irot(4,1) = 8 +! irot(5,1) = 9 +! irot(6,1) = 10 +! +! cmoref(5,1,1) = 1.d0 ! +! cmoref(6,2,1) = 1.d0 ! +! cmoref(7,3,1) = 1.d0 ! +! cmoref(40,4,1) = 1.d0 ! +! cmoref(41,5,1) = 1.d0 ! +! cmoref(42,6,1) = 1.d0 ! +!END N2 + +!HEXATRIENE +! irot(1,1) = 20 +! irot(2,1) = 21 +! irot(3,1) = 22 +! irot(4,1) = 23 +! irot(5,1) = 24 +! irot(6,1) = 25 +! +! cmoref(7,1,1) = 1.d0 ! +! cmoref(26,1,1) = 1.d0 ! +! cmoref(45,2,1) = 1.d0 ! +! cmoref(64,2,1) = 1.d0 ! +! cmoref(83,3,1) = 1.d0 ! +! cmoref(102,3,1) = 1.d0 ! +! cmoref(7,4,1) = 1.d0 ! +! cmoref(26,4,1) = -1.d0 ! +! cmoref(45,5,1) = 1.d0 ! +! cmoref(64,5,1) = -1.d0 ! +! cmoref(83,6,1) = 1.d0 ! +! cmoref(102,6,1) = -1.d0 ! +!END HEXATRIENE + +!!!!H2 H2 CAS +! irot(1,1) = 1 +! irot(2,1) = 2 +! +! cmoref(1,1,1) = 1.d0 +! cmoref(37,2,1) = 1.d0 +!END H2 +!!!! LOCALIZATION ON THE BASIS FUNCTIONS +! do i = 1, nrot(1) +! irot(i,1) = i +! cmoref(i,i,1) = 1.d0 +! enddo + +!END BASISLOC + +! do i = 1, nrot(1) +! irot(i,1) = 4+i +! enddo do i = 1, nrot(1) print*,'irot(i,1) = ',irot(i,1) enddo - pause - cmoref(4,1,1) = 1.d0 ! 2S function - cmoref(5,2,1) = 1.d0 ! 2S function - cmoref(6,3,1) = 1.d0 ! 2S function - cmoref(19,4,1) = 1.d0 ! 2S function - cmoref(20,5,1) = 1.d0 ! 2S function - cmoref(21,6,1) = 1.d0 ! 2S function +! pause ! you define the guess vectors that you want ! the new MO to be close to @@ -138,233 +349,21 @@ ! own guess vectors for the MOs ! The new MOs are provided in output ! in the same order than the guess MOs - - ! C-C bonds - ! 1-2 -! i_atom = 1 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,1,1) = -0.012d0 ! 2S function -! cmoref(2+shift,1,1) = 0.18d0 ! -! cmoref(3+shift,1,1) = 0.1d0 ! - -! cmoref(5+shift,1,1) = -0.1d0 ! 2pX function -! cmoref(6+shift,1,1) = -0.1d0 ! 2pZ function - -! i_atom = 2 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,1,1) = -0.012d0 ! 2S function -! cmoref(2+shift,1,1) = 0.18d0 ! -! cmoref(3+shift,1,1) = 0.1d0 ! - -! cmoref(5+shift,1,1) = 0.1d0 ! 2pX function -! cmoref(6+shift,1,1) = 0.1d0 ! 2pZ function - - -! ! 1-3 -! i_atom = 1 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,2,1) = -0.012d0 ! 2S function -! cmoref(2+shift,2,1) = 0.18d0 ! -! cmoref(3+shift,2,1) = 0.1d0 ! - -! cmoref(5+shift,2,1) = 0.1d0 ! 2pX function -! cmoref(6+shift,2,1) = -0.1d0 ! 2pZ function - -! i_atom = 3 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,2,1) = -0.012d0 ! 2S function -! cmoref(2+shift,2,1) = 0.18d0 ! -! cmoref(3+shift,2,1) = 0.1d0 ! - -! cmoref(5+shift,2,1) = -0.1d0 ! 2pX function -! cmoref(6+shift,2,1) = 0.1d0 ! 2pZ function - -! ! 4-6 -! i_atom = 4 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,3,1) = -0.012d0 ! 2S function -! cmoref(2+shift,3,1) = 0.18d0 ! -! cmoref(3+shift,3,1) = 0.1d0 ! - -! cmoref(5+shift,3,1) = 0.1d0 ! 2pX function -! cmoref(6+shift,3,1) = -0.1d0 ! 2pZ function - -! i_atom = 6 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,3,1) = -0.012d0 ! 2S function -! cmoref(2+shift,3,1) = 0.18d0 ! -! cmoref(3+shift,3,1) = 0.1d0 ! - -! cmoref(5+shift,3,1) = -0.1d0 ! 2pX function -! cmoref(6+shift,3,1) = 0.1d0 ! 2pZ function - - -! ! 6-5 -! i_atom = 6 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,4,1) = -0.012d0 ! 2S function -! cmoref(2+shift,4,1) = 0.18d0 ! -! cmoref(3+shift,4,1) = 0.1d0 ! - -! cmoref(5+shift,4,1) = 0.1d0 ! 2pX function -! cmoref(6+shift,4,1) = 0.1d0 ! 2pZ function - -! i_atom = 5 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,4,1) = -0.012d0 ! 2S function -! cmoref(2+shift,4,1) = 0.18d0 ! -! cmoref(3+shift,4,1) = 0.1d0 ! - -! cmoref(5+shift,4,1) = -0.1d0 ! 2pX function -! cmoref(6+shift,4,1) = -0.1d0 ! 2pZ function - - -! ! 2-4 -! i_atom = 2 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,5,1) = -0.012d0 ! 2S function -! cmoref(2+shift,5,1) = 0.18d0 ! -! cmoref(3+shift,5,1) = 0.1d0 ! - -! cmoref(6+shift,5,1) = 0.1d0 ! 2pZ function - -! i_atom = 4 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,5,1) = -0.012d0 ! 2S function -! cmoref(2+shift,5,1) = 0.18d0 ! -! cmoref(3+shift,5,1) = 0.1d0 ! - -! cmoref(6+shift,5,1) = -0.1d0 ! 2pZ function - - -! ! 3-5 -! i_atom = 3 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,6,1) = -0.012d0 ! 2S function -! cmoref(2+shift,6,1) = 0.18d0 ! -! cmoref(3+shift,6,1) = 0.1d0 ! - -! cmoref(6+shift,6,1) = 0.1d0 ! 2pZ function - -! i_atom = 5 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,6,1) = -0.012d0 ! 2S function -! cmoref(2+shift,6,1) = 0.18d0 ! -! cmoref(3+shift,6,1) = 0.1d0 ! - -! cmoref(6+shift,6,1) = -0.1d0 ! 2pZ function - -! ! C-H bonds -! ! 2-7 -! i_atom = 2 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,7,1) = -0.012d0 ! 2S function -! cmoref(2+shift,7,1) = 0.18d0 ! -! cmoref(3+shift,7,1) = 0.1d0 ! - -! cmoref(5+shift,7,1) = -0.1d0 ! 2pX function -! cmoref(6+shift,7,1) = 0.1d0 ! 2pZ function -! -! i_atom = 7 -! shift_h = (6-1) * 15 + (i_atom - 6)*5 -! cmoref(1+shift_h,7,1) = 0.12d0 ! 1S function - -! ! 4-10 -! i_atom = 4 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,8,1) = -0.012d0 ! 2S function -! cmoref(2+shift,8,1) = 0.18d0 ! -! cmoref(3+shift,8,1) = 0.1d0 ! - -! cmoref(5+shift,8,1) = -0.1d0 ! 2pX function -! cmoref(6+shift,8,1) = -0.1d0 ! 2pZ function -! -! i_atom = 10 -! shift_h = (6-1) * 15 + (i_atom - 6)*5 -! cmoref(1+shift_h,8,1) = 0.12d0 ! 1S function - -! ! 5-11 -! i_atom = 5 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,9,1) = -0.012d0 ! 2S function -! cmoref(2+shift,9,1) = 0.18d0 ! -! cmoref(3+shift,9,1) = 0.1d0 ! - -! cmoref(5+shift,9,1) = 0.1d0 ! 2pX function -! cmoref(6+shift,9,1) = -0.1d0 ! 2pZ function -! -! i_atom = 11 -! shift_h = (6-1) * 15 + (i_atom - 6)*5 -! cmoref(1+shift_h,9,1) = 0.12d0 ! 1S function - -! ! 3-8 -! i_atom = 3 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,10,1) = -0.012d0 ! 2S function -! cmoref(2+shift,10,1) = 0.18d0 ! -! cmoref(3+shift,10,1) = 0.1d0 ! -! -! cmoref(5+shift,10,1) = 0.1d0 ! 2pX function -! cmoref(6+shift,10,1) = 0.1d0 ! 2pZ function -! -! i_atom = 8 -! shift_h = (6-1) * 15 + (i_atom - 6)*5 -! cmoref(1+shift_h,10,1) = 0.12d0 ! 1S function - -! ! 1-9 -! i_atom = 1 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,11,1) = -0.012d0 ! 2S function -! cmoref(2+shift,11,1) = 0.18d0 ! -! cmoref(3+shift,11,1) = 0.1d0 ! -! -! cmoref(6+shift,11,1) = 0.1d0 ! 2pZ function - -! i_atom = 9 -! shift_h = (6-1) * 15 + (i_atom - 6)*5 -! cmoref(1+shift_h,11,1) = 0.12d0 ! 1S function - -! -! ! 6-12 -! i_atom = 6 -! shift = (i_atom -1) * 15 -! cmoref(1+shift,12,1) = -0.012d0 ! 2S function -! cmoref(2+shift,12,1) = 0.18d0 ! -! cmoref(3+shift,12,1) = 0.1d0 ! -! -! cmoref(6+shift,12,1) = -0.1d0 ! 2pZ function - -! i_atom = 12 -! shift_h = (6-1) * 15 + (i_atom - 6)*5 -! cmoref(1+shift_h,12,1) = 0.12d0 ! 1S function -! cmoref(12,1,1) = 1.d0 ! - -! cmoref(21,2,1) = 1.d0 ! -! cmoref(30,2,1) = 1.d0 ! - -! cmoref(39,3,1) = 1.d0 ! -! cmoref(48,3,1) = 1.d0 ! - -! cmoref(3,4,1) = 1.d0 ! -! cmoref(12,4,1) =-1.d0 ! - -! cmoref(21,5,1) = 1.d0 ! -! cmoref(30,5,1) =-1.d0 ! - -! cmoref(39,6,1) = 1.d0 ! -! cmoref(48,6,1) =-1.d0 ! +! do i = 1, nrot(1) +! j = 5+(i-1)*15 +! cmoref(j,i,1) = 0.2d0 +! cmoref(j+3,i,1) = 0.12d0 +! print*,'j = ',j +! enddo +! pause print*,'passed the definition of the referent vectors ' - !Building the S (overlap) matrix in the AO basis. - - - do i = 1, ao_num - do j = 1, ao_num - s(i,j,1) = ao_overlap(i,j) + do j =1, ao_num + s(i,j,1) = ao_overlap(i,j) enddo enddo !Now big loop over symmetry @@ -398,20 +397,13 @@ ! do i=1,nmo(isym) - do i=1,ao_num - do j=1,nrot(isym) - - ddum(i,j)=0.d0 - - do k=1,ao_num - - ddum(i,j)=ddum(i,j)+s(i,k,isym)*cmo(k,irot(j,isym),isym) - - enddo - - enddo - + do i=1,ao_num + ddum(i,j)=0.d0 + do k=1,ao_num + ddum(i,j)=ddum(i,j)+s(i,k,isym)*cmo(k,irot(j,isym),isym) + enddo + enddo enddo @@ -441,7 +433,7 @@ do i=1,nrot(isym) do j=1,ao_num - write (6,*) 'isym,',isym,nrot(isym),nmo(isym) +! write (6,*) 'isym,',isym,nrot(isym),nmo(isym) newcmo(j,irot(i,isym),isym)=0.d0 do k=1,nrot(isym) newcmo(j,irot(i,isym),isym)=newcmo(j,irot(i,isym),isym) + cmo(j,irot(k,isym),isym)*t(k,i) @@ -459,7 +451,7 @@ enddo !big loop over symmetry - 10 format (4E20.12) + 10 format (4E18.12) ! Now we copyt the newcmo into the mo_coef @@ -472,9 +464,7 @@ enddo enddo enddo -! if(dabs(newcmo(3,19,1) - mo_coef(3,19)) .gt.1.d-10 )then - print*,'mo_coef(3,19)',mo_coef(3,19) - pause +! pause ! we say that it hase been touched, and valid and that everything that diff --git a/plugins/qmcpack/qp_convert_qmcpack_to_ezfio.py b/plugins/qmcpack/qp_convert_qmcpack_to_ezfio.py index 0dc99029..e911af28 100755 --- a/plugins/qmcpack/qp_convert_qmcpack_to_ezfio.py +++ b/plugins/qmcpack/qp_convert_qmcpack_to_ezfio.py @@ -183,6 +183,9 @@ def get_nb_permutation(str_): def order_l_l_sym(l_l_sym): + + l_order_mo = [i for i,_ in enumerate(l_l_sym)] + n = 1 for i in range(len(l_l_sym)): if n != 1: @@ -192,11 +195,11 @@ def order_l_l_sym(l_l_sym): l = l_l_sym[i] n = get_nb_permutation(l[2]) - l_l_sym[i:i + n] = sorted(l_l_sym[i:i + n], - key=lambda x: x[2], - cmp=compare_gamess_style) + l_l_sym[i:i + n], l_order_mo[i:i+n] = zip(*sorted(zip(l_l_sym[i:i + n],l_order_mo[i:i+n]), + key=lambda x: x[0][2], + cmp=compare_gamess_style)) - return l_l_sym + return l_l_sym, l_order_mo #========================== @@ -205,8 +208,13 @@ def order_l_l_sym(l_l_sym): l_sym_without_header = sym_raw.split("\n")[3:-2] l_l_sym_raw = [i.split() for i in l_sym_without_header] +print len(l_l_sym_raw) + l_l_sym_expend_sym = expend_sym_l(l_l_sym_raw) -l_l_sym_ordered = order_l_l_sym(l_l_sym_expend_sym) +print len(l_l_sym_expend_sym) + +l_l_sym_ordered, l_order_mo = order_l_l_sym(l_l_sym_expend_sym) + #======== #MO COEF @@ -256,7 +264,7 @@ def print_mo_coef(mo_coef_block, l_l_sym): i_a = int(l[1]) - 1 sym = l[2] - print l_label[i_a], sym, " ".join('{: 3.8f}'.format(i) + print l_label[i_a], sym, " ".join('{0: 3.8f}'.format(i) for i in a[i]) if i_block != nb_block - 1: @@ -348,6 +356,7 @@ d_rep={"+":"1","-":"0"} det_without_header = det_raw[pos+2::] + for line_raw in det_without_header.split("\n"): line = line_raw @@ -355,8 +364,14 @@ for line_raw in det_without_header.split("\n"): try: float(line) except ValueError: + + print line_raw.strip(), len(line_raw.strip()) + print l_order_mo, len(l_order_mo) + + line_order = [line_raw[i] for i in l_order_mo] line= "".join([d_rep[x] if x in d_rep else x for x in line_raw]) print line.strip() print "END_DET" + diff --git a/scripts/compilation/qp_create_ninja.py b/scripts/compilation/qp_create_ninja.py index adcfb6f7..cc1c8aa8 100755 --- a/scripts/compilation/qp_create_ninja.py +++ b/scripts/compilation/qp_create_ninja.py @@ -37,7 +37,7 @@ from qp_path import QP_ROOT, QP_SRC, QP_EZFIO LIB = "" # join(QP_ROOT, "lib", "rdtsc.o") EZFIO_LIB = join(QP_ROOT, "lib", "libezfio_irp.a") -ZMQ_LIB = join(QP_ROOT, "lib", "libf77zmq.a") + " " + join(QP_ROOT, "lib", "libzmq.a") + " -lstdc++ -lrt" +ZMQ_LIB = join(QP_ROOT, "lib", "libf77zmq.a") + " " + join(QP_ROOT, "lib", "libzmq.a") + " -lstdc++ -lrt" ROOT_BUILD_NINJA = join(QP_ROOT, "config", "build.ninja") header = r"""# @@ -96,7 +96,8 @@ def ninja_create_env_variable(pwd_config_file): l_string.append(str_) lib_lapack = get_compilation_option(pwd_config_file, "LAPACK_LIB") - l_string.append("LIB = {0} {1} {2} {3}".format(LIB, lib_lapack, EZFIO_LIB, ZMQ_LIB)) + str_lib = " ".join([LIB, lib_lapack, EZFIO_LIB, ZMQ_LIB]) + l_string.append("LIB = {0} ".format(str_lib)) l_string.append("") @@ -387,6 +388,8 @@ def get_l_file_for_module(path_module): l_src.append(f) obj = '{0}.o'.format(os.path.splitext(f)[0]) l_obj.append(obj) + elif f.lower().endswith(".o"): + l_obj.append(join(path_module.abs, f)) elif f == "EZFIO.cfg": l_depend.append(join(path_module.abs, "ezfio_interface.irp.f")) diff --git a/scripts/ezfio_interface/ei_handler.py b/scripts/ezfio_interface/ei_handler.py index a3f3600b..d7cd9c95 100755 --- a/scripts/ezfio_interface/ei_handler.py +++ b/scripts/ezfio_interface/ei_handler.py @@ -345,7 +345,7 @@ def save_ezfio_provider(path_head, dict_code_provider): path = "{0}/ezfio_interface.irp.f".format(path_head) l_output = ["! DO NOT MODIFY BY HAND", - "! Created by $QP_ROOT/scripts/ezfio_interface.py", + "! Created by $QP_ROOT/scripts/ezfio_interface/ei_handler.py", "! from file {0}/EZFIO.cfg".format(path_head), "\n"] diff --git a/scripts/ezfio_interface/ezfio_generate_provider.py b/scripts/ezfio_interface/ezfio_generate_provider.py index 6cd919dc..89fdfa03 100755 --- a/scripts/ezfio_interface/ezfio_generate_provider.py +++ b/scripts/ezfio_interface/ezfio_generate_provider.py @@ -22,6 +22,7 @@ BEGIN_PROVIDER [ %(type)s, %(name)s %(size)s ] logical :: has PROVIDE ezfio_filename + %(test_null_size)s call ezfio_has_%(ezfio_dir)s_%(ezfio_name)s(has) if (has) then call ezfio_get_%(ezfio_dir)s_%(ezfio_name)s(%(name)s) @@ -44,6 +45,7 @@ END_PROVIDER def __repr__(self): self.set_write() + self.set_test_null_size() for v in self.values: if not v: msg = "Error : %s is not set in EZFIO.cfg" % (v) @@ -54,20 +56,31 @@ END_PROVIDER return self.data % self.__dict__ + def set_test_null_size(self): + if "size" not in self.__dict__: + self.__dict__["size"] = "" + if self.size != "": + self.test_null_size = "if (size(%s) == 0) return\n" % ( self.name ) + else: + self.test_null_size = "" + def set_write(self): self.write = "" - if self.type in self.write_correspondance: - write = self.write_correspondance[self.type] - output = self.output - name = self.name + if "size" in self.__dict__: + return + else: + if self.type in self.write_correspondance: + write = self.write_correspondance[self.type] + output = self.output + name = self.name - l_write = ["", - " call write_time(%(output)s)", - " call %(write)s(%(output)s, %(name)s, &", - " '%(name)s')", - ""] + l_write = ["", + " call write_time(%(output)s)", + " call %(write)s(%(output)s, %(name)s, &", + " '%(name)s')", + ""] - self.write = "\n".join(l_write) % locals() + self.write = "\n".join(l_write) % locals() def set_type(self, t): self.type = t.lower() diff --git a/scripts/ezfio_interface/qp_edit_template b/scripts/ezfio_interface/qp_edit_template index 408ca3f7..9c7a1386 100644 --- a/scripts/ezfio_interface/qp_edit_template +++ b/scripts/ezfio_interface/qp_edit_template @@ -6,7 +6,7 @@ open Core.Std;; WARNING This file is autogenerad by -`${{QP_ROOT}}/script/ezfio_interface/ei_handler.py` +`${{QP_ROOT}}/scripts/ezfio_interface/ei_handler.py` *) @@ -120,7 +120,7 @@ let set str s = | Nuclei -> write Nuclei.(of_rst, write) s | Ao_basis -> () (* TODO *) | Mo_basis -> () (* TODO *) - end + end ;; @@ -169,7 +169,9 @@ let run check_only ezfio_filename = in (* Create the temp file *) - let temp_filename = create_temp_file ezfio_filename tasks in + let temp_filename = + create_temp_file ezfio_filename tasks + in (* Open the temp file with external editor *) let editor = @@ -193,7 +195,7 @@ let run check_only ezfio_filename = List.iter ~f:(fun x -> set temp_string x) tasks; (* Remove temp_file *) - Sys.remove temp_filename; + Sys.remove temp_filename ;; diff --git a/scripts/generate_h_apply.py b/scripts/generate_h_apply.py index 436f092d..ae0064cf 100755 --- a/scripts/generate_h_apply.py +++ b/scripts/generate_h_apply.py @@ -8,11 +8,22 @@ copy_buffer declarations decls_main deinit_thread -do_double_excitations +skip +init_main +filter_integrals +filter2p +filter2h2p_double +filter2h2p_single filter1h filter1p -filter2h2p -filter2p +only_2p_single +only_2p_double +filter_only_1h1p_single +filter_only_1h1p_double +filter_only_1h2p_single +filter_only_1h2p_double +filter_only_2h2p_single +filter_only_2h2p_double filterhole filter_integrals filter_only_1h1p_double @@ -182,7 +193,7 @@ class H_apply(object): if (is_a_2p(hole)) cycle """ def filter_1p(self): - self["filter0p"] = """ + self["filter1p"] = """ ! ! DIR$ FORCEINLINE if (is_a_1p(hole)) cycle """ @@ -208,6 +219,27 @@ class H_apply(object): if (is_a_1h1p(key).eqv..False.) cycle """ + def filter_only_2h2p(self): + self["filter_only_2h2p_single"] = """ +! ! DIR$ FORCEINLINE + if (is_a_two_holes_two_particles(hole).eqv..False.) cycle + """ + self["filter_only_1h1p_double"] = """ +! ! DIR$ FORCEINLINE + if (is_a_two_holes_two_particles(key).eqv..False.) cycle + """ + + + def filter_only_1h2p(self): + self["filter_only_1h2p_single"] = """ +! ! DIR$ FORCEINLINE + if (is_a_1h2p(hole).eqv..False.) cycle + """ + self["filter_only_1h2p_double"] = """ +! ! DIR$ FORCEINLINE + if (is_a_1h2p(key).eqv..False.) cycle + """ + def unset_skip(self): self["skip"] = """ @@ -215,9 +247,12 @@ class H_apply(object): def set_filter_2h_2p(self): - self["filter2h2p"] = """ + self["filter2h2p_double"] = """ if (is_a_two_holes_two_particles(key)) cycle """ + self["filter2h2p_single"] = """ + if (is_a_two_holes_two_particles(hole)) cycle + """ def set_perturbation(self,pert): @@ -248,13 +283,13 @@ class H_apply(object): """ self.data["deinit_thread"] = """ - !$ call omp_set_lock(lck) + ! OMP CRITICAL do k=1,N_st sum_e_2_pert_in(k) = sum_e_2_pert_in(k) + sum_e_2_pert(k) sum_norm_pert_in(k) = sum_norm_pert_in(k) + sum_norm_pert(k) sum_H_pert_diag_in(k) = sum_H_pert_diag_in(k) + sum_H_pert_diag(k) enddo - !$ call omp_unset_lock(lck) + ! OMP END CRITICAL deallocate (e_2_pert_buffer, coef_pert_buffer) """ self.data["size_max"] = "8192" @@ -356,12 +391,12 @@ class H_apply(object): self.data["skip"] = """ if (i_generator < size_select_max) then if (select_max(i_generator) < selection_criterion_min*selection_criterion_factor) then - !$ call omp_set_lock(lck) + ! OMP CRITICAL do k=1,N_st norm_psi(k) = norm_psi(k) + psi_coef_generators(i_generator,k)*psi_coef_generators(i_generator,k) pt2_old(k) = 0.d0 enddo - !$ call omp_unset_lock(lck) + ! OMP END CRITICAL cycle endif select_max(i_generator) = 0.d0 @@ -401,7 +436,16 @@ class H_apply_zmq(H_apply): H_pert_diag(k) = 0.d0 norm_psi(k) = 0.d0 enddo - """ + """ + self.data["copy_buffer"] = """ + do i=1,N_det_generators + do k=1,N_st + pt2(k) = pt2(k) + pt2_generators(k,i) + norm_pert(k) = norm_pert(k) + norm_pert_generators(k,i) + H_pert_diag(k) = H_pert_diag(k) + H_pert_diag_generators(k,i) + enddo + enddo + """ def set_selection_pt2(self,pert): H_apply.set_selection_pt2(self,pert) @@ -416,3 +460,4 @@ class H_apply_zmq(H_apply): select_max(i_generator) = 0.d0 endif """ + diff --git a/src/AO_Basis/aos.irp.f b/src/AO_Basis/aos.irp.f index aa805093..8d420b15 100644 --- a/src/AO_Basis/aos.irp.f +++ b/src/AO_Basis/aos.irp.f @@ -25,7 +25,7 @@ END_PROVIDER BEGIN_DOC ! Coefficients including the AO normalization END_DOC - double precision :: norm, norm2,overlap_x,overlap_y,overlap_z,C_A(3), c + double precision :: norm,overlap_x,overlap_y,overlap_z,C_A(3), c integer :: l, powA(3), nz integer :: i,j,k nz=100 @@ -34,9 +34,11 @@ END_PROVIDER C_A(3) = 0.d0 ao_coef_normalized = 0.d0 do i=1,ao_num + powA(1) = ao_power(i,1) powA(2) = ao_power(i,2) powA(3) = ao_power(i,3) + do j=1,ao_prim_num(i) call overlap_gaussian_xyz(C_A,C_A,ao_expo(i,j),ao_expo(i,j),powA,powA,overlap_x,overlap_y,overlap_z,norm,nz) ao_coef_normalized(i,j) = ao_coef(i,j)/sqrt(norm) @@ -51,8 +53,42 @@ END_PROVIDER enddo ao_coef_normalization_factor(i) = 1.d0/sqrt(norm) enddo + END_PROVIDER +BEGIN_PROVIDER [ double precision, ao_coef_normalization_libint_factor, (ao_num) ] + implicit none + BEGIN_DOC + ! Coefficients including the AO normalization + END_DOC + double precision :: norm,overlap_x,overlap_y,overlap_z,C_A(3), c + integer :: l, powA(3), nz + integer :: i,j,k + nz=100 + C_A(1) = 0.d0 + C_A(2) = 0.d0 + C_A(3) = 0.d0 + + do i=1,ao_num + powA(1) = ao_l(i) + powA(2) = 0 + powA(3) = 0 + + ! Normalization of the contracted basis functions + norm = 0.d0 + do j=1,ao_prim_num(i) + do k=1,ao_prim_num(i) + call overlap_gaussian_xyz(C_A,C_A,ao_expo(i,j),ao_expo(i,k),powA,powA,overlap_x,overlap_y,overlap_z,c,nz) + norm = norm+c*ao_coef_normalized(i,j)*ao_coef_normalized(i,k) + enddo + enddo + ao_coef_normalization_libint_factor(i) = ao_coef_normalization_factor(i) * sqrt(norm) + + enddo + +END_PROVIDER + + BEGIN_PROVIDER [ double precision, ao_coef_normalized_ordered, (ao_num_align,ao_prim_num_max) ] &BEGIN_PROVIDER [ double precision, ao_expo_ordered, (ao_num_align,ao_prim_num_max) ] implicit none @@ -170,3 +206,176 @@ BEGIN_PROVIDER [ character*(128), l_to_charater, (0:4)] l_to_charater(4)='G' END_PROVIDER + + BEGIN_PROVIDER [ integer, Nucl_N_Aos, (nucl_num)] +&BEGIN_PROVIDER [ integer, N_AOs_max ] + implicit none + integer :: i + BEGIN_DOC + ! Number of AOs per atom + END_DOC + Nucl_N_Aos = 0 + do i = 1, ao_num + Nucl_N_Aos(ao_nucl(i)) +=1 + enddo + N_AOs_max = maxval(Nucl_N_Aos) +END_PROVIDER + + BEGIN_PROVIDER [ integer, Nucl_Aos, (nucl_num,N_AOs_max)] + implicit none + BEGIN_DOC + ! List of AOs attached on each atom + END_DOC + integer :: i + integer, allocatable :: nucl_tmp(:) + allocate(nucl_tmp(nucl_num)) + nucl_tmp = 0 + Nucl_Aos = 0 + do i = 1, ao_num + nucl_tmp(ao_nucl(i))+=1 + Nucl_Aos(ao_nucl(i),nucl_tmp(ao_nucl(i))) = i + enddo + deallocate(nucl_tmp) +END_PROVIDER + + + BEGIN_PROVIDER [ integer, Nucl_list_shell_Aos, (nucl_num,N_AOs_max)] +&BEGIN_PROVIDER [ integer, Nucl_num_shell_Aos, (nucl_num)] + implicit none + integer :: i,j,k + BEGIN_DOC + ! Index of the shell type Aos and of the corresponding Aos + ! Per convention, for P,D,F and G AOs, we take the index + ! of the AO with the the corresponding power in the "X" axis + END_DOC + do i = 1, nucl_num + Nucl_num_shell_Aos(i) = 0 + + do j = 1, Nucl_N_Aos(i) + if(ao_l(Nucl_Aos(i,j))==0)then + ! S type function + Nucl_num_shell_Aos(i)+=1 + Nucl_list_shell_Aos(i,Nucl_num_shell_Aos(i))=Nucl_Aos(i,j) + elseif(ao_l(Nucl_Aos(i,j))==1)then + ! P type function + if(ao_power(Nucl_Aos(i,j),1)==1)then + Nucl_num_shell_Aos(i)+=1 + Nucl_list_shell_Aos(i,Nucl_num_shell_Aos(i))=Nucl_Aos(i,j) + endif + elseif(ao_l(Nucl_Aos(i,j))==2)then + ! D type function + if(ao_power(Nucl_Aos(i,j),1)==2)then + Nucl_num_shell_Aos(i)+=1 + Nucl_list_shell_Aos(i,Nucl_num_shell_Aos(i))=Nucl_Aos(i,j) + endif + elseif(ao_l(Nucl_Aos(i,j))==3)then + ! F type function + if(ao_power(Nucl_Aos(i,j),1)==3)then + Nucl_num_shell_Aos(i)+=1 + Nucl_list_shell_Aos(i,Nucl_num_shell_Aos(i))=Nucl_Aos(i,j) + endif + elseif(ao_l(Nucl_Aos(i,j))==4)then + ! G type function + if(ao_power(Nucl_Aos(i,j),1)==4)then + Nucl_num_shell_Aos(i)+=1 + Nucl_list_shell_Aos(i,Nucl_num_shell_Aos(i))=Nucl_Aos(i,j) + endif + endif + + enddo + enddo + +END_PROVIDER + + +BEGIN_PROVIDER [ character*(4), ao_l_char_space, (ao_num) ] + implicit none + integer :: i + character*(4) :: give_ao_character_space + do i=1,ao_num + + if(ao_l(i)==0)then + ! S type AO + give_ao_character_space = 'S ' + elseif(ao_l(i) == 1)then + ! P type AO + if(ao_power(i,1)==1)then + give_ao_character_space = 'X ' + elseif(ao_power(i,2) == 1)then + give_ao_character_space = 'Y ' + else + give_ao_character_space = 'Z ' + endif + elseif(ao_l(i) == 2)then + ! D type AO + if(ao_power(i,1)==2)then + give_ao_character_space = 'XX ' + elseif(ao_power(i,2) == 2)then + give_ao_character_space = 'YY ' + elseif(ao_power(i,3) == 2)then + give_ao_character_space = 'ZZ ' + elseif(ao_power(i,1) == 1 .and. ao_power(i,2) == 1)then + give_ao_character_space = 'XY ' + elseif(ao_power(i,1) == 1 .and. ao_power(i,3) == 1)then + give_ao_character_space = 'XZ ' + else + give_ao_character_space = 'YZ ' + endif + elseif(ao_l(i) == 3)then + ! F type AO + if(ao_power(i,1)==3)then + give_ao_character_space = 'XXX ' + elseif(ao_power(i,2) == 3)then + give_ao_character_space = 'YYY ' + elseif(ao_power(i,3) == 3)then + give_ao_character_space = 'ZZZ ' + elseif(ao_power(i,1) == 2 .and. ao_power(i,2) == 1)then + give_ao_character_space = 'XXY ' + elseif(ao_power(i,1) == 2 .and. ao_power(i,3) == 1)then + give_ao_character_space = 'XXZ ' + elseif(ao_power(i,2) == 2 .and. ao_power(i,1) == 1)then + give_ao_character_space = 'YYX ' + elseif(ao_power(i,2) == 2 .and. ao_power(i,3) == 1)then + give_ao_character_space = 'YYZ ' + elseif(ao_power(i,3) == 2 .and. ao_power(i,1) == 1)then + give_ao_character_space = 'ZZX ' + elseif(ao_power(i,3) == 2 .and. ao_power(i,2) == 1)then + give_ao_character_space = 'ZZY ' + elseif(ao_power(i,3) == 1 .and. ao_power(i,2) == 1 .and. ao_power(i,3) == 1)then + give_ao_character_space = 'XYZ ' + endif + elseif(ao_l(i) == 4)then + ! G type AO + if(ao_power(i,1)==4)then + give_ao_character_space = 'XXXX' + elseif(ao_power(i,2) == 4)then + give_ao_character_space = 'YYYY' + elseif(ao_power(i,3) == 4)then + give_ao_character_space = 'ZZZZ' + elseif(ao_power(i,1) == 3 .and. ao_power(i,2) == 1)then + give_ao_character_space = 'XXXY' + elseif(ao_power(i,1) == 3 .and. ao_power(i,3) == 1)then + give_ao_character_space = 'XXXZ' + elseif(ao_power(i,2) == 3 .and. ao_power(i,1) == 1)then + give_ao_character_space = 'YYYX' + elseif(ao_power(i,2) == 3 .and. ao_power(i,3) == 1)then + give_ao_character_space = 'YYYZ' + elseif(ao_power(i,3) == 3 .and. ao_power(i,1) == 1)then + give_ao_character_space = 'ZZZX' + elseif(ao_power(i,3) == 3 .and. ao_power(i,2) == 1)then + give_ao_character_space = 'ZZZY' + elseif(ao_power(i,1) == 2 .and. ao_power(i,2) == 2)then + give_ao_character_space = 'XXYY' + elseif(ao_power(i,2) == 2 .and. ao_power(i,3) == 2)then + give_ao_character_space = 'YYZZ' + elseif(ao_power(i,1) == 2 .and. ao_power(i,2) == 1 .and. ao_power(i,3) == 1)then + give_ao_character_space = 'XXYZ' + elseif(ao_power(i,2) == 2 .and. ao_power(i,1) == 1 .and. ao_power(i,3) == 1)then + give_ao_character_space = 'YYXZ' + elseif(ao_power(i,3) == 2 .and. ao_power(i,1) == 1 .and. ao_power(i,2) == 1)then + give_ao_character_space = 'ZZXY' + endif + endif + ao_l_char_space(i) = give_ao_character_space + enddo +END_PROVIDER diff --git a/src/Bitmask/bitmask_cas_routines.irp.f b/src/Bitmask/bitmask_cas_routines.irp.f index 4441fb22..4984d9a8 100644 --- a/src/Bitmask/bitmask_cas_routines.irp.f +++ b/src/Bitmask/bitmask_cas_routines.irp.f @@ -212,6 +212,12 @@ logical function is_a_two_holes_two_particles(key_in) implicit none integer(bit_kind), intent(in) :: key_in(N_int,2) integer :: i,i_diff + integer :: number_of_holes, number_of_particles + is_a_two_holes_two_particles = .False. + if(number_of_holes(key_in) == 2 .and. number_of_particles(key_in) == 2)then + is_a_two_holes_two_particles = .True. + return + endif i_diff = 0 if(N_int == 1)then i_diff = i_diff & @@ -456,6 +462,17 @@ logical function is_a_1h1p(key_in) end +logical function is_a_1h2p(key_in) + implicit none + integer(bit_kind), intent(in) :: key_in(N_int,2) + integer :: number_of_particles, number_of_holes + is_a_1h2p = .False. + if(number_of_holes(key_in).eq.1 .and. number_of_particles(key_in).eq.2)then + is_a_1h2p = .True. + endif + +end + logical function is_a_1h(key_in) implicit none integer(bit_kind), intent(in) :: key_in(N_int,2) diff --git a/src/Bitmask/bitmasks.irp.f b/src/Bitmask/bitmasks.irp.f index 6fe36c57..7bb6e16e 100644 --- a/src/Bitmask/bitmasks.irp.f +++ b/src/Bitmask/bitmasks.irp.f @@ -95,9 +95,40 @@ BEGIN_PROVIDER [ integer, N_generators_bitmask ] END_PROVIDER +BEGIN_PROVIDER [ integer, N_generators_bitmask_restart ] + implicit none + BEGIN_DOC + ! Number of bitmasks for generators + END_DOC + logical :: exists + PROVIDE ezfio_filename + + call ezfio_has_bitmasks_N_mask_gen(exists) + if (exists) then + call ezfio_get_bitmasks_N_mask_gen(N_generators_bitmask_restart) + integer :: N_int_check + integer :: bit_kind_check + call ezfio_get_bitmasks_bit_kind(bit_kind_check) + if (bit_kind_check /= bit_kind) then + print *, bit_kind_check, bit_kind + print *, 'Error: bit_kind is not correct in EZFIO file' + endif + call ezfio_get_bitmasks_N_int(N_int_check) + if (N_int_check /= N_int) then + print *, N_int_check, N_int + print *, 'Error: N_int is not correct in EZFIO file' + endif + else + N_generators_bitmask_restart = 1 + endif + ASSERT (N_generators_bitmask_restart > 0) + +END_PROVIDER -BEGIN_PROVIDER [ integer(bit_kind), generators_bitmask_restart, (N_int,2,6,N_generators_bitmask) ] + + +BEGIN_PROVIDER [ integer(bit_kind), generators_bitmask_restart, (N_int,2,6,N_generators_bitmask_restart) ] implicit none BEGIN_DOC ! Bitmasks for generator determinants. @@ -306,7 +337,7 @@ END_PROVIDER n_inact_orb = 0 n_virt_orb = 0 - if(N_generators_bitmask == 1)then + if(N_generators_bitmask_restart == 1)then do j = 1, N_int inact_bitmask(j,1) = xor(generators_bitmask_restart(j,1,1,1),cas_bitmask(j,1,1)) inact_bitmask(j,2) = xor(generators_bitmask_restart(j,2,1,1),cas_bitmask(j,2,1)) @@ -319,15 +350,15 @@ END_PROVIDER i_hole = 1 i_gen = 1 do i = 1, N_int - inact_bitmask(i,1) = generators_bitmask(i,1,i_hole,i_gen) - inact_bitmask(i,2) = generators_bitmask(i,2,i_hole,i_gen) + inact_bitmask(i,1) = generators_bitmask_restart(i,1,i_hole,i_gen) + inact_bitmask(i,2) = generators_bitmask_restart(i,2,i_hole,i_gen) n_inact_orb += popcnt(inact_bitmask(i,1)) enddo i_part = 2 i_gen = 3 do i = 1, N_int - virt_bitmask(i,1) = generators_bitmask(i,1,i_part,i_gen) - virt_bitmask(i,2) = generators_bitmask(i,2,i_part,i_gen) + virt_bitmask(i,1) = generators_bitmask_restart(i,1,i_part,i_gen) + virt_bitmask(i,2) = generators_bitmask_restart(i,2,i_part,i_gen) n_virt_orb += popcnt(virt_bitmask(i,1)) enddo endif diff --git a/src/Determinants/H_apply.irp.f b/src/Determinants/H_apply.irp.f index 28513597..cadf84b4 100644 --- a/src/Determinants/H_apply.irp.f +++ b/src/Determinants/H_apply.irp.f @@ -214,8 +214,13 @@ subroutine remove_duplicates_in_psi_det(found_duplicates) duplicate(i) = .False. enddo - do i=1,N_det-1 + found_duplicates = .False. + i=0 + j=0 + do while (i 2.d0) then $printout_now wall_0 = wall_1 endif - !$ call omp_unset_lock(lck) + !$OMP END CRITICAL enddo !$OMP END DO deallocate( mask, fock_diag_tmp ) !$OMP END PARALLEL - !$ call omp_destroy_lock(lck) $copy_buffer $generate_psi_guess diff --git a/src/Determinants/H_apply_zmq.template.f b/src/Determinants/H_apply_zmq.template.f index c492a739..2faceb77 100644 --- a/src/Determinants/H_apply_zmq.template.f +++ b/src/Determinants/H_apply_zmq.template.f @@ -10,9 +10,9 @@ subroutine $subroutine($params_main) $decls_main + integer :: i integer :: i_generator double precision :: wall_0, wall_1 - integer(omp_lock_kind) :: lck integer(bit_kind), allocatable :: mask(:,:,:) integer :: ispin, k integer :: rc @@ -26,6 +26,9 @@ subroutine $subroutine($params_main) integer(ZMQ_PTR) :: zmq_socket_pair integer(ZMQ_PTR) :: zmq_to_qp_run_socket + double precision, allocatable :: pt2_generators(:,:), norm_pert_generators(:,:) + double precision, allocatable :: H_pert_diag_generators(:,:) + call new_parallel_job(zmq_to_qp_run_socket,'$subroutine') zmq_socket_pair = new_zmq_pair_socket(.True.) @@ -37,24 +40,26 @@ subroutine $subroutine($params_main) call add_task_to_taskserver(zmq_to_qp_run_socket,task) enddo - integer(ZMQ_PTR) :: collector_thread - external :: $subroutine_collector - rc = pthread_create(collector_thread, $subroutine_collector) + allocate ( pt2_generators(N_states,N_det_generators), & + norm_pert_generators(N_states,N_det_generators), & + H_pert_diag_generators(N_states,N_det_generators) ) - !$OMP PARALLEL DEFAULT(private) - !$OMP TASK PRIVATE(rc) - rc = omp_get_thread_num() - call $subroutine_slave_inproc(rc) - !$OMP END TASK - !$OMP TASKWAIT + PROVIDE nproc N_states + !$OMP PARALLEL DEFAULT(NONE) & + !$OMP PRIVATE(i) & + !$OMP SHARED(zmq_socket_pair,N_states, pt2_generators, norm_pert_generators, H_pert_diag_generators, n, task_id, i_generator) & + !$OMP num_threads(nproc+1) + i = omp_get_thread_num() + if (i == 0) then + call $subroutine_collector() + integer :: n, task_id + call pull_pt2(zmq_socket_pair, pt2_generators, norm_pert_generators, H_pert_diag_generators, i_generator, size(pt2_generators), n, task_id) + else + call $subroutine_slave_inproc(i) + endif !$OMP END PARALLEL - integer :: n, task_id - call pull_pt2(zmq_socket_pair, pt2, norm_pert, H_pert_diag, N_st, n, task_id) - - rc = pthread_join(collector_thread) - call end_zmq_pair_socket(zmq_socket_pair) call end_parallel_job(zmq_to_qp_run_socket,'$subroutine') @@ -62,6 +67,7 @@ subroutine $subroutine($params_main) $copy_buffer $generate_psi_guess + deallocate ( pt2_generators, norm_pert_generators, H_pert_diag_generators) end subroutine $subroutine_slave_tcp(iproc) @@ -169,7 +175,7 @@ subroutine $subroutine_slave(thread, iproc) endif call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id,1) - call push_pt2(zmq_socket_push,pt2,norm_pert,H_pert_diag,N_st,task_id) + call push_pt2(zmq_socket_push,pt2,norm_pert,H_pert_diag,i_generator,N_st,task_id) enddo @@ -186,7 +192,7 @@ subroutine $subroutine_collector use f77_zmq implicit none BEGIN_DOC -! Collects results from the selection +! Collects results from the selection in an array of generators END_DOC integer :: k, rc @@ -194,7 +200,7 @@ subroutine $subroutine_collector integer(ZMQ_PTR), external :: new_zmq_pull_socket integer(ZMQ_PTR) :: zmq_socket_pull integer*8 :: control, accu - integer :: n, more, task_id + integer :: n, more, task_id, i_generator integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket integer(ZMQ_PTR) :: zmq_to_qp_run_socket @@ -202,22 +208,25 @@ subroutine $subroutine_collector zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() zmq_socket_pull = new_zmq_pull_socket() - double precision, allocatable :: pt2(:,:), norm_pert(:,:), H_pert_diag(:,:) - allocate ( pt2(N_states,2), norm_pert(N_states,2), H_pert_diag(N_states,2)) + double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) + double precision, allocatable :: pt2_result(:,:), norm_pert_result(:,:), H_pert_diag_result(:,:) + allocate (pt2(N_states), norm_pert(N_states), H_pert_diag(N_states)) + allocate (pt2_result(N_states,N_det_generators), norm_pert_result(N_states,N_det_generators), & + H_pert_diag_result(N_states,N_det_generators)) - pt2 = 0.d0 - norm_pert = 0.d0 - H_pert_diag = 0.d0 + pt2_result = 0.d0 + norm_pert_result = 0.d0 + H_pert_diag_result = 0.d0 accu = 0_8 more = 1 do while (more == 1) - call pull_pt2(zmq_socket_pull, pt2, norm_pert, H_pert_diag, N_states, n, task_id) + call pull_pt2(zmq_socket_pull, pt2, norm_pert, H_pert_diag, i_generator, N_states, n, task_id) if (n > 0) then do k=1,N_states - pt2(k,2) = pt2(k,1) + pt2(k,2) - norm_pert(k,2) = norm_pert(k,1) + norm_pert(k,2) - H_pert_diag(k,2) = H_pert_diag(k,1) + H_pert_diag(k,2) + pt2_result(k,i_generator) = pt2(k) + norm_pert_result(k,i_generator) = norm_pert(k) + H_pert_diag_result(k,i_generator) = H_pert_diag(k) enddo accu = accu + 1_8 call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more) @@ -234,9 +243,10 @@ subroutine $subroutine_collector socket_result = new_zmq_pair_socket(.False.) - call push_pt2(socket_result, pt2(1,2), norm_pert(1,2), H_pert_diag(1,2), N_states,0) + call push_pt2(socket_result, pt2_result, norm_pert_result, H_pert_diag_result, i_generator, & + N_states*N_det_generators,0) - deallocate ( pt2, norm_pert, H_pert_diag) + deallocate (pt2, norm_pert, H_pert_diag, pt2_result, norm_pert_result, H_pert_diag_result) call end_zmq_pair_socket(socket_result) diff --git a/src/Determinants/SC2.irp.f b/src/Determinants/SC2.irp.f index ea942307..4f321b87 100644 --- a/src/Determinants/SC2.irp.f +++ b/src/Determinants/SC2.irp.f @@ -1,4 +1,4 @@ -subroutine CISD_SC2(dets_in,u_in,energies,dim_in,sze,N_st,Nint,convergence) +subroutine CISD_SC2(dets_in,u_in,energies,diag_H_elements,dim_in,sze,N_st,Nint,convergence) use bitmasks implicit none BEGIN_DOC @@ -21,6 +21,7 @@ subroutine CISD_SC2(dets_in,u_in,energies,dim_in,sze,N_st,Nint,convergence) integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) double precision, intent(inout) :: u_in(dim_in,N_st) double precision, intent(out) :: energies(N_st) + double precision, intent(out) :: diag_H_elements(dim_in) double precision, intent(in) :: convergence ASSERT (N_st > 0) ASSERT (sze > 0) @@ -197,6 +198,9 @@ subroutine CISD_SC2(dets_in,u_in,energies,dim_in,sze,N_st,Nint,convergence) converged = dabs(e_corr_double - e_corr_double_before) < convergence converged = converged if (converged) then + do i = 1, dim_in + diag_H_elements(i) = H_jj_dressed(i) - H_jj_ref(i) + enddo exit endif e_corr_double_before = e_corr_double diff --git a/src/Determinants/davidson.irp.f b/src/Determinants/davidson.irp.f index 3d074563..a4166e10 100644 --- a/src/Determinants/davidson.irp.f +++ b/src/Determinants/davidson.irp.f @@ -386,39 +386,52 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun ! ============== - k_pairs=0 - do l=1,N_st - do k=1,l - k_pairs+=1 - kl_pairs(1,k_pairs) = k - kl_pairs(2,k_pairs) = l - enddo - enddo - - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP SHARED(U,sze,N_st,overlap,kl_pairs,k_pairs, & - !$OMP Nint,dets_in,u_in) & - !$OMP PRIVATE(k,l,kl,i) - - - ! Orthonormalize initial guess - ! ============================ - - !$OMP DO - do kl=1,k_pairs - k = kl_pairs(1,kl) - l = kl_pairs(2,kl) - if (k/=l) then - overlap(k,l) = u_dot_v(U_in(1,k),U_in(1,l),sze) - overlap(l,k) = overlap(k,l) - else - overlap(k,k) = u_dot_u(U_in(1,k),sze) - endif - enddo - !$OMP END DO - !$OMP END PARALLEL + if (N_st > 1) then - call ortho_lowdin(overlap,size(overlap,1),N_st,U_in,size(U_in,1),sze) + k_pairs=0 + do l=1,N_st + do k=1,l + k_pairs+=1 + kl_pairs(1,k_pairs) = k + kl_pairs(2,k_pairs) = l + enddo + enddo + + !$OMP PARALLEL DEFAULT(NONE) & + !$OMP SHARED(U,sze,N_st,overlap,kl_pairs,k_pairs, & + !$OMP Nint,dets_in,u_in) & + !$OMP PRIVATE(k,l,kl) + + + ! Orthonormalize initial guess + ! ============================ + + !$OMP DO + do kl=1,k_pairs + k = kl_pairs(1,kl) + l = kl_pairs(2,kl) + if (k/=l) then + overlap(k,l) = u_dot_v(U_in(1,k),U_in(1,l),sze) + overlap(l,k) = overlap(k,l) + else + overlap(k,k) = u_dot_u(U_in(1,k),sze) + endif + enddo + !$OMP END DO + !$OMP END PARALLEL + + call ortho_lowdin(overlap,size(overlap,1),N_st,U_in,size(U_in,1),sze) + + else + + overlap(1,1) = u_dot_u(U_in(1,1),sze) + double precision :: f + f = 1.d0 / dsqrt(overlap(1,1)) + do i=1,sze + U_in(i,1) = U_in(i,1) * f + enddo + + endif ! Davidson iterations ! =================== diff --git a/src/Determinants/determinants.irp.f b/src/Determinants/determinants.irp.f index 400345c1..52d2cc53 100644 --- a/src/Determinants/determinants.irp.f +++ b/src/Determinants/determinants.irp.f @@ -58,7 +58,7 @@ BEGIN_PROVIDER [ integer, psi_det_size ] else psi_det_size = 1 endif - psi_det_size = max(psi_det_size,10000) + psi_det_size = max(psi_det_size,100000) call write_int(output_determinants,psi_det_size,'Dimension of the psi arrays') END_PROVIDER diff --git a/src/Determinants/diagonalize_CI_SC2.irp.f b/src/Determinants/diagonalize_CI_SC2.irp.f index 97161ad3..498792d9 100644 --- a/src/Determinants/diagonalize_CI_SC2.irp.f +++ b/src/Determinants/diagonalize_CI_SC2.irp.f @@ -23,8 +23,10 @@ END_PROVIDER threshold_convergence_SC2 = 1.d-10 END_PROVIDER + BEGIN_PROVIDER [ double precision, CI_SC2_electronic_energy, (N_states_diag) ] &BEGIN_PROVIDER [ double precision, CI_SC2_eigenvectors, (N_det,N_states_diag) ] +&BEGIN_PROVIDER [ double precision, Diag_H_elements_SC2, (N_det) ] implicit none BEGIN_DOC ! Eigenvectors/values of the CI matrix @@ -39,7 +41,8 @@ END_PROVIDER enddo call CISD_SC2(psi_det,CI_SC2_eigenvectors,CI_SC2_electronic_energy, & - size(CI_SC2_eigenvectors,1),N_det,N_states_diag,N_int,threshold_convergence_SC2) +! size(CI_SC2_eigenvectors,1),N_det,N_states_diag,N_int,threshold_convergence_SC2) + diag_H_elements_SC2,size(CI_SC2_eigenvectors,1),N_det,N_states_diag,N_int,threshold_convergence_SC2) END_PROVIDER subroutine diagonalize_CI_SC2 @@ -54,5 +57,6 @@ subroutine diagonalize_CI_SC2 psi_coef(i,j) = CI_SC2_eigenvectors(i,j) enddo enddo - SOFT_TOUCH psi_coef CI_SC2_electronic_energy CI_SC2_energy CI_SC2_eigenvectors + SOFT_TOUCH psi_coef CI_SC2_electronic_energy CI_SC2_energy CI_SC2_eigenvectors diag_h_elements_sc2 +! SOFT_TOUCH psi_coef CI_SC2_electronic_energy CI_SC2_energy CI_SC2_eigenvectors end diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index 9810b219..9a60dbd9 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -301,13 +301,21 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nma print*,'' print*,'nstates = ',nstates allocate(s2(nstates,nstates),overlap(nstates,nstates)) - do i = 1, nstates - overlap(i,i) = u_dot_u(psi_coefs_inout(1,i),n) - do j = i+1, nstates - overlap(i,j) = u_dot_v(psi_coefs_inout(1,j),psi_coefs_inout(1,i),n) - overlap(j,i) = overlap(i,j) - enddo - enddo + !$OMP PARALLEL DO COLLAPSE(2) DEFAULT(NONE) SCHEDULE(dynamic) & + !$OMP PRIVATE(i,j) SHARED(overlap,psi_coefs_inout,nstates,n) + do i = 1, nstates + do j = 1, nstates + if (i < j) then + cycle + else if (i == j) then + overlap(i,i) = u_dot_u(psi_coefs_inout(1,i),n) + else + overlap(i,j) = u_dot_v(psi_coefs_inout(1,j),psi_coefs_inout(1,i),n) + overlap(j,i) = overlap(i,j) + endif + enddo + enddo + !$OMP END PARALLEL DO print*,'Overlap matrix in the basis of the states considered' do i = 1, nstates write(*,'(10(F16.10,X))')overlap(i,:) @@ -315,13 +323,21 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nma call ortho_lowdin(overlap,size(overlap,1),nstates,psi_coefs_inout,size(psi_coefs_inout,1),n) print*,'passed ortho' - do i = 1, nstates - overlap(i,i) = u_dot_u(psi_coefs_inout(1,i),n) - do j = i+1, nstates - overlap(i,j) = u_dot_v(psi_coefs_inout(1,j),psi_coefs_inout(1,i),n) - overlap(j,i) = overlap(i,j) - enddo - enddo + !$OMP PARALLEL DO COLLAPSE(2) DEFAULT(NONE) SCHEDULE(dynamic) & + !$OMP PRIVATE(i,j) SHARED(overlap,psi_coefs_inout,nstates,n) + do i = 1, nstates + do j = 1, nstates + if (i < j) then + cycle + else if (i == j) then + overlap(i,i) = u_dot_u(psi_coefs_inout(1,i),n) + else + overlap(i,j) = u_dot_v(psi_coefs_inout(1,j),psi_coefs_inout(1,i),n) + overlap(j,i) = overlap(i,j) + endif + enddo + enddo + !$OMP END PARALLEL DO print*,'Overlap matrix in the basis of the Lowdin orthonormalized states ' do i = 1, nstates write(*,'(10(F16.10,X))')overlap(i,:) diff --git a/src/Determinants/save_natorb.irp.f b/src/Determinants/save_natorb.irp.f index e56f9821..674ba32e 100644 --- a/src/Determinants/save_natorb.irp.f +++ b/src/Determinants/save_natorb.irp.f @@ -2,5 +2,6 @@ program save_natorb read_wf = .True. touch read_wf call save_natural_mos + call save_ref_determinant end diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index 3374dfb2..f4783f86 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -970,12 +970,13 @@ subroutine create_minilist_find_previous(key_mask, fullList, miniList, N_fullLis integer, intent(in) :: Nint integer(bit_kind), intent(in) :: fullList(Nint, 2, N_fullList) integer(bit_kind),intent(out) :: miniList(Nint, 2, N_fullList) - integer(bit_kind) :: subList(Nint, 2, N_fullList) + integer(bit_kind), allocatable :: subList(:,:,:) logical,intent(out) :: fullMatch integer,intent(out) :: N_miniList integer(bit_kind) :: key_mask(Nint, 2) integer :: ni, i, k, l, N_subList + allocate (subList(Nint, 2, N_fullList)) fullMatch = .false. N_miniList = 0 @@ -1032,6 +1033,8 @@ subroutine create_minilist_find_previous(key_mask, fullList, miniList, N_fullLis enddo N_minilist = N_minilist + N_subList end if + + deallocate(sublist) end subroutine diff --git a/src/Integrals_Bielec/ao_bi_integrals.irp.f b/src/Integrals_Bielec/ao_bi_integrals.irp.f index eb443701..b7c75fb8 100644 --- a/src/Integrals_Bielec/ao_bi_integrals.irp.f +++ b/src/Integrals_Bielec/ao_bi_integrals.irp.f @@ -4,6 +4,7 @@ double precision function ao_bielec_integral(i,j,k,l) ! integral of the AO basis or (ij|kl) ! i(r1) j(r1) 1/r12 k(r2) l(r2) END_DOC + integer,intent(in) :: i,j,k,l integer :: p,q,r,s double precision :: I_center(3),J_center(3),K_center(3),L_center(3) @@ -374,20 +375,16 @@ BEGIN_PROVIDER [ logical, ao_bielec_integrals_in_map ] call add_task_to_taskserver(zmq_to_qp_run_socket,task) enddo - integer(ZMQ_PTR) :: collector_thread - external :: ao_bielec_integrals_in_map_collector - rc = pthread_create(collector_thread, ao_bielec_integrals_in_map_collector) - - !$OMP PARALLEL DEFAULT(private) - !$OMP TASK PRIVATE(i) + PROVIDE nproc + !$OMP PARALLEL DEFAULT(private) num_threads(nproc+1) i = omp_get_thread_num() - call ao_bielec_integrals_in_map_slave_inproc(i) - !$OMP END TASK - !$OMP TASKWAIT + if (i==0) then + call ao_bielec_integrals_in_map_collector(i) + else + call ao_bielec_integrals_in_map_slave_inproc(i) + endif !$OMP END PARALLEL - rc = pthread_join(collector_thread) - call end_parallel_job(zmq_to_qp_run_socket, 'ao_integrals') diff --git a/src/Integrals_Bielec/map_integrals.irp.f b/src/Integrals_Bielec/map_integrals.irp.f index 4041242e..e9775eec 100644 --- a/src/Integrals_Bielec/map_integrals.irp.f +++ b/src/Integrals_Bielec/map_integrals.irp.f @@ -230,7 +230,6 @@ subroutine clear_ao_map end - !! MO Map !! ====== diff --git a/src/Integrals_Bielec/mo_bi_integrals.irp.f b/src/Integrals_Bielec/mo_bi_integrals.irp.f index 4d471545..69ca0733 100644 --- a/src/Integrals_Bielec/mo_bi_integrals.irp.f +++ b/src/Integrals_Bielec/mo_bi_integrals.irp.f @@ -72,7 +72,7 @@ subroutine add_integrals_to_map(mask_ijkl) integer :: i2,i3,i4 double precision,parameter :: thr_coef = 1.d-10 - PROVIDE ao_bielec_integrals_in_map + PROVIDE ao_bielec_integrals_in_map mo_coef !Get list of MOs for i,j,k and l !------------------------------- @@ -329,7 +329,7 @@ end double precision, allocatable :: iqrs(:,:), iqsr(:,:), iqis(:), iqri(:) if (.not.do_direct_integrals) then - PROVIDE ao_bielec_integrals_in_map + PROVIDE ao_bielec_integrals_in_map mo_coef endif mo_bielec_integral_jj_from_ao = 0.d0 @@ -495,4 +495,13 @@ subroutine clear_mo_map call map_deinit(mo_integrals_map) FREE mo_integrals_map mo_bielec_integral_schwartz mo_bielec_integral_jj mo_bielec_integral_jj_anti FREE mo_bielec_integral_jj_exchange mo_bielec_integrals_in_map + + +end + +subroutine provide_all_mo_integrals + implicit none + provide mo_integrals_map mo_bielec_integral_schwartz mo_bielec_integral_jj mo_bielec_integral_jj_anti + provide mo_bielec_integral_jj_exchange mo_bielec_integrals_in_map + end diff --git a/src/Integrals_Monoelec/mo_mono_ints.irp.f b/src/Integrals_Monoelec/mo_mono_ints.irp.f index 714222ec..5bae9868 100644 --- a/src/Integrals_Monoelec/mo_mono_ints.irp.f +++ b/src/Integrals_Monoelec/mo_mono_ints.irp.f @@ -5,6 +5,7 @@ BEGIN_PROVIDER [ double precision, mo_mono_elec_integral,(mo_tot_num_align,mo_to ! array of the mono electronic hamiltonian on the MOs basis ! : sum of the kinetic and nuclear electronic potential END_DOC + print*,'Providing the mono electronic integrals' do j = 1, mo_tot_num do i = 1, mo_tot_num mo_mono_elec_integral(i,j) = mo_nucl_elec_integral(i,j) + mo_kinetic_integral(i,j) + mo_pseudo_integral(i,j) diff --git a/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f b/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f index 615ed127..789bc9ea 100644 --- a/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f +++ b/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f @@ -3,10 +3,14 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral, (ao_num_align,ao_num)] BEGIN_DOC ! Pseudo-potential END_DOC + ao_pseudo_integral = 0.d0 if (do_pseudo) then - ao_pseudo_integral = ao_pseudo_integral_local + ao_pseudo_integral_non_local - else - ao_pseudo_integral = 0.d0 + if (pseudo_klocmax > 0) then + ao_pseudo_integral += ao_pseudo_integral_local + endif + if (pseudo_kmax > 0) then + ao_pseudo_integral += ao_pseudo_integral_non_local + endif endif END_PROVIDER diff --git a/src/Utils/util.irp.f b/src/Utils/util.irp.f index a0ea668d..91a61a43 100644 --- a/src/Utils/util.irp.f +++ b/src/Utils/util.irp.f @@ -295,18 +295,6 @@ BEGIN_PROVIDER [ integer, nproc ] !$OMP END PARALLEL END_PROVIDER -BEGIN_PROVIDER [ integer, iproc_save, (nproc) ] - implicit none - BEGIN_DOC - ! iproc_save(i) = i-1. Used to start threads with pthreads. - END_DOC - integer :: i - do i=1,nproc - iproc_save(i) = i-1 - enddo - -END_PROVIDER - double precision function u_dot_v(u,v,sze) implicit none diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index af97161b..ae1de6e7 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -181,14 +181,14 @@ function new_zmq_pair_socket(bind) endif endif - rc = f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_SNDHWM, 0, 4) + rc = f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_SNDHWM, 1, 4) if (rc /= 0) then - stop 'f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_SNDHWM, 0, 4)' + stop 'f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_SNDHWM, 1, 4)' endif - rc = f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_RCVHWM, 0, 4) + rc = f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_RCVHWM, 1, 4) if (rc /= 0) then - stop 'f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_RCVHWM, 0, 4)' + stop 'f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_RCVHWM, 1, 4)' endif rc = f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_IMMEDIATE, 1, 4) @@ -229,16 +229,11 @@ function new_zmq_pull_socket() stop 'Unable to set ZMQ_LINGER on pull socket' endif - rc = f77_zmq_setsockopt(new_zmq_pull_socket,ZMQ_RCVHWM,100000,4) + rc = f77_zmq_setsockopt(new_zmq_pull_socket,ZMQ_RCVHWM,1000,4) if (rc /= 0) then stop 'Unable to set ZMQ_RCVHWM on pull socket' endif - rc = f77_zmq_setsockopt(new_zmq_pull_socket,ZMQ_IMMEDIATE,1,4) - if (rc /= 0) then - stop 'Unable to set ZMQ_IMMEDIATE on pull socket' - endif - rc = f77_zmq_bind(new_zmq_pull_socket, zmq_socket_pull_tcp_address) if (rc /= 0) then print *, 'Unable to bind new_zmq_pull_socket (tcp)', zmq_socket_pull_tcp_address @@ -279,7 +274,7 @@ function new_zmq_push_socket(thread) stop 'Unable to set ZMQ_LINGER on push socket' endif - rc = f77_zmq_setsockopt(new_zmq_push_socket,ZMQ_SNDHWM,100,4) + rc = f77_zmq_setsockopt(new_zmq_push_socket,ZMQ_SNDHWM,1000,4) if (rc /= 0) then stop 'Unable to set ZMQ_SNDHWM on push socket' endif @@ -355,11 +350,11 @@ subroutine end_zmq_pull_socket(zmq_socket_pull) ! endif rc = f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_tcp_address) - if (rc /= 0) then - print *, rc - print *, irp_here, 'f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_tcp_address)' - stop 'error' - endif +! if (rc /= 0) then +! print *, rc +! print *, irp_here, 'f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_tcp_address)' +! stop 'error' +! endif call sleep(1) ! see https://github.com/zeromq/libzmq/issues/1922 diff --git a/tests/bats/qp.bats b/tests/bats/qp.bats index 1ced9e1d..78ed973d 100644 --- a/tests/bats/qp.bats +++ b/tests/bats/qp.bats @@ -155,7 +155,7 @@ function run_all_1h_1p() { ezfio set determinants read_wf True qp_run mrcc_cassd $INPUT energy="$(ezfio get mrcc_cassd energy)" - eq $energy -76.2284994316618 1.e-4 + eq $energy -76.2288648023833 1.e-4 } @@ -166,7 +166,7 @@ function run_all_1h_1p() { } @test "SCF H2O VDZ pseudo" { - run_HF h2o_pseudo.ezfio -16.9483708495521 + run_HF h2o_pseudo.ezfio -16.9483703905461 } @test "FCI H2O VDZ pseudo" { From dccd92d35137badf5859ac8df7ded574978f77ca Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 7 Jul 2016 12:48:07 +0200 Subject: [PATCH 045/216] Minilist --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 42 ++++++ plugins/Full_CI_ZMQ/selection.irp.f | 214 ++++++++++++++++++++++++++++ src/ZMQ/utils.irp.f | 12 ++ 3 files changed, 268 insertions(+) create mode 100644 plugins/Full_CI_ZMQ/fci_zmq.irp.f create mode 100644 plugins/Full_CI_ZMQ/selection.irp.f diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f new file mode 100644 index 00000000..bb954beb --- /dev/null +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -0,0 +1,42 @@ +program Full_CI_ZMQ + use f77_zmq + implicit none + BEGIN_DOC +! Massively parallel Full-CI + END_DOC + + integer :: i,ithread + + integer(ZMQ_PTR) :: zmq_socket_push + integer(ZMQ_PTR) :: new_zmq_push_socket + zmq_context = f77_zmq_ctx_new () + + + PROVIDE nproc + !$OMP PARALLEL PRIVATE(i,ithread,zmq_socket_push) num_threads(nproc+1) + ithread = omp_get_thread_num() + if (ithread == 0) then + call receive_selected_determinants() + else + zmq_socket_push = new_zmq_push_socket() + do i=ithread,N_det_generators,nproc + print *, i , N_det_generators + !$OMP TASK DEFAULT(SHARED) + call select_connected(i, 1.d-6, ci_electronic_energy,zmq_socket_push) + !$OMP END TASK + enddo + !$OMP TASKWAIT + if (ithread == 1) then + integer :: rc + rc = f77_zmq_send(zmq_socket_push,0,1,0) + if (rc /= 1) then + stop 'Error sending termination signal' + endif + endif + call end_zmq_push_socket(zmq_socket_push) + + endif + !$OMP END PARALLEL + + +end diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f new file mode 100644 index 00000000..cf4e9def --- /dev/null +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -0,0 +1,214 @@ +subroutine select_connected(i_generator,thr,E0,zmq_socket_push) + use f77_zmq + use bitmasks + implicit none + integer, intent(in) :: i_generator + double precision, intent(in) :: thr + double precision, intent(in) :: E0(N_states) + integer(ZMQ_PTR), intent(in) :: zmq_socket_push + BEGIN_DOC +! Select determinants connected to i_det by H + END_DOC + ASSERT (thr >= 0.d0) + integer(bit_kind) :: hole_mask(N_int,2), particle_mask(N_int,2) + + double precision :: fock_diag_tmp(mo_tot_num) + call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) + + integer :: k,l + do l=1,N_generators_bitmask + do k=1,N_int + hole_mask(k,1) = iand(generators_bitmask(k,1,s_hole,l), psi_det_generators(k,1,i_generator)) + hole_mask(k,2) = iand(generators_bitmask(k,2,s_hole,l), psi_det_generators(k,2,i_generator)) + particle_mask(k,1) = iand(generators_bitmask(k,1,s_part,l), not(psi_det_generators(k,1,i_generator)) ) + particle_mask(k,2) = iand(generators_bitmask(k,2,s_part,l), not(psi_det_generators(k,2,i_generator)) ) + enddo + + call select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) + enddo + +end + +subroutine receive_selected_determinants() + use f77_zmq + use bitmasks + implicit none + BEGIN_DOC +! Receive via ZMQ the selected determinants + END_DOC + integer(ZMQ_PTR) :: zmq_socket_pull + integer(ZMQ_PTR) :: new_zmq_pull_socket + + integer(bit_kind) :: received_det(N_int,2) + integer :: msg_size, rc + msg_size = bit_kind*N_int*2 + + zmq_socket_pull = new_zmq_pull_socket() + + do while (f77_zmq_recv(zmq_socket_pull, received_det, msg_size, 0) == msg_size) + call debug_det(received_det,N_int) + end do + call end_zmq_pull_socket(zmq_socket_pull) + +end + +subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) + use f77_zmq + use bitmasks + implicit none + BEGIN_DOC +! Select determinants connected to i_det by H + END_DOC + integer, intent(in) :: i_generator + double precision, intent(in) :: thr + double precision, intent(in) :: fock_diag_tmp(mo_tot_num) + integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) + double precision, intent(in) :: E0(N_states) + integer(ZMQ_PTR), intent(in) :: zmq_socket_push + + ASSERT (thr >= 0.d0) + + integer :: i,j,k,l + + integer :: msg_size + msg_size = bit_kind*N_int*2 + + ! Apply hole and particle masks + ! ----------------------------- + + integer(bit_kind) :: hole(N_int,2), particle(N_int,2) + do k=1,N_int + hole (k,1) = iand(psi_det_generators(k,1,i_generator), hole_mask(k,1)) + hole (k,2) = iand(psi_det_generators(k,2,i_generator), hole_mask(k,2)) + particle(k,1) = iand(not(psi_det_generators(k,1,i_generator)), particle_mask(k,1)) + particle(k,2) = iand(not(psi_det_generators(k,2,i_generator)), particle_mask(k,2)) + enddo + + + ! Create lists of holes and particles + ! ----------------------------------- + + integer :: N_holes(2), N_particles(2) + integer :: hole_list(N_int*bit_kind_size,2) + integer :: particle_list(N_int*bit_kind_size,2) + + call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) + call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) + + ! Create excited determinants + ! --------------------------- + + integer :: ispin, other_spin + integer(bit_kind) :: exc_det(N_int,2), ion_det(N_int,2) + + do k=1,N_int + exc_det(k,1) = psi_det_generators(k,1,i_generator) + exc_det(k,2) = psi_det_generators(k,2,i_generator) + ion_det(k,1) = psi_det_generators(k,1,i_generator) + ion_det(k,2) = psi_det_generators(k,2,i_generator) + enddo + + do ispin=1,2 + do k=1,N_int + ion_det(k,ispin) = psi_det_generators(k,ispin,i_generator) + enddo + + do i=1, N_holes(ispin) + integer :: i_hole + i_hole = hole_list(i,ispin) + + ! Apply the hole + integer :: j_hole, k_hole + k_hole = ishft(i_hole-1,-bit_kind_shift)+1 ! N_int + j_hole = i_hole-ishft(k_hole-1,bit_kind_shift)-1 ! bit index + ion_det(k_hole,ispin) = ibclr(psi_det_generators(k_hole,ispin,i_generator),j_hole) + + ! Create the mini wave function where = + ! -------------------------------------------------------------- + + integer(bit_kind) :: psi_det_connected(N_int,2,psi_selectors_size) + double precision :: psi_coef_connected(psi_selectors_size,N_states) + + integer :: n_diff, N_det_connected + N_det_connected = 0 + do l=1,N_det_selectors +! TODO : provide not_psi_selectors + n_diff = popcnt( iand(not(psi_selectors(1,1,l)), ion_det(1,1)) ) & + + popcnt( iand(not(psi_selectors(1,2,l)), ion_det(1,2)) ) + do k=2,N_int + n_diff = n_diff & + + popcnt( iand(not(psi_selectors(k,1,l)), ion_det(k,1)) ) & + + popcnt( iand(not(psi_selectors(k,2,l)), ion_det(k,2)) ) + enddo + if (n_diff <= 2) then + N_det_connected = N_det_connected+1 + do k=1,N_int + psi_det_connected(k,1,N_det_connected) = psi_selectors(k,1,l) + psi_det_connected(k,2,N_det_connected) = psi_selectors(k,2,l) + enddo + do k=1,N_states + psi_coef_connected(N_det_connected,k) = psi_selectors_coef(l,k) + enddo + endif + enddo + if (N_det_connected == 0) then + cycle + endif + + ! Create particles + ! ---------------- + + do j=1,N_particles(ispin) + exc_det(k_hole,ispin) = ion_det(k_hole,ispin) + + integer :: i_particle + i_particle = particle_list(j,ispin) + + ! Apply the particle + integer :: j_particle, k_particle + k_particle = ishft(i_particle-1,-bit_kind_shift)+1 ! N_int + j_particle = i_particle-ishft(k_particle-1,bit_kind_shift)-1 ! bit index + exc_det(k_particle,ispin) = ibset(ion_det(k_particle,ispin),j_particle) + + ! TODO + ! micro_list : et verifier sur la mouche si le det est connecte au passe + + logical, external :: is_in_wavefunction + ! TODO : Check connected to ref + if (.not. is_in_wavefunction(exc_det,N_int)) then + ! Compute perturbative contribution and select determinant + double precision :: i_H_psi_value(N_states) + call i_H_psi(exc_det,psi_det_connected,psi_coef_connected,N_int,N_det_connected,psi_selectors_size,N_states,i_H_psi_value) + + double precision :: Hii, diag_H_mat_elem_fock + Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) + + double precision :: delta_E, e_pert + do k=1,N_states + if (i_H_psi_value(k) == 0.d0) cycle + delta_E = E0(k) - Hii + if (delta_E < 0.d0) then + e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + else + e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + endif + if (dabs(e_pert) > thr) then + integer :: rc + rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) + if (rc /= msg_size) then + stop 'Unable to send selected determinant' + endif + endif + enddo + endif + + ! Reset exc_det + exc_det(k_particle,ispin) = psi_det_generators(k_particle,ispin,i_generator) + enddo ! j + + ! Reset ion_det + ion_det(k_hole,ispin) = psi_det_generators(k_hole,ispin,i_generator) + enddo ! i + enddo ! ispin +end + diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index 13e91d11..7c87a0ef 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -126,6 +126,9 @@ function new_zmq_to_qp_run_socket() integer(ZMQ_PTR) :: new_zmq_to_qp_run_socket call omp_set_lock(zmq_lock) + if (zmq_context == 0_ZMQ_PTR) then + stop 'zmq_context is uninitialized' + endif new_zmq_to_qp_run_socket = f77_zmq_socket(zmq_context, ZMQ_REQ) call omp_unset_lock(zmq_lock) if (new_zmq_to_qp_run_socket == 0_ZMQ_PTR) then @@ -162,6 +165,9 @@ function new_zmq_pair_socket(bind) integer(ZMQ_PTR) :: new_zmq_pair_socket call omp_set_lock(zmq_lock) + if (zmq_context == 0_ZMQ_PTR) then + stop 'zmq_context is uninitialized' + endif new_zmq_pair_socket = f77_zmq_socket(zmq_context, ZMQ_PAIR) call omp_unset_lock(zmq_lock) if (new_zmq_pair_socket == 0_ZMQ_PTR) then @@ -217,6 +223,9 @@ function new_zmq_pull_socket() integer(ZMQ_PTR) :: new_zmq_pull_socket call omp_set_lock(zmq_lock) + if (zmq_context == 0_ZMQ_PTR) then + stop 'zmq_context is uninitialized' + endif new_zmq_pull_socket = f77_zmq_socket(zmq_context, ZMQ_PULL) ! new_zmq_pull_socket = f77_zmq_socket(zmq_context, ZMQ_REP) call omp_unset_lock(zmq_lock) @@ -262,6 +271,9 @@ function new_zmq_push_socket(thread) integer(ZMQ_PTR) :: new_zmq_push_socket call omp_set_lock(zmq_lock) + if (zmq_context == 0_ZMQ_PTR) then + stop 'zmq_context is uninitialized' + endif new_zmq_push_socket = f77_zmq_socket(zmq_context, ZMQ_PUSH) ! new_zmq_push_socket = f77_zmq_socket(zmq_context, ZMQ_REQ) call omp_unset_lock(zmq_lock) From 59cf09ad65c4ff0791ef78c2108b91c12addffea Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 11 Jul 2016 12:36:58 +0200 Subject: [PATCH 046/216] init --- plugins/Full_CI_ZMQ/NEEDED_CHILDREN_MODULES | 1 + plugins/Full_CI_ZMQ/fci_zmq.irp.f | 42 ++ plugins/Full_CI_ZMQ/selection.irp.f | 584 ++++++++++++++++++++ 3 files changed, 627 insertions(+) create mode 100644 plugins/Full_CI_ZMQ/NEEDED_CHILDREN_MODULES create mode 100644 plugins/Full_CI_ZMQ/fci_zmq.irp.f create mode 100644 plugins/Full_CI_ZMQ/selection.irp.f diff --git a/plugins/Full_CI_ZMQ/NEEDED_CHILDREN_MODULES b/plugins/Full_CI_ZMQ/NEEDED_CHILDREN_MODULES new file mode 100644 index 00000000..1e5dbf4e --- /dev/null +++ b/plugins/Full_CI_ZMQ/NEEDED_CHILDREN_MODULES @@ -0,0 +1 @@ +Perturbation Selectors_full Generators_full ZMQ diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f new file mode 100644 index 00000000..bb954beb --- /dev/null +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -0,0 +1,42 @@ +program Full_CI_ZMQ + use f77_zmq + implicit none + BEGIN_DOC +! Massively parallel Full-CI + END_DOC + + integer :: i,ithread + + integer(ZMQ_PTR) :: zmq_socket_push + integer(ZMQ_PTR) :: new_zmq_push_socket + zmq_context = f77_zmq_ctx_new () + + + PROVIDE nproc + !$OMP PARALLEL PRIVATE(i,ithread,zmq_socket_push) num_threads(nproc+1) + ithread = omp_get_thread_num() + if (ithread == 0) then + call receive_selected_determinants() + else + zmq_socket_push = new_zmq_push_socket() + do i=ithread,N_det_generators,nproc + print *, i , N_det_generators + !$OMP TASK DEFAULT(SHARED) + call select_connected(i, 1.d-6, ci_electronic_energy,zmq_socket_push) + !$OMP END TASK + enddo + !$OMP TASKWAIT + if (ithread == 1) then + integer :: rc + rc = f77_zmq_send(zmq_socket_push,0,1,0) + if (rc /= 1) then + stop 'Error sending termination signal' + endif + endif + call end_zmq_push_socket(zmq_socket_push) + + endif + !$OMP END PARALLEL + + +end diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f new file mode 100644 index 00000000..2df9b5f5 --- /dev/null +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -0,0 +1,584 @@ +subroutine select_connected(i_generator,thr,E0,zmq_socket_push) + use f77_zmq + use bitmasks + implicit none + integer, intent(in) :: i_generator + double precision, intent(in) :: thr + double precision, intent(in) :: E0(N_states) + integer(ZMQ_PTR), intent(in) :: zmq_socket_push + BEGIN_DOC +! Select determinants connected to i_det by H + END_DOC + ASSERT (thr >= 0.d0) + integer(bit_kind) :: hole_mask(N_int,2), particle_mask(N_int,2) + + double precision :: fock_diag_tmp(mo_tot_num) + call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) + + integer :: k,l + do l=1,N_generators_bitmask + do k=1,N_int + hole_mask(k,1) = iand(generators_bitmask(k,1,s_hole,l), psi_det_generators(k,1,i_generator)) + hole_mask(k,2) = iand(generators_bitmask(k,2,s_hole,l), psi_det_generators(k,2,i_generator)) + particle_mask(k,1) = iand(generators_bitmask(k,1,s_part,l), not(psi_det_generators(k,1,i_generator)) ) + particle_mask(k,2) = iand(generators_bitmask(k,2,s_part,l), not(psi_det_generators(k,2,i_generator)) ) + enddo + + call select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) + enddo + +end + +subroutine receive_selected_determinants() + use f77_zmq + use bitmasks + implicit none + BEGIN_DOC +! Receive via ZMQ the selected determinants + END_DOC + integer(ZMQ_PTR) :: zmq_socket_pull + integer(ZMQ_PTR) :: new_zmq_pull_socket + + integer(bit_kind) :: received_det(N_int,2) + integer :: msg_size, rc + msg_size = bit_kind*N_int*2 + + zmq_socket_pull = new_zmq_pull_socket() + + do while (f77_zmq_recv(zmq_socket_pull, received_det, msg_size, 0) == msg_size) + call debug_det(received_det,N_int) + end do + call end_zmq_pull_socket(zmq_socket_pull) + +end + +subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) + use f77_zmq + use bitmasks + implicit none + BEGIN_DOC +! Select determinants connected to i_det by H + END_DOC + integer, intent(in) :: i_generator + double precision, intent(in) :: thr + double precision, intent(in) :: fock_diag_tmp(mo_tot_num) + integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) + double precision, intent(in) :: E0(N_states) + integer(ZMQ_PTR), intent(in) :: zmq_socket_push + + ASSERT (thr >= 0.d0) + + integer :: i,j,k,l + + integer :: msg_size + msg_size = bit_kind*N_int*2 + + ! Apply hole and particle masks + ! ----------------------------- + + integer(bit_kind) :: hole(N_int,2), particle(N_int,2) + do k=1,N_int + hole (k,1) = iand(psi_det_generators(k,1,i_generator), hole_mask(k,1)) + hole (k,2) = iand(psi_det_generators(k,2,i_generator), hole_mask(k,2)) + particle(k,1) = iand(not(psi_det_generators(k,1,i_generator)), particle_mask(k,1)) + particle(k,2) = iand(not(psi_det_generators(k,2,i_generator)), particle_mask(k,2)) + enddo + + + ! Create lists of holes and particles + ! ----------------------------------- + + integer :: N_holes(2), N_particles(2) + integer :: hole_list(N_int*bit_kind_size,2) + integer :: particle_list(N_int*bit_kind_size,2) + + call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) + call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) + + ! Create excited determinants + ! --------------------------- + + integer :: ispin, other_spin + integer(bit_kind) :: exc_det(N_int,2), ion_det(N_int,2) + + do k=1,N_int + exc_det(k,1) = psi_det_generators(k,1,i_generator) + exc_det(k,2) = psi_det_generators(k,2,i_generator) + ion_det(k,1) = psi_det_generators(k,1,i_generator) + ion_det(k,2) = psi_det_generators(k,2,i_generator) + enddo + + do ispin=1,2 + do k=1,N_int + ion_det(k,ispin) = psi_det_generators(k,ispin,i_generator) + enddo + + do i=1, N_holes(ispin) + integer :: i_hole + i_hole = hole_list(i,ispin) + + ! Apply the hole + integer :: j_hole, k_hole + k_hole = ishft(i_hole-1,-bit_kind_shift)+1 ! N_int + j_hole = i_hole-ishft(k_hole-1,bit_kind_shift)-1 ! bit index + ion_det(k_hole,ispin) = ibclr(psi_det_generators(k_hole,ispin,i_generator),j_hole) + + ! Create the mini wave function where = + ! -------------------------------------------------------------- + +! integer(bit_kind) :: psi_det_connected(N_int,2,psi_selectors_size) +! double precision :: psi_coef_connected(psi_selectors_size,N_states) + + + + integer :: idx_microlist(N_det_selectors * 4), ptr_microlist(0:mo_tot_num * 2 + 1), N_microlist(0:mo_tot_num * 2) + integer(bit_kind) :: microlist(N_int, 2, N_det_selectors * 4) + double precision :: psi_coef_microlist(psi_selectors_size * 4, N_states) + + call create_microlist_single(psi_selectors, i_generator, N_det_selectors, ion_det, microlist, idx_microlist, N_microlist, ptr_microlist, N_int) + do j=1, ptr_microlist(mo_tot_num * 2 + 1) - 1 + psi_coef_microlist(j,:) = psi_selectors_coef(idx_microlist(j),:) + enddo + + if(ptr_microlist(mo_tot_num * 2 + 1) == 1) then + cycle + endif + + ! Create particles + ! ---------------- + + do j=1,N_particles(ispin) + exc_det(k_hole,ispin) = ion_det(k_hole,ispin) + + integer :: i_particle + i_particle = particle_list(j,ispin) + + ! Apply the particle + integer :: j_particle, k_particle + k_particle = ishft(i_particle-1,-bit_kind_shift)+1 ! N_int + j_particle = i_particle-ishft(k_particle-1,bit_kind_shift)-1 ! bit index + exc_det(k_particle,ispin) = ibset(ion_det(k_particle,ispin),j_particle) + + ! TODO + + logical, external :: is_in_wavefunction + ! TODO : Check connected to ref + if (.not. is_in_wavefunction(exc_det,N_int)) then + ! Compute perturbative contribution and select determinant + double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) + integer :: sporb +! call i_H_psi(exc_det,psi_det_connected,psi_coef_connected,N_int,N_det_connected,psi_selectors_size,N_states,i_H_psi_value) + !!!!!!!!!!! psi_selectors_size ? + sporb = i_particle + (ispin - 1) * mo_tot_num + call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) + call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) + i_H_psi_value += i_H_psi_value2 + double precision :: Hii, diag_H_mat_elem_fock + Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) + + double precision :: delta_E, e_pert + do k=1,N_states + if (i_H_psi_value(k) == 0.d0) cycle + delta_E = E0(k) - Hii + if (delta_E < 0.d0) then + e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + else + e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + endif + if (dabs(e_pert) > thr) then + integer :: rc + rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) + if (rc /= msg_size) then + stop 'Unable to send selected determinant' + endif + endif + enddo + endif + + ! Reset exc_det + exc_det(k_particle,ispin) = psi_det_generators(k_particle,ispin,i_generator) + enddo ! j + + ! Reset ion_det + ion_det(k_hole,ispin) = psi_det_generators(k_hole,ispin,i_generator) + enddo ! i + enddo ! ispin +end + + + +subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) + use f77_zmq + use bitmasks + implicit none + BEGIN_DOC +! Select determinants connected to i_det by H + END_DOC + integer, intent(in) :: i_generator + double precision, intent(in) :: thr + double precision, intent(in) :: fock_diag_tmp(mo_tot_num) + integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) + double precision, intent(in) :: E0(N_states) + integer(ZMQ_PTR), intent(in) :: zmq_socket_push + + ASSERT (thr >= 0.d0) + + integer :: i,j,k,l,j1,j2,i1,i2 + + integer :: msg_size + msg_size = bit_kind*N_int*2 + + ! Apply hole and particle masks + ! ----------------------------- + + integer(bit_kind) :: hole(N_int,2), particle(N_int,2) + do k=1,N_int + hole (k,1) = iand(psi_det_generators(k,1,i_generator), hole_mask(k,1)) + hole (k,2) = iand(psi_det_generators(k,2,i_generator), hole_mask(k,2)) + particle(k,1) = iand(not(psi_det_generators(k,1,i_generator)), particle_mask(k,1)) + particle(k,2) = iand(not(psi_det_generators(k,2,i_generator)), particle_mask(k,2)) + enddo + + + ! Create lists of holes and particles + ! ----------------------------------- + + integer :: N_holes(2), N_particles(2) + integer :: hole_list(N_int*bit_kind_size,2) + integer :: particle_list(N_int*bit_kind_size,2) + + call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) + call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) + + ! Create excited determinants + ! --------------------------- + + integer :: ispin1, ispin2, other_spin + integer(bit_kind) :: exc_det(N_int,2), ion_det(N_int,2) + + do k=1,N_int + exc_det(k,1) = psi_det_generators(k,1,i_generator) + exc_det(k,2) = psi_det_generators(k,2,i_generator) + ion_det(k,1) = psi_det_generators(k,1,i_generator) + ion_det(k,2) = psi_det_generators(k,2,i_generator) + enddo + + do ispin1=1,2 + do ispin2=1,ispin1 + ion_det = psi_det_generators(k,1,i_generator) +! do k=1,N_int +! ion_det(k,1) = psi_det_generators(k,1,i_generator) +! ion_det(k,2) = psi_det_generators(k,2,i_generator) +! enddo + + integer :: i_hole1, i_hole2, j_hole, k_hole + do i1=1, N_holes(ispin1) + do i2=i1+1, N_holes(ispin2) + i_hole1 = hole_list(i,ispin1) + k_hole = ishft(i_hole1-1,-bit_kind_shift)+1 ! N_int + j_hole = i_hole1-ishft(k_hole-1,bit_kind_shift)-1 ! bit index + ion_det(k_hole,ispin1) = ibclr(psi_det_generators(k_hole,ispin1,i_generator),j_hole) + + i_hole2 = hole_list(i,ispin2) + k_hole = ishft(i_hole2-1,-bit_kind_shift)+1 ! N_int + j_hole = i_hole2-ishft(k_hole-1,bit_kind_shift)-1 ! bit index + ion_det(k_hole,ispin2) = ibclr(psi_det_generators(k_hole,ispin2,i_generator),j_hole) + + + ! Create the mini wave function where = + ! -------------------------------------------------------------- + +! integer(bit_kind) :: psi_det_connected(N_int,2,psi_selectors_size) +! double precision :: psi_coef_connected(psi_selectors_size,N_states) + + + + integer :: idx_microlist(N_det_selectors * 4), ptr_microlist(0:mo_tot_num * 2 + 1), N_microlist(0:mo_tot_num * 2) + integer(bit_kind) :: microlist(N_int, 2, N_det_selectors * 4) + double precision :: psi_coef_microlist(psi_selectors_size * 4, N_states) + + call create_microlist_double(psi_selectors, i_generator, N_det_selectors, ion_det, microlist, idx_microlist, N_microlist, ptr_microlist, N_int) + do j=1, ptr_microlist(mo_tot_num * 2 + 1) - 1 + psi_coef_microlist(j,:) = psi_selectors_coef(idx_microlist(j),:) !!!!!! : + enddo + + if(ptr_microlist(mo_tot_num * 2 + 1) == 1) then + cycle + endif + + ! Create particles + ! ---------------- + + do j1=1,N_particles(ispin1) + do j2=j1+1,N_particles(ispin2) + exc_det = ion_det + + integer :: i_particle2 + i_particle2 = particle_list(j2, ispin2) + + ! Apply the particle + k_particle = ishft(i_particle2-1,-bit_kind_shift)+1 ! N_int + j_particle = i_particle2-ishft(k_particle-1,bit_kind_shift)-1 ! bit index + exc_det(k_particle,ispin2) = ibset(ion_det(k_particle,ispin2),j_particle) + + integer :: i_particle1 + i_particle1 = particle_list(j1,ispin1) + + ! Apply the particle + integer :: j_particle, k_particle + k_particle = ishft(i_particle1-1,-bit_kind_shift)+1 ! N_int + j_particle = i_particle1-ishft(k_particle-1,bit_kind_shift)-1 ! bit index + exc_det(k_particle,ispin1) = ibset(ion_det(k_particle,ispin1),j_particle) + + + + + if(N_microlist(i_particle1 + (ispin1 - 1) * mo_tot_num) < N_microlist(i_particle2 + (ispin2 - 1) * mo_tot_num)) then + sporb = i_particle1 + (ispin1 - 1) * mo_tot_num + else + sporb = i_particle2 + (ispin2 - 1) * mo_tot_num + endif + ! TODO + + logical, external :: is_in_wavefunction + ! TODO : Check connected to ref + if (.not. is_in_wavefunction(exc_det,N_int)) then + ! Compute perturbative contribution and select determinant + double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) + integer :: sporb +! call i_H_psi(exc_det,psi_det_connected,psi_coef_connected,N_int,N_det_connected,psi_selectors_size,N_states,i_H_psi_value) + !!!!!!!!!!! psi_selectors_size ? + call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) + call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) + i_H_psi_value += i_H_psi_value2 + double precision :: Hii, diag_H_mat_elem_fock + Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) + + double precision :: delta_E, e_pert + do k=1,N_states + if (i_H_psi_value(k) == 0.d0) cycle + delta_E = E0(k) - Hii + if (delta_E < 0.d0) then + e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + else + e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + endif + if (dabs(e_pert) > thr) then + integer :: rc + rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) + if (rc /= msg_size) then + stop 'Unable to send selected determinant' + endif + endif + enddo + endif + + ! Reset exc_det +! exc_det(k_particle,ispin) = psi_det_generators(k_particle,ispin,i_generator) + enddo ! j + enddo + ! Reset ion_det +! ion_det(k_hole,ispin) = psi_det_generators(k_hole,ispin,i_generator) + enddo ! i + enddo + enddo ! ispin + enddo +end + + + +subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, Nint) + use bitmasks + integer, intent(in) :: Nint, i_cur, N_minilist + integer(bit_kind), intent(in) :: minilist(Nint,2,N_minilist), key_mask(Nint,2) + + integer, intent(out) :: N_microlist(0:mo_tot_num*2), ptr_microlist(0:mo_tot_num*2+1), idx_microlist(N_minilist*4) + integer(bit_kind), intent(out) :: microlist(Nint,2,N_minilist*4) + + integer :: i,j,k,s,nt,n_element(2) + integer :: list(Nint*bit_kind_size,2), cur_microlist(0:mo_tot_num*2+1) + integer(bit_kind) :: key_mask_neg(Nint,2), mobileMask(Nint,2) + integer :: mo_tot_num_2 + mo_tot_num_2 = mo_tot_num+mo_tot_num + + + do i=1,Nint + key_mask_neg(i,1) = not(key_mask(i,1)) + key_mask_neg(i,2) = not(key_mask(i,2)) + end do + + do i=0,mo_tot_num_2 + N_microlist(i) = 0 + enddo + + do i=1, N_minilist + nt = 0 + do j=1,Nint + mobileMask(j,1) = iand(key_mask_neg(j,1), minilist(j,1,i)) + mobileMask(j,2) = iand(key_mask_neg(j,2), minilist(j,2,i)) + nt += popcnt(mobileMask(j, 1)) + popcnt(mobileMask(j, 2)) + end do + + if(nt > 3) then !! TOO MANY DIFFERENCES + continue + else if(nt < 3) then + if(i < i_cur) then + N_microlist = 0 !!!! PAST LINKED TO EVERYBODY! + ptr_microlist = 1 + return + else !! FUTUR LINKED TO EVERYBODY + N_microlist(0) = N_microlist(0) + 1 + endif + else + call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), Nint) + call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), Nint) + + do s=1,2 + do j=1,n_element(s) + nt = list(j,s) + mo_tot_num * (s-1) + N_microlist(nt) = N_microlist(nt) + 1 + end do + end do + endif + end do + + ptr_microlist(0) = 1 + do i=1,mo_tot_num_2+1 + ptr_microlist(i) = ptr_microlist(i-1) + N_microlist(i-1) + end do + + do i=0,mo_tot_num_2+1 + cur_microlist(i) = ptr_microlist(i) + end do + + + do i=1, N_minilist + do j=1,Nint + mobileMask(j,1) = iand(key_mask_neg(j,1), minilist(j,1,i)) + mobileMask(j,2) = iand(key_mask_neg(j,2), minilist(j,2,i)) + end do + + call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), Nint) + call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), Nint) + + + if(n_element(1) + n_element(2) < 3) then + idx_microlist(cur_microlist(0)) = i + do k=1,Nint + microlist(k,1,cur_microlist(0)) = minilist(k,1,i) + microlist(k,2,cur_microlist(0)) = minilist(k,2,i) + enddo + cur_microlist(0) = cur_microlist(0) + 1 + else + do s = 1, 2 + do j=1,n_element(s) + nt = list(j,s) + mo_tot_num * (s-1) + idx_microlist(cur_microlist(nt)) = i + do k=1,Nint + microlist(k,1,cur_microlist(nt)) = minilist(k,1,i) + microlist(k,2,cur_microlist(nt)) = minilist(k,2,i) + enddo + cur_microlist(nt) = cur_microlist(nt) + 1 + end do + end do + end if + end do +end subroutine + + +subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, Nint) + use bitmasks + integer, intent(in) :: Nint, i_cur, N_minilist + integer(bit_kind), intent(in) :: minilist(Nint,2,N_minilist), key_mask(Nint,2) + + integer, intent(out) :: N_microlist(0:mo_tot_num*2), ptr_microlist(0:mo_tot_num*2+1), idx_microlist(N_minilist*4) + integer(bit_kind), intent(out) :: microlist(Nint,2,N_minilist*4) + + integer :: i,j,k,s,nt,n_element(2) + integer :: list(Nint*bit_kind_size,2), cur_microlist(0:mo_tot_num*2+1) + integer(bit_kind) :: key_mask_neg(Nint,2), mobileMask(Nint,2) + integer :: mo_tot_num_2 + mo_tot_num_2 = mo_tot_num+mo_tot_num + + + do i=1,Nint + key_mask_neg(i,1) = not(key_mask(i,1)) + key_mask_neg(i,2) = not(key_mask(i,2)) + end do + + do i=0,mo_tot_num_2 + N_microlist(i) = 0 + enddo + + do i=1, N_minilist + nt = 0 + do j=1,Nint + mobileMask(j,1) = iand(key_mask_neg(j,1), minilist(j,1,i)) + mobileMask(j,2) = iand(key_mask_neg(j,2), minilist(j,2,i)) + nt += popcnt(mobileMask(j, 1)) + popcnt(mobileMask(j, 2)) + end do + + if(nt > 4) then !! TOO MANY DIFFERENCES + continue + else if(nt < 3 .and. i < i_cur) then + N_microlist = 0 !!!! PAST LINKED TO EVERYBODY! + ptr_microlist = 1 + return + else if(nt == 4) then + call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), Nint) + call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), Nint) + + do s=1,2 + do j=1,n_element(s) + nt = list(j,s) + mo_tot_num * (s-1) + N_microlist(nt) = N_microlist(nt) + 1 + end do + end do + else + N_microlist(0) = N_microlist(0) + 1 + endif + end do + + ptr_microlist(0) = 1 + do i=1,mo_tot_num_2+1 + ptr_microlist(i) = ptr_microlist(i-1) + N_microlist(i-1) + end do + + do i=0,mo_tot_num_2+1 + cur_microlist(i) = ptr_microlist(i) + end do + + + do i=1, N_minilist + do j=1,Nint + mobileMask(j,1) = iand(key_mask_neg(j,1), minilist(j,1,i)) + mobileMask(j,2) = iand(key_mask_neg(j,2), minilist(j,2,i)) + end do + + call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), Nint) + call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), Nint) + + + if(n_element(1) + n_element(2) < 4) then + idx_microlist(cur_microlist(0)) = i + do k=1,Nint + microlist(k,1,cur_microlist(0)) = minilist(k,1,i) + microlist(k,2,cur_microlist(0)) = minilist(k,2,i) + enddo + cur_microlist(0) = cur_microlist(0) + 1 + else + do s = 1, 2 + do j=1,n_element(s) + nt = list(j,s) + mo_tot_num * (s-1) + idx_microlist(cur_microlist(nt)) = i + do k=1,Nint + microlist(k,1,cur_microlist(nt)) = minilist(k,1,i) + microlist(k,2,cur_microlist(nt)) = minilist(k,2,i) + enddo + cur_microlist(nt) = cur_microlist(nt) + 1 + end do + end do + end if + end do +end subroutine + From 1dff7b5426dff2f0472d7c33b4c1b226a82d5a5b Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 12 Jul 2016 14:29:17 +0200 Subject: [PATCH 047/216] working except for ZMQ --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 5 +- plugins/Full_CI_ZMQ/selection.irp.f | 121 +++++++++++++++------------- 2 files changed, 70 insertions(+), 56 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index bb954beb..23bd74f6 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -1,3 +1,4 @@ + program Full_CI_ZMQ use f77_zmq implicit none @@ -19,13 +20,15 @@ program Full_CI_ZMQ call receive_selected_determinants() else zmq_socket_push = new_zmq_push_socket() + do i=ithread,N_det_generators,nproc - print *, i , N_det_generators + print *, i , "/", N_det_generators !$OMP TASK DEFAULT(SHARED) call select_connected(i, 1.d-6, ci_electronic_energy,zmq_socket_push) !$OMP END TASK enddo !$OMP TASKWAIT + print *, "END .... " if (ithread == 1) then integer :: rc rc = f77_zmq_send(zmq_socket_push,0,1,0) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 2df9b5f5..96acbb46 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -1,3 +1,6 @@ + + + subroutine select_connected(i_generator,thr,E0,zmq_socket_push) use f77_zmq use bitmasks @@ -12,9 +15,9 @@ subroutine select_connected(i_generator,thr,E0,zmq_socket_push) ASSERT (thr >= 0.d0) integer(bit_kind) :: hole_mask(N_int,2), particle_mask(N_int,2) - double precision :: fock_diag_tmp(mo_tot_num) - call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) + double precision :: fock_diag_tmp(2,mo_tot_num+1) + call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) integer :: k,l do l=1,N_generators_bitmask do k=1,N_int @@ -23,10 +26,9 @@ subroutine select_connected(i_generator,thr,E0,zmq_socket_push) particle_mask(k,1) = iand(generators_bitmask(k,1,s_part,l), not(psi_det_generators(k,1,i_generator)) ) particle_mask(k,2) = iand(generators_bitmask(k,2,s_part,l), not(psi_det_generators(k,2,i_generator)) ) enddo - call select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) + call select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) enddo - end subroutine receive_selected_determinants() @@ -65,7 +67,7 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision, intent(in) :: E0(N_states) integer(ZMQ_PTR), intent(in) :: zmq_socket_push - + ASSERT (thr >= 0.d0) integer :: i,j,k,l @@ -136,6 +138,7 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, double precision :: psi_coef_microlist(psi_selectors_size * 4, N_states) call create_microlist_single(psi_selectors, i_generator, N_det_selectors, ion_det, microlist, idx_microlist, N_microlist, ptr_microlist, N_int) + do j=1, ptr_microlist(mo_tot_num * 2 + 1) - 1 psi_coef_microlist(j,:) = psi_selectors_coef(idx_microlist(j),:) enddo @@ -166,13 +169,17 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, if (.not. is_in_wavefunction(exc_det,N_int)) then ! Compute perturbative contribution and select determinant double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) + i_H_psi_value = 0d0 + i_H_psi_value2 = 0d0 + integer :: sporb -! call i_H_psi(exc_det,psi_det_connected,psi_coef_connected,N_int,N_det_connected,psi_selectors_size,N_states,i_H_psi_value) - !!!!!!!!!!! psi_selectors_size ? + +! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_psi_value) +! sporb = i_particle + (ispin - 1) * mo_tot_num - call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) - call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) - i_H_psi_value += i_H_psi_value2 + if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) + if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) + i_H_psi_value(:) = i_H_psi_value(:) + i_H_psi_value2(:) double precision :: Hii, diag_H_mat_elem_fock Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) @@ -185,13 +192,18 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, else e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) endif + + if (dabs(e_pert) > thr) then - integer :: rc - rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) - if (rc /= msg_size) then - stop 'Unable to send selected determinant' - endif + call debug_det(exc_det, N_int) +! integer :: rc +! rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) +! if (rc /= msg_size) then +! stop 'Unable to send selected determinant' +! endif endif + + enddo endif @@ -220,10 +232,10 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision, intent(in) :: E0(N_states) integer(ZMQ_PTR), intent(in) :: zmq_socket_push - + ASSERT (thr >= 0.d0) - integer :: i,j,k,l,j1,j2,i1,i2 + integer :: i,j,k,l,j1,j2,i1,i2,ib,jb integer :: msg_size msg_size = bit_kind*N_int*2 @@ -265,26 +277,25 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, do ispin1=1,2 do ispin2=1,ispin1 - ion_det = psi_det_generators(k,1,i_generator) ! do k=1,N_int ! ion_det(k,1) = psi_det_generators(k,1,i_generator) ! ion_det(k,2) = psi_det_generators(k,2,i_generator) ! enddo - integer :: i_hole1, i_hole2, j_hole, k_hole do i1=1, N_holes(ispin1) - do i2=i1+1, N_holes(ispin2) - i_hole1 = hole_list(i,ispin1) + ib = 1 + if(ispin1 == ispin2) ib = i1+1 + do i2=ib, N_holes(ispin2) + ion_det(:,:) = psi_det_generators(:,:,i_generator) + i_hole1 = hole_list(i1,ispin1) k_hole = ishft(i_hole1-1,-bit_kind_shift)+1 ! N_int j_hole = i_hole1-ishft(k_hole-1,bit_kind_shift)-1 ! bit index - ion_det(k_hole,ispin1) = ibclr(psi_det_generators(k_hole,ispin1,i_generator),j_hole) - - i_hole2 = hole_list(i,ispin2) + ion_det(k_hole,ispin1) = ibclr(ion_det(k_hole,ispin1),j_hole) + + i_hole2 = hole_list(i2,ispin2) k_hole = ishft(i_hole2-1,-bit_kind_shift)+1 ! N_int j_hole = i_hole2-ishft(k_hole-1,bit_kind_shift)-1 ! bit index - ion_det(k_hole,ispin2) = ibclr(psi_det_generators(k_hole,ispin2,i_generator),j_hole) - - + ion_det(k_hole,ispin2) = ibclr(ion_det(k_hole,ispin2),j_hole) ! Create the mini wave function where = ! -------------------------------------------------------------- @@ -297,7 +308,9 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, integer(bit_kind) :: microlist(N_int, 2, N_det_selectors * 4) double precision :: psi_coef_microlist(psi_selectors_size * 4, N_states) + call create_microlist_double(psi_selectors, i_generator, N_det_selectors, ion_det, microlist, idx_microlist, N_microlist, ptr_microlist, N_int) + do j=1, ptr_microlist(mo_tot_num * 2 + 1) - 1 psi_coef_microlist(j,:) = psi_selectors_coef(idx_microlist(j),:) !!!!!! : enddo @@ -305,32 +318,28 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, if(ptr_microlist(mo_tot_num * 2 + 1) == 1) then cycle endif - ! Create particles ! ---------------- do j1=1,N_particles(ispin1) - do j2=j1+1,N_particles(ispin2) + jb = 1 + if(ispin1 == ispin2) jb = j1+1 + do j2=jb,N_particles(ispin2) exc_det = ion_det - integer :: i_particle2 + integer :: i_particle2, k_particle, j_particle i_particle2 = particle_list(j2, ispin2) - ! Apply the particle k_particle = ishft(i_particle2-1,-bit_kind_shift)+1 ! N_int j_particle = i_particle2-ishft(k_particle-1,bit_kind_shift)-1 ! bit index - exc_det(k_particle,ispin2) = ibset(ion_det(k_particle,ispin2),j_particle) + exc_det(k_particle,ispin2) = ibset(exc_det(k_particle,ispin2),j_particle) integer :: i_particle1 - i_particle1 = particle_list(j1,ispin1) - + i_particle1 = particle_list(j1, ispin1) ! Apply the particle - integer :: j_particle, k_particle k_particle = ishft(i_particle1-1,-bit_kind_shift)+1 ! N_int j_particle = i_particle1-ishft(k_particle-1,bit_kind_shift)-1 ! bit index - exc_det(k_particle,ispin1) = ibset(ion_det(k_particle,ispin1),j_particle) - - + exc_det(k_particle,ispin1) = ibset(exc_det(k_particle,ispin1),j_particle) if(N_microlist(i_particle1 + (ispin1 - 1) * mo_tot_num) < N_microlist(i_particle2 + (ispin2 - 1) * mo_tot_num)) then @@ -345,15 +354,16 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, if (.not. is_in_wavefunction(exc_det,N_int)) then ! Compute perturbative contribution and select determinant double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) + i_H_psi_value = 0d0 + i_H_psi_value2 = 0d0 integer :: sporb -! call i_H_psi(exc_det,psi_det_connected,psi_coef_connected,N_int,N_det_connected,psi_selectors_size,N_states,i_H_psi_value) - !!!!!!!!!!! psi_selectors_size ? - call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) - call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) - i_H_psi_value += i_H_psi_value2 +! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_psi_value) + + if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) + if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) + i_H_psi_value = i_H_psi_value + i_H_psi_value2 double precision :: Hii, diag_H_mat_elem_fock Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) - double precision :: delta_E, e_pert do k=1,N_states if (i_H_psi_value(k) == 0.d0) cycle @@ -364,6 +374,7 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) endif if (dabs(e_pert) > thr) then +! call debug_det(exc_det, N_int) integer :: rc rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) if (rc /= msg_size) then @@ -422,7 +433,7 @@ subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microl if(nt > 3) then !! TOO MANY DIFFERENCES continue else if(nt < 3) then - if(i < i_cur) then + if(i < i_cur .and. .false.) then !!!!!!!!!!!!!!!!!!!!! DESACTIVADO N_microlist = 0 !!!! PAST LINKED TO EVERYBODY! ptr_microlist = 1 return @@ -469,16 +480,16 @@ subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microl microlist(k,2,cur_microlist(0)) = minilist(k,2,i) enddo cur_microlist(0) = cur_microlist(0) + 1 - else + else if(n_element(1) + n_element(2) == 3) then do s = 1, 2 do j=1,n_element(s) - nt = list(j,s) + mo_tot_num * (s-1) - idx_microlist(cur_microlist(nt)) = i - do k=1,Nint - microlist(k,1,cur_microlist(nt)) = minilist(k,1,i) - microlist(k,2,cur_microlist(nt)) = minilist(k,2,i) - enddo - cur_microlist(nt) = cur_microlist(nt) + 1 + nt = list(j,s) + mo_tot_num * (s-1) + idx_microlist(cur_microlist(nt)) = i + do k=1,Nint + microlist(k,1,cur_microlist(nt)) = minilist(k,1,i) + microlist(k,2,cur_microlist(nt)) = minilist(k,2,i) + enddo + cur_microlist(nt) = cur_microlist(nt) + 1 end do end do end if @@ -520,7 +531,7 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl if(nt > 4) then !! TOO MANY DIFFERENCES continue - else if(nt < 3 .and. i < i_cur) then + else if(nt < 3 .and. i < i_cur .and. .false.) then N_microlist = 0 !!!! PAST LINKED TO EVERYBODY! ptr_microlist = 1 return @@ -566,7 +577,7 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl microlist(k,2,cur_microlist(0)) = minilist(k,2,i) enddo cur_microlist(0) = cur_microlist(0) + 1 - else + else if(n_element(1) + n_element(2) == 4) then do s = 1, 2 do j=1,n_element(s) nt = list(j,s) + mo_tot_num * (s-1) From 0c30dc29d3c4778234a0abe8e390d38a234589c3 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 13 Jul 2016 01:10:36 +0200 Subject: [PATCH 048/216] Corrected norm in MRCC --- config/ifort.cfg | 2 +- plugins/MRCC_Utils/mrcc_utils.irp.f | 2 +- .../ao_bielec_integrals_in_map_slave.irp.f | 23 +++++++++++-------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/config/ifort.cfg b/config/ifort.cfg index 585e4744..5002ae89 100644 --- a/config/ifort.cfg +++ b/config/ifort.cfg @@ -32,7 +32,7 @@ OPENMP : 1 ; Append OpenMP flags # [OPT] FC : -traceback -FCFLAGS : -xSSE4.2 -O2 -ip -ftz -g +FCFLAGS : -xHost -O2 -ip -ftz -g # Profiling flags ################# diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 6c2eb133..06a6814d 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -699,7 +699,7 @@ BEGIN_PROVIDER [ double precision, dIj_unique, (hh_shortcut(hh_shortcut(0)+1)-1, end do - t = (1d0 / norm_cas - 1d0) / t + t = (1d0 - norm_cas ) / t x_new = x_new * sqrt(t) do j=1, size(X) diff --git a/src/Integrals_Bielec/ao_bielec_integrals_in_map_slave.irp.f b/src/Integrals_Bielec/ao_bielec_integrals_in_map_slave.irp.f index ae8248a6..367643be 100644 --- a/src/Integrals_Bielec/ao_bielec_integrals_in_map_slave.irp.f +++ b/src/Integrals_Bielec/ao_bielec_integrals_in_map_slave.irp.f @@ -34,25 +34,25 @@ subroutine push_integrals(zmq_socket_push, n_integrals, buffer_i, buffer_value, rc = f77_zmq_send( zmq_socket_push, n_integrals, 4, ZMQ_SNDMORE) if (rc /= 4) then - print *, irp_here, 'f77_zmq_send( zmq_socket_push, n_integrals, 4, ZMQ_SNDMORE)' + print *, irp_here, ': f77_zmq_send( zmq_socket_push, n_integrals, 4, ZMQ_SNDMORE)' stop 'error' endif rc = f77_zmq_send( zmq_socket_push, buffer_i, key_kind*n_integrals, ZMQ_SNDMORE) if (rc /= key_kind*n_integrals) then - print *, irp_here, 'f77_zmq_send( zmq_socket_push, buffer_i, key_kind*n_integrals, ZMQ_SNDMORE)' + print *, irp_here, ': f77_zmq_send( zmq_socket_push, buffer_i, key_kind*n_integrals, ZMQ_SNDMORE)' stop 'error' endif rc = f77_zmq_send( zmq_socket_push, buffer_value, integral_kind*n_integrals, ZMQ_SNDMORE) if (rc /= integral_kind*n_integrals) then - print *, irp_here, 'f77_zmq_send( zmq_socket_push, buffer_value, integral_kind*n_integrals, 0)' + print *, irp_here, ': f77_zmq_send( zmq_socket_push, buffer_value, integral_kind*n_integrals, 0)' stop 'error' endif rc = f77_zmq_send( zmq_socket_push, task_id, 4, 0) if (rc /= 4) then - print *, irp_here, 'f77_zmq_send( zmq_socket_push, task_id, 4, 0)' + print *, irp_here, ': f77_zmq_send( zmq_socket_push, task_id, 4, 0)' stop 'error' endif @@ -60,7 +60,7 @@ subroutine push_integrals(zmq_socket_push, n_integrals, buffer_i, buffer_value, ! integer :: idummy ! rc = f77_zmq_recv( zmq_socket_push, idummy, 4, 0) ! if (rc /= 4) then -! print *, irp_here, 'f77_zmq_send( zmq_socket_push, idummy, 4, 0)' +! print *, irp_here, ': f77_zmq_send( zmq_socket_push, idummy, 4, 0)' ! stop 'error' ! endif end @@ -138,7 +138,7 @@ subroutine pull_integrals(zmq_socket_pull, n_integrals, buffer_i, buffer_value, return endif if (rc /= 4) then - print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, n_integrals, 4, 0)' + print *, irp_here, ': f77_zmq_recv( zmq_socket_pull, n_integrals, 4, 0)' stop 'error' endif @@ -146,19 +146,20 @@ subroutine pull_integrals(zmq_socket_pull, n_integrals, buffer_i, buffer_value, rc = f77_zmq_recv( zmq_socket_pull, buffer_i, key_kind*n_integrals, 0) if (rc /= key_kind*n_integrals) then - print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, buffer_i, key_kind*n_integrals, 0)' + print *, rc, key_kind, n_integrals + print *, irp_here, ': f77_zmq_recv( zmq_socket_pull, buffer_i, key_kind*n_integrals, 0)' stop 'error' endif rc = f77_zmq_recv( zmq_socket_pull, buffer_value, integral_kind*n_integrals, 0) if (rc /= integral_kind*n_integrals) then - print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, buffer_value, integral_kind*n_integrals, 0)' + print *, irp_here, ': f77_zmq_recv( zmq_socket_pull, buffer_value, integral_kind*n_integrals, 0)' stop 'error' endif rc = f77_zmq_recv( zmq_socket_pull, task_id, 4, 0) if (rc /= 4) then - print *, irp_here, 'f77_zmq_recv( zmq_socket_pull, task_id, 4, 0)' + print *, irp_here, ': f77_zmq_recv( zmq_socket_pull, task_id, 4, 0)' stop 'error' endif @@ -167,7 +168,7 @@ subroutine pull_integrals(zmq_socket_pull, n_integrals, buffer_i, buffer_value, ! Activate if zmq_socket_pull is a REP ! rc = f77_zmq_send( zmq_socket_pull, 0, 4, 0) ! if (rc /= 4) then -! print *, irp_here, ' f77_zmq_send (zmq_socket_pull,...' +! print *, irp_here, ' : f77_zmq_send (zmq_socket_pull,...' ! stop 'error' ! endif @@ -207,7 +208,9 @@ subroutine ao_bielec_integrals_in_map_collector do while (more == 1) call pull_integrals(zmq_socket_pull, n_integrals, buffer_i, buffer_value, task_id) + if (n_integrals >= 0) then + call insert_into_ao_integrals_map(n_integrals,buffer_i,buffer_value) accu += n_integrals if (task_id /= 0) then From 4c436783ce08348f712a33034a6bd6798d037533 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 13 Jul 2016 01:12:05 +0200 Subject: [PATCH 049/216] Better Davidson parallelization --- src/Determinants/davidson.irp.f | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Determinants/davidson.irp.f b/src/Determinants/davidson.irp.f index a4166e10..e7480ca2 100644 --- a/src/Determinants/davidson.irp.f +++ b/src/Determinants/davidson.irp.f @@ -492,34 +492,42 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun ! -------------------------------------------------- !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(k,i,l,iter2) SHARED(U,W,R,y,iter,lambda,N_st,sze) + !$OMP PRIVATE(k,i,l,iter2) & + !$OMP SHARED(U,W,R,y,iter,lambda,N_st,sze,to_print, & + !$OMP residual_norm,nuclear_repulsion) do k=1,N_st !$OMP DO do i=1,sze U(i,k,iter+1) = 0.d0 W(i,k,iter+1) = 0.d0 + enddo + !$OMP END DO + do iter2=1,iter do l=1,N_st - do iter2=1,iter + !$OMP DO + do i=1,sze U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1) W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1) enddo + !$OMP END DO NOWAIT enddo enddo - !$OMP END DO - enddo - !$OMP END PARALLEL - ! Compute residual vector - ! ----------------------- + ! Compute residual vector + ! ----------------------- - do k=1,N_st + !$OMP DO do i=1,sze R(i,k) = lambda(k) * U(i,k,iter+1) - W(i,k,iter+1) enddo + !$OMP END DO + !$OMP SINGLE residual_norm(k) = u_dot_u(R(1,k),sze) to_print(1,k) = lambda(k) + nuclear_repulsion to_print(2,k) = residual_norm(k) + !$OMP END SINGLE enddo + !$OMP END PARALLEL write(iunit,'(X,I3,X,100(X,F16.10,X,E16.6))') iter, to_print(:,1:N_st) call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_st,converged) From d49776cad75035a591b4f081ceac15e9fe884029 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 13 Jul 2016 09:06:06 +0200 Subject: [PATCH 050/216] Travis did not compile --- plugins/MRCC_Utils/mrcc_utils.irp.f | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 06a6814d..c231b0b8 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -728,6 +728,7 @@ END_PROVIDER BEGIN_PROVIDER [ double precision, dij, (N_det_ref, N_det_non_ref, N_states) ] integer :: s,i,j + double precision, external :: get_dij_index print *, "computing amplitudes..." do s=1, N_states do i=1, N_det_non_ref From ece06c79ae58efe91499a0a162e6a66b7c344bef Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 13 Jul 2016 11:32:31 +0200 Subject: [PATCH 051/216] actually working except for ZMQ... --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 6 +- plugins/Full_CI_ZMQ/selection.irp.f | 139 +++++++++++++++++++++------- 2 files changed, 111 insertions(+), 34 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 23bd74f6..221a1821 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -23,11 +23,11 @@ program Full_CI_ZMQ do i=ithread,N_det_generators,nproc print *, i , "/", N_det_generators - !$OMP TASK DEFAULT(SHARED) + !!$OMP TASK DEFAULT(SHARED) call select_connected(i, 1.d-6, ci_electronic_energy,zmq_socket_push) - !$OMP END TASK + !!$OMP END TASK enddo - !$OMP TASKWAIT + !!$OMP TASKWAIT print *, "END .... " if (ithread == 1) then integer :: rc diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 96acbb46..75029e5f 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -16,19 +16,29 @@ subroutine select_connected(i_generator,thr,E0,zmq_socket_push) integer(bit_kind) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision :: fock_diag_tmp(2,mo_tot_num+1) - + + call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) integer :: k,l + + do l=1,N_generators_bitmask do k=1,N_int hole_mask(k,1) = iand(generators_bitmask(k,1,s_hole,l), psi_det_generators(k,1,i_generator)) hole_mask(k,2) = iand(generators_bitmask(k,2,s_hole,l), psi_det_generators(k,2,i_generator)) particle_mask(k,1) = iand(generators_bitmask(k,1,s_part,l), not(psi_det_generators(k,1,i_generator)) ) particle_mask(k,2) = iand(generators_bitmask(k,2,s_part,l), not(psi_det_generators(k,2,i_generator)) ) + + hole_mask(k,1) = ior(generators_bitmask(k,1,s_hole,l), generators_bitmask(k,1,s_part,l)) + hole_mask(k,2) = ior(generators_bitmask(k,2,s_hole,l), generators_bitmask(k,2,s_part,l)) + particle_mask(k,:) = hole_mask(k,:) enddo + call select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) call select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) enddo + + end subroutine receive_selected_determinants() @@ -41,15 +51,29 @@ subroutine receive_selected_determinants() integer(ZMQ_PTR) :: zmq_socket_pull integer(ZMQ_PTR) :: new_zmq_pull_socket - integer(bit_kind) :: received_det(N_int,2) + integer(bit_kind) :: received_det(N_int,2), shtak(N_int, 2, 100000) integer :: msg_size, rc + integer :: acc, tac, j + logical, external :: detEq + acc = 0 + tac = 0 msg_size = bit_kind*N_int*2 zmq_socket_pull = new_zmq_pull_socket() - do while (f77_zmq_recv(zmq_socket_pull, received_det, msg_size, 0) == msg_size) + grab : do while (f77_zmq_recv(zmq_socket_pull, received_det, msg_size, 0) == msg_size) + tac += 1 + do j=1,acc + if(detEq(received_det, shtak(1,1,j), N_int)) then + cycle grab + endif + end do + acc += 1 + shtak(:,:,acc) = received_det call debug_det(received_det,N_int) - end do + print *, "tot ", acc, tac + end do grab + print *, "tot ", acc, tac call end_zmq_pull_socket(zmq_socket_pull) end @@ -86,7 +110,6 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, particle(k,2) = iand(not(psi_det_generators(k,2,i_generator)), particle_mask(k,2)) enddo - ! Create lists of holes and particles ! ----------------------------------- @@ -96,7 +119,7 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) - + if(N_particles(1) /= (27-9) .or. N_particles(2) /= (27-8) .or. N_holes(1) /= 4 .or. N_holes(2) /= 3) stop "wyyyzkklk" ! Create excited determinants ! --------------------------- @@ -111,11 +134,13 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, enddo do ispin=1,2 - do k=1,N_int - ion_det(k,ispin) = psi_det_generators(k,ispin,i_generator) - enddo +! do k=1,N_int +! ion_det(k,ispin) = psi_det_generators(k,ispin,i_generator) +! enddo + do i=1, N_holes(ispin) + ion_det(:,:) = psi_det_generators(:,:,i_generator) integer :: i_hole i_hole = hole_list(i,ispin) @@ -123,7 +148,8 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, integer :: j_hole, k_hole k_hole = ishft(i_hole-1,-bit_kind_shift)+1 ! N_int j_hole = i_hole-ishft(k_hole-1,bit_kind_shift)-1 ! bit index - ion_det(k_hole,ispin) = ibclr(psi_det_generators(k_hole,ispin,i_generator),j_hole) +! ion_det(k_hole,ispin) = ibclr(psi_det_generators(k_hole,ispin,i_generator),j_hole) + ion_det(k_hole,ispin) = ibclr(ion_det(k_hole,ispin),j_hole) ! Create the mini wave function where = ! -------------------------------------------------------------- @@ -151,8 +177,9 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, ! ---------------- do j=1,N_particles(ispin) - exc_det(k_hole,ispin) = ion_det(k_hole,ispin) - +! exc_det(k_hole,ispin) = ion_det(k_hole,ispin) + exc_det(:,:) = ion_det(:,:) + integer :: i_particle i_particle = particle_list(j,ispin) @@ -160,11 +187,13 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, integer :: j_particle, k_particle k_particle = ishft(i_particle-1,-bit_kind_shift)+1 ! N_int j_particle = i_particle-ishft(k_particle-1,bit_kind_shift)-1 ! bit index - exc_det(k_particle,ispin) = ibset(ion_det(k_particle,ispin),j_particle) +! exc_det(k_particle,ispin) = ibset(ion_det(k_particle,ispin),j_particle) + exc_det(k_particle,ispin) = ibset(exc_det(k_particle,ispin),j_particle) ! TODO logical, external :: is_in_wavefunction + logical :: nok ! TODO : Check connected to ref if (.not. is_in_wavefunction(exc_det,N_int)) then ! Compute perturbative contribution and select determinant @@ -175,8 +204,14 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, integer :: sporb ! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_psi_value) -! +! + nok = .false. sporb = i_particle + (ispin - 1) * mo_tot_num +! ! +! if(N_microlist(sporb) > 0) call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) +! if(nok) cycle +! + if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) i_H_psi_value(:) = i_H_psi_value(:) + i_H_psi_value2(:) @@ -195,12 +230,11 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, if (dabs(e_pert) > thr) then - call debug_det(exc_det, N_int) -! integer :: rc -! rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) -! if (rc /= msg_size) then -! stop 'Unable to send selected determinant' -! endif + integer :: rc + rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) + if (rc /= msg_size) then + stop 'Unable to send selected determinant' + endif endif @@ -232,7 +266,8 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision, intent(in) :: E0(N_states) integer(ZMQ_PTR), intent(in) :: zmq_socket_push - + double precision, save :: med = 0d0 + double precision, save :: nmed = 0d0 ASSERT (thr >= 0.d0) integer :: i,j,k,l,j1,j2,i1,i2,ib,jb @@ -251,7 +286,6 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, particle(k,2) = iand(not(psi_det_generators(k,2,i_generator)), particle_mask(k,2)) enddo - ! Create lists of holes and particles ! ----------------------------------- @@ -262,6 +296,8 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) + if(N_particles(1) /= (27-9) .or. N_particles(2) /= (27-8) .or. N_holes(1) /= 4 .or. N_holes(2) /= 3) stop "wyyyzkklk" + ! Create excited determinants ! --------------------------- @@ -277,16 +313,13 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, do ispin1=1,2 do ispin2=1,ispin1 -! do k=1,N_int -! ion_det(k,1) = psi_det_generators(k,1,i_generator) -! ion_det(k,2) = psi_det_generators(k,2,i_generator) -! enddo integer :: i_hole1, i_hole2, j_hole, k_hole do i1=1, N_holes(ispin1) ib = 1 if(ispin1 == ispin2) ib = i1+1 do i2=ib, N_holes(ispin2) ion_det(:,:) = psi_det_generators(:,:,i_generator) +! call set_hole(ion_det, hole_list(i1,ispin1), ispin1, hole_list(i1,ispin1), ispin1, Nint) i_hole1 = hole_list(i1,ispin1) k_hole = ishft(i_hole1-1,-bit_kind_shift)+1 ! N_int j_hole = i_hole1-ishft(k_hole-1,bit_kind_shift)-1 ! bit index @@ -296,6 +329,8 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, k_hole = ishft(i_hole2-1,-bit_kind_shift)+1 ! N_int j_hole = i_hole2-ishft(k_hole-1,bit_kind_shift)-1 ! bit index ion_det(k_hole,ispin2) = ibclr(ion_det(k_hole,ispin2),j_hole) + + ! Create the mini wave function where = ! -------------------------------------------------------------- @@ -347,9 +382,13 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, else sporb = i_particle2 + (ispin2 - 1) * mo_tot_num endif + nmed += N_microlist(0) + med += N_microlist(sporb) + print *, "MICRO", nmed / med ! TODO logical, external :: is_in_wavefunction + logical :: nok ! TODO : Check connected to ref if (.not. is_in_wavefunction(exc_det,N_int)) then ! Compute perturbative contribution and select determinant @@ -359,6 +398,13 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, integer :: sporb ! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_psi_value) +! call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) +! if(nok) cycle +! +! call check_past(exc_det, microlist, idx_microlist, N_microlist(0), i_generator, nok, N_int) +! if(nok) cycle +! + if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) i_H_psi_value = i_H_psi_value + i_H_psi_value2 @@ -374,7 +420,6 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) endif if (dabs(e_pert) > thr) then -! call debug_det(exc_det, N_int) integer :: rc rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) if (rc /= msg_size) then @@ -433,9 +478,10 @@ subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microl if(nt > 3) then !! TOO MANY DIFFERENCES continue else if(nt < 3) then - if(i < i_cur .and. .false.) then !!!!!!!!!!!!!!!!!!!!! DESACTIVADO - N_microlist = 0 !!!! PAST LINKED TO EVERYBODY! - ptr_microlist = 1 + if(i < i_cur) then !!!!!!!!!!!!!!!!!!!!! DESACTIVADO + print *, i, i_cur + N_microlist(:) = 0 !!!! PAST LINKED TO EVERYBODY! + ptr_microlist(:) = 1 return else !! FUTUR LINKED TO EVERYBODY N_microlist(0) = N_microlist(0) + 1 @@ -531,7 +577,7 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl if(nt > 4) then !! TOO MANY DIFFERENCES continue - else if(nt < 3 .and. i < i_cur .and. .false.) then + else if(nt < 3 .and. i < i_cur) then N_microlist = 0 !!!! PAST LINKED TO EVERYBODY! ptr_microlist = 1 return @@ -593,3 +639,34 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl end do end subroutine + +subroutine check_past(det, list, idx, N, cur, ok, Nint) + implicit none + use bitmasks + + integer(bit_kind), intent(in) :: det(Nint, 2), list(Nint, 2, N) + integer, intent(in) :: Nint, idx(N), N, cur + logical, intent(out) :: ok + integer :: i,s,ni + + ok = .false. + do i=1,N + if(idx(i) >= cur) exit + s = 0 + do ni=1,Nint + s += popcnt(xor(det(ni,1), list(ni,1,i))) + popcnt(xor(det(ni,2), list(ni,2,i))) + end do + if(s <= 4) then + if(s /= 2 .and. s /= 4) then + print *,s + call debug_det(det, N_int) + stop "s" + endif + ok = .true. + return + end if + end do +end subroutine + + + From 32e911cea8323a07dd5d7027f3f3278820820a9b Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 13 Jul 2016 13:17:26 +0200 Subject: [PATCH 052/216] union microlist --- plugins/Full_CI_ZMQ/selection.irp.f | 180 +++++++++++++++++++--------- 1 file changed, 124 insertions(+), 56 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 75029e5f..efeb4724 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -119,7 +119,7 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) - if(N_particles(1) /= (27-9) .or. N_particles(2) /= (27-8) .or. N_holes(1) /= 4 .or. N_holes(2) /= 3) stop "wyyyzkklk" + ! Create excited determinants ! --------------------------- @@ -206,12 +206,11 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, ! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_psi_value) ! nok = .false. - sporb = i_particle + (ispin - 1) * mo_tot_num -! ! -! if(N_microlist(sporb) > 0) call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) -! if(nok) cycle + sporb = i_particle + (ispin - 1) * mo_tot_num +! ! ! + if(N_microlist(sporb) > 0) call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) + if(nok) cycle ! - if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) i_H_psi_value(:) = i_H_psi_value(:) + i_H_psi_value2(:) @@ -266,8 +265,6 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision, intent(in) :: E0(N_states) integer(ZMQ_PTR), intent(in) :: zmq_socket_push - double precision, save :: med = 0d0 - double precision, save :: nmed = 0d0 ASSERT (thr >= 0.d0) integer :: i,j,k,l,j1,j2,i1,i2,ib,jb @@ -295,8 +292,6 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) - - if(N_particles(1) /= (27-9) .or. N_particles(2) /= (27-8) .or. N_holes(1) /= 4 .or. N_holes(2) /= 3) stop "wyyyzkklk" ! Create excited determinants ! --------------------------- @@ -343,48 +338,69 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, integer(bit_kind) :: microlist(N_int, 2, N_det_selectors * 4) double precision :: psi_coef_microlist(psi_selectors_size * 4, N_states) + integer :: idx_tmicrolist(N_det_selectors * 4), ptr_tmicrolist(0:mo_tot_num * 2 + 1), N_tmicrolist(0:mo_tot_num * 2) + integer(bit_kind) :: tmicrolist(N_int, 2, N_det_selectors * 4) + double precision :: psi_coef_tmicrolist(psi_selectors_size * 4, N_states) + + + call create_microlist_double(psi_selectors, i_generator, N_det_selectors, ion_det, & + microlist, idx_microlist, N_microlist, ptr_microlist, & + tmicrolist, idx_tmicrolist, N_tmicrolist, ptr_tmicrolist, & + N_int) - call create_microlist_double(psi_selectors, i_generator, N_det_selectors, ion_det, microlist, idx_microlist, N_microlist, ptr_microlist, N_int) do j=1, ptr_microlist(mo_tot_num * 2 + 1) - 1 - psi_coef_microlist(j,:) = psi_selectors_coef(idx_microlist(j),:) !!!!!! : + psi_coef_microlist(j,:) = psi_selectors_coef(idx_microlist(j),:) + enddo + do j=1, ptr_tmicrolist(mo_tot_num * 2 + 1) - 1 + psi_coef_tmicrolist(j,:) = psi_selectors_coef(idx_tmicrolist(j),:) enddo - if(ptr_microlist(mo_tot_num * 2 + 1) == 1) then + if(ptr_microlist(mo_tot_num * 2 + 1) == 1 .and. ptr_tmicrolist(mo_tot_num * 2 + 1) == 1) then cycle endif ! Create particles ! ---------------- - + integer :: i_particle1, i_particle2, k_particle, j_particle + + do j1=1,N_particles(ispin1) + i_particle1 = particle_list(j1, ispin1) + p1 = i_particle1 + (ispin1 - 1) * mo_tot_num + if(N_tmicrolist(p1) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p1)) < i_generator) cycle jb = 1 if(ispin1 == ispin2) jb = j1+1 do j2=jb,N_particles(ispin2) exc_det = ion_det - - integer :: i_particle2, k_particle, j_particle i_particle2 = particle_list(j2, ispin2) + + integer :: p1, p2 + + p2 = i_particle2 + (ispin2 - 1) * mo_tot_num + + + if(N_tmicrolist(p2) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p2)) < i_generator) cycle + + if(N_microlist(p1) < N_microlist(p2)) then + sporb = p1 + else + sporb = p2 + endif + + ! Apply the particle k_particle = ishft(i_particle2-1,-bit_kind_shift)+1 ! N_int j_particle = i_particle2-ishft(k_particle-1,bit_kind_shift)-1 ! bit index exc_det(k_particle,ispin2) = ibset(exc_det(k_particle,ispin2),j_particle) - integer :: i_particle1 - i_particle1 = particle_list(j1, ispin1) ! Apply the particle k_particle = ishft(i_particle1-1,-bit_kind_shift)+1 ! N_int j_particle = i_particle1-ishft(k_particle-1,bit_kind_shift)-1 ! bit index exc_det(k_particle,ispin1) = ibset(exc_det(k_particle,ispin1),j_particle) - if(N_microlist(i_particle1 + (ispin1 - 1) * mo_tot_num) < N_microlist(i_particle2 + (ispin2 - 1) * mo_tot_num)) then - sporb = i_particle1 + (ispin1 - 1) * mo_tot_num - else - sporb = i_particle2 + (ispin2 - 1) * mo_tot_num - endif - nmed += N_microlist(0) - med += N_microlist(sporb) - print *, "MICRO", nmed / med + + ! TODO logical, external :: is_in_wavefunction @@ -395,19 +411,53 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) i_H_psi_value = 0d0 i_H_psi_value2 = 0d0 + integer :: sporb ! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_psi_value) -! call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) -! if(nok) cycle -! + + ! call check_past(exc_det, microlist, idx_microlist, N_microlist(0), i_generator, nok, N_int) ! if(nok) cycle -! + + nok = .false. + call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) + if(nok) cycle if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) i_H_psi_value = i_H_psi_value + i_H_psi_value2 + + integer :: c1, c2 + double precision :: hij + c1 = ptr_tmicrolist(p1) + c2 = ptr_tmicrolist(p2) + do while(.true.) + if(c1 >= ptr_tmicrolist(p1+1) .or. c2 >= ptr_tmicrolist(p2+1)) then + call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_tmicrolist(p1+1)-c1 ,psi_selectors_size*4,N_states,i_H_psi_value2) + i_H_psi_value = i_H_psi_value + i_H_psi_value2 + + call i_H_psi(exc_det,tmicrolist(1,1,c2),psi_coef_tmicrolist(c2, 1),N_int, ptr_tmicrolist(p2+1)-c2 ,psi_selectors_size*4,N_states,i_H_psi_value2) + i_H_psi_value = i_H_psi_value + i_H_psi_value2 + exit + endif + + if(idx_tmicrolist(c1) < idx_tmicrolist(c2)) then + call i_H_j(exc_det,tmicrolist(1,1,c1),N_int,hij) + do j = 1, N_states + i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c1,j)*hij + enddo + c1 += 1 + else + call i_H_j(exc_det,tmicrolist(1,1,c2),N_int,hij) + do j = 1, N_states + i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c2,j)*hij + enddo + if(idx_tmicrolist(c1) == idx_tmicrolist(c2)) c1 = c1 + 1 + c2 += 1 + end if + enddo + double precision :: Hii, diag_H_mat_elem_fock Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) double precision :: delta_E, e_pert @@ -479,7 +529,6 @@ subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microl continue else if(nt < 3) then if(i < i_cur) then !!!!!!!!!!!!!!!!!!!!! DESACTIVADO - print *, i, i_cur N_microlist(:) = 0 !!!! PAST LINKED TO EVERYBODY! ptr_microlist(:) = 1 return @@ -543,7 +592,8 @@ subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microl end subroutine -subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, Nint) +subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, & + tmicrolist, idx_tmicrolist, N_tmicrolist, ptr_tmicrolist, Nint) use bitmasks integer, intent(in) :: Nint, i_cur, N_minilist integer(bit_kind), intent(in) :: minilist(Nint,2,N_minilist), key_mask(Nint,2) @@ -551,8 +601,11 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl integer, intent(out) :: N_microlist(0:mo_tot_num*2), ptr_microlist(0:mo_tot_num*2+1), idx_microlist(N_minilist*4) integer(bit_kind), intent(out) :: microlist(Nint,2,N_minilist*4) + integer, intent(out) :: N_tmicrolist(0:mo_tot_num*2), ptr_tmicrolist(0:mo_tot_num*2+1), idx_tmicrolist(N_minilist*4) + integer(bit_kind), intent(out) :: tmicrolist(Nint,2,N_minilist*4) + integer :: i,j,k,s,nt,n_element(2) - integer :: list(Nint*bit_kind_size,2), cur_microlist(0:mo_tot_num*2+1) + integer :: list(Nint*bit_kind_size,2), cur_microlist(0:mo_tot_num*2+1), cur_tmicrolist(0:mo_tot_num*2+1) integer(bit_kind) :: key_mask_neg(Nint,2), mobileMask(Nint,2) integer :: mo_tot_num_2 mo_tot_num_2 = mo_tot_num+mo_tot_num @@ -565,6 +618,7 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl do i=0,mo_tot_num_2 N_microlist(i) = 0 + N_tmicrolist(i) = 0 enddo do i=1, N_minilist @@ -577,32 +631,40 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl if(nt > 4) then !! TOO MANY DIFFERENCES continue - else if(nt < 3 .and. i < i_cur) then - N_microlist = 0 !!!! PAST LINKED TO EVERYBODY! - ptr_microlist = 1 - return - else if(nt == 4) then + else if(nt < 3) then + if(i < i_cur) then + N_microlist = 0 !!!! PAST LINKED TO EVERYBODY! + ptr_microlist = 1 + N_tmicrolist = 0 !!!! PAST LINKED TO EVERYBODY! + ptr_tmicrolist = 1 + return + else + N_microlist(0) = N_microlist(0) + 1 + endif + else call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), Nint) call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), Nint) do s=1,2 do j=1,n_element(s) - nt = list(j,s) + mo_tot_num * (s-1) - N_microlist(nt) = N_microlist(nt) + 1 + k = list(j,s) + mo_tot_num * (s-1) + if(nt == 4) N_microlist(k) = N_microlist(k) + 1 + if(nt == 3) N_tmicrolist(k) = N_tmicrolist(k) + 1 end do end do - else - N_microlist(0) = N_microlist(0) + 1 endif end do ptr_microlist(0) = 1 + ptr_tmicrolist(0) = 1 do i=1,mo_tot_num_2+1 ptr_microlist(i) = ptr_microlist(i-1) + N_microlist(i-1) + ptr_tmicrolist(i) = ptr_tmicrolist(i-1) + N_tmicrolist(i-1) end do do i=0,mo_tot_num_2+1 cur_microlist(i) = ptr_microlist(i) + cur_tmicrolist(i) = ptr_tmicrolist(i) end do @@ -615,24 +677,35 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), Nint) call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), Nint) - - if(n_element(1) + n_element(2) < 4) then + if(n_element(1) + n_element(2) > 4) then + cycle + else if(n_element(1) + n_element(2) < 3) then idx_microlist(cur_microlist(0)) = i do k=1,Nint microlist(k,1,cur_microlist(0)) = minilist(k,1,i) microlist(k,2,cur_microlist(0)) = minilist(k,2,i) enddo cur_microlist(0) = cur_microlist(0) + 1 - else if(n_element(1) + n_element(2) == 4) then + else ! if(n_element(1) + n_element(2) == 4) then do s = 1, 2 do j=1,n_element(s) nt = list(j,s) + mo_tot_num * (s-1) - idx_microlist(cur_microlist(nt)) = i - do k=1,Nint - microlist(k,1,cur_microlist(nt)) = minilist(k,1,i) - microlist(k,2,cur_microlist(nt)) = minilist(k,2,i) - enddo - cur_microlist(nt) = cur_microlist(nt) + 1 + + if(n_element(1) + n_element(2) == 4) then + idx_microlist(cur_microlist(nt)) = i + do k=1,Nint + microlist(k,1,cur_microlist(nt)) = minilist(k,1,i) + microlist(k,2,cur_microlist(nt)) = minilist(k,2,i) + enddo + cur_microlist(nt) = cur_microlist(nt) + 1 + else + idx_tmicrolist(cur_tmicrolist(nt)) = i + do k=1,Nint + tmicrolist(k,1,cur_tmicrolist(nt)) = minilist(k,1,i) + tmicrolist(k,2,cur_tmicrolist(nt)) = minilist(k,2,i) + enddo + cur_tmicrolist(nt) = cur_tmicrolist(nt) + 1 + endif end do end do end if @@ -657,11 +730,6 @@ subroutine check_past(det, list, idx, N, cur, ok, Nint) s += popcnt(xor(det(ni,1), list(ni,1,i))) + popcnt(xor(det(ni,2), list(ni,2,i))) end do if(s <= 4) then - if(s /= 2 .and. s /= 4) then - print *,s - call debug_det(det, N_int) - stop "s" - endif ok = .true. return end if From 6f6376782365200c529845dbb299bdad60d1d84d Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 13 Jul 2016 18:12:25 +0200 Subject: [PATCH 053/216] in progress - iterations --- configure | 2 +- install/scripts/install_zeromq.sh | 12 +++--- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 61 +++++++++++++++-------------- plugins/Full_CI_ZMQ/selection.irp.f | 26 +++++++++--- src/Determinants/H_apply.irp.f | 2 +- src/ZMQ/utils.irp.f | 18 ++++----- 6 files changed, 69 insertions(+), 52 deletions(-) diff --git a/configure b/configure index c3a22683..2e0d6c49 100755 --- a/configure +++ b/configure @@ -142,7 +142,7 @@ ezfio = Info( default_path=join(QP_ROOT_INSTALL, "EZFIO")) zeromq = Info( - url='http://download.zeromq.org/zeromq-4.0.7.tar.gz', + url='https://github.com/zeromq/zeromq4-1/releases/download/v4.1.5/zeromq-4.1.5.tar.gz', description=' ZeroMQ', default_path=join(QP_ROOT_LIB, "libzmq.a")) diff --git a/install/scripts/install_zeromq.sh b/install/scripts/install_zeromq.sh index 73b59019..3bf2a715 100755 --- a/install/scripts/install_zeromq.sh +++ b/install/scripts/install_zeromq.sh @@ -15,14 +15,14 @@ function _install() ./configure --without-libsodium || exit 1 make -j 8 || exit 1 rm -f -- "${QP_ROOT}"/lib/libzmq.a "${QP_ROOT}"/lib/libzmq.so "${QP_ROOT}"/lib/libzmq.so.? -# cp .libs/libzmq.a "${QP_ROOT}"/lib -# cp .libs/libzmq.so "${QP_ROOT}"/lib/libzmq.so.5 - cp src/.libs/libzmq.a "${QP_ROOT}"/lib - cp src/.libs/libzmq.so "${QP_ROOT}"/lib/libzmq.so.4 + cp .libs/libzmq.a "${QP_ROOT}"/lib + cp .libs/libzmq.so "${QP_ROOT}"/lib/libzmq.so.5 +# cp src/.libs/libzmq.a "${QP_ROOT}"/lib +# cp src/.libs/libzmq.so "${QP_ROOT}"/lib/libzmq.so.4 cp include/{zmq.h,zmq_utils.h} "${QP_ROOT}"/lib cd "${QP_ROOT}"/lib -# ln -s libzmq.so.5 libzmq.so - ln -s libzmq.so.4 libzmq.so + ln -s libzmq.so.5 libzmq.so +# ln -s libzmq.so.4 libzmq.so cd ${ORIG} return 0 } diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 221a1821..1a521ed1 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -9,37 +9,40 @@ program Full_CI_ZMQ integer :: i,ithread integer(ZMQ_PTR) :: zmq_socket_push - integer(ZMQ_PTR) :: new_zmq_push_socket + integer(ZMQ_PTR), external :: new_zmq_push_socket zmq_context = f77_zmq_ctx_new () - + PROVIDE H_apply_buffer_allocated + +! do while (N_det < N_det_max) - PROVIDE nproc - !$OMP PARALLEL PRIVATE(i,ithread,zmq_socket_push) num_threads(nproc+1) - ithread = omp_get_thread_num() - if (ithread == 0) then - call receive_selected_determinants() - else - zmq_socket_push = new_zmq_push_socket() - - do i=ithread,N_det_generators,nproc - print *, i , "/", N_det_generators - !!$OMP TASK DEFAULT(SHARED) - call select_connected(i, 1.d-6, ci_electronic_energy,zmq_socket_push) - !!$OMP END TASK - enddo - !!$OMP TASKWAIT - print *, "END .... " - if (ithread == 1) then - integer :: rc - rc = f77_zmq_send(zmq_socket_push,0,1,0) - if (rc /= 1) then - stop 'Error sending termination signal' - endif - endif - call end_zmq_push_socket(zmq_socket_push) - - endif - !$OMP END PARALLEL + PROVIDE ci_electronic_energy + PROVIDE nproc + !$OMP PARALLEL PRIVATE(i,ithread,zmq_socket_push) num_threads(nproc+1) + ithread = omp_get_thread_num() + if (ithread == 0) then + call receive_selected_determinants() + else + zmq_socket_push = new_zmq_push_socket() + do i=ithread,N_det_generators,nproc + print *, i , "/", N_det_generators + call select_connected(i, 1.d-7, ci_electronic_energy,zmq_socket_push) + enddo + print *, "END .... " + + if (ithread == 1) then + integer :: rc + rc = f77_zmq_send(zmq_socket_push,0,1,0) + if (rc /= 1) then + stop 'Error sending termination signal' + endif + endif + call end_zmq_push_socket(zmq_socket_push, 0) + endif + !$OMP END PARALLEL + call copy_H_apply_buffer_to_wf() + call diagonalize_CI + call save_wavefunction() +! end do end diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index efeb4724..5d0310ed 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -17,6 +17,9 @@ subroutine select_connected(i_generator,thr,E0,zmq_socket_push) double precision :: fock_diag_tmp(2,mo_tot_num+1) +! print *, i_generator, "MM" +! return + call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) integer :: k,l @@ -49,20 +52,22 @@ subroutine receive_selected_determinants() ! Receive via ZMQ the selected determinants END_DOC integer(ZMQ_PTR) :: zmq_socket_pull - integer(ZMQ_PTR) :: new_zmq_pull_socket + integer(ZMQ_PTR), external :: new_zmq_pull_socket - integer(bit_kind) :: received_det(N_int,2), shtak(N_int, 2, 100000) + integer(bit_kind) :: received_det(N_int,2), shtak(N_int, 2, 100) integer :: msg_size, rc - integer :: acc, tac, j - logical, external :: detEq + integer :: acc, tac, j, robin + logical, external :: detEq, is_in_wavefunction acc = 0 tac = 0 + robin = 0 msg_size = bit_kind*N_int*2 zmq_socket_pull = new_zmq_pull_socket() grab : do while (f77_zmq_recv(zmq_socket_pull, received_det, msg_size, 0) == msg_size) - tac += 1 + tac += 1 + if (is_in_wavefunction(received_det,N_int)) stop "???..." do j=1,acc if(detEq(received_det, shtak(1,1,j), N_int)) then cycle grab @@ -70,12 +75,21 @@ subroutine receive_selected_determinants() end do acc += 1 shtak(:,:,acc) = received_det + print *, acc, size(shtak, 3) + if(acc == size(shtak, 3)) then + print *, robin, nproc + call fill_H_apply_buffer_no_selection(acc,shtak,N_int,robin) + acc = 0 + robin += 1 + if(robin == nproc) robin = 0 + end if + call debug_det(received_det,N_int) print *, "tot ", acc, tac end do grab print *, "tot ", acc, tac + call fill_H_apply_buffer_no_selection(acc,shtak,N_int,robin) call end_zmq_pull_socket(zmq_socket_pull) - end subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) diff --git a/src/Determinants/H_apply.irp.f b/src/Determinants/H_apply.irp.f index 28513597..e5490e69 100644 --- a/src/Determinants/H_apply.irp.f +++ b/src/Determinants/H_apply.irp.f @@ -192,7 +192,7 @@ subroutine copy_H_apply_buffer_to_wf SOFT_TOUCH N_det psi_det psi_coef logical :: found_duplicates - call remove_duplicates_in_psi_det(found_duplicates) + !call remove_duplicates_in_psi_det(found_duplicates) end subroutine remove_duplicates_in_psi_det(found_duplicates) diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index af97161b..7164d9a6 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -347,19 +347,19 @@ subroutine end_zmq_pull_socket(zmq_socket_pull) integer :: rc character*(8), external :: zmq_port - rc = f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_inproc_address) +! rc = f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_inproc_address) +! if (rc /= 0) then +! print *, rc +! print *, irp_here, 'f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_inproc_address)' +! stop 'error' +! endif + + ! rc = f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_tcp_address) ! if (rc /= 0) then ! print *, rc -! print *, irp_here, 'f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_inproc_address)' +! print *, irp_here, 'f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_tcp_address)' ! stop 'error' ! endif - - rc = f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_tcp_address) - if (rc /= 0) then - print *, rc - print *, irp_here, 'f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_tcp_address)' - stop 'error' - endif call sleep(1) ! see https://github.com/zeromq/libzmq/issues/1922 From c9d6f89aa81aaaf02f74f190b754e6b997050ea0 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 18 Jul 2016 16:22:42 +0200 Subject: [PATCH 054/216] Change in MRCC_utils --- plugins/MRCC_Utils/mrcc_utils.irp.f | 2 +- .../ao_bielec_integrals_in_map_slave.irp.f | 100 ++++++++---------- 2 files changed, 43 insertions(+), 59 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index c231b0b8..315006ff 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -628,7 +628,7 @@ BEGIN_PROVIDER [ double precision, dIj_unique, (hh_shortcut(hh_shortcut(0)+1)-1, t = 0d0 r1 = 1 r2 = 1 - do while(A_ind(r1, at_row) * A_ind(r2, a_col) /= 0) + do while ((A_ind(r1, at_row) /= 0).and.(A_ind(r2, a_col) /= 0)) if(A_ind(r1, at_row) < A_ind(r2, a_col)) then r1 += 1 else if(A_ind(r1, at_row) > A_ind(r2, a_col)) then diff --git a/src/Integrals_Bielec/ao_bielec_integrals_in_map_slave.irp.f b/src/Integrals_Bielec/ao_bielec_integrals_in_map_slave.irp.f index 367643be..aa1d2420 100644 --- a/src/Integrals_Bielec/ao_bielec_integrals_in_map_slave.irp.f +++ b/src/Integrals_Bielec/ao_bielec_integrals_in_map_slave.irp.f @@ -118,61 +118,7 @@ subroutine ao_bielec_integrals_in_map_slave(thread,iproc) end -subroutine pull_integrals(zmq_socket_pull, n_integrals, buffer_i, buffer_value, task_id) - use f77_zmq - use map_module - implicit none - BEGIN_DOC - ! How the collector pulls the computed integrals - END_DOC - integer(ZMQ_PTR), intent(in) :: zmq_socket_pull - integer, intent(out) :: n_integrals - integer(key_kind), intent(out) :: buffer_i(*) - real(integral_kind), intent(out) :: buffer_value(*) - integer, intent(out) :: task_id - integer :: rc - - rc = f77_zmq_recv( zmq_socket_pull, n_integrals, 4, 0) - if (rc == -1) then - n_integrals = 0 - return - endif - if (rc /= 4) then - print *, irp_here, ': f77_zmq_recv( zmq_socket_pull, n_integrals, 4, 0)' - stop 'error' - endif - - if (n_integrals >= 0) then - - rc = f77_zmq_recv( zmq_socket_pull, buffer_i, key_kind*n_integrals, 0) - if (rc /= key_kind*n_integrals) then - print *, rc, key_kind, n_integrals - print *, irp_here, ': f77_zmq_recv( zmq_socket_pull, buffer_i, key_kind*n_integrals, 0)' - stop 'error' - endif - - rc = f77_zmq_recv( zmq_socket_pull, buffer_value, integral_kind*n_integrals, 0) - if (rc /= integral_kind*n_integrals) then - print *, irp_here, ': f77_zmq_recv( zmq_socket_pull, buffer_value, integral_kind*n_integrals, 0)' - stop 'error' - endif - - rc = f77_zmq_recv( zmq_socket_pull, task_id, 4, 0) - if (rc /= 4) then - print *, irp_here, ': f77_zmq_recv( zmq_socket_pull, task_id, 4, 0)' - stop 'error' - endif - - endif -! Activate if zmq_socket_pull is a REP -! rc = f77_zmq_send( zmq_socket_pull, 0, 4, 0) -! if (rc /= 4) then -! print *, irp_here, ' : f77_zmq_send (zmq_socket_pull,...' -! stop 'error' -! endif - -end subroutine ao_bielec_integrals_in_map_collector @@ -196,21 +142,59 @@ subroutine ao_bielec_integrals_in_map_collector integer(ZMQ_PTR) :: zmq_socket_pull integer*8 :: control, accu - integer :: task_id, more + integer :: task_id, more, sze zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() zmq_socket_pull = new_zmq_pull_socket() - allocate ( buffer_i(ao_num*ao_num), buffer_value(ao_num*ao_num) ) + sze = ao_num*ao_num + allocate ( buffer_i(sze), buffer_value(sze) ) accu = 0_8 more = 1 do while (more == 1) - call pull_integrals(zmq_socket_pull, n_integrals, buffer_i, buffer_value, task_id) - + rc = f77_zmq_recv( zmq_socket_pull, n_integrals, 4, 0) + if (rc == -1) then + n_integrals = 0 + return + endif + if (rc /= 4) then + print *, irp_here, ': f77_zmq_recv( zmq_socket_pull, n_integrals, 4, 0)' + stop 'error' + endif + if (n_integrals >= 0) then + if (n_integrals > sze) then + deallocate (buffer_value, buffer_i) + sze = n_integrals + allocate (buffer_value(sze), buffer_i(sze)) + endif + + rc = f77_zmq_recv( zmq_socket_pull, buffer_i, key_kind*n_integrals, 0) + if (rc /= key_kind*n_integrals) then + print *, rc, key_kind, n_integrals + print *, irp_here, ': f77_zmq_recv( zmq_socket_pull, buffer_i, key_kind*n_integrals, 0)' + stop 'error' + endif + + rc = f77_zmq_recv( zmq_socket_pull, buffer_value, integral_kind*n_integrals, 0) + if (rc /= integral_kind*n_integrals) then + print *, irp_here, ': f77_zmq_recv( zmq_socket_pull, buffer_value, integral_kind*n_integrals, 0)' + stop 'error' + endif + + rc = f77_zmq_recv( zmq_socket_pull, task_id, 4, 0) + +! Activate if zmq_socket_pull is a REP +! rc = f77_zmq_send( zmq_socket_pull, 0, 4, 0) +! if (rc /= 4) then +! print *, irp_here, ' : f77_zmq_send (zmq_socket_pull,...' +! stop 'error' +! endif + + call insert_into_ao_integrals_map(n_integrals,buffer_i,buffer_value) accu += n_integrals if (task_id /= 0) then From 59ace2439e4f2265c9241516eb262c24ccb9200f Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 19 Jul 2016 10:15:26 +0200 Subject: [PATCH 055/216] in progress - define number of determinants to add --- plugins/Full_CI/full_ci.irp.f | 1 + plugins/Full_CI_ZMQ/fci_zmq.irp.f | 192 +++++++++++++++-- plugins/Full_CI_ZMQ/selection.irp.f | 295 +++++++++++++++++++-------- plugins/mrcepa0/dressing_slave.irp.f | 3 - src/Determinants/H_apply.template.f | 7 + 5 files changed, 394 insertions(+), 104 deletions(-) diff --git a/plugins/Full_CI/full_ci.irp.f b/plugins/Full_CI/full_ci.irp.f index e6d0f7f2..e16397fc 100644 --- a/plugins/Full_CI/full_ci.irp.f +++ b/plugins/Full_CI/full_ci.irp.f @@ -42,6 +42,7 @@ program full_ci 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) + print *, selection_criterion, "*******************" n_det_before = N_det call H_apply_FCI(pt2, norm_pert, H_pert_diag, N_st) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 1a521ed1..e91268d0 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -1,5 +1,119 @@ -program Full_CI_ZMQ + +program fci_zmq + implicit none + integer :: i,k + + + double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) + 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) + provide selection_criterion + 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) + !selection_criterion = 1d-7 + print *, selection_criterion, "+++++++++++++++++++++++++++++++++++++++", N_det + n_det_before = N_det +! call H_apply_FCI(pt2, norm_pert, H_pert_diag, N_st) + call ZMQ_selection() + 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.1d0 + 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 +! print*,'Last iteration only to compute the PT2' +! threshold_selectors = 1.d0 +! threshold_generators = 0.999d0 +! call H_apply_FCI_PT2(pt2, norm_pert, H_pert_diag, N_st) +! +! print *, 'Final step' +! print *, 'N_det = ', N_det +! print *, 'N_states = ', N_states +! print *, 'PT2 = ', pt2 +! print *, 'E = ', CI_energy +! print *, 'E+PT2 = ', CI_energy+pt2 +! print *, '-----' +! call ezfio_set_full_ci_energy_pt2(CI_energy+pt2) +! endif + call save_wavefunction +end + + + +subroutine ZMQ_selection() use f77_zmq implicit none BEGIN_DOC @@ -7,14 +121,11 @@ program Full_CI_ZMQ END_DOC integer :: i,ithread - integer(ZMQ_PTR) :: zmq_socket_push integer(ZMQ_PTR), external :: new_zmq_push_socket zmq_context = f77_zmq_ctx_new () PROVIDE H_apply_buffer_allocated -! do while (N_det < N_det_max) - PROVIDE ci_electronic_energy PROVIDE nproc !$OMP PARALLEL PRIVATE(i,ithread,zmq_socket_push) num_threads(nproc+1) @@ -22,13 +133,12 @@ program Full_CI_ZMQ if (ithread == 0) then call receive_selected_determinants() else - zmq_socket_push = new_zmq_push_socket() + zmq_socket_push = new_zmq_push_socket(1) do i=ithread,N_det_generators,nproc - print *, i , "/", N_det_generators - call select_connected(i, 1.d-7, ci_electronic_energy,zmq_socket_push) + print *, i, "/", N_det_generators + call select_connected(i, max(100, N_det), ci_electronic_energy,zmq_socket_push) enddo - print *, "END .... " if (ithread == 1) then integer :: rc @@ -37,12 +147,68 @@ program Full_CI_ZMQ stop 'Error sending termination signal' endif endif - call end_zmq_push_socket(zmq_socket_push, 0) + call end_zmq_push_socket(zmq_socket_push, 1) endif !$OMP END PARALLEL call copy_H_apply_buffer_to_wf() - call diagonalize_CI - call save_wavefunction() -! end do - end + + + + + + + + + + + + + +! program Full_CI_ZMQ +! use f77_zmq +! implicit none +! BEGIN_DOC +! ! Massively parallel Full-CI +! END_DOC +! +! integer :: i,ithread +! +! integer(ZMQ_PTR) :: zmq_socket_push +! integer(ZMQ_PTR), external :: new_zmq_push_socket +! zmq_context = f77_zmq_ctx_new () +! PROVIDE H_apply_buffer_allocated +! +! do while (N_det < N_det_max) +! +! PROVIDE ci_electronic_energy +! PROVIDE nproc +! !$OMP PARALLEL PRIVATE(i,ithread,zmq_socket_push) num_threads(nproc+1) +! ithread = omp_get_thread_num() +! if (ithread == 0) then +! call receive_selected_determinants() +! else +! zmq_socket_push = new_zmq_push_socket(0) +! +! do i=ithread,N_det_generators,nproc +! print *, i , "/", N_det_generators +! call select_connected(i, 1.d-7, ci_electronic_energy,zmq_socket_push) +! enddo +! print *, "END .... " +! +! if (ithread == 1) then +! integer :: rc +! rc = f77_zmq_send(zmq_socket_push,0,1,0) +! if (rc /= 1) then +! stop 'Error sending termination signal' +! endif +! endif +! call end_zmq_push_socket(zmq_socket_push, 0) +! endif +! !$OMP END PARALLEL +! call copy_H_apply_buffer_to_wf() +! call diagonalize_CI() +! call save_wavefunction() +! end do +! +! end diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 5d0310ed..e725dd31 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -1,30 +1,28 @@ -subroutine select_connected(i_generator,thr,E0,zmq_socket_push) + +subroutine select_connected(i_generator,N,E0,zmq_socket_push) use f77_zmq use bitmasks + use selection_types implicit none integer, intent(in) :: i_generator - double precision, intent(in) :: thr + integer, intent(in) :: N double precision, intent(in) :: E0(N_states) integer(ZMQ_PTR), intent(in) :: zmq_socket_push BEGIN_DOC ! Select determinants connected to i_det by H END_DOC - ASSERT (thr >= 0.d0) integer(bit_kind) :: hole_mask(N_int,2), particle_mask(N_int,2) - double precision :: fock_diag_tmp(2,mo_tot_num+1) -! print *, i_generator, "MM" -! return - call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) integer :: k,l - - + type(selection_buffer) :: buf + call create_selection_buffer(N, N*2, buf) + buf%mini = 1d-7 do l=1,N_generators_bitmask do k=1,N_int hole_mask(k,1) = iand(generators_bitmask(k,1,s_hole,l), psi_det_generators(k,1,i_generator)) @@ -37,13 +35,93 @@ subroutine select_connected(i_generator,thr,E0,zmq_socket_push) particle_mask(k,:) = hole_mask(k,:) enddo - call select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) - call select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) + call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,buf) + call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,buf) enddo - + + call sort_selection_buffer(buf) + +! integer :: rc +! rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) +! if (rc /= msg_size) then +! stop 'Unable to send selected determinant' +! endif +! do k=1,buf%cur +! print *, buf%val(k) +! call debug_det(buf%det(1,1,k), N_int) +! end do end + +subroutine create_selection_buffer(N, siz, res) + use selection_types + implicit none + + integer, intent(in) :: N, siz + type(selection_buffer), intent(out) :: res + + allocate(res%det(N_int, 2, siz), res%val(siz)) + res%val = 0d0 + res%det = 0_8 + res%N = N + res%mini = 0d0 + res%cur = 0 +end subroutine + + +subroutine add_to_selection_buffer(b, det, val) + use selection_types + implicit none + + type(selection_buffer), intent(inout) :: b + integer(bit_kind), intent(in) :: det(N_int, 2) + double precision, intent(in) :: val + integer :: i + + if(dabs(val) >= b%mini) then + b%cur += 1 + b%det(:,:,b%cur) = det(:,:) + b%val(b%cur) = val + if(b%cur == size(b%val)) then + call sort_selection_buffer(b) + end if + end if +end subroutine + + +subroutine sort_selection_buffer(b) + use selection_types + implicit none + + type(selection_buffer), intent(inout) :: b + double precision, allocatable :: vals(:), absval(:) + integer, allocatable :: iorder(:) + integer(bit_kind), allocatable :: detmp(:,:,:) + integer :: i, nmwen + + nmwen = min(b%N, b%cur) + + allocate(iorder(b%cur), detmp(N_int, 2, nmwen), absval(b%cur), vals(nmwen)) + absval = -dabs(b%val(:b%cur)) + do i=1,b%cur + iorder(i) = i + end do + call dsort(absval, iorder, b%cur) + + do i=1, nmwen + detmp(:,:,i) = b%det(:,:,iorder(i)) + vals(i) = b%val(iorder(i)) + end do + b%det(:,:,:nmwen) = detmp(:,:,:) + b%det(:,:,nmwen+1:) = 0_bit_kind + b%val(:nmwen) = vals(:) + b%val(nmwen+1:) = 0d0 + b%mini = dabs(b%val(nmwen)) + b%cur = nmwen +end subroutine + + subroutine receive_selected_determinants() use f77_zmq use bitmasks @@ -51,62 +129,48 @@ subroutine receive_selected_determinants() BEGIN_DOC ! Receive via ZMQ the selected determinants END_DOC + integer(ZMQ_PTR) :: zmq_socket_pull integer(ZMQ_PTR), external :: new_zmq_pull_socket - integer(bit_kind) :: received_det(N_int,2), shtak(N_int, 2, 100) + integer(bit_kind) :: received_det(N_int,2), shtak(N_int, 2, 10000) integer :: msg_size, rc - integer :: acc, tac, j, robin - logical, external :: detEq, is_in_wavefunction + integer :: acc, j, robin + acc = 0 - tac = 0 robin = 0 msg_size = bit_kind*N_int*2 zmq_socket_pull = new_zmq_pull_socket() grab : do while (f77_zmq_recv(zmq_socket_pull, received_det, msg_size, 0) == msg_size) - tac += 1 - if (is_in_wavefunction(received_det,N_int)) stop "???..." - do j=1,acc - if(detEq(received_det, shtak(1,1,j), N_int)) then - cycle grab - endif - end do acc += 1 shtak(:,:,acc) = received_det - print *, acc, size(shtak, 3) if(acc == size(shtak, 3)) then - print *, robin, nproc call fill_H_apply_buffer_no_selection(acc,shtak,N_int,robin) acc = 0 robin += 1 if(robin == nproc) robin = 0 end if - - call debug_det(received_det,N_int) - print *, "tot ", acc, tac end do grab - print *, "tot ", acc, tac call fill_H_apply_buffer_no_selection(acc,shtak,N_int,robin) call end_zmq_pull_socket(zmq_socket_pull) end -subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) +subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,buf) use f77_zmq use bitmasks + use selection_types implicit none BEGIN_DOC ! Select determinants connected to i_det by H END_DOC integer, intent(in) :: i_generator - double precision, intent(in) :: thr double precision, intent(in) :: fock_diag_tmp(mo_tot_num) integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision, intent(in) :: E0(N_states) - integer(ZMQ_PTR), intent(in) :: zmq_socket_push + type(selection_buffer), intent(inout) :: buf - ASSERT (thr >= 0.d0) integer :: i,j,k,l @@ -146,7 +210,21 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, ion_det(k,1) = psi_det_generators(k,1,i_generator) ion_det(k,2) = psi_det_generators(k,2,i_generator) enddo + + + ! Create the mini wave function where = + ! -------------------------------------------------------------- +! integer(bit_kind) :: psi_det_connected(N_int,2,psi_selectors_size) +! double precision :: psi_coef_connected(psi_selectors_size,N_states) + + integer :: ptr_microlist(0:mo_tot_num * 2 + 1), N_microlist(0:mo_tot_num * 2) + integer, allocatable :: idx_microlist(:) + integer(bit_kind), allocatable :: microlist(:, :, :) + double precision, allocatable :: psi_coef_microlist(:,:) + + allocate(microlist(N_int, 2, N_det_selectors * 4), psi_coef_microlist(psi_selectors_size * 4, N_states), idx_microlist(N_det_selectors * 4)) + do ispin=1,2 ! do k=1,N_int ! ion_det(k,ispin) = psi_det_generators(k,ispin,i_generator) @@ -165,17 +243,6 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, ! ion_det(k_hole,ispin) = ibclr(psi_det_generators(k_hole,ispin,i_generator),j_hole) ion_det(k_hole,ispin) = ibclr(ion_det(k_hole,ispin),j_hole) - ! Create the mini wave function where = - ! -------------------------------------------------------------- - -! integer(bit_kind) :: psi_det_connected(N_int,2,psi_selectors_size) -! double precision :: psi_coef_connected(psi_selectors_size,N_states) - - - - integer :: idx_microlist(N_det_selectors * 4), ptr_microlist(0:mo_tot_num * 2 + 1), N_microlist(0:mo_tot_num * 2) - integer(bit_kind) :: microlist(N_int, 2, N_det_selectors * 4) - double precision :: psi_coef_microlist(psi_selectors_size * 4, N_states) call create_microlist_single(psi_selectors, i_generator, N_det_selectors, ion_det, microlist, idx_microlist, N_microlist, ptr_microlist, N_int) @@ -242,12 +309,8 @@ subroutine select_singles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, endif - if (dabs(e_pert) > thr) then - integer :: rc - rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) - if (rc /= msg_size) then - stop 'Unable to send selected determinant' - endif + if (dabs(e_pert) >= buf%mini) then + call add_to_selection_buffer(buf, exc_det, e_pert) endif @@ -266,20 +329,19 @@ end -subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp,E0,zmq_socket_push) +subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, buf) use f77_zmq use bitmasks + use selection_types implicit none BEGIN_DOC ! Select determinants connected to i_det by H END_DOC integer, intent(in) :: i_generator - double precision, intent(in) :: thr double precision, intent(in) :: fock_diag_tmp(mo_tot_num) integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision, intent(in) :: E0(N_states) - integer(ZMQ_PTR), intent(in) :: zmq_socket_push - ASSERT (thr >= 0.d0) + type(selection_buffer), intent(inout) :: buf integer :: i,j,k,l,j1,j2,i1,i2,ib,jb @@ -312,7 +374,25 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, integer :: ispin1, ispin2, other_spin integer(bit_kind) :: exc_det(N_int,2), ion_det(N_int,2) - + + + integer :: ptr_microlist(0:mo_tot_num * 2 + 1), N_microlist(0:mo_tot_num * 2) + double precision, allocatable :: psi_coef_microlist(:,:) + + integer :: ptr_tmicrolist(0:mo_tot_num * 2 + 1), N_tmicrolist(0:mo_tot_num * 2) + double precision, allocatable :: psi_coef_tmicrolist(:,:) + + integer, allocatable :: idx_tmicrolist(:), idx_microlist(:) + integer(bit_kind), allocatable :: microlist(:,:,:), tmicrolist(:,:,:) + + integer :: ptr_futur_microlist(0:mo_tot_num * 2 + 1), ptr_futur_tmicrolist(0:mo_tot_num * 2 + 1) + integer :: N_futur_microlist(0:mo_tot_num * 2), N_futur_tmicrolist(0:mo_tot_num * 2) + + + allocate(idx_tmicrolist(N_det_selectors * 4), idx_microlist(N_det_selectors * 4)) + allocate(microlist(N_int, 2, N_det_selectors * 4), tmicrolist(N_int, 2, N_det_selectors * 4)) + allocate(psi_coef_tmicrolist(psi_selectors_size * 4, N_states), psi_coef_microlist(psi_selectors_size * 4, N_states)) + do k=1,N_int exc_det(k,1) = psi_det_generators(k,1,i_generator) exc_det(k,2) = psi_det_generators(k,2,i_generator) @@ -338,29 +418,16 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, k_hole = ishft(i_hole2-1,-bit_kind_shift)+1 ! N_int j_hole = i_hole2-ishft(k_hole-1,bit_kind_shift)-1 ! bit index ion_det(k_hole,ispin2) = ibclr(ion_det(k_hole,ispin2),j_hole) - - - ! Create the mini wave function where = - ! -------------------------------------------------------------- - -! integer(bit_kind) :: psi_det_connected(N_int,2,psi_selectors_size) -! double precision :: psi_coef_connected(psi_selectors_size,N_states) - - - - integer :: idx_microlist(N_det_selectors * 4), ptr_microlist(0:mo_tot_num * 2 + 1), N_microlist(0:mo_tot_num * 2) - integer(bit_kind) :: microlist(N_int, 2, N_det_selectors * 4) - double precision :: psi_coef_microlist(psi_selectors_size * 4, N_states) - - integer :: idx_tmicrolist(N_det_selectors * 4), ptr_tmicrolist(0:mo_tot_num * 2 + 1), N_tmicrolist(0:mo_tot_num * 2) - integer(bit_kind) :: tmicrolist(N_int, 2, N_det_selectors * 4) - double precision :: psi_coef_tmicrolist(psi_selectors_size * 4, N_states) call create_microlist_double(psi_selectors, i_generator, N_det_selectors, ion_det, & microlist, idx_microlist, N_microlist, ptr_microlist, & tmicrolist, idx_tmicrolist, N_tmicrolist, ptr_tmicrolist, & N_int) + if(N_microlist(0) > 0 .and. idx_microlist(1) < i_generator) cycle + + call create_futur_ptr(ptr_microlist, idx_microlist, ptr_futur_microlist, N_futur_microlist, i_generator) + call create_futur_ptr(ptr_tmicrolist, idx_tmicrolist, ptr_futur_tmicrolist, N_futur_tmicrolist, i_generator) do j=1, ptr_microlist(mo_tot_num * 2 + 1) - 1 @@ -388,7 +455,7 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, exc_det = ion_det i_particle2 = particle_list(j2, ispin2) - integer :: p1, p2 + integer :: p1, p2, sporb p2 = i_particle2 + (ispin2 - 1) * mo_tot_num @@ -420,13 +487,15 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, logical, external :: is_in_wavefunction logical :: nok ! TODO : Check connected to ref - if (.not. is_in_wavefunction(exc_det,N_int)) then +! if (.not. is_in_wavefunction(exc_det,N_int)) then + + ! Compute perturbative contribution and select determinant double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) i_H_psi_value = 0d0 i_H_psi_value2 = 0d0 - integer :: sporb + ! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_psi_value) @@ -435,17 +504,22 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, ! if(nok) cycle nok = .false. - call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) + !call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) + call check_past_s(exc_det, microlist(1,1,ptr_microlist(sporb)), N_microlist(sporb) - N_futur_microlist(sporb), nok, N_int) if(nok) cycle - if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) - if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) + if(N_futur_microlist(0) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(0)),psi_coef_microlist(ptr_futur_microlist(0), 1),N_int,N_futur_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) + if(N_futur_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(sporb)),psi_coef_microlist(ptr_futur_microlist(sporb), 1),N_int,N_futur_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) + +! if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist(ptr_microlist(0), 1),N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) +! if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) + i_H_psi_value = i_H_psi_value + i_H_psi_value2 integer :: c1, c2 double precision :: hij - c1 = ptr_tmicrolist(p1) - c2 = ptr_tmicrolist(p2) + c1 = ptr_futur_tmicrolist(p1) + c2 = ptr_futur_tmicrolist(p2) do while(.true.) if(c1 >= ptr_tmicrolist(p1+1) .or. c2 >= ptr_tmicrolist(p2+1)) then call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_tmicrolist(p1+1)-c1 ,psi_selectors_size*4,N_states,i_H_psi_value2) @@ -475,6 +549,7 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, double precision :: Hii, diag_H_mat_elem_fock Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) double precision :: delta_E, e_pert + do k=1,N_states if (i_H_psi_value(k) == 0.d0) cycle delta_E = E0(k) - Hii @@ -483,16 +558,20 @@ subroutine select_doubles(i_generator,thr,hole_mask,particle_mask,fock_diag_tmp, else e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) endif - if (dabs(e_pert) > thr) then - integer :: rc - rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) - if (rc /= msg_size) then - stop 'Unable to send selected determinant' + if (dabs(e_pert) >= buf%mini) then + if (.not. is_in_wavefunction(exc_det,N_int)) then + call add_to_selection_buffer(buf, exc_det, e_pert) endif endif enddo - endif +! endif ! iwf + + + + + + ! Reset exc_det ! exc_det(k_particle,ispin) = psi_det_generators(k_particle,ispin,i_generator) enddo ! j @@ -507,6 +586,25 @@ end +subroutine create_futur_ptr(ptr_microlist, idx_microlist, ptr_futur_microlist, N_futur_microlist, i_generator) + integer, intent(in) :: ptr_microlist(0:mo_tot_num * 2 + 1), idx_microlist(*), i_generator + integer, intent(out) :: ptr_futur_microlist(0:mo_tot_num * 2 + 1), N_futur_microlist(0:mo_tot_num * 2) + integer :: i, j + + N_futur_microlist = 0 + do i=0,mo_tot_num*2 + ptr_futur_microlist(i) = ptr_microlist(i+1) + do j=ptr_microlist(i), ptr_microlist(i+1) - 1 + if(idx_microlist(j) >= i_generator) then + ptr_futur_microlist(i) = j + N_futur_microlist(i) = ptr_microlist(i+1) - j + exit + end if + end do + end do +end subroutine + + subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, Nint) use bitmasks integer, intent(in) :: Nint, i_cur, N_minilist @@ -644,7 +742,7 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl end do if(nt > 4) then !! TOO MANY DIFFERENCES - continue + cycle else if(nt < 3) then if(i < i_cur) then N_microlist = 0 !!!! PAST LINKED TO EVERYBODY! @@ -750,5 +848,26 @@ subroutine check_past(det, list, idx, N, cur, ok, Nint) end do end subroutine - +subroutine check_past_s(det, list, N, ok, Nint) + implicit none + use bitmasks + + integer(bit_kind), intent(in) :: det(Nint, 2), list(Nint, 2, N) + integer, intent(in) :: Nint, N + logical, intent(out) :: ok + integer :: i,s,ni + + ok = .false. + do i=1,N + !if(idx(i) >= cur) exit + s = 0 + do ni=1,Nint + s += popcnt(xor(det(ni,1), list(ni,1,i))) + popcnt(xor(det(ni,2), list(ni,2,i))) + end do + if(s <= 4) then + ok = .true. + return + end if + end do +end subroutine diff --git a/plugins/mrcepa0/dressing_slave.irp.f b/plugins/mrcepa0/dressing_slave.irp.f index 7d64aa5e..a7180c13 100644 --- a/plugins/mrcepa0/dressing_slave.irp.f +++ b/plugins/mrcepa0/dressing_slave.irp.f @@ -483,9 +483,6 @@ end integer :: KKsize = 1000000 - ! -459.6346665282306 - ! -459.6346665282306 - call new_parallel_job(zmq_to_qp_run_socket,'mrsc2') diff --git a/src/Determinants/H_apply.template.f b/src/Determinants/H_apply.template.f index c46a5bb0..c0659f54 100644 --- a/src/Determinants/H_apply.template.f +++ b/src/Determinants/H_apply.template.f @@ -14,6 +14,13 @@ subroutine $subroutine_diexc(key_in, key_prev, hole_1,particl_1, hole_2, particl $declarations +! print *, "bbbbbbbbbbbbbbb" +! call debug_det(key_in, N_int) +! call debug_det(hole_1, N_int) +! call debug_det(hole_2, N_int) +! call debug_det(particl_1, N_int) +! call debug_det(particl_2, N_int) +! print *, "eeeeeeeeeeeeeeee" highest = 0 do k=1,N_int*bit_kind_size From bf1248eb86c6394b2937f792ed1b697490d979b3 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 19 Jul 2016 15:00:20 +0200 Subject: [PATCH 056/216] working - no pt2 --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 140 +++++++++------ plugins/Full_CI_ZMQ/selection.irp.f | 248 +++++++++++++++++++-------- plugins/mrcepa0/dressing_slave.irp.f | 6 +- 3 files changed, 268 insertions(+), 126 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index e91268d0..f5733751 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -9,7 +9,6 @@ program fci_zmq 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" @@ -32,24 +31,15 @@ program fci_zmq 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) - provide selection_criterion - 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) - !selection_criterion = 1d-7 - print *, selection_criterion, "+++++++++++++++++++++++++++++++++++++++", N_det n_det_before = N_det ! call H_apply_FCI(pt2, norm_pert, H_pert_diag, N_st) - call ZMQ_selection() + call ZMQ_selection(max(N_det, 1000-N_det)) PROVIDE psi_coef PROVIDE psi_det PROVIDE psi_det_sorted @@ -62,9 +52,7 @@ program fci_zmq endif call diagonalize_CI call save_wavefunction - if(n_det_before == N_det)then - selection_criterion = selection_criterion * 0.1d0 - endif + print *, 'N_det = ', N_det print *, 'N_states = ', N_states do k = 1, N_states @@ -113,47 +101,101 @@ end -subroutine ZMQ_selection() - use f77_zmq - implicit none - BEGIN_DOC -! Massively parallel Full-CI - END_DOC - integer :: i,ithread - integer(ZMQ_PTR) :: zmq_socket_push - integer(ZMQ_PTR), external :: new_zmq_push_socket - zmq_context = f77_zmq_ctx_new () - PROVIDE H_apply_buffer_allocated +subroutine ZMQ_selection(N) + use f77_zmq + use selection_types - PROVIDE ci_electronic_energy - PROVIDE nproc - !$OMP PARALLEL PRIVATE(i,ithread,zmq_socket_push) num_threads(nproc+1) - ithread = omp_get_thread_num() - if (ithread == 0) then - call receive_selected_determinants() - else - zmq_socket_push = new_zmq_push_socket(1) - - do i=ithread,N_det_generators,nproc - print *, i, "/", N_det_generators - call select_connected(i, max(100, N_det), ci_electronic_energy,zmq_socket_push) - enddo - - if (ithread == 1) then - integer :: rc - rc = f77_zmq_send(zmq_socket_push,0,1,0) - if (rc /= 1) then - stop 'Error sending termination signal' - endif + implicit none + + character*(512) :: task + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + integer, intent(in) :: N + type(selection_buffer) :: b + integer :: i + integer, external :: omp_get_thread_num + call new_parallel_job(zmq_to_qp_run_socket,'selection') + + call create_selection_buffer(N, N*2, b) + + do i=1, N_det_generators + write(task,*) i, N + call add_task_to_taskserver(zmq_to_qp_run_socket,task) + end do + + provide nproc + !$OMP PARALLEL DEFAULT(none) SHARED(b) PRIVATE(i) NUM_THREADS(nproc+1) + i = omp_get_thread_num() + if (i==0) then + call selection_collector(b) + else + call selection_dressing_slave_inproc(i) endif - call end_zmq_push_socket(zmq_socket_push, 1) - endif - !$OMP END PARALLEL - call copy_H_apply_buffer_to_wf() + !$OMP END PARALLEL + call end_parallel_job(zmq_to_qp_run_socket, 'selection') + call fill_H_apply_buffer_no_selection(b%cur,b%det,N_int,0) !!! PAS DE ROBIN + call copy_H_apply_buffer_to_wf() +end subroutine + + +subroutine selection_dressing_slave_tcp(i) + implicit none + integer, intent(in) :: i + + call selection_slave(0,i) end +subroutine selection_dressing_slave_inproc(i) + implicit none + integer, intent(in) :: i + + call selection_slave(1,i) +end + + + +! subroutine ZMQ_selection() +! use f77_zmq +! implicit none +! BEGIN_DOC +! ! Massively parallel Full-CI +! END_DOC +! +! integer :: i,ithread +! integer(ZMQ_PTR) :: zmq_socket_push +! integer(ZMQ_PTR), external :: new_zmq_push_socket +! zmq_context = f77_zmq_ctx_new () +! PROVIDE H_apply_buffer_allocated +! +! PROVIDE ci_electronic_energy +! PROVIDE nproc +! !$OMP PARALLEL PRIVATE(i,ithread,zmq_socket_push) num_threads(nproc+1) +! ithread = omp_get_thread_num() +! if (ithread == 0) then +! call receive_selected_determinants() +! else +! zmq_socket_push = new_zmq_push_socket(1) +! +! do i=ithread,N_det_generators,nproc +! print *, i, "/", N_det_generators +! call select_connected(i, max(100, N_det), ci_electronic_energy,zmq_socket_push) +! enddo +! +! if (ithread == 1) then +! integer :: rc +! rc = f77_zmq_send(zmq_socket_push,0,1,0) +! if (rc /= 1) then +! stop 'Error sending termination signal' +! endif +! endif +! call end_zmq_push_socket(zmq_socket_push, 1) +! endif +! !$OMP END PARALLEL +! call copy_H_apply_buffer_to_wf() +! end + + diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index e725dd31..2cf259dc 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -1,28 +1,126 @@ +subroutine selection_slave(thread,iproc) + use f77_zmq + use selection_types + implicit none + + integer, intent(in) :: thread, iproc + integer :: rc, i + + integer :: worker_id, task_id(100), ctask, ltask + character*(512) :: task + + integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + + integer(ZMQ_PTR), external :: new_zmq_push_socket + integer(ZMQ_PTR) :: zmq_socket_push + + type(selection_buffer) :: buf + logical :: done + + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() + zmq_socket_push = new_zmq_push_socket(thread) + call connect_to_taskserver(zmq_to_qp_run_socket,worker_id,thread) + + buf%N = 0 + ctask = 1 + + do + call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id(ctask), task) + done = task_id(ctask) == 0 + if (.not. done) then + integer :: i_generator, N + read (task,*) i_generator, N + if(buf%N == 0) call create_selection_buffer(N, N*2, buf) + call select_connected(i_generator,ci_electronic_energy,buf) !! ci_electronic_energy ?? + end if + + if(done) ctask = ctask - 1 + + if(done .or. ctask == size(task_id)) then + if(ctask > 0) call push_selection_results(zmq_socket_push, buf, task_id(1), ctask) + do i=1, ctask + call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id(i)) + end do + ctask = 0 + end if + + if(done) exit + ctask = ctask + 1 + end do + + call disconnect_from_taskserver(zmq_to_qp_run_socket,zmq_socket_push,worker_id) + call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) + call end_zmq_push_socket(zmq_socket_push,thread) + +end subroutine -subroutine select_connected(i_generator,N,E0,zmq_socket_push) +subroutine push_selection_results(zmq_socket_push, b, task_id, ntask) + use f77_zmq + use selection_types + implicit none + + integer(ZMQ_PTR), intent(in) :: zmq_socket_push + type(selection_buffer), intent(inout) :: b + integer, intent(in) :: ntask, task_id(*) + integer :: rc + + call sort_selection_buffer(b) + + rc = f77_zmq_send( zmq_socket_push, b%cur, 4, ZMQ_SNDMORE) + + rc = f77_zmq_send( zmq_socket_push, b%val(1), 8*b%cur, ZMQ_SNDMORE) + + rc = f77_zmq_send( zmq_socket_push, b%det(1,1,1), bit_kind*N_int*2*b%cur, ZMQ_SNDMORE) + + rc = f77_zmq_send( zmq_socket_push, ntask, 4, ZMQ_SNDMORE) + + rc = f77_zmq_send( zmq_socket_push, task_id(1), ntask*4, 0) + +end subroutine + + +subroutine pull_selection_results(zmq_socket_pull, val, det, N, task_id, ntask) + use f77_zmq + use selection_types + implicit none + integer(ZMQ_PTR), intent(in) :: zmq_socket_pull + double precision, intent(out) :: val(*) + integer(bit_kind), intent(out) :: det(N_int, 2, *) + integer, intent(out) :: N, ntask, task_id(*) + integer :: rc, rn, i + + rc = f77_zmq_recv( zmq_socket_pull, N, 4, ZMQ_SNDMORE) + + rc = f77_zmq_recv( zmq_socket_pull, val(1), 8*N, ZMQ_SNDMORE) + + rc = f77_zmq_recv( zmq_socket_pull, det(1,1,1), bit_kind*N_int*2*N, ZMQ_SNDMORE) + + rc = f77_zmq_recv( zmq_socket_pull, ntask, 4, ZMQ_SNDMORE) + + rc = f77_zmq_recv( zmq_socket_pull, task_id(1), ntask*4, 0) +end subroutine + + +subroutine select_connected(i_generator,E0,b) use f77_zmq use bitmasks use selection_types implicit none integer, intent(in) :: i_generator - integer, intent(in) :: N + type(selection_buffer), intent(inout) :: b + integer :: k,l double precision, intent(in) :: E0(N_states) - integer(ZMQ_PTR), intent(in) :: zmq_socket_push - BEGIN_DOC -! Select determinants connected to i_det by H - END_DOC + integer(bit_kind) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision :: fock_diag_tmp(2,mo_tot_num+1) call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) - integer :: k,l - type(selection_buffer) :: buf - call create_selection_buffer(N, N*2, buf) - buf%mini = 1d-7 + do l=1,N_generators_bitmask do k=1,N_int hole_mask(k,1) = iand(generators_bitmask(k,1,s_hole,l), psi_det_generators(k,1,i_generator)) @@ -35,22 +133,9 @@ subroutine select_connected(i_generator,N,E0,zmq_socket_push) particle_mask(k,:) = hole_mask(k,:) enddo - call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,buf) - call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,buf) + call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,b) + call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,b) enddo - - call sort_selection_buffer(buf) - -! integer :: rc -! rc = f77_zmq_send(zmq_socket_push, exc_det, msg_size,0) -! if (rc /= msg_size) then -! stop 'Unable to send selected determinant' -! endif - -! do k=1,buf%cur -! print *, buf%val(k) -! call debug_det(buf%det(1,1,k), N_int) -! end do end @@ -62,6 +147,7 @@ subroutine create_selection_buffer(N, siz, res) type(selection_buffer), intent(out) :: res allocate(res%det(N_int, 2, siz), res%val(siz)) + res%val = 0d0 res%det = 0_8 res%N = N @@ -102,6 +188,7 @@ subroutine sort_selection_buffer(b) nmwen = min(b%N, b%cur) + allocate(iorder(b%cur), detmp(N_int, 2, nmwen), absval(b%cur), vals(nmwen)) absval = -dabs(b%val(:b%cur)) do i=1,b%cur @@ -122,40 +209,49 @@ subroutine sort_selection_buffer(b) end subroutine -subroutine receive_selected_determinants() +subroutine selection_collector(b) use f77_zmq + use selection_types use bitmasks implicit none - BEGIN_DOC -! Receive via ZMQ the selected determinants - END_DOC - integer(ZMQ_PTR) :: zmq_socket_pull - integer(ZMQ_PTR), external :: new_zmq_pull_socket - - integer(bit_kind) :: received_det(N_int,2), shtak(N_int, 2, 10000) - integer :: msg_size, rc - integer :: acc, j, robin - acc = 0 - robin = 0 - msg_size = bit_kind*N_int*2 + type(selection_buffer), intent(inout) :: b + integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + + integer(ZMQ_PTR), external :: new_zmq_pull_socket + integer(ZMQ_PTR) :: zmq_socket_pull - zmq_socket_pull = new_zmq_pull_socket() + integer :: msg_size, rc, more + integer :: acc, i, j, robin, N, ntask + double precision, allocatable :: val(:) + integer(bit_kind), allocatable :: det(:,:,:) + integer, allocatable :: task_id(:) + + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() + zmq_socket_pull = new_zmq_pull_socket() + allocate(val(b%N), det(N_int, 2, b%N), task_id(N_det)) + + more = 1 + do while (more == 1) + call pull_selection_results(zmq_socket_pull, val(1), det(1,1,1), N, task_id, ntask) + do i=1, N + call add_to_selection_buffer(b, det(1,1,i), val(i)) + end do + + do i=1, ntask + if (task_id(i) /= 0) then + call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id(i),more) + endif + end do + end do - grab : do while (f77_zmq_recv(zmq_socket_pull, received_det, msg_size, 0) == msg_size) - acc += 1 - shtak(:,:,acc) = received_det - if(acc == size(shtak, 3)) then - call fill_H_apply_buffer_no_selection(acc,shtak,N_int,robin) - acc = 0 - robin += 1 - if(robin == nproc) robin = 0 - end if - end do grab - call fill_H_apply_buffer_no_selection(acc,shtak,N_int,robin) + call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) call end_zmq_pull_socket(zmq_socket_pull) -end + call sort_selection_buffer(b) +end subroutine + subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,buf) use f77_zmq @@ -297,24 +393,22 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,b i_H_psi_value(:) = i_H_psi_value(:) + i_H_psi_value2(:) double precision :: Hii, diag_H_mat_elem_fock Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) - - double precision :: delta_E, e_pert + + double precision :: delta_E, e_pert(N_states), e_pertm + e_pert(:) = 0d0 + e_pertm = 0d0 + do k=1,N_states if (i_H_psi_value(k) == 0.d0) cycle delta_E = E0(k) - Hii if (delta_E < 0.d0) then - e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + e_pert(k) = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) else - e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + e_pert(k) = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) endif - - - if (dabs(e_pert) >= buf%mini) then - call add_to_selection_buffer(buf, exc_det, e_pert) - endif - - + if(dabs(e_pert(k)) > dabs(e_pertm)) e_pertm = e_pert(k) enddo + call add_to_selection_buffer(buf, exc_det, e_pertm) endif ! Reset exc_det @@ -522,11 +616,16 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, c2 = ptr_futur_tmicrolist(p2) do while(.true.) if(c1 >= ptr_tmicrolist(p1+1) .or. c2 >= ptr_tmicrolist(p2+1)) then - call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_tmicrolist(p1+1)-c1 ,psi_selectors_size*4,N_states,i_H_psi_value2) - i_H_psi_value = i_H_psi_value + i_H_psi_value2 + if(ptr_tmicrolist(p1+1) /= c1) then + call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_tmicrolist(p1+1)-c1 ,psi_selectors_size*4,N_states,i_H_psi_value2) + i_H_psi_value = i_H_psi_value + i_H_psi_value2 + end if + + if(ptr_tmicrolist(p2+1) /= c2) then + call i_H_psi(exc_det,tmicrolist(1,1,c2),psi_coef_tmicrolist(c2, 1),N_int, ptr_tmicrolist(p2+1)-c2 ,psi_selectors_size*4,N_states,i_H_psi_value2) + i_H_psi_value = i_H_psi_value + i_H_psi_value2 + endif - call i_H_psi(exc_det,tmicrolist(1,1,c2),psi_coef_tmicrolist(c2, 1),N_int, ptr_tmicrolist(p2+1)-c2 ,psi_selectors_size*4,N_states,i_H_psi_value2) - i_H_psi_value = i_H_psi_value + i_H_psi_value2 exit endif @@ -548,22 +647,23 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, double precision :: Hii, diag_H_mat_elem_fock Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) - double precision :: delta_E, e_pert + double precision :: delta_E, e_pert(N_states), e_pertm + e_pert(:) = 0d0 + e_pertm = 0d0 do k=1,N_states if (i_H_psi_value(k) == 0.d0) cycle delta_E = E0(k) - Hii if (delta_E < 0.d0) then - e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + e_pert(k) = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) else - e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) - endif - if (dabs(e_pert) >= buf%mini) then - if (.not. is_in_wavefunction(exc_det,N_int)) then - call add_to_selection_buffer(buf, exc_det, e_pert) - endif + e_pert(k) = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) endif + if(dabs(e_pert(k)) > dabs(e_pertm)) e_pertm = e_pert(k) enddo + if(dabs(e_pertm) > dabs(buf%mini)) then + if(.not. is_in_wavefunction(exc_det, N_int)) call add_to_selection_buffer(buf, exc_det, e_pertm) + end if ! endif ! iwf diff --git a/plugins/mrcepa0/dressing_slave.irp.f b/plugins/mrcepa0/dressing_slave.irp.f index a7180c13..9e8ff0ce 100644 --- a/plugins/mrcepa0/dressing_slave.irp.f +++ b/plugins/mrcepa0/dressing_slave.irp.f @@ -221,7 +221,7 @@ subroutine push_mrsc2_results(zmq_socket_push, I_i, J, delta, task_id) integer, intent(in) :: task_id integer :: rc , i_state, i, kk, li integer,allocatable :: idx(:,:) - integer ::n(2) + integer :: n(2) logical :: ok allocate(idx(N_det_non_ref,2)) @@ -510,8 +510,8 @@ end ! stop -nzer = 0 -ntot = 0 + nzer = 0 + ntot = 0 do nex = 3, 0, -1 print *, "los ",nex do I_s = N_det_ref, 1, -1 From 7ff61ed5aa254627bc12e6fb68e19e80b1bbcfff Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 19 Jul 2016 15:17:44 +0200 Subject: [PATCH 057/216] faster create_microlist_double --- plugins/Full_CI_ZMQ/selection.irp.f | 66 ++++++++++++++--------------- 1 file changed, 31 insertions(+), 35 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 2cf259dc..b4d1530c 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -816,13 +816,13 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl integer, intent(out) :: N_tmicrolist(0:mo_tot_num*2), ptr_tmicrolist(0:mo_tot_num*2+1), idx_tmicrolist(N_minilist*4) integer(bit_kind), intent(out) :: tmicrolist(Nint,2,N_minilist*4) - integer :: i,j,k,s,nt,n_element(2) - integer :: list(Nint*bit_kind_size,2), cur_microlist(0:mo_tot_num*2+1), cur_tmicrolist(0:mo_tot_num*2+1) + integer :: i,j,k,s,nt,n_element(2,N_minilist), idx(0:N_minilist) + integer :: list(4,2,N_minilist), cur_microlist(0:mo_tot_num*2+1), cur_tmicrolist(0:mo_tot_num*2+1) integer(bit_kind) :: key_mask_neg(Nint,2), mobileMask(Nint,2) integer :: mo_tot_num_2 mo_tot_num_2 = mo_tot_num+mo_tot_num - + idx(0) = 0 do i=1,Nint key_mask_neg(i,1) = not(key_mask(i,1)) key_mask_neg(i,2) = not(key_mask(i,2)) @@ -841,9 +841,12 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl nt += popcnt(mobileMask(j, 1)) + popcnt(mobileMask(j, 2)) end do - if(nt > 4) then !! TOO MANY DIFFERENCES - cycle - else if(nt < 3) then + if(nt > 4) cycle !! TOO MANY DIFFERENCES + + idx(0) += 1 + idx(idx(0)) = i + + if(nt < 3) then if(i < i_cur) then N_microlist = 0 !!!! PAST LINKED TO EVERYBODY! ptr_microlist = 1 @@ -851,15 +854,16 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl ptr_tmicrolist = 1 return else + n_element(:, idx(0)) = (/2, 0/) N_microlist(0) = N_microlist(0) + 1 endif else - call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), Nint) - call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), Nint) + call bitstring_to_list(mobileMask(1,1), list(1,1,idx(0)), n_element(1, idx(0)), Nint) + call bitstring_to_list(mobileMask(1,2), list(1,2,idx(0)), n_element(2, idx(0)), Nint) do s=1,2 - do j=1,n_element(s) - k = list(j,s) + mo_tot_num * (s-1) + do j=1,n_element(s,idx(0)) + k = list(j,s,idx(0)) + mo_tot_num * (s-1) if(nt == 4) N_microlist(k) = N_microlist(k) + 1 if(nt == 3) N_tmicrolist(k) = N_tmicrolist(k) + 1 end do @@ -880,41 +884,32 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl end do - do i=1, N_minilist - do j=1,Nint - mobileMask(j,1) = iand(key_mask_neg(j,1), minilist(j,1,i)) - mobileMask(j,2) = iand(key_mask_neg(j,2), minilist(j,2,i)) - end do - - call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), Nint) - call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), Nint) - - if(n_element(1) + n_element(2) > 4) then - cycle - else if(n_element(1) + n_element(2) < 3) then - idx_microlist(cur_microlist(0)) = i + do i=1, idx(0) + if(n_element(1, i) + n_element(2, i) > 4) stop "wired" + if(n_element(1, i) + n_element(2, i) < 3) then + idx_microlist(cur_microlist(0)) = idx(i) do k=1,Nint - microlist(k,1,cur_microlist(0)) = minilist(k,1,i) - microlist(k,2,cur_microlist(0)) = minilist(k,2,i) + microlist(k,1,cur_microlist(0)) = minilist(k,1,idx(i)) + microlist(k,2,cur_microlist(0)) = minilist(k,2,idx(i)) enddo cur_microlist(0) = cur_microlist(0) + 1 - else ! if(n_element(1) + n_element(2) == 4) then + else do s = 1, 2 - do j=1,n_element(s) - nt = list(j,s) + mo_tot_num * (s-1) + do j=1,n_element(s,i) + nt = list(j,s,i) + mo_tot_num * (s-1) - if(n_element(1) + n_element(2) == 4) then - idx_microlist(cur_microlist(nt)) = i + if(n_element(1,i) + n_element(2,i) == 4) then + idx_microlist(cur_microlist(nt)) = idx(i) do k=1,Nint - microlist(k,1,cur_microlist(nt)) = minilist(k,1,i) - microlist(k,2,cur_microlist(nt)) = minilist(k,2,i) + microlist(k,1,cur_microlist(nt)) = minilist(k,1,idx(i)) + microlist(k,2,cur_microlist(nt)) = minilist(k,2,idx(i)) enddo cur_microlist(nt) = cur_microlist(nt) + 1 else - idx_tmicrolist(cur_tmicrolist(nt)) = i + idx_tmicrolist(cur_tmicrolist(nt)) = idx(i) do k=1,Nint - tmicrolist(k,1,cur_tmicrolist(nt)) = minilist(k,1,i) - tmicrolist(k,2,cur_tmicrolist(nt)) = minilist(k,2,i) + tmicrolist(k,1,cur_tmicrolist(nt)) = minilist(k,1,idx(i)) + tmicrolist(k,2,cur_tmicrolist(nt)) = minilist(k,2,idx(i)) enddo cur_tmicrolist(nt) = cur_tmicrolist(nt) + 1 endif @@ -948,6 +943,7 @@ subroutine check_past(det, list, idx, N, cur, ok, Nint) end do end subroutine + subroutine check_past_s(det, list, N, ok, Nint) implicit none use bitmasks From 8f30f0d4e05c155947639ceff5d20d0e65ad4121 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 21 Jul 2016 13:24:25 +0200 Subject: [PATCH 058/216] pt2 --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 30 ++- plugins/Full_CI_ZMQ/selection.irp.f | 294 ++++++++++++++++++++++------ 2 files changed, 258 insertions(+), 66 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index f5733751..aa0c013e 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -3,10 +3,13 @@ program fci_zmq implicit none integer :: i,k - + logical, external :: detEq double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) integer :: N_st, degree + integer :: it, mit(0:5) + mit = (/1, 268, 1517, 10018, 45096, 100000/) + it = 0 N_st = N_states allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st)) @@ -31,7 +34,7 @@ program fci_zmq 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) - + integer :: n_det_before print*,'Beginning the selection ...' @@ -39,7 +42,17 @@ program fci_zmq 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) - call ZMQ_selection(max(N_det, 1000-N_det)) + it += 1 + if(it > 5) stop + call ZMQ_selection(mit(it) - mit(it-1), pt2) !(max(N_det*3, 1000-N_det)) + + do i=1, N_det + !if(popcnt(psi_det(1,1,i)) + popcnt(psi_det(2,1,i)) /= 23) stop "ZZ1" -2099.2504682049275 + !if(popcnt(psi_det(1,2,i)) + popcnt(psi_det(2,2,i)) /= 23) stop "ZZ2" + do k=1,i-1 + if(detEq(psi_det(1,1,i), psi_det(1,1,k), N_int)) stop "ATRRGRZER" + end do + end do PROVIDE psi_coef PROVIDE psi_det PROVIDE psi_det_sorted @@ -102,7 +115,7 @@ end -subroutine ZMQ_selection(N) +subroutine ZMQ_selection(N, pt2) use f77_zmq use selection_types @@ -114,20 +127,23 @@ subroutine ZMQ_selection(N) type(selection_buffer) :: b integer :: i integer, external :: omp_get_thread_num + double precision, intent(out) :: pt2(N_states) + call new_parallel_job(zmq_to_qp_run_socket,'selection') call create_selection_buffer(N, N*2, b) - do i=1, N_det_generators + do i= N_det_generators, 1, -1 write(task,*) i, N call add_task_to_taskserver(zmq_to_qp_run_socket,task) end do provide nproc - !$OMP PARALLEL DEFAULT(none) SHARED(b) PRIVATE(i) NUM_THREADS(nproc+1) + provide ci_electronic_energy + !$OMP PARALLEL DEFAULT(none) SHARED(b, pt2) PRIVATE(i) NUM_THREADS(nproc+1) i = omp_get_thread_num() if (i==0) then - call selection_collector(b) + call selection_collector(b, pt2) else call selection_dressing_slave_inproc(i) endif diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index b4d1530c..91dbcd29 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -19,6 +19,7 @@ subroutine selection_slave(thread,iproc) type(selection_buffer) :: buf logical :: done + double precision :: pt2(N_states) zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() zmq_socket_push = new_zmq_push_socket(thread) @@ -26,6 +27,7 @@ subroutine selection_slave(thread,iproc) buf%N = 0 ctask = 1 + pt2 = 0d0 do call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id(ctask), task) @@ -33,14 +35,23 @@ subroutine selection_slave(thread,iproc) if (.not. done) then integer :: i_generator, N read (task,*) i_generator, N - if(buf%N == 0) call create_selection_buffer(N, N*2, buf) - call select_connected(i_generator,ci_electronic_energy,buf) !! ci_electronic_energy ?? + if(buf%N == 0) then + call create_selection_buffer(N, N*2, buf) + else + if(N /= buf%N) stop "N changed... wtf man??" + end if + call select_connected(i_generator,ci_electronic_energy,pt2,buf) !! ci_electronic_energy ?? end if if(done) ctask = ctask - 1 if(done .or. ctask == size(task_id)) then - if(ctask > 0) call push_selection_results(zmq_socket_push, buf, task_id(1), ctask) + if(ctask > 0 .and. buf%N /= 0) then + call push_selection_results(zmq_socket_push, pt2, buf, task_id(1), ctask) + pt2 = 0d0 + buf%cur = 0 + end if + do i=1, ctask call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id(i)) end do @@ -58,12 +69,13 @@ subroutine selection_slave(thread,iproc) end subroutine -subroutine push_selection_results(zmq_socket_push, b, task_id, ntask) +subroutine push_selection_results(zmq_socket_push, pt2, b, task_id, ntask) use f77_zmq use selection_types implicit none integer(ZMQ_PTR), intent(in) :: zmq_socket_push + double precision, intent(in) :: pt2(N_states) type(selection_buffer), intent(inout) :: b integer, intent(in) :: ntask, task_id(*) integer :: rc @@ -72,6 +84,8 @@ subroutine push_selection_results(zmq_socket_push, b, task_id, ntask) rc = f77_zmq_send( zmq_socket_push, b%cur, 4, ZMQ_SNDMORE) + rc = f77_zmq_send( zmq_socket_push, pt2, 8*N_states, ZMQ_SNDMORE) + rc = f77_zmq_send( zmq_socket_push, b%val(1), 8*b%cur, ZMQ_SNDMORE) rc = f77_zmq_send( zmq_socket_push, b%det(1,1,1), bit_kind*N_int*2*b%cur, ZMQ_SNDMORE) @@ -83,11 +97,12 @@ subroutine push_selection_results(zmq_socket_push, b, task_id, ntask) end subroutine -subroutine pull_selection_results(zmq_socket_pull, val, det, N, task_id, ntask) +subroutine pull_selection_results(zmq_socket_pull, pt2, val, det, N, task_id, ntask) use f77_zmq use selection_types implicit none integer(ZMQ_PTR), intent(in) :: zmq_socket_pull + double precision, intent(inout) :: pt2(N_states) double precision, intent(out) :: val(*) integer(bit_kind), intent(out) :: det(N_int, 2, *) integer, intent(out) :: N, ntask, task_id(*) @@ -95,6 +110,8 @@ subroutine pull_selection_results(zmq_socket_pull, val, det, N, task_id, ntask) rc = f77_zmq_recv( zmq_socket_pull, N, 4, ZMQ_SNDMORE) + rc = f77_zmq_recv( zmq_socket_pull, pt2, N_states*8, ZMQ_SNDMORE) + rc = f77_zmq_recv( zmq_socket_pull, val(1), 8*N, ZMQ_SNDMORE) rc = f77_zmq_recv( zmq_socket_pull, det(1,1,1), bit_kind*N_int*2*N, ZMQ_SNDMORE) @@ -105,13 +122,14 @@ subroutine pull_selection_results(zmq_socket_pull, val, det, N, task_id, ntask) end subroutine -subroutine select_connected(i_generator,E0,b) +subroutine select_connected(i_generator,E0,pt2,b) use f77_zmq use bitmasks use selection_types implicit none integer, intent(in) :: i_generator type(selection_buffer), intent(inout) :: b + double precision, intent(inout) :: pt2(N_states) integer :: k,l double precision, intent(in) :: E0(N_states) @@ -133,8 +151,8 @@ subroutine select_connected(i_generator,E0,b) particle_mask(k,:) = hole_mask(k,:) enddo - call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,b) - call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,b) + call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) + call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) enddo end @@ -185,7 +203,7 @@ subroutine sort_selection_buffer(b) integer, allocatable :: iorder(:) integer(bit_kind), allocatable :: detmp(:,:,:) integer :: i, nmwen - + logical, external :: detEq nmwen = min(b%N, b%cur) @@ -204,12 +222,12 @@ subroutine sort_selection_buffer(b) b%det(:,:,nmwen+1:) = 0_bit_kind b%val(:nmwen) = vals(:) b%val(nmwen+1:) = 0d0 - b%mini = dabs(b%val(nmwen)) + b%mini = dabs(b%val(b%N)) b%cur = nmwen end subroutine -subroutine selection_collector(b) +subroutine selection_collector(b, pt2) use f77_zmq use selection_types use bitmasks @@ -217,6 +235,8 @@ subroutine selection_collector(b) type(selection_buffer), intent(inout) :: b + double precision, intent(out) :: pt2(N_states) + double precision :: pt2_mwen(N_states) integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket integer(ZMQ_PTR) :: zmq_to_qp_run_socket @@ -232,10 +252,11 @@ subroutine selection_collector(b) zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() zmq_socket_pull = new_zmq_pull_socket() allocate(val(b%N), det(N_int, 2, b%N), task_id(N_det)) - + pt2 = 0d0 more = 1 do while (more == 1) - call pull_selection_results(zmq_socket_pull, val(1), det(1,1,1), N, task_id, ntask) + call pull_selection_results(zmq_socket_pull, pt2_mwen, val(1), det(1,1,1), N, task_id, ntask) + pt2 += pt2_mwen do i=1, N call add_to_selection_buffer(b, det(1,1,i), val(i)) end do @@ -253,7 +274,7 @@ subroutine selection_collector(b) end subroutine -subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,buf) +subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf) use f77_zmq use bitmasks use selection_types @@ -263,11 +284,11 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,b END_DOC integer, intent(in) :: i_generator double precision, intent(in) :: fock_diag_tmp(mo_tot_num) + double precision, intent(inout) :: pt2(N_states) integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision, intent(in) :: E0(N_states) type(selection_buffer), intent(inout) :: buf - integer :: i,j,k,l integer :: msg_size @@ -319,7 +340,7 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,b integer(bit_kind), allocatable :: microlist(:, :, :) double precision, allocatable :: psi_coef_microlist(:,:) - allocate(microlist(N_int, 2, N_det_selectors * 4), psi_coef_microlist(psi_selectors_size * 4, N_states), idx_microlist(N_det_selectors * 4)) + allocate(microlist(N_int, 2, N_det_selectors * 3), psi_coef_microlist(psi_selectors_size * 3, N_states), idx_microlist(N_det_selectors * 3)) do ispin=1,2 ! do k=1,N_int @@ -375,12 +396,13 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,b if (.not. is_in_wavefunction(exc_det,N_int)) then ! Compute perturbative contribution and select determinant double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) + double precision :: i_H_full(N_states) i_H_psi_value = 0d0 i_H_psi_value2 = 0d0 - + i_H_full = 0d0 integer :: sporb -! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_psi_value) +! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_full) ! nok = .false. sporb = i_particle + (ispin - 1) * mo_tot_num @@ -388,8 +410,8 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,b if(N_microlist(sporb) > 0) call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) if(nok) cycle ! - if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) - if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) + if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*3,N_states,i_H_psi_value) + if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*3,N_states,i_H_psi_value2) i_H_psi_value(:) = i_H_psi_value(:) + i_H_psi_value2(:) double precision :: Hii, diag_H_mat_elem_fock Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) @@ -399,6 +421,9 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,b e_pertm = 0d0 do k=1,N_states +! if(dabs(1d0 - i_H_psi_value(k)/i_H_full(k)) > 1d-6) then +! stop "PAS BON, PAS BOOOOON!! (single)" +! endif if (i_H_psi_value(k) == 0.d0) cycle delta_E = E0(k) - Hii if (delta_E < 0.d0) then @@ -407,6 +432,7 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,b e_pert(k) = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) endif if(dabs(e_pert(k)) > dabs(e_pertm)) e_pertm = e_pert(k) + pt2(k) += e_pert(k) enddo call add_to_selection_buffer(buf, exc_det, e_pertm) endif @@ -423,7 +449,7 @@ end -subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, buf) +subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf) use f77_zmq use bitmasks use selection_types @@ -433,10 +459,17 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, END_DOC integer, intent(in) :: i_generator double precision, intent(in) :: fock_diag_tmp(mo_tot_num) + double precision, intent(inout) :: pt2(N_states) integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision, intent(in) :: E0(N_states) type(selection_buffer), intent(inout) :: buf - + logical :: isinwf(mo_tot_num*2, mo_tot_num*2) + double precision :: d0s(mo_tot_num, mo_tot_num, N_states) + d0s = 0d0 +! double precision, save :: d0 = 0d0 +! double precision, save :: d1 = 0d0 +! double precision, save :: d2 = 0d0 + integer :: i,j,k,l,j1,j2,i1,i2,ib,jb integer :: msg_size @@ -481,11 +514,11 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, integer :: ptr_futur_microlist(0:mo_tot_num * 2 + 1), ptr_futur_tmicrolist(0:mo_tot_num * 2 + 1) integer :: N_futur_microlist(0:mo_tot_num * 2), N_futur_tmicrolist(0:mo_tot_num * 2) + logical :: pastlink - - allocate(idx_tmicrolist(N_det_selectors * 4), idx_microlist(N_det_selectors * 4)) - allocate(microlist(N_int, 2, N_det_selectors * 4), tmicrolist(N_int, 2, N_det_selectors * 4)) - allocate(psi_coef_tmicrolist(psi_selectors_size * 4, N_states), psi_coef_microlist(psi_selectors_size * 4, N_states)) + allocate(idx_tmicrolist(N_det_selectors * 3), idx_microlist(N_det_selectors * 4)) + allocate(microlist(N_int, 2, N_det_selectors * 4), tmicrolist(N_int, 2, N_det_selectors * 3)) + allocate(psi_coef_tmicrolist(psi_selectors_size * 3, N_states), psi_coef_microlist(psi_selectors_size * 4, N_states)) do k=1,N_int exc_det(k,1) = psi_det_generators(k,1,i_generator) @@ -513,12 +546,15 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, j_hole = i_hole2-ishft(k_hole-1,bit_kind_shift)-1 ! bit index ion_det(k_hole,ispin2) = ibclr(ion_det(k_hole,ispin2),j_hole) - call create_microlist_double(psi_selectors, i_generator, N_det_selectors, ion_det, & microlist, idx_microlist, N_microlist, ptr_microlist, & tmicrolist, idx_tmicrolist, N_tmicrolist, ptr_tmicrolist, & - N_int) - if(N_microlist(0) > 0 .and. idx_microlist(1) < i_generator) cycle + isinwf, d0s, N_int) + if(N_microlist(0) > 0 .and. idx_microlist(1) < i_generator) stop "wtf..." + if(ptr_microlist(mo_tot_num * 2 + 1) == 1 .and. ptr_tmicrolist(mo_tot_num * 2 + 1) == 1) cycle + + call finish_isinwf(ion_det, psi_det_sorted(1,1,N_det_selectors+1), N_det - N_det_selectors, isinwf) + call create_futur_ptr(ptr_microlist, idx_microlist, ptr_futur_microlist, N_futur_microlist, i_generator) call create_futur_ptr(ptr_tmicrolist, idx_tmicrolist, ptr_futur_tmicrolist, N_futur_tmicrolist, i_generator) @@ -531,13 +567,11 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, psi_coef_tmicrolist(j,:) = psi_selectors_coef(idx_tmicrolist(j),:) enddo - if(ptr_microlist(mo_tot_num * 2 + 1) == 1 .and. ptr_tmicrolist(mo_tot_num * 2 + 1) == 1) then - cycle - endif + ! Create particles ! ---------------- integer :: i_particle1, i_particle2, k_particle, j_particle - + integer :: p1, p2, sporb, lorb do j1=1,N_particles(ispin1) i_particle1 = particle_list(j1, ispin1) @@ -546,20 +580,23 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, jb = 1 if(ispin1 == ispin2) jb = j1+1 do j2=jb,N_particles(ispin2) - exc_det = ion_det + i_particle2 = particle_list(j2, ispin2) - integer :: p1, p2, sporb + p2 = i_particle2 + (ispin2 - 1) * mo_tot_num - - if(N_tmicrolist(p2) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p2)) < i_generator) cycle + if(isinwf(p1, p2)) cycle + exc_det = ion_det + if(N_microlist(p1) < N_microlist(p2)) then sporb = p1 + lorb = p2 else sporb = p2 + lorb = p1 endif @@ -574,7 +611,16 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, exc_det(k_particle,ispin1) = ibset(exc_det(k_particle,ispin1),j_particle) - +! if(.false. .or. (is_in_wavefunction(exc_det,N_int) .and. .not. isinwf(p1,p2))) then +! print *, p1, p2 +! call debug_det(ion_det, N_int) +! call debug_det(exc_det, N_int) +! ! do i=1,mo_tot_num*2 +! ! print *, isinwf(:, i) +! ! end do +! print *, isinwf(p1, p2) +! stop "isw" +! end if ! TODO @@ -586,11 +632,12 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, ! Compute perturbative contribution and select determinant double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) + double precision :: i_H_full(N_states) i_H_psi_value = 0d0 i_H_psi_value2 = 0d0 + i_H_full = 0d0 - -! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_psi_value) +! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_full) @@ -602,13 +649,57 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, call check_past_s(exc_det, microlist(1,1,ptr_microlist(sporb)), N_microlist(sporb) - N_futur_microlist(sporb), nok, N_int) if(nok) cycle - if(N_futur_microlist(0) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(0)),psi_coef_microlist(ptr_futur_microlist(0), 1),N_int,N_futur_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) - if(N_futur_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(sporb)),psi_coef_microlist(ptr_futur_microlist(sporb), 1),N_int,N_futur_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) + if(N_futur_microlist(0) > 0) then + call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(0)),psi_coef_microlist(ptr_futur_microlist(0), 1),N_int,N_futur_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) +! if(i_H_psi_value(1) /= d0s(p1, p2, 1) .and. d0s(p1, p2, 1) /= 0d0) then +! print *, d0s(p1, p2, 1), i_H_psi_value(1) +! print *, d0s(:3, :3, 1) +! stop "SKSL" +! end if + end if +! if(N_futur_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(sporb)),psi_coef_microlist(ptr_futur_microlist(sporb), 1),N_int,N_futur_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) +! !$OMP ATOMIC +! d0 += dabs(i_H_psi_value(1)) +! d2 += N_futur_microlist(sporb) + + + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + if(N_futur_microlist(sporb) > 0) then +! ! if(dfloat(N_futur_microlist(lorb)) / dfloat(N_futur_microlist(sporb)) < 2d0) then +! c1 = ptr_futur_microlist(p1) +! c2 = ptr_futur_microlist(p2) +! do while(c1 < ptr_microlist(p1+1) .and. c2 < ptr_microlist(p2+1)) +! if(idx_microlist(c1) < idx_microlist(c2)) then +! c1 += 1 +! else if(idx_microlist(c1) > idx_microlist(c2)) then +! c2 += 1 +! else +! call i_H_j(exc_det,microlist(1,1,c1),N_int,hij) +! do j = 1, N_states +! i_H_psi_value2(j) = i_H_psi_value2(j) + psi_coef_microlist(c1,j)*hij +! end do +! c1 += 1 +! c2 += 1 +! endif +! end do +! else + call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(sporb)),psi_coef_microlist(ptr_futur_microlist(sporb), 1),N_int,N_futur_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) + i_H_psi_value = i_H_psi_value + i_H_psi_value2 +! !$OMP ATOMIC +! d2 += dabs(i_H_psi_value2(1)) +! d2 += N_futur_microlist(sporb) +! ! end if + end if + +! enddo 2099.3283623955813 + + + !!!!!!!!!!!!!!!!!! ! if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist(ptr_microlist(0), 1),N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) ! if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) - i_H_psi_value = i_H_psi_value + i_H_psi_value2 +! i_H_psi_value = i_H_psi_value + i_H_psi_value2 integer :: c1, c2 double precision :: hij @@ -617,13 +708,17 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, do while(.true.) if(c1 >= ptr_tmicrolist(p1+1) .or. c2 >= ptr_tmicrolist(p2+1)) then if(ptr_tmicrolist(p1+1) /= c1) then - call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_tmicrolist(p1+1)-c1 ,psi_selectors_size*4,N_states,i_H_psi_value2) + call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_tmicrolist(p1+1)-c1 ,psi_selectors_size*3,N_states,i_H_psi_value2) i_H_psi_value = i_H_psi_value + i_H_psi_value2 +! ! !$OMP ATOMIC +! d1 += dabs(i_H_psi_value2(1)) end if if(ptr_tmicrolist(p2+1) /= c2) then - call i_H_psi(exc_det,tmicrolist(1,1,c2),psi_coef_tmicrolist(c2, 1),N_int, ptr_tmicrolist(p2+1)-c2 ,psi_selectors_size*4,N_states,i_H_psi_value2) + call i_H_psi(exc_det,tmicrolist(1,1,c2),psi_coef_tmicrolist(c2, 1),N_int, ptr_tmicrolist(p2+1)-c2 ,psi_selectors_size*3,N_states,i_H_psi_value2) i_H_psi_value = i_H_psi_value + i_H_psi_value2 +! !$OMP ATOMIC +! d1 += dabs(i_H_psi_value2(1)) endif exit @@ -634,6 +729,8 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, do j = 1, N_states i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c1,j)*hij enddo +! !$OMP ATOMIC +! d1 += dabs(psi_coef_tmicrolist(c1,1)*hij) c1 += 1 else call i_H_j(exc_det,tmicrolist(1,1,c2),N_int,hij) @@ -641,6 +738,8 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c2,j)*hij enddo if(idx_tmicrolist(c1) == idx_tmicrolist(c2)) c1 = c1 + 1 +! !$OMP ATOMIC +! d1 += dabs(psi_coef_tmicrolist(c2,1)*hij) c2 += 1 end if enddo @@ -652,6 +751,12 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, e_pertm = 0d0 do k=1,N_states +! if(dabs(1d0 - i_H_psi_value(k)/i_H_full(k)) > 1d-6) then +! print *, i_H_psi_value(k), i_H_full(k), i_H_psi_value(k)/i_H_full(k) +! stop "PAS BON, PAS BOOON (double)" +! +! endif + if (i_H_psi_value(k) == 0.d0) cycle delta_E = E0(k) - Hii if (delta_E < 0.d0) then @@ -660,9 +765,10 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, e_pert(k) = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) endif if(dabs(e_pert(k)) > dabs(e_pertm)) e_pertm = e_pert(k) + pt2(k) += e_pert(k) enddo if(dabs(e_pertm) > dabs(buf%mini)) then - if(.not. is_in_wavefunction(exc_det, N_int)) call add_to_selection_buffer(buf, exc_det, e_pertm) + call add_to_selection_buffer(buf, exc_det, e_pertm) end if ! endif ! iwf @@ -682,6 +788,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0, enddo enddo ! ispin enddo + !print *, "D ::: ", d0/1000000, d1/1000000, d2/1000000 end @@ -804,9 +911,53 @@ subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microl end subroutine -subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, & - tmicrolist, idx_tmicrolist, N_tmicrolist, ptr_tmicrolist, Nint) +subroutine finish_isinwf(key_mask, keys, N_keys, isinwf) use bitmasks + implicit none + + integer(bit_kind), intent(in) :: key_mask(N_int, 2), keys(N_int, 2, N_keys) + integer(bit_kind) :: key_mask_neg(N_int, 2) + integer(bit_kind) :: mobileMask(N_int, 2) + logical,intent(inout) :: isinwf(mo_tot_num*2, mo_tot_num*2) + integer, intent(in) :: N_keys + integer :: i,j,nt,nt2,list(2,2), n_element(2) + logical, external :: detEq + + do i=1,N_int + key_mask_neg(i,1) = not(key_mask(i,1)) + key_mask_neg(i,2) = not(key_mask(i,2)) + end do + + do i=1, N_keys + nt = 0 + + do j=1,N_int + mobileMask(j,1) = iand(key_mask_neg(j,1), keys(j,1,i)) + mobileMask(j,2) = iand(key_mask_neg(j,2), keys(j,2,i)) + nt += popcnt(mobileMask(j, 1)) + popcnt(mobileMask(j, 2)) + end do + + if(nt /= 2) cycle + + call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), N_int) + call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), N_int) + + if(n_element(1) >= 1) nt = list(1,1) + if(n_element(1) == 2) nt2 = list(2,1) + if(n_element(2) == 2) nt = list(2,2) + mo_tot_num + if(n_element(2) >= 1) nt2 = list(1,2) + mo_tot_num + + isinwf(nt, nt2) = .true. + isinwf(nt2, nt) = .true. + end do +end subroutine + + +subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, & + tmicrolist, idx_tmicrolist, N_tmicrolist, ptr_tmicrolist, & + isinwf, d0s, Nint) + use bitmasks + implicit none integer, intent(in) :: Nint, i_cur, N_minilist integer(bit_kind), intent(in) :: minilist(Nint,2,N_minilist), key_mask(Nint,2) @@ -816,12 +967,19 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl integer, intent(out) :: N_tmicrolist(0:mo_tot_num*2), ptr_tmicrolist(0:mo_tot_num*2+1), idx_tmicrolist(N_minilist*4) integer(bit_kind), intent(out) :: tmicrolist(Nint,2,N_minilist*4) - integer :: i,j,k,s,nt,n_element(2,N_minilist), idx(0:N_minilist) + + integer :: i,j,k,s,nt,nt2,n_element(2,N_minilist), idx(0:N_minilist) integer :: list(4,2,N_minilist), cur_microlist(0:mo_tot_num*2+1), cur_tmicrolist(0:mo_tot_num*2+1) integer(bit_kind) :: key_mask_neg(Nint,2), mobileMask(Nint,2) integer :: mo_tot_num_2 + logical,intent(out) :: isinwf(mo_tot_num*2, mo_tot_num*2) + double precision, intent(out) :: d0s(mo_tot_num, mo_tot_num, N_states) + double precision :: integ(mo_tot_num, mo_tot_num) + isinwf = .false. + integ = 0d0 + d0s = 0d0 mo_tot_num_2 = mo_tot_num+mo_tot_num - + idx(0) = 0 do i=1,Nint key_mask_neg(i,1) = not(key_mask(i,1)) @@ -846,21 +1004,40 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl idx(0) += 1 idx(idx(0)) = i - if(nt < 3) then + call bitstring_to_list(mobileMask(1,1), list(1,1,idx(0)), n_element(1, idx(0)), Nint) + call bitstring_to_list(mobileMask(1,2), list(1,2,idx(0)), n_element(2, idx(0)), Nint) + + + if(nt <= 2) then if(i < i_cur) then - N_microlist = 0 !!!! PAST LINKED TO EVERYBODY! + N_microlist = 0 ptr_microlist = 1 - N_tmicrolist = 0 !!!! PAST LINKED TO EVERYBODY! + N_tmicrolist = 0 ptr_tmicrolist = 1 return else - n_element(:, idx(0)) = (/2, 0/) + !n_element(:, idx(0)) = (/2, 0/) N_microlist(0) = N_microlist(0) + 1 + + if(n_element(1,idx(0)) >= 1) nt = list(1,1,idx(0)) + if(n_element(1,idx(0)) == 2) nt2 = list(2,1,idx(0)) + if(n_element(2,idx(0)) == 2) nt = list(2,2,idx(0)) + mo_tot_num + if(n_element(2,idx(0)) >= 1) nt2 = list(1,2,idx(0)) + mo_tot_num + + isinwf(nt, nt2) = .true. + isinwf(nt2, nt) = .true. + double precision, external :: get_mo_bielec_integral + nt = mod(nt, mo_tot_num) + nt2 = mod(nt2, mo_tot_num) + ! call get_mo_bielec_integrals_ij(nt, nt2 ,mo_tot_num,integ,mo_integrals_map) + +! do j=1, N_states +! call i_h_j +! d0s(:,:,j) += integ(:,:) * psi_selectors_coef(i,j) !!!!!!!!!!!!!!!!!!! MOOOOOCHE !!!!! suppose que minilist = psi_selectors ..... +! end do +! print *, "TO ", integ(mod(nt, mo_tot_num), mod(nt2, mo_tot_num)) endif else - call bitstring_to_list(mobileMask(1,1), list(1,1,idx(0)), n_element(1, idx(0)), Nint) - call bitstring_to_list(mobileMask(1,2), list(1,2,idx(0)), n_element(2, idx(0)), Nint) - do s=1,2 do j=1,n_element(s,idx(0)) k = list(j,s,idx(0)) + mo_tot_num * (s-1) @@ -886,7 +1063,7 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl do i=1, idx(0) if(n_element(1, i) + n_element(2, i) > 4) stop "wired" - if(n_element(1, i) + n_element(2, i) < 3) then + if(n_element(1, i) + n_element(2, i) <= 2) then idx_microlist(cur_microlist(0)) = idx(i) do k=1,Nint microlist(k,1,cur_microlist(0)) = minilist(k,1,idx(i)) @@ -955,7 +1132,6 @@ subroutine check_past_s(det, list, N, ok, Nint) ok = .false. do i=1,N - !if(idx(i) >= cur) exit s = 0 do ni=1,Nint s += popcnt(xor(det(ni,1), list(ni,1,i))) + popcnt(xor(det(ni,2), list(ni,2,i))) From 418190168e9e60e8fb1c4673daf2811a0138a1bc Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 21 Jul 2016 13:30:10 +0200 Subject: [PATCH 059/216] forgot to add selection_types.f90 --- plugins/Full_CI_ZMQ/selection_types.f90 | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 plugins/Full_CI_ZMQ/selection_types.f90 diff --git a/plugins/Full_CI_ZMQ/selection_types.f90 b/plugins/Full_CI_ZMQ/selection_types.f90 new file mode 100644 index 00000000..9506629c --- /dev/null +++ b/plugins/Full_CI_ZMQ/selection_types.f90 @@ -0,0 +1,9 @@ +module selection_types + type selection_buffer + integer :: N, cur + integer(8), allocatable :: det(:,:,:) + double precision, allocatable :: val(:) + double precision :: mini + endtype +end module + From f0bb2fe8fb44cd81d0b3b8f1b6f0b4269b9a51d6 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 21 Jul 2016 14:29:38 +0200 Subject: [PATCH 060/216] reversed past and futur --- plugins/Full_CI_ZMQ/selection.irp.f | 51 +++++++++++++++-------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 91dbcd29..74149345 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -406,12 +406,14 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p ! nok = .false. sporb = i_particle + (ispin - 1) * mo_tot_num -! ! ! - if(N_microlist(sporb) > 0) call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) +! ! ! subroutine check_past(det, list, idx, N, cur, ok, Nint) + if(N_microlist(sporb) > 0) call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator,nok, N_int) if(nok) cycle ! if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*3,N_states,i_H_psi_value) if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*3,N_states,i_H_psi_value2) + + i_H_psi_value(:) = i_H_psi_value(:) + i_H_psi_value2(:) double precision :: Hii, diag_H_mat_elem_fock Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) @@ -550,7 +552,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p microlist, idx_microlist, N_microlist, ptr_microlist, & tmicrolist, idx_tmicrolist, N_tmicrolist, ptr_tmicrolist, & isinwf, d0s, N_int) - if(N_microlist(0) > 0 .and. idx_microlist(1) < i_generator) stop "wtf..." + if(N_microlist(0) > 0 .and. idx_microlist(1) > i_generator) stop "wtf..." if(ptr_microlist(mo_tot_num * 2 + 1) == 1 .and. ptr_tmicrolist(mo_tot_num * 2 + 1) == 1) cycle call finish_isinwf(ion_det, psi_det_sorted(1,1,N_det_selectors+1), N_det - N_det_selectors, isinwf) @@ -576,7 +578,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p do j1=1,N_particles(ispin1) i_particle1 = particle_list(j1, ispin1) p1 = i_particle1 + (ispin1 - 1) * mo_tot_num - if(N_tmicrolist(p1) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p1)) < i_generator) cycle + if(N_tmicrolist(p1) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p1+1)-1) > i_generator) cycle jb = 1 if(ispin1 == ispin2) jb = j1+1 do j2=jb,N_particles(ispin2) @@ -586,7 +588,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p p2 = i_particle2 + (ispin2 - 1) * mo_tot_num - if(N_tmicrolist(p2) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p2)) < i_generator) cycle + if(N_tmicrolist(p2) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p2+1)-1) > i_generator) cycle if(isinwf(p1, p2)) cycle exc_det = ion_det @@ -645,12 +647,13 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p ! if(nok) cycle nok = .false. - !call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) - call check_past_s(exc_det, microlist(1,1,ptr_microlist(sporb)), N_microlist(sporb) - N_futur_microlist(sporb), nok, N_int) + + call check_futur(exc_det, microlist(1,1,ptr_futur_microlist(sporb)), N_futur_microlist(sporb), nok, N_int) + if(nok) cycle - if(N_futur_microlist(0) > 0) then - call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(0)),psi_coef_microlist(ptr_futur_microlist(0), 1),N_int,N_futur_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) + if(N_microlist(0)-N_futur_microlist(0) > 0) then + call i_H_psi(exc_det,microlist(1,1,ptr_microlist(0)),psi_coef_microlist(ptr_microlist(0), 1),N_int,N_microlist(0)-N_futur_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) ! if(i_H_psi_value(1) /= d0s(p1, p2, 1) .and. d0s(p1, p2, 1) /= 0d0) then ! print *, d0s(p1, p2, 1), i_H_psi_value(1) ! print *, d0s(:3, :3, 1) @@ -664,7 +667,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - if(N_futur_microlist(sporb) > 0) then + if(N_microlist(sporb)-N_futur_microlist(sporb) > 0) then ! ! if(dfloat(N_futur_microlist(lorb)) / dfloat(N_futur_microlist(sporb)) < 2d0) then ! c1 = ptr_futur_microlist(p1) ! c2 = ptr_futur_microlist(p2) @@ -683,7 +686,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p ! endif ! end do ! else - call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(sporb)),psi_coef_microlist(ptr_futur_microlist(sporb), 1),N_int,N_futur_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) + call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb)-N_futur_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) i_H_psi_value = i_H_psi_value + i_H_psi_value2 ! !$OMP ATOMIC ! d2 += dabs(i_H_psi_value2(1)) @@ -703,19 +706,19 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p integer :: c1, c2 double precision :: hij - c1 = ptr_futur_tmicrolist(p1) - c2 = ptr_futur_tmicrolist(p2) + c1 = ptr_tmicrolist(p1) + c2 = ptr_tmicrolist(p2) do while(.true.) - if(c1 >= ptr_tmicrolist(p1+1) .or. c2 >= ptr_tmicrolist(p2+1)) then - if(ptr_tmicrolist(p1+1) /= c1) then - call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_tmicrolist(p1+1)-c1 ,psi_selectors_size*3,N_states,i_H_psi_value2) + if(c1 >= ptr_futur_tmicrolist(p1) .or. c2 >= ptr_futur_tmicrolist(p2)) then + if(ptr_futur_tmicrolist(p1) /= c1) then + call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_futur_tmicrolist(p1)-c1 ,psi_selectors_size*3,N_states,i_H_psi_value2) i_H_psi_value = i_H_psi_value + i_H_psi_value2 ! ! !$OMP ATOMIC ! d1 += dabs(i_H_psi_value2(1)) end if - if(ptr_tmicrolist(p2+1) /= c2) then - call i_H_psi(exc_det,tmicrolist(1,1,c2),psi_coef_tmicrolist(c2, 1),N_int, ptr_tmicrolist(p2+1)-c2 ,psi_selectors_size*3,N_states,i_H_psi_value2) + if(ptr_futur_tmicrolist(p2) /= c2) then + call i_H_psi(exc_det,tmicrolist(1,1,c2),psi_coef_tmicrolist(c2, 1),N_int, ptr_futur_tmicrolist(p2)-c2 ,psi_selectors_size*3,N_states,i_H_psi_value2) i_H_psi_value = i_H_psi_value + i_H_psi_value2 ! !$OMP ATOMIC ! d1 += dabs(i_H_psi_value2(1)) @@ -802,7 +805,7 @@ subroutine create_futur_ptr(ptr_microlist, idx_microlist, ptr_futur_microlist, N do i=0,mo_tot_num*2 ptr_futur_microlist(i) = ptr_microlist(i+1) do j=ptr_microlist(i), ptr_microlist(i+1) - 1 - if(idx_microlist(j) >= i_generator) then + if(idx_microlist(j) > i_generator) then ptr_futur_microlist(i) = j N_futur_microlist(i) = ptr_microlist(i+1) - j exit @@ -847,7 +850,7 @@ subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microl if(nt > 3) then !! TOO MANY DIFFERENCES continue else if(nt < 3) then - if(i < i_cur) then !!!!!!!!!!!!!!!!!!!!! DESACTIVADO + if(i > i_cur) then N_microlist(:) = 0 !!!! PAST LINKED TO EVERYBODY! ptr_microlist(:) = 1 return @@ -1009,7 +1012,7 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl if(nt <= 2) then - if(i < i_cur) then + if(i > i_cur) then N_microlist = 0 ptr_microlist = 1 N_tmicrolist = 0 @@ -1107,8 +1110,8 @@ subroutine check_past(det, list, idx, N, cur, ok, Nint) integer :: i,s,ni ok = .false. - do i=1,N - if(idx(i) >= cur) exit + do i=N,1,-1 + if(idx(i) <= cur) exit s = 0 do ni=1,Nint s += popcnt(xor(det(ni,1), list(ni,1,i))) + popcnt(xor(det(ni,2), list(ni,2,i))) @@ -1121,7 +1124,7 @@ subroutine check_past(det, list, idx, N, cur, ok, Nint) end subroutine -subroutine check_past_s(det, list, N, ok, Nint) +subroutine check_futur(det, list, N, ok, Nint) implicit none use bitmasks From 03958d15a440c41975136c517cdfd046746b3df9 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 21 Jul 2016 15:28:22 +0200 Subject: [PATCH 061/216] experimental - reversed past and futur --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 3 ++- plugins/Full_CI_ZMQ/selection.irp.f | 1 - src/Determinants/determinants.irp.f | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index aa0c013e..e221533b 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -128,7 +128,7 @@ subroutine ZMQ_selection(N, pt2) integer :: i integer, external :: omp_get_thread_num double precision, intent(out) :: pt2(N_states) - + call flip_generators() call new_parallel_job(zmq_to_qp_run_socket,'selection') call create_selection_buffer(N, N*2, b) @@ -149,6 +149,7 @@ subroutine ZMQ_selection(N, pt2) endif !$OMP END PARALLEL call end_parallel_job(zmq_to_qp_run_socket, 'selection') + call flip_generators() call fill_H_apply_buffer_no_selection(b%cur,b%det,N_int,0) !!! PAS DE ROBIN call copy_H_apply_buffer_to_wf() end subroutine diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 91dbcd29..0625ab6c 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -28,7 +28,6 @@ subroutine selection_slave(thread,iproc) buf%N = 0 ctask = 1 pt2 = 0d0 - do call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id(ctask), task) done = task_id(ctask) == 0 diff --git a/src/Determinants/determinants.irp.f b/src/Determinants/determinants.irp.f index 400345c1..609379f2 100644 --- a/src/Determinants/determinants.irp.f +++ b/src/Determinants/determinants.irp.f @@ -330,6 +330,24 @@ END_PROVIDER END_PROVIDER +subroutine flip_generators() + integer :: i,j,k + integer(bit_kind) :: detmp(N_int,2) + double precision :: tmp(N_states) + + do i=1,N_det_generators/2 + detmp(:,:) = psi_det_sorted(:,:,i) + tmp = psi_coef_sorted(i, :) + psi_det_sorted(:,:,i) = psi_det_sorted(:,:,N_det_generators+1-i) + psi_coef_sorted(i, :) = psi_coef_sorted(N_det_generators+1-i, :) + + psi_det_sorted(:,:,N_det_generators+1-i) = detmp(:,:) + psi_coef_sorted(N_det_generators+1-i, :) = tmp + end do + + TOUCH psi_det_sorted psi_coef_sorted psi_average_norm_contrib_sorted +end subroutine + BEGIN_PROVIDER [ integer(bit_kind), psi_det_sorted_bit, (N_int,2,psi_det_size) ] &BEGIN_PROVIDER [ double precision, psi_coef_sorted_bit, (psi_det_size,N_states) ] implicit none From a117ac1a6bee5f9c7c329b09d408ce48f6135b2b Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 25 Jul 2016 14:10:28 +0200 Subject: [PATCH 062/216] ready for integral driven version - dirty copypastas --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 25 +- plugins/Full_CI_ZMQ/selection.irp.f | 920 ++++++++++++++++------------ 2 files changed, 531 insertions(+), 414 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index e221533b..b3a89b74 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -7,8 +7,8 @@ program fci_zmq double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) integer :: N_st, degree - integer :: it, mit(0:5) - mit = (/1, 268, 1517, 10018, 45096, 100000/) + integer :: it, mit(0:6) + mit = (/1, 246, 1600, 17528, 112067, 519459, 2685970/) it = 0 N_st = N_states allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st)) @@ -41,18 +41,18 @@ program fci_zmq 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) + ! call H_apply_FCI(pt2, norm_pert, H_pert_diag, N_st) it += 1 - if(it > 5) stop - call ZMQ_selection(mit(it) - mit(it-1), pt2) !(max(N_det*3, 1000-N_det)) + if(it > 6) stop + call ZMQ_selection(mit(it) - mit(it-1), pt2) ! max(1000-N_det, N_det), pt2) - do i=1, N_det + !do i=1, N_det !if(popcnt(psi_det(1,1,i)) + popcnt(psi_det(2,1,i)) /= 23) stop "ZZ1" -2099.2504682049275 !if(popcnt(psi_det(1,2,i)) + popcnt(psi_det(2,2,i)) /= 23) stop "ZZ2" - do k=1,i-1 - if(detEq(psi_det(1,1,i), psi_det(1,1,k), N_int)) stop "ATRRGRZER" - end do - end do + ! do k=1,i-1 + ! if(detEq(psi_det(1,1,i), psi_det(1,1,k), N_int)) stop "ATRRGRZER" + ! end do + !end do PROVIDE psi_coef PROVIDE psi_det PROVIDE psi_det_sorted @@ -128,11 +128,10 @@ subroutine ZMQ_selection(N, pt2) integer :: i integer, external :: omp_get_thread_num double precision, intent(out) :: pt2(N_states) - call flip_generators() + !call flip_generators() call new_parallel_job(zmq_to_qp_run_socket,'selection') call create_selection_buffer(N, N*2, b) - do i= N_det_generators, 1, -1 write(task,*) i, N call add_task_to_taskserver(zmq_to_qp_run_socket,task) @@ -149,7 +148,7 @@ subroutine ZMQ_selection(N, pt2) endif !$OMP END PARALLEL call end_parallel_job(zmq_to_qp_run_socket, 'selection') - call flip_generators() + !call flip_generators() call fill_H_apply_buffer_no_selection(b%cur,b%det,N_int,0) !!! PAS DE ROBIN call copy_H_apply_buffer_to_wf() end subroutine diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 5e4eef36..d0c7cbba 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -4,31 +4,32 @@ subroutine selection_slave(thread,iproc) use f77_zmq use selection_types implicit none - + integer, intent(in) :: thread, iproc integer :: rc, i integer :: worker_id, task_id(100), ctask, ltask - character*(512) :: task - - integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket - integer(ZMQ_PTR) :: zmq_to_qp_run_socket - - integer(ZMQ_PTR), external :: new_zmq_push_socket - integer(ZMQ_PTR) :: zmq_socket_push - + character*(512) :: task + + integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + + integer(ZMQ_PTR), external :: new_zmq_push_socket + integer(ZMQ_PTR) :: zmq_socket_push + type(selection_buffer) :: buf logical :: done double precision :: pt2(N_states) - + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() zmq_socket_push = new_zmq_push_socket(thread) call connect_to_taskserver(zmq_to_qp_run_socket,worker_id,thread) - + buf%N = 0 ctask = 1 pt2 = 0d0 - do + + do call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id(ctask), task) done = task_id(ctask) == 0 if (.not. done) then @@ -41,30 +42,30 @@ subroutine selection_slave(thread,iproc) end if call select_connected(i_generator,ci_electronic_energy,pt2,buf) !! ci_electronic_energy ?? end if - + if(done) ctask = ctask - 1 - - if(done .or. ctask == size(task_id)) then - if(ctask > 0 .and. buf%N /= 0) then + + if(done .or. ctask == size(task_id)) then + if(buf%N == 0 .and. ctask > 0) stop "uninitialized selection_buffer" + do i=1, ctask + call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id(i)) + end do + if(ctask > 0) then call push_selection_results(zmq_socket_push, pt2, buf, task_id(1), ctask) pt2 = 0d0 buf%cur = 0 end if - - do i=1, ctask - call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id(i)) - end do + + ctask = 0 end if - + if(done) exit ctask = ctask + 1 end do - call disconnect_from_taskserver(zmq_to_qp_run_socket,zmq_socket_push,worker_id) call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) call end_zmq_push_socket(zmq_socket_push,thread) - end subroutine @@ -72,27 +73,32 @@ subroutine push_selection_results(zmq_socket_push, pt2, b, task_id, ntask) use f77_zmq use selection_types implicit none - - integer(ZMQ_PTR), intent(in) :: zmq_socket_push + + integer(ZMQ_PTR), intent(in) :: zmq_socket_push double precision, intent(in) :: pt2(N_states) type(selection_buffer), intent(inout) :: b integer, intent(in) :: ntask, task_id(*) integer :: rc - + call sort_selection_buffer(b) - + rc = f77_zmq_send( zmq_socket_push, b%cur, 4, ZMQ_SNDMORE) - + if(rc /= 4) stop "push" rc = f77_zmq_send( zmq_socket_push, pt2, 8*N_states, ZMQ_SNDMORE) - - rc = f77_zmq_send( zmq_socket_push, b%val(1), 8*b%cur, ZMQ_SNDMORE) - - rc = f77_zmq_send( zmq_socket_push, b%det(1,1,1), bit_kind*N_int*2*b%cur, ZMQ_SNDMORE) - - rc = f77_zmq_send( zmq_socket_push, ntask, 4, ZMQ_SNDMORE) - - rc = f77_zmq_send( zmq_socket_push, task_id(1), ntask*4, 0) - + if(rc /= 8*N_states) stop "push" + + rc = f77_zmq_send( zmq_socket_push, b%val(1), 8*b%cur, ZMQ_SNDMORE) + if(rc /= 8*b%cur) stop "push" + + rc = f77_zmq_send( zmq_socket_push, b%det(1,1,1), bit_kind*N_int*2*b%cur, ZMQ_SNDMORE) + if(rc /= bit_kind*N_int*2*b%cur) stop "push" + + rc = f77_zmq_send( zmq_socket_push, ntask, 4, ZMQ_SNDMORE) + if(rc /= 4) stop "push" + + rc = f77_zmq_send( zmq_socket_push, task_id(1), ntask*4, 0) + if(rc /= 4*ntask) stop "push" + end subroutine @@ -100,24 +106,30 @@ subroutine pull_selection_results(zmq_socket_pull, pt2, val, det, N, task_id, nt use f77_zmq use selection_types implicit none - integer(ZMQ_PTR), intent(in) :: zmq_socket_pull + integer(ZMQ_PTR), intent(in) :: zmq_socket_pull double precision, intent(inout) :: pt2(N_states) double precision, intent(out) :: val(*) integer(bit_kind), intent(out) :: det(N_int, 2, *) integer, intent(out) :: N, ntask, task_id(*) integer :: rc, rn, i - - rc = f77_zmq_recv( zmq_socket_pull, N, 4, ZMQ_SNDMORE) - - rc = f77_zmq_recv( zmq_socket_pull, pt2, N_states*8, ZMQ_SNDMORE) - - rc = f77_zmq_recv( zmq_socket_pull, val(1), 8*N, ZMQ_SNDMORE) - - rc = f77_zmq_recv( zmq_socket_pull, det(1,1,1), bit_kind*N_int*2*N, ZMQ_SNDMORE) - - rc = f77_zmq_recv( zmq_socket_pull, ntask, 4, ZMQ_SNDMORE) - - rc = f77_zmq_recv( zmq_socket_pull, task_id(1), ntask*4, 0) + + rc = f77_zmq_recv( zmq_socket_pull, N, 4, ZMQ_SNDMORE) + if(rc /= 4) stop "pull" + + rc = f77_zmq_recv( zmq_socket_pull, pt2, N_states*8, ZMQ_SNDMORE) + if(rc /= 8*N_states) stop "pull" + + rc = f77_zmq_recv( zmq_socket_pull, val(1), 8*N, ZMQ_SNDMORE) + if(rc /= 8*N) stop "pull" + + rc = f77_zmq_recv( zmq_socket_pull, det(1,1,1), bit_kind*N_int*2*N, ZMQ_SNDMORE) + if(rc /= bit_kind*N_int*2*N) stop "pull" + + rc = f77_zmq_recv( zmq_socket_pull, ntask, 4, ZMQ_SNDMORE) + if(rc /= 4) stop "pull" + + rc = f77_zmq_recv( zmq_socket_pull, task_id(1), ntask*4, 0) + if(rc /= 4*ntask) stop "pull" end subroutine @@ -134,37 +146,37 @@ subroutine select_connected(i_generator,E0,pt2,b) integer(bit_kind) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision :: fock_diag_tmp(2,mo_tot_num+1) - - + + call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) - + do l=1,N_generators_bitmask do k=1,N_int hole_mask(k,1) = iand(generators_bitmask(k,1,s_hole,l), psi_det_generators(k,1,i_generator)) - hole_mask(k,2) = iand(generators_bitmask(k,2,s_hole,l), psi_det_generators(k,2,i_generator)) + hole_mask(k,2) = iand(generators_bitmask(k,2,s_hole,l), psi_det_generators(k,2,i_generator)) particle_mask(k,1) = iand(generators_bitmask(k,1,s_part,l), not(psi_det_generators(k,1,i_generator)) ) particle_mask(k,2) = iand(generators_bitmask(k,2,s_part,l), not(psi_det_generators(k,2,i_generator)) ) - + hole_mask(k,1) = ior(generators_bitmask(k,1,s_hole,l), generators_bitmask(k,1,s_part,l)) hole_mask(k,2) = ior(generators_bitmask(k,2,s_hole,l), generators_bitmask(k,2,s_part,l)) particle_mask(k,:) = hole_mask(k,:) enddo - + call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) enddo end - + subroutine create_selection_buffer(N, siz, res) use selection_types implicit none - + integer, intent(in) :: N, siz type(selection_buffer), intent(out) :: res - + allocate(res%det(N_int, 2, siz), res%val(siz)) - + res%val = 0d0 res%det = 0_8 res%N = N @@ -176,12 +188,12 @@ end subroutine subroutine add_to_selection_buffer(b, det, val) use selection_types implicit none - + type(selection_buffer), intent(inout) :: b integer(bit_kind), intent(in) :: det(N_int, 2) double precision, intent(in) :: val integer :: i - + if(dabs(val) >= b%mini) then b%cur += 1 b%det(:,:,b%cur) = det(:,:) @@ -196,7 +208,7 @@ end subroutine subroutine sort_selection_buffer(b) use selection_types implicit none - + type(selection_buffer), intent(inout) :: b double precision, allocatable :: vals(:), absval(:) integer, allocatable :: iorder(:) @@ -204,15 +216,15 @@ subroutine sort_selection_buffer(b) integer :: i, nmwen logical, external :: detEq nmwen = min(b%N, b%cur) - - + + allocate(iorder(b%cur), detmp(N_int, 2, nmwen), absval(b%cur), vals(nmwen)) absval = -dabs(b%val(:b%cur)) do i=1,b%cur iorder(i) = i end do call dsort(absval, iorder, b%cur) - + do i=1, nmwen detmp(:,:,i) = b%det(:,:,iorder(i)) vals(i) = b%val(iorder(i)) @@ -231,47 +243,53 @@ subroutine selection_collector(b, pt2) use selection_types use bitmasks implicit none - - + + type(selection_buffer), intent(inout) :: b double precision, intent(out) :: pt2(N_states) double precision :: pt2_mwen(N_states) - integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket - integer(ZMQ_PTR) :: zmq_to_qp_run_socket - - integer(ZMQ_PTR), external :: new_zmq_pull_socket - integer(ZMQ_PTR) :: zmq_socket_pull + integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + + integer(ZMQ_PTR), external :: new_zmq_pull_socket + integer(ZMQ_PTR) :: zmq_socket_pull integer :: msg_size, rc, more integer :: acc, i, j, robin, N, ntask double precision, allocatable :: val(:) integer(bit_kind), allocatable :: det(:,:,:) integer, allocatable :: task_id(:) - - zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() - zmq_socket_pull = new_zmq_pull_socket() + integer :: done + real :: time, time0 + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() + zmq_socket_pull = new_zmq_pull_socket() allocate(val(b%N), det(N_int, 2, b%N), task_id(N_det)) - pt2 = 0d0 - more = 1 - do while (more == 1) + done = 0 + more = 1 + pt2(:) = 0d0 + call CPU_TIME(time0) + do while (more == 1) call pull_selection_results(zmq_socket_pull, pt2_mwen, val(1), det(1,1,1), N, task_id, ntask) pt2 += pt2_mwen do i=1, N call add_to_selection_buffer(b, det(1,1,i), val(i)) end do - + do i=1, ntask - if (task_id(i) /= 0) then - call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id(i),more) - endif + if(task_id(i) == 0) stop "collector" + call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id(i),more) end do + done += ntask + call CPU_TIME(time) + print *, "DONE" , done, time - time0 end do + call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) call end_zmq_pull_socket(zmq_socket_pull) call sort_selection_buffer(b) end subroutine - + subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf) use f77_zmq @@ -287,7 +305,7 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision, intent(in) :: E0(N_states) type(selection_buffer), intent(inout) :: buf - + integer :: i,j,k,l integer :: msg_size @@ -313,7 +331,7 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) - + ! Create excited determinants ! --------------------------- @@ -326,26 +344,18 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p ion_det(k,1) = psi_det_generators(k,1,i_generator) ion_det(k,2) = psi_det_generators(k,2,i_generator) enddo - - - ! Create the mini wave function where = - ! -------------------------------------------------------------- -! integer(bit_kind) :: psi_det_connected(N_int,2,psi_selectors_size) -! double precision :: psi_coef_connected(psi_selectors_size,N_states) - + + integer :: ptr_microlist(0:mo_tot_num * 2 + 1), N_microlist(0:mo_tot_num * 2) integer, allocatable :: idx_microlist(:) integer(bit_kind), allocatable :: microlist(:, :, :) double precision, allocatable :: psi_coef_microlist(:,:) - + allocate(microlist(N_int, 2, N_det_selectors * 3), psi_coef_microlist(psi_selectors_size * 3, N_states), idx_microlist(N_det_selectors * 3)) - + do ispin=1,2 -! do k=1,N_int -! ion_det(k,ispin) = psi_det_generators(k,ispin,i_generator) -! enddo - + do i=1, N_holes(ispin) ion_det(:,:) = psi_det_generators(:,:,i_generator) @@ -356,81 +366,64 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p integer :: j_hole, k_hole k_hole = ishft(i_hole-1,-bit_kind_shift)+1 ! N_int j_hole = i_hole-ishft(k_hole-1,bit_kind_shift)-1 ! bit index -! ion_det(k_hole,ispin) = ibclr(psi_det_generators(k_hole,ispin,i_generator),j_hole) ion_det(k_hole,ispin) = ibclr(ion_det(k_hole,ispin),j_hole) - + call create_microlist_single(psi_selectors, i_generator, N_det_selectors, ion_det, microlist, idx_microlist, N_microlist, ptr_microlist, N_int) - + do j=1, ptr_microlist(mo_tot_num * 2 + 1) - 1 psi_coef_microlist(j,:) = psi_selectors_coef(idx_microlist(j),:) enddo - + if(ptr_microlist(mo_tot_num * 2 + 1) == 1) then cycle endif - ! Create particles - ! ---------------- do j=1,N_particles(ispin) -! exc_det(k_hole,ispin) = ion_det(k_hole,ispin) exc_det(:,:) = ion_det(:,:) - + integer :: i_particle i_particle = particle_list(j,ispin) - ! Apply the particle integer :: j_particle, k_particle k_particle = ishft(i_particle-1,-bit_kind_shift)+1 ! N_int j_particle = i_particle-ishft(k_particle-1,bit_kind_shift)-1 ! bit index -! exc_det(k_particle,ispin) = ibset(ion_det(k_particle,ispin),j_particle) exc_det(k_particle,ispin) = ibset(exc_det(k_particle,ispin),j_particle) - - ! TODO - + + logical, external :: is_in_wavefunction logical :: nok - ! TODO : Check connected to ref if (.not. is_in_wavefunction(exc_det,N_int)) then - ! Compute perturbative contribution and select determinant double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) - double precision :: i_H_full(N_states) i_H_psi_value = 0d0 i_H_psi_value2 = 0d0 - i_H_full = 0d0 integer :: sporb - -! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_full) -! + + nok = .false. - sporb = i_particle + (ispin - 1) * mo_tot_num -! ! ! subroutine check_past(det, list, idx, N, cur, ok, Nint) - if(N_microlist(sporb) > 0) call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator,nok, N_int) + sporb = i_particle + (ispin - 1) * mo_tot_num + + if(N_microlist(sporb) > 0) call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) if(nok) cycle -! + if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*3,N_states,i_H_psi_value) if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*3,N_states,i_H_psi_value2) - - i_H_psi_value(:) = i_H_psi_value(:) + i_H_psi_value2(:) double precision :: Hii, diag_H_mat_elem_fock Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) - + double precision :: delta_E, e_pert(N_states), e_pertm e_pert(:) = 0d0 e_pertm = 0d0 - + do k=1,N_states -! if(dabs(1d0 - i_H_psi_value(k)/i_H_full(k)) > 1d-6) then -! stop "PAS BON, PAS BOOOOON!! (single)" -! endif if (i_H_psi_value(k) == 0.d0) cycle delta_E = E0(k) - Hii if (delta_E < 0.d0) then - e_pert(k) = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + e_pert(k) = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) else - e_pert(k) = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + e_pert(k) = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) endif if(dabs(e_pert(k)) > dabs(e_pertm)) e_pertm = e_pert(k) pt2(k) += e_pert(k) @@ -466,11 +459,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p type(selection_buffer), intent(inout) :: buf logical :: isinwf(mo_tot_num*2, mo_tot_num*2) double precision :: d0s(mo_tot_num, mo_tot_num, N_states) - d0s = 0d0 -! double precision, save :: d0 = 0d0 -! double precision, save :: d1 = 0d0 -! double precision, save :: d2 = 0d0 - + integer :: i,j,k,l,j1,j2,i1,i2,ib,jb integer :: msg_size @@ -496,31 +485,31 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) - + ! Create excited determinants ! --------------------------- integer :: ispin1, ispin2, other_spin integer(bit_kind) :: exc_det(N_int,2), ion_det(N_int,2) - - + + integer :: ptr_microlist(0:mo_tot_num * 2 + 1), N_microlist(0:mo_tot_num * 2) double precision, allocatable :: psi_coef_microlist(:,:) - + integer :: ptr_tmicrolist(0:mo_tot_num * 2 + 1), N_tmicrolist(0:mo_tot_num * 2) double precision, allocatable :: psi_coef_tmicrolist(:,:) - + integer, allocatable :: idx_tmicrolist(:), idx_microlist(:) integer(bit_kind), allocatable :: microlist(:,:,:), tmicrolist(:,:,:) - + integer :: ptr_futur_microlist(0:mo_tot_num * 2 + 1), ptr_futur_tmicrolist(0:mo_tot_num * 2 + 1) integer :: N_futur_microlist(0:mo_tot_num * 2), N_futur_tmicrolist(0:mo_tot_num * 2) logical :: pastlink - + allocate(idx_tmicrolist(N_det_selectors * 3), idx_microlist(N_det_selectors * 4)) allocate(microlist(N_int, 2, N_det_selectors * 4), tmicrolist(N_int, 2, N_det_selectors * 3)) allocate(psi_coef_tmicrolist(psi_selectors_size * 3, N_states), psi_coef_microlist(psi_selectors_size * 4, N_states)) - + do k=1,N_int exc_det(k,1) = psi_det_generators(k,1,i_generator) exc_det(k,2) = psi_det_generators(k,2,i_generator) @@ -536,62 +525,62 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p if(ispin1 == ispin2) ib = i1+1 do i2=ib, N_holes(ispin2) ion_det(:,:) = psi_det_generators(:,:,i_generator) -! call set_hole(ion_det, hole_list(i1,ispin1), ispin1, hole_list(i1,ispin1), ispin1, Nint) + i_hole1 = hole_list(i1,ispin1) k_hole = ishft(i_hole1-1,-bit_kind_shift)+1 ! N_int j_hole = i_hole1-ishft(k_hole-1,bit_kind_shift)-1 ! bit index ion_det(k_hole,ispin1) = ibclr(ion_det(k_hole,ispin1),j_hole) - + i_hole2 = hole_list(i2,ispin2) k_hole = ishft(i_hole2-1,-bit_kind_shift)+1 ! N_int j_hole = i_hole2-ishft(k_hole-1,bit_kind_shift)-1 ! bit index ion_det(k_hole,ispin2) = ibclr(ion_det(k_hole,ispin2),j_hole) - + call create_microlist_double(psi_selectors, i_generator, N_det_selectors, ion_det, & microlist, idx_microlist, N_microlist, ptr_microlist, & tmicrolist, idx_tmicrolist, N_tmicrolist, ptr_tmicrolist, & isinwf, d0s, N_int) - if(N_microlist(0) > 0 .and. idx_microlist(1) > i_generator) stop "wtf..." + if(ptr_microlist(mo_tot_num * 2 + 1) == 1 .and. ptr_tmicrolist(mo_tot_num * 2 + 1) == 1) cycle - + call finish_isinwf(ion_det, psi_det_sorted(1,1,N_det_selectors+1), N_det - N_det_selectors, isinwf) - - + + call create_futur_ptr(ptr_microlist, idx_microlist, ptr_futur_microlist, N_futur_microlist, i_generator) call create_futur_ptr(ptr_tmicrolist, idx_tmicrolist, ptr_futur_tmicrolist, N_futur_tmicrolist, i_generator) - - + + do j=1, ptr_microlist(mo_tot_num * 2 + 1) - 1 psi_coef_microlist(j,:) = psi_selectors_coef(idx_microlist(j),:) enddo do j=1, ptr_tmicrolist(mo_tot_num * 2 + 1) - 1 psi_coef_tmicrolist(j,:) = psi_selectors_coef(idx_tmicrolist(j),:) enddo - - + + ! Create particles ! ---------------- integer :: i_particle1, i_particle2, k_particle, j_particle integer :: p1, p2, sporb, lorb - + do j1=1,N_particles(ispin1) i_particle1 = particle_list(j1, ispin1) p1 = i_particle1 + (ispin1 - 1) * mo_tot_num - if(N_tmicrolist(p1) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p1+1)-1) > i_generator) cycle + if(N_tmicrolist(p1) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p1)) < i_generator) cycle jb = 1 if(ispin1 == ispin2) jb = j1+1 do j2=jb,N_particles(ispin2) - + i_particle2 = particle_list(j2, ispin2) - - - + + + p2 = i_particle2 + (ispin2 - 1) * mo_tot_num - if(N_tmicrolist(p2) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p2+1)-1) > i_generator) cycle + if(N_tmicrolist(p2) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p2)) < i_generator) cycle if(isinwf(p1, p2)) cycle exc_det = ion_det - - + + if(N_microlist(p1) < N_microlist(p2)) then sporb = p1 lorb = p2 @@ -599,75 +588,40 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p sporb = p2 lorb = p1 endif - - + + ! Apply the particle k_particle = ishft(i_particle2-1,-bit_kind_shift)+1 ! N_int j_particle = i_particle2-ishft(k_particle-1,bit_kind_shift)-1 ! bit index exc_det(k_particle,ispin2) = ibset(exc_det(k_particle,ispin2),j_particle) - + ! Apply the particle k_particle = ishft(i_particle1-1,-bit_kind_shift)+1 ! N_int j_particle = i_particle1-ishft(k_particle-1,bit_kind_shift)-1 ! bit index exc_det(k_particle,ispin1) = ibset(exc_det(k_particle,ispin1),j_particle) - - -! if(.false. .or. (is_in_wavefunction(exc_det,N_int) .and. .not. isinwf(p1,p2))) then -! print *, p1, p2 -! call debug_det(ion_det, N_int) -! call debug_det(exc_det, N_int) -! ! do i=1,mo_tot_num*2 -! ! print *, isinwf(:, i) -! ! end do -! print *, isinwf(p1, p2) -! stop "isw" -! end if - - ! TODO - + logical, external :: is_in_wavefunction logical :: nok - ! TODO : Check connected to ref -! if (.not. is_in_wavefunction(exc_det,N_int)) then + ! Compute perturbative contribution and select determinant + double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) + i_H_psi_value = 0d0 + i_H_psi_value2 = 0d0 + + nok = .false. + call check_past_s(exc_det, microlist(1,1,ptr_microlist(sporb)), N_microlist(sporb) - N_futur_microlist(sporb), nok, N_int) + if(nok) cycle + !DET DRIVEN + if(N_futur_microlist(0) > 0) then + call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(0)),psi_coef_microlist(ptr_futur_microlist(0), 1),N_int,N_futur_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) + end if + !INTEGRAL DRIVEN +! i_H_psi_value = d0s(mod(p1-1, mo_tot_num)+1, mod(p2-1, mo_tot_num)+1, :) + - - ! Compute perturbative contribution and select determinant - double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) - double precision :: i_H_full(N_states) - i_H_psi_value = 0d0 - i_H_psi_value2 = 0d0 - i_H_full = 0d0 - -! call i_H_psi(exc_det,psi_selectors,psi_selectors_coef,N_int,N_det_selectors,psi_selectors_size,N_states,i_H_full) - - - -! call check_past(exc_det, microlist, idx_microlist, N_microlist(0), i_generator, nok, N_int) -! if(nok) cycle - - nok = .false. - - call check_futur(exc_det, microlist(1,1,ptr_futur_microlist(sporb)), N_futur_microlist(sporb), nok, N_int) - - if(nok) cycle - - if(N_microlist(0)-N_futur_microlist(0) > 0) then - call i_H_psi(exc_det,microlist(1,1,ptr_microlist(0)),psi_coef_microlist(ptr_microlist(0), 1),N_int,N_microlist(0)-N_futur_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) -! if(i_H_psi_value(1) /= d0s(p1, p2, 1) .and. d0s(p1, p2, 1) /= 0d0) then -! print *, d0s(p1, p2, 1), i_H_psi_value(1) -! print *, d0s(:3, :3, 1) -! stop "SKSL" -! end if - end if -! if(N_futur_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(sporb)),psi_coef_microlist(ptr_futur_microlist(sporb), 1),N_int,N_futur_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) -! !$OMP ATOMIC -! d0 += dabs(i_H_psi_value(1)) -! d2 += N_futur_microlist(sporb) - - - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - if(N_microlist(sporb)-N_futur_microlist(sporb) > 0) then -! ! if(dfloat(N_futur_microlist(lorb)) / dfloat(N_futur_microlist(sporb)) < 2d0) then + if(N_futur_microlist(sporb) > 0) then + !!! COMPUTE INTERSECTION + !!!!!!!!!!!!! +! if(dfloat(N_futur_microlist(lorb)) / dfloat(N_futur_microlist(sporb)) < 2d0) then ! c1 = ptr_futur_microlist(p1) ! c2 = ptr_futur_microlist(p2) ! do while(c1 < ptr_microlist(p1+1) .and. c2 < ptr_microlist(p2+1)) @@ -685,112 +639,72 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p ! endif ! end do ! else - call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb)-N_futur_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) - i_H_psi_value = i_H_psi_value + i_H_psi_value2 -! !$OMP ATOMIC -! d2 += dabs(i_H_psi_value2(1)) -! d2 += N_futur_microlist(sporb) -! ! end if - end if - - -! enddo 2099.3283623955813 - - - !!!!!!!!!!!!!!!!!! -! if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist(ptr_microlist(0), 1),N_int,N_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) -! if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) - -! i_H_psi_value = i_H_psi_value + i_H_psi_value2 - - integer :: c1, c2 - double precision :: hij - c1 = ptr_tmicrolist(p1) - c2 = ptr_tmicrolist(p2) - do while(.true.) - if(c1 >= ptr_futur_tmicrolist(p1) .or. c2 >= ptr_futur_tmicrolist(p2)) then - if(ptr_futur_tmicrolist(p1) /= c1) then - call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_futur_tmicrolist(p1)-c1 ,psi_selectors_size*3,N_states,i_H_psi_value2) - i_H_psi_value = i_H_psi_value + i_H_psi_value2 -! ! !$OMP ATOMIC -! d1 += dabs(i_H_psi_value2(1)) - end if - - if(ptr_futur_tmicrolist(p2) /= c2) then - call i_H_psi(exc_det,tmicrolist(1,1,c2),psi_coef_tmicrolist(c2, 1),N_int, ptr_futur_tmicrolist(p2)-c2 ,psi_selectors_size*3,N_states,i_H_psi_value2) - i_H_psi_value = i_H_psi_value + i_H_psi_value2 -! !$OMP ATOMIC -! d1 += dabs(i_H_psi_value2(1)) - endif - - exit - endif - - if(idx_tmicrolist(c1) < idx_tmicrolist(c2)) then - call i_H_j(exc_det,tmicrolist(1,1,c1),N_int,hij) - do j = 1, N_states - i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c1,j)*hij - enddo -! !$OMP ATOMIC -! d1 += dabs(psi_coef_tmicrolist(c1,1)*hij) - c1 += 1 - else - call i_H_j(exc_det,tmicrolist(1,1,c2),N_int,hij) - do j = 1, N_states - i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c2,j)*hij - enddo - if(idx_tmicrolist(c1) == idx_tmicrolist(c2)) c1 = c1 + 1 -! !$OMP ATOMIC -! d1 += dabs(psi_coef_tmicrolist(c2,1)*hij) - c2 += 1 - end if - enddo - - double precision :: Hii, diag_H_mat_elem_fock - Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) - double precision :: delta_E, e_pert(N_states), e_pertm - e_pert(:) = 0d0 - e_pertm = 0d0 - - do k=1,N_states -! if(dabs(1d0 - i_H_psi_value(k)/i_H_full(k)) > 1d-6) then -! print *, i_H_psi_value(k), i_H_full(k), i_H_psi_value(k)/i_H_full(k) -! stop "PAS BON, PAS BOOON (double)" -! -! endif - - if (i_H_psi_value(k) == 0.d0) cycle - delta_E = E0(k) - Hii - if (delta_E < 0.d0) then - e_pert(k) = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) - else - e_pert(k) = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) - endif - if(dabs(e_pert(k)) > dabs(e_pertm)) e_pertm = e_pert(k) - pt2(k) += e_pert(k) - enddo - if(dabs(e_pertm) > dabs(buf%mini)) then - call add_to_selection_buffer(buf, exc_det, e_pertm) - end if -! endif ! iwf + call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(sporb)),psi_coef_microlist(ptr_futur_microlist(sporb), 1),N_int,N_futur_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) + i_H_psi_value = i_H_psi_value + i_H_psi_value2 + end if - - - - - - - ! Reset exc_det -! exc_det(k_particle,ispin) = psi_det_generators(k_particle,ispin,i_generator) - enddo ! j + + integer :: c1, c2 + double precision :: hij + c1 = ptr_futur_tmicrolist(p1) + c2 = ptr_futur_tmicrolist(p2) + do while(.true.) + if(c1 >= ptr_tmicrolist(p1+1) .or. c2 >= ptr_tmicrolist(p2+1)) then + if(ptr_tmicrolist(p1+1) /= c1) then + call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_tmicrolist(p1+1)-c1 ,psi_selectors_size*3,N_states,i_H_psi_value2) + i_H_psi_value = i_H_psi_value + i_H_psi_value2 + end if + + if(ptr_tmicrolist(p2+1) /= c2) then + call i_H_psi(exc_det,tmicrolist(1,1,c2),psi_coef_tmicrolist(c2, 1),N_int, ptr_tmicrolist(p2+1)-c2 ,psi_selectors_size*3,N_states,i_H_psi_value2) + i_H_psi_value = i_H_psi_value + i_H_psi_value2 + endif + + exit + endif + + if(idx_tmicrolist(c1) < idx_tmicrolist(c2)) then + call i_H_j(exc_det,tmicrolist(1,1,c1),N_int,hij) + do j = 1, N_states + i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c1,j)*hij + enddo + c1 += 1 + else + call i_H_j(exc_det,tmicrolist(1,1,c2),N_int,hij) + do j = 1, N_states + i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c2,j)*hij + enddo + if(idx_tmicrolist(c1) == idx_tmicrolist(c2)) c1 = c1 + 1 + c2 += 1 + end if + enddo + + double precision :: Hii, diag_H_mat_elem_fock + Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) + double precision :: delta_E, e_pert(N_states), e_pertm + e_pert(:) = 0d0 + e_pertm = 0d0 + + do k=1,N_states + if (i_H_psi_value(k) == 0.d0) cycle + delta_E = E0(k) - Hii + if (delta_E < 0.d0) then + e_pert(k) = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + else + e_pert(k) = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) + endif + if(dabs(e_pert(k)) > dabs(e_pertm)) e_pertm = e_pert(k) + pt2(k) += e_pert(k) + enddo + if(dabs(e_pertm) > dabs(buf%mini)) then + call add_to_selection_buffer(buf, exc_det, e_pertm) + end if + enddo enddo - ! Reset ion_det -! ion_det(k_hole,ispin) = psi_det_generators(k_hole,ispin,i_generator) - enddo ! i enddo - enddo ! ispin + enddo + enddo enddo - !print *, "D ::: ", d0/1000000, d1/1000000, d2/1000000 end @@ -799,12 +713,12 @@ subroutine create_futur_ptr(ptr_microlist, idx_microlist, ptr_futur_microlist, N integer, intent(in) :: ptr_microlist(0:mo_tot_num * 2 + 1), idx_microlist(*), i_generator integer, intent(out) :: ptr_futur_microlist(0:mo_tot_num * 2 + 1), N_futur_microlist(0:mo_tot_num * 2) integer :: i, j - + N_futur_microlist = 0 do i=0,mo_tot_num*2 ptr_futur_microlist(i) = ptr_microlist(i+1) do j=ptr_microlist(i), ptr_microlist(i+1) - 1 - if(idx_microlist(j) > i_generator) then + if(idx_microlist(j) >= i_generator) then ptr_futur_microlist(i) = j N_futur_microlist(i) = ptr_microlist(i+1) - j exit @@ -818,26 +732,26 @@ subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microl use bitmasks integer, intent(in) :: Nint, i_cur, N_minilist integer(bit_kind), intent(in) :: minilist(Nint,2,N_minilist), key_mask(Nint,2) - + integer, intent(out) :: N_microlist(0:mo_tot_num*2), ptr_microlist(0:mo_tot_num*2+1), idx_microlist(N_minilist*4) integer(bit_kind), intent(out) :: microlist(Nint,2,N_minilist*4) - + integer :: i,j,k,s,nt,n_element(2) integer :: list(Nint*bit_kind_size,2), cur_microlist(0:mo_tot_num*2+1) integer(bit_kind) :: key_mask_neg(Nint,2), mobileMask(Nint,2) integer :: mo_tot_num_2 mo_tot_num_2 = mo_tot_num+mo_tot_num - + do i=1,Nint key_mask_neg(i,1) = not(key_mask(i,1)) key_mask_neg(i,2) = not(key_mask(i,2)) end do - + do i=0,mo_tot_num_2 N_microlist(i) = 0 enddo - + do i=1, N_minilist nt = 0 do j=1,Nint @@ -845,30 +759,30 @@ subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microl mobileMask(j,2) = iand(key_mask_neg(j,2), minilist(j,2,i)) nt += popcnt(mobileMask(j, 1)) + popcnt(mobileMask(j, 2)) end do - + if(nt > 3) then !! TOO MANY DIFFERENCES continue else if(nt < 3) then - if(i > i_cur) then + if(i < i_cur) then !!!!!!!!!!!!!!!!!!!!! DESACTIVADO N_microlist(:) = 0 !!!! PAST LINKED TO EVERYBODY! ptr_microlist(:) = 1 - return + return else !! FUTUR LINKED TO EVERYBODY N_microlist(0) = N_microlist(0) + 1 endif else call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), Nint) call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), Nint) - + do s=1,2 do j=1,n_element(s) - nt = list(j,s) + mo_tot_num * (s-1) - N_microlist(nt) = N_microlist(nt) + 1 + nt = list(j,s) + mo_tot_num * (s-1) + N_microlist(nt) = N_microlist(nt) + 1 end do end do endif end do - + ptr_microlist(0) = 1 do i=1,mo_tot_num_2+1 ptr_microlist(i) = ptr_microlist(i-1) + N_microlist(i-1) @@ -877,18 +791,18 @@ subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microl do i=0,mo_tot_num_2+1 cur_microlist(i) = ptr_microlist(i) end do - - + + do i=1, N_minilist do j=1,Nint mobileMask(j,1) = iand(key_mask_neg(j,1), minilist(j,1,i)) mobileMask(j,2) = iand(key_mask_neg(j,2), minilist(j,2,i)) end do - + call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), Nint) call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), Nint) - + if(n_element(1) + n_element(2) < 3) then idx_microlist(cur_microlist(0)) = i do k=1,Nint @@ -916,7 +830,7 @@ end subroutine subroutine finish_isinwf(key_mask, keys, N_keys, isinwf) use bitmasks implicit none - + integer(bit_kind), intent(in) :: key_mask(N_int, 2), keys(N_int, 2, N_keys) integer(bit_kind) :: key_mask_neg(N_int, 2) integer(bit_kind) :: mobileMask(N_int, 2) @@ -924,31 +838,31 @@ subroutine finish_isinwf(key_mask, keys, N_keys, isinwf) integer, intent(in) :: N_keys integer :: i,j,nt,nt2,list(2,2), n_element(2) logical, external :: detEq - + do i=1,N_int key_mask_neg(i,1) = not(key_mask(i,1)) key_mask_neg(i,2) = not(key_mask(i,2)) end do - + do i=1, N_keys nt = 0 - + do j=1,N_int mobileMask(j,1) = iand(key_mask_neg(j,1), keys(j,1,i)) mobileMask(j,2) = iand(key_mask_neg(j,2), keys(j,2,i)) nt += popcnt(mobileMask(j, 1)) + popcnt(mobileMask(j, 2)) end do - + if(nt /= 2) cycle - + call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), N_int) call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), N_int) - + if(n_element(1) >= 1) nt = list(1,1) if(n_element(1) == 2) nt2 = list(2,1) if(n_element(2) == 2) nt = list(2,2) + mo_tot_num if(n_element(2) >= 1) nt2 = list(1,2) + mo_tot_num - + isinwf(nt, nt2) = .true. isinwf(nt2, nt) = .true. end do @@ -962,37 +876,41 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl implicit none integer, intent(in) :: Nint, i_cur, N_minilist integer(bit_kind), intent(in) :: minilist(Nint,2,N_minilist), key_mask(Nint,2) - + integer, intent(out) :: N_microlist(0:mo_tot_num*2), ptr_microlist(0:mo_tot_num*2+1), idx_microlist(N_minilist*4) integer(bit_kind), intent(out) :: microlist(Nint,2,N_minilist*4) - + integer, intent(out) :: N_tmicrolist(0:mo_tot_num*2), ptr_tmicrolist(0:mo_tot_num*2+1), idx_tmicrolist(N_minilist*4) integer(bit_kind), intent(out) :: tmicrolist(Nint,2,N_minilist*4) - - - integer :: i,j,k,s,nt,nt2,n_element(2,N_minilist), idx(0:N_minilist) - integer :: list(4,2,N_minilist), cur_microlist(0:mo_tot_num*2+1), cur_tmicrolist(0:mo_tot_num*2+1) + + + integer :: i,j,k,s,nt,nt2 + integer, allocatable :: n_element(:,:), idx(:), list(:,:,:) + integer :: cur_microlist(0:mo_tot_num*2+1), cur_tmicrolist(0:mo_tot_num*2+1) integer(bit_kind) :: key_mask_neg(Nint,2), mobileMask(Nint,2) integer :: mo_tot_num_2 logical,intent(out) :: isinwf(mo_tot_num*2, mo_tot_num*2) double precision, intent(out) :: d0s(mo_tot_num, mo_tot_num, N_states) double precision :: integ(mo_tot_num, mo_tot_num) + + allocate(list(4,2,N_minilist), n_element(2,N_minilist), idx(0:N_minilist)) + isinwf = .false. integ = 0d0 d0s = 0d0 mo_tot_num_2 = mo_tot_num+mo_tot_num - + idx(0) = 0 do i=1,Nint key_mask_neg(i,1) = not(key_mask(i,1)) key_mask_neg(i,2) = not(key_mask(i,2)) end do - + do i=0,mo_tot_num_2 N_microlist(i) = 0 N_tmicrolist(i) = 0 enddo - + do i=1, N_minilist nt = 0 do j=1,Nint @@ -1000,44 +918,24 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl mobileMask(j,2) = iand(key_mask_neg(j,2), minilist(j,2,i)) nt += popcnt(mobileMask(j, 1)) + popcnt(mobileMask(j, 2)) end do - + if(nt > 4) cycle !! TOO MANY DIFFERENCES - idx(0) += 1 idx(idx(0)) = i - + call bitstring_to_list(mobileMask(1,1), list(1,1,idx(0)), n_element(1, idx(0)), Nint) call bitstring_to_list(mobileMask(1,2), list(1,2,idx(0)), n_element(2, idx(0)), Nint) - - - if(nt <= 2) then - if(i > i_cur) then - N_microlist = 0 + + + if(nt == 2) then + if(i < i_cur) then + N_microlist(:) = 0 ptr_microlist = 1 - N_tmicrolist = 0 + N_tmicrolist = 0 ptr_tmicrolist = 1 - return + return else - !n_element(:, idx(0)) = (/2, 0/) N_microlist(0) = N_microlist(0) + 1 - - if(n_element(1,idx(0)) >= 1) nt = list(1,1,idx(0)) - if(n_element(1,idx(0)) == 2) nt2 = list(2,1,idx(0)) - if(n_element(2,idx(0)) == 2) nt = list(2,2,idx(0)) + mo_tot_num - if(n_element(2,idx(0)) >= 1) nt2 = list(1,2,idx(0)) + mo_tot_num - - isinwf(nt, nt2) = .true. - isinwf(nt2, nt) = .true. - double precision, external :: get_mo_bielec_integral - nt = mod(nt, mo_tot_num) - nt2 = mod(nt2, mo_tot_num) - ! call get_mo_bielec_integrals_ij(nt, nt2 ,mo_tot_num,integ,mo_integrals_map) - -! do j=1, N_states -! call i_h_j -! d0s(:,:,j) += integ(:,:) * psi_selectors_coef(i,j) !!!!!!!!!!!!!!!!!!! MOOOOOCHE !!!!! suppose que minilist = psi_selectors ..... -! end do -! print *, "TO ", integ(mod(nt, mo_tot_num), mod(nt2, mo_tot_num)) endif else do s=1,2 @@ -1049,7 +947,7 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl end do endif end do - + ptr_microlist(0) = 1 ptr_tmicrolist(0) = 1 do i=1,mo_tot_num_2+1 @@ -1061,10 +959,9 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl cur_microlist(i) = ptr_microlist(i) cur_tmicrolist(i) = ptr_tmicrolist(i) end do - - + + do i=1, idx(0) - if(n_element(1, i) + n_element(2, i) > 4) stop "wired" if(n_element(1, i) + n_element(2, i) <= 2) then idx_microlist(cur_microlist(0)) = idx(i) do k=1,Nint @@ -1072,11 +969,31 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl microlist(k,2,cur_microlist(0)) = minilist(k,2,idx(i)) enddo cur_microlist(0) = cur_microlist(0) + 1 + + if(n_element(1,i) >= 1) nt = list(1,1,i) + if(n_element(1,i) == 2) nt2 = list(2,1,i) + if(n_element(2,i) == 2) nt = list(2,2,i) + mo_tot_num + if(n_element(2,i) >= 1) nt2 = list(1,2,i) + mo_tot_num + + isinwf(nt, nt2) = .true. + isinwf(nt2, nt) = .true. + !!!! INTEGRAL DRIVEN + !!!!!!!!!!!!!!!!!!!! +! call get_d0(minilist(1,1,idx(i)), integ, key_mask, 1+(nt2-1)/mo_tot_num, 1+(nt-1)/mo_tot_num, & +! mod(nt2-1, mo_tot_num)+1, mod(nt-1, mo_tot_num)+1) +! +! do j=1, N_states +! do nt=1, mo_tot_num +! do nt2=1, mo_tot_num +! d0s(nt,nt2,j) = d0s(nt,nt2,j) + (integ(nt,nt2) * psi_selectors_coef(idx(i), j)) !!! SUPPOSE MINILIST = SELECTORS !!!! +! end do +! end do +! end do else do s = 1, 2 do j=1,n_element(s,i) nt = list(j,s,i) + mo_tot_num * (s-1) - + if(n_element(1,i) + n_element(2,i) == 4) then idx_microlist(cur_microlist(nt)) = idx(i) do k=1,Nint @@ -1102,15 +1019,15 @@ end subroutine subroutine check_past(det, list, idx, N, cur, ok, Nint) implicit none use bitmasks - + integer(bit_kind), intent(in) :: det(Nint, 2), list(Nint, 2, N) integer, intent(in) :: Nint, idx(N), N, cur logical, intent(out) :: ok integer :: i,s,ni - + ok = .false. - do i=N,1,-1 - if(idx(i) <= cur) exit + do i=1,N + if(idx(i) >= cur) exit s = 0 do ni=1,Nint s += popcnt(xor(det(ni,1), list(ni,1,i))) + popcnt(xor(det(ni,2), list(ni,2,i))) @@ -1123,15 +1040,15 @@ subroutine check_past(det, list, idx, N, cur, ok, Nint) end subroutine -subroutine check_futur(det, list, N, ok, Nint) +subroutine check_past_s(det, list, N, ok, Nint) implicit none use bitmasks - + integer(bit_kind), intent(in) :: det(Nint, 2), list(Nint, 2, N) integer, intent(in) :: Nint, N logical, intent(out) :: ok integer :: i,s,ni - + ok = .false. do i=1,N s = 0 @@ -1145,3 +1062,204 @@ subroutine check_futur(det, list, N, ok, Nint) end do end subroutine + +subroutine get_d0(gen, mat, mask, s1, s2, h1, h2) + use bitmasks + implicit none + + double precision, intent(out) :: mat(mo_tot_num, mo_tot_num) + double precision :: mat_mwen(mo_tot_num, mo_tot_num) + integer, intent(in) :: h1, h2, s1, s2 + integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2) + integer(bit_kind) :: det1(N_int, 2), det2(N_int, 2) + logical :: ok, mono + double precision :: phase, phase2, inv + integer :: p1, p2, hmi, hma + logical, external :: detEq + integer :: exc(0:2, 2, 2), exc2(0:2,2,2) + + exc = 0 + call get_mo_bielec_integrals_ij(h1, h2 ,mo_tot_num,mat_mwen,mo_integrals_map) + mat = 0d0 + if(s1 == s2) then + hmi = min(h1, h2) + hma = max(h1, h2) + inv = 1d0 + if(h1 > h2) inv = -1d0 + exc(0, :, s1) = 2 + exc(1, 1, s1) = hmi + exc(2, 1, s1) = hma + do p1=1,mo_tot_num + do p2=1,mo_tot_num + if(p1 == p2) cycle + call apply_particle(mask, (/s1,p1,s2,p2/), det2, ok, N_int) + if(.not. ok) cycle + mono = (hmi == p1 .or. hma == p2 .or. hmi == p2 .or. hma == p1) + if(mono) then + call i_h_j(gen, det2, N_int, mat(p1, p2)) + !mat(p1, p2) = phase + else + exc(1, 2, s1) = min(p1, p2) + exc(2, 2, s2) = max(p2, p1) + call get_double_excitation_phase(gen, det2, exc, phase, N_int) + mat(p1, p2) = inv * (mat_mwen(p1, p2) - mat_mwen(p2, p1)) * phase + end if + end do + end do + else + exc(0, :, 1) = 1 + exc(0, :, 2) = 1 + if(s1 /= 2) stop "alpha beta inversified" + exc(1, 1, 1) = h2 + exc(1, 1, 2) = h1 + + do p1=1, mo_tot_num + do p2=1, mo_tot_num + call apply_particle(mask, (/s1,p1,s2,p2/), det2, ok, N_int) + if(.not. ok) cycle + mono = (h1 == p1 .or. h2 == p2) + if(mono) then + call i_h_j(gen, det2, N_int, phase) + mat(p1, p2) = phase + else + exc(1, 2, s1) = p1 + exc(1, 2, s2) = p2 + call get_double_excitation_phase(gen, det2, exc, phase, N_int) + mat(p1, p2) = mat_mwen(p1, p2) * phase + end if + end do + end do + end if +end subroutine + + +subroutine apply_particle(det, exc, res, ok, Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer, intent(in) :: exc(4) + integer :: s1, s2, p1, p2 + integer(bit_kind),intent(in) :: det(Nint, 2) + integer(bit_kind),intent(out) :: res(Nint, 2) + logical, intent(out) :: ok + integer :: ii, pos + + ok = .false. + s1 = exc(1) + p1 = exc(2) + s2 = exc(3) + p2 = exc(4) + res = det + + if(p1 /= 0) then + ii = (p1-1)/bit_kind_size + 1 + pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s1) = ibset(res(ii, s1), pos) + end if + + ii = (p2-1)/bit_kind_size + 1 + pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s2) = ibset(res(ii, s2), pos) + + ok = .true. +end subroutine + + +subroutine get_double_excitation_phase(det1,det2,exc,phase,Nint) + use bitmasks + implicit none + BEGIN_DOC + ! Returns the two excitation operators between two doubly excited determinants and the phase + END_DOC + integer, intent(in) :: Nint + integer(bit_kind), intent(in) :: det1(Nint,2) + integer(bit_kind), intent(in) :: det2(Nint,2) + integer, intent(in) :: exc(0:2,2,2) + double precision, intent(out) :: phase + integer :: tz + integer :: l, ispin, idx_hole, idx_particle, ishift + integer :: nperm + integer :: i,j,k,m,n + integer :: high, low + integer :: a,b,c,d + integer(bit_kind) :: hole, particle, tmp + double precision, parameter :: phase_dble(0:1) = (/ 1.d0, -1.d0 /) + + ASSERT (Nint > 0) + nperm = 0 + do ispin = 1,2 + select case (exc(0,1,ispin)) + case(0) + cycle + + case(1) + low = min(exc(1,1,ispin), exc(1,2,ispin)) + high = max(exc(1,1,ispin), exc(1,2,ispin)) + + ASSERT (low > 0) + j = ishft(low-1,-bit_kind_shift)+1 ! Find integer in array(Nint) + n = iand(low-1,bit_kind_size-1)+1 ! mod(low,bit_kind_size) + ASSERT (high > 0) + k = ishft(high-1,-bit_kind_shift)+1 + m = iand(high-1,bit_kind_size-1)+1 + + if (j==k) then + nperm = nperm + popcnt(iand(det1(j,ispin), & + iand( ibset(0_bit_kind,m-1)-1_bit_kind, & + ibclr(-1_bit_kind,n)+1_bit_kind ) )) + else + nperm = nperm + popcnt(iand(det1(k,ispin), & + ibset(0_bit_kind,m-1)-1_bit_kind)) + if (n < bit_kind_size) then + nperm = nperm + popcnt(iand(det1(j,ispin), ibclr(-1_bit_kind,n) +1_bit_kind)) + endif + do i=j+1,k-1 + nperm = nperm + popcnt(det1(i,ispin)) + end do + endif + + case (2) + + do i=1,2 + low = min(exc(i,1,ispin), exc(i,2,ispin)) + high = max(exc(i,1,ispin), exc(i,2,ispin)) + + ASSERT (low > 0) + j = ishft(low-1,-bit_kind_shift)+1 ! Find integer in array(Nint) + n = iand(low-1,bit_kind_size-1)+1 ! mod(low,bit_kind_size) + ASSERT (high > 0) + k = ishft(high-1,-bit_kind_shift)+1 + m = iand(high-1,bit_kind_size-1)+1 + + if (j==k) then + nperm = nperm + popcnt(iand(det1(j,ispin), & + iand( ibset(0_bit_kind,m-1)-1_bit_kind, & + ibclr(-1_bit_kind,n)+1_bit_kind ) )) + else + nperm = nperm + popcnt(iand(det1(k,ispin), & + ibset(0_bit_kind,m-1)-1_bit_kind)) + if (n < bit_kind_size) then + nperm = nperm + popcnt(iand(det1(j,ispin), ibclr(-1_bit_kind,n) +1_bit_kind)) + endif + do l=j+1,k-1 + nperm = nperm + popcnt(det1(l,ispin)) + end do + endif + + enddo + + a = min(exc(1,1,ispin), exc(1,2,ispin)) + b = max(exc(1,1,ispin), exc(1,2,ispin)) + c = min(exc(2,1,ispin), exc(2,2,ispin)) + d = max(exc(2,1,ispin), exc(2,2,ispin)) + if (c>a .and. cb) then + nperm = nperm + 1 + endif + exit + end select + + enddo + phase = phase_dble(iand(nperm,1)) +end From 993517cef0f8941683ca89678ac2967d486d72cb Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 25 Jul 2016 17:12:26 +0200 Subject: [PATCH 063/216] simple N^4 integral map - integral driven d0 --- plugins/Full_CI_ZMQ/selection.irp.f | 234 +++++++++++++++++----------- 1 file changed, 141 insertions(+), 93 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index d0c7cbba..8015d484 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -1,5 +1,18 @@ +BEGIN_PROVIDER [ double precision, integral8, (mo_tot_num, mo_tot_num, mo_tot_num, mo_tot_num) ] + integral8 = 0d0 + integer :: h1, h2 + print *, "provide int" + do h1=1, mo_tot_num + do h2=1, mo_tot_num + call get_mo_bielec_integrals_ij(h1, h2 ,mo_tot_num,integral8(1,1,h1,h2),mo_integrals_map) + end do + end do + print *, "end provide int" +END_PROVIDER + + subroutine selection_slave(thread,iproc) use f77_zmq use selection_types @@ -611,11 +624,13 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call check_past_s(exc_det, microlist(1,1,ptr_microlist(sporb)), N_microlist(sporb) - N_futur_microlist(sporb), nok, N_int) if(nok) cycle !DET DRIVEN - if(N_futur_microlist(0) > 0) then - call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(0)),psi_coef_microlist(ptr_futur_microlist(0), 1),N_int,N_futur_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) - end if +! if(N_futur_microlist(0) > 0) then +! call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(0)),psi_coef_microlist(ptr_futur_microlist(0), 1),N_int,N_futur_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) +! end if !INTEGRAL DRIVEN -! i_H_psi_value = d0s(mod(p1-1, mo_tot_num)+1, mod(p2-1, mo_tot_num)+1, :) + do j=1, N_states + i_H_psi_value(j) = d0s(mod(p1-1, mo_tot_num)+1, mod(p2-1, mo_tot_num)+1, j) + end do if(N_futur_microlist(sporb) > 0) then @@ -888,10 +903,13 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl integer, allocatable :: n_element(:,:), idx(:), list(:,:,:) integer :: cur_microlist(0:mo_tot_num*2+1), cur_tmicrolist(0:mo_tot_num*2+1) integer(bit_kind) :: key_mask_neg(Nint,2), mobileMask(Nint,2) - integer :: mo_tot_num_2 + integer :: mo_tot_num_2, pwen(4), pweni logical,intent(out) :: isinwf(mo_tot_num*2, mo_tot_num*2) double precision, intent(out) :: d0s(mo_tot_num, mo_tot_num, N_states) double precision :: integ(mo_tot_num, mo_tot_num) + logical :: banned(mo_tot_num*2), banned_pair(mo_tot_num*2, mo_tot_num*2) + banned = .false. + banned_pair = .false. allocate(list(4,2,N_minilist), n_element(2,N_minilist), idx(0:N_minilist)) @@ -961,6 +979,44 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl end do + do i=1, idx(0) + if(n_element(1, i) + n_element(2, i) == 2) cycle + pweni = 0 + do s = 1, 2 + do j=1,n_element(s,i) + nt = list(j,s,i) + mo_tot_num * (s-1) + if(n_element(1,i) + n_element(2,i) == 4) then + pweni += 1 + pwen(pweni) = nt + + idx_microlist(cur_microlist(nt)) = idx(i) + do k=1,Nint + microlist(k,1,cur_microlist(nt)) = minilist(k,1,idx(i)) + microlist(k,2,cur_microlist(nt)) = minilist(k,2,idx(i)) + enddo + cur_microlist(nt) = cur_microlist(nt) + 1 + else + if(idx(i) < i_cur) banned(nt) = .true. + idx_tmicrolist(cur_tmicrolist(nt)) = idx(i) + do k=1,Nint + tmicrolist(k,1,cur_tmicrolist(nt)) = minilist(k,1,idx(i)) + tmicrolist(k,2,cur_tmicrolist(nt)) = minilist(k,2,idx(i)) + enddo + cur_tmicrolist(nt) = cur_tmicrolist(nt) + 1 + endif + end do + end do + if(idx(i) < i_cur .and. pweni == 4) then + do j=1,4 + do k=j+1,4 + banned_pair(pwen(j), pwen(k)) = .true. + banned_pair(pwen(k), pwen(j)) = .true. + end do + end do + end if + end do + + do i=1, idx(0) if(n_element(1, i) + n_element(2, i) <= 2) then idx_microlist(cur_microlist(0)) = idx(i) @@ -978,108 +1034,47 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl isinwf(nt, nt2) = .true. isinwf(nt2, nt) = .true. !!!! INTEGRAL DRIVEN - !!!!!!!!!!!!!!!!!!!! -! call get_d0(minilist(1,1,idx(i)), integ, key_mask, 1+(nt2-1)/mo_tot_num, 1+(nt-1)/mo_tot_num, & -! mod(nt2-1, mo_tot_num)+1, mod(nt-1, mo_tot_num)+1) -! -! do j=1, N_states -! do nt=1, mo_tot_num -! do nt2=1, mo_tot_num -! d0s(nt,nt2,j) = d0s(nt,nt2,j) + (integ(nt,nt2) * psi_selectors_coef(idx(i), j)) !!! SUPPOSE MINILIST = SELECTORS !!!! -! end do -! end do -! end do - else - do s = 1, 2 - do j=1,n_element(s,i) - nt = list(j,s,i) + mo_tot_num * (s-1) +! !!!!!!!!!!!!!!!!!!!! + call get_d0(minilist(1,1,idx(i)), banned, banned_pair, integ, key_mask, 1+(nt2-1)/mo_tot_num, 1+(nt-1)/mo_tot_num, & + mod(nt2-1, mo_tot_num)+1, mod(nt-1, mo_tot_num)+1) - if(n_element(1,i) + n_element(2,i) == 4) then - idx_microlist(cur_microlist(nt)) = idx(i) - do k=1,Nint - microlist(k,1,cur_microlist(nt)) = minilist(k,1,idx(i)) - microlist(k,2,cur_microlist(nt)) = minilist(k,2,idx(i)) - enddo - cur_microlist(nt) = cur_microlist(nt) + 1 - else - idx_tmicrolist(cur_tmicrolist(nt)) = idx(i) - do k=1,Nint - tmicrolist(k,1,cur_tmicrolist(nt)) = minilist(k,1,idx(i)) - tmicrolist(k,2,cur_tmicrolist(nt)) = minilist(k,2,idx(i)) - enddo - cur_tmicrolist(nt) = cur_tmicrolist(nt) + 1 - endif - end do + do j=1, N_states + do nt2=1, mo_tot_num + do nt=1, mo_tot_num + d0s(nt,nt2,j) = d0s(nt,nt2,j) + (integ(nt,nt2) * psi_selectors_coef(idx(i), j)) !!! SUPPOSE MINILIST = SELECTORS !!!! + end do + end do end do end if end do + + end subroutine -subroutine check_past(det, list, idx, N, cur, ok, Nint) - implicit none - use bitmasks - - integer(bit_kind), intent(in) :: det(Nint, 2), list(Nint, 2, N) - integer, intent(in) :: Nint, idx(N), N, cur - logical, intent(out) :: ok - integer :: i,s,ni - - ok = .false. - do i=1,N - if(idx(i) >= cur) exit - s = 0 - do ni=1,Nint - s += popcnt(xor(det(ni,1), list(ni,1,i))) + popcnt(xor(det(ni,2), list(ni,2,i))) - end do - if(s <= 4) then - ok = .true. - return - end if - end do -end subroutine - - -subroutine check_past_s(det, list, N, ok, Nint) - implicit none - use bitmasks - - integer(bit_kind), intent(in) :: det(Nint, 2), list(Nint, 2, N) - integer, intent(in) :: Nint, N - logical, intent(out) :: ok - integer :: i,s,ni - - ok = .false. - do i=1,N - s = 0 - do ni=1,Nint - s += popcnt(xor(det(ni,1), list(ni,1,i))) + popcnt(xor(det(ni,2), list(ni,2,i))) - end do - if(s <= 4) then - ok = .true. - return - end if - end do -end subroutine - - -subroutine get_d0(gen, mat, mask, s1, s2, h1, h2) +subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2) use bitmasks implicit none double precision, intent(out) :: mat(mo_tot_num, mo_tot_num) + logical, intent(in) :: banned(mo_tot_num*2), banned_pair(mo_tot_num*2, mo_tot_num*2) double precision :: mat_mwen(mo_tot_num, mo_tot_num) integer, intent(in) :: h1, h2, s1, s2 integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2) integer(bit_kind) :: det1(N_int, 2), det2(N_int, 2) logical :: ok, mono double precision :: phase, phase2, inv - integer :: p1, p2, hmi, hma + integer :: p1, p2, hmi, hma, ns1, ns2 logical, external :: detEq integer :: exc(0:2, 2, 2), exc2(0:2,2,2) exc = 0 - call get_mo_bielec_integrals_ij(h1, h2 ,mo_tot_num,mat_mwen,mo_integrals_map) +! mat_mwen = integral8(:,:,h1,h2) + !call get_mo_bielec_integrals_ij(h1, h2 ,mo_tot_num,mat_mwen,mo_integrals_map) + + ns1 = mo_tot_num*(s1-1) + ns2 = mo_tot_num*(s2-1) + mat = 0d0 if(s1 == s2) then hmi = min(h1, h2) @@ -1089,20 +1084,22 @@ subroutine get_d0(gen, mat, mask, s1, s2, h1, h2) exc(0, :, s1) = 2 exc(1, 1, s1) = hmi exc(2, 1, s1) = hma - do p1=1,mo_tot_num do p2=1,mo_tot_num + if(banned(p2 + ns2)) cycle + do p1=1,mo_tot_num + if(banned(p1 + ns1)) cycle if(p1 == p2) cycle + if(banned_pair(p1 + ns1, p2 + ns2)) cycle call apply_particle(mask, (/s1,p1,s2,p2/), det2, ok, N_int) if(.not. ok) cycle mono = (hmi == p1 .or. hma == p2 .or. hmi == p2 .or. hma == p1) if(mono) then call i_h_j(gen, det2, N_int, mat(p1, p2)) - !mat(p1, p2) = phase else exc(1, 2, s1) = min(p1, p2) exc(2, 2, s2) = max(p2, p1) call get_double_excitation_phase(gen, det2, exc, phase, N_int) - mat(p1, p2) = inv * (mat_mwen(p1, p2) - mat_mwen(p2, p1)) * phase + mat(p1, p2) = inv * (integral8(p1, p2, h1, h2) - integral8(p2, p1, h1, h2)) * phase end if end do end do @@ -1113,19 +1110,21 @@ subroutine get_d0(gen, mat, mask, s1, s2, h1, h2) exc(1, 1, 1) = h2 exc(1, 1, 2) = h1 - do p1=1, mo_tot_num do p2=1, mo_tot_num + if(banned(p2 + ns2)) cycle + do p1=1, mo_tot_num + if(banned(p1 + ns1)) cycle + if(banned_pair(p1 + ns1, p2 + ns2)) cycle call apply_particle(mask, (/s1,p1,s2,p2/), det2, ok, N_int) if(.not. ok) cycle mono = (h1 == p1 .or. h2 == p2) if(mono) then - call i_h_j(gen, det2, N_int, phase) - mat(p1, p2) = phase + call i_h_j(gen, det2, N_int, mat(p1, p2)) else exc(1, 2, s1) = p1 exc(1, 2, s2) = p2 call get_double_excitation_phase(gen, det2, exc, phase, N_int) - mat(p1, p2) = mat_mwen(p1, p2) * phase + mat(p1, p2) = integral8(p1, p2, h1, h2) * phase end if end do end do @@ -1263,3 +1262,52 @@ subroutine get_double_excitation_phase(det1,det2,exc,phase,Nint) enddo phase = phase_dble(iand(nperm,1)) end + + + +subroutine check_past(det, list, idx, N, cur, ok, Nint) + implicit none + use bitmasks + + integer(bit_kind), intent(in) :: det(Nint, 2), list(Nint, 2, N) + integer, intent(in) :: Nint, idx(N), N, cur + logical, intent(out) :: ok + integer :: i,s,ni + + ok = .false. + do i=1,N + if(idx(i) >= cur) exit + s = 0 + do ni=1,Nint + s += popcnt(xor(det(ni,1), list(ni,1,i))) + popcnt(xor(det(ni,2), list(ni,2,i))) + end do + if(s <= 4) then + ok = .true. + return + end if + end do +end subroutine + + +subroutine check_past_s(det, list, N, ok, Nint) + implicit none + use bitmasks + + integer(bit_kind), intent(in) :: det(Nint, 2), list(Nint, 2, N) + integer, intent(in) :: Nint, N + logical, intent(out) :: ok + integer :: i,s,ni + + ok = .false. + do i=1,N + s = 0 + do ni=1,Nint + s += popcnt(xor(det(ni,1), list(ni,1,i))) + popcnt(xor(det(ni,2), list(ni,2,i))) + end do + if(s <= 4) then + ok = .true. + return + end if + end do +end subroutine + From 91e412c78332a25810a8f9209a7b428693310b77 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 25 Jul 2016 21:00:27 +0200 Subject: [PATCH 064/216] Optim pseudos --- src/Integrals_Monoelec/pseudopot.f90 | 34 +++++++++++----------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/src/Integrals_Monoelec/pseudopot.f90 b/src/Integrals_Monoelec/pseudopot.f90 index 32402c74..072ddbc9 100644 --- a/src/Integrals_Monoelec/pseudopot.f90 +++ b/src/Integrals_Monoelec/pseudopot.f90 @@ -109,9 +109,10 @@ end DIMENSION PM(0:100,0:100) MM=100 pi=dacos(-1.d0) + fourpi=4.d0*pi iabs_m=iabs(m) if(iabs_m.gt.l)stop 'm must be between -l and l' - factor= dsqrt( ((2*l+1)*fact(l-iabs_m))/(4.d0*pi*fact(l+iabs_m)) ) + factor= dsqrt( ((l+l+1)*fact(l-iabs_m))/(fourpi*fact(l+iabs_m)) ) if(dabs(x).gt.1.d0)then print*,'pb. in ylm_no' print*,'x=',x @@ -124,7 +125,6 @@ end if(m.eq.0)ylm_real=coef if(m.lt.0)ylm_real=dsqrt(2.d0)*coef*dsin(iabs_m*phi) - fourpi=4.d0*dacos(-1.d0) if(l.eq.0)ylm_real=dsqrt(1.d0/fourpi) xchap=dsqrt(1.d0-x**2)*dcos(phi) @@ -134,9 +134,9 @@ end if(l.eq.1.and.m.eq.0)ylm_real=dsqrt(3.d0/fourpi)*zchap if(l.eq.1.and.m.eq.-1)ylm_real=dsqrt(3.d0/fourpi)*ychap - if(l.eq.2.and.m.eq.2)ylm_real=dsqrt(15.d0/16.d0/pi)*(xchap**2-ychap**2) + if(l.eq.2.and.m.eq.2)ylm_real=dsqrt(15.d0/16.d0/pi)*(xchap*xchap-ychap*ychap) if(l.eq.2.and.m.eq.1)ylm_real=dsqrt(15.d0/fourpi)*xchap*zchap - if(l.eq.2.and.m.eq.0)ylm_real=dsqrt(5.d0/16.d0/pi)*(-xchap**2-ychap**2+2.d0*zchap**2) + if(l.eq.2.and.m.eq.0)ylm_real=dsqrt(5.d0/16.d0/pi)*(-xchap*xchap-ychap*ychap+2.d0*zchap*zchap) if(l.eq.2.and.m.eq.-1)ylm_real=dsqrt(15.d0/fourpi)*ychap*zchap if(l.eq.2.and.m.eq.-2)ylm_real=dsqrt(15.d0/fourpi)*xchap*ychap @@ -313,7 +313,7 @@ else if(ac.ne.0.d0.and.bc.ne.0.d0)then ! I n i t ! !=!=!=!=!=! - f=fourpi**2 + f=fourpi*fourpi theta_AC0=dacos( (a(3)-c(3))/ac ) phi_AC0=datan2((a(2)-c(2))/ac,(a(1)-c(1))/ac) @@ -1775,15 +1775,6 @@ double precision function binom_gen(alpha,n) enddo end - double precision FUNCTION ERF(X) - implicit double precision(a-h,o-z) - IF(X.LT.0.d0)THEN - ERF=-GAMMP(.5d0,X**2) - ELSE - ERF=GAMMP(.5d0,X**2) - ENDIF - RETURN - END double precision function coef_nk(n,k) implicit none @@ -1791,7 +1782,7 @@ double precision function coef_nk(n,k) double precision gam,dble_fact,fact - gam=dble_fact(2*(n+k)+1) + gam=dble_fact(n+n+k+k+1) ! coef_nk=1.d0/(dble(ISHFT(1,k))*fact(k)*gam) @@ -1862,7 +1853,7 @@ double precision function int_prod_bessel(l,gam,n,m,a,b,arg) term_rap = term_a / (2.d0*gam)**expo s_0_0=term_rap*a**(n)*b**(m) - if(mod(nlm,2).eq.0)s_0_0=s_0_0*dsqrt(pi/2.d0) + if(mod(nlm,2).eq.0)s_0_0=s_0_0*dsqrt(pi*.5d0) ! Initialise the first recurence terme for the q loop s_q_0 = s_0_0 @@ -1887,7 +1878,7 @@ double precision function int_prod_bessel(l,gam,n,m,a,b,arg) two_qkmp1 = two_qkmp1-2.d0 qk = qk-1.d0 enddo - inverses(q) = a_over_b_square/(dble(2*(q+n)+3) * dble(q+1)) + inverses(q) = a_over_b_square/(dble(q+n+q+n+3) * dble(q+1)) ! do k=0,q ! sum=sum+s_q_k ! s_q_k = a_over_b_square * ( dble(2*(q-k+m)+1)*dble(q-k)/(dble(2*(k+n)+3) * dble(k+1)) ) * s_q_k @@ -1900,9 +1891,10 @@ double precision function int_prod_bessel(l,gam,n,m,a,b,arg) else !Compute the s_q+1_0 - s_q_0=s_q_0*(2.d0*q+nlm+1)*b**2/((2.d0*(m+q)+3)*4.d0*(q+1)*gam) +! s_q_0=s_q_0*(2.d0*q+nlm+1)*b**2/((2.d0*(m+q)+3)*4.d0*(q+1)*gam) + s_q_0=s_q_0*(2.d0*q+nlm+1)*b*b/((8.d0*(m+q)+12.d0)*(q+1)*gam) - if(mod(n+m+l,2).eq.1)s_q_0=s_q_0*dsqrt(pi/2.d0) + if(mod(n+m+l,2).eq.1)s_q_0=s_q_0*dsqrt(pi*.5d0) ! Increment q q=q+1 intold=int @@ -2017,7 +2009,7 @@ double precision function int_prod_bessel_loc(l,gam,n,a) ! Int f_0 coef_nk=1.d0/dble_fact( n+n+1 ) expo=0.5d0*dfloat(n+l+1) - crochet=dble_fact(n+l-1)/(2.d0*gam)**expo + crochet=dble_fact(n+l-1)/(gam+gam)**expo if(mod(n+l,2).eq.0)crochet=crochet*dsqrt(0.5d0*pi) f_0 = coef_nk*a**n*crochet @@ -2029,7 +2021,7 @@ double precision function int_prod_bessel_loc(l,gam,n,a) int=int+f_k - f_k = f_k*(a**2*(2*(k+1)+n+l-1)) / (2*(k+1)*(2*(n+k+1)+1)*2*gam) + f_k = f_k*(a*a*dble(k+k+2+n+l-1)) / (dble((k+k+2)*(2*(n+k+1)+1)*2)*gam) if(dabs(int-intold).lt.1d-15)then done=.true. From e681b7c37d564071ada2146699aa5013655cf8ab Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 26 Jul 2016 18:29:52 +0200 Subject: [PATCH 065/216] task server with pub socket --- ocaml/TaskServer.ml | 112 +++++++++++++++-- ocaml/TaskServer.mli | 6 +- plugins/Full_CI/micro_pt2.irp.f | 2 + .../ao_bielec_integrals_in_map_slave.irp.f | 7 +- src/Integrals_Bielec/qp_ao_ints.irp.f | 13 +- src/ZMQ/utils.irp.f | 114 ++++++++++++++++-- 6 files changed, 222 insertions(+), 32 deletions(-) diff --git a/ocaml/TaskServer.ml b/ocaml/TaskServer.ml index 67d5bb07..d6d6bc51 100644 --- a/ocaml/TaskServer.ml +++ b/ocaml/TaskServer.ml @@ -2,6 +2,23 @@ open Core.Std open Qptypes +type pub_state = +| Waiting +| Running of string +| Stopped + +let pub_state_of_string = function +| "Waiting" -> Waiting +| "Stopped" -> Stopped +| s -> Running s + +let string_of_pub_state = function +| Waiting -> "Waiting" +| Stopped -> "Stopped" +| Running s -> s + + + type t = { queue : Queuing_system.t ; @@ -120,7 +137,7 @@ let stop ~port = ZMQ.Socket.close req_socket -let new_job msg program_state rep_socket = +let new_job msg program_state rep_socket pair_socket = let state = msg.Message.Newjob_msg.state @@ -143,10 +160,12 @@ let new_job msg program_state rep_socket = } in reply_ok rep_socket; + string_of_pub_state (Running (Message.State.to_string state)) + |> ZMQ.Socket.send pair_socket ; result -let end_job msg program_state rep_socket = +let end_job msg program_state rep_socket pair_socket = let failure () = reply_wrong_state rep_socket; @@ -165,7 +184,11 @@ let end_job msg program_state rep_socket = | Some state -> begin if (msg.Message.Endjob_msg.state = state) then - success state + begin + string_of_pub_state Waiting + |> ZMQ.Socket.send pair_socket ; + success state + end else failure () end @@ -355,7 +378,7 @@ let add_task msg program_state rep_socket = -let get_task msg program_state rep_socket = +let get_task msg program_state rep_socket pair_socket = let state, client_id = msg.Message.GetTask_msg.state, @@ -371,6 +394,12 @@ let get_task msg program_state rep_socket = let new_queue, task_id, task = Queuing_system.pop_task ~client_id program_state.queue in + if (Queuing_system.number_of_queued new_queue = 0) then + string_of_pub_state Waiting + |> ZMQ.Socket.send pair_socket + else + string_of_pub_state (Running (Message.State.to_string state)) + |> ZMQ.Socket.send pair_socket; let new_program_state = { program_state with @@ -512,18 +541,76 @@ let error msg program_state rep_socket = |> ZMQ.Socket.send rep_socket ; program_state +let start_pub_thread ~port = + Thread.create (fun () -> + let timeout = + 1000 + in + let pair_socket = + ZMQ.Socket.create zmq_context ZMQ.Socket.pair + and address = + "inproc://pair" + in + ZMQ.Socket.connect pair_socket address; + + let pub_socket = + ZMQ.Socket.create zmq_context ZMQ.Socket.pub + and address = + Printf.sprintf "tcp://*:%d" port + in + bind_socket ~socket_type:"PUB" ~socket:pub_socket ~address; + + let pollitem = + ZMQ.Poll.mask_of + [| (pair_socket, ZMQ.Poll.In) |] + in + + let rec run state = + let new_state = + let polling = + ZMQ.Poll.poll ~timeout pollitem + in + if (polling.(0) = Some ZMQ.Poll.In) then + ZMQ.Socket.recv ~block:false pair_socket + |> pub_state_of_string + else + state + in + ZMQ.Socket.send pub_socket @@ string_of_pub_state new_state; + match state with + | Stopped -> () + | _ -> run new_state + in + run Waiting; + ZMQ.Socket.set_linger_period pair_socket 1000 ; + ZMQ.Socket.close pair_socket; + ZMQ.Socket.set_linger_period pub_socket 1000 ; + ZMQ.Socket.close pub_socket; + ) let run ~port = + (** Bind inproc socket for changing state of pub *) + let pair_socket = + ZMQ.Socket.create zmq_context ZMQ.Socket.pair + and address = + "inproc://pair" + in + bind_socket "PAIR" pair_socket address; + + let pub_thread = + start_pub_thread ~port:(port+1) () + in + (** Bind REP socket *) let rep_socket = ZMQ.Socket.create zmq_context ZMQ.Socket.rep and address = - Printf.sprintf "tcp://%s:%d" (Lazy.force ip_address) port + Printf.sprintf "tcp://*:%d" port in - bind_socket "REP" rep_socket address; ZMQ.Socket.set_linger_period rep_socket 1_000_000; + bind_socket "REP" rep_socket address; let initial_program_state = { queue = Queuing_system.create () ; @@ -542,6 +629,9 @@ let run ~port = [| (rep_socket, ZMQ.Poll.In) |] in + let address = + Printf.sprintf "tcp://%s:%d" (Lazy.force ip_address) port + in Printf.printf "Task server running : %s\n%!" address; @@ -591,15 +681,15 @@ let run ~port = | _ , Message.Terminate _ -> terminate program_state rep_socket | _ , Message.PutPsi x -> put_psi x rest program_state rep_socket | _ , Message.GetPsi x -> get_psi x program_state rep_socket - | None , Message.Newjob x -> new_job x program_state rep_socket + | None , Message.Newjob x -> new_job x program_state rep_socket pair_socket | _ , Message.Newjob _ -> error "A job is already running" program_state rep_socket - | Some _, Message.Endjob x -> end_job x program_state rep_socket + | Some _, Message.Endjob x -> end_job x program_state rep_socket pair_socket | None , _ -> error "No job is running" program_state rep_socket | Some _, Message.Connect x -> connect x program_state rep_socket | Some _, Message.Disconnect x -> disconnect x program_state rep_socket | Some _, Message.AddTask x -> add_task x program_state rep_socket | Some _, Message.DelTask x -> del_task x program_state rep_socket - | Some _, Message.GetTask x -> get_task x program_state rep_socket + | Some _, Message.GetTask x -> get_task x program_state rep_socket pair_socket | Some _, Message.TaskDone x -> task_done x program_state rep_socket | _ , _ -> error ("Invalid message : "^(Message.to_string message)) program_state rep_socket @@ -614,6 +704,10 @@ let run ~port = end in main_loop initial_program_state true; + ZMQ.Socket.send pair_socket @@ string_of_pub_state Stopped; + Thread.join pub_thread; + + diff --git a/ocaml/TaskServer.mli b/ocaml/TaskServer.mli index f16ddaab..f923a18a 100644 --- a/ocaml/TaskServer.mli +++ b/ocaml/TaskServer.mli @@ -43,10 +43,10 @@ val stop : port:int -> unit (** {1} Server functions *) (** Create a new job *) -val new_job : Message.Newjob_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t +val new_job : Message.Newjob_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> [> `Pair] ZMQ.Socket.t -> t (** Finish a running job *) -val end_job : Message.Endjob_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t +val end_job : Message.Endjob_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> [> `Pair] ZMQ.Socket.t -> t (** Connect a client *) val connect: Message.Connect_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t @@ -64,7 +64,7 @@ val task_done: Message.TaskDone_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t val del_task: Message.DelTask_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t (** The client get a new task to execute *) -val get_task: Message.GetTask_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> t +val get_task: Message.GetTask_msg.t -> t -> [> `Req ] ZMQ.Socket.t -> [> `Pair] ZMQ.Socket.t -> t (** Terminate server *) val terminate : t -> [> `Req ] ZMQ.Socket.t -> t diff --git a/plugins/Full_CI/micro_pt2.irp.f b/plugins/Full_CI/micro_pt2.irp.f index 14cc52bf..9ce45eb5 100644 --- a/plugins/Full_CI/micro_pt2.irp.f +++ b/plugins/Full_CI/micro_pt2.irp.f @@ -28,6 +28,8 @@ subroutine run_wf zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() + ! TODO : do loop here + ! TODO : wait_state call zmq_get_psi(zmq_to_qp_run_socket, 1) call write_double(6,ci_energy,'Energy') zmq_state = 'h_apply_fci_pt2' diff --git a/src/Integrals_Bielec/ao_bielec_integrals_in_map_slave.irp.f b/src/Integrals_Bielec/ao_bielec_integrals_in_map_slave.irp.f index aa1d2420..ce4518cf 100644 --- a/src/Integrals_Bielec/ao_bielec_integrals_in_map_slave.irp.f +++ b/src/Integrals_Bielec/ao_bielec_integrals_in_map_slave.irp.f @@ -93,6 +93,8 @@ subroutine ao_bielec_integrals_in_map_slave(thread,iproc) integer(ZMQ_PTR), external :: new_zmq_push_socket integer(ZMQ_PTR) :: zmq_socket_push + character*(64) :: state + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() zmq_socket_push = new_zmq_push_socket(thread) @@ -109,18 +111,15 @@ subroutine ao_bielec_integrals_in_map_slave(thread,iproc) call push_integrals(zmq_socket_push, n_integrals, buffer_i, buffer_value, task_id) enddo - deallocate( buffer_i, buffer_value ) call disconnect_from_taskserver(zmq_to_qp_run_socket,zmq_socket_push,worker_id) + deallocate( buffer_i, buffer_value ) call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) call end_zmq_push_socket(zmq_socket_push,thread) end - - - subroutine ao_bielec_integrals_in_map_collector use map_module use f77_zmq diff --git a/src/Integrals_Bielec/qp_ao_ints.irp.f b/src/Integrals_Bielec/qp_ao_ints.irp.f index c60b4e5d..93f62a7d 100644 --- a/src/Integrals_Bielec/qp_ao_ints.irp.f +++ b/src/Integrals_Bielec/qp_ao_ints.irp.f @@ -17,10 +17,15 @@ program qp_ao_ints double precision :: integral, ao_bielec_integral integral = ao_bielec_integral(1,1,1,1) - !$OMP PARALLEL DEFAULT(PRIVATE) PRIVATE(i) - i = omp_get_thread_num() - call ao_bielec_integrals_in_map_slave_tcp(i) - !$OMP END PARALLEL + character*(64) :: state + call wait_for_state(zmq_state,state) + do while (state /= 'Stopped') + !$OMP PARALLEL DEFAULT(PRIVATE) PRIVATE(i) + i = omp_get_thread_num() + call ao_bielec_integrals_in_map_slave_tcp(i) + !$OMP END PARALLEL + call wait_for_state(zmq_state,state) + enddo print *, 'Done' end diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index 7c87a0ef..d3b76f4f 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -46,31 +46,39 @@ END_PROVIDER &BEGIN_PROVIDER [ character*(128), zmq_socket_push_tcp_address ] &BEGIN_PROVIDER [ character*(128), zmq_socket_pull_inproc_address ] &BEGIN_PROVIDER [ character*(128), zmq_socket_push_inproc_address ] +&BEGIN_PROVIDER [ character*(128), zmq_socket_sub_tcp_address ] use f77_zmq implicit none BEGIN_DOC ! Socket which pulls the results (2) END_DOC - character*(8), external :: zmq_port - zmq_socket_pull_tcp_address = 'tcp://*:'//zmq_port(1)//' ' - zmq_socket_push_tcp_address = trim(qp_run_address)//':'//zmq_port(1)//' ' - zmq_socket_pull_inproc_address = 'inproc://'//zmq_port(1)//' ' + + zmq_socket_sub_tcp_address = trim(qp_run_address)//':'//zmq_port(1)//' ' + zmq_socket_pull_tcp_address = 'tcp://*:'//zmq_port(2)//' ' + zmq_socket_push_tcp_address = trim(qp_run_address)//':'//zmq_port(2)//' ' + zmq_socket_pull_inproc_address = 'inproc://'//zmq_port(2)//' ' zmq_socket_push_inproc_address = zmq_socket_pull_inproc_address - zmq_socket_pair_inproc_address = 'inproc://'//zmq_port(2)//' ' + zmq_socket_pair_inproc_address = 'inproc://'//zmq_port(3)//' ' + + ! /!\ Don't forget to change subroutine reset_zmq_addresses END_PROVIDER subroutine reset_zmq_addresses use f77_zmq implicit none + BEGIN_DOC + ! Socket which pulls the results (2) + END_DOC character*(8), external :: zmq_port - - zmq_socket_pull_tcp_address = 'tcp://*:'//zmq_port(1)//' ' - zmq_socket_push_tcp_address = trim(qp_run_address)//':'//zmq_port(1)//' ' - zmq_socket_pull_inproc_address = 'inproc://'//zmq_port(1)//' ' + + zmq_socket_sub_tcp_address = trim(qp_run_address)//':'//zmq_port(1)//' ' + zmq_socket_pull_tcp_address = 'tcp://*:'//zmq_port(2)//' ' + zmq_socket_push_tcp_address = trim(qp_run_address)//':'//zmq_port(2)//' ' + zmq_socket_pull_inproc_address = 'inproc://'//zmq_port(2)//' ' zmq_socket_push_inproc_address = zmq_socket_pull_inproc_address - zmq_socket_pair_inproc_address = 'inproc://'//zmq_port(2)//' ' -end + zmq_socket_pair_inproc_address = 'inproc://'//zmq_port(3)//' ' +end subroutine switch_qp_run_to_master @@ -87,6 +95,7 @@ subroutine switch_qp_run_to_master stop -1 endif qp_run_address = trim(buffer) + print *, 'Switched to qp_run master : ', trim(qp_run_address) integer :: i do i=len(buffer),1,-1 @@ -96,7 +105,6 @@ subroutine switch_qp_run_to_master exit endif enddo - call reset_zmq_addresses end @@ -314,6 +322,60 @@ end +function new_zmq_sub_socket() + use f77_zmq + implicit none + BEGIN_DOC + ! Socket to read the state published by the Task server + END_DOC + integer :: rc + integer(ZMQ_PTR) :: new_zmq_sub_socket + + call omp_set_lock(zmq_lock) + if (zmq_context == 0_ZMQ_PTR) then + stop 'zmq_context is uninitialized' + endif + new_zmq_sub_socket = f77_zmq_socket(zmq_context, ZMQ_SUB) + call omp_unset_lock(zmq_lock) + if (new_zmq_sub_socket == 0_ZMQ_PTR) then + stop 'Unable to create zmq sub socket' + endif + + rc = f77_zmq_setsockopt(new_zmq_sub_socket,ZMQ_RCVTIMEO,10000,4) + if (rc /= 0) then + stop 'Unable to set timeout in new_zmq_sub_socket' + endif + + rc = f77_zmq_setsockopt(new_zmq_sub_socket,ZMQ_SUBSCRIBE,"",0) + if (rc /= 0) then + stop 'Unable to subscribe new_zmq_sub_socket' + endif + + rc = f77_zmq_connect(new_zmq_sub_socket, zmq_socket_sub_tcp_address) + if (rc /= 0) then + stop 'Unable to connect new_zmq_sub_socket' + endif +end + + +subroutine end_zmq_sub_socket(zmq_socket_sub) + use f77_zmq + implicit none + BEGIN_DOC + ! Terminate socket on which the results are sent. + END_DOC + integer(ZMQ_PTR), intent(in) :: zmq_socket_sub + integer :: rc + + rc = f77_zmq_close(zmq_socket_sub) + if (rc /= 0) then + print *, 'f77_zmq_close(zmq_socket_sub)' + stop 'error' + endif + +end + + subroutine end_zmq_pair_socket(zmq_socket_pair) use f77_zmq implicit none @@ -766,3 +828,31 @@ subroutine zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more) endif end +subroutine wait_for_state(state_wait,state) + use f77_zmq + implicit none + BEGIN_DOC +! Wait for the ZMQ state to be ready + END_DOC + character*(64), intent(in) :: state_wait + character*(64), intent(out) :: state + integer(ZMQ_PTR) :: zmq_socket_sub + integer(ZMQ_PTR), external :: new_zmq_sub_socket + integer :: rc + + zmq_socket_sub = new_zmq_sub_socket() + state = "Waiting" + do while (state /= state_wait .and. state /= "Stopped") + rc = f77_zmq_recv( zmq_socket_sub, state, 64, 0) + if (rc > 0) then + state = trim(state(1:rc)) + else + print *, 'Timeout reached. Stopping' + state = "Stopped" + endif + end do + call end_zmq_sub_socket(zmq_socket_sub) +end + + + From f1d5782aef016073afa6ef314edc31864d249ffd Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 27 Jul 2016 14:05:51 +0200 Subject: [PATCH 066/216] Little optimizations --- src/Integrals_Monoelec/pseudopot.f90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Integrals_Monoelec/pseudopot.f90 b/src/Integrals_Monoelec/pseudopot.f90 index 072ddbc9..1abf80ff 100644 --- a/src/Integrals_Monoelec/pseudopot.f90 +++ b/src/Integrals_Monoelec/pseudopot.f90 @@ -1068,7 +1068,7 @@ integer n double precision g,dble_fact,expo double precision, parameter :: sq_pi_ov_2=dsqrt(dacos(-1.d0)*0.5d0) expo=0.5d0*dfloat(n+1) -crochet=dble_fact(n-1)/(2.d0*g)**expo +crochet=dble_fact(n-1)/(g+g)**expo if(mod(n,2).eq.0)crochet=crochet*sq_pi_ov_2 end @@ -1840,8 +1840,8 @@ double precision function int_prod_bessel(l,gam,n,m,a,b,arg) int=0.d0 done=.false. - n_1 = 2*(n)+1 - m_1 = 2*m+1 + n_1 = n+n+1 + m_1 = m+m+1 nlm = n+m+l pi=dacos(-1.d0) a_over_b_square = (a/b)**2 @@ -1892,7 +1892,7 @@ double precision function int_prod_bessel(l,gam,n,m,a,b,arg) !Compute the s_q+1_0 ! s_q_0=s_q_0*(2.d0*q+nlm+1)*b**2/((2.d0*(m+q)+3)*4.d0*(q+1)*gam) - s_q_0=s_q_0*(2.d0*q+nlm+1)*b*b/((8.d0*(m+q)+12.d0)*(q+1)*gam) + s_q_0=s_q_0*(q+q+nlm+1)*b*b/(dble(8*(m+q)+12)*(q+1)*gam) if(mod(n+m+l,2).eq.1)s_q_0=s_q_0*dsqrt(pi*.5d0) ! Increment q @@ -1933,7 +1933,7 @@ double precision function int_prod_bessel_large(l,gam,n,m,a,b,arg) double precision xq(100),wq(100) u=(a+b)/(2.d0*dsqrt(gam)) - factor=dexp(u**2-arg)/dsqrt(gam) + factor=dexp(u*u-arg)/dsqrt(gam) xq(1)= 5.38748089001123 xq(2)= 4.60368244955074 From f89041a4450eb8f4837e828bc15f797d0747bc43 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 27 Jul 2016 14:50:31 +0200 Subject: [PATCH 067/216] integral driven d1 --- plugins/Full_CI_ZMQ/selection.irp.f | 331 +++++++++++++++++++++++----- 1 file changed, 276 insertions(+), 55 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 8015d484..436a6946 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -658,41 +658,42 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p i_H_psi_value = i_H_psi_value + i_H_psi_value2 end if + if(.false.) then ! DET DRIVEN + integer :: c1, c2 + double precision :: hij + c1 = ptr_futur_tmicrolist(p1) + c2 = ptr_futur_tmicrolist(p2) + do while(.true.) + if(c1 >= ptr_tmicrolist(p1+1) .or. c2 >= ptr_tmicrolist(p2+1)) then + if(ptr_tmicrolist(p1+1) /= c1) then + call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_tmicrolist(p1+1)-c1 ,psi_selectors_size*3,N_states,i_H_psi_value2) + i_H_psi_value = i_H_psi_value + i_H_psi_value2 + end if - integer :: c1, c2 - double precision :: hij - c1 = ptr_futur_tmicrolist(p1) - c2 = ptr_futur_tmicrolist(p2) - do while(.true.) - if(c1 >= ptr_tmicrolist(p1+1) .or. c2 >= ptr_tmicrolist(p2+1)) then - if(ptr_tmicrolist(p1+1) /= c1) then - call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_tmicrolist(p1+1)-c1 ,psi_selectors_size*3,N_states,i_H_psi_value2) - i_H_psi_value = i_H_psi_value + i_H_psi_value2 - end if + if(ptr_tmicrolist(p2+1) /= c2) then + call i_H_psi(exc_det,tmicrolist(1,1,c2),psi_coef_tmicrolist(c2, 1),N_int, ptr_tmicrolist(p2+1)-c2 ,psi_selectors_size*3,N_states,i_H_psi_value2) + i_H_psi_value = i_H_psi_value + i_H_psi_value2 + endif - if(ptr_tmicrolist(p2+1) /= c2) then - call i_H_psi(exc_det,tmicrolist(1,1,c2),psi_coef_tmicrolist(c2, 1),N_int, ptr_tmicrolist(p2+1)-c2 ,psi_selectors_size*3,N_states,i_H_psi_value2) - i_H_psi_value = i_H_psi_value + i_H_psi_value2 + exit endif - exit - endif - - if(idx_tmicrolist(c1) < idx_tmicrolist(c2)) then - call i_H_j(exc_det,tmicrolist(1,1,c1),N_int,hij) - do j = 1, N_states - i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c1,j)*hij - enddo - c1 += 1 - else - call i_H_j(exc_det,tmicrolist(1,1,c2),N_int,hij) - do j = 1, N_states - i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c2,j)*hij - enddo - if(idx_tmicrolist(c1) == idx_tmicrolist(c2)) c1 = c1 + 1 - c2 += 1 - end if - enddo + if(idx_tmicrolist(c1) < idx_tmicrolist(c2)) then + call i_H_j(exc_det,tmicrolist(1,1,c1),N_int,hij) + do j = 1, N_states + i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c1,j)*hij + enddo + c1 += 1 + else + call i_H_j(exc_det,tmicrolist(1,1,c2),N_int,hij) + do j = 1, N_states + i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c2,j)*hij + enddo + if(idx_tmicrolist(c1) == idx_tmicrolist(c2)) c1 = c1 + 1 + c2 += 1 + end if + enddo + end if double precision :: Hii, diag_H_mat_elem_fock Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) @@ -902,12 +903,12 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl integer :: i,j,k,s,nt,nt2 integer, allocatable :: n_element(:,:), idx(:), list(:,:,:) integer :: cur_microlist(0:mo_tot_num*2+1), cur_tmicrolist(0:mo_tot_num*2+1) - integer(bit_kind) :: key_mask_neg(Nint,2), mobileMask(Nint,2) + integer(bit_kind) :: key_mask_neg(Nint,2), mobileMask(Nint,2), tmp_det(Nint, 2) integer :: mo_tot_num_2, pwen(4), pweni logical,intent(out) :: isinwf(mo_tot_num*2, mo_tot_num*2) double precision, intent(out) :: d0s(mo_tot_num, mo_tot_num, N_states) double precision :: integ(mo_tot_num, mo_tot_num) - logical :: banned(mo_tot_num*2), banned_pair(mo_tot_num*2, mo_tot_num*2) + logical :: localbanned(mo_tot_num*2), banned(mo_tot_num*2), banned_pair(mo_tot_num*2, mo_tot_num*2), ok banned = .false. banned_pair = .false. @@ -960,7 +961,10 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl do j=1,n_element(s,idx(0)) k = list(j,s,idx(0)) + mo_tot_num * (s-1) if(nt == 4) N_microlist(k) = N_microlist(k) + 1 - if(nt == 3) N_tmicrolist(k) = N_tmicrolist(k) + 1 + if(nt == 3) then + N_tmicrolist(k) = N_tmicrolist(k) + 1 + if(idx(i) < i_cur) banned(nt) = .true. + end if end do end do endif @@ -985,10 +989,9 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl do s = 1, 2 do j=1,n_element(s,i) nt = list(j,s,i) + mo_tot_num * (s-1) + pweni += 1 + pwen(pweni) = nt if(n_element(1,i) + n_element(2,i) == 4) then - pweni += 1 - pwen(pweni) = nt - idx_microlist(cur_microlist(nt)) = idx(i) do k=1,Nint microlist(k,1,cur_microlist(nt)) = minilist(k,1,idx(i)) @@ -996,7 +999,6 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl enddo cur_microlist(nt) = cur_microlist(nt) + 1 else - if(idx(i) < i_cur) banned(nt) = .true. idx_tmicrolist(cur_tmicrolist(nt)) = idx(i) do k=1,Nint tmicrolist(k,1,cur_tmicrolist(nt)) = minilist(k,1,idx(i)) @@ -1035,16 +1037,36 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl isinwf(nt2, nt) = .true. !!!! INTEGRAL DRIVEN ! !!!!!!!!!!!!!!!!!!!! - call get_d0(minilist(1,1,idx(i)), banned, banned_pair, integ, key_mask, 1+(nt2-1)/mo_tot_num, 1+(nt-1)/mo_tot_num, & - mod(nt2-1, mo_tot_num)+1, mod(nt-1, mo_tot_num)+1) + call get_d0(minilist(1,1,idx(i)), banned, banned_pair, d0s, key_mask, 1+(nt2-1)/mo_tot_num, 1+(nt-1)/mo_tot_num, & + mod(nt2-1, mo_tot_num)+1, mod(nt-1, mo_tot_num)+1, psi_selectors_coef(idx(i), :)) - do j=1, N_states - do nt2=1, mo_tot_num - do nt=1, mo_tot_num - d0s(nt,nt2,j) = d0s(nt,nt2,j) + (integ(nt,nt2) * psi_selectors_coef(idx(i), j)) !!! SUPPOSE MINILIST = SELECTORS !!!! - end do - end do +! do j=1, N_states +! do nt2=1, mo_tot_num +! do nt=1, mo_tot_num +! d0s(nt,nt2,j) = d0s(nt,nt2,j) + (integ(nt,nt2) * psi_selectors_coef(idx(i), j)) !!! SUPPOSE MINILIST = SELECTORS !!!! +! end do +! end do +! end do + else if(.true. .and. n_element(1, i) + n_element(2, i) == 3) then ! INTEGRAL DRIVEN + ! -459.6399263191298 + pweni = 0 + do s = 1, 2 + do j=1,n_element(s,i) + nt = list(j,s,i) + mo_tot_num * (s-1) + pweni += 1 + pwen(pweni) = nt + end do end do + + call get_d1(minilist(1,1,idx(i)), banned, banned_pair, d0s, key_mask, pwen, psi_selectors_coef(idx(i), :)) + +! do k=1, N_states +! do nt2=1, mo_tot_num +! do nt=1, mo_tot_num +! d0s(nt,nt2,k) = d0s(nt,nt2,k) + (integ(nt,nt2) * psi_selectors_coef(idx(i), k)) !!! SUPPOSE MINILIST = SELECTORS !!!! +! end do +! end do +! end do end if end do @@ -1052,19 +1074,171 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl end subroutine -subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2) +subroutine get_d1(gen, banned, banned_pair, mat, mask, pwen, coefs) + use bitmasks + implicit none + + integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2) + logical, intent(in) :: banned(mo_tot_num*2), banned_pair(mo_tot_num*2, mo_tot_num*2) + integer(bit_kind) :: deth(N_int, 2), det(N_int, 2), i8 + double precision, intent(in) :: coefs(N_states) + double precision, intent(inout) :: mat(mo_tot_num, mo_tot_num, N_states) + double precision :: hij, phase, inv, inv2 + integer, intent(in) :: pwen(3) + integer :: s(3), p(3), i, j, k, h1, h2, ns(2), sm, mwen, a1, a2, pwens(2), sp, st + integer :: sfix, pfix + integer :: exc(0:2, 2, 2) + logical :: lbanned(mo_tot_num*2) + logical :: ok, mono, ab + + lbanned = banned + !mat = 0d0 + pwens = 0 + + ns = 0 + do sp=1,2 + do i=1, N_int + ns(sp) += popcnt(gen(i, sp)) - popcnt(mask(i, sp)) + i8 = iand(not(gen(i, sp)), mask(i, sp)) + if(i8 /= 0_8) then + sfix = sp + pfix = 1+trailz(i8) + bit_kind*8*(i-1) + end if + end do + end do + + + do i=1,3 + s(i) = 1+(pwen(i)-1)/mo_tot_num + p(i) = 1+mod(pwen(i)-1, mo_tot_num) + pwens(s(i)) += 1 + end do + + do i=1,3 + if(s(i) == 1 .and. ns(1) == 0) cycle + if(s(i) == 2 .and. ns(2) == 0) cycle + if(lbanned(pwen(i))) cycle + ab = pwens(s(i)) == 2 + + if(ns(1) == 1) sm = mod(s(i), 2) + 1 + if(ns(1) == 2) sm = 1 + if(ns(2) == 2) sm = 2 + + lbanned(pwen(i)) = .true. + + if(ab) then + if(s(mod(i,3)+1) == 2) then + a1 = mod(i, 3) + 1 + a2 = mod(i+1, 3) + 1 + else + a2 = mod(i,3)+1 + a1 = mod(i+1,3)+1 + end if + + exc(0, :, 1) = 1 + exc(0, :, 2) = 1 + exc(1, 1, 1) = p(a2) + exc(1, 1, 2) = p(a1) + exc(1, 2, sfix) = pfix + + call apply_particle(mask, (/0, 0 ,s(i), p(i) /), deth, ok, N_int) + + do j=1,mo_tot_num + mwen = j + (sm-1)*mo_tot_num + if(lbanned(mwen)) cycle + call apply_particle(deth, (/0,0,sm,j/), det, ok, N_int) + if(.not. ok) cycle + + mono = mwen == pwen(a1) .or. mwen == pwen(a2) + if(mono) then + call i_h_j(gen, det, N_int, hij) + else + exc(1, 2, sm) = j + call get_double_excitation_phase(gen, det, exc, phase, N_int) + if(sfix == 1) hij = integral8(j, pfix, p(a1), p(a2)) * phase + if(sfix == 2) hij = integral8(pfix, j, p(a1), p(a2)) * phase + end if + + if(ns(1) == 1) then + do st=1, N_states + if(sm == 2) mat(j, p(i), st) = mat(j, p(i), st) + hij * coefs(st) + if(sm == 1) mat(p(i), j, st) = mat(p(i), j, st) + hij * coefs(st) + end do + else + do st=1, N_states + mat(j, p(i), st) += hij * coefs(st) + mat(p(i), j, st) += hij * coefs(st) + end do + end if + end do + + else !! AA / BB + a1 = mod(i,3)+1 + a2 = mod(i+1,3)+1 + + h1 = p(a1) + h2 = p(a2) + inv = 1d0 + if(h1 > h2) inv = -1d0 + + if(pwens(s(i)) == 1) sp = mod(s(i), 2)+1 + if(pwens(s(i)) == 3) sp = s(i) + + exc(0, :, sp) = 2 + exc(0, :, mod(sp, 2)+1) = 0 + exc(1, 1, sp) = min(h1, h2) + exc(2, 1, sp) = max(h1, h2) + + call apply_particle(mask, (/0, 0 ,s(i), p(i) /), deth, ok, N_int) + + do j=1,mo_tot_num + if(j == pfix) inv = -inv + mwen = j + (sm-1)*mo_tot_num + if(lbanned(mwen)) cycle + call apply_particle(deth, (/0,0,sm,j/), det, ok, N_int) + if(.not. ok) cycle + + mono = mwen == pwen(a1) .or. mwen == pwen(a2) + if(mono) then + call i_h_j(gen, det, N_int, hij) + else + exc(1, 2, sfix) = min(j,pfix) + exc(2, 2, sp) = max(j,pfix) + call get_double_excitation_phase(gen, det, exc, phase, N_int) + hij = (integral8(j, pfix, h1, h2) - integral8(pfix,j, h1, h2))*phase*inv + end if + if(ns(1) == 1) then + do st=1, N_states + if(sm == 2) mat(j, p(i), st) = mat(j, p(i), st) + hij * coefs(st) + if(sm == 1) mat(p(i), j, st) = mat(p(i), j, st) + hij * coefs(st) + end do + else + do st=1, N_states + mat(j, p(i), st) += hij * coefs(st) + mat(p(i), j, st) += hij * coefs(st) + end do + end if + end do + end if + end do + +end subroutine + + +subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2, coefs) use bitmasks implicit none - double precision, intent(out) :: mat(mo_tot_num, mo_tot_num) + double precision, intent(inout) :: mat(mo_tot_num, mo_tot_num, N_states) logical, intent(in) :: banned(mo_tot_num*2), banned_pair(mo_tot_num*2, mo_tot_num*2) double precision :: mat_mwen(mo_tot_num, mo_tot_num) + double precision, intent(in) :: coefs(N_states) integer, intent(in) :: h1, h2, s1, s2 integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2) integer(bit_kind) :: det1(N_int, 2), det2(N_int, 2) logical :: ok, mono - double precision :: phase, phase2, inv - integer :: p1, p2, hmi, hma, ns1, ns2 + double precision :: phase, phase2, inv, hij + integer :: p1, p2, hmi, hma, ns1, ns2, st logical, external :: detEq integer :: exc(0:2, 2, 2), exc2(0:2,2,2) @@ -1075,7 +1249,7 @@ subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2) ns1 = mo_tot_num*(s1-1) ns2 = mo_tot_num*(s2-1) - mat = 0d0 + !mat = 0d0 if(s1 == s2) then hmi = min(h1, h2) hma = max(h1, h2) @@ -1094,12 +1268,18 @@ subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2) if(.not. ok) cycle mono = (hmi == p1 .or. hma == p2 .or. hmi == p2 .or. hma == p1) if(mono) then - call i_h_j(gen, det2, N_int, mat(p1, p2)) + + call i_h_j(gen, det2, N_int, hij) + do st=1, N_states + mat(p1, p2, st) += hij * coefs(st) + end do else exc(1, 2, s1) = min(p1, p2) exc(2, 2, s2) = max(p2, p1) call get_double_excitation_phase(gen, det2, exc, phase, N_int) - mat(p1, p2) = inv * (integral8(p1, p2, h1, h2) - integral8(p2, p1, h1, h2)) * phase + do st=1, N_states + mat(p1, p2, st) += coefs(st) * inv * (integral8(p1, p2, h1, h2) - integral8(p2, p1, h1, h2)) * phase + end do end if end do end do @@ -1119,12 +1299,18 @@ subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2) if(.not. ok) cycle mono = (h1 == p1 .or. h2 == p2) if(mono) then - call i_h_j(gen, det2, N_int, mat(p1, p2)) + call i_h_j(gen, det2, N_int, hij) + do st=1, N_states + mat(p1, p2, st) += hij * coefs(st) + end do else exc(1, 2, s1) = p1 exc(1, 2, s2) = p2 call get_double_excitation_phase(gen, det2, exc, phase, N_int) - mat(p1, p2) = integral8(p1, p2, h1, h2) * phase + do st=1, N_states + mat(p1, p2, st) += coefs(st) * integral8(p1, p2, h1, h2) * phase + end do + !mat(p1, p2) = integral8(p1, p2, h1, h2) * phase end if end do end do @@ -1166,6 +1352,41 @@ subroutine apply_particle(det, exc, res, ok, Nint) end subroutine +subroutine apply_hole(det, exc, res, ok, Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer, intent(in) :: exc(4) + integer :: s1, s2, p1, p2 + integer(bit_kind),intent(in) :: det(Nint, 2) + integer(bit_kind),intent(out) :: res(Nint, 2) + logical, intent(out) :: ok + integer :: ii, pos + + ok = .false. + s1 = exc(1) + p1 = exc(2) + s2 = exc(3) + p2 = exc(4) + res = det + + if(p1 /= 0) then + ii = (p1-1)/bit_kind_size + 1 + pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s1) = ibclr(res(ii, s1), pos) + end if + + ii = (p2-1)/bit_kind_size + 1 + pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s2) = ibclr(res(ii, s2), pos) + + ok = .true. +end subroutine + + + subroutine get_double_excitation_phase(det1,det2,exc,phase,Nint) use bitmasks implicit none From 09cd6ddd26183db800a47a799cfebbb324a8b095 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 27 Jul 2016 16:10:02 +0200 Subject: [PATCH 068/216] unresolved conflict --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 45 ------------------------------- 1 file changed, 45 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 3d324555..b3a89b74 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -1,4 +1,3 @@ -<<<<<<< HEAD program fci_zmq @@ -271,47 +270,3 @@ end ! end do ! ! end -======= -program Full_CI_ZMQ - use f77_zmq - implicit none - BEGIN_DOC -! Massively parallel Full-CI - END_DOC - - integer :: i,ithread - - integer(ZMQ_PTR) :: zmq_socket_push - integer(ZMQ_PTR) :: new_zmq_push_socket - zmq_context = f77_zmq_ctx_new () - - - PROVIDE nproc - !$OMP PARALLEL PRIVATE(i,ithread,zmq_socket_push) num_threads(nproc+1) - ithread = omp_get_thread_num() - if (ithread == 0) then - call receive_selected_determinants() - else - zmq_socket_push = new_zmq_push_socket() - do i=ithread,N_det_generators,nproc - print *, i , N_det_generators - !$OMP TASK DEFAULT(SHARED) - call select_connected(i, 1.d-6, ci_electronic_energy,zmq_socket_push) - !$OMP END TASK - enddo - !$OMP TASKWAIT - if (ithread == 1) then - integer :: rc - rc = f77_zmq_send(zmq_socket_push,0,1,0) - if (rc /= 1) then - stop 'Error sending termination signal' - endif - endif - call end_zmq_push_socket(zmq_socket_push) - - endif - !$OMP END PARALLEL - - -end ->>>>>>> e681b7c37d564071ada2146699aa5013655cf8ab From 42a5b96b0d393a435ad712c3f9d2e30ca8534316 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 28 Jul 2016 18:53:24 +0200 Subject: [PATCH 069/216] Added Energy to qp_run --- ocaml/Message.ml | 89 ++++++++----------------- ocaml/TaskServer.ml | 5 +- plugins/Full_CI/micro_pt2.irp.f | 17 ++++- plugins/Selectors_full/zmq.irp.f | 28 ++++++-- scripts/generate_h_apply.py | 3 +- src/Determinants/H_apply_zmq.template.f | 3 +- 6 files changed, 73 insertions(+), 72 deletions(-) diff --git a/ocaml/Message.ml b/ocaml/Message.ml index 505f9789..79eca15e 100644 --- a/ocaml/Message.ml +++ b/ocaml/Message.ml @@ -288,13 +288,14 @@ module Psi : sig n_det_selectors : Strictly_positive_int.t option; psi_det : string ; psi_coef : string ; + energy : string; } val create : n_state:Strictly_positive_int.t -> n_det:Strictly_positive_int.t -> psi_det_size:Strictly_positive_int.t -> n_det_generators:Strictly_positive_int.t option -> n_det_selectors:Strictly_positive_int.t option - -> psi_det:string -> psi_coef:string -> t + -> psi_det:string -> psi_coef:string -> energy:string -> t end = struct type t = { @@ -305,14 +306,16 @@ end = struct n_det_selectors : Strictly_positive_int.t option; psi_det : string ; psi_coef : string ; + energy : string ; } let create ~n_state ~n_det ~psi_det_size - ~n_det_generators ~n_det_selectors ~psi_det ~psi_coef = + ~n_det_generators ~n_det_selectors ~psi_det ~psi_coef + ~energy = assert (Strictly_positive_int.to_int n_det <= Strictly_positive_int.to_int psi_det_size ); { n_state; n_det ; psi_det_size ; n_det_generators ; n_det_selectors ; - psi_det ; psi_coef } + psi_det ; psi_coef ; energy } end (** GetPsiReply_msg : Reply to the GetPsi message *) @@ -329,19 +332,6 @@ end = struct psi : Psi.t } let create ~client_id ~psi = { client_id ; psi } - let to_string_list x = - let g, s = - match x.psi.Psi.n_det_generators, x.psi.Psi.n_det_selectors with - | Some g, Some s -> Strictly_positive_int.to_int g, Strictly_positive_int.to_int s - | _ -> -1, -1 - in - [ Printf.sprintf "get_psi_reply %d %d %d %d %d %d" - (Id.Client.to_int x.client_id) - (Strictly_positive_int.to_int x.psi.Psi.n_state) - (Strictly_positive_int.to_int x.psi.Psi.n_det) - (Strictly_positive_int.to_int x.psi.Psi.psi_det_size) - g s ; - x.psi.Psi.psi_det ; x.psi.Psi.psi_coef ] let to_string x = let g, s = match x.psi.Psi.n_det_generators, x.psi.Psi.n_det_selectors with @@ -354,6 +344,9 @@ end = struct (Strictly_positive_int.to_int x.psi.Psi.n_det) (Strictly_positive_int.to_int x.psi.Psi.psi_det_size) g s + let to_string_list x = + [ to_string x ; + x.psi.Psi.psi_det ; x.psi.Psi.psi_coef ; x.psi.Psi.energy ] end @@ -375,7 +368,8 @@ module PutPsi_msg : sig psi_det:string option -> psi_coef:string option -> n_det_generators: string option -> - n_det_selectors:string option -> t + n_det_selectors:string option -> + energy:string option -> t val to_string_list : t -> string list val to_string : t -> string end = struct @@ -388,7 +382,7 @@ end = struct n_det_selectors : Strictly_positive_int.t option; psi : Psi.t option } let create ~client_id ~n_state ~n_det ~psi_det_size ~psi_det ~psi_coef - ~n_det_generators ~n_det_selectors = + ~n_det_generators ~n_det_selectors ~energy = let n_state, n_det, psi_det_size = Int.of_string n_state |> Strictly_positive_int.of_int , @@ -407,45 +401,19 @@ end = struct | _ -> None, None in let psi = - match (psi_det, psi_coef) with - | (Some psi_det, Some psi_coef) -> + match (psi_det, psi_coef, energy) with + | (Some psi_det, Some psi_coef, Some energy) -> Some (Psi.create ~n_state ~n_det ~psi_det_size ~psi_det - ~psi_coef ~n_det_generators ~n_det_selectors) + ~psi_coef ~n_det_generators ~n_det_selectors ~energy) | _ -> None in { client_id = Id.Client.of_string client_id ; n_state ; n_det ; psi_det_size ; n_det_generators ; n_det_selectors ; psi } - let to_string_list x = - match x.n_det_generators, x.n_det_selectors, x.psi with - | Some g, Some s, Some psi -> - [ Printf.sprintf "put_psi %d %d %d %d %d %d" - (Id.Client.to_int x.client_id) - (Strictly_positive_int.to_int x.n_state) - (Strictly_positive_int.to_int x.n_det) - (Strictly_positive_int.to_int x.psi_det_size) - (Strictly_positive_int.to_int g) - (Strictly_positive_int.to_int s) ; - psi.Psi.psi_det ; psi.Psi.psi_coef ] - | Some g, Some s, None -> - [ Printf.sprintf "put_psi %d %d %d %d %d %d" - (Id.Client.to_int x.client_id) - (Strictly_positive_int.to_int x.n_state) - (Strictly_positive_int.to_int x.n_det) - (Strictly_positive_int.to_int x.psi_det_size) - (Strictly_positive_int.to_int g) - (Strictly_positive_int.to_int s) ; - "None" ; "None" ] - | _ -> - [ Printf.sprintf "put_psi %d %d %d %d -1 -1" - (Id.Client.to_int x.client_id) - (Strictly_positive_int.to_int x.n_state) - (Strictly_positive_int.to_int x.n_det) - (Strictly_positive_int.to_int x.psi_det_size) ; - "None" ; "None" ] + let to_string x = - match x.n_det_generators, x.n_det_selectors, x.psi with - | Some g, Some s, Some psi -> + match x.n_det_generators, x.n_det_selectors with + | Some g, Some s -> Printf.sprintf "put_psi %d %d %d %d %d %d" (Id.Client.to_int x.client_id) (Strictly_positive_int.to_int x.n_state) @@ -453,21 +421,20 @@ end = struct (Strictly_positive_int.to_int x.psi_det_size) (Strictly_positive_int.to_int g) (Strictly_positive_int.to_int s) - | Some g, Some s, None -> - Printf.sprintf "put_psi %d %d %d %d %d %d" - (Id.Client.to_int x.client_id) - (Strictly_positive_int.to_int x.n_state) - (Strictly_positive_int.to_int x.n_det) - (Strictly_positive_int.to_int x.psi_det_size) - (Strictly_positive_int.to_int g) - (Strictly_positive_int.to_int s) - | _, _, _ -> + | _, _ -> Printf.sprintf "put_psi %d %d %d %d %d %d" (Id.Client.to_int x.client_id) (Strictly_positive_int.to_int x.n_state) (Strictly_positive_int.to_int x.n_det) (Strictly_positive_int.to_int x.psi_det_size) (-1) (-1) + + let to_string_list x = + match x.psi with + | Some psi -> + [ to_string x ; psi.Psi.psi_det ; psi.Psi.psi_coef ; psi.Psi.energy ] + | None -> + [ to_string x ; "None" ; "None" ; "None" ] end (** PutPsiReply_msg : Reply to the PutPsi message *) @@ -606,10 +573,10 @@ let of_string s = | "put_psi" :: client_id :: n_state :: n_det :: psi_det_size :: n_det_generators :: n_det_selectors :: [] -> PutPsi (PutPsi_msg.create ~client_id ~n_state ~n_det ~psi_det_size ~n_det_generators:(Some n_det_generators) ~n_det_selectors:(Some n_det_selectors) - ~psi_det:None ~psi_coef:None ) + ~psi_det:None ~psi_coef:None ~energy:None ) | "put_psi" :: client_id :: n_state :: n_det :: psi_det_size :: [] -> PutPsi (PutPsi_msg.create ~client_id ~n_state ~n_det ~psi_det_size ~n_det_generators:None - ~n_det_selectors:None ~psi_det:None ~psi_coef:None ) + ~n_det_selectors:None ~psi_det:None ~psi_coef:None ~energy:None) | "ok" :: [] -> Ok (Ok_msg.create ()) | "error" :: rest -> diff --git a/ocaml/TaskServer.ml b/ocaml/TaskServer.ml index d6d6bc51..6cd77fd0 100644 --- a/ocaml/TaskServer.ml +++ b/ocaml/TaskServer.ml @@ -483,9 +483,9 @@ let put_psi msg rest_of_msg program_state rep_socket = | Some x -> x | None -> begin - let psi_det, psi_coef = + let psi_det, psi_coef, energy = match rest_of_msg with - | [ x ; y ] -> x, y + | [ x ; y ; e ] -> x, y, e | _ -> failwith "Badly formed put_psi message" in Message.Psi.create @@ -496,6 +496,7 @@ let put_psi msg rest_of_msg program_state rep_socket = ~n_det_selectors:msg.Message.PutPsi_msg.n_det_selectors ~psi_det ~psi_coef + ~energy end in let new_program_state = diff --git a/plugins/Full_CI/micro_pt2.irp.f b/plugins/Full_CI/micro_pt2.irp.f index 9ce45eb5..25e74b28 100644 --- a/plugins/Full_CI/micro_pt2.irp.f +++ b/plugins/Full_CI/micro_pt2.irp.f @@ -22,6 +22,7 @@ subroutine run_wf integer(ZMQ_PTR), external :: new_zmq_to_qp_run_socket integer(ZMQ_PTR) :: zmq_to_qp_run_socket + double precision :: energy(N_states_diag) print *, 'Getting wave function' zmq_context = f77_zmq_ctx_new () @@ -30,7 +31,21 @@ subroutine run_wf ! TODO : do loop here ! TODO : wait_state - call zmq_get_psi(zmq_to_qp_run_socket, 1) + call zmq_get_psi(zmq_to_qp_run_socket,1,energy,size(energy)) + integer :: j,k + do j=1,N_states_diag + do k=1,N_det + CI_eigenvectors(k,j) = psi_coef(k,j) + enddo + call get_s2_u0(psi_det,CI_eigenvectors(1,j),N_det,size(CI_eigenvectors,1),CI_eigenvectors_s2(j)) + enddo + if (.True.) then + do k=1,size(ci_electronic_energy) + ci_electronic_energy(k) = energy(k) + enddo + SOFT_TOUCH ci_electronic_energy CI_eigenvectors_s2 CI_eigenvectors + print *, energy(:) + endif call write_double(6,ci_energy,'Energy') zmq_state = 'h_apply_fci_pt2' diff --git a/plugins/Selectors_full/zmq.irp.f b/plugins/Selectors_full/zmq.irp.f index 952e5c06..cbdddb82 100644 --- a/plugins/Selectors_full/zmq.irp.f +++ b/plugins/Selectors_full/zmq.irp.f @@ -1,4 +1,4 @@ -subroutine zmq_put_psi(zmq_to_qp_run_socket,worker_id) +subroutine zmq_put_psi(zmq_to_qp_run_socket,worker_id, energy, size_energy) use f77_zmq implicit none BEGIN_DOC @@ -6,6 +6,8 @@ subroutine zmq_put_psi(zmq_to_qp_run_socket,worker_id) END_DOC integer(ZMQ_PTR), intent(in) :: zmq_to_qp_run_socket integer, intent(in) :: worker_id + integer, intent(in) :: size_energy + double precision, intent(out) :: energy(size_energy) integer :: rc character*(256) :: msg @@ -23,9 +25,15 @@ subroutine zmq_put_psi(zmq_to_qp_run_socket,worker_id) stop 'error' endif - rc = f77_zmq_send(zmq_to_qp_run_socket,psi_coef,psi_det_size*N_states*8,0) + rc = f77_zmq_send(zmq_to_qp_run_socket,psi_coef,psi_det_size*N_states*8,ZMQ_SNDMORE) if (rc /= psi_det_size*N_states*8) then - print *, 'f77_zmq_send(zmq_to_qp_run_socket,psi_coef,psi_det_size*N_states*8,0)' + print *, 'f77_zmq_send(zmq_to_qp_run_socket,psi_coef,psi_det_size*N_states*8,ZMQ_SNDMORE)' + stop 'error' + endif + + rc = f77_zmq_send(zmq_to_qp_run_socket,energy,size_energy*8,0) + if (rc /= size_energy*8) then + print *, 'f77_zmq_send(zmq_to_qp_run_socket,energy,size_energy*8,0)' stop 'error' endif @@ -40,7 +48,7 @@ end -subroutine zmq_get_psi(zmq_to_qp_run_socket, worker_id) +subroutine zmq_get_psi(zmq_to_qp_run_socket, worker_id, energy, size_energy) use f77_zmq implicit none BEGIN_DOC @@ -48,6 +56,8 @@ subroutine zmq_get_psi(zmq_to_qp_run_socket, worker_id) END_DOC integer(ZMQ_PTR), intent(in) :: zmq_to_qp_run_socket integer, intent(in) :: worker_id + integer, intent(in) :: size_energy + double precision, intent(out) :: energy(size_energy) integer :: rc character*(64) :: msg @@ -86,9 +96,15 @@ subroutine zmq_get_psi(zmq_to_qp_run_socket, worker_id) stop 'error' endif - rc = f77_zmq_recv(zmq_to_qp_run_socket,psi_coef,psi_det_size*N_states*8,0) + rc = f77_zmq_recv(zmq_to_qp_run_socket,psi_coef,psi_det_size*N_states*8,ZMQ_SNDMORE) if (rc /= psi_det_size*N_states*8) then - print *, '77_zmq_recv(zmq_to_qp_run_socket,psi_coef,psi_det_size*N_states*8,0)' + print *, '77_zmq_recv(zmq_to_qp_run_socket,psi_coef,psi_det_size*N_states*8,ZMQ_SNDMORE)' + stop 'error' + endif + + rc = f77_zmq_recv(zmq_to_qp_run_socket,energy,size_energy*8,0) + if (rc /= size_energy*8) then + print *, '77_zmq_recv(zmq_to_qp_run_socket,energy,size_energy*8,0)' stop 'error' endif diff --git a/scripts/generate_h_apply.py b/scripts/generate_h_apply.py index ae0064cf..d90a0e92 100755 --- a/scripts/generate_h_apply.py +++ b/scripts/generate_h_apply.py @@ -435,8 +435,9 @@ class H_apply_zmq(H_apply): norm_pert(k) = 0.d0 H_pert_diag(k) = 0.d0 norm_psi(k) = 0.d0 + energy(k) = %s(k) enddo - """ + """ % (self.energy) self.data["copy_buffer"] = """ do i=1,N_det_generators do k=1,N_st diff --git a/src/Determinants/H_apply_zmq.template.f b/src/Determinants/H_apply_zmq.template.f index fde09a8f..8a5f485b 100644 --- a/src/Determinants/H_apply_zmq.template.f +++ b/src/Determinants/H_apply_zmq.template.f @@ -28,11 +28,12 @@ subroutine $subroutine($params_main) integer(ZMQ_PTR) :: zmq_to_qp_run_socket double precision, allocatable :: pt2_generators(:,:), norm_pert_generators(:,:) double precision, allocatable :: H_pert_diag_generators(:,:) + double precision :: energy(N_st) call new_parallel_job(zmq_to_qp_run_socket,'$subroutine') zmq_socket_pair = new_zmq_pair_socket(.True.) - call zmq_put_psi(zmq_to_qp_run_socket,1) + call zmq_put_psi(zmq_to_qp_run_socket,1,energy,size(energy)) do i_generator=N_det_generators,1,-1 $skip From 8da0509c5eec69e31f62384c46a3aed0fbe6ad2c Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 1 Aug 2016 16:05:40 +0200 Subject: [PATCH 070/216] Massively parallel selection --- ocaml/Message.ml | 15 ++- ocaml/TaskServer.ml | 28 +++- plugins/Full_CI/micro_pt2.irp.f | 2 - plugins/Full_CI_ZMQ/fci_zmq.irp.f | 150 +++------------------ plugins/Full_CI_ZMQ/selection.irp.f | 15 ++- plugins/Full_CI_ZMQ/selection_slave.irp.f | 83 ++++++++++++ plugins/Selectors_full/zmq.irp.f | 2 +- src/Determinants/H_apply_zmq.template.f | 2 +- src/Integrals_Bielec/ao_bi_integrals.irp.f | 2 + src/ZMQ/utils.irp.f | 71 +++++++--- 10 files changed, 206 insertions(+), 164 deletions(-) create mode 100644 plugins/Full_CI_ZMQ/selection_slave.irp.f diff --git a/ocaml/Message.ml b/ocaml/Message.ml index 79eca15e..98c4ef25 100644 --- a/ocaml/Message.ml +++ b/ocaml/Message.ml @@ -541,6 +541,9 @@ type t = | Terminate of Terminate_msg.t | Ok of Ok_msg.t | Error of Error_msg.t +| SetStopped +| SetWaiting +| SetRunning let of_string s = @@ -577,10 +580,11 @@ let of_string s = | "put_psi" :: client_id :: n_state :: n_det :: psi_det_size :: [] -> PutPsi (PutPsi_msg.create ~client_id ~n_state ~n_det ~psi_det_size ~n_det_generators:None ~n_det_selectors:None ~psi_det:None ~psi_coef:None ~energy:None) - | "ok" :: [] -> - Ok (Ok_msg.create ()) - | "error" :: rest -> - Error (Error_msg.create (String.concat ~sep:" " rest)) + | "ok" :: [] -> Ok (Ok_msg.create ()) + | "error" :: rest -> Error (Error_msg.create (String.concat ~sep:" " rest)) + | "set_stopped" :: [] -> SetStopped + | "set_running" :: [] -> SetRunning + | "set_waiting" :: [] -> SetWaiting | _ -> failwith "Message not understood" @@ -605,6 +609,9 @@ let to_string = function | Error x -> Error_msg.to_string x | PutPsi x -> PutPsi_msg.to_string x | GetPsiReply x -> GetPsiReply_msg.to_string x +| SetStopped -> "set_stopped" +| SetRunning -> "set_running" +| SetWaiting -> "set_waiting" let to_string_list = function diff --git a/ocaml/TaskServer.ml b/ocaml/TaskServer.ml index 6cd77fd0..c02c8f8f 100644 --- a/ocaml/TaskServer.ml +++ b/ocaml/TaskServer.ml @@ -160,10 +160,30 @@ let new_job msg program_state rep_socket pair_socket = } in reply_ok rep_socket; - string_of_pub_state (Running (Message.State.to_string state)) + string_of_pub_state Waiting |> ZMQ.Socket.send pair_socket ; result +let change_pub_state msg program_state rep_socket pair_socket = + let msg = + match msg with + | `Waiting -> Waiting + | `Stopped -> Stopped + | `Running -> + begin + let state = + match program_state.state with + | Some x -> x + | None -> failwith "Trying to change pub state while no job is ready" + in + Running (Message.State.to_string state) + end + in + reply_ok rep_socket; + string_of_pub_state msg + |> ZMQ.Socket.send pair_socket ; + + program_state let end_job msg program_state rep_socket pair_socket = @@ -531,6 +551,9 @@ let get_psi msg program_state rep_socket = let terminate program_state rep_socket = reply_ok rep_socket; { program_state with + psi = None; + address_tcp = None; + address_inproc = None; running = false } @@ -685,6 +708,9 @@ let run ~port = | None , Message.Newjob x -> new_job x program_state rep_socket pair_socket | _ , Message.Newjob _ -> error "A job is already running" program_state rep_socket | Some _, Message.Endjob x -> end_job x program_state rep_socket pair_socket + | Some _, Message.SetRunning -> change_pub_state `Running program_state rep_socket pair_socket + | _, Message.SetWaiting -> change_pub_state `Waiting program_state rep_socket pair_socket + | _, Message.SetStopped -> change_pub_state `Stopped program_state rep_socket pair_socket | None , _ -> error "No job is running" program_state rep_socket | Some _, Message.Connect x -> connect x program_state rep_socket | Some _, Message.Disconnect x -> disconnect x program_state rep_socket diff --git a/plugins/Full_CI/micro_pt2.irp.f b/plugins/Full_CI/micro_pt2.irp.f index 25e74b28..4ce7c4be 100644 --- a/plugins/Full_CI/micro_pt2.irp.f +++ b/plugins/Full_CI/micro_pt2.irp.f @@ -58,6 +58,4 @@ subroutine run_wf i = omp_get_thread_num() call H_apply_FCI_PT2_slave_tcp(i) !$OMP END PARALLEL - - end diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index b3a89b74..f45da233 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -1,5 +1,3 @@ - - program fci_zmq implicit none integer :: i,k @@ -7,9 +5,7 @@ program fci_zmq double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) integer :: N_st, degree - integer :: it, mit(0:6) - mit = (/1, 246, 1600, 17528, 112067, 519459, 2685970/) - it = 0 + integer(bit_kind) :: chk N_st = N_states allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st)) @@ -39,20 +35,12 @@ program fci_zmq 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) - it += 1 - if(it > 6) stop - call ZMQ_selection(mit(it) - mit(it-1), pt2) ! max(1000-N_det, N_det), pt2) + call ZMQ_selection(max(1024-N_det, N_det), pt2) - !do i=1, N_det - !if(popcnt(psi_det(1,1,i)) + popcnt(psi_det(2,1,i)) /= 23) stop "ZZ1" -2099.2504682049275 - !if(popcnt(psi_det(1,2,i)) + popcnt(psi_det(2,2,i)) /= 23) stop "ZZ2" - ! do k=1,i-1 - ! if(detEq(psi_det(1,1,i), psi_det(1,1,k), N_int)) stop "ATRRGRZER" - ! end do - !end do PROVIDE psi_coef PROVIDE psi_det PROVIDE psi_det_sorted @@ -65,6 +53,14 @@ program fci_zmq endif call diagonalize_CI call save_wavefunction + ! chk = 0_8 + ! do i=1, N_det + ! do k=1, N_int + ! chk = xor(psi_det(k,1,i), chk) + ! chk = xor(psi_det(k,2,i), chk) + ! end do + ! end do + ! print *, "CHK ", chk print *, 'N_det = ', N_det print *, 'N_states = ', N_states @@ -128,18 +124,20 @@ subroutine ZMQ_selection(N, pt2) integer :: i integer, external :: omp_get_thread_num double precision, intent(out) :: pt2(N_states) - !call flip_generators() - call new_parallel_job(zmq_to_qp_run_socket,'selection') + + provide nproc + provide ci_electronic_energy + call new_parallel_job(zmq_to_qp_run_socket,"selection") + call zmq_put_psi(zmq_to_qp_run_socket,1,ci_electronic_energy,size(ci_electronic_energy)) + call zmq_set_running(zmq_to_qp_run_socket) call create_selection_buffer(N, N*2, b) do i= N_det_generators, 1, -1 write(task,*) i, N call add_task_to_taskserver(zmq_to_qp_run_socket,task) end do - provide nproc - provide ci_electronic_energy - !$OMP PARALLEL DEFAULT(none) SHARED(b, pt2) PRIVATE(i) NUM_THREADS(nproc+1) + !$OMP PARALLEL DEFAULT(none) SHARED(b, pt2) PRIVATE(i) NUM_THREADS(nproc+1) shared(ci_electronic_energy_is_built, n_det_generators_is_built, n_states_is_built, n_int_is_built, nproc_is_built) i = omp_get_thread_num() if (i==0) then call selection_collector(b, pt2) @@ -148,125 +146,15 @@ subroutine ZMQ_selection(N, pt2) endif !$OMP END PARALLEL call end_parallel_job(zmq_to_qp_run_socket, 'selection') - !call flip_generators() call fill_H_apply_buffer_no_selection(b%cur,b%det,N_int,0) !!! PAS DE ROBIN call copy_H_apply_buffer_to_wf() end subroutine -subroutine selection_dressing_slave_tcp(i) - implicit none - integer, intent(in) :: i - - call selection_slave(0,i) -end - - subroutine selection_dressing_slave_inproc(i) implicit none integer, intent(in) :: i - call selection_slave(1,i) + call selection_slaved(1,i) end - - -! subroutine ZMQ_selection() -! use f77_zmq -! implicit none -! BEGIN_DOC -! ! Massively parallel Full-CI -! END_DOC -! -! integer :: i,ithread -! integer(ZMQ_PTR) :: zmq_socket_push -! integer(ZMQ_PTR), external :: new_zmq_push_socket -! zmq_context = f77_zmq_ctx_new () -! PROVIDE H_apply_buffer_allocated -! -! PROVIDE ci_electronic_energy -! PROVIDE nproc -! !$OMP PARALLEL PRIVATE(i,ithread,zmq_socket_push) num_threads(nproc+1) -! ithread = omp_get_thread_num() -! if (ithread == 0) then -! call receive_selected_determinants() -! else -! zmq_socket_push = new_zmq_push_socket(1) -! -! do i=ithread,N_det_generators,nproc -! print *, i, "/", N_det_generators -! call select_connected(i, max(100, N_det), ci_electronic_energy,zmq_socket_push) -! enddo -! -! if (ithread == 1) then -! integer :: rc -! rc = f77_zmq_send(zmq_socket_push,0,1,0) -! if (rc /= 1) then -! stop 'Error sending termination signal' -! endif -! endif -! call end_zmq_push_socket(zmq_socket_push, 1) -! endif -! !$OMP END PARALLEL -! call copy_H_apply_buffer_to_wf() -! end - - - - - - - - - - - - - -! program Full_CI_ZMQ -! use f77_zmq -! implicit none -! BEGIN_DOC -! ! Massively parallel Full-CI -! END_DOC -! -! integer :: i,ithread -! -! integer(ZMQ_PTR) :: zmq_socket_push -! integer(ZMQ_PTR), external :: new_zmq_push_socket -! zmq_context = f77_zmq_ctx_new () -! PROVIDE H_apply_buffer_allocated -! -! do while (N_det < N_det_max) -! -! PROVIDE ci_electronic_energy -! PROVIDE nproc -! !$OMP PARALLEL PRIVATE(i,ithread,zmq_socket_push) num_threads(nproc+1) -! ithread = omp_get_thread_num() -! if (ithread == 0) then -! call receive_selected_determinants() -! else -! zmq_socket_push = new_zmq_push_socket(0) -! -! do i=ithread,N_det_generators,nproc -! print *, i , "/", N_det_generators -! call select_connected(i, 1.d-7, ci_electronic_energy,zmq_socket_push) -! enddo -! print *, "END .... " -! -! if (ithread == 1) then -! integer :: rc -! rc = f77_zmq_send(zmq_socket_push,0,1,0) -! if (rc /= 1) then -! stop 'Error sending termination signal' -! endif -! endif -! call end_zmq_push_socket(zmq_socket_push, 0) -! endif -! !$OMP END PARALLEL -! call copy_H_apply_buffer_to_wf() -! call diagonalize_CI() -! call save_wavefunction() -! end do -! -! end diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 436a6946..0cf7e576 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -13,7 +13,7 @@ BEGIN_PROVIDER [ double precision, integral8, (mo_tot_num, mo_tot_num, mo_tot_n END_PROVIDER -subroutine selection_slave(thread,iproc) +subroutine selection_slaved(thread,iproc) use f77_zmq use selection_types implicit none @@ -37,7 +37,13 @@ subroutine selection_slave(thread,iproc) zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() zmq_socket_push = new_zmq_push_socket(thread) call connect_to_taskserver(zmq_to_qp_run_socket,worker_id,thread) - + if(worker_id == -1) then + print *, "WORKER -1" + !call disconnect_from_taskserver(zmq_to_qp_run_socket,zmq_socket_push,worker_id) + call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) + call end_zmq_push_socket(zmq_socket_push,thread) + return + end if buf%N = 0 ctask = 1 pt2 = 0d0 @@ -53,7 +59,9 @@ subroutine selection_slave(thread,iproc) else if(N /= buf%N) stop "N changed... wtf man??" end if - call select_connected(i_generator,ci_electronic_energy,pt2,buf) !! ci_electronic_energy ?? + !print *, "psi_selectors_coef ", psi_selectors_coef(N_det_selectors-5:N_det_selectors, 1) + !call debug_det(psi_selectors(1,1,N_det_selectors), N_int) + call select_connected(i_generator,ci_electronic_energy,pt2,buf) end if if(done) ctask = ctask - 1 @@ -160,7 +168,6 @@ subroutine select_connected(i_generator,E0,pt2,b) integer(bit_kind) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision :: fock_diag_tmp(2,mo_tot_num+1) - call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) do l=1,N_generators_bitmask diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f new file mode 100644 index 00000000..fd7728f7 --- /dev/null +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -0,0 +1,83 @@ +program selection_slave + implicit none + BEGIN_DOC +! Helper program to compute the PT2 in distributed mode. + END_DOC + + read_wf = .False. + SOFT_TOUCH read_wf + call provide_everything + call switch_qp_run_to_master + call run_wf + +end + +subroutine provide_everything + PROVIDE H_apply_buffer_allocated mo_bielec_integrals_in_map psi_det_generators psi_coef_generators psi_det_sorted_bit psi_selectors n_det_generators n_states generators_bitmask zmq_context +! PROVIDE ci_electronic_energy mo_tot_num N_int +end + +subroutine run_wf + use f77_zmq + implicit none + + integer(ZMQ_PTR), external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + double precision :: energy(N_states_diag) + character*(64) :: state + integer :: oki + + oki = 0 + call provide_everything + + zmq_context = f77_zmq_ctx_new () + + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() + + do + call wait_for_state("selection", zmq_state) + if(trim(zmq_state) /= "selection") exit + if(oki < 0) then + oki += 1 + cycle + end if + oki = 0 + print *, 'Getting wave function' + call zmq_get_psi(zmq_to_qp_run_socket,1,energy,size(energy)) + integer :: j,k + do j=1,N_states_diag + do k=1,N_det + CI_eigenvectors(k,j) = psi_coef(k,j) + enddo + call get_s2_u0(psi_det,CI_eigenvectors(1,j),N_det,size(CI_eigenvectors,1),CI_eigenvectors_s2(j)) + enddo + if (.True.) then + do k=1,size(ci_electronic_energy) + ci_electronic_energy(k) = energy(k) + enddo + SOFT_TOUCH ci_electronic_energy CI_eigenvectors_s2 CI_eigenvectors + endif + + call write_double(6,ci_energy,'Energy') + !zmq_state = 'selection' + + + integer :: rc, i + + print *, 'Selection slave running' + + !$OMP PARALLEL PRIVATE(i) + i = omp_get_thread_num() + call selection_dressing_slave_tcp(i) + !$OMP END PARALLEL + end do +end + + +subroutine selection_dressing_slave_tcp(i) + implicit none + integer, intent(in) :: i + + call selection_slaved(0,i) +end + diff --git a/plugins/Selectors_full/zmq.irp.f b/plugins/Selectors_full/zmq.irp.f index cbdddb82..dfa94884 100644 --- a/plugins/Selectors_full/zmq.irp.f +++ b/plugins/Selectors_full/zmq.irp.f @@ -79,7 +79,7 @@ subroutine zmq_get_psi(zmq_to_qp_run_socket, worker_id, energy, size_energy) integer :: N_states_read, N_det_read, psi_det_size_read integer :: N_det_selectors_read, N_det_generators_read read(msg(14:rc),*) rc, N_states_read, N_det_read, psi_det_size_read, & - N_det_selectors_read, N_det_generators_read + N_det_generators_read, N_det_selectors_read if (rc /= worker_id) then print *, 'Wrong worker ID' stop 'error' diff --git a/src/Determinants/H_apply_zmq.template.f b/src/Determinants/H_apply_zmq.template.f index 8a5f485b..d59f2994 100644 --- a/src/Determinants/H_apply_zmq.template.f +++ b/src/Determinants/H_apply_zmq.template.f @@ -136,7 +136,7 @@ subroutine $subroutine_slave(thread, iproc) pt2 = 0.d0 norm_pert = 0.d0 - H_pert_diag = 0.d0 + H_pert_diag = 0.d0 ! Create bit masks for holes and particles do ispin=1,2 diff --git a/src/Integrals_Bielec/ao_bi_integrals.irp.f b/src/Integrals_Bielec/ao_bi_integrals.irp.f index 2c46d42d..1dcea81f 100644 --- a/src/Integrals_Bielec/ao_bi_integrals.irp.f +++ b/src/Integrals_Bielec/ao_bi_integrals.irp.f @@ -372,6 +372,8 @@ BEGIN_PROVIDER [ logical, ao_bielec_integrals_in_map ] write(task,*) "triangle ", l call add_task_to_taskserver(zmq_to_qp_run_socket,task) enddo + + call zmq_set_running(zmq_to_qp_run_socket) PROVIDE nproc !$OMP PARALLEL DEFAULT(private) num_threads(nproc+1) diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index d3b76f4f..6b22158e 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -143,11 +143,6 @@ function new_zmq_to_qp_run_socket() stop 'Unable to create zmq req socket' endif - rc = f77_zmq_connect(new_zmq_to_qp_run_socket, trim(qp_run_address)//':'//trim(zmq_port(0))) - if (rc /= 0) then - stop 'Unable to connect new_zmq_to_qp_run_socket' - endif - rc = f77_zmq_setsockopt(new_zmq_to_qp_run_socket, ZMQ_SNDTIMEO, 120000, 4) if (rc /= 0) then stop 'Unable to set send timout in new_zmq_to_qp_run_socket' @@ -158,6 +153,11 @@ function new_zmq_to_qp_run_socket() stop 'Unable to set recv timout in new_zmq_to_qp_run_socket' endif + rc = f77_zmq_connect(new_zmq_to_qp_run_socket, trim(qp_run_address)//':'//trim(zmq_port(0))) + if (rc /= 0) then + stop 'Unable to connect new_zmq_to_qp_run_socket' + endif + end @@ -182,18 +182,6 @@ function new_zmq_pair_socket(bind) stop 'Unable to create zmq pair socket' endif - if (bind) then - rc = f77_zmq_bind(new_zmq_pair_socket,zmq_socket_pair_inproc_address) - if (rc /= 0) then - print *, 'f77_zmq_bind(new_zmq_pair_socket, zmq_socket_pair_inproc_address)' - stop 'error' - endif - else - rc = f77_zmq_connect(new_zmq_pair_socket,zmq_socket_pair_inproc_address) - if (rc /= 0) then - stop 'Unable to connect new_zmq_pair_socket' - endif - endif rc = f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_SNDHWM, 1, 4) if (rc /= 0) then @@ -215,6 +203,19 @@ function new_zmq_pair_socket(bind) stop 'f77_zmq_setsockopt(new_zmq_pair_socket, ZMQ_LINGER, 60000, 4)' endif + if (bind) then + rc = f77_zmq_bind(new_zmq_pair_socket,zmq_socket_pair_inproc_address) + if (rc /= 0) then + print *, 'f77_zmq_bind(new_zmq_pair_socket, zmq_socket_pair_inproc_address)' + stop 'error' + endif + else + rc = f77_zmq_connect(new_zmq_pair_socket,zmq_socket_pair_inproc_address) + if (rc /= 0) then + stop 'Unable to connect new_zmq_pair_socket' + endif + endif + end @@ -535,6 +536,34 @@ subroutine new_parallel_job(zmq_to_qp_run_socket,name_in) end +subroutine zmq_set_running(zmq_to_qp_run_socket) + use f77_zmq + implicit none + BEGIN_DOC + ! Set the job to Running in QP-run + END_DOC + + integer(ZMQ_PTR), intent(in) :: zmq_to_qp_run_socket + character*(512) :: message + integer :: rc, sze + + message = 'set_running' + sze = len(trim(message)) + rc = f77_zmq_send(zmq_to_qp_run_socket,message,sze,0) + if (rc /= sze) then + print *, irp_here, ':f77_zmq_send(zmq_to_qp_run_socket,message,sze,0)' + stop 'error' + endif + rc = f77_zmq_recv(zmq_to_qp_run_socket,message,510,0) + message = trim(message(1:rc)) + if (message(1:2) /= 'ok') then + print *, 'Unable to set qp_run to Running' + stop 1 + endif + + +end + subroutine end_parallel_job(zmq_to_qp_run_socket,name_in) use f77_zmq @@ -584,7 +613,6 @@ subroutine connect_to_taskserver(zmq_to_qp_run_socket,worker_id,thread) character*(512) :: message character*(128) :: reply, state, address integer :: rc - if (thread == 1) then rc = f77_zmq_send(zmq_to_qp_run_socket, "connect inproc", 14, 0) if (rc /= 14) then @@ -601,6 +629,10 @@ subroutine connect_to_taskserver(zmq_to_qp_run_socket,worker_id,thread) rc = f77_zmq_recv(zmq_to_qp_run_socket, message, 510, 0) message = trim(message(1:rc)) + if(message(1:5) == "error") then + worker_id = -1 + return + end if read(message,*) reply, state, worker_id, address if ( (trim(reply) /= 'connect_reply') .and. & (trim(state) /= trim(zmq_state)) ) then @@ -609,7 +641,6 @@ subroutine connect_to_taskserver(zmq_to_qp_run_socket,worker_id,thread) print *, 'Address: ', trim(address) stop -1 endif - end subroutine disconnect_from_taskserver(zmq_to_qp_run_socket, & @@ -842,7 +873,7 @@ subroutine wait_for_state(state_wait,state) zmq_socket_sub = new_zmq_sub_socket() state = "Waiting" - do while (state /= state_wait .and. state /= "Stopped") + do while (trim(state) /= trim(state_wait) .and. trim(state) /= "Stopped") rc = f77_zmq_recv( zmq_socket_sub, state, 64, 0) if (rc > 0) then state = trim(state(1:rc)) From 3bd401513dc7ac28b1b0ec0037d5096ece333ed9 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 1 Aug 2016 17:15:03 +0200 Subject: [PATCH 071/216] Bugs --- plugins/Full_CI_ZMQ/selection.irp.f | 7 +++---- plugins/Full_CI_ZMQ/selection_slave.irp.f | 12 ++++-------- src/ZMQ/utils.irp.f | 5 +++-- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 0cf7e576..b26b3e1b 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -62,9 +62,9 @@ subroutine selection_slaved(thread,iproc) !print *, "psi_selectors_coef ", psi_selectors_coef(N_det_selectors-5:N_det_selectors, 1) !call debug_det(psi_selectors(1,1,N_det_selectors), N_int) call select_connected(i_generator,ci_electronic_energy,pt2,buf) - end if - - if(done) ctask = ctask - 1 + else + ctask = ctask - 1 + endif if(done .or. ctask == size(task_id)) then if(buf%N == 0 .and. ctask > 0) stop "uninitialized selection_buffer" @@ -77,7 +77,6 @@ subroutine selection_slaved(thread,iproc) buf%cur = 0 end if - ctask = 0 end if diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index fd7728f7..db18ca59 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -31,17 +31,14 @@ subroutine run_wf call provide_everything zmq_context = f77_zmq_ctx_new () + zmq_state = 'selection' + state = 'Waiting' zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() do - call wait_for_state("selection", zmq_state) - if(trim(zmq_state) /= "selection") exit - if(oki < 0) then - oki += 1 - cycle - end if - oki = 0 + call wait_for_state(zmq_state,state) + if(trim(state) /= 'selection') exit print *, 'Getting wave function' call zmq_get_psi(zmq_to_qp_run_socket,1,energy,size(energy)) integer :: j,k @@ -59,7 +56,6 @@ subroutine run_wf endif call write_double(6,ci_energy,'Energy') - !zmq_state = 'selection' integer :: rc, i diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index 6b22158e..4a6085e2 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -872,8 +872,8 @@ subroutine wait_for_state(state_wait,state) integer :: rc zmq_socket_sub = new_zmq_sub_socket() - state = "Waiting" - do while (trim(state) /= trim(state_wait) .and. trim(state) /= "Stopped") + state = 'Waiting' + do while (trim(state) /= trim(state_wait) .and. trim(state) /= 'Stopped') rc = f77_zmq_recv( zmq_socket_sub, state, 64, 0) if (rc > 0) then state = trim(state(1:rc)) @@ -881,6 +881,7 @@ subroutine wait_for_state(state_wait,state) print *, 'Timeout reached. Stopping' state = "Stopped" endif +print *, '|'//trim(state(1:rc))//'|'//trim(state_wait)//'|' end do call end_zmq_sub_socket(zmq_socket_sub) end From eaee625df4fd571d43c7b590dcb4765c60e5b278 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 1 Aug 2016 17:34:36 +0200 Subject: [PATCH 072/216] Almost working --- ocaml/Message.ml | 12 ++++++++---- ocaml/Queuing_system.ml | 5 ++++- ocaml/TaskServer.ml | 23 ++++++----------------- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/ocaml/Message.ml b/ocaml/Message.ml index 98c4ef25..68b866d5 100644 --- a/ocaml/Message.ml +++ b/ocaml/Message.ml @@ -248,16 +248,20 @@ end (** GetTaskReply : Reply to the GetTask message *) module GetTaskReply_msg : sig type t - val create : task_id:Id.Task.t -> task:string -> t + val create : task_id:Id.Task.t option -> task:string option -> t val to_string : t -> string end = struct type t = - { task_id: Id.Task.t ; - task : string ; + { task_id: Id.Task.t option ; + task : string option ; } let create ~task_id ~task = { task_id ; task } let to_string x = - Printf.sprintf "get_task_reply %d %s" (Id.Task.to_int x.task_id) x.task + match x.task_id, x.task with + | Some task_id, Some task -> + Printf.sprintf "get_task_reply %d %s" (Id.Task.to_int task_id) task + | _ -> + Printf.sprintf "get_task_reply 0" end (** GetPsi : get the current variational wave function *) diff --git a/ocaml/Queuing_system.ml b/ocaml/Queuing_system.ml index acdfd439..78abb185 100644 --- a/ocaml/Queuing_system.ml +++ b/ocaml/Queuing_system.ml @@ -99,9 +99,12 @@ let del_task ~task_id q = -let number_of_queued q = +let number q = Map.length q.tasks +let number_of_queued q = + List.length q.queued + let number_of_running q = Map.length q.running diff --git a/ocaml/TaskServer.ml b/ocaml/TaskServer.ml index c02c8f8f..cb67ec26 100644 --- a/ocaml/TaskServer.ml +++ b/ocaml/TaskServer.ml @@ -305,8 +305,7 @@ let del_task msg program_state rep_socket = } in let more = - (Queuing_system.number_of_queued new_program_state.queue + - Queuing_system.number_of_running new_program_state.queue) > 0 + (Queuing_system.number new_program_state.queue > 0) in Message.DelTaskReply (Message.DelTaskReply_msg.create ~task_id ~more) |> Message.to_string @@ -427,21 +426,10 @@ let get_task msg program_state rep_socket pair_socket = } in - match (task, task_id) with - | Some task, Some task_id -> - begin - Message.GetTaskReply (Message.GetTaskReply_msg.create ~task ~task_id) - |> Message.to_string - |> ZMQ.Socket.send rep_socket ; - new_program_state - end - | _ -> - begin - Message.Terminate (Message.Terminate_msg.create ()) - |> Message.to_string - |> ZMQ.Socket.send rep_socket ; - program_state - end + Message.GetTaskReply (Message.GetTaskReply_msg.create ~task ~task_id) + |> Message.to_string + |> ZMQ.Socket.send rep_socket ; + new_program_state in @@ -601,6 +589,7 @@ let start_pub_thread ~port = else state in +print_endline (string_of_pub_state new_state); ZMQ.Socket.send pub_socket @@ string_of_pub_state new_state; match state with | Stopped -> () From 36a6bd01c61a4394450a318539de75e84f367803 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 1 Aug 2016 20:03:46 +0200 Subject: [PATCH 073/216] Removed prints --- ocaml/TaskServer.ml | 1 - plugins/Full_CI_ZMQ/selection.irp.f | 18 ++++++++---------- plugins/Full_CI_ZMQ/selection_slave.irp.f | 2 +- src/ZMQ/utils.irp.f | 1 - 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/ocaml/TaskServer.ml b/ocaml/TaskServer.ml index cb67ec26..75334adc 100644 --- a/ocaml/TaskServer.ml +++ b/ocaml/TaskServer.ml @@ -589,7 +589,6 @@ let start_pub_thread ~port = else state in -print_endline (string_of_pub_state new_state); ZMQ.Socket.send pub_socket @@ string_of_pub_state new_state; match state with | Stopped -> () diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index b26b3e1b..ba6c7c73 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -3,13 +3,11 @@ BEGIN_PROVIDER [ double precision, integral8, (mo_tot_num, mo_tot_num, mo_tot_num, mo_tot_num) ] integral8 = 0d0 integer :: h1, h2 - print *, "provide int" do h1=1, mo_tot_num - do h2=1, mo_tot_num - call get_mo_bielec_integrals_ij(h1, h2 ,mo_tot_num,integral8(1,1,h1,h2),mo_integrals_map) + do h2=1, mo_tot_num + call get_mo_bielec_integrals_ij(h1, h2 ,mo_tot_num,integral8(1,1,h1,h2),mo_integrals_map) + end do end do - end do - print *, "end provide int" END_PROVIDER @@ -21,7 +19,7 @@ subroutine selection_slaved(thread,iproc) integer, intent(in) :: thread, iproc integer :: rc, i - integer :: worker_id, task_id(100), ctask, ltask + integer :: worker_id, task_id(1), ctask, ltask character*(512) :: task integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket @@ -51,7 +49,9 @@ subroutine selection_slaved(thread,iproc) do call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id(ctask), task) done = task_id(ctask) == 0 - if (.not. done) then + if (done) then + ctask = ctask - 1 + else integer :: i_generator, N read (task,*) i_generator, N if(buf%N == 0) then @@ -62,8 +62,6 @@ subroutine selection_slaved(thread,iproc) !print *, "psi_selectors_coef ", psi_selectors_coef(N_det_selectors-5:N_det_selectors, 1) !call debug_det(psi_selectors(1,1,N_det_selectors), N_int) call select_connected(i_generator,ci_electronic_energy,pt2,buf) - else - ctask = ctask - 1 endif if(done .or. ctask == size(task_id)) then @@ -300,7 +298,7 @@ subroutine selection_collector(b, pt2) end do done += ntask call CPU_TIME(time) - print *, "DONE" , done, time - time0 +! print *, "DONE" , done, time - time0 end do diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index db18ca59..a09e1bf2 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -52,7 +52,7 @@ subroutine run_wf do k=1,size(ci_electronic_energy) ci_electronic_energy(k) = energy(k) enddo - SOFT_TOUCH ci_electronic_energy CI_eigenvectors_s2 CI_eigenvectors + TOUCH ci_electronic_energy CI_eigenvectors_s2 CI_eigenvectors endif call write_double(6,ci_energy,'Energy') diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index 4a6085e2..30dee670 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -881,7 +881,6 @@ subroutine wait_for_state(state_wait,state) print *, 'Timeout reached. Stopping' state = "Stopped" endif -print *, '|'//trim(state(1:rc))//'|'//trim(state_wait)//'|' end do call end_zmq_sub_socket(zmq_socket_sub) end From 2dd38c0bdbebab6ca766b0784475ef7e1be1e9bc Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 1 Aug 2016 20:31:23 +0200 Subject: [PATCH 074/216] Corrected linger bug --- plugins/Full_CI_ZMQ/selection.irp.f | 4 ++-- src/ZMQ/utils.irp.f | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index ba6c7c73..e39ebd6b 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -19,7 +19,7 @@ subroutine selection_slaved(thread,iproc) integer, intent(in) :: thread, iproc integer :: rc, i - integer :: worker_id, task_id(1), ctask, ltask + integer :: worker_id, task_id(10), ctask, ltask character*(512) :: task integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket @@ -293,7 +293,7 @@ subroutine selection_collector(b, pt2) end do do i=1, ntask - if(task_id(i) == 0) stop "collector" + if(task_id(i) == 0) stop "Error in collector" call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id(i),more) end do done += ntask diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index 30dee670..9fa70d5e 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -394,10 +394,10 @@ subroutine end_zmq_pair_socket(zmq_socket_pair) ! stop 'error' ! endif - rc = f77_zmq_setsockopt(zmq_socket_pair,ZMQ_LINGER,0,4) - if (rc /= 0) then - stop 'Unable to set ZMQ_LINGER on zmq_socket_pair' - endif +! rc = f77_zmq_setsockopt(zmq_socket_pair,0ZMQ_LINGER,1000,4) +! if (rc /= 0) then +! stop 'Unable to set ZMQ_LINGER on zmq_socket_pair' +! endif rc = f77_zmq_close(zmq_socket_pair) if (rc /= 0) then @@ -433,10 +433,10 @@ subroutine end_zmq_pull_socket(zmq_socket_pull) call sleep(1) ! see https://github.com/zeromq/libzmq/issues/1922 - rc = f77_zmq_setsockopt(zmq_socket_pull,ZMQ_LINGER,0,4) - if (rc /= 0) then - stop 'Unable to set ZMQ_LINGER on zmq_socket_pull' - endif +! rc = f77_zmq_setsockopt(zmq_socket_pull,ZMQ_LINGER,10000,4) +! if (rc /= 0) then +! stop 'Unable to set ZMQ_LINGER on zmq_socket_pull' +! endif rc = f77_zmq_close(zmq_socket_pull) if (rc /= 0) then @@ -473,10 +473,10 @@ subroutine end_zmq_push_socket(zmq_socket_push,thread) endif - rc = f77_zmq_setsockopt(zmq_socket_push,ZMQ_LINGER,0,4) - if (rc /= 0) then - stop 'Unable to set ZMQ_LINGER on push socket' - endif +! rc = f77_zmq_setsockopt(zmq_socket_push,ZMQ_LINGER,20000,4) +! if (rc /= 0) then +! stop 'Unable to set ZMQ_LINGER on push socket' +! endif rc = f77_zmq_close(zmq_socket_push) if (rc /= 0) then @@ -805,7 +805,7 @@ subroutine end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) ! stop 'error' ! endif - rc = f77_zmq_setsockopt(zmq_to_qp_run_socket,ZMQ_LINGER,0,4) + rc = f77_zmq_setsockopt(zmq_to_qp_run_socket,ZMQ_LINGER,1000,4) if (rc /= 0) then stop 'Unable to set ZMQ_LINGER on zmq_to_qp_run_socket' endif From eb15a392befdcba32354a5c73f2b4a265b7934e8 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 1 Aug 2016 23:08:22 +0200 Subject: [PATCH 075/216] No more davidson on clients --- ocaml/TaskServer.ml | 3 +- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 2 +- plugins/Full_CI_ZMQ/selection.irp.f | 55 ++++++++++++++--------- plugins/Full_CI_ZMQ/selection_slave.irp.f | 50 ++++++++++++--------- plugins/Selectors_full/selectors.irp.f | 18 +++++++- src/ZMQ/utils.irp.f | 25 ++++++++--- 6 files changed, 103 insertions(+), 50 deletions(-) diff --git a/ocaml/TaskServer.ml b/ocaml/TaskServer.ml index 75334adc..927ac241 100644 --- a/ocaml/TaskServer.ml +++ b/ocaml/TaskServer.ml @@ -681,9 +681,10 @@ let run ~port = in (** Debug input *) - Printf.sprintf "%d %d : %s\n%!" + Printf.sprintf "q:%d r:%d n:%d : %s\n%!" (Queuing_system.number_of_queued program_state.queue) (Queuing_system.number_of_running program_state.queue) + (Queuing_system.number program_state.queue) (Message.to_string message) |> debug; diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index f45da233..02461ee3 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -155,6 +155,6 @@ subroutine selection_dressing_slave_inproc(i) implicit none integer, intent(in) :: i - call selection_slaved(1,i) + call selection_slaved(1,i,ci_electronic_energy) end diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index e39ebd6b..5af0e206 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -11,15 +11,16 @@ BEGIN_PROVIDER [ double precision, integral8, (mo_tot_num, mo_tot_num, mo_tot_n END_PROVIDER -subroutine selection_slaved(thread,iproc) +subroutine selection_slaved(thread,iproc,energy) use f77_zmq use selection_types implicit none + double precision, intent(in) :: energy(N_states_diag) integer, intent(in) :: thread, iproc integer :: rc, i - integer :: worker_id, task_id(10), ctask, ltask + integer :: worker_id, task_id(1), ctask, ltask character*(512) :: task integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket @@ -61,7 +62,7 @@ subroutine selection_slaved(thread,iproc) end if !print *, "psi_selectors_coef ", psi_selectors_coef(N_det_selectors-5:N_det_selectors, 1) !call debug_det(psi_selectors(1,1,N_det_selectors), N_int) - call select_connected(i_generator,ci_electronic_energy,pt2,buf) + call select_connected(i_generator,energy,pt2,buf) endif if(done .or. ctask == size(task_id)) then @@ -117,6 +118,8 @@ subroutine push_selection_results(zmq_socket_push, pt2, b, task_id, ntask) rc = f77_zmq_send( zmq_socket_push, task_id(1), ntask*4, 0) if(rc /= 4*ntask) stop "push" +! Activate is zmq_socket_push is a REQ +! rc = f77_zmq_recv( zmq_socket_push, task_id(1), ntask*4, 0) end subroutine @@ -131,23 +134,26 @@ subroutine pull_selection_results(zmq_socket_pull, pt2, val, det, N, task_id, nt integer, intent(out) :: N, ntask, task_id(*) integer :: rc, rn, i - rc = f77_zmq_recv( zmq_socket_pull, N, 4, ZMQ_SNDMORE) + rc = f77_zmq_recv( zmq_socket_pull, N, 4, 0) if(rc /= 4) stop "pull" - rc = f77_zmq_recv( zmq_socket_pull, pt2, N_states*8, ZMQ_SNDMORE) + rc = f77_zmq_recv( zmq_socket_pull, pt2, N_states*8, 0) if(rc /= 8*N_states) stop "pull" - rc = f77_zmq_recv( zmq_socket_pull, val(1), 8*N, ZMQ_SNDMORE) + rc = f77_zmq_recv( zmq_socket_pull, val(1), 8*N, 0) if(rc /= 8*N) stop "pull" - rc = f77_zmq_recv( zmq_socket_pull, det(1,1,1), bit_kind*N_int*2*N, ZMQ_SNDMORE) + rc = f77_zmq_recv( zmq_socket_pull, det(1,1,1), bit_kind*N_int*2*N, 0) if(rc /= bit_kind*N_int*2*N) stop "pull" - rc = f77_zmq_recv( zmq_socket_pull, ntask, 4, ZMQ_SNDMORE) + rc = f77_zmq_recv( zmq_socket_pull, ntask, 4, 0) if(rc /= 4) stop "pull" rc = f77_zmq_recv( zmq_socket_pull, task_id(1), ntask*4, 0) if(rc /= 4*ntask) stop "pull" + +! Activate is zmq_socket_pull is a REP +! rc = f77_zmq_send( zmq_socket_pull, task_id(1), ntask*4, 0) end subroutine @@ -293,7 +299,9 @@ subroutine selection_collector(b, pt2) end do do i=1, ntask - if(task_id(i) == 0) stop "Error in collector" + if(task_id(i) == 0) then + print *, "Error in collector" + endif call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id(i),more) end do done += ntask @@ -389,7 +397,7 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call create_microlist_single(psi_selectors, i_generator, N_det_selectors, ion_det, microlist, idx_microlist, N_microlist, ptr_microlist, N_int) do j=1, ptr_microlist(mo_tot_num * 2 + 1) - 1 - psi_coef_microlist(j,:) = psi_selectors_coef(idx_microlist(j),:) + psi_coef_microlist(j,:) = psi_selectors_coef_transp(:,idx_microlist(j)) enddo if(ptr_microlist(mo_tot_num * 2 + 1) == 1) then @@ -568,10 +576,10 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p do j=1, ptr_microlist(mo_tot_num * 2 + 1) - 1 - psi_coef_microlist(j,:) = psi_selectors_coef(idx_microlist(j),:) + psi_coef_microlist(j,:) = psi_selectors_coef_transp(:,idx_microlist(j)) enddo do j=1, ptr_tmicrolist(mo_tot_num * 2 + 1) - 1 - psi_coef_tmicrolist(j,:) = psi_selectors_coef(idx_tmicrolist(j),:) + psi_coef_tmicrolist(j,:) = psi_selectors_coef_transp(:,idx_tmicrolist(j)) enddo @@ -1042,7 +1050,7 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl !!!! INTEGRAL DRIVEN ! !!!!!!!!!!!!!!!!!!!! call get_d0(minilist(1,1,idx(i)), banned, banned_pair, d0s, key_mask, 1+(nt2-1)/mo_tot_num, 1+(nt-1)/mo_tot_num, & - mod(nt2-1, mo_tot_num)+1, mod(nt-1, mo_tot_num)+1, psi_selectors_coef(idx(i), :)) + mod(nt2-1, mo_tot_num)+1, mod(nt-1, mo_tot_num)+1, psi_selectors_coef_transp(1,idx(i))) ! do j=1, N_states ! do nt2=1, mo_tot_num @@ -1062,7 +1070,7 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl end do end do - call get_d1(minilist(1,1,idx(i)), banned, banned_pair, d0s, key_mask, pwen, psi_selectors_coef(idx(i), :)) + call get_d1(minilist(1,1,idx(i)), banned, banned_pair, d0s, key_mask, pwen, psi_selectors_coef_transp(1,idx(i))) ! do k=1, N_states ! do nt2=1, mo_tot_num @@ -1094,6 +1102,7 @@ subroutine get_d1(gen, banned, banned_pair, mat, mask, pwen, coefs) integer :: exc(0:2, 2, 2) logical :: lbanned(mo_tot_num*2) logical :: ok, mono, ab + integer :: tmp_array(4) lbanned = banned !mat = 0d0 @@ -1145,12 +1154,14 @@ subroutine get_d1(gen, banned, banned_pair, mat, mask, pwen, coefs) exc(1, 1, 2) = p(a1) exc(1, 2, sfix) = pfix - call apply_particle(mask, (/0, 0 ,s(i), p(i) /), deth, ok, N_int) + tmp_array = (/0, 0 ,s(i), p(i) /) + call apply_particle(mask, tmp_array, deth, ok, N_int) do j=1,mo_tot_num mwen = j + (sm-1)*mo_tot_num if(lbanned(mwen)) cycle - call apply_particle(deth, (/0,0,sm,j/), det, ok, N_int) + tmp_array = (/0,0,sm,j/) + call apply_particle(deth, tmp_array, det, ok, N_int) if(.not. ok) cycle mono = mwen == pwen(a1) .or. mwen == pwen(a2) @@ -1193,13 +1204,14 @@ subroutine get_d1(gen, banned, banned_pair, mat, mask, pwen, coefs) exc(1, 1, sp) = min(h1, h2) exc(2, 1, sp) = max(h1, h2) - call apply_particle(mask, (/0, 0 ,s(i), p(i) /), deth, ok, N_int) + tmp_array = (/0, 0 ,s(i), p(i) /) + call apply_particle(mask, tmp_array, deth, ok, N_int) do j=1,mo_tot_num if(j == pfix) inv = -inv mwen = j + (sm-1)*mo_tot_num if(lbanned(mwen)) cycle - call apply_particle(deth, (/0,0,sm,j/), det, ok, N_int) + call apply_particle(deth, tmp_array, det, ok, N_int) if(.not. ok) cycle mono = mwen == pwen(a1) .or. mwen == pwen(a2) @@ -1245,6 +1257,7 @@ subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2, coefs) integer :: p1, p2, hmi, hma, ns1, ns2, st logical, external :: detEq integer :: exc(0:2, 2, 2), exc2(0:2,2,2) + integer :: tmp_array(4) exc = 0 ! mat_mwen = integral8(:,:,h1,h2) @@ -1268,7 +1281,8 @@ subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2, coefs) if(banned(p1 + ns1)) cycle if(p1 == p2) cycle if(banned_pair(p1 + ns1, p2 + ns2)) cycle - call apply_particle(mask, (/s1,p1,s2,p2/), det2, ok, N_int) + tmp_array = (/s1,p1,s2,p2/) + call apply_particle(mask, tmp_array, det2, ok, N_int) if(.not. ok) cycle mono = (hmi == p1 .or. hma == p2 .or. hmi == p2 .or. hma == p1) if(mono) then @@ -1299,7 +1313,8 @@ subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2, coefs) do p1=1, mo_tot_num if(banned(p1 + ns1)) cycle if(banned_pair(p1 + ns1, p2 + ns2)) cycle - call apply_particle(mask, (/s1,p1,s2,p2/), det2, ok, N_int) + tmp_array = (/s1,p1,s2,p2/) + call apply_particle(mask, tmp_array, det2, ok, N_int) if(.not. ok) cycle mono = (h1 == p1 .or. h2 == p2) if(mono) then diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index a09e1bf2..bdb76db4 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -40,22 +40,7 @@ subroutine run_wf call wait_for_state(zmq_state,state) if(trim(state) /= 'selection') exit print *, 'Getting wave function' - call zmq_get_psi(zmq_to_qp_run_socket,1,energy,size(energy)) - integer :: j,k - do j=1,N_states_diag - do k=1,N_det - CI_eigenvectors(k,j) = psi_coef(k,j) - enddo - call get_s2_u0(psi_det,CI_eigenvectors(1,j),N_det,size(CI_eigenvectors,1),CI_eigenvectors_s2(j)) - enddo - if (.True.) then - do k=1,size(ci_electronic_energy) - ci_electronic_energy(k) = energy(k) - enddo - TOUCH ci_electronic_energy CI_eigenvectors_s2 CI_eigenvectors - endif - - call write_double(6,ci_energy,'Energy') + call zmq_get_psi(zmq_to_qp_run_socket,1,energy,N_states_diag) integer :: rc, i @@ -64,16 +49,39 @@ subroutine run_wf !$OMP PARALLEL PRIVATE(i) i = omp_get_thread_num() - call selection_dressing_slave_tcp(i) + call selection_dressing_slave_tcp(i, energy) !$OMP END PARALLEL end do end - -subroutine selection_dressing_slave_tcp(i) +subroutine update_energy(energy) implicit none - integer, intent(in) :: i + double precision, intent(in) :: energy(N_states_diag) + BEGIN_DOC +! Update energy when it is received from ZMQ + END_DOC + integer :: j,k + do j=1,N_states_diag + do k=1,N_det + CI_eigenvectors(k,j) = psi_coef(k,j) + enddo + call get_s2_u0(psi_det,CI_eigenvectors(1,j),N_det,size(CI_eigenvectors,1),CI_eigenvectors_s2(j)) + enddo + if (.True.) then + do k=1,size(ci_electronic_energy) + ci_electronic_energy(k) = energy(k) + enddo + TOUCH ci_electronic_energy CI_eigenvectors_s2 CI_eigenvectors + endif - call selection_slaved(0,i) + call write_double(6,ci_energy,'Energy') +end + +subroutine selection_dressing_slave_tcp(i,energy) + implicit none + double precision, intent(in) :: energy(N_states_diag) + integer, intent(in) :: i + + call selection_slaved(0,i,energy) end diff --git a/plugins/Selectors_full/selectors.irp.f b/plugins/Selectors_full/selectors.irp.f index 826dcc4b..6fbad9ec 100644 --- a/plugins/Selectors_full/selectors.irp.f +++ b/plugins/Selectors_full/selectors.irp.f @@ -48,7 +48,21 @@ END_PROVIDER enddo END_PROVIDER - BEGIN_PROVIDER [ double precision, psi_selectors_diag_h_mat, (psi_selectors_size) ] +BEGIN_PROVIDER [ double precision, psi_selectors_coef_transp, (N_states,psi_selectors_size) ] + implicit none + BEGIN_DOC + ! Transposed psi_selectors + END_DOC + integer :: i,k + + do i=1,N_det_selectors + do k=1,N_states + psi_selectors_coef_transp(k,i) = psi_selectors_coef(i,k) + enddo + enddo +END_PROVIDER + +BEGIN_PROVIDER [ double precision, psi_selectors_diag_h_mat, (psi_selectors_size) ] implicit none BEGIN_DOC ! Diagonal elements of the H matrix for each selectors @@ -58,6 +72,6 @@ END_PROVIDER do i = 1, N_det_selectors psi_selectors_diag_h_mat(i) = diag_H_mat_elem(psi_selectors(1,1,i),N_int) enddo - END_PROVIDER +END_PROVIDER diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index 9fa70d5e..e5a9f8ef 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -145,12 +145,12 @@ function new_zmq_to_qp_run_socket() rc = f77_zmq_setsockopt(new_zmq_to_qp_run_socket, ZMQ_SNDTIMEO, 120000, 4) if (rc /= 0) then - stop 'Unable to set send timout in new_zmq_to_qp_run_socket' + stop 'Unable to set send timeout in new_zmq_to_qp_run_socket' endif rc = f77_zmq_setsockopt(new_zmq_to_qp_run_socket, ZMQ_RCVTIMEO, 120000, 4) if (rc /= 0) then - stop 'Unable to set recv timout in new_zmq_to_qp_run_socket' + stop 'Unable to set recv timeout in new_zmq_to_qp_run_socket' endif rc = f77_zmq_connect(new_zmq_to_qp_run_socket, trim(qp_run_address)//':'//trim(zmq_port(0))) @@ -247,7 +247,12 @@ function new_zmq_pull_socket() stop 'Unable to set ZMQ_LINGER on pull socket' endif - rc = f77_zmq_setsockopt(new_zmq_pull_socket,ZMQ_RCVHWM,1000,4) + rc = f77_zmq_setsockopt(new_zmq_pull_socket,ZMQ_RCVBUF,100000000,4) + if (rc /= 0) then + stop 'Unable to set ZMQ_RCVBUF on pull socket' + endif + + rc = f77_zmq_setsockopt(new_zmq_pull_socket,ZMQ_RCVHWM,1,4) if (rc /= 0) then stop 'Unable to set ZMQ_RCVHWM on pull socket' endif @@ -295,11 +300,16 @@ function new_zmq_push_socket(thread) stop 'Unable to set ZMQ_LINGER on push socket' endif - rc = f77_zmq_setsockopt(new_zmq_push_socket,ZMQ_SNDHWM,1000,4) + rc = f77_zmq_setsockopt(new_zmq_push_socket,ZMQ_SNDHWM,1,4) if (rc /= 0) then stop 'Unable to set ZMQ_SNDHWM on push socket' endif + rc = f77_zmq_setsockopt(new_zmq_push_socket,ZMQ_SNDBUF,100000000,4) + if (rc /= 0) then + stop 'Unable to set ZMQ_RCVBUF on push socket' + endif + rc = f77_zmq_setsockopt(new_zmq_push_socket,ZMQ_IMMEDIATE,1,4) if (rc /= 0) then stop 'Unable to set ZMQ_IMMEDIATE on push socket' @@ -347,6 +357,11 @@ function new_zmq_sub_socket() stop 'Unable to set timeout in new_zmq_sub_socket' endif + rc = f77_zmq_setsockopt(new_zmq_sub_socket,ZMQ_CONFLATE,1,4) + if (rc /= 0) then + stop 'Unable to set conflate in new_zmq_sub_socket' + endif + rc = f77_zmq_setsockopt(new_zmq_sub_socket,ZMQ_SUBSCRIBE,"",0) if (rc /= 0) then stop 'Unable to subscribe new_zmq_sub_socket' @@ -431,7 +446,7 @@ subroutine end_zmq_pull_socket(zmq_socket_pull) ! stop 'error' ! endif - call sleep(1) ! see https://github.com/zeromq/libzmq/issues/1922 +! call sleep(1) ! see https://github.com/zeromq/libzmq/issues/1922 ! rc = f77_zmq_setsockopt(zmq_socket_pull,ZMQ_LINGER,10000,4) ! if (rc /= 0) then From 33f5f44fe57d6aa22eaa062fff79611016cfb33d Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 2 Aug 2016 13:45:17 +0200 Subject: [PATCH 076/216] Refactoring MRCC --- plugins/MRCC_Utils/mrcc_utils.irp.f | 392 ++++++++++++++-------------- 1 file changed, 200 insertions(+), 192 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 315006ff..85fd40e8 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -225,6 +225,7 @@ logical function is_generable(det1, det2, Nint) integer, external :: searchExc logical, external :: excEq double precision :: phase + integer*2 :: tmp_array(4) is_generable = .false. call get_excitation(det1, det2, exc, degree, phase, Nint) @@ -247,19 +248,20 @@ logical function is_generable(det1, det2, Nint) end if if(h1 + (s1-1)*mo_tot_num < h2 + (s2-1)*mo_tot_num) then - f = searchExc(hh_exists(1,1), (/s1, h1, s2, h2/), hh_shortcut(0)) + tmp_array = (/s1, h1, s2, h2/) else - f = searchExc(hh_exists(1,1), (/s2, h2, s1, h1/), hh_shortcut(0)) + tmp_array = (/s2, h2, s1, h1/) end if - if(f == -1) return - + f = searchExc(hh_exists(1,1), tmp_array, hh_shortcut(0)) + if(p1 + (s1-1)*mo_tot_num < p2 + (s2-1)*mo_tot_num) then - f = searchExc(pp_exists(1,hh_shortcut(f)), (/s1, p1, s2, p2/), hh_shortcut(f+1)-hh_shortcut(f)) + tmp_array = (/s1, p1, s2, p2/) else - f = searchExc(pp_exists(1,hh_shortcut(f)), (/s2, p2, s1, p1/), hh_shortcut(f+1)-hh_shortcut(f)) + tmp_array = (/s2, p2, s1, p1/) end if - - if(f /= -1) is_generable = .true. + f = searchExc(pp_exists(1,hh_shortcut(f)), tmp_array, hh_shortcut(f+1)-hh_shortcut(f)) + + is_generable = (f /= -1) end function @@ -542,187 +544,189 @@ END_PROVIDER END_PROVIDER -BEGIN_PROVIDER [ double precision, dIj_unique, (hh_shortcut(hh_shortcut(0)+1)-1, N_states) ] - implicit none - logical :: ok - integer :: i, j, k, s, II, pp, hh, ind, wk, nex, a_col, at_row - integer, external :: searchDet, unsortedSearchDet - integer(bit_kind) :: myDet(N_int, 2), myMask(N_int, 2) - integer :: N, INFO, AtA_size, r1, r2 - double precision , allocatable:: B(:), AtB(:), AtA_val(:), A_val(:,:), x(:), x_new(:), A_val_mwen(:) - double precision :: t, norm, cx - integer, allocatable :: A_ind(:,:), lref(:), AtA_ind(:), A_ind_mwen(:), col_shortcut(:), N_col(:) - - - - nex = hh_shortcut(hh_shortcut(0)+1)-1 - print *, "TI", nex, N_det_non_ref - allocate(A_ind(N_det_ref+1, nex), A_val(N_det_ref+1, nex)) - allocate(AtA_ind(N_det_ref * nex), AtA_val(N_det_ref * nex)) !!!!! MAY BE TOO SMALL ? !!!!!!!! - allocate(x(nex), AtB(nex)) - allocate(A_val_mwen(nex), A_ind_mwen(nex)) - allocate(N_col(nex), col_shortcut(nex), B(N_det_non_ref)) - allocate (x_new(nex)) - - do s = 1, N_states - - A_val = 0d0 - A_ind = 0 - AtA_ind = 0 - AtA_val = 0d0 - x = 0d0 - AtB = 0d0 - A_val_mwen = 0d0 - A_ind_mwen = 0 - N_col = 0 - col_shortcut = 0 - B = 0d0 - x_new = 0d0 - - !$OMP PARALLEL DO schedule(static,10) default(none) shared(psi_non_ref, hh_exists, pp_exists, N_int, A_val, A_ind) & - !$OMP shared(s, hh_shortcut, psi_ref_coef, N_det_non_ref, psi_non_ref_sorted, psi_non_ref_sorted_idx, psi_ref, N_det_ref) & - !$OMP private(lref, pp, II, ok, myMask, myDet, ind, wk) - do hh = 1, hh_shortcut(0) - do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 - allocate(lref(N_det_non_ref)) - lref = 0 - do II = 1, N_det_ref - call apply_hole(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) - if(.not. ok) cycle - call apply_particle(myMask, pp_exists(1, pp), myDet, ok, N_int) - if(.not. ok) cycle - ind = searchDet(psi_non_ref_sorted(1,1,1), myDet(1,1), N_det_non_ref, N_int) - if(ind /= -1) then - lref(psi_non_ref_sorted_idx(ind)) = II - end if - end do - wk = 0 - do i=1, N_det_non_ref - if(lref(i) /= 0) then - wk += 1 - A_val(wk, pp) = psi_ref_coef(lref(i), s) - A_ind(wk, pp) = i - end if - end do - deallocate(lref) - end do - end do - !$OMP END PARALLEL DO - - AtB = 0d0 - AtA_size = 0 - wk = 0 - col_shortcut = 0 - N_col = 0 - !$OMP PARALLEL DO schedule(dynamic, 100) default(none) shared(k, psi_non_ref_coef, A_ind, A_val, x, N_det_ref, nex, N_det_non_ref) & - !$OMP private(at_row, a_col, t, i, r1, r2, wk, A_ind_mwen, A_val_mwen) & - !$OMP shared(col_shortcut, N_col, AtB, AtA_size, AtA_val, AtA_ind, s) - do at_row = 1, nex - wk = 0 - if(mod(at_row, 10000) == 0) print *, "AtA", at_row, "/", nex - do i=1,N_det_ref - if(A_ind(i, at_row) == 0) exit - AtB(at_row) = AtB(at_row) + psi_non_ref_coef(A_ind(i, at_row), s) * A_val(i, at_row) - end do - do a_col = 1, nex - t = 0d0 - r1 = 1 - r2 = 1 - do while ((A_ind(r1, at_row) /= 0).and.(A_ind(r2, a_col) /= 0)) - if(A_ind(r1, at_row) < A_ind(r2, a_col)) then - r1 += 1 - else if(A_ind(r1, at_row) > A_ind(r2, a_col)) then - r2 += 1 - else - t = t - A_val(r1, at_row) * A_val(r2, a_col) - r1 += 1 - r2 += 1 - end if - end do - - if(a_col == at_row) then - t = (t + 1d0) - end if - if(t /= 0d0) then - wk += 1 - A_ind_mwen(wk) = a_col - A_val_mwen(wk) = t - end if - end do - - if(wk /= 0) then - !$OMP CRITICAL - col_shortcut(at_row) = AtA_size+1 - N_col(at_row) = wk - AtA_ind(AtA_size+1:AtA_size+wk) = A_ind_mwen(:wk) - AtA_val(AtA_size+1:AtA_size+wk) = A_val_mwen(:wk) - AtA_size += wk - !$OMP END CRITICAL - end if - end do - - x = AtB - if(AtA_size > size(AtA_val)) stop "SIZA" - print *, "ATA SIZE", ata_size - integer :: iproc, omp_get_thread_num - iproc = omp_get_thread_num() - do i=1,nex - x_new(i) = 0.D0 - enddo - - do k=0,100000 - !$OMP PARALLEL DO default(shared) - do i=1,nex - x_new(i) = AtB(i) - enddo - - !$OMP PARALLEL DO default(shared) private(cx, i) - do a_col = 1, nex - cx = 0d0 - do i=col_shortcut(a_col), col_shortcut(a_col) + N_col(a_col) - 1 - cx += x(AtA_ind(i)) * AtA_val(i) + BEGIN_PROVIDER [ double precision, dIj_unique, (hh_shortcut(hh_shortcut(0)+1)-1, N_states) ] +&BEGIN_PROVIDER [ double precision, rho_mrcc, (N_det_non_ref, N_states) ] + implicit none + logical :: ok + integer :: i, j, k, s, II, pp, hh, ind, wk, nex, a_col, at_row + integer, external :: searchDet, unsortedSearchDet + integer(bit_kind) :: myDet(N_int, 2), myMask(N_int, 2) + integer :: N, INFO, AtA_size, r1, r2 + double precision , allocatable :: AtB(:), AtA_val(:), A_val(:,:), x(:), x_new(:), A_val_mwen(:) + double precision :: t, norm, cx, res + integer, allocatable :: A_ind(:,:), lref(:), AtA_ind(:), A_ind_mwen(:), col_shortcut(:), N_col(:) + + + + nex = hh_shortcut(hh_shortcut(0)+1)-1 + print *, "TI", nex, N_det_non_ref + allocate(A_ind(N_det_ref+1, nex), A_val(N_det_ref+1, nex)) + allocate(AtA_ind(N_det_ref * nex), AtA_val(N_det_ref * nex)) !!!!! MAY BE TOO SMALL ? !!!!!!!! + allocate(x(nex), AtB(nex)) + allocate(A_val_mwen(nex), A_ind_mwen(nex)) + allocate(N_col(nex), col_shortcut(nex)) + allocate (x_new(nex)) + + do s = 1, N_states + + A_val = 0d0 + A_ind = 0 + AtA_ind = 0 + AtA_val = 0d0 + x = 0d0 + A_val_mwen = 0d0 + A_ind_mwen = 0 + N_col = 0 + col_shortcut = 0 + + !$OMP PARALLEL DO schedule(static,10) default(none) shared(psi_non_ref, hh_exists, pp_exists, N_int, A_val, A_ind)& + !$OMP shared(s, hh_shortcut, psi_ref_coef, N_det_non_ref, psi_non_ref_sorted, psi_non_ref_sorted_idx, psi_ref, N_det_ref)& + !$OMP private(lref, pp, II, ok, myMask, myDet, ind, wk) + do hh = 1, hh_shortcut(0) + do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 + allocate(lref(N_det_non_ref)) + lref = 0 + do II = 1, N_det_ref + call apply_hole(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) + if(.not. ok) cycle + call apply_particle(myMask, pp_exists(1, pp), myDet, ok, N_int) + if(.not. ok) cycle + ind = searchDet(psi_non_ref_sorted(1,1,1), myDet(1,1), N_det_non_ref, N_int) + if(ind /= -1) then + lref(psi_non_ref_sorted_idx(ind)) = II + end if + end do + wk = 0 + do i=1, N_det_non_ref + if(lref(i) /= 0) then + wk += 1 + A_val(wk, pp) = psi_ref_coef(lref(i), s) + A_ind(wk, pp) = i + end if + end do + deallocate(lref) + end do end do - x_new(a_col) += cx + !$OMP END PARALLEL DO + + AtB = 0d0 + AtA_size = 0 + wk = 0 + col_shortcut = 0 + N_col = 0 + !$OMP PARALLEL DO schedule(dynamic, 100) default(none) shared(k, psi_non_ref_coef, A_ind, A_val, x, N_det_ref, nex, N_det_non_ref)& + !$OMP private(at_row, a_col, t, i, r1, r2, wk, A_ind_mwen, A_val_mwen)& + !$OMP shared(col_shortcut, N_col, AtB, AtA_size, AtA_val, AtA_ind, s) + do at_row = 1, nex + wk = 0 + if(mod(at_row, 10000) == 0) print *, "AtA", at_row, "/", nex + do i=1,N_det_ref + if(A_ind(i, at_row) == 0) exit + AtB(at_row) = AtB(at_row) + psi_non_ref_coef(A_ind(i, at_row), s) * A_val(i, at_row) + end do + do a_col = 1, nex + t = 0d0 + r1 = 1 + r2 = 1 + do while ((A_ind(r1, at_row) /= 0).and.(A_ind(r2, a_col) /= 0)) + if(A_ind(r1, at_row) < A_ind(r2, a_col)) then + r1 += 1 + else if(A_ind(r1, at_row) > A_ind(r2, a_col)) then + r2 += 1 + else + t = t - A_val(r1, at_row) * A_val(r2, a_col) + r1 += 1 + r2 += 1 + end if + end do + + if(a_col == at_row) then + t = (t + 1d0) + end if + if(t /= 0d0) then + wk += 1 + A_ind_mwen(wk) = a_col + A_val_mwen(wk) = t + end if + end do + + if(wk /= 0) then + !$OMP CRITICAL + col_shortcut(at_row) = AtA_size+1 + N_col(at_row) = wk + AtA_ind(AtA_size+1:AtA_size+wk) = A_ind_mwen(:wk) + AtA_val(AtA_size+1:AtA_size+wk) = A_val_mwen(:wk) + AtA_size += wk + !$OMP END CRITICAL + end if + end do + + if(AtA_size > size(AtA_val)) stop "SIZA" + print *, "ATA SIZE", ata_size + integer :: iproc, omp_get_thread_num + iproc = omp_get_thread_num() + do i=1,nex + x(i) = AtB(i) + enddo + + do k=0,100000 + !$OMP PARALLEL default(shared) private(cx, i, j, a_col) + + !$OMP DO + do i=1,N_det_non_ref + rho_mrcc(i,s) = 0.d0 + enddo + !$OMP END DO + + !$OMP DO + do a_col = 1, nex + cx = 0d0 + do i=col_shortcut(a_col), col_shortcut(a_col) + N_col(a_col) - 1 + cx = cx + x(AtA_ind(i)) * AtA_val(i) + end do + x_new(a_col) = AtB(a_col) + cx + end do + !$OMP END DO + + !$OMP END PARALLEL + + res = 0.d0 + do a_col=1,nex + do j=1,N_det_non_ref + i = A_ind(j,a_col) + if (i==0) exit + rho_mrcc(i,s) = rho_mrcc(i,s) + A_val(j,a_col) * X_new(a_col) + enddo + res = res + (X_new(a_col) - X(a_col))**2 + X(a_col) = X_new(a_col) + end do + + if(mod(k, 100) == 0) then + print *, "residu ", k, res + end if + + if(res < 1d-16) exit + end do + + norm = 0.d0 + do i=1,N_det_non_ref + norm = norm + rho_mrcc(i,s)*rho_mrcc(i,s) + enddo + do i=1,N_det_ref + norm = norm + psi_ref_coef(i,s)*psi_ref_coef(i,s) + enddo + + print *, k, "res : ", res, "norm : ", sqrt(norm) + + dIj_unique(:size(X), s) = X(:) + + do i=1,N_det_non_ref + rho_mrcc(i,s) = psi_non_ref_coef(i,s) / rho_mrcc(i,s) + enddo + end do - !$OMP END PARALLEL DO - double precision :: norm_cas - norm_cas = 0d0 - do i = 1, N_det_ref - norm_cas += psi_ref_coef(i,s)**2 - end do - - norm = 0d0 - t = 0d0 - - do j=1, size(X) - t = t + X_new(j) * X_new(j) - end do - - - t = (1d0 - norm_cas ) / t - x_new = x_new * sqrt(t) - - do j=1, size(X) - norm += (X_new(j) - X(j))**2 - x(j) = x_new(j) - end do - - - if(mod(k, 100) == 0) then - print *, "residu ", k, norm, "norm t", sqrt(t) - end if - - if(norm < 1d-16) exit - end do - print *, "CONVERGENCE : ", norm - - dIj_unique(:size(X), s) = X(:) - - - end do - - - print *, "done" + + print *, "done" END_PROVIDER @@ -767,6 +771,7 @@ double precision function get_dij(det1, det2, s, Nint) integer, external :: searchExc logical, external :: excEq double precision :: phase + integer*2 :: tmp_array(4) get_dij = 0d0 call get_excitation(det1, det2, exc, degree, phase, Nint) @@ -787,18 +792,21 @@ double precision function get_dij(det1, det2, s, Nint) end if if(h1 + (s1-1)*mo_tot_num < h2 + (s2-1)*mo_tot_num) then - f = searchExc(hh_exists(1,1), (/s1, h1, s2, h2/), hh_shortcut(0)) + tmp_array = (/s1, h1, s2, h2/) else - f = searchExc(hh_exists(1,1), (/s2, h2, s1, h1/), hh_shortcut(0)) + tmp_array = (/s2, h2, s1, h1/) end if + f = searchExc(hh_exists(1,1), tmp_array, hh_shortcut(0)) + if(f == -1) return if(p1 + (s1-1)*mo_tot_num < p2 + (s2-1)*mo_tot_num) then - t = searchExc(pp_exists(1,hh_shortcut(f)), (/s1, p1, s2, p2/), hh_shortcut(f+1)-hh_shortcut(f)) + tmp_array = (/s1, p1, s2, p2/) else - t = searchExc(pp_exists(1,hh_shortcut(f)), (/s2, p2, s1, p1/), hh_shortcut(f+1)-hh_shortcut(f)) + tmp_array = (/s2, p2, s1, p1/) end if - + t = searchExc(pp_exists(1,hh_shortcut(f)), tmp_array, hh_shortcut(f+1)-hh_shortcut(f)) + if(t /= -1) then get_dij = dIj_unique(t - 1 + hh_shortcut(f), s) end if From cfaf2e14e09c3436c7fda0e50528cce7755b3547 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 2 Aug 2016 14:03:34 +0200 Subject: [PATCH 077/216] Added rho in MRCC-nolambda --- plugins/MRCC_Utils/mrcc_utils.irp.f | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 85fd40e8..4b6203cb 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -663,8 +663,6 @@ END_PROVIDER if(AtA_size > size(AtA_val)) stop "SIZA" print *, "ATA SIZE", ata_size - integer :: iproc, omp_get_thread_num - iproc = omp_get_thread_num() do i=1,nex x(i) = AtB(i) enddo @@ -705,7 +703,7 @@ END_PROVIDER print *, "residu ", k, res end if - if(res < 1d-16) exit + if(res < 1d-10) exit end do norm = 0.d0 @@ -754,6 +752,7 @@ double precision function get_dij_index(II, i, s, Nint) if(lambda_type == 0) then get_dij_index = get_dij(psi_ref(1,1,II), psi_non_ref(1,1,i), s, Nint) + get_dij_index = get_dij_index * rho_mrcc(i,s) else call i_h_j(psi_ref(1,1,II), psi_non_ref(1,1,i), Nint, HIi) get_dij_index = HIi * lambda_mrcc(s, i) From 76f2953a02d433e8cea356b7429af11ef2a8e7e0 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 2 Aug 2016 17:23:39 +0200 Subject: [PATCH 078/216] Select doubles before singles in zmq --- plugins/Full_CI_ZMQ/selection.irp.f | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 5af0e206..13dcdc26 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -29,7 +29,7 @@ subroutine selection_slaved(thread,iproc,energy) integer(ZMQ_PTR), external :: new_zmq_push_socket integer(ZMQ_PTR) :: zmq_socket_push - type(selection_buffer) :: buf + type(selection_buffer) :: buf, buf2 logical :: done double precision :: pt2(N_states) @@ -56,7 +56,9 @@ subroutine selection_slaved(thread,iproc,energy) integer :: i_generator, N read (task,*) i_generator, N if(buf%N == 0) then + ! Only first time call create_selection_buffer(N, N*2, buf) + call create_selection_buffer(N, N*3, buf2) else if(N /= buf%N) stop "N changed... wtf man??" end if @@ -72,10 +74,14 @@ subroutine selection_slaved(thread,iproc,energy) end do if(ctask > 0) then call push_selection_results(zmq_socket_push, pt2, buf, task_id(1), ctask) + do i=1,buf%cur + call add_to_selection_buffer(buf2, buf%det(1,1,i), buf%val(i)) + enddo + call sort_selection_buffer(buf2) + buf%mini = buf2%mini pt2 = 0d0 buf%cur = 0 end if - ctask = 0 end if @@ -185,8 +191,8 @@ subroutine select_connected(i_generator,E0,pt2,b) particle_mask(k,:) = hole_mask(k,:) enddo - call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) + call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) enddo end @@ -256,7 +262,7 @@ subroutine sort_selection_buffer(b) b%det(:,:,nmwen+1:) = 0_bit_kind b%val(:nmwen) = vals(:) b%val(nmwen+1:) = 0d0 - b%mini = dabs(b%val(b%N)) + b%mini = max(b%mini,dabs(b%val(b%N))) b%cur = nmwen end subroutine @@ -545,10 +551,13 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p do ispin1=1,2 do ispin2=1,ispin1 integer :: i_hole1, i_hole2, j_hole, k_hole - do i1=1, N_holes(ispin1) - ib = 1 - if(ispin1 == ispin2) ib = i1+1 - do i2=ib, N_holes(ispin2) + do i1=N_holes(ispin1),1,-1 ! Generate low excitations first + if(ispin1 == ispin2) then + ib = i1+1 + else + ib = 1 + endif + do i2=N_holes(ispin2),ib,-1 ! Generate low excitations first ion_det(:,:) = psi_det_generators(:,:,i_generator) i_hole1 = hole_list(i1,ispin1) @@ -721,7 +730,8 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p else e_pert(k) = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) endif - if(dabs(e_pert(k)) > dabs(e_pertm)) e_pertm = e_pert(k) + e_pertm += dabs(e_pert(k)) +! if(dabs(e_pert(k)) > dabs(e_pertm)) e_pertm = e_pert(k) pt2(k) += e_pert(k) enddo if(dabs(e_pertm) > dabs(buf%mini)) then From a6fa9ddd888c5c765dbcfcab2246ba2740c1647f Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 2 Aug 2016 17:44:41 +0200 Subject: [PATCH 079/216] Accelerated queue --- ocaml/Queuing_system.ml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ocaml/Queuing_system.ml b/ocaml/Queuing_system.ml index 78abb185..29a60538 100644 --- a/ocaml/Queuing_system.ml +++ b/ocaml/Queuing_system.ml @@ -9,6 +9,7 @@ type t = clients : Id.Client.t Set.Poly.t; next_client_id : Id.Client.t; next_task_id : Id.Task.t; + number_of_queued : int; } @@ -20,6 +21,7 @@ let create () = clients = Set.Poly.empty; next_client_id = Id.Client.of_int 1; next_task_id = Id.Task.of_int 1; + number_of_queued = 0; } @@ -33,6 +35,7 @@ let add_task ~task q = queued = task_id :: q.queued ; tasks = Map.add q.tasks ~key:task_id ~data:task ; next_task_id = Id.Task.increment task_id ; + number_of_queued = q.number_of_queued + 1; } @@ -59,6 +62,7 @@ let pop_task ~client_id q = { q with queued = new_queue ; running = Map.add running ~key:task_id ~data:client_id ; + number_of_queued = q.number_of_queued - 1; } in new_q, Some task_id, (Map.find q.tasks task_id) | [] -> q, None, None @@ -103,7 +107,7 @@ let number q = Map.length q.tasks let number_of_queued q = - List.length q.queued + q.number_of_queued let number_of_running q = Map.length q.running From ff2dcf069ecfb908b9e9ed72387906885f893bf6 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 3 Aug 2016 00:18:53 +0200 Subject: [PATCH 080/216] Multiple generators per task --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 12 ++++++++-- plugins/Full_CI_ZMQ/selection.irp.f | 8 ++++--- plugins/Full_CI_ZMQ/selection_slave.irp.f | 2 -- plugins/MRCC_Utils/mrcc_utils.irp.f | 28 ++++++++++++++++++++--- plugins/mrcepa0/dressing.irp.f | 2 +- 5 files changed, 41 insertions(+), 11 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 02461ee3..0577a408 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -132,8 +132,16 @@ subroutine ZMQ_selection(N, pt2) call zmq_put_psi(zmq_to_qp_run_socket,1,ci_electronic_energy,size(ci_electronic_energy)) call zmq_set_running(zmq_to_qp_run_socket) call create_selection_buffer(N, N*2, b) - do i= N_det_generators, 1, -1 - write(task,*) i, N + + integer :: i_generator, i_generator_start, i_generator_max, step +! step = int(max(1.,10*elec_num/mo_tot_num) + + step = int(10000000.d0 / dble(N_int * N_states * elec_num * elec_num * mo_tot_num * mo_tot_num )) + step = max(1,step) + do i= N_det_generators, 1, -step + i_generator_start = max(i-step+1,1) + i_generator_max = i + write(task,*) i_generator_start, i_generator_max, 1, N call add_task_to_taskserver(zmq_to_qp_run_socket,task) end do diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 13dcdc26..b31e1977 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -53,8 +53,8 @@ subroutine selection_slaved(thread,iproc,energy) if (done) then ctask = ctask - 1 else - integer :: i_generator, N - read (task,*) i_generator, N + integer :: i_generator, i_generator_start, i_generator_max, step, N + read (task,*) i_generator_start, i_generator_max, step, N if(buf%N == 0) then ! Only first time call create_selection_buffer(N, N*2, buf) @@ -64,7 +64,9 @@ subroutine selection_slaved(thread,iproc,energy) end if !print *, "psi_selectors_coef ", psi_selectors_coef(N_det_selectors-5:N_det_selectors, 1) !call debug_det(psi_selectors(1,1,N_det_selectors), N_int) - call select_connected(i_generator,energy,pt2,buf) + do i_generator=i_generator_start,i_generator_max,step + call select_connected(i_generator,energy,pt2,buf) + enddo endif if(done .or. ctask == size(task_id)) then diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index bdb76db4..7eeae798 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -25,9 +25,7 @@ subroutine run_wf integer(ZMQ_PTR) :: zmq_to_qp_run_socket double precision :: energy(N_states_diag) character*(64) :: state - integer :: oki - oki = 0 call provide_everything zmq_context = f77_zmq_ctx_new () diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 4b6203cb..1d12d569 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -718,10 +718,32 @@ END_PROVIDER dIj_unique(:size(X), s) = X(:) - do i=1,N_det_non_ref - rho_mrcc(i,s) = psi_non_ref_coef(i,s) / rho_mrcc(i,s) + norm = 0.d0 + do i=1,N_det_ref + norm = norm + psi_ref_coef(i,s)*psi_ref_coef(i,s) enddo - + double precision :: f + do i=1,N_det_non_ref + f = psi_non_ref_coef(i,s) / rho_mrcc(i,s) + ! Avoid numerical instabilities + f = min(f, 3.d0) + f = max(f,-3.d0) +! norm = norm + (psi_non_ref_coef(i,s) * f * rho_mrcc(i,s)) + norm = norm + ( f * rho_mrcc(i,s))**2 + rho_mrcc(i,s) = f + enddo + + print *, ' = ', norm + + f = 1.d0/norm + norm = 0.d0 + do i=1,N_det_ref + norm = norm + psi_ref_coef(i,s)*psi_ref_coef(i,s) + enddo + do i=1,N_det_non_ref + rho_mrcc(i,s) = rho_mrcc(i,s) * f + enddo + end do print *, "done" diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 3a91f42e..88cd2c85 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -23,7 +23,7 @@ use bitmasks do gen= 1, N_det_generators allocate(buf(N_int, 2, N_det_non_ref)) iproc = omp_get_thread_num() + 1 - if(mod(gen, 10) == 0) print *, "mrcc ", gen, "/", N_det_generators + if(mod(gen, 1000) == 0) print *, "mrcc ", gen, "/", N_det_generators do h=1, hh_shortcut(0) call apply_hole(psi_det_generators(1,1,gen), hh_exists(1, h), mask, ok, N_int) if(.not. ok) cycle From 8b530a6db6f476943ec56799b40aca6198688346 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 4 Aug 2016 15:15:14 +0200 Subject: [PATCH 081/216] Added PT2 to FCI ZMQ --- config/sse4_avx2.cfg | 62 ++++++++++++++++++++++ plugins/Full_CI_ZMQ/fci_zmq.irp.f | 31 ++++++----- src/Determinants/davidson.irp.f | 2 +- src/Determinants/s2.irp.f | 88 +++++++++++++++---------------- 4 files changed, 121 insertions(+), 62 deletions(-) create mode 100644 config/sse4_avx2.cfg diff --git a/config/sse4_avx2.cfg b/config/sse4_avx2.cfg new file mode 100644 index 00000000..eabf75a3 --- /dev/null +++ b/config/sse4_avx2.cfg @@ -0,0 +1,62 @@ +# Common flags +############## +# +# -mkl=[parallel|sequential] : Use the MKL library +# --ninja : Allow the utilisation of ninja. It is mandatory ! +# --align=32 : Align all provided arrays on a 32-byte boundary +# +[COMMON] +FC : ifort +LAPACK_LIB : -mkl=parallel +IRPF90 : irpf90 +IRPF90_FLAGS : --ninja --align=32 + +# Global options +################ +# +# 1 : Activate +# 0 : Deactivate +# +[OPTION] +MODE : OPT ; [ OPT | PROFILE | DEBUG ] : Chooses the section below +CACHE : 1 ; Enable cache_compile.py +OPENMP : 1 ; Append OpenMP flags + +# Optimization flags +#################### +# +# -xHost : Compile a binary optimized for the current architecture +# -O2 : O3 not better than O2. +# -ip : Inter-procedural optimizations +# -ftz : Flushes denormal results to zero +# +[OPT] +FCFLAGS : -axSSE4.2,AVX,CORE-AVX2 -O2 -ip -ftz -g -traceback + +# Profiling flags +################# +# +[PROFILE] +FC : -p -g +FCFLAGS : -xSSE4.2 -O2 -ip -ftz + +# Debugging flags +################# +# +# -traceback : Activate backtrace on runtime +# -fpe0 : All floating point exaceptions +# -C : Checks uninitialized variables, array subscripts, etc... +# -g : Extra debugging information +# -xSSE2 : Valgrind needs a very simple x86 executable +# +[DEBUG] +FC : -g -traceback +FCFLAGS : -xSSE2 -C -fpe0 + +# OpenMP flags +################# +# +[OPENMP] +FC : -openmp +IRPF90_FLAGS : --openmp + diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 0577a408..892e0e4b 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -38,7 +38,6 @@ program fci_zmq 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) call ZMQ_selection(max(1024-N_det, N_det), pt2) PROVIDE psi_coef @@ -90,21 +89,21 @@ program fci_zmq N_det = min(N_det_max,N_det) touch N_det psi_det psi_coef call diagonalize_CI -! if(do_pt2_end)then -! print*,'Last iteration only to compute the PT2' -! threshold_selectors = 1.d0 -! threshold_generators = 0.999d0 -! call H_apply_FCI_PT2(pt2, norm_pert, H_pert_diag, N_st) -! -! print *, 'Final step' -! print *, 'N_det = ', N_det -! print *, 'N_states = ', N_states -! print *, 'PT2 = ', pt2 -! print *, 'E = ', CI_energy -! print *, 'E+PT2 = ', CI_energy+pt2 -! print *, '-----' -! call ezfio_set_full_ci_energy_pt2(CI_energy+pt2) -! endif + if(do_pt2_end)then + print*,'Last iteration only to compute the PT2' + threshold_selectors = 1.d0 + threshold_generators = 0.9999d0 + E_CI_before = CI_energy + call ZMQ_selection(1, pt2) + print *, 'Final step' + print *, 'N_det = ', N_det + print *, 'N_states = ', N_states + print *, 'PT2 = ', pt2 + print *, 'E = ', E_CI_before + print *, 'E+PT2 = ', E_CI_before+pt2 + print *, '-----' + call ezfio_set_full_ci_energy_pt2(E_CI_before+pt2) + endif call save_wavefunction end diff --git a/src/Determinants/davidson.irp.f b/src/Determinants/davidson.irp.f index e7480ca2..5bc3768e 100644 --- a/src/Determinants/davidson.irp.f +++ b/src/Determinants/davidson.irp.f @@ -530,7 +530,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun !$OMP END PARALLEL write(iunit,'(X,I3,X,100(X,F16.10,X,E16.6))') iter, to_print(:,1:N_st) - call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_st,converged) + call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_states,converged) if (converged) then exit endif diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index 9a60dbd9..96e342cd 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -215,54 +215,52 @@ subroutine get_s2_u0(psi_keys_tmp,psi_coefs_tmp,n,nmax,s2) end subroutine get_uJ_s2_uI(psi_keys_tmp,psi_coefs_tmp,n,nmax_coefs,nmax_keys,s2,nstates) - implicit none - use bitmasks - integer(bit_kind), intent(in) :: psi_keys_tmp(N_int,2,nmax_keys) - integer, intent(in) :: n,nmax_coefs,nmax_keys,nstates - double precision, intent(in) :: psi_coefs_tmp(nmax_coefs,nstates) - double precision, intent(out) :: s2(nstates,nstates) - double precision :: s2_tmp,accu - integer :: i,j,l,jj,ll,kk - integer, allocatable :: idx(:) - double precision, allocatable :: tmp(:,:) - BEGIN_DOC - ! returns the matrix elements of S^2 "s2(i,j)" between the "nstates" states - ! psi_coefs_tmp(:,i) and psi_coefs_tmp(:,j) - END_DOC - s2 = 0.d0 - do ll = 1, nstates - do jj = 1, nstates - accu = 0.d0 - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE (i,j,kk,idx,tmp,s2_tmp) & - !$OMP SHARED (ll,jj,psi_keys_tmp,psi_coefs_tmp,N_int,n,nstates) & - !$OMP REDUCTION(+:accu) - allocate(idx(0:n)) - !$OMP DO SCHEDULE(dynamic) - do i = 1, n - call get_s2(psi_keys_tmp(1,1,i),psi_keys_tmp(1,1,i),s2_tmp,N_int) - accu += psi_coefs_tmp(i,ll) * s2_tmp * psi_coefs_tmp(i,jj) - call filter_connected(psi_keys_tmp,psi_keys_tmp(1,1,i),N_int,i-1,idx) - do kk=1,idx(0) - j = idx(kk) - call get_s2(psi_keys_tmp(1,1,i),psi_keys_tmp(1,1,j),s2_tmp,N_int) - accu += psi_coefs_tmp(i,ll) * s2_tmp * psi_coefs_tmp(j,jj) + psi_coefs_tmp(i,jj) * s2_tmp * psi_coefs_tmp(j,ll) + implicit none + use bitmasks + integer(bit_kind), intent(in) :: psi_keys_tmp(N_int,2,nmax_keys) + integer, intent(in) :: n,nmax_coefs,nmax_keys,nstates + double precision, intent(in) :: psi_coefs_tmp(nmax_coefs,nstates) + double precision, intent(out) :: s2(nstates,nstates) + double precision :: s2_tmp,accu + integer :: i,j,l,jj,ll,kk + integer, allocatable :: idx(:) + BEGIN_DOC + ! returns the matrix elements of S^2 "s2(i,j)" between the "nstates" states + ! psi_coefs_tmp(:,i) and psi_coefs_tmp(:,j) + END_DOC + s2 = 0.d0 + do ll = 1, nstates + do jj = 1, nstates + accu = 0.d0 + !$OMP PARALLEL DEFAULT(NONE) & + !$OMP PRIVATE (i,j,kk,idx,s2_tmp) & + !$OMP SHARED (ll,jj,psi_keys_tmp,psi_coefs_tmp,N_int,n,nstates)& + !$OMP REDUCTION(+:accu) + allocate(idx(0:n)) + !$OMP DO SCHEDULE(dynamic) + do i = n,1,-1 ! Better OMP scheduling + call get_s2(psi_keys_tmp(1,1,i),psi_keys_tmp(1,1,i),s2_tmp,N_int) + accu += psi_coefs_tmp(i,ll) * s2_tmp * psi_coefs_tmp(i,jj) + call filter_connected(psi_keys_tmp,psi_keys_tmp(1,1,i),N_int,i-1,idx) + do kk=1,idx(0) + j = idx(kk) + call get_s2(psi_keys_tmp(1,1,i),psi_keys_tmp(1,1,j),s2_tmp,N_int) + accu += psi_coefs_tmp(i,ll) * s2_tmp * psi_coefs_tmp(j,jj) + psi_coefs_tmp(i,jj) * s2_tmp * psi_coefs_tmp(j,ll) + enddo + enddo + !$OMP END DO + deallocate(idx) + !$OMP END PARALLEL + s2(ll,jj) += accu enddo - enddo - !$OMP END DO NOWAIT - deallocate(idx) - !$OMP BARRIER - !$OMP END PARALLEL - s2(ll,jj) += accu enddo - enddo - do i = 1, nstates - do j =i+1,nstates - accu = 0.5d0 * (s2(i,j) + s2(j,i)) - s2(i,j) = accu - s2(j,i) = accu + do i = 1, nstates + do j =i+1,nstates + accu = 0.5d0 * (s2(i,j) + s2(j,i)) + s2(i,j) = accu + s2(j,i) = accu + enddo enddo - enddo end subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nmax_coefs,nstates,s2_eigvalues) From d89b82045c5b787f6f2f1ea5acfe0d9c2b5feeb2 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 4 Aug 2016 15:17:01 +0200 Subject: [PATCH 082/216] Added S^2 to MRCC --- plugins/MRCC_Utils/davidson.irp.f | 32 +++++++ plugins/MRCC_Utils/mrcc_utils.irp.f | 125 ++++++++++++++++++++++++++-- 2 files changed, 148 insertions(+), 9 deletions(-) diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index 66f4975a..49aff533 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -364,6 +364,38 @@ end +subroutine u0_H_u_0_mrcc(e_0,u_0,n,keys_tmp,Nint,istate) + use bitmasks + implicit none + BEGIN_DOC + ! Computes e_0 = / + ! + ! n : number of determinants + ! + END_DOC + integer, intent(in) :: n,Nint + double precision, intent(out) :: e_0 + double precision, intent(in) :: u_0(n) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + integer,intent(in) :: istate + + double precision :: H_jj(n) + double precision :: v_0(n) + double precision :: u_dot_u,u_dot_v,diag_H_mat_elem + integer :: i,j + do i = 1, n + H_jj(i) = diag_H_mat_elem(keys_tmp(1,1,i),Nint) + enddo + + do i=1,N_det_ref + H_jj(idx_ref(i)) += delta_ii(istate,i) + enddo + + call H_u_0_mrcc(v_0,u_0,H_jj,n,keys_tmp,Nint,istate) + e_0 = u_dot_v(v_0,u_0,n)/u_dot_u(u_0,n) +end + + subroutine H_u_0_mrcc(v_0,u_0,H_jj,n,keys_tmp,Nint,istate) use bitmasks implicit none diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 1d12d569..b6dd2bd1 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -119,9 +119,23 @@ END_PROVIDER &BEGIN_PROVIDER [ double precision, CI_eigenvectors_s2_dressed, (N_states_diag) ] implicit none BEGIN_DOC - ! Eigenvectors/values of the CI matrix + ! Eigenvectors/values of the dressed CI matrix END_DOC - integer :: i,j + double precision :: ovrlp,u_dot_v + integer :: i_good_state + integer, allocatable :: index_good_state_array(:) + logical, allocatable :: good_state_array(:) + double precision, allocatable :: s2_values_tmp(:) + integer :: i_other_state + double precision, allocatable :: eigenvectors(:,:), eigenvalues(:) + integer :: i_state + double precision :: s2,e_0 + integer :: i,j,k + double precision, allocatable :: s2_eigvalues(:) + double precision, allocatable :: e_array(:) + integer, allocatable :: iorder(:) + + integer, parameter :: mrcc_state = 1 do j=1,N_states_diag do i=1,N_det @@ -131,14 +145,17 @@ END_PROVIDER if (diag_algorithm == "Davidson") then - integer :: istate - istate = 1 - call davidson_diag_mrcc(psi_det,CI_eigenvectors_dressed,CI_electronic_energy_dressed,& - size(CI_eigenvectors_dressed,1),N_det,N_states_diag,N_int,output_determinants,istate) + do i_state=1,N_states + call davidson_diag_mrcc(psi_det,CI_eigenvectors_dressed,CI_electronic_energy_dressed,& + size(CI_eigenvectors_dressed,1),N_det,N_states_diag,N_int,output_determinants,mrcc_state) + enddo + do j=1,N_states_diag + call get_s2_u0(psi_det,CI_eigenvectors_dressed(1,j),N_det,size(CI_eigenvectors_dressed,1),CI_eigenvectors_s2_dressed(j)) + enddo + else if (diag_algorithm == "Lapack") then - double precision, allocatable :: eigenvectors(:,:), eigenvalues(:) allocate (eigenvectors(size(H_matrix_dressed,1),N_det)) allocate (eigenvalues(N_det)) call lapack_diag(eigenvalues,eigenvectors, & @@ -147,8 +164,6 @@ END_PROVIDER do i=1,N_det CI_eigenvectors_dressed(i,1) = eigenvectors(i,1) enddo - integer :: i_state - double precision :: s2 i_state = 0 if (s2_eig) then do j=1,N_det @@ -179,6 +194,98 @@ END_PROVIDER deallocate(eigenvectors,eigenvalues) endif + if(diagonalize_s2.and.n_states_diag > 1.and. n_det >= n_states_diag)then + ! Diagonalizing S^2 within the "n_states_diag" states found + allocate(s2_eigvalues(N_states_diag)) + call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors_dressed,n_det,size(psi_det,3),size(CI_eigenvectors_dressed,1),min(n_states_diag,n_det),s2_eigvalues) + + do j = 1, N_states_diag + do i = 1, N_det + psi_coef(i,j) = CI_eigenvectors_dressed(i,j) + enddo + enddo + + if(s2_eig)then + + ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value + ! closer to the "expected_s2" set as input + + allocate(index_good_state_array(N_det),good_state_array(N_det)) + good_state_array = .False. + i_state = 0 + do j = 1, N_states_diag + if(dabs(s2_eigvalues(j)-expected_s2).le.0.3d0)then + good_state_array(j) = .True. + i_state +=1 + index_good_state_array(i_state) = j + endif + enddo + ! Sorting the i_state good states by energy + allocate(e_array(i_state),iorder(i_state)) + do j = 1, i_state + do i = 1, N_det + CI_eigenvectors_dressed(i,j) = psi_coef(i,index_good_state_array(j)) + enddo + CI_eigenvectors_s2_dressed(j) = s2_eigvalues(index_good_state_array(j)) + call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,j),n_det,psi_det,N_int,mrcc_state) + CI_electronic_energy_dressed(j) = e_0 + e_array(j) = e_0 + iorder(j) = j + enddo + call dsort(e_array,iorder,i_state) + do j = 1, i_state + CI_electronic_energy_dressed(j) = e_array(j) + CI_eigenvectors_s2_dressed(j) = s2_eigvalues(index_good_state_array(iorder(j))) + do i = 1, N_det + CI_eigenvectors_dressed(i,j) = psi_coef(i,index_good_state_array(iorder(j))) + enddo + ! call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,j),n_det,psi_det,N_int,mrcc_state) + ! print*,'e = ',CI_electronic_energy_dressed(j) + ! print*,' = ',e_0 + ! call get_s2_u0(psi_det,CI_eigenvectors_dressed(1,j),N_det,size(CI_eigenvectors_dressed,1),s2) + ! print*,'s^2 = ',CI_eigenvectors_s2_dressed(j) + ! print*,'= ',s2 + enddo + deallocate(e_array,iorder) + + ! Then setting the other states without any specific energy order + i_other_state = 0 + do j = 1, N_states_diag + if(good_state_array(j))cycle + i_other_state +=1 + do i = 1, N_det + CI_eigenvectors_dressed(i,i_state + i_other_state) = psi_coef(i,j) + enddo + CI_eigenvectors_s2_dressed(i_state + i_other_state) = s2_eigvalues(j) + call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,i_state + i_other_state),n_det,psi_det,N_int,mrcc_state) + CI_electronic_energy_dressed(i_state + i_other_state) = e_0 + enddo + deallocate(index_good_state_array,good_state_array) + + else + + ! Sorting the N_states_diag by energy, whatever the S^2 value is + + allocate(e_array(n_states_diag),iorder(n_states_diag)) + do j = 1, N_states_diag + call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,j),n_det,psi_det,N_int,mrcc_state) + e_array(j) = e_0 + iorder(j) = j + enddo + call dsort(e_array,iorder,n_states_diag) + do j = 1, N_states_diag + CI_electronic_energy_dressed(j) = e_array(j) + do i = 1, N_det + CI_eigenvectors_dressed(i,j) = psi_coef(i,iorder(j)) + enddo + CI_eigenvectors_s2_dressed(j) = s2_eigvalues(iorder(j)) + enddo + deallocate(e_array,iorder) + endif + deallocate(s2_eigvalues) + + endif + END_PROVIDER BEGIN_PROVIDER [ double precision, CI_energy_dressed, (N_states_diag) ] From 807c7b8ce629d9d67934a705aae87db7ed8ffb71 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 5 Aug 2016 17:53:20 +0200 Subject: [PATCH 083/216] Lambda-free MRCC now works --- plugins/MRCC_Utils/mrcc_utils.irp.f | 53 ++++++++++++++++++----------- src/Determinants/occ_pattern.irp.f | 2 +- src/Determinants/slater_rules.irp.f | 14 ++++++++ 3 files changed, 48 insertions(+), 21 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index b6dd2bd1..15c58e55 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -662,6 +662,7 @@ END_PROVIDER double precision , allocatable :: AtB(:), AtA_val(:), A_val(:,:), x(:), x_new(:), A_val_mwen(:) double precision :: t, norm, cx, res integer, allocatable :: A_ind(:,:), lref(:), AtA_ind(:), A_ind_mwen(:), col_shortcut(:), N_col(:) + double precision :: phase @@ -688,7 +689,7 @@ END_PROVIDER !$OMP PARALLEL DO schedule(static,10) default(none) shared(psi_non_ref, hh_exists, pp_exists, N_int, A_val, A_ind)& !$OMP shared(s, hh_shortcut, psi_ref_coef, N_det_non_ref, psi_non_ref_sorted, psi_non_ref_sorted_idx, psi_ref, N_det_ref)& - !$OMP private(lref, pp, II, ok, myMask, myDet, ind, wk) + !$OMP private(lref, pp, II, ok, myMask, myDet, ind, phase, wk) do hh = 1, hh_shortcut(0) do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 allocate(lref(N_det_non_ref)) @@ -700,15 +701,24 @@ END_PROVIDER if(.not. ok) cycle ind = searchDet(psi_non_ref_sorted(1,1,1), myDet(1,1), N_det_non_ref, N_int) if(ind /= -1) then - lref(psi_non_ref_sorted_idx(ind)) = II + call get_phase(myDet(1,1), psi_ref(1,1,II), phase, N_int) + if (phase > 0.d0) then + lref(psi_non_ref_sorted_idx(ind)) = II + else + lref(psi_non_ref_sorted_idx(ind)) = -II + endif end if end do wk = 0 do i=1, N_det_non_ref - if(lref(i) /= 0) then + if(lref(i) > 0) then wk += 1 A_val(wk, pp) = psi_ref_coef(lref(i), s) A_ind(wk, pp) = i + else if(lref(i) < 0) then + wk += 1 + A_val(wk, pp) = -psi_ref_coef(-lref(i), s) + A_ind(wk, pp) = i end if end do deallocate(lref) @@ -748,9 +758,9 @@ END_PROVIDER end do if(a_col == at_row) then - t = (t + 1d0) + t = t + 1.d0 end if - if(t /= 0d0) then + if(t /= 0.d0) then wk += 1 A_ind_mwen(wk) = a_col A_val_mwen(wk) = t @@ -807,10 +817,10 @@ END_PROVIDER end do if(mod(k, 100) == 0) then - print *, "residu ", k, res + print *, "res", k, res end if - if(res < 1d-10) exit + if(res < 1d-8) exit end do norm = 0.d0 @@ -826,27 +836,28 @@ END_PROVIDER dIj_unique(:size(X), s) = X(:) norm = 0.d0 - do i=1,N_det_ref - norm = norm + psi_ref_coef(i,s)*psi_ref_coef(i,s) - enddo double precision :: f do i=1,N_det_non_ref + if (rho_mrcc(i,s) == 0.d0) then + rho_mrcc(i,s) = 1.d-32 + endif f = psi_non_ref_coef(i,s) / rho_mrcc(i,s) ! Avoid numerical instabilities - f = min(f, 3.d0) - f = max(f,-3.d0) -! norm = norm + (psi_non_ref_coef(i,s) * f * rho_mrcc(i,s)) - norm = norm + ( f * rho_mrcc(i,s))**2 + f = min(f, 10.d0) + f = max(f, -10.d0) + norm = norm + f*f *rho_mrcc(i,s)*rho_mrcc(i,s) rho_mrcc(i,s) = f enddo - print *, ' = ', norm - f = 1.d0/norm norm = 0.d0 - do i=1,N_det_ref - norm = norm + psi_ref_coef(i,s)*psi_ref_coef(i,s) + do i=1,N_det_non_ref + norm = norm + psi_non_ref_coef(i,s)*psi_non_ref_coef(i,s) enddo + f = dsqrt(f*norm) + + print *, 'norm of |T Psi_0> = ', norm*f*f + do i=1,N_det_non_ref rho_mrcc(i,s) = rho_mrcc(i,s) * f enddo @@ -877,11 +888,13 @@ END_PROVIDER double precision function get_dij_index(II, i, s, Nint) integer, intent(in) :: II, i, s, Nint double precision, external :: get_dij - double precision :: HIi + double precision :: HIi, phase if(lambda_type == 0) then get_dij_index = get_dij(psi_ref(1,1,II), psi_non_ref(1,1,i), s, Nint) - get_dij_index = get_dij_index * rho_mrcc(i,s) +! get_dij_index = get_dij_index * rho_mrcc(i,s) + call get_phase(psi_ref(1,1,II), psi_non_ref(1,1,i), phase, N_int) + get_dij_index = get_dij_index * rho_mrcc(i,s) * phase else call i_h_j(psi_ref(1,1,II), psi_non_ref(1,1,i), Nint, HIi) get_dij_index = HIi * lambda_mrcc(s, i) diff --git a/src/Determinants/occ_pattern.irp.f b/src/Determinants/occ_pattern.irp.f index aa059870..af6390e2 100644 --- a/src/Determinants/occ_pattern.irp.f +++ b/src/Determinants/occ_pattern.irp.f @@ -334,7 +334,7 @@ subroutine make_s2_eigenfunction ! enddo ! enddo ! !TODO DEBUG - call write_int(output_determinants,N_det_new, 'Added deteminants for S^2') + call write_int(output_determinants,N_det_new, 'Added determinants for S^2') end diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index 133d9e52..eda2d9b4 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -1831,3 +1831,17 @@ subroutine apply_excitation(det, exc, res, ok, Nint) ok = .true. end subroutine +subroutine get_phase(key1,key2,phase,Nint) + use bitmasks + implicit none + integer(bit_kind), intent(in) :: key1(Nint,2), key2(Nint,2) + integer, intent(in) :: Nint + double precision, intent(out) :: phase + BEGIN_DOC +! Returns the phase between key1 and key2 + END_DOC + integer :: exc(0:2, 2, 2), degree + + !DIR$ FORCEINLINE + call get_excitation(key1, key2, exc, degree, phase, Nint) +end From 0119fd939615aa1e932f976573dcc9d237913368 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 5 Aug 2016 23:42:54 +0200 Subject: [PATCH 084/216] Multi-state --- plugins/MRCC_Utils/davidson.irp.f | 1 + plugins/MRCC_Utils/mrcc_utils.irp.f | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index 49aff533..be8fbad5 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -116,6 +116,7 @@ subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nin write(iunit,'(A)') '' call write_int(iunit,N_st,'Number of states') call write_int(iunit,sze,'Number of determinants') + call write_int(iunit,istate,'Using dressing for state ') write(iunit,'(A)') '' write_buffer = '===== ' do i=1,N_st diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 15c58e55..e1a91bd6 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -135,8 +135,9 @@ END_PROVIDER double precision, allocatable :: e_array(:) integer, allocatable :: iorder(:) - integer, parameter :: mrcc_state = 1 + integer :: mrcc_state + mrcc_state = N_states do j=1,N_states_diag do i=1,N_det CI_eigenvectors_dressed(i,j) = psi_coef(i,j) @@ -145,10 +146,8 @@ END_PROVIDER if (diag_algorithm == "Davidson") then - do i_state=1,N_states - call davidson_diag_mrcc(psi_det,CI_eigenvectors_dressed,CI_electronic_energy_dressed,& + call davidson_diag_mrcc(psi_det,CI_eigenvectors_dressed,CI_electronic_energy_dressed,& size(CI_eigenvectors_dressed,1),N_det,N_states_diag,N_int,output_determinants,mrcc_state) - enddo do j=1,N_states_diag call get_s2_u0(psi_det,CI_eigenvectors_dressed(1,j),N_det,size(CI_eigenvectors_dressed,1),CI_eigenvectors_s2_dressed(j)) enddo From 732fa657f03492ea8e6f48638742f24248cd1d7b Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 5 Aug 2016 23:51:24 +0200 Subject: [PATCH 085/216] pseudo --- plugins/Full_CI/full_ci.irp.f | 1 - src/Integrals_Monoelec/pseudopot.f90 | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/Full_CI/full_ci.irp.f b/plugins/Full_CI/full_ci.irp.f index e16397fc..e6d0f7f2 100644 --- a/plugins/Full_CI/full_ci.irp.f +++ b/plugins/Full_CI/full_ci.irp.f @@ -42,7 +42,6 @@ program full_ci 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) - print *, selection_criterion, "*******************" n_det_before = N_det call H_apply_FCI(pt2, norm_pert, H_pert_diag, N_st) diff --git a/src/Integrals_Monoelec/pseudopot.f90 b/src/Integrals_Monoelec/pseudopot.f90 index 1abf80ff..c89bb019 100644 --- a/src/Integrals_Monoelec/pseudopot.f90 +++ b/src/Integrals_Monoelec/pseudopot.f90 @@ -2021,7 +2021,8 @@ double precision function int_prod_bessel_loc(l,gam,n,a) int=int+f_k - f_k = f_k*(a*a*dble(k+k+2+n+l-1)) / (dble((k+k+2)*(2*(n+k+1)+1)*2)*gam) +! f_k = f_k*(a**2*(2*(k+1)+n+l-1)) / (2*(k+1)*(2*(n+k+1)+1)*2*gam) + f_k = f_k*(a*a*dble(k+k+1+n+l)) / (dble((k+k+2)*(4*(n+k+1)+2))*gam) if(dabs(int-intold).lt.1d-15)then done=.true. From db3c8bb87bbfb1e4cb874f32a17468269d76e8d8 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 1 Sep 2016 14:43:13 +0200 Subject: [PATCH 086/216] init - not working --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 64 ++- plugins/Full_CI_ZMQ/run_selection_slave.irp.f | 154 ++++++ plugins/Full_CI_ZMQ/selection.irp.f | 487 +----------------- plugins/Full_CI_ZMQ/selection_buffer.irp.f | 70 +++ plugins/Full_CI_ZMQ/selection_slave.irp.f | 3 +- src/Determinants/determinants.irp.f | 108 ++++ src/Determinants/slater_rules.irp.f | 137 +++-- 7 files changed, 499 insertions(+), 524 deletions(-) create mode 100644 plugins/Full_CI_ZMQ/run_selection_slave.irp.f create mode 100644 plugins/Full_CI_ZMQ/selection_buffer.irp.f diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 0577a408..98b0ec2e 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -53,14 +53,6 @@ program fci_zmq endif call diagonalize_CI call save_wavefunction - ! chk = 0_8 - ! do i=1, N_det - ! do k=1, N_int - ! chk = xor(psi_det(k,1,i), chk) - ! chk = xor(psi_det(k,2,i), chk) - ! end do - ! end do - ! print *, "CHK ", chk print *, 'N_det = ', N_det print *, 'N_states = ', N_states @@ -163,6 +155,60 @@ subroutine selection_dressing_slave_inproc(i) implicit none integer, intent(in) :: i - call selection_slaved(1,i,ci_electronic_energy) + call run_selection_slave(1,i,ci_electronic_energy) end +subroutine selection_collector(b, pt2) + use f77_zmq + use selection_types + use bitmasks + implicit none + + + type(selection_buffer), intent(inout) :: b + double precision, intent(out) :: pt2(N_states) + double precision :: pt2_mwen(N_states) + integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + + integer(ZMQ_PTR), external :: new_zmq_pull_socket + integer(ZMQ_PTR) :: zmq_socket_pull + + integer :: msg_size, rc, more + integer :: acc, i, j, robin, N, ntask + double precision, allocatable :: val(:) + integer(bit_kind), allocatable :: det(:,:,:) + integer, allocatable :: task_id(:) + integer :: done + real :: time, time0 + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() + zmq_socket_pull = new_zmq_pull_socket() + allocate(val(b%N), det(N_int, 2, b%N), task_id(N_det)) + done = 0 + more = 1 + pt2(:) = 0d0 + call CPU_TIME(time0) + do while (more == 1) + call pull_selection_results(zmq_socket_pull, pt2_mwen, val(1), det(1,1,1), N, task_id, ntask) + pt2 += pt2_mwen + do i=1, N + call add_to_selection_buffer(b, det(1,1,i), val(i)) + end do + + do i=1, ntask + if(task_id(i) == 0) then + print *, "Error in collector" + endif + call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id(i),more) + end do + done += ntask + call CPU_TIME(time) +! print *, "DONE" , done, time - time0 + end do + + + call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) + call end_zmq_pull_socket(zmq_socket_pull) + call sort_selection_buffer(b) +end subroutine + diff --git a/plugins/Full_CI_ZMQ/run_selection_slave.irp.f b/plugins/Full_CI_ZMQ/run_selection_slave.irp.f new file mode 100644 index 00000000..7bc1a7ef --- /dev/null +++ b/plugins/Full_CI_ZMQ/run_selection_slave.irp.f @@ -0,0 +1,154 @@ + +subroutine run_selection_slave(thread,iproc,energy) + use f77_zmq + use selection_types + implicit none + + double precision, intent(in) :: energy(N_states_diag) + integer, intent(in) :: thread, iproc + integer :: rc, i + + integer :: worker_id, task_id(1), ctask, ltask + character*(512) :: task + + integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + + integer(ZMQ_PTR), external :: new_zmq_push_socket + integer(ZMQ_PTR) :: zmq_socket_push + + type(selection_buffer) :: buf, buf2 + logical :: done + double precision :: pt2(N_states) + + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() + zmq_socket_push = new_zmq_push_socket(thread) + call connect_to_taskserver(zmq_to_qp_run_socket,worker_id,thread) + if(worker_id == -1) then + print *, "WORKER -1" + !call disconnect_from_taskserver(zmq_to_qp_run_socket,zmq_socket_push,worker_id) + call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) + call end_zmq_push_socket(zmq_socket_push,thread) + return + end if + buf%N = 0 + ctask = 1 + pt2 = 0d0 + + do + call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id(ctask), task) + done = task_id(ctask) == 0 + if (done) then + ctask = ctask - 1 + else + integer :: i_generator, i_generator_start, i_generator_max, step, N + read (task,*) i_generator_start, i_generator_max, step, N + if(buf%N == 0) then + ! Only first time + call create_selection_buffer(N, N*2, buf) + call create_selection_buffer(N, N*3, buf2) + else + if(N /= buf%N) stop "N changed... wtf man??" + end if + !print *, "psi_selectors_coef ", psi_selectors_coef(N_det_selectors-5:N_det_selectors, 1) + !call debug_det(psi_selectors(1,1,N_det_selectors), N_int) + do i_generator=i_generator_start,i_generator_max,step + call select_connected(i_generator,energy,pt2,buf) + enddo + endif + + if(done .or. ctask == size(task_id)) then + if(buf%N == 0 .and. ctask > 0) stop "uninitialized selection_buffer" + do i=1, ctask + call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id(i)) + end do + if(ctask > 0) then + call push_selection_results(zmq_socket_push, pt2, buf, task_id(1), ctask) + do i=1,buf%cur + call add_to_selection_buffer(buf2, buf%det(1,1,i), buf%val(i)) + enddo + call sort_selection_buffer(buf2) + buf%mini = buf2%mini + pt2 = 0d0 + buf%cur = 0 + end if + ctask = 0 + end if + + if(done) exit + ctask = ctask + 1 + end do + call disconnect_from_taskserver(zmq_to_qp_run_socket,zmq_socket_push,worker_id) + call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) + call end_zmq_push_socket(zmq_socket_push,thread) +end subroutine + + +subroutine push_selection_results(zmq_socket_push, pt2, b, task_id, ntask) + use f77_zmq + use selection_types + implicit none + + integer(ZMQ_PTR), intent(in) :: zmq_socket_push + double precision, intent(in) :: pt2(N_states) + type(selection_buffer), intent(inout) :: b + integer, intent(in) :: ntask, task_id(*) + integer :: rc + + call sort_selection_buffer(b) + + rc = f77_zmq_send( zmq_socket_push, b%cur, 4, ZMQ_SNDMORE) + if(rc /= 4) stop "push" + rc = f77_zmq_send( zmq_socket_push, pt2, 8*N_states, ZMQ_SNDMORE) + if(rc /= 8*N_states) stop "push" + + rc = f77_zmq_send( zmq_socket_push, b%val(1), 8*b%cur, ZMQ_SNDMORE) + if(rc /= 8*b%cur) stop "push" + + rc = f77_zmq_send( zmq_socket_push, b%det(1,1,1), bit_kind*N_int*2*b%cur, ZMQ_SNDMORE) + if(rc /= bit_kind*N_int*2*b%cur) stop "push" + + rc = f77_zmq_send( zmq_socket_push, ntask, 4, ZMQ_SNDMORE) + if(rc /= 4) stop "push" + + rc = f77_zmq_send( zmq_socket_push, task_id(1), ntask*4, 0) + if(rc /= 4*ntask) stop "push" + +! Activate is zmq_socket_push is a REQ +! rc = f77_zmq_recv( zmq_socket_push, task_id(1), ntask*4, 0) +end subroutine + + +subroutine pull_selection_results(zmq_socket_pull, pt2, val, det, N, task_id, ntask) + use f77_zmq + use selection_types + implicit none + integer(ZMQ_PTR), intent(in) :: zmq_socket_pull + double precision, intent(inout) :: pt2(N_states) + double precision, intent(out) :: val(*) + integer(bit_kind), intent(out) :: det(N_int, 2, *) + integer, intent(out) :: N, ntask, task_id(*) + integer :: rc, rn, i + + rc = f77_zmq_recv( zmq_socket_pull, N, 4, 0) + if(rc /= 4) stop "pull" + + rc = f77_zmq_recv( zmq_socket_pull, pt2, N_states*8, 0) + if(rc /= 8*N_states) stop "pull" + + rc = f77_zmq_recv( zmq_socket_pull, val(1), 8*N, 0) + if(rc /= 8*N) stop "pull" + + rc = f77_zmq_recv( zmq_socket_pull, det(1,1,1), bit_kind*N_int*2*N, 0) + if(rc /= bit_kind*N_int*2*N) stop "pull" + + rc = f77_zmq_recv( zmq_socket_pull, ntask, 4, 0) + if(rc /= 4) stop "pull" + + rc = f77_zmq_recv( zmq_socket_pull, task_id(1), ntask*4, 0) + if(rc /= 4*ntask) stop "pull" + +! Activate is zmq_socket_pull is a REP +! rc = f77_zmq_send( zmq_socket_pull, task_id(1), ntask*4, 0) +end subroutine + diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index b31e1977..a34ef1ae 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -11,162 +11,8 @@ BEGIN_PROVIDER [ double precision, integral8, (mo_tot_num, mo_tot_num, mo_tot_n END_PROVIDER -subroutine selection_slaved(thread,iproc,energy) - use f77_zmq - use selection_types - implicit none - - double precision, intent(in) :: energy(N_states_diag) - integer, intent(in) :: thread, iproc - integer :: rc, i - - integer :: worker_id, task_id(1), ctask, ltask - character*(512) :: task - - integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket - integer(ZMQ_PTR) :: zmq_to_qp_run_socket - - integer(ZMQ_PTR), external :: new_zmq_push_socket - integer(ZMQ_PTR) :: zmq_socket_push - - type(selection_buffer) :: buf, buf2 - logical :: done - double precision :: pt2(N_states) - - zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() - zmq_socket_push = new_zmq_push_socket(thread) - call connect_to_taskserver(zmq_to_qp_run_socket,worker_id,thread) - if(worker_id == -1) then - print *, "WORKER -1" - !call disconnect_from_taskserver(zmq_to_qp_run_socket,zmq_socket_push,worker_id) - call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) - call end_zmq_push_socket(zmq_socket_push,thread) - return - end if - buf%N = 0 - ctask = 1 - pt2 = 0d0 - - do - call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id(ctask), task) - done = task_id(ctask) == 0 - if (done) then - ctask = ctask - 1 - else - integer :: i_generator, i_generator_start, i_generator_max, step, N - read (task,*) i_generator_start, i_generator_max, step, N - if(buf%N == 0) then - ! Only first time - call create_selection_buffer(N, N*2, buf) - call create_selection_buffer(N, N*3, buf2) - else - if(N /= buf%N) stop "N changed... wtf man??" - end if - !print *, "psi_selectors_coef ", psi_selectors_coef(N_det_selectors-5:N_det_selectors, 1) - !call debug_det(psi_selectors(1,1,N_det_selectors), N_int) - do i_generator=i_generator_start,i_generator_max,step - call select_connected(i_generator,energy,pt2,buf) - enddo - endif - - if(done .or. ctask == size(task_id)) then - if(buf%N == 0 .and. ctask > 0) stop "uninitialized selection_buffer" - do i=1, ctask - call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id(i)) - end do - if(ctask > 0) then - call push_selection_results(zmq_socket_push, pt2, buf, task_id(1), ctask) - do i=1,buf%cur - call add_to_selection_buffer(buf2, buf%det(1,1,i), buf%val(i)) - enddo - call sort_selection_buffer(buf2) - buf%mini = buf2%mini - pt2 = 0d0 - buf%cur = 0 - end if - ctask = 0 - end if - - if(done) exit - ctask = ctask + 1 - end do - call disconnect_from_taskserver(zmq_to_qp_run_socket,zmq_socket_push,worker_id) - call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) - call end_zmq_push_socket(zmq_socket_push,thread) -end subroutine - - -subroutine push_selection_results(zmq_socket_push, pt2, b, task_id, ntask) - use f77_zmq - use selection_types - implicit none - - integer(ZMQ_PTR), intent(in) :: zmq_socket_push - double precision, intent(in) :: pt2(N_states) - type(selection_buffer), intent(inout) :: b - integer, intent(in) :: ntask, task_id(*) - integer :: rc - - call sort_selection_buffer(b) - - rc = f77_zmq_send( zmq_socket_push, b%cur, 4, ZMQ_SNDMORE) - if(rc /= 4) stop "push" - rc = f77_zmq_send( zmq_socket_push, pt2, 8*N_states, ZMQ_SNDMORE) - if(rc /= 8*N_states) stop "push" - - rc = f77_zmq_send( zmq_socket_push, b%val(1), 8*b%cur, ZMQ_SNDMORE) - if(rc /= 8*b%cur) stop "push" - - rc = f77_zmq_send( zmq_socket_push, b%det(1,1,1), bit_kind*N_int*2*b%cur, ZMQ_SNDMORE) - if(rc /= bit_kind*N_int*2*b%cur) stop "push" - - rc = f77_zmq_send( zmq_socket_push, ntask, 4, ZMQ_SNDMORE) - if(rc /= 4) stop "push" - - rc = f77_zmq_send( zmq_socket_push, task_id(1), ntask*4, 0) - if(rc /= 4*ntask) stop "push" - -! Activate is zmq_socket_push is a REQ -! rc = f77_zmq_recv( zmq_socket_push, task_id(1), ntask*4, 0) -end subroutine - - -subroutine pull_selection_results(zmq_socket_pull, pt2, val, det, N, task_id, ntask) - use f77_zmq - use selection_types - implicit none - integer(ZMQ_PTR), intent(in) :: zmq_socket_pull - double precision, intent(inout) :: pt2(N_states) - double precision, intent(out) :: val(*) - integer(bit_kind), intent(out) :: det(N_int, 2, *) - integer, intent(out) :: N, ntask, task_id(*) - integer :: rc, rn, i - - rc = f77_zmq_recv( zmq_socket_pull, N, 4, 0) - if(rc /= 4) stop "pull" - - rc = f77_zmq_recv( zmq_socket_pull, pt2, N_states*8, 0) - if(rc /= 8*N_states) stop "pull" - - rc = f77_zmq_recv( zmq_socket_pull, val(1), 8*N, 0) - if(rc /= 8*N) stop "pull" - - rc = f77_zmq_recv( zmq_socket_pull, det(1,1,1), bit_kind*N_int*2*N, 0) - if(rc /= bit_kind*N_int*2*N) stop "pull" - - rc = f77_zmq_recv( zmq_socket_pull, ntask, 4, 0) - if(rc /= 4) stop "pull" - - rc = f77_zmq_recv( zmq_socket_pull, task_id(1), ntask*4, 0) - if(rc /= 4*ntask) stop "pull" - -! Activate is zmq_socket_pull is a REP -! rc = f77_zmq_send( zmq_socket_pull, task_id(1), ntask*4, 0) -end subroutine - - subroutine select_connected(i_generator,E0,pt2,b) - use f77_zmq + !use f77_zmq use bitmasks use selection_types implicit none @@ -199,133 +45,9 @@ subroutine select_connected(i_generator,E0,pt2,b) end -subroutine create_selection_buffer(N, siz, res) - use selection_types - implicit none - - integer, intent(in) :: N, siz - type(selection_buffer), intent(out) :: res - - allocate(res%det(N_int, 2, siz), res%val(siz)) - - res%val = 0d0 - res%det = 0_8 - res%N = N - res%mini = 0d0 - res%cur = 0 -end subroutine - - -subroutine add_to_selection_buffer(b, det, val) - use selection_types - implicit none - - type(selection_buffer), intent(inout) :: b - integer(bit_kind), intent(in) :: det(N_int, 2) - double precision, intent(in) :: val - integer :: i - - if(dabs(val) >= b%mini) then - b%cur += 1 - b%det(:,:,b%cur) = det(:,:) - b%val(b%cur) = val - if(b%cur == size(b%val)) then - call sort_selection_buffer(b) - end if - end if -end subroutine - - -subroutine sort_selection_buffer(b) - use selection_types - implicit none - - type(selection_buffer), intent(inout) :: b - double precision, allocatable :: vals(:), absval(:) - integer, allocatable :: iorder(:) - integer(bit_kind), allocatable :: detmp(:,:,:) - integer :: i, nmwen - logical, external :: detEq - nmwen = min(b%N, b%cur) - - - allocate(iorder(b%cur), detmp(N_int, 2, nmwen), absval(b%cur), vals(nmwen)) - absval = -dabs(b%val(:b%cur)) - do i=1,b%cur - iorder(i) = i - end do - call dsort(absval, iorder, b%cur) - - do i=1, nmwen - detmp(:,:,i) = b%det(:,:,iorder(i)) - vals(i) = b%val(iorder(i)) - end do - b%det(:,:,:nmwen) = detmp(:,:,:) - b%det(:,:,nmwen+1:) = 0_bit_kind - b%val(:nmwen) = vals(:) - b%val(nmwen+1:) = 0d0 - b%mini = max(b%mini,dabs(b%val(b%N))) - b%cur = nmwen -end subroutine - - -subroutine selection_collector(b, pt2) - use f77_zmq - use selection_types - use bitmasks - implicit none - - - type(selection_buffer), intent(inout) :: b - double precision, intent(out) :: pt2(N_states) - double precision :: pt2_mwen(N_states) - integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket - integer(ZMQ_PTR) :: zmq_to_qp_run_socket - - integer(ZMQ_PTR), external :: new_zmq_pull_socket - integer(ZMQ_PTR) :: zmq_socket_pull - - integer :: msg_size, rc, more - integer :: acc, i, j, robin, N, ntask - double precision, allocatable :: val(:) - integer(bit_kind), allocatable :: det(:,:,:) - integer, allocatable :: task_id(:) - integer :: done - real :: time, time0 - zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() - zmq_socket_pull = new_zmq_pull_socket() - allocate(val(b%N), det(N_int, 2, b%N), task_id(N_det)) - done = 0 - more = 1 - pt2(:) = 0d0 - call CPU_TIME(time0) - do while (more == 1) - call pull_selection_results(zmq_socket_pull, pt2_mwen, val(1), det(1,1,1), N, task_id, ntask) - pt2 += pt2_mwen - do i=1, N - call add_to_selection_buffer(b, det(1,1,i), val(i)) - end do - - do i=1, ntask - if(task_id(i) == 0) then - print *, "Error in collector" - endif - call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id(i),more) - end do - done += ntask - call CPU_TIME(time) -! print *, "DONE" , done, time - time0 - end do - - - call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) - call end_zmq_pull_socket(zmq_socket_pull) - call sort_selection_buffer(b) -end subroutine - subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf) - use f77_zmq + !use f77_zmq use bitmasks use selection_types implicit none @@ -477,7 +199,7 @@ end subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf) - use f77_zmq + !use f77_zmq use bitmasks use selection_types implicit none @@ -647,13 +369,13 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call check_past_s(exc_det, microlist(1,1,ptr_microlist(sporb)), N_microlist(sporb) - N_futur_microlist(sporb), nok, N_int) if(nok) cycle !DET DRIVEN -! if(N_futur_microlist(0) > 0) then -! call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(0)),psi_coef_microlist(ptr_futur_microlist(0), 1),N_int,N_futur_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) -! end if + if(N_futur_microlist(0) > 0) then + call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(0)),psi_coef_microlist(ptr_futur_microlist(0), 1),N_int,N_futur_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) + end if !INTEGRAL DRIVEN - do j=1, N_states - i_H_psi_value(j) = d0s(mod(p1-1, mo_tot_num)+1, mod(p2-1, mo_tot_num)+1, j) - end do +! do j=1, N_states +! i_H_psi_value(j) = d0s(mod(p1-1, mo_tot_num)+1, mod(p2-1, mo_tot_num)+1, j) +! end do if(N_futur_microlist(sporb) > 0) then @@ -681,7 +403,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p i_H_psi_value = i_H_psi_value + i_H_psi_value2 end if - if(.false.) then ! DET DRIVEN + if(.true.) then ! DET DRIVEN integer :: c1, c2 double precision :: hij c1 = ptr_futur_tmicrolist(p1) @@ -1071,7 +793,7 @@ subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microl ! end do ! end do ! end do - else if(.true. .and. n_element(1, i) + n_element(2, i) == 3) then ! INTEGRAL DRIVEN + else if(.false. .and. n_element(1, i) + n_element(2, i) == 3) then ! INTEGRAL DRIVEN ! -459.6399263191298 pweni = 0 do s = 1, 2 @@ -1166,14 +888,13 @@ subroutine get_d1(gen, banned, banned_pair, mat, mask, pwen, coefs) exc(1, 1, 2) = p(a1) exc(1, 2, sfix) = pfix - tmp_array = (/0, 0 ,s(i), p(i) /) - call apply_particle(mask, tmp_array, deth, ok, N_int) + call apply_particle(mask, 0, 0 ,s(i), p(i), deth, ok, N_int) do j=1,mo_tot_num mwen = j + (sm-1)*mo_tot_num if(lbanned(mwen)) cycle tmp_array = (/0,0,sm,j/) - call apply_particle(deth, tmp_array, det, ok, N_int) + call apply_particle(deth, 0, 0 ,s(i), p(i), det, ok, N_int) if(.not. ok) cycle mono = mwen == pwen(a1) .or. mwen == pwen(a2) @@ -1216,14 +937,13 @@ subroutine get_d1(gen, banned, banned_pair, mat, mask, pwen, coefs) exc(1, 1, sp) = min(h1, h2) exc(2, 1, sp) = max(h1, h2) - tmp_array = (/0, 0 ,s(i), p(i) /) - call apply_particle(mask, tmp_array, deth, ok, N_int) + call apply_particle(mask, 0, 0 ,s(i), p(i) , deth, ok, N_int) do j=1,mo_tot_num if(j == pfix) inv = -inv mwen = j + (sm-1)*mo_tot_num if(lbanned(mwen)) cycle - call apply_particle(deth, tmp_array, det, ok, N_int) + call apply_particle(deth, 0, 0 ,s(i), p(i) , det, ok, N_int) if(.not. ok) cycle mono = mwen == pwen(a1) .or. mwen == pwen(a2) @@ -1293,8 +1013,8 @@ subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2, coefs) if(banned(p1 + ns1)) cycle if(p1 == p2) cycle if(banned_pair(p1 + ns1, p2 + ns2)) cycle - tmp_array = (/s1,p1,s2,p2/) - call apply_particle(mask, tmp_array, det2, ok, N_int) + !tmp_array = (/s1,p1,s2,p2/) + call apply_particle(mask, s1,p1,s2,p2, det2, ok, N_int) if(.not. ok) cycle mono = (hmi == p1 .or. hma == p2 .or. hmi == p2 .or. hma == p1) if(mono) then @@ -1325,8 +1045,8 @@ subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2, coefs) do p1=1, mo_tot_num if(banned(p1 + ns1)) cycle if(banned_pair(p1 + ns1, p2 + ns2)) cycle - tmp_array = (/s1,p1,s2,p2/) - call apply_particle(mask, tmp_array, det2, ok, N_int) + !tmp_array = (/s1,p1,s2,p2/) + call apply_particle(mask, s1,p1,s2,p2, det2, ok, N_int) if(.not. ok) cycle mono = (h1 == p1 .or. h2 == p2) if(mono) then @@ -1349,174 +1069,6 @@ subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2, coefs) end subroutine -subroutine apply_particle(det, exc, res, ok, Nint) - use bitmasks - implicit none - integer, intent(in) :: Nint - integer, intent(in) :: exc(4) - integer :: s1, s2, p1, p2 - integer(bit_kind),intent(in) :: det(Nint, 2) - integer(bit_kind),intent(out) :: res(Nint, 2) - logical, intent(out) :: ok - integer :: ii, pos - - ok = .false. - s1 = exc(1) - p1 = exc(2) - s2 = exc(3) - p2 = exc(4) - res = det - - if(p1 /= 0) then - ii = (p1-1)/bit_kind_size + 1 - pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) - if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) return - res(ii, s1) = ibset(res(ii, s1), pos) - end if - - ii = (p2-1)/bit_kind_size + 1 - pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) - if(iand(det(ii, s2), ishft(1_bit_kind, pos)) /= 0_8) return - res(ii, s2) = ibset(res(ii, s2), pos) - - ok = .true. -end subroutine - - -subroutine apply_hole(det, exc, res, ok, Nint) - use bitmasks - implicit none - integer, intent(in) :: Nint - integer, intent(in) :: exc(4) - integer :: s1, s2, p1, p2 - integer(bit_kind),intent(in) :: det(Nint, 2) - integer(bit_kind),intent(out) :: res(Nint, 2) - logical, intent(out) :: ok - integer :: ii, pos - - ok = .false. - s1 = exc(1) - p1 = exc(2) - s2 = exc(3) - p2 = exc(4) - res = det - - if(p1 /= 0) then - ii = (p1-1)/bit_kind_size + 1 - pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) - if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) return - res(ii, s1) = ibclr(res(ii, s1), pos) - end if - - ii = (p2-1)/bit_kind_size + 1 - pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) - if(iand(det(ii, s2), ishft(1_bit_kind, pos)) == 0_8) return - res(ii, s2) = ibclr(res(ii, s2), pos) - - ok = .true. -end subroutine - - - -subroutine get_double_excitation_phase(det1,det2,exc,phase,Nint) - use bitmasks - implicit none - BEGIN_DOC - ! Returns the two excitation operators between two doubly excited determinants and the phase - END_DOC - integer, intent(in) :: Nint - integer(bit_kind), intent(in) :: det1(Nint,2) - integer(bit_kind), intent(in) :: det2(Nint,2) - integer, intent(in) :: exc(0:2,2,2) - double precision, intent(out) :: phase - integer :: tz - integer :: l, ispin, idx_hole, idx_particle, ishift - integer :: nperm - integer :: i,j,k,m,n - integer :: high, low - integer :: a,b,c,d - integer(bit_kind) :: hole, particle, tmp - double precision, parameter :: phase_dble(0:1) = (/ 1.d0, -1.d0 /) - - ASSERT (Nint > 0) - nperm = 0 - do ispin = 1,2 - select case (exc(0,1,ispin)) - case(0) - cycle - - case(1) - low = min(exc(1,1,ispin), exc(1,2,ispin)) - high = max(exc(1,1,ispin), exc(1,2,ispin)) - - ASSERT (low > 0) - j = ishft(low-1,-bit_kind_shift)+1 ! Find integer in array(Nint) - n = iand(low-1,bit_kind_size-1)+1 ! mod(low,bit_kind_size) - ASSERT (high > 0) - k = ishft(high-1,-bit_kind_shift)+1 - m = iand(high-1,bit_kind_size-1)+1 - - if (j==k) then - nperm = nperm + popcnt(iand(det1(j,ispin), & - iand( ibset(0_bit_kind,m-1)-1_bit_kind, & - ibclr(-1_bit_kind,n)+1_bit_kind ) )) - else - nperm = nperm + popcnt(iand(det1(k,ispin), & - ibset(0_bit_kind,m-1)-1_bit_kind)) - if (n < bit_kind_size) then - nperm = nperm + popcnt(iand(det1(j,ispin), ibclr(-1_bit_kind,n) +1_bit_kind)) - endif - do i=j+1,k-1 - nperm = nperm + popcnt(det1(i,ispin)) - end do - endif - - case (2) - - do i=1,2 - low = min(exc(i,1,ispin), exc(i,2,ispin)) - high = max(exc(i,1,ispin), exc(i,2,ispin)) - - ASSERT (low > 0) - j = ishft(low-1,-bit_kind_shift)+1 ! Find integer in array(Nint) - n = iand(low-1,bit_kind_size-1)+1 ! mod(low,bit_kind_size) - ASSERT (high > 0) - k = ishft(high-1,-bit_kind_shift)+1 - m = iand(high-1,bit_kind_size-1)+1 - - if (j==k) then - nperm = nperm + popcnt(iand(det1(j,ispin), & - iand( ibset(0_bit_kind,m-1)-1_bit_kind, & - ibclr(-1_bit_kind,n)+1_bit_kind ) )) - else - nperm = nperm + popcnt(iand(det1(k,ispin), & - ibset(0_bit_kind,m-1)-1_bit_kind)) - if (n < bit_kind_size) then - nperm = nperm + popcnt(iand(det1(j,ispin), ibclr(-1_bit_kind,n) +1_bit_kind)) - endif - do l=j+1,k-1 - nperm = nperm + popcnt(det1(l,ispin)) - end do - endif - - enddo - - a = min(exc(1,1,ispin), exc(1,2,ispin)) - b = max(exc(1,1,ispin), exc(1,2,ispin)) - c = min(exc(2,1,ispin), exc(2,2,ispin)) - d = max(exc(2,1,ispin), exc(2,2,ispin)) - if (c>a .and. cb) then - nperm = nperm + 1 - endif - exit - end select - - enddo - phase = phase_dble(iand(nperm,1)) -end - - - subroutine check_past(det, list, idx, N, cur, ok, Nint) implicit none use bitmasks @@ -1562,4 +1114,3 @@ subroutine check_past_s(det, list, N, ok, Nint) end if end do end subroutine - diff --git a/plugins/Full_CI_ZMQ/selection_buffer.irp.f b/plugins/Full_CI_ZMQ/selection_buffer.irp.f new file mode 100644 index 00000000..2bcb11d3 --- /dev/null +++ b/plugins/Full_CI_ZMQ/selection_buffer.irp.f @@ -0,0 +1,70 @@ + +subroutine create_selection_buffer(N, siz, res) + use selection_types + implicit none + + integer, intent(in) :: N, siz + type(selection_buffer), intent(out) :: res + + allocate(res%det(N_int, 2, siz), res%val(siz)) + + res%val = 0d0 + res%det = 0_8 + res%N = N + res%mini = 0d0 + res%cur = 0 +end subroutine + + +subroutine add_to_selection_buffer(b, det, val) + use selection_types + implicit none + + type(selection_buffer), intent(inout) :: b + integer(bit_kind), intent(in) :: det(N_int, 2) + double precision, intent(in) :: val + integer :: i + + if(dabs(val) >= b%mini) then + b%cur += 1 + b%det(:,:,b%cur) = det(:,:) + b%val(b%cur) = val + if(b%cur == size(b%val)) then + call sort_selection_buffer(b) + end if + end if +end subroutine + + +subroutine sort_selection_buffer(b) + use selection_types + implicit none + + type(selection_buffer), intent(inout) :: b + double precision, allocatable :: vals(:), absval(:) + integer, allocatable :: iorder(:) + integer(bit_kind), allocatable :: detmp(:,:,:) + integer :: i, nmwen + logical, external :: detEq + nmwen = min(b%N, b%cur) + + + allocate(iorder(b%cur), detmp(N_int, 2, nmwen), absval(b%cur), vals(nmwen)) + absval = -dabs(b%val(:b%cur)) + do i=1,b%cur + iorder(i) = i + end do + call dsort(absval, iorder, b%cur) + + do i=1, nmwen + detmp(:,:,i) = b%det(:,:,iorder(i)) + vals(i) = b%val(iorder(i)) + end do + b%det(:,:,:nmwen) = detmp(:,:,:) + b%det(:,:,nmwen+1:) = 0_bit_kind + b%val(:nmwen) = vals(:) + b%val(nmwen+1:) = 0d0 + b%mini = max(b%mini,dabs(b%val(b%N))) + b%cur = nmwen +end subroutine + diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index 7eeae798..ff87b479 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -9,7 +9,6 @@ program selection_slave call provide_everything call switch_qp_run_to_master call run_wf - end subroutine provide_everything @@ -80,6 +79,6 @@ subroutine selection_dressing_slave_tcp(i,energy) double precision, intent(in) :: energy(N_states_diag) integer, intent(in) :: i - call selection_slaved(0,i,energy) + call run_selection_slave(0,i,energy) end diff --git a/src/Determinants/determinants.irp.f b/src/Determinants/determinants.irp.f index 63617352..258f5391 100644 --- a/src/Determinants/determinants.irp.f +++ b/src/Determinants/determinants.irp.f @@ -723,3 +723,111 @@ integer function detCmp(a,b,Nint) end function +subroutine apply_excitation(det, exc, res, ok, Nint) + use bitmasks + implicit none + + integer, intent(in) :: Nint + integer, intent(in) :: exc(0:2,2,2) + integer(bit_kind),intent(in) :: det(Nint, 2) + integer(bit_kind),intent(out) :: res(Nint, 2) + logical, intent(out) :: ok + integer :: h1,p1,h2,p2,s1,s2,degree + integer :: ii, pos + + + ok = .false. + degree = exc(0,1,1) + exc(0,1,2) + + if(.not. (degree > 0 .and. degree <= 2)) then + print *, degree + print *, "apply ex" + STOP + endif + + call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) + res = det + + ii = (h1-1)/bit_kind_size + 1 + pos = mod(h1-1, 64)!iand(h1-1,bit_kind_size-1) ! mod 64 + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s1) = ibclr(res(ii, s1), pos) + + ii = (p1-1)/bit_kind_size + 1 + pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s1) = ibset(res(ii, s1), pos) + + if(degree == 2) then + ii = (h2-1)/bit_kind_size + 1 + pos = mod(h2-1, 64)!iand(h2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s2) = ibclr(res(ii, s2), pos) + + ii = (p2-1)/bit_kind_size + 1 + pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s2) = ibset(res(ii, s2), pos) + endif + + ok = .true. +end subroutine + + +subroutine apply_particle(det, s1, p1, s2, p2, res, ok, Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer, intent(in) :: s1, p1, s2, p2 + integer(bit_kind),intent(in) :: det(Nint, 2) + integer(bit_kind),intent(out) :: res(Nint, 2) + logical, intent(out) :: ok + integer :: ii, pos + + ok = .false. + res = det + + if(p1 /= 0) then + ii = (p1-1)/bit_kind_size + 1 + pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s1) = ibset(res(ii, s1), pos) + end if + + ii = (p2-1)/bit_kind_size + 1 + pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s2) = ibset(res(ii, s2), pos) + + ok = .true. +end subroutine + + +subroutine apply_hole(det, s1, h1, s2, h2, res, ok, Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer, intent(in) :: s1, h1, s2, h2 + integer(bit_kind),intent(in) :: det(Nint, 2) + integer(bit_kind),intent(out) :: res(Nint, 2) + logical, intent(out) :: ok + integer :: ii, pos + + ok = .false. + res = det + + if(h1 /= 0) then + ii = (h1-1)/bit_kind_size + 1 + pos = mod(h1-1, 64)!iand(h1-1,bit_kind_size-1) + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s1) = ibclr(res(ii, s1), pos) + end if + + ii = (h2-1)/bit_kind_size + 1 + pos = mod(h2-1, 64)!iand(h2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s2) = ibclr(res(ii, s2), pos) + + ok = .true. +end subroutine + diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index 133d9e52..99cd27b4 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -1781,53 +1781,100 @@ subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) end -subroutine apply_excitation(det, exc, res, ok, Nint) +subroutine get_double_excitation_phase(det1,det2,exc,phase,Nint) use bitmasks implicit none - integer, intent(in) :: Nint - integer, intent(in) :: exc(0:2,2,2) - integer(bit_kind),intent(in) :: det(Nint, 2) - integer(bit_kind),intent(out) :: res(Nint, 2) - logical, intent(out) :: ok - integer :: h1,p1,h2,p2,s1,s2,degree - integer :: ii, pos - - - ok = .false. - degree = exc(0,1,1) + exc(0,1,2) - - if(.not. (degree > 0 .and. degree <= 2)) then - print *, degree - print *, "apply ex" - STOP - endif - - call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) - res = det - - ii = (h1-1)/bit_kind_size + 1 - pos = mod(h1-1, 64)!iand(h1-1,bit_kind_size-1) ! mod 64 - if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) return - res(ii, s1) = ibclr(res(ii, s1), pos) - - ii = (p1-1)/bit_kind_size + 1 - pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) - if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) return - res(ii, s1) = ibset(res(ii, s1), pos) - - if(degree == 2) then - ii = (h2-1)/bit_kind_size + 1 - pos = mod(h2-1, 64)!iand(h2-1,bit_kind_size-1) - if(iand(det(ii, s2), ishft(1_bit_kind, pos)) == 0_8) return - res(ii, s2) = ibclr(res(ii, s2), pos) - - ii = (p2-1)/bit_kind_size + 1 - pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) - if(iand(det(ii, s2), ishft(1_bit_kind, pos)) /= 0_8) return - res(ii, s2) = ibset(res(ii, s2), pos) - endif + integer, intent(in) :: Nint + integer(bit_kind), intent(in) :: det1(Nint,2) + integer(bit_kind), intent(in) :: det2(Nint,2) + integer, intent(in) :: exc(0:2,2,2) + double precision, intent(out) :: phase + integer :: tz + integer :: l, ispin, idx_hole, idx_particle, ishift + integer :: nperm + integer :: i,j,k,m,n + integer :: high, low + integer :: a,b,c,d + integer(bit_kind) :: hole, particle, tmp + double precision, parameter :: phase_dble(0:1) = (/ 1.d0, -1.d0 /) + + ASSERT (Nint > 0) + nperm = 0 + do ispin = 1,2 + select case (exc(0,1,ispin)) + case(0) + cycle + + case(1) + low = min(exc(1,1,ispin), exc(1,2,ispin)) + high = max(exc(1,1,ispin), exc(1,2,ispin)) + + ASSERT (low > 0) + j = ishft(low-1,-bit_kind_shift)+1 ! Find integer in array(Nint) + n = iand(low-1,bit_kind_size-1)+1 ! mod(low,bit_kind_size) + ASSERT (high > 0) + k = ishft(high-1,-bit_kind_shift)+1 + m = iand(high-1,bit_kind_size-1)+1 + + if (j==k) then + nperm = nperm + popcnt(iand(det1(j,ispin), & + iand( ibset(0_bit_kind,m-1)-1_bit_kind, & + ibclr(-1_bit_kind,n)+1_bit_kind ) )) + else + nperm = nperm + popcnt(iand(det1(k,ispin), & + ibset(0_bit_kind,m-1)-1_bit_kind)) + if (n < bit_kind_size) then + nperm = nperm + popcnt(iand(det1(j,ispin), ibclr(-1_bit_kind,n) +1_bit_kind)) + endif + do i=j+1,k-1 + nperm = nperm + popcnt(det1(i,ispin)) + end do + endif + + case (2) + + do i=1,2 + low = min(exc(i,1,ispin), exc(i,2,ispin)) + high = max(exc(i,1,ispin), exc(i,2,ispin)) + + ASSERT (low > 0) + j = ishft(low-1,-bit_kind_shift)+1 ! Find integer in array(Nint) + n = iand(low-1,bit_kind_size-1)+1 ! mod(low,bit_kind_size) + ASSERT (high > 0) + k = ishft(high-1,-bit_kind_shift)+1 + m = iand(high-1,bit_kind_size-1)+1 + + if (j==k) then + nperm = nperm + popcnt(iand(det1(j,ispin), & + iand( ibset(0_bit_kind,m-1)-1_bit_kind, & + ibclr(-1_bit_kind,n)+1_bit_kind ) )) + else + nperm = nperm + popcnt(iand(det1(k,ispin), & + ibset(0_bit_kind,m-1)-1_bit_kind)) + if (n < bit_kind_size) then + nperm = nperm + popcnt(iand(det1(j,ispin), ibclr(-1_bit_kind,n) +1_bit_kind)) + endif + do l=j+1,k-1 + nperm = nperm + popcnt(det1(l,ispin)) + end do + endif + + enddo + + a = min(exc(1,1,ispin), exc(1,2,ispin)) + b = max(exc(1,1,ispin), exc(1,2,ispin)) + c = min(exc(2,1,ispin), exc(2,2,ispin)) + d = max(exc(2,1,ispin), exc(2,2,ispin)) + if (c>a .and. cb) then + nperm = nperm + 1 + endif + exit + end select + + enddo + phase = phase_dble(iand(nperm,1)) +end + - ok = .true. -end subroutine From 18084047e4c9fccf1019624409ddc2ada80fa581 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 5 Sep 2016 17:16:09 +0200 Subject: [PATCH 087/216] compiles - does not work --- plugins/Full_CI_ZMQ/run_selection_slave.irp.f | 2 + plugins/Full_CI_ZMQ/selection.irp.f | 1278 +++-------------- plugins/Full_CI_ZMQ/selection_double.irp.f | 512 +++++++ plugins/Full_CI_ZMQ/selection_single.irp.f | 333 +++++ src/Determinants/determinants.irp.f | 46 +- 5 files changed, 1053 insertions(+), 1118 deletions(-) create mode 100644 plugins/Full_CI_ZMQ/selection_double.irp.f create mode 100644 plugins/Full_CI_ZMQ/selection_single.irp.f diff --git a/plugins/Full_CI_ZMQ/run_selection_slave.irp.f b/plugins/Full_CI_ZMQ/run_selection_slave.irp.f index 7bc1a7ef..36550116 100644 --- a/plugins/Full_CI_ZMQ/run_selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/run_selection_slave.irp.f @@ -152,3 +152,5 @@ subroutine pull_selection_results(zmq_socket_pull, pt2, val, det, N, task_id, nt ! rc = f77_zmq_send( zmq_socket_pull, task_id(1), ntask*4, 0) end subroutine + + diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index a34ef1ae..d3d8e30b 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -1,1116 +1,162 @@ - - -BEGIN_PROVIDER [ double precision, integral8, (mo_tot_num, mo_tot_num, mo_tot_num, mo_tot_num) ] - integral8 = 0d0 - integer :: h1, h2 - do h1=1, mo_tot_num - do h2=1, mo_tot_num - call get_mo_bielec_integrals_ij(h1, h2 ,mo_tot_num,integral8(1,1,h1,h2),mo_integrals_map) - end do - end do -END_PROVIDER - - -subroutine select_connected(i_generator,E0,pt2,b) - !use f77_zmq - use bitmasks - use selection_types - implicit none - integer, intent(in) :: i_generator - type(selection_buffer), intent(inout) :: b - double precision, intent(inout) :: pt2(N_states) - integer :: k,l - double precision, intent(in) :: E0(N_states) - - integer(bit_kind) :: hole_mask(N_int,2), particle_mask(N_int,2) - double precision :: fock_diag_tmp(2,mo_tot_num+1) - - call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) - - do l=1,N_generators_bitmask - do k=1,N_int - hole_mask(k,1) = iand(generators_bitmask(k,1,s_hole,l), psi_det_generators(k,1,i_generator)) - hole_mask(k,2) = iand(generators_bitmask(k,2,s_hole,l), psi_det_generators(k,2,i_generator)) - particle_mask(k,1) = iand(generators_bitmask(k,1,s_part,l), not(psi_det_generators(k,1,i_generator)) ) - particle_mask(k,2) = iand(generators_bitmask(k,2,s_part,l), not(psi_det_generators(k,2,i_generator)) ) - - hole_mask(k,1) = ior(generators_bitmask(k,1,s_hole,l), generators_bitmask(k,1,s_part,l)) - hole_mask(k,2) = ior(generators_bitmask(k,2,s_hole,l), generators_bitmask(k,2,s_part,l)) - particle_mask(k,:) = hole_mask(k,:) - enddo - - call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) - call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) - enddo -end - - - -subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf) - !use f77_zmq - use bitmasks - use selection_types - implicit none - BEGIN_DOC -! Select determinants connected to i_det by H - END_DOC - integer, intent(in) :: i_generator - double precision, intent(in) :: fock_diag_tmp(mo_tot_num) - double precision, intent(inout) :: pt2(N_states) - integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) - double precision, intent(in) :: E0(N_states) - type(selection_buffer), intent(inout) :: buf - - integer :: i,j,k,l - - integer :: msg_size - msg_size = bit_kind*N_int*2 - - ! Apply hole and particle masks - ! ----------------------------- - - integer(bit_kind) :: hole(N_int,2), particle(N_int,2) - do k=1,N_int - hole (k,1) = iand(psi_det_generators(k,1,i_generator), hole_mask(k,1)) - hole (k,2) = iand(psi_det_generators(k,2,i_generator), hole_mask(k,2)) - particle(k,1) = iand(not(psi_det_generators(k,1,i_generator)), particle_mask(k,1)) - particle(k,2) = iand(not(psi_det_generators(k,2,i_generator)), particle_mask(k,2)) - enddo - - ! Create lists of holes and particles - ! ----------------------------------- - - integer :: N_holes(2), N_particles(2) - integer :: hole_list(N_int*bit_kind_size,2) - integer :: particle_list(N_int*bit_kind_size,2) - - call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) - call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) - - ! Create excited determinants - ! --------------------------- - - integer :: ispin, other_spin - integer(bit_kind) :: exc_det(N_int,2), ion_det(N_int,2) - - do k=1,N_int - exc_det(k,1) = psi_det_generators(k,1,i_generator) - exc_det(k,2) = psi_det_generators(k,2,i_generator) - ion_det(k,1) = psi_det_generators(k,1,i_generator) - ion_det(k,2) = psi_det_generators(k,2,i_generator) - enddo - - - - integer :: ptr_microlist(0:mo_tot_num * 2 + 1), N_microlist(0:mo_tot_num * 2) - integer, allocatable :: idx_microlist(:) - integer(bit_kind), allocatable :: microlist(:, :, :) - double precision, allocatable :: psi_coef_microlist(:,:) - - allocate(microlist(N_int, 2, N_det_selectors * 3), psi_coef_microlist(psi_selectors_size * 3, N_states), idx_microlist(N_det_selectors * 3)) - - do ispin=1,2 - - - do i=1, N_holes(ispin) - ion_det(:,:) = psi_det_generators(:,:,i_generator) - integer :: i_hole - i_hole = hole_list(i,ispin) - - ! Apply the hole - integer :: j_hole, k_hole - k_hole = ishft(i_hole-1,-bit_kind_shift)+1 ! N_int - j_hole = i_hole-ishft(k_hole-1,bit_kind_shift)-1 ! bit index - ion_det(k_hole,ispin) = ibclr(ion_det(k_hole,ispin),j_hole) - - - call create_microlist_single(psi_selectors, i_generator, N_det_selectors, ion_det, microlist, idx_microlist, N_microlist, ptr_microlist, N_int) - - do j=1, ptr_microlist(mo_tot_num * 2 + 1) - 1 - psi_coef_microlist(j,:) = psi_selectors_coef_transp(:,idx_microlist(j)) - enddo - - if(ptr_microlist(mo_tot_num * 2 + 1) == 1) then - cycle - endif - - - do j=1,N_particles(ispin) - exc_det(:,:) = ion_det(:,:) - - integer :: i_particle - i_particle = particle_list(j,ispin) - - integer :: j_particle, k_particle - k_particle = ishft(i_particle-1,-bit_kind_shift)+1 ! N_int - j_particle = i_particle-ishft(k_particle-1,bit_kind_shift)-1 ! bit index - exc_det(k_particle,ispin) = ibset(exc_det(k_particle,ispin),j_particle) - - - logical, external :: is_in_wavefunction - logical :: nok - if (.not. is_in_wavefunction(exc_det,N_int)) then - double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) - i_H_psi_value = 0d0 - i_H_psi_value2 = 0d0 - integer :: sporb - - - nok = .false. - sporb = i_particle + (ispin - 1) * mo_tot_num - - if(N_microlist(sporb) > 0) call check_past(exc_det, microlist(1,1,ptr_microlist(sporb)), idx_microlist(ptr_microlist(sporb)), N_microlist(sporb), i_generator, nok, N_int) - if(nok) cycle - - if(N_microlist(0) > 0) call i_H_psi(exc_det,microlist,psi_coef_microlist,N_int,N_microlist(0),psi_selectors_size*3,N_states,i_H_psi_value) - if(N_microlist(sporb) > 0) call i_H_psi(exc_det,microlist(1,1,ptr_microlist(sporb)),psi_coef_microlist(ptr_microlist(sporb), 1),N_int,N_microlist(sporb),psi_selectors_size*3,N_states,i_H_psi_value2) - i_H_psi_value(:) = i_H_psi_value(:) + i_H_psi_value2(:) - double precision :: Hii, diag_H_mat_elem_fock - Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) - - double precision :: delta_E, e_pert(N_states), e_pertm - e_pert(:) = 0d0 - e_pertm = 0d0 - - do k=1,N_states - if (i_H_psi_value(k) == 0.d0) cycle - delta_E = E0(k) - Hii - if (delta_E < 0.d0) then - e_pert(k) = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) - else - e_pert(k) = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) - endif - if(dabs(e_pert(k)) > dabs(e_pertm)) e_pertm = e_pert(k) - pt2(k) += e_pert(k) - enddo - call add_to_selection_buffer(buf, exc_det, e_pertm) - endif - - ! Reset exc_det - exc_det(k_particle,ispin) = psi_det_generators(k_particle,ispin,i_generator) - enddo ! j - - ! Reset ion_det - ion_det(k_hole,ispin) = psi_det_generators(k_hole,ispin,i_generator) - enddo ! i - enddo ! ispin -end - - - -subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf) - !use f77_zmq - use bitmasks - use selection_types - implicit none - BEGIN_DOC -! Select determinants connected to i_det by H - END_DOC - integer, intent(in) :: i_generator - double precision, intent(in) :: fock_diag_tmp(mo_tot_num) - double precision, intent(inout) :: pt2(N_states) - integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) - double precision, intent(in) :: E0(N_states) - type(selection_buffer), intent(inout) :: buf - logical :: isinwf(mo_tot_num*2, mo_tot_num*2) - double precision :: d0s(mo_tot_num, mo_tot_num, N_states) - - integer :: i,j,k,l,j1,j2,i1,i2,ib,jb - - integer :: msg_size - msg_size = bit_kind*N_int*2 - - ! Apply hole and particle masks - ! ----------------------------- - - integer(bit_kind) :: hole(N_int,2), particle(N_int,2) - do k=1,N_int - hole (k,1) = iand(psi_det_generators(k,1,i_generator), hole_mask(k,1)) - hole (k,2) = iand(psi_det_generators(k,2,i_generator), hole_mask(k,2)) - particle(k,1) = iand(not(psi_det_generators(k,1,i_generator)), particle_mask(k,1)) - particle(k,2) = iand(not(psi_det_generators(k,2,i_generator)), particle_mask(k,2)) - enddo - - ! Create lists of holes and particles - ! ----------------------------------- - - integer :: N_holes(2), N_particles(2) - integer :: hole_list(N_int*bit_kind_size,2) - integer :: particle_list(N_int*bit_kind_size,2) - - call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) - call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) - - ! Create excited determinants - ! --------------------------- - - integer :: ispin1, ispin2, other_spin - integer(bit_kind) :: exc_det(N_int,2), ion_det(N_int,2) - - - integer :: ptr_microlist(0:mo_tot_num * 2 + 1), N_microlist(0:mo_tot_num * 2) - double precision, allocatable :: psi_coef_microlist(:,:) - - integer :: ptr_tmicrolist(0:mo_tot_num * 2 + 1), N_tmicrolist(0:mo_tot_num * 2) - double precision, allocatable :: psi_coef_tmicrolist(:,:) - - integer, allocatable :: idx_tmicrolist(:), idx_microlist(:) - integer(bit_kind), allocatable :: microlist(:,:,:), tmicrolist(:,:,:) - - integer :: ptr_futur_microlist(0:mo_tot_num * 2 + 1), ptr_futur_tmicrolist(0:mo_tot_num * 2 + 1) - integer :: N_futur_microlist(0:mo_tot_num * 2), N_futur_tmicrolist(0:mo_tot_num * 2) - logical :: pastlink - - allocate(idx_tmicrolist(N_det_selectors * 3), idx_microlist(N_det_selectors * 4)) - allocate(microlist(N_int, 2, N_det_selectors * 4), tmicrolist(N_int, 2, N_det_selectors * 3)) - allocate(psi_coef_tmicrolist(psi_selectors_size * 3, N_states), psi_coef_microlist(psi_selectors_size * 4, N_states)) - - do k=1,N_int - exc_det(k,1) = psi_det_generators(k,1,i_generator) - exc_det(k,2) = psi_det_generators(k,2,i_generator) - ion_det(k,1) = psi_det_generators(k,1,i_generator) - ion_det(k,2) = psi_det_generators(k,2,i_generator) - enddo - - do ispin1=1,2 - do ispin2=1,ispin1 - integer :: i_hole1, i_hole2, j_hole, k_hole - do i1=N_holes(ispin1),1,-1 ! Generate low excitations first - if(ispin1 == ispin2) then - ib = i1+1 - else - ib = 1 - endif - do i2=N_holes(ispin2),ib,-1 ! Generate low excitations first - ion_det(:,:) = psi_det_generators(:,:,i_generator) - - i_hole1 = hole_list(i1,ispin1) - k_hole = ishft(i_hole1-1,-bit_kind_shift)+1 ! N_int - j_hole = i_hole1-ishft(k_hole-1,bit_kind_shift)-1 ! bit index - ion_det(k_hole,ispin1) = ibclr(ion_det(k_hole,ispin1),j_hole) - - i_hole2 = hole_list(i2,ispin2) - k_hole = ishft(i_hole2-1,-bit_kind_shift)+1 ! N_int - j_hole = i_hole2-ishft(k_hole-1,bit_kind_shift)-1 ! bit index - ion_det(k_hole,ispin2) = ibclr(ion_det(k_hole,ispin2),j_hole) - - call create_microlist_double(psi_selectors, i_generator, N_det_selectors, ion_det, & - microlist, idx_microlist, N_microlist, ptr_microlist, & - tmicrolist, idx_tmicrolist, N_tmicrolist, ptr_tmicrolist, & - isinwf, d0s, N_int) - - if(ptr_microlist(mo_tot_num * 2 + 1) == 1 .and. ptr_tmicrolist(mo_tot_num * 2 + 1) == 1) cycle - - call finish_isinwf(ion_det, psi_det_sorted(1,1,N_det_selectors+1), N_det - N_det_selectors, isinwf) - - - call create_futur_ptr(ptr_microlist, idx_microlist, ptr_futur_microlist, N_futur_microlist, i_generator) - call create_futur_ptr(ptr_tmicrolist, idx_tmicrolist, ptr_futur_tmicrolist, N_futur_tmicrolist, i_generator) - - - do j=1, ptr_microlist(mo_tot_num * 2 + 1) - 1 - psi_coef_microlist(j,:) = psi_selectors_coef_transp(:,idx_microlist(j)) - enddo - do j=1, ptr_tmicrolist(mo_tot_num * 2 + 1) - 1 - psi_coef_tmicrolist(j,:) = psi_selectors_coef_transp(:,idx_tmicrolist(j)) - enddo - - - ! Create particles - ! ---------------- - integer :: i_particle1, i_particle2, k_particle, j_particle - integer :: p1, p2, sporb, lorb - - do j1=1,N_particles(ispin1) - i_particle1 = particle_list(j1, ispin1) - p1 = i_particle1 + (ispin1 - 1) * mo_tot_num - if(N_tmicrolist(p1) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p1)) < i_generator) cycle - jb = 1 - if(ispin1 == ispin2) jb = j1+1 - do j2=jb,N_particles(ispin2) - - i_particle2 = particle_list(j2, ispin2) - - - - p2 = i_particle2 + (ispin2 - 1) * mo_tot_num - if(N_tmicrolist(p2) > 0 .and. idx_tmicrolist(ptr_tmicrolist(p2)) < i_generator) cycle - if(isinwf(p1, p2)) cycle - exc_det = ion_det - - - if(N_microlist(p1) < N_microlist(p2)) then - sporb = p1 - lorb = p2 - else - sporb = p2 - lorb = p1 - endif - - - ! Apply the particle - k_particle = ishft(i_particle2-1,-bit_kind_shift)+1 ! N_int - j_particle = i_particle2-ishft(k_particle-1,bit_kind_shift)-1 ! bit index - exc_det(k_particle,ispin2) = ibset(exc_det(k_particle,ispin2),j_particle) - - ! Apply the particle - k_particle = ishft(i_particle1-1,-bit_kind_shift)+1 ! N_int - j_particle = i_particle1-ishft(k_particle-1,bit_kind_shift)-1 ! bit index - exc_det(k_particle,ispin1) = ibset(exc_det(k_particle,ispin1),j_particle) - - logical, external :: is_in_wavefunction - logical :: nok - ! Compute perturbative contribution and select determinant - double precision :: i_H_psi_value(N_states), i_H_psi_value2(N_states) - i_H_psi_value = 0d0 - i_H_psi_value2 = 0d0 - - nok = .false. - call check_past_s(exc_det, microlist(1,1,ptr_microlist(sporb)), N_microlist(sporb) - N_futur_microlist(sporb), nok, N_int) - if(nok) cycle - !DET DRIVEN - if(N_futur_microlist(0) > 0) then - call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(0)),psi_coef_microlist(ptr_futur_microlist(0), 1),N_int,N_futur_microlist(0),psi_selectors_size*4,N_states,i_H_psi_value) - end if - !INTEGRAL DRIVEN -! do j=1, N_states -! i_H_psi_value(j) = d0s(mod(p1-1, mo_tot_num)+1, mod(p2-1, mo_tot_num)+1, j) -! end do - - - if(N_futur_microlist(sporb) > 0) then - !!! COMPUTE INTERSECTION - !!!!!!!!!!!!! -! if(dfloat(N_futur_microlist(lorb)) / dfloat(N_futur_microlist(sporb)) < 2d0) then -! c1 = ptr_futur_microlist(p1) -! c2 = ptr_futur_microlist(p2) -! do while(c1 < ptr_microlist(p1+1) .and. c2 < ptr_microlist(p2+1)) -! if(idx_microlist(c1) < idx_microlist(c2)) then -! c1 += 1 -! else if(idx_microlist(c1) > idx_microlist(c2)) then -! c2 += 1 -! else -! call i_H_j(exc_det,microlist(1,1,c1),N_int,hij) -! do j = 1, N_states -! i_H_psi_value2(j) = i_H_psi_value2(j) + psi_coef_microlist(c1,j)*hij -! end do -! c1 += 1 -! c2 += 1 -! endif -! end do -! else - call i_H_psi(exc_det,microlist(1,1,ptr_futur_microlist(sporb)),psi_coef_microlist(ptr_futur_microlist(sporb), 1),N_int,N_futur_microlist(sporb),psi_selectors_size*4,N_states,i_H_psi_value2) - i_H_psi_value = i_H_psi_value + i_H_psi_value2 - end if - - if(.true.) then ! DET DRIVEN - integer :: c1, c2 - double precision :: hij - c1 = ptr_futur_tmicrolist(p1) - c2 = ptr_futur_tmicrolist(p2) - do while(.true.) - if(c1 >= ptr_tmicrolist(p1+1) .or. c2 >= ptr_tmicrolist(p2+1)) then - if(ptr_tmicrolist(p1+1) /= c1) then - call i_H_psi(exc_det,tmicrolist(1,1,c1),psi_coef_tmicrolist(c1, 1),N_int, ptr_tmicrolist(p1+1)-c1 ,psi_selectors_size*3,N_states,i_H_psi_value2) - i_H_psi_value = i_H_psi_value + i_H_psi_value2 - end if - - if(ptr_tmicrolist(p2+1) /= c2) then - call i_H_psi(exc_det,tmicrolist(1,1,c2),psi_coef_tmicrolist(c2, 1),N_int, ptr_tmicrolist(p2+1)-c2 ,psi_selectors_size*3,N_states,i_H_psi_value2) - i_H_psi_value = i_H_psi_value + i_H_psi_value2 - endif - - exit - endif - - if(idx_tmicrolist(c1) < idx_tmicrolist(c2)) then - call i_H_j(exc_det,tmicrolist(1,1,c1),N_int,hij) - do j = 1, N_states - i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c1,j)*hij - enddo - c1 += 1 - else - call i_H_j(exc_det,tmicrolist(1,1,c2),N_int,hij) - do j = 1, N_states - i_H_psi_value(j) = i_H_psi_value(j) + psi_coef_tmicrolist(c2,j)*hij - enddo - if(idx_tmicrolist(c1) == idx_tmicrolist(c2)) c1 = c1 + 1 - c2 += 1 - end if - enddo - end if - - double precision :: Hii, diag_H_mat_elem_fock - Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),exc_det,fock_diag_tmp,N_int) - double precision :: delta_E, e_pert(N_states), e_pertm - e_pert(:) = 0d0 - e_pertm = 0d0 - - do k=1,N_states - if (i_H_psi_value(k) == 0.d0) cycle - delta_E = E0(k) - Hii - if (delta_E < 0.d0) then - e_pert(k) = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) - else - e_pert(k) = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * i_H_psi_value(k) * i_H_psi_value(k)) - delta_E) - endif - e_pertm += dabs(e_pert(k)) -! if(dabs(e_pert(k)) > dabs(e_pertm)) e_pertm = e_pert(k) - pt2(k) += e_pert(k) - enddo - if(dabs(e_pertm) > dabs(buf%mini)) then - call add_to_selection_buffer(buf, exc_det, e_pertm) - end if - enddo - enddo - enddo - enddo - enddo - enddo -end - - - -subroutine create_futur_ptr(ptr_microlist, idx_microlist, ptr_futur_microlist, N_futur_microlist, i_generator) - integer, intent(in) :: ptr_microlist(0:mo_tot_num * 2 + 1), idx_microlist(*), i_generator - integer, intent(out) :: ptr_futur_microlist(0:mo_tot_num * 2 + 1), N_futur_microlist(0:mo_tot_num * 2) - integer :: i, j - - N_futur_microlist = 0 - do i=0,mo_tot_num*2 - ptr_futur_microlist(i) = ptr_microlist(i+1) - do j=ptr_microlist(i), ptr_microlist(i+1) - 1 - if(idx_microlist(j) >= i_generator) then - ptr_futur_microlist(i) = j - N_futur_microlist(i) = ptr_microlist(i+1) - j - exit - end if - end do - end do -end subroutine - - -subroutine create_microlist_single(minilist, i_cur, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, Nint) - use bitmasks - integer, intent(in) :: Nint, i_cur, N_minilist - integer(bit_kind), intent(in) :: minilist(Nint,2,N_minilist), key_mask(Nint,2) - - integer, intent(out) :: N_microlist(0:mo_tot_num*2), ptr_microlist(0:mo_tot_num*2+1), idx_microlist(N_minilist*4) - integer(bit_kind), intent(out) :: microlist(Nint,2,N_minilist*4) - - integer :: i,j,k,s,nt,n_element(2) - integer :: list(Nint*bit_kind_size,2), cur_microlist(0:mo_tot_num*2+1) - integer(bit_kind) :: key_mask_neg(Nint,2), mobileMask(Nint,2) - integer :: mo_tot_num_2 - mo_tot_num_2 = mo_tot_num+mo_tot_num - - - do i=1,Nint - key_mask_neg(i,1) = not(key_mask(i,1)) - key_mask_neg(i,2) = not(key_mask(i,2)) - end do - - do i=0,mo_tot_num_2 - N_microlist(i) = 0 - enddo - - do i=1, N_minilist - nt = 0 - do j=1,Nint - mobileMask(j,1) = iand(key_mask_neg(j,1), minilist(j,1,i)) - mobileMask(j,2) = iand(key_mask_neg(j,2), minilist(j,2,i)) - nt += popcnt(mobileMask(j, 1)) + popcnt(mobileMask(j, 2)) - end do - - if(nt > 3) then !! TOO MANY DIFFERENCES - continue - else if(nt < 3) then - if(i < i_cur) then !!!!!!!!!!!!!!!!!!!!! DESACTIVADO - N_microlist(:) = 0 !!!! PAST LINKED TO EVERYBODY! - ptr_microlist(:) = 1 - return - else !! FUTUR LINKED TO EVERYBODY - N_microlist(0) = N_microlist(0) + 1 - endif - else - call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), Nint) - call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), Nint) - - do s=1,2 - do j=1,n_element(s) - nt = list(j,s) + mo_tot_num * (s-1) - N_microlist(nt) = N_microlist(nt) + 1 - end do - end do - endif - end do - - ptr_microlist(0) = 1 - do i=1,mo_tot_num_2+1 - ptr_microlist(i) = ptr_microlist(i-1) + N_microlist(i-1) - end do - - do i=0,mo_tot_num_2+1 - cur_microlist(i) = ptr_microlist(i) - end do - - - do i=1, N_minilist - do j=1,Nint - mobileMask(j,1) = iand(key_mask_neg(j,1), minilist(j,1,i)) - mobileMask(j,2) = iand(key_mask_neg(j,2), minilist(j,2,i)) - end do - - call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), Nint) - call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), Nint) - - - if(n_element(1) + n_element(2) < 3) then - idx_microlist(cur_microlist(0)) = i - do k=1,Nint - microlist(k,1,cur_microlist(0)) = minilist(k,1,i) - microlist(k,2,cur_microlist(0)) = minilist(k,2,i) - enddo - cur_microlist(0) = cur_microlist(0) + 1 - else if(n_element(1) + n_element(2) == 3) then - do s = 1, 2 - do j=1,n_element(s) - nt = list(j,s) + mo_tot_num * (s-1) - idx_microlist(cur_microlist(nt)) = i - do k=1,Nint - microlist(k,1,cur_microlist(nt)) = minilist(k,1,i) - microlist(k,2,cur_microlist(nt)) = minilist(k,2,i) - enddo - cur_microlist(nt) = cur_microlist(nt) + 1 - end do - end do - end if - end do -end subroutine - - -subroutine finish_isinwf(key_mask, keys, N_keys, isinwf) - use bitmasks - implicit none - - integer(bit_kind), intent(in) :: key_mask(N_int, 2), keys(N_int, 2, N_keys) - integer(bit_kind) :: key_mask_neg(N_int, 2) - integer(bit_kind) :: mobileMask(N_int, 2) - logical,intent(inout) :: isinwf(mo_tot_num*2, mo_tot_num*2) - integer, intent(in) :: N_keys - integer :: i,j,nt,nt2,list(2,2), n_element(2) - logical, external :: detEq - - do i=1,N_int - key_mask_neg(i,1) = not(key_mask(i,1)) - key_mask_neg(i,2) = not(key_mask(i,2)) - end do - - do i=1, N_keys - nt = 0 - - do j=1,N_int - mobileMask(j,1) = iand(key_mask_neg(j,1), keys(j,1,i)) - mobileMask(j,2) = iand(key_mask_neg(j,2), keys(j,2,i)) - nt += popcnt(mobileMask(j, 1)) + popcnt(mobileMask(j, 2)) - end do - - if(nt /= 2) cycle - - call bitstring_to_list(mobileMask(1,1), list(1,1), n_element(1), N_int) - call bitstring_to_list(mobileMask(1,2), list(1,2), n_element(2), N_int) - - if(n_element(1) >= 1) nt = list(1,1) - if(n_element(1) == 2) nt2 = list(2,1) - if(n_element(2) == 2) nt = list(2,2) + mo_tot_num - if(n_element(2) >= 1) nt2 = list(1,2) + mo_tot_num - - isinwf(nt, nt2) = .true. - isinwf(nt2, nt) = .true. - end do -end subroutine - - -subroutine create_microlist_double(minilist, i_cur, N_minilist, key_mask, microlist, idx_microlist, N_microlist, ptr_microlist, & - tmicrolist, idx_tmicrolist, N_tmicrolist, ptr_tmicrolist, & - isinwf, d0s, Nint) - use bitmasks - implicit none - integer, intent(in) :: Nint, i_cur, N_minilist - integer(bit_kind), intent(in) :: minilist(Nint,2,N_minilist), key_mask(Nint,2) - - integer, intent(out) :: N_microlist(0:mo_tot_num*2), ptr_microlist(0:mo_tot_num*2+1), idx_microlist(N_minilist*4) - integer(bit_kind), intent(out) :: microlist(Nint,2,N_minilist*4) - - integer, intent(out) :: N_tmicrolist(0:mo_tot_num*2), ptr_tmicrolist(0:mo_tot_num*2+1), idx_tmicrolist(N_minilist*4) - integer(bit_kind), intent(out) :: tmicrolist(Nint,2,N_minilist*4) - - - integer :: i,j,k,s,nt,nt2 - integer, allocatable :: n_element(:,:), idx(:), list(:,:,:) - integer :: cur_microlist(0:mo_tot_num*2+1), cur_tmicrolist(0:mo_tot_num*2+1) - integer(bit_kind) :: key_mask_neg(Nint,2), mobileMask(Nint,2), tmp_det(Nint, 2) - integer :: mo_tot_num_2, pwen(4), pweni - logical,intent(out) :: isinwf(mo_tot_num*2, mo_tot_num*2) - double precision, intent(out) :: d0s(mo_tot_num, mo_tot_num, N_states) - double precision :: integ(mo_tot_num, mo_tot_num) - logical :: localbanned(mo_tot_num*2), banned(mo_tot_num*2), banned_pair(mo_tot_num*2, mo_tot_num*2), ok - banned = .false. - banned_pair = .false. - - allocate(list(4,2,N_minilist), n_element(2,N_minilist), idx(0:N_minilist)) - - isinwf = .false. - integ = 0d0 - d0s = 0d0 - mo_tot_num_2 = mo_tot_num+mo_tot_num - - idx(0) = 0 - do i=1,Nint - key_mask_neg(i,1) = not(key_mask(i,1)) - key_mask_neg(i,2) = not(key_mask(i,2)) - end do - - do i=0,mo_tot_num_2 - N_microlist(i) = 0 - N_tmicrolist(i) = 0 - enddo - - do i=1, N_minilist - nt = 0 - do j=1,Nint - mobileMask(j,1) = iand(key_mask_neg(j,1), minilist(j,1,i)) - mobileMask(j,2) = iand(key_mask_neg(j,2), minilist(j,2,i)) - nt += popcnt(mobileMask(j, 1)) + popcnt(mobileMask(j, 2)) - end do - - if(nt > 4) cycle !! TOO MANY DIFFERENCES - idx(0) += 1 - idx(idx(0)) = i - - call bitstring_to_list(mobileMask(1,1), list(1,1,idx(0)), n_element(1, idx(0)), Nint) - call bitstring_to_list(mobileMask(1,2), list(1,2,idx(0)), n_element(2, idx(0)), Nint) - - - if(nt == 2) then - if(i < i_cur) then - N_microlist(:) = 0 - ptr_microlist = 1 - N_tmicrolist = 0 - ptr_tmicrolist = 1 - return - else - N_microlist(0) = N_microlist(0) + 1 - endif - else - do s=1,2 - do j=1,n_element(s,idx(0)) - k = list(j,s,idx(0)) + mo_tot_num * (s-1) - if(nt == 4) N_microlist(k) = N_microlist(k) + 1 - if(nt == 3) then - N_tmicrolist(k) = N_tmicrolist(k) + 1 - if(idx(i) < i_cur) banned(nt) = .true. - end if - end do - end do - endif - end do - - ptr_microlist(0) = 1 - ptr_tmicrolist(0) = 1 - do i=1,mo_tot_num_2+1 - ptr_microlist(i) = ptr_microlist(i-1) + N_microlist(i-1) - ptr_tmicrolist(i) = ptr_tmicrolist(i-1) + N_tmicrolist(i-1) - end do - - do i=0,mo_tot_num_2+1 - cur_microlist(i) = ptr_microlist(i) - cur_tmicrolist(i) = ptr_tmicrolist(i) - end do - - - do i=1, idx(0) - if(n_element(1, i) + n_element(2, i) == 2) cycle - pweni = 0 - do s = 1, 2 - do j=1,n_element(s,i) - nt = list(j,s,i) + mo_tot_num * (s-1) - pweni += 1 - pwen(pweni) = nt - if(n_element(1,i) + n_element(2,i) == 4) then - idx_microlist(cur_microlist(nt)) = idx(i) - do k=1,Nint - microlist(k,1,cur_microlist(nt)) = minilist(k,1,idx(i)) - microlist(k,2,cur_microlist(nt)) = minilist(k,2,idx(i)) - enddo - cur_microlist(nt) = cur_microlist(nt) + 1 - else - idx_tmicrolist(cur_tmicrolist(nt)) = idx(i) - do k=1,Nint - tmicrolist(k,1,cur_tmicrolist(nt)) = minilist(k,1,idx(i)) - tmicrolist(k,2,cur_tmicrolist(nt)) = minilist(k,2,idx(i)) - enddo - cur_tmicrolist(nt) = cur_tmicrolist(nt) + 1 - endif - end do - end do - if(idx(i) < i_cur .and. pweni == 4) then - do j=1,4 - do k=j+1,4 - banned_pair(pwen(j), pwen(k)) = .true. - banned_pair(pwen(k), pwen(j)) = .true. - end do - end do - end if - end do - - - do i=1, idx(0) - if(n_element(1, i) + n_element(2, i) <= 2) then - idx_microlist(cur_microlist(0)) = idx(i) - do k=1,Nint - microlist(k,1,cur_microlist(0)) = minilist(k,1,idx(i)) - microlist(k,2,cur_microlist(0)) = minilist(k,2,idx(i)) - enddo - cur_microlist(0) = cur_microlist(0) + 1 - - if(n_element(1,i) >= 1) nt = list(1,1,i) - if(n_element(1,i) == 2) nt2 = list(2,1,i) - if(n_element(2,i) == 2) nt = list(2,2,i) + mo_tot_num - if(n_element(2,i) >= 1) nt2 = list(1,2,i) + mo_tot_num - - isinwf(nt, nt2) = .true. - isinwf(nt2, nt) = .true. - !!!! INTEGRAL DRIVEN -! !!!!!!!!!!!!!!!!!!!! - call get_d0(minilist(1,1,idx(i)), banned, banned_pair, d0s, key_mask, 1+(nt2-1)/mo_tot_num, 1+(nt-1)/mo_tot_num, & - mod(nt2-1, mo_tot_num)+1, mod(nt-1, mo_tot_num)+1, psi_selectors_coef_transp(1,idx(i))) - -! do j=1, N_states -! do nt2=1, mo_tot_num -! do nt=1, mo_tot_num -! d0s(nt,nt2,j) = d0s(nt,nt2,j) + (integ(nt,nt2) * psi_selectors_coef(idx(i), j)) !!! SUPPOSE MINILIST = SELECTORS !!!! -! end do -! end do -! end do - else if(.false. .and. n_element(1, i) + n_element(2, i) == 3) then ! INTEGRAL DRIVEN - ! -459.6399263191298 - pweni = 0 - do s = 1, 2 - do j=1,n_element(s,i) - nt = list(j,s,i) + mo_tot_num * (s-1) - pweni += 1 - pwen(pweni) = nt - end do - end do - - call get_d1(minilist(1,1,idx(i)), banned, banned_pair, d0s, key_mask, pwen, psi_selectors_coef_transp(1,idx(i))) - -! do k=1, N_states -! do nt2=1, mo_tot_num -! do nt=1, mo_tot_num -! d0s(nt,nt2,k) = d0s(nt,nt2,k) + (integ(nt,nt2) * psi_selectors_coef(idx(i), k)) !!! SUPPOSE MINILIST = SELECTORS !!!! -! end do -! end do -! end do - end if - end do - - -end subroutine - - -subroutine get_d1(gen, banned, banned_pair, mat, mask, pwen, coefs) - use bitmasks - implicit none - - integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2) - logical, intent(in) :: banned(mo_tot_num*2), banned_pair(mo_tot_num*2, mo_tot_num*2) - integer(bit_kind) :: deth(N_int, 2), det(N_int, 2), i8 - double precision, intent(in) :: coefs(N_states) - double precision, intent(inout) :: mat(mo_tot_num, mo_tot_num, N_states) - double precision :: hij, phase, inv, inv2 - integer, intent(in) :: pwen(3) - integer :: s(3), p(3), i, j, k, h1, h2, ns(2), sm, mwen, a1, a2, pwens(2), sp, st - integer :: sfix, pfix - integer :: exc(0:2, 2, 2) - logical :: lbanned(mo_tot_num*2) - logical :: ok, mono, ab - integer :: tmp_array(4) - - lbanned = banned - !mat = 0d0 - pwens = 0 - - ns = 0 - do sp=1,2 - do i=1, N_int - ns(sp) += popcnt(gen(i, sp)) - popcnt(mask(i, sp)) - i8 = iand(not(gen(i, sp)), mask(i, sp)) - if(i8 /= 0_8) then - sfix = sp - pfix = 1+trailz(i8) + bit_kind*8*(i-1) - end if - end do - end do - - - do i=1,3 - s(i) = 1+(pwen(i)-1)/mo_tot_num - p(i) = 1+mod(pwen(i)-1, mo_tot_num) - pwens(s(i)) += 1 - end do - - do i=1,3 - if(s(i) == 1 .and. ns(1) == 0) cycle - if(s(i) == 2 .and. ns(2) == 0) cycle - if(lbanned(pwen(i))) cycle - ab = pwens(s(i)) == 2 - - if(ns(1) == 1) sm = mod(s(i), 2) + 1 - if(ns(1) == 2) sm = 1 - if(ns(2) == 2) sm = 2 - - lbanned(pwen(i)) = .true. - - if(ab) then - if(s(mod(i,3)+1) == 2) then - a1 = mod(i, 3) + 1 - a2 = mod(i+1, 3) + 1 - else - a2 = mod(i,3)+1 - a1 = mod(i+1,3)+1 - end if - - exc(0, :, 1) = 1 - exc(0, :, 2) = 1 - exc(1, 1, 1) = p(a2) - exc(1, 1, 2) = p(a1) - exc(1, 2, sfix) = pfix - - call apply_particle(mask, 0, 0 ,s(i), p(i), deth, ok, N_int) - - do j=1,mo_tot_num - mwen = j + (sm-1)*mo_tot_num - if(lbanned(mwen)) cycle - tmp_array = (/0,0,sm,j/) - call apply_particle(deth, 0, 0 ,s(i), p(i), det, ok, N_int) - if(.not. ok) cycle - - mono = mwen == pwen(a1) .or. mwen == pwen(a2) - if(mono) then - call i_h_j(gen, det, N_int, hij) - else - exc(1, 2, sm) = j - call get_double_excitation_phase(gen, det, exc, phase, N_int) - if(sfix == 1) hij = integral8(j, pfix, p(a1), p(a2)) * phase - if(sfix == 2) hij = integral8(pfix, j, p(a1), p(a2)) * phase - end if - - if(ns(1) == 1) then - do st=1, N_states - if(sm == 2) mat(j, p(i), st) = mat(j, p(i), st) + hij * coefs(st) - if(sm == 1) mat(p(i), j, st) = mat(p(i), j, st) + hij * coefs(st) - end do - else - do st=1, N_states - mat(j, p(i), st) += hij * coefs(st) - mat(p(i), j, st) += hij * coefs(st) - end do - end if - end do - - else !! AA / BB - a1 = mod(i,3)+1 - a2 = mod(i+1,3)+1 - - h1 = p(a1) - h2 = p(a2) - inv = 1d0 - if(h1 > h2) inv = -1d0 - - if(pwens(s(i)) == 1) sp = mod(s(i), 2)+1 - if(pwens(s(i)) == 3) sp = s(i) - - exc(0, :, sp) = 2 - exc(0, :, mod(sp, 2)+1) = 0 - exc(1, 1, sp) = min(h1, h2) - exc(2, 1, sp) = max(h1, h2) - - call apply_particle(mask, 0, 0 ,s(i), p(i) , deth, ok, N_int) - - do j=1,mo_tot_num - if(j == pfix) inv = -inv - mwen = j + (sm-1)*mo_tot_num - if(lbanned(mwen)) cycle - call apply_particle(deth, 0, 0 ,s(i), p(i) , det, ok, N_int) - if(.not. ok) cycle - - mono = mwen == pwen(a1) .or. mwen == pwen(a2) - if(mono) then - call i_h_j(gen, det, N_int, hij) - else - exc(1, 2, sfix) = min(j,pfix) - exc(2, 2, sp) = max(j,pfix) - call get_double_excitation_phase(gen, det, exc, phase, N_int) - hij = (integral8(j, pfix, h1, h2) - integral8(pfix,j, h1, h2))*phase*inv - end if - if(ns(1) == 1) then - do st=1, N_states - if(sm == 2) mat(j, p(i), st) = mat(j, p(i), st) + hij * coefs(st) - if(sm == 1) mat(p(i), j, st) = mat(p(i), j, st) + hij * coefs(st) - end do - else - do st=1, N_states - mat(j, p(i), st) += hij * coefs(st) - mat(p(i), j, st) += hij * coefs(st) - end do - end if - end do - end if - end do - -end subroutine - - -subroutine get_d0(gen, banned, banned_pair, mat, mask, s1, s2, h1, h2, coefs) - use bitmasks - implicit none - - double precision, intent(inout) :: mat(mo_tot_num, mo_tot_num, N_states) - logical, intent(in) :: banned(mo_tot_num*2), banned_pair(mo_tot_num*2, mo_tot_num*2) - double precision :: mat_mwen(mo_tot_num, mo_tot_num) - double precision, intent(in) :: coefs(N_states) - integer, intent(in) :: h1, h2, s1, s2 - integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2) - integer(bit_kind) :: det1(N_int, 2), det2(N_int, 2) - logical :: ok, mono - double precision :: phase, phase2, inv, hij - integer :: p1, p2, hmi, hma, ns1, ns2, st - logical, external :: detEq - integer :: exc(0:2, 2, 2), exc2(0:2,2,2) - integer :: tmp_array(4) - - exc = 0 -! mat_mwen = integral8(:,:,h1,h2) - !call get_mo_bielec_integrals_ij(h1, h2 ,mo_tot_num,mat_mwen,mo_integrals_map) - - ns1 = mo_tot_num*(s1-1) - ns2 = mo_tot_num*(s2-1) - - !mat = 0d0 - if(s1 == s2) then - hmi = min(h1, h2) - hma = max(h1, h2) - inv = 1d0 - if(h1 > h2) inv = -1d0 - exc(0, :, s1) = 2 - exc(1, 1, s1) = hmi - exc(2, 1, s1) = hma - do p2=1,mo_tot_num - if(banned(p2 + ns2)) cycle - do p1=1,mo_tot_num - if(banned(p1 + ns1)) cycle - if(p1 == p2) cycle - if(banned_pair(p1 + ns1, p2 + ns2)) cycle - !tmp_array = (/s1,p1,s2,p2/) - call apply_particle(mask, s1,p1,s2,p2, det2, ok, N_int) - if(.not. ok) cycle - mono = (hmi == p1 .or. hma == p2 .or. hmi == p2 .or. hma == p1) - if(mono) then - - call i_h_j(gen, det2, N_int, hij) - do st=1, N_states - mat(p1, p2, st) += hij * coefs(st) - end do - else - exc(1, 2, s1) = min(p1, p2) - exc(2, 2, s2) = max(p2, p1) - call get_double_excitation_phase(gen, det2, exc, phase, N_int) - do st=1, N_states - mat(p1, p2, st) += coefs(st) * inv * (integral8(p1, p2, h1, h2) - integral8(p2, p1, h1, h2)) * phase - end do - end if - end do - end do - else - exc(0, :, 1) = 1 - exc(0, :, 2) = 1 - if(s1 /= 2) stop "alpha beta inversified" - exc(1, 1, 1) = h2 - exc(1, 1, 2) = h1 - - do p2=1, mo_tot_num - if(banned(p2 + ns2)) cycle - do p1=1, mo_tot_num - if(banned(p1 + ns1)) cycle - if(banned_pair(p1 + ns1, p2 + ns2)) cycle - !tmp_array = (/s1,p1,s2,p2/) - call apply_particle(mask, s1,p1,s2,p2, det2, ok, N_int) - if(.not. ok) cycle - mono = (h1 == p1 .or. h2 == p2) - if(mono) then - call i_h_j(gen, det2, N_int, hij) - do st=1, N_states - mat(p1, p2, st) += hij * coefs(st) - end do - else - exc(1, 2, s1) = p1 - exc(1, 2, s2) = p2 - call get_double_excitation_phase(gen, det2, exc, phase, N_int) - do st=1, N_states - mat(p1, p2, st) += coefs(st) * integral8(p1, p2, h1, h2) * phase - end do - !mat(p1, p2) = integral8(p1, p2, h1, h2) * phase - end if - end do - end do - end if -end subroutine - - -subroutine check_past(det, list, idx, N, cur, ok, Nint) - implicit none - use bitmasks - - integer(bit_kind), intent(in) :: det(Nint, 2), list(Nint, 2, N) - integer, intent(in) :: Nint, idx(N), N, cur - logical, intent(out) :: ok - integer :: i,s,ni - - ok = .false. - do i=1,N - if(idx(i) >= cur) exit - s = 0 - do ni=1,Nint - s += popcnt(xor(det(ni,1), list(ni,1,i))) + popcnt(xor(det(ni,2), list(ni,2,i))) - end do - if(s <= 4) then - ok = .true. - return - end if - end do -end subroutine - - -subroutine check_past_s(det, list, N, ok, Nint) - implicit none - use bitmasks - - integer(bit_kind), intent(in) :: det(Nint, 2), list(Nint, 2, N) - integer, intent(in) :: Nint, N - logical, intent(out) :: ok - integer :: i,s,ni - - ok = .false. - do i=1,N - s = 0 - do ni=1,Nint - s += popcnt(xor(det(ni,1), list(ni,1,i))) + popcnt(xor(det(ni,2), list(ni,2,i))) - end do - if(s <= 4) then - ok = .true. - return - end if - end do -end subroutine +use bitmasks + +BEGIN_PROVIDER [ double precision, integral8, (mo_tot_num, mo_tot_num, mo_tot_num, mo_tot_num) ] + use bitmasks + implicit none + + integer :: h1, h2 + + integral8 = 0d0 + do h1=1, mo_tot_num + do h2=1, mo_tot_num + call get_mo_bielec_integrals_ij(h1, h2 ,mo_tot_num,integral8(1,1,h1,h2),mo_integrals_map) + end do + end do +END_PROVIDER + + +BEGIN_PROVIDER [ integer(bit_kind), psi_phasemask, (N_int, 2, N_det)] + use bitmasks + implicit none + + integer :: i + print *, "pro" + print *, "pross" + do i=1, N_det + call get_mask_phase(psi_det_sorted(1,1,i), psi_phasemask(1,1,i)) + end do +END_PROVIDER + + +subroutine assert(cond, msg) + character(*), intent(in) :: msg + logical, intent(in) :: cond + + if(.not. cond) then + print *, "assert fail: "//msg + stop + end if +end subroutine + + +subroutine get_mask_phase(det, phasemask) + use bitmasks + implicit none + + integer(bit_kind), intent(in) :: det(N_int, 2) + integer(bit_kind), intent(out) :: phasemask(N_int, 2) + integer :: s, ni, i + logical :: change + + do s=1,2 + change = .false. + do ni=1,N_int + do i=0,bit_kind_size-1 + if(BTEST(det(ni, s), i)) change = .not. change + if(change) phasemask(ni, s) = ibset(phasemask(ni, s), i) + end do + end do + end do +end subroutine + + +subroutine select_connected(i_generator,E0,pt2,b) + use bitmasks + use selection_types + implicit none + integer, intent(in) :: i_generator + type(selection_buffer), intent(inout) :: b + double precision, intent(inout) :: pt2(N_states) + integer :: k,l + double precision, intent(in) :: E0(N_states) + + integer(bit_kind) :: hole_mask(N_int,2), particle_mask(N_int,2) + double precision :: fock_diag_tmp(2,mo_tot_num+1) + + print *, "BEG" + + + call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) + + do l=1,N_generators_bitmask + do k=1,N_int + hole_mask(k,1) = iand(generators_bitmask(k,1,s_hole,l), psi_det_generators(k,1,i_generator)) + hole_mask(k,2) = iand(generators_bitmask(k,2,s_hole,l), psi_det_generators(k,2,i_generator)) + particle_mask(k,1) = iand(generators_bitmask(k,1,s_part,l), not(psi_det_generators(k,1,i_generator)) ) + particle_mask(k,2) = iand(generators_bitmask(k,2,s_part,l), not(psi_det_generators(k,2,i_generator)) ) + + hole_mask(k,1) = ior(generators_bitmask(k,1,s_hole,l), generators_bitmask(k,1,s_part,l)) + hole_mask(k,2) = ior(generators_bitmask(k,2,s_hole,l), generators_bitmask(k,2,s_part,l)) + particle_mask(k,:) = hole_mask(k,:) + enddo + + print *, "sel" +! call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) + print *, "poivre" + print *, b%cur, b%N + call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) + print *, b%cur, b%N + print *, "paprika" + enddo + print *, "safran" +end subroutine + + +subroutine spot_occupied(mask, bannedOrb) + use bitmasks + implicit none + + integer(bit_kind),intent(in) :: mask(N_int, 2) + logical, intent(inout) :: bannedOrb(mo_tot_num, 2) + integer :: s, i, ne, list(mo_tot_num) + + do s=1,2 + call bitstring_to_list(mask(1,s), list, ne, N_int) + do i=1, ne + bannedOrb(list(i), s) = .true. + end do + end do +end subroutine + + +double precision function get_phase_bi(phasemask, s1, s2, h1, p1, h2, p2) + use bitmasks + implicit none + + integer(bit_kind), intent(in) :: phasemask(N_int, 2) + integer, intent(in) :: s1, s2, h1, h2, p1, p2 + logical :: change + + !ASSERT(h1 <= h2 .and. p1 <= p2) + change = btest(phasemask(ishft(h1, bit_kind_shift), s1), iand(h1, 63_8)) + change = xor(change, btest(phasemask(ishft(p1, bit_kind_shift), s1), iand(p1, 63_8))) + + change = xor(change, btest(phasemask(ishft(h2, bit_kind_shift), s2), iand(h2, 63_8))) + change = xor(change, btest(phasemask(ishft(p2, bit_kind_shift), s2), iand(p2, 63_8))) + + get_phase_bi = 1d0 + if(s1 == s2) then + if(xor(change, max(h1, p1) > min(h2, p2))) get_phase_bi = -1d0 + else + if(change) get_phase_bi = -1d0 + end if +end subroutine + + +double precision function get_phase_mono(phasemask, s1, h1, p1) + use bitmasks + implicit none + + integer(bit_kind), intent(in) :: phasemask(N_int, 2) + integer, intent(in) :: s1, h1, p1 + logical :: change + + change = btest(phasemask(ishft(h1, bit_kind_shift), s1), iand(h1, 63_8)) + change = xor(change, btest(phasemask(ishft(p1, bit_kind_shift), s1), iand(p1, 63_8))) + + get_phase_mono = 1d0 + if(change) get_phase_mono = -1d0 +end subroutine + + + diff --git a/plugins/Full_CI_ZMQ/selection_double.irp.f b/plugins/Full_CI_ZMQ/selection_double.irp.f new file mode 100644 index 00000000..f6a76141 --- /dev/null +++ b/plugins/Full_CI_ZMQ/selection_double.irp.f @@ -0,0 +1,512 @@ + +subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf) + use bitmasks + use selection_types + implicit none + + integer, intent(in) :: i_generator + integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) + double precision, intent(in) :: fock_diag_tmp(mo_tot_num) + double precision, intent(in) :: E0(N_states) + double precision, intent(inout) :: pt2(N_states) + type(selection_buffer), intent(inout) :: buf + + double precision :: mat(N_states, mo_tot_num, mo_tot_num) + integer :: h1,h2,s1,s2,i1,i2,ib,sp,k + integer(bit_kind) :: hole(N_int,2), particle(N_int,2), mask(N_int, 2) + logical :: fullMatch, ok + + do k=1,N_int + hole (k,1) = iand(psi_det_generators(k,1,i_generator), hole_mask(k,1)) + hole (k,2) = iand(psi_det_generators(k,2,i_generator), hole_mask(k,2)) + particle(k,1) = iand(not(psi_det_generators(k,1,i_generator)), particle_mask(k,1)) + particle(k,2) = iand(not(psi_det_generators(k,2,i_generator)), particle_mask(k,2)) + enddo + + integer :: N_holes(2), N_particles(2) + integer :: hole_list(N_int*bit_kind_size,2) + integer :: particle_list(N_int*bit_kind_size,2) + + call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) + call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) + + + do s1=1,2 + do s2=s1,2 + sp = s1 + if(s1 /= s2) sp = 3 + do i1=N_holes(s1),1,-1 ! Generate low excitations first + ib = 1 + if(s1 == s2) ib = i1+1 + do i2=N_holes(s2),ib,-1 ! Generate low excitations first + h1 = hole_list(i1,s1) + h2 = hole_list(i2,s2) + call apply_holes(psi_det_generators(1,1,i_generator), s1,h1,s2,h2, mask, ok, N_int) + + logical :: banned(mo_tot_num, mo_tot_num) + logical :: bannedOrb(mo_tot_num, 2) + + banned = .false. + bannedOrb = .false. + + call spot_isinwf(mask, psi_det_sorted, i_generator, N_det, banned, fullMatch) + if(fullMatch) cycle + call spot_occupied(mask, bannedOrb) + mat = 0d0 + call splash_pq(mask, sp, psi_det_sorted, i_generator, N_det_selectors, bannedOrb, banned, mat) + + call fill_buffer_double(i_generator, sp, h1, h2, banned, bannedOrb, fock_diag_tmp, E0, mat, buf) + end do + end do + end do + end do +end subroutine + + +subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_diag_tmp, E0, mat, buf) + use bitmasks + use selection_types + implicit none + + integer, intent(in) :: i_generator, sp, h1, h2 + double precision, intent(in) :: mat(N_states, mo_tot_num, mo_tot_num) + logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num) + double precision, intent(in) :: fock_diag_tmp(mo_tot_num) + double precision, intent(in) :: E0(N_states) + type(selection_buffer), intent(inout) :: buf + logical :: ok + integer :: s1, s2, p1, p2, ib + integer(bit_kind) :: mask(N_int, 2), det(N_int, 2) + double precision :: e_pert, delta_E, val, Hii + double precision, external :: diag_H_mat_elem_fock + + if(N_states > 1) stop "fill_buffer_double N_states > 1" + + if(sp == 3) then + s1 = 1 + s2 = 2 + else + s1 = sp + s2 = sp + end if + + call apply_holes(psi_det_generators(1,1,i_generator), s1, h1, s2, h2, mask, ok, N_int) + + do p1=1,mo_tot_num + if(bannedOrb(p1, s1)) cycle + ib = 1 + if(sp /= 3) ib = p1+1 + do p2=ib,mo_tot_num + if(bannedOrb(p2, s2)) cycle + if(banned(p1,p2)) cycle + if(mat(1, p1, p2) == 0d0) cycle + call apply_particles(mask, s1, p1, s2, p2, det, ok, N_int) + val = mat(1, p1, p2) + + Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),det,fock_diag_tmp,N_int) + + delta_E = E0(1) - Hii + if (delta_E < 0.d0) then + e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) + else + e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) + endif + if(dabs(e_pert) > buf%mini) call add_to_selection_buffer(buf, det, e_pert) + end do + end do +end subroutine + + +subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) + use bitmasks + implicit none + + integer(bit_kind),intent(in) :: mask(N_int, 2), det(N_int, 2, N_sel) + integer, intent(in) :: sp, i_gen, N_sel + logical, intent(inout) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num) + double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) ! intent out + + integer :: i, j, h(0:2,2), p(0:4,2), nt + integer(bit_kind) :: perMask(N_int, 2), mobMask(N_int, 2), negMask(N_int, 2) + + + do i=1,N_int + negMask(i,1) = not(mask(i,1)) + negMask(i,2) = not(mask(i,2)) + end do + + do i=1, N_sel + nt = 0 + do j=1,N_int + mobMask(j,1) = iand(negMask(j,1), det(j,1,i)) + mobMask(j,2) = iand(negMask(j,2), det(j,2,i)) + nt += popcnt(mobMask(j, 1)) + popcnt(mobMask(j, 2)) + end do + + if(nt > 4) cycle + + do j=1,N_int + perMask(j,1) = iand(mask(j,1), not(det(j,1,i))) + perMask(j,2) = iand(mask(j,2), not(det(j,2,i))) + end do + + call bitstring_to_list(perMask(1,1), h(1,1), h(0,1), N_int) + call bitstring_to_list(perMask(1,2), h(1,2), h(0,2), N_int) + + call bitstring_to_list(mobMask(1,1), p(1,1), p(0,1), N_int) + call bitstring_to_list(mobMask(1,2), p(1,2), p(0,2), N_int) + + if(i < i_gen) then + if(nt == 4) call past_d2(banned, p, sp) + if(nt == 3) call past_d1(bannedOrb, p) + else + if(i == i_gen) mat = 0d0 + if(nt == 4) then + call get_d2(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + else if(nt == 3) then + call get_d1(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + else + call get_d0(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + end if + end if + end do +end subroutine + + +subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) + use bitmasks + implicit none + + integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2), phasemask(N_int, 2) + logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num) + double precision, intent(in) :: coefs(N_states) + double precision, intent(inout) :: mat(mo_tot_num, mo_tot_num, N_states) + integer, intent(in) :: h(0:2,2), p(0:4,2), sp + + double precision, external :: get_phase_bi + + integer :: i, j, tip, ma, mi, puti, putj + integer :: h1, h2, p1, p2 + double precision :: hij, phase + + tip = p(0,1) * p(0,2) + ma = sp + if(p(0,1) > p(0,2)) ma = 1 + if(p(0,1) < p(0,2)) ma = 2 + mi = mod(ma, 2) + 1 + + if(sp == 3) then + if(tip == 3) then + putj = p(1, 2) + do i = 1, 3 + puti = p(i, ma) + + p1 = p(mod(i, 3) + 1, ma) + p2 = p(mod(i+1, 3) + 1, ma) + + hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, ma, ma, h1, p1, h2, p2) + + if(ma == 1) then + mat(:, puti, putj) += coefs * hij + else + mat(:, putj, puti) += coefs * hij + end if + end do + else ! tip == 4 + do i = 1,2 + do j = 1,2 + puti = p(i, 1) + putj = p(j, 2) + p1 = p(mod(i, 2) + 1, 1) + p2 = p(mod(j, 2) + 1, 2) + + hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) + + mat(:, puti, putj) += coefs * hij + end do + end do + end if + + else !! AA/BB + + if(tip == 0) then + do i=1,3 + puti = p(i, ma) + do j=i+1,4 + putj = p(j, ma) + if(j == i+1) then + p1 = p(mod(j, 4) + 1, ma) + p2 = p(mod(j+1, 4) + 1, ma) + else if(j == i+2) then + p1 = p(mod(i, 4) + 1, ma) + p2 = p(mod(j, 4) + 1, ma) + else + p1 = 2 + p2 = 3 + end if + + hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, ma, ma, h1, p1, h2, p2) + mat(:, puti, putj) += coefs * hij + end do + end do + else if(tip == 3) then + p2 = p(1, mi) + do i=1,3 + p1 = p(i, ma) + puti = p(mod(i, 3) + 1, ma) + putj = p(mod(i+1, 3) + 1, ma) + hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, ma, mi, h1, p1, h2, p2) + mat(:, min(puti, putj), max(puti, putj)) += coefs * hij + end do + else ! tip == 4 + puti = p(1, sp) + putj = p(2, sp) + p1 = p(1, mi) + p2 = p(2, mi) + hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, mi, mi, h1, p1, h2, p2) + mat(:, puti, putj) += coefs * hij + end if + end if +end subroutine + + + +subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, ho, pa, sp, coefs) + use bitmasks + implicit none + + integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2), phasemask(N_int, 2) + logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num) + integer(bit_kind) :: det(N_int, 2) + double precision, intent(in) :: coefs(N_states) + double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) + double precision :: hij, tmp_row(N_states, mo_tot_num) + double precision, external :: get_phase_bi + + logical :: lbanned(mo_tot_num, 2), ok + integer :: ms, i, i1, i2, j, hole, tmp, s(3), p(3) + + integer, intent(in) :: ho(0:2,2), pa(0:4,2), sp + + do i = 1, pa(0,1) + s(i) = 1 + p(i) = pa(i, 1) + end do + + j = i + + do i = 1, pa(0,2) + s(j) = 2 + p(j) = pa(i, 2) + j += 1 + end do + + if(ho(0,1) == 1) then + hole = ho(1,1) + else + hole = ho(1,2) + end if + + lbanned = bannedOrb + + do i=1, 3 + lbanned(p(i), s(i)) = .true. + end do + + do i=1, 3 + if(lbanned(p(i), s(i))) cycle + if(sp /= 3 .and. sp /= s(i)) cycle + ms = sp + if(sp == 3) ms = mod(s(i), 2) + 1 + i1 = mod(i,3)+1 + i2 = mod(i+1,3)+1 + + if(s(i1) /= s(i2)) then + if(s(i1) /= ms) then + tmp = i1 + i1 = i2 + i2 = tmp + end if + tmp_row = 0d0 + do j=1,mo_tot_num + if(lbanned(j, s(i))) cycle + tmp_row(:, j) += coefs * integral8(p(i1), p(i2), j, hole) * get_phase_bi(phasemask, 1, 2, j, p(i1), hole, p(i2)) + end do + if(ms == 1) then + mat(:, :, p(i)) += tmp_row + else + mat(:, p(i), :) += tmp_row + end if + else + do j=1,mo_tot_num + if(lbanned(j, s(i))) cycle + tmp_row(:, j) += coefs * (integral8(p(i1), p(i2), j, hole) - integral8(p(i2), p(i1), j, hole)) * get_phase_bi(phasemask, 1, 2, j, p(i1), hole, p(i2)) + end do + mat(:, :p(i), p(i)) += tmp_row(:, :p(i)) + mat(:, p(i), p(i):) += tmp_row(:, p(i):) + end if + end do + !! MONO + do i=1, 2 + do j=i+1,3 + if(bannedOrb(p(i), s(i)) .or. bannedOrb(p(j), s(j))) cycle + if((s(i) /= s(j) .or. sp /= s(i)) .and. (s(i) == s(j) .or. sp /= 3)) cycle + call apply_particles(mask, s(i), p(i), s(j), p(j), det, ok, N_int) + call i_h_j(gen, det, N_int, hij) + + if(s(i) == s(j)) then + mat(:, p(i), p(j)) += coefs * hij + else if(s(i) == 1) then + mat(:, p(i), p(j)) += coefs * hij + else + mat(:, p(j), p(i)) += coefs * hij + end if + end do + end do +end subroutine + + + + +subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) + use bitmasks + implicit none + + integer(bit_kind), intent(in) :: gen(N_int, 2), mask(N_int, 2), phasemask(N_int, 2) + logical, intent(in) :: bannedOrb(mo_tot_num), banned(mo_tot_num, mo_tot_num) + integer(bit_kind) :: det(N_int, 2) + double precision, intent(in) :: coefs(N_states) + double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) + integer, intent(in) :: h(0:2,2), p(0:4,2), sp + + integer :: i, j, s, h1, h2, p1, p2 + double precision :: hij + double precision, external :: get_phase_bi + logical :: ok + + if(sp == 3) then ! AB + h1 = p(1,1) + h2 = p(1,2) + do p1=1, mo_tot_num + if(bannedOrb(i)) cycle + do p2=1, mo_tot_num + if(bannedOrb(j)) cycle + if(banned(i, j)) cycle ! rentable? + if(p1 == h1 .or. p2 == h2) then + call apply_particles(mask, 1,p1,2,p2, det, ok, N_int) + call i_h_j(gen, det, N_int, hij) + mat(:, p1, p2) += coefs * hij + else + mat(:, p1, p2) += coefs * integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) + end if + end do + end do + else ! AA BB + s = 1 + if(p(0,2) == 2) s =2 + h1 = p(1,s) + h2 = p(2,s) + do p1=1, mo_tot_num + if(bannedOrb(i)) cycle + do p2=p1+1, mo_tot_num + if(bannedOrb(j)) cycle + if(banned(i, j)) cycle ! rentable? + if(p1 == h1 .or. p2 == h2 .or. p1 == h2 .or. p2 == h1) then + call apply_particles(mask, s,p1,s,p2, det, ok, N_int) + ASSERT(ok) + call i_h_j(gen, det, N_int, hij) + mat(:, p1, p2) += coefs * hij + else + mat(:, p1, p2) += coefs * (integral8(p1, p2, h1, h2) - integral8(p2, p1, h1, h2))* get_phase_bi(phasemask, s, s, h1, p1, h2, p2) + end if + end do + end do + end if +end subroutine + + +subroutine past_d1(bannedOrb, p) + use bitmasks + implicit none + + logical, intent(inout) :: bannedOrb(mo_tot_num, 2) + integer, intent(in) :: p(0:4, 2) + integer :: i,s + + do s = 1, 2 + do i = 1, p(0, s) + bannedOrb(p(i, s), s) = .true. + end do + end do +end subroutine + + +subroutine past_d2(banned, p, sp) + use bitmasks + implicit none + + logical, intent(inout) :: banned(mo_tot_num, mo_tot_num) + integer, intent(in) :: p(0:4, 2), sp + integer :: i,j + + if(sp == 3) then + do i=1,p(0,1) + do j=1,p(0,2) + banned(p(i,1), p(j,2)) = .true. + end do + end do + else + do i=1,p(0, sp) + do j=1,i-1 + banned(p(j,sp), p(i,sp)) = .true. + banned(p(i,sp), p(j,sp)) = .true. + end do + end do + end if +end subroutine + + + +subroutine spot_isinwf(mask, det, i_gen, N, banned, fullMatch) + use bitmasks + implicit none + + integer(bit_kind),intent(in) :: mask(N_int, 2), det(N_int, 2, N) + integer, intent(in) :: i_gen, N + logical, intent(inout) :: banned(mo_tot_num, mo_tot_num) + logical, intent(out) :: fullMatch + + + integer :: i, j, na, nb, list(3) + integer(bit_kind) :: myMask(N_int, 2), negMask(N_int, 2) + + fullMatch = .false. + + do i=1,N_int + negMask(i,1) = not(mask(i,1)) + negMask(i,2) = not(mask(i,2)) + end do + + genl : do i=1, N + do j=1, N_int + if(iand(det(j,1,i), mask(j,1)) /= mask(j, 1)) cycle genl + if(iand(det(j,2,i), mask(j,2)) /= mask(j, 1)) cycle genl + end do + + if(i < i_gen) then + fullMatch = .true. + return + end if + + do j=1, N_int + myMask(j, 1) = iand(det(j, 1, i), negMask(j, 1)) + myMask(j, 2) = iand(det(j, 2, i), negMask(j, 2)) + end do + + call bitstring_to_list(myMask(1,1), list(1), na, N_int) + call bitstring_to_list(myMask(1,2), list(na+1), nb, N_int) + + banned(list(1), list(2)) = .true. + end do genl +end subroutine + diff --git a/plugins/Full_CI_ZMQ/selection_single.irp.f b/plugins/Full_CI_ZMQ/selection_single.irp.f new file mode 100644 index 00000000..a2409135 --- /dev/null +++ b/plugins/Full_CI_ZMQ/selection_single.irp.f @@ -0,0 +1,333 @@ + + +subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf) + use bitmasks + use selection_types + implicit none + BEGIN_DOC +! Select determinants connected to i_det by H + END_DOC + integer, intent(in) :: i_generator + integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) + double precision, intent(in) :: fock_diag_tmp(mo_tot_num) + double precision, intent(in) :: E0(N_states) + double precision, intent(inout) :: pt2(N_states) + type(selection_buffer), intent(inout) :: buf + + double precision :: vect(N_states, mo_tot_num) + logical :: bannedOrb(mo_tot_num) + integer :: i, k + integer :: h1,h2,s1,s2,i1,i2,ib,sp + integer(bit_kind) :: hole(N_int,2), particle(N_int,2), mask(N_int, 2) + logical :: fullMatch, ok + + + do k=1,N_int + hole (k,1) = iand(psi_det_generators(k,1,i_generator), hole_mask(k,1)) + hole (k,2) = iand(psi_det_generators(k,2,i_generator), hole_mask(k,2)) + particle(k,1) = iand(not(psi_det_generators(k,1,i_generator)), particle_mask(k,1)) + particle(k,2) = iand(not(psi_det_generators(k,2,i_generator)), particle_mask(k,2)) + enddo + + ! Create lists of holes and particles + ! ----------------------------------- + + integer :: N_holes(2), N_particles(2) + integer :: hole_list(N_int*bit_kind_size,2) + integer :: particle_list(N_int*bit_kind_size,2) + + call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) + call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) + + + do sp=1,2 + do i=1, N_holes(sp) + h1 = hole_list(i,sp) + call apply_hole(psi_det_generators(1,1,i_generator), sp, h1, mask, ok, N_int) + + bannedOrb = .false. + + call spot_hasBeen(mask, sp, psi_det_sorted, i_generator, N_det, bannedOrb, fullMatch) + + if(fullMatch) cycle + call spot_occupied(mask, bannedOrb) + vect = 0d0 + call splash_p(mask, sp, psi_det_sorted(1,1,i_generator), N_det_selectors - i_generator + 1, bannedOrb, vect) + call fill_buffer_single(i_generator, sp, h1, bannedOrb, fock_diag_tmp, E0, vect, buf) + end do + enddo +end subroutine + + +subroutine fill_buffer_single(i_generator, sp, h1, bannedOrb, fock_diag_tmp, E0, vect, buf) + use bitmasks + use selection_types + implicit none + + integer, intent(in) :: i_generator, sp, h1 + double precision, intent(in) :: vect(N_states, mo_tot_num) + logical, intent(in) :: bannedOrb(mo_tot_num) + double precision, intent(in) :: fock_diag_tmp(mo_tot_num) + double precision, intent(in) :: E0(N_states) + type(selection_buffer), intent(inout) :: buf + logical :: ok + integer :: s1, s2, p1, p2, ib + integer(bit_kind) :: mask(N_int, 2), det(N_int, 2) + double precision :: e_pert, delta_E, val, Hii + double precision, external :: diag_H_mat_elem_fock + + if(N_states > 1) stop "fill_buffer_single N_states > 1" + + call apply_hole(psi_det_generators(1,1,i_generator), sp, h1, mask, ok, N_int) + + do p1=1,mo_tot_num + if(bannedOrb(p1)) cycle + if(vect(1, p1) == 0d0) cycle + call apply_particle(mask, s1, p1, det, ok, N_int) + val = vect(1, p1) + + Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),det,fock_diag_tmp,N_int) + + delta_E = E0(1) - Hii + if (delta_E < 0.d0) then + e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) + else + e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) + endif + if(dabs(e_pert) > buf%mini) call add_to_selection_buffer(buf, det, e_pert) + end do +end subroutine + + +subroutine splash_p(mask, sp, det, N_sel, bannedOrb, vect) + use bitmasks + implicit none + + integer(bit_kind),intent(in) :: mask(N_int, 2), det(N_int, 2, N_sel) + integer, intent(in) :: sp, N_sel + logical, intent(inout) :: bannedOrb(mo_tot_num) + double precision, intent(inout) :: vect(N_states, mo_tot_num) + + integer :: i, j, h(0:2,2), p(0:3,2), nt + integer(bit_kind) :: perMask(N_int, 2), mobMask(N_int, 2), negMask(N_int, 2) + + do i=1,N_int + negMask(i,1) = not(mask(i,1)) + negMask(i,2) = not(mask(i,2)) + end do + + do i=1, N_sel + nt = 0 + do j=1,N_int + mobMask(j,1) = iand(negMask(j,1), det(j,1,i)) + mobMask(j,2) = iand(negMask(j,2), det(j,2,i)) + nt += popcnt(mobMask(j, 1)) + popcnt(mobMask(j, 2)) + end do + + if(nt > 3) cycle + + do j=1,N_int + perMask(j,1) = iand(mask(j,1), not(det(j,1,i))) + perMask(j,2) = iand(mask(j,2), not(det(j,2,i))) + end do + + call bitstring_to_list(perMask(1,1), h(1,1), h(0,1), N_int) + call bitstring_to_list(perMask(1,2), h(1,2), h(0,2), N_int) + + call bitstring_to_list(mobMask(1,1), p(1,1), p(0,1), N_int) + call bitstring_to_list(mobMask(1,2), p(1,2), p(0,2), N_int) + + if(nt == 3) then + call get_m2(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, vect, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + else if(nt == 2) then + call get_m1(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, vect, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + else + call get_m0(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, vect, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + end if + end do +end subroutine + + +subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) + use bitmasks + implicit none + + integer(bit_kind), intent(in) :: gen(N_int, 2), phasemask(N_int, 2), mask(N_int, 2) + logical, intent(in) :: bannedOrb(mo_tot_num) + double precision, intent(in) :: coefs(N_states) + double precision, intent(inout) :: vect(N_states, mo_tot_num) + integer, intent(in) :: sp, h(0:2, 2), p(0:3, 2) + integer :: i, j, h1, h2, p1, p2, sfix, hfix, pfix, hmob, pmob, puti + double precision :: hij + double precision, external :: get_phase_bi + + + if(h(0,sp) == 2) then + h1 = h(1, sp) + h2 = h(2, sp) + do i=1,3 + p1 = p(mod(i,3) + 1, sp) + p2 = p(mod(i+1,3) + 1, sp) + hij = integral8(p1, p2, h1, h2) - integral8(p2, p1, h1, h2) + hij *= get_phase_bi(phasemask, sp, sp, h1, p1, h2, p2) + vect(:, p(i,sp)) += hij * coefs + end do + else if(h(0,sp) == 1) then + sfix = mod(sp,2)+1 + hfix = h(1,sfix) + pfix = p(1,sfix) + hmob = h(1,sp) + do j=1,2 + puti = p(j, sp) + pmob = p(mod(j,2)+1, sp) + hij = integral8(hfix, hmob, pfix, pmob) + hij *= get_phase_bi(phasemask, sp, sfix, hmob, pmob, hfix, pfix) + vect(:, puti) += hij * coefs + end do + else + puti = p(1,sp) + sfix = mod(sp,2)+1 + hij = integral8(p(1,sfix), p(2,sfix), h(1,sfix), h(2,sfix)) + hij *= get_phase_bi(phasemask, sfix, sfix, h(1,sfix), p(1,sfix), h(2,sfix), p(2,sfix)) + vect(:, puti) += hij * coefs + end if +end subroutine + + + +subroutine get_m1(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) + use bitmasks + implicit none + + integer(bit_kind), intent(in) :: gen(N_int, 2), phasemask(N_int, 2), mask(N_int, 2) + logical, intent(in) :: bannedOrb(mo_tot_num) + double precision, intent(in) :: coefs(N_states) + double precision, intent(inout) :: vect(N_states, mo_tot_num) + integer, intent(in) :: sp, h(0:2, 2), p(0:3, 2) + integer :: i, hole, p1, p2, sh + logical :: ok, lbanned(mo_tot_num) + integer(bit_kind) :: det(N_int, 2) + double precision :: hij + double precision, external :: get_phase_bi + + lbanned = bannedOrb + sh = 1 + if(h(0,2) == 1) sh = 2 + hole = h(1, sh) + p1 = p(1, sp) + lbanned(p1) = .true. + + if(sp == sh) then + p2 = p(2, sp) + lbanned(p2) = .true. + + do i=1,hole-1 + if(lbanned(i)) cycle + hij = (integral8(hole, i, p1, p2) - integral8(i, hole, p1, p2)) + hij *= get_phase_bi(phasemask, sp, sp, i, p1, hole, p2) + vect(:,i) += hij * coefs + end do + do i=hole+1,mo_tot_num + if(lbanned(i)) cycle + hij = (integral8(hole, i, p1, p2) - integral8(i, hole, p1, p2)) + hij *= get_phase_bi(phasemask, sp, sp, hole, p1, i, p2) + vect(:,i) += hij * coefs + end do + else + p2 = p(1, sh) + do i=1,mo_tot_num + if(lbanned(i)) cycle + hij = integral8(i,hole,p1,p2) + hij *= get_phase_bi(phasemask, sp, sh, i, p1, hole, p2) + vect(:,i) += hij * coefs + end do + end if + + !MONO + + call apply_particle(mask, sp, p1, det, ok, N_int) + call i_h_j(gen, det, N_int, hij) + vect(:, p1) += hij * coefs + + if(sp == sh) then + call apply_particle(mask, sp, p2, det, ok, N_int) + call i_h_j(gen, det, N_int, hij) + vect(:, p2) += hij * coefs + end if +end subroutine + + +subroutine get_m0(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) + use bitmasks + implicit none + + integer(bit_kind), intent(in) :: gen(N_int, 2), phasemask(N_int, 2), mask(N_int, 2) + logical, intent(in) :: bannedOrb(mo_tot_num) + double precision, intent(in) :: coefs(N_states) + double precision, intent(inout) :: vect(N_states, mo_tot_num) + integer, intent(in) :: sp, h(0:2, 2), p(0:3, 2) + integer :: i + logical :: ok, lbanned(mo_tot_num) + integer(bit_kind) :: det(N_int, 2) + double precision :: hij + + lbanned = bannedOrb + lbanned(p(1,sp)) = .true. + do i=1,mo_tot_num + if(lbanned(i)) cycle + call apply_particle(mask, sp, i, det, ok, N_int) + call i_h_j(gen, det, N_int, hij) + vect(1, i) = vect(1, i) + hij * coefs(1) + end do +end subroutine + + +subroutine spot_hasBeen(mask, sp, det, i_gen, N, banned, fullMatch) + use bitmasks + implicit none + + integer(bit_kind),intent(in) :: mask(N_int, 2), det(N_int, 2, N) + integer, intent(in) :: i_gen, N, sp + logical, intent(inout) :: banned(mo_tot_num) + logical, intent(out) :: fullMatch + + + integer :: i, j, na, nb, list(3), nt + integer(bit_kind) :: myMask(N_int, 2), negMask(N_int, 2) + + fullMatch = .false. + + do i=1,N_int + negMask(i,1) = not(mask(i,1)) + negMask(i,2) = not(mask(i,2)) + end do + + genl : do i=1, N + nt = 0 + + do j=1, N_int + myMask(j, 1) = iand(det(j, 1, i), negMask(j, 1)) + myMask(j, 2) = iand(det(j, 2, i), negMask(j, 2)) + nt += popcnt(myMask(j, 1)) + popcnt(myMask(j, 2)) + end do + + if(nt > 3) cycle + + if(nt <= 2 .and. i < i_gen) then + fullMatch = .true. + return + end if + + call bitstring_to_list(myMask(1,sp), list(1), na, N_int) + + if(nt == 3 .and. i < i_gen) then + do j=1,na + banned(list(j)) = .true. + end do + else if(nt == 1 .and. na == 1) then + banned(list(1)) = .true. + end if + end do genl +end subroutine + + diff --git a/src/Determinants/determinants.irp.f b/src/Determinants/determinants.irp.f index 258f5391..d0827f3b 100644 --- a/src/Determinants/determinants.irp.f +++ b/src/Determinants/determinants.irp.f @@ -774,7 +774,7 @@ subroutine apply_excitation(det, exc, res, ok, Nint) end subroutine -subroutine apply_particle(det, s1, p1, s2, p2, res, ok, Nint) +subroutine apply_particles(det, s1, p1, s2, p2, res, ok, Nint) use bitmasks implicit none integer, intent(in) :: Nint @@ -803,7 +803,7 @@ subroutine apply_particle(det, s1, p1, s2, p2, res, ok, Nint) end subroutine -subroutine apply_hole(det, s1, h1, s2, h2, res, ok, Nint) +subroutine apply_holes(det, s1, h1, s2, h2, res, ok, Nint) use bitmasks implicit none integer, intent(in) :: Nint @@ -831,3 +831,45 @@ subroutine apply_hole(det, s1, h1, s2, h2, res, ok, Nint) ok = .true. end subroutine +subroutine apply_particle(det, s1, p1, res, ok, Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer, intent(in) :: s1, p1 + integer(bit_kind),intent(in) :: det(Nint, 2) + integer(bit_kind),intent(out) :: res(Nint, 2) + logical, intent(out) :: ok + integer :: ii, pos + + ok = .false. + res = det + + ii = (p1-1)/bit_kind_size + 1 + pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) return + res(ii, s1) = ibset(res(ii, s1), pos) + + ok = .true. +end subroutine + + +subroutine apply_hole(det, s1, h1, res, ok, Nint) + use bitmasks + implicit none + integer, intent(in) :: Nint + integer, intent(in) :: s1, h1 + integer(bit_kind),intent(in) :: det(Nint, 2) + integer(bit_kind),intent(out) :: res(Nint, 2) + logical, intent(out) :: ok + integer :: ii, pos + + ok = .false. + res = det + + ii = (h1-1)/bit_kind_size + 1 + pos = mod(h1-1, 64)!iand(h1-1,bit_kind_size-1) + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) return + res(ii, s1) = ibclr(res(ii, s1), pos) + + ok = .true. +end subroutine \ No newline at end of file From 497a6a0f297f42597f7a6a5609156b3191b33bee Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 5 Sep 2016 17:18:01 +0200 Subject: [PATCH 088/216] removed prints --- plugins/Full_CI_ZMQ/selection.irp.f | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index d3d8e30b..32e08086 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -20,8 +20,6 @@ BEGIN_PROVIDER [ integer(bit_kind), psi_phasemask, (N_int, 2, N_det)] implicit none integer :: i - print *, "pro" - print *, "pross" do i=1, N_det call get_mask_phase(psi_det_sorted(1,1,i), psi_phasemask(1,1,i)) end do @@ -73,8 +71,6 @@ subroutine select_connected(i_generator,E0,pt2,b) integer(bit_kind) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision :: fock_diag_tmp(2,mo_tot_num+1) - print *, "BEG" - call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) @@ -90,15 +86,9 @@ subroutine select_connected(i_generator,E0,pt2,b) particle_mask(k,:) = hole_mask(k,:) enddo - print *, "sel" -! call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) - print *, "poivre" - print *, b%cur, b%N + call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) - print *, b%cur, b%N - print *, "paprika" enddo - print *, "safran" end subroutine From 418c096af78815a9a6d57cd3d02d0e6a43a44f8f Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 6 Sep 2016 09:19:54 +0200 Subject: [PATCH 089/216] Full_CI was missing from Full_CI_ZMQ children modules --- plugins/Full_CI_ZMQ/NEEDED_CHILDREN_MODULES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Full_CI_ZMQ/NEEDED_CHILDREN_MODULES b/plugins/Full_CI_ZMQ/NEEDED_CHILDREN_MODULES index 1e5dbf4e..cb6ff46e 100644 --- a/plugins/Full_CI_ZMQ/NEEDED_CHILDREN_MODULES +++ b/plugins/Full_CI_ZMQ/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Perturbation Selectors_full Generators_full ZMQ +Perturbation Selectors_full Generators_full ZMQ Full_CI From 2b35d4b863a888aa544ddde9e18bcc6d9a1ad085 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 8 Sep 2016 10:12:28 +0200 Subject: [PATCH 090/216] working debug version --- config/ifort.cfg | 4 +- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 12 +- plugins/Full_CI_ZMQ/selection.irp.f | 43 +-- plugins/Full_CI_ZMQ/selection_double.irp.f | 422 ++++++++++++++------- plugins/Full_CI_ZMQ/selection_single.irp.f | 139 ++++--- 5 files changed, 409 insertions(+), 211 deletions(-) diff --git a/config/ifort.cfg b/config/ifort.cfg index 5002ae89..d3a5f7b6 100644 --- a/config/ifort.cfg +++ b/config/ifort.cfg @@ -18,7 +18,7 @@ IRPF90_FLAGS : --ninja --align=32 # 0 : Deactivate # [OPTION] -MODE : OPT ; [ OPT | PROFILE | DEBUG ] : Chooses the section below +MODE : DEBUG ; [ OPT | PROFILE | DEBUG ] : Chooses the section below CACHE : 1 ; Enable cache_compile.py OPENMP : 1 ; Append OpenMP flags @@ -32,7 +32,7 @@ OPENMP : 1 ; Append OpenMP flags # [OPT] FC : -traceback -FCFLAGS : -xHost -O2 -ip -ftz -g +FCFLAGS : -xSSE4.2 -O2 -ip -ftz -g # Profiling flags ################# diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 98b0ec2e..3dff6ef8 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -1,11 +1,12 @@ program fci_zmq implicit none - integer :: i,k + integer :: i,j,k logical, external :: detEq double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) integer :: N_st, degree integer(bit_kind) :: chk + N_st = N_states allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st)) @@ -78,6 +79,15 @@ program fci_zmq endif E_CI_before = CI_energy call ezfio_set_full_ci_energy(CI_energy) + print *, N_det , N_det_max,maxval(abs(pt2(1:N_st))), pt2_max + do i=1, N_det + call assert(popcnt(psi_det_sorted(1,2,i)) == 9, "nelec...") + call assert(popcnt(psi_det_sorted(1,1,i)) == 9, "nelec...") + !call debug_det(psi_det_sorted(1,1,i), N_int) + do j=1,i-1 + call assert(.not. detEq(psi_det_sorted(1,1,i), psi_det_sorted(1,1,j), N_int), "OOQSDSD") + end do + end do enddo N_det = min(N_det_max,N_det) touch N_det psi_det psi_coef diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 32e08086..0d7b3f25 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -46,6 +46,7 @@ subroutine get_mask_phase(det, phasemask) integer :: s, ni, i logical :: change + phasemask = 0_8 do s=1,2 change = .false. do ni=1,N_int @@ -71,7 +72,6 @@ subroutine select_connected(i_generator,E0,pt2,b) integer(bit_kind) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision :: fock_diag_tmp(2,mo_tot_num+1) - call build_fock_tmp(fock_diag_tmp,psi_det_generators(1,1,i_generator),N_int) do l=1,N_generators_bitmask @@ -85,7 +85,6 @@ subroutine select_connected(i_generator,E0,pt2,b) hole_mask(k,2) = ior(generators_bitmask(k,2,s_hole,l), generators_bitmask(k,2,s_part,l)) particle_mask(k,:) = hole_mask(k,:) enddo - call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) enddo @@ -96,15 +95,13 @@ subroutine spot_occupied(mask, bannedOrb) use bitmasks implicit none - integer(bit_kind),intent(in) :: mask(N_int, 2) - logical, intent(inout) :: bannedOrb(mo_tot_num, 2) - integer :: s, i, ne, list(mo_tot_num) + integer(bit_kind),intent(in) :: mask(N_int) + logical, intent(inout) :: bannedOrb(mo_tot_num) + integer :: i, ne, list(mo_tot_num) - do s=1,2 - call bitstring_to_list(mask(1,s), list, ne, N_int) - do i=1, ne - bannedOrb(list(i), s) = .true. - end do + call bitstring_to_list(mask, list, ne, N_int) + do i=1, ne + bannedOrb(list(i)) = .true. end do end subroutine @@ -116,20 +113,21 @@ double precision function get_phase_bi(phasemask, s1, s2, h1, p1, h2, p2) integer(bit_kind), intent(in) :: phasemask(N_int, 2) integer, intent(in) :: s1, s2, h1, h2, p1, p2 logical :: change + integer :: np + double precision, parameter :: res(0:1) = (/1d0, -1d0/) - !ASSERT(h1 <= h2 .and. p1 <= p2) - change = btest(phasemask(ishft(h1, bit_kind_shift), s1), iand(h1, 63_8)) - change = xor(change, btest(phasemask(ishft(p1, bit_kind_shift), s1), iand(p1, 63_8))) + call assert(s1 /= s2 .or. (h1 <= h2 .and. p1 <= p2), irp_here) + np = 0 + change = btest(phasemask(1+ishft(h1, -6), s1), iand(h1-1, 63)) + change = xor(change, btest(phasemask(1+ishft(p1, -6), s1), iand(p1-1, 63))) + if(xor(change, p1 < h1)) np = 1 - change = xor(change, btest(phasemask(ishft(h2, bit_kind_shift), s2), iand(h2, 63_8))) - change = xor(change, btest(phasemask(ishft(p2, bit_kind_shift), s2), iand(p2, 63_8))) - - get_phase_bi = 1d0 - if(s1 == s2) then - if(xor(change, max(h1, p1) > min(h2, p2))) get_phase_bi = -1d0 - else - if(change) get_phase_bi = -1d0 - end if + change = btest(phasemask(1+ishft(h2, -6), s2), iand(h2-1, 63)) + change = xor(change, btest(phasemask(1+ishft(p2, -6), s2), iand(p2-1, 63))) + if(xor(change, p2 < h2)) np = np + 1 + + if(s1 == s2 .and. max(h1, p1) > min(h2, p2)) np = np + 1 + get_phase_bi = res(iand(np,1)) end subroutine @@ -140,6 +138,7 @@ double precision function get_phase_mono(phasemask, s1, h1, p1) integer(bit_kind), intent(in) :: phasemask(N_int, 2) integer, intent(in) :: s1, h1, p1 logical :: change + stop "phase moni BUGGED" change = btest(phasemask(ishft(h1, bit_kind_shift), s1), iand(h1, 63_8)) change = xor(change, btest(phasemask(ishft(p1, bit_kind_shift), s1), iand(p1, 63_8))) diff --git a/plugins/Full_CI_ZMQ/selection_double.irp.f b/plugins/Full_CI_ZMQ/selection_double.irp.f index f6a76141..676cefae 100644 --- a/plugins/Full_CI_ZMQ/selection_double.irp.f +++ b/plugins/Full_CI_ZMQ/selection_double.irp.f @@ -30,7 +30,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) - + call assert(psi_det_generators(1,1,i_generator) == psi_det_sorted(1,1,i_generator), "sorted selex") do s1=1,2 do s2=s1,2 sp = s1 @@ -42,20 +42,24 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p h1 = hole_list(i1,s1) h2 = hole_list(i2,s2) call apply_holes(psi_det_generators(1,1,i_generator), s1,h1,s2,h2, mask, ok, N_int) - + call assert(ok, irp_here) + logical :: banned(mo_tot_num, mo_tot_num) logical :: bannedOrb(mo_tot_num, 2) banned = .false. bannedOrb = .false. - + bannedOrb(h1, s1) = .true. + bannedOrb(h2, s2) = .true. + call spot_isinwf(mask, psi_det_sorted, i_generator, N_det, banned, fullMatch) if(fullMatch) cycle - call spot_occupied(mask, bannedOrb) + if(sp /= 2) call spot_occupied(mask(1,1), bannedOrb(1,1)) + if(sp /= 1) call spot_occupied(mask(1,2), bannedOrb(1,2)) + mat = 0d0 call splash_pq(mask, sp, psi_det_sorted, i_generator, N_det_selectors, bannedOrb, banned, mat) - - call fill_buffer_double(i_generator, sp, h1, h2, banned, bannedOrb, fock_diag_tmp, E0, mat, buf) + call fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_diag_tmp, E0, pt2, mat, buf) end do end do end do @@ -63,7 +67,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p end subroutine -subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_diag_tmp, E0, mat, buf) +subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_diag_tmp, E0, pt2, mat, buf) use bitmasks use selection_types implicit none @@ -73,13 +77,16 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num) double precision, intent(in) :: fock_diag_tmp(mo_tot_num) double precision, intent(in) :: E0(N_states) + double precision, intent(inout) :: pt2(N_states) type(selection_buffer), intent(inout) :: buf logical :: ok - integer :: s1, s2, p1, p2, ib + integer :: s1, s2, p1, p2, ib, j integer(bit_kind) :: mask(N_int, 2), det(N_int, 2) double precision :: e_pert, delta_E, val, Hii double precision, external :: diag_H_mat_elem_fock + logical, external :: detEq + if(N_states > 1) stop "fill_buffer_double N_states > 1" if(sp == 3) then @@ -91,7 +98,7 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d end if call apply_holes(psi_det_generators(1,1,i_generator), s1, h1, s2, h2, mask, ok, N_int) - + call assert(ok, "sosoqs") do p1=1,mo_tot_num if(bannedOrb(p1, s1)) cycle ib = 1 @@ -101,6 +108,7 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d if(banned(p1,p2)) cycle if(mat(1, p1, p2) == 0d0) cycle call apply_particles(mask, s1, p1, s2, p2, det, ok, N_int) + call assert(ok, "ododod") val = mat(1, p1, p2) Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),det,fock_diag_tmp,N_int) @@ -111,7 +119,17 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d else e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) endif - if(dabs(e_pert) > buf%mini) call add_to_selection_buffer(buf, det, e_pert) + pt2(1) += e_pert + if(dabs(e_pert) > buf%mini) then + do j=1,buf%cur-1 + if(detEq(buf%det(1,1,j), det, N_int)) then + print *, "tops" + print *, i_generator, s1, s2, h1, h2,p1,p2 + stop + end if + end do + call add_to_selection_buffer(buf, det, e_pert) + end if end do end do end subroutine @@ -124,11 +142,12 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) integer(bit_kind),intent(in) :: mask(N_int, 2), det(N_int, 2, N_sel) integer, intent(in) :: sp, i_gen, N_sel logical, intent(inout) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num) - double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) ! intent out + double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) integer :: i, j, h(0:2,2), p(0:4,2), nt integer(bit_kind) :: perMask(N_int, 2), mobMask(N_int, 2), negMask(N_int, 2) - + + mat = 0d0 do i=1,N_int negMask(i,1) = not(mask(i,1)) @@ -155,18 +174,19 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) call bitstring_to_list(mobMask(1,1), p(1,1), p(0,1), N_int) call bitstring_to_list(mobMask(1,2), p(1,2), p(0,2), N_int) - + + call assert(nt >= 2, irp_here//"qsd") if(i < i_gen) then if(nt == 4) call past_d2(banned, p, sp) if(nt == 3) call past_d1(bannedOrb, p) + call assert(nt /= 2, "should have been discarded") else - if(i == i_gen) mat = 0d0 if(nt == 4) then - call get_d2(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + call get_d2(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) else if(nt == 3) then - call get_d1(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + call get_d1(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) else - call get_d0(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + call get_d0(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) end if end if end do @@ -180,98 +200,145 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2), phasemask(N_int, 2) logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num) double precision, intent(in) :: coefs(N_states) - double precision, intent(inout) :: mat(mo_tot_num, mo_tot_num, N_states) + double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) integer, intent(in) :: h(0:2,2), p(0:4,2), sp double precision, external :: get_phase_bi integer :: i, j, tip, ma, mi, puti, putj - integer :: h1, h2, p1, p2 + integer :: h1, h2, p1, p2, i1, i2 double precision :: hij, phase + integer, parameter:: turn2d(2,3,4) = reshape((/0,0, 0,0, 0,0, 3,4, 0,0, 0,0, 2,4, 1,4, 0,0, 2,3, 1,3, 1,2 /), (/2,3,4/)) + integer, parameter :: turn2(2) = (/2, 1/) + integer, parameter :: turn3(2,3) = reshape((/2,3, 1,3, 1,2/), (/2,3/)) + + tip = p(0,1) * p(0,2) + call assert(p(0,1) + p(0,2) == 4, irp_here//"df") ma = sp if(p(0,1) > p(0,2)) ma = 1 if(p(0,1) < p(0,2)) ma = 2 mi = mod(ma, 2) + 1 - + + !print *, "d2 SPtip", SP, tip if(sp == 3) then if(tip == 3) then - putj = p(1, 2) + puti = p(1, mi) do i = 1, 3 - puti = p(i, ma) + putj = p(i, ma) + i1 = turn3(1,i) + i2 = turn3(2,i) + p1 = p(i1, ma) + p2 = p(i2, ma) + call assert(h(0,ma) == 2, "dmdmd") + call assert(p(0, ma) == 3, "dmdm2") + h1 = h(1, ma) + h2 = h(2, ma) - p1 = p(mod(i, 3) + 1, ma) - p2 = p(mod(i+1, 3) + 1, ma) hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, ma, ma, h1, p1, h2, p2) - + call debug_hij(hij, gen, mask, mi, ma, puti, putj) if(ma == 1) then - mat(:, puti, putj) += coefs * hij - else mat(:, putj, puti) += coefs * hij + else + mat(:, puti, putj) += coefs * hij end if end do - else ! tip == 4 + else + call assert(tip == 4, "df") do i = 1,2 do j = 1,2 puti = p(i, 1) putj = p(j, 2) - p1 = p(mod(i, 2) + 1, 1) - p2 = p(mod(j, 2) + 1, 2) + p1 = p(turn2(i), 1) + p2 = p(turn2(j), 2) + h1 = h(1,1) + h2 = h(1,2) hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) + call debug_hij(hij, gen, mask, 1, 2, puti, putj) mat(:, puti, putj) += coefs * hij end do end do end if - else !! AA/BB - + else if(tip == 0) then + h1 = h(1, ma) + h2 = h(2, ma) do i=1,3 puti = p(i, ma) do j=i+1,4 putj = p(j, ma) - if(j == i+1) then - p1 = p(mod(j, 4) + 1, ma) - p2 = p(mod(j+1, 4) + 1, ma) - else if(j == i+2) then - p1 = p(mod(i, 4) + 1, ma) - p2 = p(mod(j, 4) + 1, ma) - else - p1 = 2 - p2 = 3 - end if - + i1 = turn2d(1, i, j) + i2 = turn2d(2, i, j) + p1 = p(i1, ma) + p2 = p(i2, ma) hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, ma, ma, h1, p1, h2, p2) + call debug_hij(hij, gen, mask, ma, ma, puti, putj) mat(:, puti, putj) += coefs * hij end do end do else if(tip == 3) then - p2 = p(1, mi) + h1 = h(1, mi) + h2 = h(1, ma) + p1 = p(1, mi) + call assert(ma == sp, "dldl") do i=1,3 - p1 = p(i, ma) - puti = p(mod(i, 3) + 1, ma) - putj = p(mod(i+1, 3) + 1, ma) - hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, ma, mi, h1, p1, h2, p2) + p2 = p(i, ma) + puti = p(turn3(1,i), ma) + putj = p(turn3(2,i), ma) + hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, mi, ma, h1, p1, h2, p2) + call debug_hij(hij, gen, mask, ma, ma, puti, putj) mat(:, min(puti, putj), max(puti, putj)) += coefs * hij end do else ! tip == 4 + call assert(tip == 4, "qsdf") puti = p(1, sp) putj = p(2, sp) p1 = p(1, mi) p2 = p(2, mi) + h1 = h(1, mi) + h2 = h(2, mi) hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, mi, mi, h1, p1, h2, p2) + call debug_hij(hij, gen, mask,ma,ma, puti, putj) mat(:, puti, putj) += coefs * hij end if end if end subroutine +subroutine debug_hij(hij, gen, mask, s1, s2, p1, p2) + use bitmasks + implicit none + + integer(bit_kind), intent(in) :: gen(N_int,2), mask(N_int,2) + double precision, intent(in) :: hij + integer, intent(in) :: s1, s2, p1, p2 + integer(bit_kind) :: det(N_int,2) + double precision :: hij_ref, phase_ref + logical :: ok + integer :: degree + integer :: exc(0:2,2,2) -subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, ho, pa, sp, coefs) + call apply_particles(mask, s1, p1, s2, p2, det, ok, N_int) + call assert(ok, "nokey") + call i_H_j_phase_out(gen,det,N_int,hij_ref,phase_ref,exc,degree) + if(hij /= hij_ref) then + print *, hij, hij_ref + print *, s1, s2, p1, p2 + call debug_det(gen, N_int) + call debug_det(mask, N_int) + stop + end if + + ! print *, "fourar", hij, hij_ref,s1,s2 +end function + + +subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) use bitmasks implicit none @@ -280,89 +347,157 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, ho, pa, sp, coef integer(bit_kind) :: det(N_int, 2) double precision, intent(in) :: coefs(N_states) double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) - double precision :: hij, tmp_row(N_states, mo_tot_num) + double precision :: hij, tmp_row(N_states, mo_tot_num), tmp_row2(N_states, mo_tot_num) double precision, external :: get_phase_bi logical :: lbanned(mo_tot_num, 2), ok - integer :: ms, i, i1, i2, j, hole, tmp, s(3), p(3) + integer :: puti, putj, ma, mi, s1, s2, i, i1, i2, j, hfix, pfix, h1, h2, p1, p2, ib + + integer, intent(in) :: h(0:2,2), p(0:4,2), sp + + integer, parameter :: turn2(2) = (/2,1/) + integer, parameter :: turn3(2,3) = reshape((/2,3, 1,3, 1,2/), (/2,3/)) - integer, intent(in) :: ho(0:2,2), pa(0:4,2), sp - - do i = 1, pa(0,1) - s(i) = 1 - p(i) = pa(i, 1) - end do - - j = i - - do i = 1, pa(0,2) - s(j) = 2 - p(j) = pa(i, 2) - j += 1 - end do - - if(ho(0,1) == 1) then - hole = ho(1,1) - else - hole = ho(1,2) - end if lbanned = bannedOrb - - do i=1, 3 - lbanned(p(i), s(i)) = .true. + + do i=1, p(0,1) + lbanned(p(i,1), 1) = .true. end do + do i=1, p(0,2) + lbanned(p(i,2), 2) = .true. + end do + + ma = 1 + if(p(0,2) >= 2) ma = 2 + mi = turn2(ma) + !print *, "d1 SP", sp, p(0,1)*p(0,2) - do i=1, 3 - if(lbanned(p(i), s(i))) cycle - if(sp /= 3 .and. sp /= s(i)) cycle - ms = sp - if(sp == 3) ms = mod(s(i), 2) + 1 - i1 = mod(i,3)+1 - i2 = mod(i+1,3)+1 - - if(s(i1) /= s(i2)) then - if(s(i1) /= ms) then - tmp = i1 - i1 = i2 - i2 = tmp - end if + if(sp == 3) then + !move MA + call assert(p(0,1)*p(0,2) == 2, "ddmmm") + puti = p(1,mi) + hfix = h(1,ma) + p1 = p(1,ma) + p2 = p(2,ma) + if(.not. bannedOrb(puti, mi)) then tmp_row = 0d0 - do j=1,mo_tot_num - if(lbanned(j, s(i))) cycle - tmp_row(:, j) += coefs * integral8(p(i1), p(i2), j, hole) * get_phase_bi(phasemask, 1, 2, j, p(i1), hole, p(i2)) + do putj=1, hfix-1 + if(lbanned(putj, ma)) cycle + hij = (integral8(p1, p2, putj, hfix)-integral8(p2,p1,putj,hfix)) * get_phase_bi(phasemask, ma, ma, putj, p1, hfix, p2) + call debug_hij(hij, gen, mask, mi, ma, puti, putj) + tmp_row(:,putj) += hij * coefs end do - if(ms == 1) then - mat(:, :, p(i)) += tmp_row - else - mat(:, p(i), :) += tmp_row - end if - else - do j=1,mo_tot_num - if(lbanned(j, s(i))) cycle - tmp_row(:, j) += coefs * (integral8(p(i1), p(i2), j, hole) - integral8(p(i2), p(i1), j, hole)) * get_phase_bi(phasemask, 1, 2, j, p(i1), hole, p(i2)) + do putj=hfix+1, mo_tot_num + if(lbanned(putj, ma)) cycle + hij = (integral8(p1, p2, hfix, putj)-integral8(p2,p1,hfix,putj)) * get_phase_bi(phasemask, ma, ma, hfix, p1, putj, p2) + call debug_hij(hij, gen, mask, mi, ma, puti, putj) + tmp_row(:,putj) += hij * coefs end do - mat(:, :p(i), p(i)) += tmp_row(:, :p(i)) - mat(:, p(i), p(i):) += tmp_row(:, p(i):) - end if - end do - !! MONO - do i=1, 2 - do j=i+1,3 - if(bannedOrb(p(i), s(i)) .or. bannedOrb(p(j), s(j))) cycle - if((s(i) /= s(j) .or. sp /= s(i)) .and. (s(i) == s(j) .or. sp /= 3)) cycle - call apply_particles(mask, s(i), p(i), s(j), p(j), det, ok, N_int) - call i_h_j(gen, det, N_int, hij) - if(s(i) == s(j)) then - mat(:, p(i), p(j)) += coefs * hij - else if(s(i) == 1) then - mat(:, p(i), p(j)) += coefs * hij + if(ma == 1) then + mat(:,:,puti) += tmp_row(:,:) else - mat(:, p(j), p(i)) += coefs * hij + mat(:,puti,:) += tmp_row(:,:) end if + end if + + !MOVE MI + pfix = p(1,mi) + tmp_row = 0d0 + tmp_row2 = 0d0 + do puti=1,mo_tot_num + if(lbanned(puti,mi)) cycle + !p1 fixed + putj = p1 + hij = integral8(p2,pfix,hfix,puti) * get_phase_bi(phasemask, ma, mi, hfix, p2, puti, pfix) + call debug_hij(hij, gen, mask, mi, ma, puti, putj) + tmp_row(:,puti) += hij * coefs + putj = p2 + hij = integral8(p1,pfix,hfix,puti) * get_phase_bi(phasemask, ma, mi, hfix, p1, puti, pfix) + call debug_hij(hij, gen, mask, mi, ma, puti, putj) + tmp_row2(:,puti) += hij * coefs + end do + + if(mi == 1) then + mat(:,:,p1) += tmp_row(:,:) + mat(:,:,p2) += tmp_row2(:,:) + else + mat(:,p1,:) += tmp_row(:,:) + mat(:,p2,:) += tmp_row2(:,:) + end if + else + if(p(0,ma) == 3) then + do i=1,3 + hfix = h(1,ma) + puti = p(i, ma) + p1 = p(turn3(1,i), ma) + p2 = p(turn3(2,i), ma) + tmp_row = 0d0 + do putj=1,hfix-1 + if(lbanned(putj,ma)) cycle + hij = (integral8(p1, p2, putj, hfix)-integral8(p2,p1,putj,hfix)) * get_phase_bi(phasemask, ma, ma, putj, p1, hfix, p2) + call debug_hij(hij, gen, mask, ma, ma, puti, putj) + tmp_row(:,putj) += hij * coefs + end do + do putj=hfix+1,mo_tot_num + if(lbanned(putj,ma)) cycle + hij = (integral8(p1, p2, hfix, putj)-integral8(p2,p1,hfix,putj)) * get_phase_bi(phasemask, ma, ma, hfix, p1, putj, p2) + call debug_hij(hij, gen, mask, ma, ma, puti, putj) + tmp_row(:,putj) += hij * coefs + end do + + mat(:, :puti-1, puti) += tmp_row(:,:puti-1) + mat(:, puti, puti:) += tmp_row(:,puti:) + end do + else + call assert(sp == ma, "sp == ma") + hfix = h(1,mi) + pfix = p(1,mi) + p1 = p(1,ma) + p2 = p(2,ma) + tmp_row = 0d0 + tmp_row2 = 0d0 + do puti=1,mo_tot_num + if(lbanned(puti,ma)) cycle + putj = p2 + hij = integral8(pfix, p1, hfix, puti) * get_phase_bi(phasemask, mi, ma, hfix, pfix, puti, p1) + call debug_hij(hij, gen, mask, ma, ma, putj, puti) + tmp_row(:,puti) += hij * coefs + + putj = p1 + hij = integral8(pfix, p2, hfix, puti) * get_phase_bi(phasemask, mi, ma, hfix, pfix, puti, p2) + call debug_hij(hij, gen, mask, ma, ma, putj, puti) + tmp_row2(:,puti) += hij * coefs + end do + mat(:,:p2-1,p2) += tmp_row(:,:p2-1) + mat(:,p2,p2:) += tmp_row(:,p2:) + mat(:,:p1-1,p1) += tmp_row2(:,:p1-1) + mat(:,p1,p1:) += tmp_row2(:,p1:) + end if + end if + + !! MONO + if(sp == 3) then + s1 = 1 + s2 = 2 + else + s1 = sp + s2 = sp + end if + + do i1=1,p(0,s1) + ib = 1 + if(s1 == s2) ib = i1+1 + do i2=ib,p(0,s2) + p1 = p(i1,s1) + p2 = p(i2,s2) + if(bannedOrb(p1, s1) .or. bannedOrb(p2, s2)) cycle + call apply_particles(mask, s1, p1, s2, p2, det, ok, N_int) + call i_h_j(gen, det, N_int, hij) + mat(:, p1, p2) += coefs * hij + end do end do - end do end subroutine @@ -373,51 +508,57 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) implicit none integer(bit_kind), intent(in) :: gen(N_int, 2), mask(N_int, 2), phasemask(N_int, 2) - logical, intent(in) :: bannedOrb(mo_tot_num), banned(mo_tot_num, mo_tot_num) + logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num) integer(bit_kind) :: det(N_int, 2) double precision, intent(in) :: coefs(N_states) double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) integer, intent(in) :: h(0:2,2), p(0:4,2), sp - integer :: i, j, s, h1, h2, p1, p2 - double precision :: hij + integer :: i, j, s, h1, h2, p1, p2, puti, putj + double precision :: hij, phase double precision, external :: get_phase_bi logical :: ok + !print *, "d0 SP", sp + if(sp == 3) then ! AB h1 = p(1,1) h2 = p(1,2) do p1=1, mo_tot_num - if(bannedOrb(i)) cycle + if(bannedOrb(p1, 1)) cycle do p2=1, mo_tot_num - if(bannedOrb(j)) cycle - if(banned(i, j)) cycle ! rentable? + if(bannedOrb(p2,2)) cycle + if(banned(p1, p2)) cycle ! rentable? if(p1 == h1 .or. p2 == h2) then call apply_particles(mask, 1,p1,2,p2, det, ok, N_int) + call assert(ok, "zsdq") call i_h_j(gen, det, N_int, hij) mat(:, p1, p2) += coefs * hij else - mat(:, p1, p2) += coefs * integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) + hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) + phase = get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) + call debug_hij(hij, gen, mask, 1, 2, p1, p2) + mat(:, p1, p2) += coefs * hij end if end do end do else ! AA BB - s = 1 - if(p(0,2) == 2) s =2 - h1 = p(1,s) - h2 = p(2,s) - do p1=1, mo_tot_num - if(bannedOrb(i)) cycle - do p2=p1+1, mo_tot_num - if(bannedOrb(j)) cycle - if(banned(i, j)) cycle ! rentable? - if(p1 == h1 .or. p2 == h2 .or. p1 == h2 .or. p2 == h1) then - call apply_particles(mask, s,p1,s,p2, det, ok, N_int) - ASSERT(ok) + p1 = p(1,sp) + p2 = p(2,sp) + do puti=1, mo_tot_num + if(bannedOrb(puti, sp)) cycle + do putj=puti+1, mo_tot_num + if(bannedOrb(putj, sp)) cycle + if(banned(puti, putj)) cycle ! rentable? + if(puti == p1 .or. putj == p2 .or. puti == p2 .or. putj == p1) then + call apply_particles(mask, sp,puti,sp,putj, det, ok, N_int) + call ASSERT(ok, "ssss") call i_h_j(gen, det, N_int, hij) - mat(:, p1, p2) += coefs * hij + mat(:, puti, putj) += coefs * hij else - mat(:, p1, p2) += coefs * (integral8(p1, p2, h1, h2) - integral8(p2, p1, h1, h2))* get_phase_bi(phasemask, s, s, h1, p1, h2, p2) + hij = (integral8(p1, p2, puti, putj) - integral8(p2, p1, puti, putj))* get_phase_bi(phasemask, sp, sp, puti, p1 , putj, p2) + mat(:, puti, putj) += coefs * hij + call debug_hij(hij, gen, mask, sp, sp, puti, putj) end if end do end do @@ -490,7 +631,7 @@ subroutine spot_isinwf(mask, det, i_gen, N, banned, fullMatch) genl : do i=1, N do j=1, N_int if(iand(det(j,1,i), mask(j,1)) /= mask(j, 1)) cycle genl - if(iand(det(j,2,i), mask(j,2)) /= mask(j, 1)) cycle genl + if(iand(det(j,2,i), mask(j,2)) /= mask(j, 2)) cycle genl end do if(i < i_gen) then @@ -505,7 +646,8 @@ subroutine spot_isinwf(mask, det, i_gen, N, banned, fullMatch) call bitstring_to_list(myMask(1,1), list(1), na, N_int) call bitstring_to_list(myMask(1,2), list(na+1), nb, N_int) - + call assert(na + nb == 2, "oyo") + call assert(na == 1 .or. list(1) < list(2), "sqdsmmmm") banned(list(1), list(2)) = .true. end do genl end subroutine diff --git a/plugins/Full_CI_ZMQ/selection_single.irp.f b/plugins/Full_CI_ZMQ/selection_single.irp.f index a2409135..89f2b1ec 100644 --- a/plugins/Full_CI_ZMQ/selection_single.irp.f +++ b/plugins/Full_CI_ZMQ/selection_single.irp.f @@ -1,13 +1,13 @@ -subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf) +subroutine select_singles(i_gen,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf) use bitmasks use selection_types implicit none BEGIN_DOC ! Select determinants connected to i_det by H END_DOC - integer, intent(in) :: i_generator + integer, intent(in) :: i_gen integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) double precision, intent(in) :: fock_diag_tmp(mo_tot_num) double precision, intent(in) :: E0(N_states) @@ -23,10 +23,10 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p do k=1,N_int - hole (k,1) = iand(psi_det_generators(k,1,i_generator), hole_mask(k,1)) - hole (k,2) = iand(psi_det_generators(k,2,i_generator), hole_mask(k,2)) - particle(k,1) = iand(not(psi_det_generators(k,1,i_generator)), particle_mask(k,1)) - particle(k,2) = iand(not(psi_det_generators(k,2,i_generator)), particle_mask(k,2)) + hole (k,1) = iand(psi_det_generators(k,1,i_gen), hole_mask(k,1)) + hole (k,2) = iand(psi_det_generators(k,2,i_gen), hole_mask(k,2)) + particle(k,1) = iand(not(psi_det_generators(k,1,i_gen)), particle_mask(k,1)) + particle(k,2) = iand(not(psi_det_generators(k,2,i_gen)), particle_mask(k,2)) enddo ! Create lists of holes and particles @@ -39,27 +39,25 @@ subroutine select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) - do sp=1,2 do i=1, N_holes(sp) h1 = hole_list(i,sp) - call apply_hole(psi_det_generators(1,1,i_generator), sp, h1, mask, ok, N_int) - + call apply_hole(psi_det_generators(1,1,i_gen), sp, h1, mask, ok, N_int) + call assert(ok, irp_here) bannedOrb = .false. - - call spot_hasBeen(mask, sp, psi_det_sorted, i_generator, N_det, bannedOrb, fullMatch) - + bannedOrb(h1) = .true. + call spot_hasBeen(mask, sp, psi_det_sorted, i_gen, N_det, bannedOrb, fullMatch) if(fullMatch) cycle - call spot_occupied(mask, bannedOrb) + call spot_occupied(mask(1,sp), bannedOrb) vect = 0d0 - call splash_p(mask, sp, psi_det_sorted(1,1,i_generator), N_det_selectors - i_generator + 1, bannedOrb, vect) - call fill_buffer_single(i_generator, sp, h1, bannedOrb, fock_diag_tmp, E0, vect, buf) + call splash_p(mask, sp, psi_selectors(1,1,i_gen), psi_phasemask(1,1,i_gen), psi_selectors_coef_transp(1,i_gen), N_det_selectors - i_gen + 1, bannedOrb, vect) + call fill_buffer_single(i_gen, sp, h1, bannedOrb, fock_diag_tmp, E0, pt2, vect, buf) end do enddo end subroutine -subroutine fill_buffer_single(i_generator, sp, h1, bannedOrb, fock_diag_tmp, E0, vect, buf) +subroutine fill_buffer_single(i_generator, sp, h1, bannedOrb, fock_diag_tmp, E0, pt2, vect, buf) use bitmasks use selection_types implicit none @@ -69,6 +67,7 @@ subroutine fill_buffer_single(i_generator, sp, h1, bannedOrb, fock_diag_tmp, E0, logical, intent(in) :: bannedOrb(mo_tot_num) double precision, intent(in) :: fock_diag_tmp(mo_tot_num) double precision, intent(in) :: E0(N_states) + double precision, intent(inout) :: pt2(N_states) type(selection_buffer), intent(inout) :: buf logical :: ok integer :: s1, s2, p1, p2, ib @@ -83,7 +82,7 @@ subroutine fill_buffer_single(i_generator, sp, h1, bannedOrb, fock_diag_tmp, E0, do p1=1,mo_tot_num if(bannedOrb(p1)) cycle if(vect(1, p1) == 0d0) cycle - call apply_particle(mask, s1, p1, det, ok, N_int) + call apply_particle(mask, sp, p1, det, ok, N_int) val = vect(1, p1) Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),det,fock_diag_tmp,N_int) @@ -94,16 +93,18 @@ subroutine fill_buffer_single(i_generator, sp, h1, bannedOrb, fock_diag_tmp, E0, else e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) endif + pt2(1) += e_pert if(dabs(e_pert) > buf%mini) call add_to_selection_buffer(buf, det, e_pert) end do end subroutine -subroutine splash_p(mask, sp, det, N_sel, bannedOrb, vect) +subroutine splash_p(mask, sp, det, phasemask, coefs, N_sel, bannedOrb, vect) use bitmasks implicit none - integer(bit_kind),intent(in) :: mask(N_int, 2), det(N_int, 2, N_sel) + integer(bit_kind),intent(in) :: mask(N_int, 2), det(N_int,2,N_sel), phasemask(N_int,2,N_sel) + double precision, intent(in) :: coefs(N_states, N_sel) integer, intent(in) :: sp, N_sel logical, intent(inout) :: bannedOrb(mo_tot_num) double precision, intent(inout) :: vect(N_states, mo_tot_num) @@ -138,11 +139,11 @@ subroutine splash_p(mask, sp, det, N_sel, bannedOrb, vect) call bitstring_to_list(mobMask(1,2), p(1,2), p(0,2), N_int) if(nt == 3) then - call get_m2(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, vect, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + call get_m2(det(1,1,i), phasemask(1,1,i), bannedOrb, vect, mask, h, p, sp, coefs(1, i)) else if(nt == 2) then - call get_m1(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, vect, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + call get_m1(det(1,1,i), phasemask(1,1,i), bannedOrb, vect, mask, h, p, sp, coefs(1, i)) else - call get_m0(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, vect, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + call get_m0(det(1,1,i), phasemask(1,1,i), bannedOrb, vect, mask, h, p, sp, coefs(1, i)) end if end do end subroutine @@ -161,34 +162,44 @@ subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) double precision :: hij double precision, external :: get_phase_bi + integer, parameter :: turn3_2(2,3) = reshape((/2,3, 1,3, 1,2/), (/2,3/)) + integer, parameter :: turn2(2) = (/2,1/) if(h(0,sp) == 2) then h1 = h(1, sp) h2 = h(2, sp) do i=1,3 - p1 = p(mod(i,3) + 1, sp) - p2 = p(mod(i+1,3) + 1, sp) + puti = p(i, sp) + p1 = p(turn3_2(1,i), sp) + p2 = p(turn3_2(2,i), sp) hij = integral8(p1, p2, h1, h2) - integral8(p2, p1, h1, h2) hij *= get_phase_bi(phasemask, sp, sp, h1, p1, h2, p2) - vect(:, p(i,sp)) += hij * coefs + call debug_hij_mo(hij, gen, mask, sp, puti) + vect(:, puti) += hij * coefs end do else if(h(0,sp) == 1) then - sfix = mod(sp,2)+1 + sfix = turn2(sp) hfix = h(1,sfix) pfix = p(1,sfix) hmob = h(1,sp) do j=1,2 puti = p(j, sp) - pmob = p(mod(j,2)+1, sp) - hij = integral8(hfix, hmob, pfix, pmob) + pmob = p(turn2(j), sp) + hij = integral8(pfix, pmob, hfix, hmob) hij *= get_phase_bi(phasemask, sp, sfix, hmob, pmob, hfix, pfix) + call debug_hij_mo(hij, gen, mask, sp, puti) vect(:, puti) += hij * coefs end do else puti = p(1,sp) - sfix = mod(sp,2)+1 - hij = integral8(p(1,sfix), p(2,sfix), h(1,sfix), h(2,sfix)) - hij *= get_phase_bi(phasemask, sfix, sfix, h(1,sfix), p(1,sfix), h(2,sfix), p(2,sfix)) + sfix = turn2(sp) + p1 = p(1,sfix) + p2 = p(2,sfix) + h1 = h(1,sfix) + h2 = h(2,sfix) + hij = (integral8(p1,p2,h1,h2) - integral8(p2,p1,h1,h2)) + hij *= get_phase_bi(phasemask, sfix, sfix, h1, p1, h2, p2) + call debug_hij_mo(hij, gen, mask, sp, puti) vect(:, puti) += hij * coefs end if end subroutine @@ -214,8 +225,11 @@ subroutine get_m1(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) sh = 1 if(h(0,2) == 1) sh = 2 hole = h(1, sh) + lbanned(p(1,sp)) = .true. + if(p(0,sp) == 2) lbanned(p(2,sp)) = .true. + !print *, "SPm1", sp, sh + p1 = p(1, sp) - lbanned(p1) = .true. if(sp == sh) then p2 = p(2, sp) @@ -223,37 +237,40 @@ subroutine get_m1(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) do i=1,hole-1 if(lbanned(i)) cycle - hij = (integral8(hole, i, p1, p2) - integral8(i, hole, p1, p2)) + hij = (integral8(p1, p2, i, hole) - integral8(p2, p1, i, hole)) hij *= get_phase_bi(phasemask, sp, sp, i, p1, hole, p2) + call debug_hij_mo(hij, gen, mask, sp, i) vect(:,i) += hij * coefs end do do i=hole+1,mo_tot_num if(lbanned(i)) cycle - hij = (integral8(hole, i, p1, p2) - integral8(i, hole, p1, p2)) + hij = (integral8(p1, p2, hole, i) - integral8(p2, p1, hole, i)) hij *= get_phase_bi(phasemask, sp, sp, hole, p1, i, p2) + call debug_hij_mo(hij, gen, mask, sp, i) vect(:,i) += hij * coefs end do + + call apply_particle(mask, sp, p2, det, ok, N_int) + call assert(ok, "OKE223") + call i_h_j(gen, det, N_int, hij) + vect(:, p2) += hij * coefs else p2 = p(1, sh) do i=1,mo_tot_num if(lbanned(i)) cycle - hij = integral8(i,hole,p1,p2) + hij = integral8(p1, p2, i, hole) hij *= get_phase_bi(phasemask, sp, sh, i, p1, hole, p2) + call debug_hij_mo(hij, gen, mask, sp, i) vect(:,i) += hij * coefs end do end if - - !MONO - - call apply_particle(mask, sp, p1, det, ok, N_int) + + call apply_particle(mask, sp, p1, det, ok, N_int) + call assert(ok, "OKQQE2") call i_h_j(gen, det, N_int, hij) vect(:, p1) += hij * coefs - - if(sp == sh) then - call apply_particle(mask, sp, p2, det, ok, N_int) - call i_h_j(gen, det, N_int, hij) - vect(:, p2) += hij * coefs - end if + + !print *, "endouille" end subroutine @@ -276,8 +293,9 @@ subroutine get_m0(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) do i=1,mo_tot_num if(lbanned(i)) cycle call apply_particle(mask, sp, i, det, ok, N_int) + call assert(ok, "qsdo") call i_h_j(gen, det, N_int, hij) - vect(1, i) = vect(1, i) + hij * coefs(1) + vect(:, i) += hij * coefs end do end subroutine @@ -331,3 +349,32 @@ subroutine spot_hasBeen(mask, sp, det, i_gen, N, banned, fullMatch) end subroutine + +subroutine debug_hij_mo(hij, gen, mask, s1, p1) + use bitmasks + implicit none + + integer(bit_kind), intent(in) :: gen(N_int,2), mask(N_int,2) + double precision, intent(in) :: hij + integer, intent(in) :: s1, p1 + integer(bit_kind) :: det(N_int,2) + double precision :: hij_ref, phase_ref + logical :: ok + integer :: degree + integer :: exc(0:2,2,2) + logical, external :: detEq + + call apply_particle(mask, s1, p1, det, ok, N_int) + call assert(ok, "nokey_mo") + call assert(.not. detEq(det, gen, N_int), "Hii ...") + call i_H_j_phase_out(gen,det,N_int,hij_ref,phase_ref,exc,degree) + if(hij /= hij_ref) then + print *, hij, hij_ref + print *, s1, p1 + call debug_det(gen, N_int) + call debug_det(mask, N_int) + call debug_det(det, N_int) + stop + end if +end function + From 741b5deaba57c7ddee62418028867322a9142a35 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 8 Sep 2016 12:27:37 +0200 Subject: [PATCH 091/216] removed debug checks --- plugins/Full_CI_ZMQ/selection_double.irp.f | 66 +++++++++++----------- plugins/Full_CI_ZMQ/selection_single.irp.f | 22 ++++---- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection_double.irp.f b/plugins/Full_CI_ZMQ/selection_double.irp.f index 676cefae..268d9cbf 100644 --- a/plugins/Full_CI_ZMQ/selection_double.irp.f +++ b/plugins/Full_CI_ZMQ/selection_double.irp.f @@ -30,7 +30,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) - call assert(psi_det_generators(1,1,i_generator) == psi_det_sorted(1,1,i_generator), "sorted selex") + !call assert(psi_det_generators(1,1,i_generator) == psi_det_sorted(1,1,i_generator), "sorted selex") do s1=1,2 do s2=s1,2 sp = s1 @@ -42,7 +42,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p h1 = hole_list(i1,s1) h2 = hole_list(i2,s2) call apply_holes(psi_det_generators(1,1,i_generator), s1,h1,s2,h2, mask, ok, N_int) - call assert(ok, irp_here) + !call assert(ok, irp_here) logical :: banned(mo_tot_num, mo_tot_num) logical :: bannedOrb(mo_tot_num, 2) @@ -98,7 +98,7 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d end if call apply_holes(psi_det_generators(1,1,i_generator), s1, h1, s2, h2, mask, ok, N_int) - call assert(ok, "sosoqs") + !call assert(ok, "sosoqs") do p1=1,mo_tot_num if(bannedOrb(p1, s1)) cycle ib = 1 @@ -108,7 +108,7 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d if(banned(p1,p2)) cycle if(mat(1, p1, p2) == 0d0) cycle call apply_particles(mask, s1, p1, s2, p2, det, ok, N_int) - call assert(ok, "ododod") + !call assert(ok, "ododod") val = mat(1, p1, p2) Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),det,fock_diag_tmp,N_int) @@ -175,11 +175,11 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) call bitstring_to_list(mobMask(1,1), p(1,1), p(0,1), N_int) call bitstring_to_list(mobMask(1,2), p(1,2), p(0,2), N_int) - call assert(nt >= 2, irp_here//"qsd") + !call assert(nt >= 2, irp_here//"qsd") if(i < i_gen) then if(nt == 4) call past_d2(banned, p, sp) if(nt == 3) call past_d1(bannedOrb, p) - call assert(nt /= 2, "should have been discarded") + !call assert(nt /= 2, "should have been discarded") else if(nt == 4) then call get_d2(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) @@ -215,7 +215,7 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) tip = p(0,1) * p(0,2) - call assert(p(0,1) + p(0,2) == 4, irp_here//"df") + !call assert(p(0,1) + p(0,2) == 4, irp_here//"df") ma = sp if(p(0,1) > p(0,2)) ma = 1 if(p(0,1) < p(0,2)) ma = 2 @@ -231,14 +231,14 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) i2 = turn3(2,i) p1 = p(i1, ma) p2 = p(i2, ma) - call assert(h(0,ma) == 2, "dmdmd") - call assert(p(0, ma) == 3, "dmdm2") + !call assert(h(0,ma) == 2, "dmdmd") + !call assert(p(0, ma) == 3, "dmdm2") h1 = h(1, ma) h2 = h(2, ma) hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, ma, ma, h1, p1, h2, p2) - call debug_hij(hij, gen, mask, mi, ma, puti, putj) + !call debug_hij(hij, gen, mask, mi, ma, puti, putj) if(ma == 1) then mat(:, putj, puti) += coefs * hij else @@ -246,7 +246,7 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) end if end do else - call assert(tip == 4, "df") + !call assert(tip == 4, "df") do i = 1,2 do j = 1,2 puti = p(i, 1) @@ -257,7 +257,7 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) h2 = h(1,2) hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) - call debug_hij(hij, gen, mask, 1, 2, puti, putj) + !call debug_hij(hij, gen, mask, 1, 2, puti, putj) mat(:, puti, putj) += coefs * hij end do @@ -277,7 +277,7 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) p1 = p(i1, ma) p2 = p(i2, ma) hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, ma, ma, h1, p1, h2, p2) - call debug_hij(hij, gen, mask, ma, ma, puti, putj) + !call debug_hij(hij, gen, mask, ma, ma, puti, putj) mat(:, puti, putj) += coefs * hij end do end do @@ -285,17 +285,17 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) h1 = h(1, mi) h2 = h(1, ma) p1 = p(1, mi) - call assert(ma == sp, "dldl") + !call assert(ma == sp, "dldl") do i=1,3 p2 = p(i, ma) puti = p(turn3(1,i), ma) putj = p(turn3(2,i), ma) hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, mi, ma, h1, p1, h2, p2) - call debug_hij(hij, gen, mask, ma, ma, puti, putj) + !call debug_hij(hij, gen, mask, ma, ma, puti, putj) mat(:, min(puti, putj), max(puti, putj)) += coefs * hij end do else ! tip == 4 - call assert(tip == 4, "qsdf") + !call assert(tip == 4, "qsdf") puti = p(1, sp) putj = p(2, sp) p1 = p(1, mi) @@ -303,7 +303,7 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) h1 = h(1, mi) h2 = h(2, mi) hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, mi, mi, h1, p1, h2, p2) - call debug_hij(hij, gen, mask,ma,ma, puti, putj) + !call debug_hij(hij, gen, mask,ma,ma, puti, putj) mat(:, puti, putj) += coefs * hij end if end if @@ -324,7 +324,7 @@ subroutine debug_hij(hij, gen, mask, s1, s2, p1, p2) integer :: exc(0:2,2,2) call apply_particles(mask, s1, p1, s2, p2, det, ok, N_int) - call assert(ok, "nokey") + !call assert(ok, "nokey") call i_H_j_phase_out(gen,det,N_int,hij_ref,phase_ref,exc,degree) if(hij /= hij_ref) then print *, hij, hij_ref @@ -375,7 +375,7 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) if(sp == 3) then !move MA - call assert(p(0,1)*p(0,2) == 2, "ddmmm") + !call assert(p(0,1)*p(0,2) == 2, "ddmmm") puti = p(1,mi) hfix = h(1,ma) p1 = p(1,ma) @@ -385,13 +385,13 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) do putj=1, hfix-1 if(lbanned(putj, ma)) cycle hij = (integral8(p1, p2, putj, hfix)-integral8(p2,p1,putj,hfix)) * get_phase_bi(phasemask, ma, ma, putj, p1, hfix, p2) - call debug_hij(hij, gen, mask, mi, ma, puti, putj) + !call debug_hij(hij, gen, mask, mi, ma, puti, putj) tmp_row(:,putj) += hij * coefs end do do putj=hfix+1, mo_tot_num if(lbanned(putj, ma)) cycle hij = (integral8(p1, p2, hfix, putj)-integral8(p2,p1,hfix,putj)) * get_phase_bi(phasemask, ma, ma, hfix, p1, putj, p2) - call debug_hij(hij, gen, mask, mi, ma, puti, putj) + !call debug_hij(hij, gen, mask, mi, ma, puti, putj) tmp_row(:,putj) += hij * coefs end do @@ -411,11 +411,11 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) !p1 fixed putj = p1 hij = integral8(p2,pfix,hfix,puti) * get_phase_bi(phasemask, ma, mi, hfix, p2, puti, pfix) - call debug_hij(hij, gen, mask, mi, ma, puti, putj) + !call debug_hij(hij, gen, mask, mi, ma, puti, putj) tmp_row(:,puti) += hij * coefs putj = p2 hij = integral8(p1,pfix,hfix,puti) * get_phase_bi(phasemask, ma, mi, hfix, p1, puti, pfix) - call debug_hij(hij, gen, mask, mi, ma, puti, putj) + !call debug_hij(hij, gen, mask, mi, ma, puti, putj) tmp_row2(:,puti) += hij * coefs end do @@ -437,13 +437,13 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) do putj=1,hfix-1 if(lbanned(putj,ma)) cycle hij = (integral8(p1, p2, putj, hfix)-integral8(p2,p1,putj,hfix)) * get_phase_bi(phasemask, ma, ma, putj, p1, hfix, p2) - call debug_hij(hij, gen, mask, ma, ma, puti, putj) + !call debug_hij(hij, gen, mask, ma, ma, puti, putj) tmp_row(:,putj) += hij * coefs end do do putj=hfix+1,mo_tot_num if(lbanned(putj,ma)) cycle hij = (integral8(p1, p2, hfix, putj)-integral8(p2,p1,hfix,putj)) * get_phase_bi(phasemask, ma, ma, hfix, p1, putj, p2) - call debug_hij(hij, gen, mask, ma, ma, puti, putj) + !call debug_hij(hij, gen, mask, ma, ma, puti, putj) tmp_row(:,putj) += hij * coefs end do @@ -451,7 +451,7 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) mat(:, puti, puti:) += tmp_row(:,puti:) end do else - call assert(sp == ma, "sp == ma") + !call assert(sp == ma, "sp == ma") hfix = h(1,mi) pfix = p(1,mi) p1 = p(1,ma) @@ -462,12 +462,12 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) if(lbanned(puti,ma)) cycle putj = p2 hij = integral8(pfix, p1, hfix, puti) * get_phase_bi(phasemask, mi, ma, hfix, pfix, puti, p1) - call debug_hij(hij, gen, mask, ma, ma, putj, puti) + !call debug_hij(hij, gen, mask, ma, ma, putj, puti) tmp_row(:,puti) += hij * coefs putj = p1 hij = integral8(pfix, p2, hfix, puti) * get_phase_bi(phasemask, mi, ma, hfix, pfix, puti, p2) - call debug_hij(hij, gen, mask, ma, ma, putj, puti) + !call debug_hij(hij, gen, mask, ma, ma, putj, puti) tmp_row2(:,puti) += hij * coefs end do mat(:,:p2-1,p2) += tmp_row(:,:p2-1) @@ -531,13 +531,13 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) if(banned(p1, p2)) cycle ! rentable? if(p1 == h1 .or. p2 == h2) then call apply_particles(mask, 1,p1,2,p2, det, ok, N_int) - call assert(ok, "zsdq") + !call assert(ok, "zsdq") call i_h_j(gen, det, N_int, hij) mat(:, p1, p2) += coefs * hij else hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) phase = get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) - call debug_hij(hij, gen, mask, 1, 2, p1, p2) + !call debug_hij(hij, gen, mask, 1, 2, p1, p2) mat(:, p1, p2) += coefs * hij end if end do @@ -558,7 +558,7 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) else hij = (integral8(p1, p2, puti, putj) - integral8(p2, p1, puti, putj))* get_phase_bi(phasemask, sp, sp, puti, p1 , putj, p2) mat(:, puti, putj) += coefs * hij - call debug_hij(hij, gen, mask, sp, sp, puti, putj) + !call debug_hij(hij, gen, mask, sp, sp, puti, putj) end if end do end do @@ -646,8 +646,8 @@ subroutine spot_isinwf(mask, det, i_gen, N, banned, fullMatch) call bitstring_to_list(myMask(1,1), list(1), na, N_int) call bitstring_to_list(myMask(1,2), list(na+1), nb, N_int) - call assert(na + nb == 2, "oyo") - call assert(na == 1 .or. list(1) < list(2), "sqdsmmmm") + !call assert(na + nb == 2, "oyo") + !call assert(na == 1 .or. list(1) < list(2), "sqdsmmmm") banned(list(1), list(2)) = .true. end do genl end subroutine diff --git a/plugins/Full_CI_ZMQ/selection_single.irp.f b/plugins/Full_CI_ZMQ/selection_single.irp.f index 89f2b1ec..b9f53766 100644 --- a/plugins/Full_CI_ZMQ/selection_single.irp.f +++ b/plugins/Full_CI_ZMQ/selection_single.irp.f @@ -43,7 +43,7 @@ subroutine select_singles(i_gen,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf do i=1, N_holes(sp) h1 = hole_list(i,sp) call apply_hole(psi_det_generators(1,1,i_gen), sp, h1, mask, ok, N_int) - call assert(ok, irp_here) + !call assert(ok, irp_here) bannedOrb = .false. bannedOrb(h1) = .true. call spot_hasBeen(mask, sp, psi_det_sorted, i_gen, N_det, bannedOrb, fullMatch) @@ -174,7 +174,7 @@ subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) p2 = p(turn3_2(2,i), sp) hij = integral8(p1, p2, h1, h2) - integral8(p2, p1, h1, h2) hij *= get_phase_bi(phasemask, sp, sp, h1, p1, h2, p2) - call debug_hij_mo(hij, gen, mask, sp, puti) + !call debug_hij_mo(hij, gen, mask, sp, puti) vect(:, puti) += hij * coefs end do else if(h(0,sp) == 1) then @@ -187,7 +187,7 @@ subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) pmob = p(turn2(j), sp) hij = integral8(pfix, pmob, hfix, hmob) hij *= get_phase_bi(phasemask, sp, sfix, hmob, pmob, hfix, pfix) - call debug_hij_mo(hij, gen, mask, sp, puti) + !call debug_hij_mo(hij, gen, mask, sp, puti) vect(:, puti) += hij * coefs end do else @@ -199,7 +199,7 @@ subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) h2 = h(2,sfix) hij = (integral8(p1,p2,h1,h2) - integral8(p2,p1,h1,h2)) hij *= get_phase_bi(phasemask, sfix, sfix, h1, p1, h2, p2) - call debug_hij_mo(hij, gen, mask, sp, puti) + !call debug_hij_mo(hij, gen, mask, sp, puti) vect(:, puti) += hij * coefs end if end subroutine @@ -239,7 +239,7 @@ subroutine get_m1(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) if(lbanned(i)) cycle hij = (integral8(p1, p2, i, hole) - integral8(p2, p1, i, hole)) hij *= get_phase_bi(phasemask, sp, sp, i, p1, hole, p2) - call debug_hij_mo(hij, gen, mask, sp, i) + !call debug_hij_mo(hij, gen, mask, sp, i) vect(:,i) += hij * coefs end do do i=hole+1,mo_tot_num @@ -251,7 +251,7 @@ subroutine get_m1(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) end do call apply_particle(mask, sp, p2, det, ok, N_int) - call assert(ok, "OKE223") + !call assert(ok, "OKE223") call i_h_j(gen, det, N_int, hij) vect(:, p2) += hij * coefs else @@ -260,13 +260,13 @@ subroutine get_m1(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) if(lbanned(i)) cycle hij = integral8(p1, p2, i, hole) hij *= get_phase_bi(phasemask, sp, sh, i, p1, hole, p2) - call debug_hij_mo(hij, gen, mask, sp, i) + !call debug_hij_mo(hij, gen, mask, sp, i) vect(:,i) += hij * coefs end do end if call apply_particle(mask, sp, p1, det, ok, N_int) - call assert(ok, "OKQQE2") + !call assert(ok, "OKQQE2") call i_h_j(gen, det, N_int, hij) vect(:, p1) += hij * coefs @@ -293,7 +293,7 @@ subroutine get_m0(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) do i=1,mo_tot_num if(lbanned(i)) cycle call apply_particle(mask, sp, i, det, ok, N_int) - call assert(ok, "qsdo") + !call assert(ok, "qsdo") call i_h_j(gen, det, N_int, hij) vect(:, i) += hij * coefs end do @@ -365,8 +365,8 @@ subroutine debug_hij_mo(hij, gen, mask, s1, p1) logical, external :: detEq call apply_particle(mask, s1, p1, det, ok, N_int) - call assert(ok, "nokey_mo") - call assert(.not. detEq(det, gen, N_int), "Hii ...") + !call assert(ok, "nokey_mo") + !call assert(.not. detEq(det, gen, N_int), "Hii ...") call i_H_j_phase_out(gen,det,N_int,hij_ref,phase_ref,exc,degree) if(hij /= hij_ref) then print *, hij, hij_ref From 90b84581b06ff96f8c97e6fd9d6c517f428bbbcd Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 8 Sep 2016 15:22:09 +0200 Subject: [PATCH 092/216] enforced electron pair ban --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 9 -- plugins/Full_CI_ZMQ/selection.irp.f | 30 +++-- plugins/Full_CI_ZMQ/selection_double.irp.f | 133 ++++++++++++++------- plugins/Full_CI_ZMQ/selection_single.irp.f | 30 +++-- 4 files changed, 127 insertions(+), 75 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 3dff6ef8..16009b65 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -79,15 +79,6 @@ program fci_zmq endif E_CI_before = CI_energy call ezfio_set_full_ci_energy(CI_energy) - print *, N_det , N_det_max,maxval(abs(pt2(1:N_st))), pt2_max - do i=1, N_det - call assert(popcnt(psi_det_sorted(1,2,i)) == 9, "nelec...") - call assert(popcnt(psi_det_sorted(1,1,i)) == 9, "nelec...") - !call debug_det(psi_det_sorted(1,1,i), N_int) - do j=1,i-1 - call assert(.not. detEq(psi_det_sorted(1,1,i), psi_det_sorted(1,1,j), N_int), "OOQSDSD") - end do - end do enddo N_det = min(N_det_max,N_det) touch N_det psi_det psi_coef diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 0d7b3f25..43d252bd 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -1,18 +1,28 @@ use bitmasks -BEGIN_PROVIDER [ double precision, integral8, (mo_tot_num, mo_tot_num, mo_tot_num, mo_tot_num) ] - use bitmasks +! BEGIN_PROVIDER [ double precision, integral8, (mo_tot_num, mo_tot_num, mo_tot_num, mo_tot_num) ] +! use bitmasks +! implicit none +! +! integer :: h1, h2 +! +! integral8 = 0d0 +! do h1=1, mo_tot_num +! do h2=1, mo_tot_num +! call get_mo_bielec_integrals_ij(h1, h2 ,mo_tot_num,integral8(1,1,h1,h2),mo_integrals_map) +! end do +! end do +! END_PROVIDER + + +double precision function integral8(i,j,k,l) implicit none - integer :: h1, h2 + integer, intent(in) :: i,j,k,l + double precision, external :: get_mo_bielec_integral - integral8 = 0d0 - do h1=1, mo_tot_num - do h2=1, mo_tot_num - call get_mo_bielec_integrals_ij(h1, h2 ,mo_tot_num,integral8(1,1,h1,h2),mo_integrals_map) - end do - end do -END_PROVIDER + integral8 = get_mo_bielec_integral(i,j,k,l,mo_integrals_map) +end function BEGIN_PROVIDER [ integer(bit_kind), psi_phasemask, (N_int, 2, N_det)] diff --git a/plugins/Full_CI_ZMQ/selection_double.irp.f b/plugins/Full_CI_ZMQ/selection_double.irp.f index 268d9cbf..4c938951 100644 --- a/plugins/Full_CI_ZMQ/selection_double.irp.f +++ b/plugins/Full_CI_ZMQ/selection_double.irp.f @@ -44,7 +44,7 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call apply_holes(psi_det_generators(1,1,i_generator), s1,h1,s2,h2, mask, ok, N_int) !call assert(ok, irp_here) - logical :: banned(mo_tot_num, mo_tot_num) + logical :: banned(mo_tot_num, mo_tot_num,2) logical :: bannedOrb(mo_tot_num, 2) banned = .false. @@ -121,13 +121,13 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d endif pt2(1) += e_pert if(dabs(e_pert) > buf%mini) then - do j=1,buf%cur-1 - if(detEq(buf%det(1,1,j), det, N_int)) then - print *, "tops" - print *, i_generator, s1, s2, h1, h2,p1,p2 - stop - end if - end do +! do j=1,buf%cur-1 +! if(detEq(buf%det(1,1,j), det, N_int)) then +! print *, "tops" +! print *, i_generator, s1, s2, h1, h2,p1,p2 +! stop +! end if +! end do call add_to_selection_buffer(buf, det, e_pert) end if end do @@ -141,13 +141,15 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) integer(bit_kind),intent(in) :: mask(N_int, 2), det(N_int, 2, N_sel) integer, intent(in) :: sp, i_gen, N_sel - logical, intent(inout) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num) + logical, intent(inout) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num, 2) double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) - integer :: i, j, h(0:2,2), p(0:4,2), nt + integer :: i, j, k, l, h(0:2,2), p(0:4,2), nt integer(bit_kind) :: perMask(N_int, 2), mobMask(N_int, 2), negMask(N_int, 2) - + logical :: bandon + mat = 0d0 + bandon = .false. do i=1,N_int negMask(i,1) = not(mask(i,1)) @@ -181,6 +183,18 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) if(nt == 3) call past_d1(bannedOrb, p) !call assert(nt /= 2, "should have been discarded") else + if(i == i_gen) then + bandon = .true. + if(sp == 3) then + banned(:,:,2) = transpose(banned(:,:,1)) + else + do k=1,mo_tot_num + do l=k+1,mo_tot_num + banned(l,k,1) = banned(k,l,1) + end do + end do + end if + end if if(nt == 4) then call get_d2(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) else if(nt == 3) then @@ -190,6 +204,7 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) end if end if end do + call assert(bandon, "BANDON") end subroutine @@ -198,12 +213,12 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) implicit none integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2), phasemask(N_int, 2) - logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num) + logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num,2) double precision, intent(in) :: coefs(N_states) double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) integer, intent(in) :: h(0:2,2), p(0:4,2), sp - double precision, external :: get_phase_bi + double precision, external :: get_phase_bi, integral8 integer :: i, j, tip, ma, mi, puti, putj integer :: h1, h2, p1, p2, i1, i2 @@ -212,7 +227,9 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) integer, parameter:: turn2d(2,3,4) = reshape((/0,0, 0,0, 0,0, 3,4, 0,0, 0,0, 2,4, 1,4, 0,0, 2,3, 1,3, 1,2 /), (/2,3,4/)) integer, parameter :: turn2(2) = (/2, 1/) integer, parameter :: turn3(2,3) = reshape((/2,3, 1,3, 1,2/), (/2,3/)) - + + integer :: bant + bant = 1 tip = p(0,1) * p(0,2) !call assert(p(0,1) + p(0,2) == 4, irp_here//"df") @@ -223,6 +240,8 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) !print *, "d2 SPtip", SP, tip if(sp == 3) then + if(ma == 2) bant = 2 + if(tip == 3) then puti = p(1, mi) do i = 1, 3 @@ -236,7 +255,8 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) h1 = h(1, ma) h2 = h(2, ma) - + if(banned(putj,puti,bant)) cycle + hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, ma, ma, h1, p1, h2, p2) !call debug_hij(hij, gen, mask, mi, ma, puti, putj) if(ma == 1) then @@ -255,7 +275,9 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) p2 = p(turn2(j), 2) h1 = h(1,1) h2 = h(1,2) - + + if(banned(puti,putj,bant)) cycle + hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) !call debug_hij(hij, gen, mask, 1, 2, puti, putj) @@ -276,6 +298,9 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) i2 = turn2d(2, i, j) p1 = p(i1, ma) p2 = p(i2, ma) + + if(banned(puti,putj,1)) cycle + hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, ma, ma, h1, p1, h2, p2) !call debug_hij(hij, gen, mask, ma, ma, puti, putj) mat(:, puti, putj) += coefs * hij @@ -290,6 +315,9 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) p2 = p(i, ma) puti = p(turn3(1,i), ma) putj = p(turn3(2,i), ma) + + if(banned(puti,putj,1)) cycle + hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, mi, ma, h1, p1, h2, p2) !call debug_hij(hij, gen, mask, ma, ma, puti, putj) mat(:, min(puti, putj), max(puti, putj)) += coefs * hij @@ -302,9 +330,12 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) p2 = p(2, mi) h1 = h(1, mi) h2 = h(2, mi) - hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, mi, mi, h1, p1, h2, p2) - !call debug_hij(hij, gen, mask,ma,ma, puti, putj) - mat(:, puti, putj) += coefs * hij + + if(.not. banned(puti,putj,1)) then + hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, mi, mi, h1, p1, h2, p2) + !call debug_hij(hij, gen, mask,ma,ma, puti, putj) + mat(:, puti, putj) += coefs * hij + end if end if end if end subroutine @@ -343,12 +374,12 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) implicit none integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2), phasemask(N_int, 2) - logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num) + logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num,2) integer(bit_kind) :: det(N_int, 2) double precision, intent(in) :: coefs(N_states) double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) double precision :: hij, tmp_row(N_states, mo_tot_num), tmp_row2(N_states, mo_tot_num) - double precision, external :: get_phase_bi + double precision, external :: get_phase_bi, integral8 logical :: lbanned(mo_tot_num, 2), ok integer :: puti, putj, ma, mi, s1, s2, i, i1, i2, j, hfix, pfix, h1, h2, p1, p2, ib @@ -358,7 +389,9 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) integer, parameter :: turn2(2) = (/2,1/) integer, parameter :: turn3(2,3) = reshape((/2,3, 1,3, 1,2/), (/2,3/)) - + integer :: bant + + lbanned = bannedOrb do i=1, p(0,1) @@ -371,11 +404,14 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) ma = 1 if(p(0,2) >= 2) ma = 2 mi = turn2(ma) + + bant = 1 !print *, "d1 SP", sp, p(0,1)*p(0,2) if(sp == 3) then !move MA !call assert(p(0,1)*p(0,2) == 2, "ddmmm") + if(ma == 2) bant = 2 puti = p(1,mi) hfix = h(1,ma) p1 = p(1,ma) @@ -383,13 +419,13 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) if(.not. bannedOrb(puti, mi)) then tmp_row = 0d0 do putj=1, hfix-1 - if(lbanned(putj, ma)) cycle + if(lbanned(putj, ma) .or. banned(putj, puti,bant)) cycle hij = (integral8(p1, p2, putj, hfix)-integral8(p2,p1,putj,hfix)) * get_phase_bi(phasemask, ma, ma, putj, p1, hfix, p2) !call debug_hij(hij, gen, mask, mi, ma, puti, putj) tmp_row(:,putj) += hij * coefs end do do putj=hfix+1, mo_tot_num - if(lbanned(putj, ma)) cycle + if(lbanned(putj, ma) .or. banned(putj, puti,bant)) cycle hij = (integral8(p1, p2, hfix, putj)-integral8(p2,p1,hfix,putj)) * get_phase_bi(phasemask, ma, ma, hfix, p1, putj, p2) !call debug_hij(hij, gen, mask, mi, ma, puti, putj) tmp_row(:,putj) += hij * coefs @@ -410,13 +446,18 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) if(lbanned(puti,mi)) cycle !p1 fixed putj = p1 - hij = integral8(p2,pfix,hfix,puti) * get_phase_bi(phasemask, ma, mi, hfix, p2, puti, pfix) + if(.not. banned(putj,puti,bant)) then + hij = integral8(p2,pfix,hfix,puti) * get_phase_bi(phasemask, ma, mi, hfix, p2, puti, pfix) + tmp_row(:,puti) += hij * coefs + end if + !call debug_hij(hij, gen, mask, mi, ma, puti, putj) - tmp_row(:,puti) += hij * coefs putj = p2 - hij = integral8(p1,pfix,hfix,puti) * get_phase_bi(phasemask, ma, mi, hfix, p1, puti, pfix) - !call debug_hij(hij, gen, mask, mi, ma, puti, putj) - tmp_row2(:,puti) += hij * coefs + if(.not. banned(putj,puti,bant)) then + hij = integral8(p1,pfix,hfix,puti) * get_phase_bi(phasemask, ma, mi, hfix, p1, puti, pfix) + !call debug_hij(hij, gen, mask, mi, ma, puti, putj) + tmp_row2(:,puti) += hij * coefs + end if end do if(mi == 1) then @@ -435,13 +476,13 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) p2 = p(turn3(2,i), ma) tmp_row = 0d0 do putj=1,hfix-1 - if(lbanned(putj,ma)) cycle + if(lbanned(putj,ma) .or. banned(puti,putj,1)) cycle hij = (integral8(p1, p2, putj, hfix)-integral8(p2,p1,putj,hfix)) * get_phase_bi(phasemask, ma, ma, putj, p1, hfix, p2) !call debug_hij(hij, gen, mask, ma, ma, puti, putj) tmp_row(:,putj) += hij * coefs end do do putj=hfix+1,mo_tot_num - if(lbanned(putj,ma)) cycle + if(lbanned(putj,ma) .or. banned(puti,putj,1)) cycle hij = (integral8(p1, p2, hfix, putj)-integral8(p2,p1,hfix,putj)) * get_phase_bi(phasemask, ma, ma, hfix, p1, putj, p2) !call debug_hij(hij, gen, mask, ma, ma, puti, putj) tmp_row(:,putj) += hij * coefs @@ -461,14 +502,18 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) do puti=1,mo_tot_num if(lbanned(puti,ma)) cycle putj = p2 - hij = integral8(pfix, p1, hfix, puti) * get_phase_bi(phasemask, mi, ma, hfix, pfix, puti, p1) - !call debug_hij(hij, gen, mask, ma, ma, putj, puti) - tmp_row(:,puti) += hij * coefs + if(.not. banned(puti,putj,1)) then + hij = integral8(pfix, p1, hfix, puti) * get_phase_bi(phasemask, mi, ma, hfix, pfix, puti, p1) + !call debug_hij(hij, gen, mask, ma, ma, putj, puti) + tmp_row(:,puti) += hij * coefs + end if putj = p1 - hij = integral8(pfix, p2, hfix, puti) * get_phase_bi(phasemask, mi, ma, hfix, pfix, puti, p2) - !call debug_hij(hij, gen, mask, ma, ma, putj, puti) - tmp_row2(:,puti) += hij * coefs + if(.not. banned(puti,putj,1)) then + hij = integral8(pfix, p2, hfix, puti) * get_phase_bi(phasemask, mi, ma, hfix, pfix, puti, p2) + !call debug_hij(hij, gen, mask, ma, ma, putj, puti) + tmp_row2(:,puti) += hij * coefs + end if end do mat(:,:p2-1,p2) += tmp_row(:,:p2-1) mat(:,p2,p2:) += tmp_row(:,p2:) @@ -492,7 +537,7 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) do i2=ib,p(0,s2) p1 = p(i1,s1) p2 = p(i2,s2) - if(bannedOrb(p1, s1) .or. bannedOrb(p2, s2)) cycle + if(bannedOrb(p1, s1) .or. bannedOrb(p2, s2) .or. banned(p1, p2, 1)) cycle call apply_particles(mask, s1, p1, s2, p2, det, ok, N_int) call i_h_j(gen, det, N_int, hij) mat(:, p1, p2) += coefs * hij @@ -508,7 +553,7 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) implicit none integer(bit_kind), intent(in) :: gen(N_int, 2), mask(N_int, 2), phasemask(N_int, 2) - logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num) + logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num,2) integer(bit_kind) :: det(N_int, 2) double precision, intent(in) :: coefs(N_states) double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) @@ -516,9 +561,12 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) integer :: i, j, s, h1, h2, p1, p2, puti, putj double precision :: hij, phase - double precision, external :: get_phase_bi + double precision, external :: get_phase_bi, integral8 logical :: ok + integer :: bant + bant = 1 + !print *, "d0 SP", sp if(sp == 3) then ! AB @@ -528,7 +576,7 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) if(bannedOrb(p1, 1)) cycle do p2=1, mo_tot_num if(bannedOrb(p2,2)) cycle - if(banned(p1, p2)) cycle ! rentable? + if(banned(p1, p2, bant)) cycle ! rentable? if(p1 == h1 .or. p2 == h2) then call apply_particles(mask, 1,p1,2,p2, det, ok, N_int) !call assert(ok, "zsdq") @@ -549,10 +597,9 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) if(bannedOrb(puti, sp)) cycle do putj=puti+1, mo_tot_num if(bannedOrb(putj, sp)) cycle - if(banned(puti, putj)) cycle ! rentable? + if(banned(puti, putj, bant)) cycle ! rentable? if(puti == p1 .or. putj == p2 .or. puti == p2 .or. putj == p1) then call apply_particles(mask, sp,puti,sp,putj, det, ok, N_int) - call ASSERT(ok, "ssss") call i_h_j(gen, det, N_int, hij) mat(:, puti, putj) += coefs * hij else diff --git a/plugins/Full_CI_ZMQ/selection_single.irp.f b/plugins/Full_CI_ZMQ/selection_single.irp.f index b9f53766..79fe91c1 100644 --- a/plugins/Full_CI_ZMQ/selection_single.irp.f +++ b/plugins/Full_CI_ZMQ/selection_single.irp.f @@ -160,7 +160,7 @@ subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) integer, intent(in) :: sp, h(0:2, 2), p(0:3, 2) integer :: i, j, h1, h2, p1, p2, sfix, hfix, pfix, hmob, pmob, puti double precision :: hij - double precision, external :: get_phase_bi + double precision, external :: get_phase_bi, integral8 integer, parameter :: turn3_2(2,3) = reshape((/2,3, 1,3, 1,2/), (/2,3/)) integer, parameter :: turn2(2) = (/2,1/) @@ -170,6 +170,7 @@ subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) h2 = h(2, sp) do i=1,3 puti = p(i, sp) + if(bannedOrb(puti)) cycle p1 = p(turn3_2(1,i), sp) p2 = p(turn3_2(2,i), sp) hij = integral8(p1, p2, h1, h2) - integral8(p2, p1, h1, h2) @@ -184,6 +185,7 @@ subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) hmob = h(1,sp) do j=1,2 puti = p(j, sp) + if(bannedOrb(puti)) cycle pmob = p(turn2(j), sp) hij = integral8(pfix, pmob, hfix, hmob) hij *= get_phase_bi(phasemask, sp, sfix, hmob, pmob, hfix, pfix) @@ -192,15 +194,17 @@ subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) end do else puti = p(1,sp) - sfix = turn2(sp) - p1 = p(1,sfix) - p2 = p(2,sfix) - h1 = h(1,sfix) - h2 = h(2,sfix) - hij = (integral8(p1,p2,h1,h2) - integral8(p2,p1,h1,h2)) - hij *= get_phase_bi(phasemask, sfix, sfix, h1, p1, h2, p2) - !call debug_hij_mo(hij, gen, mask, sp, puti) - vect(:, puti) += hij * coefs + if(.not. bannedOrb(puti)) then + sfix = turn2(sp) + p1 = p(1,sfix) + p2 = p(2,sfix) + h1 = h(1,sfix) + h2 = h(2,sfix) + hij = (integral8(p1,p2,h1,h2) - integral8(p2,p1,h1,h2)) + hij *= get_phase_bi(phasemask, sfix, sfix, h1, p1, h2, p2) + !call debug_hij_mo(hij, gen, mask, sp, puti) + vect(:, puti) += hij * coefs + end if end if end subroutine @@ -219,7 +223,7 @@ subroutine get_m1(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) logical :: ok, lbanned(mo_tot_num) integer(bit_kind) :: det(N_int, 2) double precision :: hij - double precision, external :: get_phase_bi + double precision, external :: get_phase_bi, integral8 lbanned = bannedOrb sh = 1 @@ -246,7 +250,7 @@ subroutine get_m1(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) if(lbanned(i)) cycle hij = (integral8(p1, p2, hole, i) - integral8(p2, p1, hole, i)) hij *= get_phase_bi(phasemask, sp, sp, hole, p1, i, p2) - call debug_hij_mo(hij, gen, mask, sp, i) + !call debug_hij_mo(hij, gen, mask, sp, i) vect(:,i) += hij * coefs end do @@ -363,7 +367,7 @@ subroutine debug_hij_mo(hij, gen, mask, s1, p1) integer :: degree integer :: exc(0:2,2,2) logical, external :: detEq - + call apply_particle(mask, s1, p1, det, ok, N_int) !call assert(ok, "nokey_mo") !call assert(.not. detEq(det, gen, N_int), "Hii ...") From e78f316936e0d45fb99110c2098aeeb2082cf11e Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 8 Sep 2016 17:34:56 +0200 Subject: [PATCH 093/216] changed phasemask representation --- plugins/Full_CI_ZMQ/selection.irp.f | 57 +++++++++------------- plugins/Full_CI_ZMQ/selection_double.irp.f | 36 ++++++-------- plugins/Full_CI_ZMQ/selection_single.irp.f | 12 +++-- 3 files changed, 47 insertions(+), 58 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 43d252bd..c1f529dc 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -25,7 +25,7 @@ double precision function integral8(i,j,k,l) end function -BEGIN_PROVIDER [ integer(bit_kind), psi_phasemask, (N_int, 2, N_det)] +BEGIN_PROVIDER [ integer(1), psi_phasemask, (N_int*bit_kind_size, 2, N_det)] use bitmasks implicit none @@ -52,17 +52,19 @@ subroutine get_mask_phase(det, phasemask) implicit none integer(bit_kind), intent(in) :: det(N_int, 2) - integer(bit_kind), intent(out) :: phasemask(N_int, 2) + integer(1), intent(out) :: phasemask(N_int*bit_kind_size, 2) integer :: s, ni, i logical :: change - phasemask = 0_8 +! phasemask = 0_8 + phasemask = 0_1 do s=1,2 change = .false. do ni=1,N_int do i=0,bit_kind_size-1 if(BTEST(det(ni, s), i)) change = .not. change - if(change) phasemask(ni, s) = ibset(phasemask(ni, s), i) +! if(change) phasemask(ni, s) = ibset(phasemask(ni, s), i) + if(change) phasemask((ni-1)*bit_kind_size + i + 1, s) = 1_1 end do end do end do @@ -120,41 +122,28 @@ double precision function get_phase_bi(phasemask, s1, s2, h1, p1, h2, p2) use bitmasks implicit none - integer(bit_kind), intent(in) :: phasemask(N_int, 2) + integer(1), intent(in) :: phasemask(N_int*bit_kind_size, 2) integer, intent(in) :: s1, s2, h1, h2, p1, p2 logical :: change - integer :: np + integer(1) :: np double precision, parameter :: res(0:1) = (/1d0, -1d0/) - call assert(s1 /= s2 .or. (h1 <= h2 .and. p1 <= p2), irp_here) - np = 0 - change = btest(phasemask(1+ishft(h1, -6), s1), iand(h1-1, 63)) - change = xor(change, btest(phasemask(1+ishft(p1, -6), s1), iand(p1-1, 63))) - if(xor(change, p1 < h1)) np = 1 - - change = btest(phasemask(1+ishft(h2, -6), s2), iand(h2-1, 63)) - change = xor(change, btest(phasemask(1+ishft(p2, -6), s2), iand(p2-1, 63))) - if(xor(change, p2 < h2)) np = np + 1 +! call assert(s1 /= s2 .or. (h1 <= h2 .and. p1 <= p2), irp_here) +! np = 0 +! change = btest(phasemask(1+ishft(h1, -6), s1), iand(h1-1, 63)) +! change = xor(change, btest(phasemask(1+ishft(p1, -6), s1), iand(p1-1, 63))) +! if(xor(change, p1 < h1)) np = 1 +! +! change = btest(phasemask(1+ishft(h2, -6), s2), iand(h2-1, 63)) +! change = xor(change, btest(phasemask(1+ishft(p2, -6), s2), iand(p2-1, 63))) +! if(xor(change, p2 < h2)) np = np + 1 - if(s1 == s2 .and. max(h1, p1) > min(h2, p2)) np = np + 1 - get_phase_bi = res(iand(np,1)) -end subroutine - - -double precision function get_phase_mono(phasemask, s1, h1, p1) - use bitmasks - implicit none - - integer(bit_kind), intent(in) :: phasemask(N_int, 2) - integer, intent(in) :: s1, h1, p1 - logical :: change - stop "phase moni BUGGED" - - change = btest(phasemask(ishft(h1, bit_kind_shift), s1), iand(h1, 63_8)) - change = xor(change, btest(phasemask(ishft(p1, bit_kind_shift), s1), iand(p1, 63_8))) - - get_phase_mono = 1d0 - if(change) get_phase_mono = -1d0 + np = phasemask(h1,s1) + phasemask(p1,s1) + phasemask(h2,s2) + phasemask(p2,s2) + if(p1 < h1) np = np + 1_1 + if(p2 < h2) np = np + 1_1 + + if(s1 == s2 .and. max(h1, p1) > min(h2, p2)) np = np + 1_1 + get_phase_bi = res(iand(np,1_1)) end subroutine diff --git a/plugins/Full_CI_ZMQ/selection_double.irp.f b/plugins/Full_CI_ZMQ/selection_double.irp.f index 4c938951..d31f9a6a 100644 --- a/plugins/Full_CI_ZMQ/selection_double.irp.f +++ b/plugins/Full_CI_ZMQ/selection_double.irp.f @@ -212,7 +212,8 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) use bitmasks implicit none - integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2), phasemask(N_int, 2) + integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2) + integer(1), intent(in) :: phasemask(N_int*bit_kind_size, 2) logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num,2) double precision, intent(in) :: coefs(N_states) double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) @@ -246,16 +247,13 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) puti = p(1, mi) do i = 1, 3 putj = p(i, ma) + if(banned(putj,puti,bant)) cycle i1 = turn3(1,i) i2 = turn3(2,i) p1 = p(i1, ma) p2 = p(i2, ma) - !call assert(h(0,ma) == 2, "dmdmd") - !call assert(p(0, ma) == 3, "dmdm2") h1 = h(1, ma) h2 = h(2, ma) - - if(banned(putj,puti,bant)) cycle hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, ma, ma, h1, p1, h2, p2) !call debug_hij(hij, gen, mask, mi, ma, puti, putj) @@ -271,16 +269,15 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) do j = 1,2 puti = p(i, 1) putj = p(j, 2) + + if(banned(puti,putj,bant)) cycle p1 = p(turn2(i), 1) p2 = p(turn2(j), 2) h1 = h(1,1) h2 = h(1,2) - if(banned(puti,putj,bant)) cycle - hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) !call debug_hij(hij, gen, mask, 1, 2, puti, putj) - mat(:, puti, putj) += coefs * hij end do end do @@ -294,13 +291,12 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) puti = p(i, ma) do j=i+1,4 putj = p(j, ma) + if(banned(puti,putj,1)) cycle + i1 = turn2d(1, i, j) i2 = turn2d(2, i, j) p1 = p(i1, ma) p2 = p(i2, ma) - - if(banned(puti,putj,1)) cycle - hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, ma, ma, h1, p1, h2, p2) !call debug_hij(hij, gen, mask, ma, ma, puti, putj) mat(:, puti, putj) += coefs * hij @@ -312,11 +308,10 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) p1 = p(1, mi) !call assert(ma == sp, "dldl") do i=1,3 - p2 = p(i, ma) puti = p(turn3(1,i), ma) putj = p(turn3(2,i), ma) - if(banned(puti,putj,1)) cycle + p2 = p(i, ma) hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, mi, ma, h1, p1, h2, p2) !call debug_hij(hij, gen, mask, ma, ma, puti, putj) @@ -326,12 +321,11 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) !call assert(tip == 4, "qsdf") puti = p(1, sp) putj = p(2, sp) - p1 = p(1, mi) - p2 = p(2, mi) - h1 = h(1, mi) - h2 = h(2, mi) - if(.not. banned(puti,putj,1)) then + p1 = p(1, mi) + p2 = p(2, mi) + h1 = h(1, mi) + h2 = h(2, mi) hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, mi, mi, h1, p1, h2, p2) !call debug_hij(hij, gen, mask,ma,ma, puti, putj) mat(:, puti, putj) += coefs * hij @@ -373,7 +367,8 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) use bitmasks implicit none - integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2), phasemask(N_int, 2) + integer(bit_kind), intent(in) :: mask(N_int, 2), gen(N_int, 2) + integer(1),intent(in) :: phasemask(N_int*bit_kind_size, 2) logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num,2) integer(bit_kind) :: det(N_int, 2) double precision, intent(in) :: coefs(N_states) @@ -552,7 +547,8 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) use bitmasks implicit none - integer(bit_kind), intent(in) :: gen(N_int, 2), mask(N_int, 2), phasemask(N_int, 2) + integer(bit_kind), intent(in) :: gen(N_int, 2), mask(N_int, 2) + integer(1), intent(in) :: phasemask(N_int*bit_kind_size, 2) logical, intent(in) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num,2) integer(bit_kind) :: det(N_int, 2) double precision, intent(in) :: coefs(N_states) diff --git a/plugins/Full_CI_ZMQ/selection_single.irp.f b/plugins/Full_CI_ZMQ/selection_single.irp.f index 79fe91c1..a49ae879 100644 --- a/plugins/Full_CI_ZMQ/selection_single.irp.f +++ b/plugins/Full_CI_ZMQ/selection_single.irp.f @@ -103,7 +103,8 @@ subroutine splash_p(mask, sp, det, phasemask, coefs, N_sel, bannedOrb, vect) use bitmasks implicit none - integer(bit_kind),intent(in) :: mask(N_int, 2), det(N_int,2,N_sel), phasemask(N_int,2,N_sel) + integer(bit_kind),intent(in) :: mask(N_int, 2), det(N_int,2,N_sel) + integer(1), intent(in) :: phasemask(N_int*bit_kind_size, 2, N_sel) double precision, intent(in) :: coefs(N_states, N_sel) integer, intent(in) :: sp, N_sel logical, intent(inout) :: bannedOrb(mo_tot_num) @@ -153,7 +154,8 @@ subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) use bitmasks implicit none - integer(bit_kind), intent(in) :: gen(N_int, 2), phasemask(N_int, 2), mask(N_int, 2) + integer(bit_kind), intent(in) :: gen(N_int, 2), mask(N_int, 2) + integer(1), intent(in) :: phasemask(N_int*bit_kind_size, 2) logical, intent(in) :: bannedOrb(mo_tot_num) double precision, intent(in) :: coefs(N_states) double precision, intent(inout) :: vect(N_states, mo_tot_num) @@ -214,7 +216,8 @@ subroutine get_m1(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) use bitmasks implicit none - integer(bit_kind), intent(in) :: gen(N_int, 2), phasemask(N_int, 2), mask(N_int, 2) + integer(bit_kind), intent(in) :: gen(N_int, 2), mask(N_int, 2) + integer(1), intent(in) :: phasemask(N_int*bit_kind_size, 2) logical, intent(in) :: bannedOrb(mo_tot_num) double precision, intent(in) :: coefs(N_states) double precision, intent(inout) :: vect(N_states, mo_tot_num) @@ -282,7 +285,8 @@ subroutine get_m0(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) use bitmasks implicit none - integer(bit_kind), intent(in) :: gen(N_int, 2), phasemask(N_int, 2), mask(N_int, 2) + integer(bit_kind), intent(in) :: gen(N_int, 2), mask(N_int, 2) + integer(1), intent(in) :: phasemask(N_int*bit_kind_size, 2) logical, intent(in) :: bannedOrb(mo_tot_num) double precision, intent(in) :: coefs(N_states) double precision, intent(inout) :: vect(N_states, mo_tot_num) From 21a9b30d2dc975225f5a9fa52f2c95bd88f2f6b4 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 8 Sep 2016 22:37:05 +0200 Subject: [PATCH 094/216] Added Zmatrix module --- ocaml/Element.mli | 1 + ocaml/Molecule.ml | 22 +- ocaml/Molecule.mli | 12 + ocaml/Zmatrix.ml | 326 +++++++++++++++++++++ ocaml/_tags | 2 +- ocaml/qp_create_ezfio_from_xyz.ml | 14 +- src/Determinants/slater_rules.irp.f | 16 +- src/Integrals_Bielec/ao_bi_integrals.irp.f | 2 +- 8 files changed, 379 insertions(+), 16 deletions(-) create mode 100644 ocaml/Zmatrix.ml diff --git a/ocaml/Element.mli b/ocaml/Element.mli index 5edfdf31..2c899b3b 100644 --- a/ocaml/Element.mli +++ b/ocaml/Element.mli @@ -19,3 +19,4 @@ val to_charge : t -> Charge.t val of_charge : Charge.t -> t val covalent_radius : t -> Qptypes.Positive_float.t val vdw_radius : t -> Qptypes.Positive_float.t +val mass : t -> Qptypes.Positive_float.t diff --git a/ocaml/Molecule.ml b/ocaml/Molecule.ml index a9d73432..a26e23b5 100644 --- a/ocaml/Molecule.ml +++ b/ocaml/Molecule.ml @@ -147,10 +147,28 @@ let of_xyz_file let (_,buffer) = In_channel.read_all filename |> String.lsplit2_exn ~on:'\n' in let (_,buffer) = String.lsplit2_exn buffer ~on:'\n' in - of_xyz_string ~charge:charge ~multiplicity:multiplicity - ~units:units buffer + of_xyz_string ~charge ~multiplicity ~units buffer +let of_zmt_file + ?(charge=(Charge.of_int 0)) ?(multiplicity=(Multiplicity.of_int 1)) + ?(units=Units.Angstrom) + filename = + In_channel.read_all filename + |> Zmatrix.of_string + |> Zmatrix.to_xyz_string + |> of_xyz_string ~charge ~multiplicity ~units + + +let of_file + ?(charge=(Charge.of_int 0)) ?(multiplicity=(Multiplicity.of_int 1)) + ?(units=Units.Angstrom) + filename = + try + of_xyz_file ~charge ~multiplicity ~units filename + with _ -> + of_zmt_file ~charge ~multiplicity ~units filename + let distance_matrix molecule = let coord = diff --git a/ocaml/Molecule.mli b/ocaml/Molecule.mli index f81f28a3..f6201b18 100644 --- a/ocaml/Molecule.mli +++ b/ocaml/Molecule.mli @@ -29,6 +29,18 @@ val of_xyz_file : ?multiplicity:Multiplicity.t -> ?units:Units.units -> string -> t +(** Creates a molecule from a zmt file *) +val of_zmt_file : + ?charge:Charge.t -> + ?multiplicity:Multiplicity.t -> + ?units:Units.units -> string -> t + +(** Creates a molecule from a file (xyz or zmt) *) +val of_file : + ?charge:Charge.t -> + ?multiplicity:Multiplicity.t -> + ?units:Units.units -> string -> t + (** Creates a molecule from an xyz file in a string *) val of_xyz_string : ?charge:Charge.t -> diff --git a/ocaml/Zmatrix.ml b/ocaml/Zmatrix.ml new file mode 100644 index 00000000..294b1112 --- /dev/null +++ b/ocaml/Zmatrix.ml @@ -0,0 +1,326 @@ +open Qptypes + +module StringMap = Map.Make(String) + +type atom_id = int +type angle = Label of string | Value of float +type distance = Label of string | Value of float +type dihedral = Label of string | Value of float + +let pi = acos (-1.) +let to_radian = pi /. 180. + +let rec in_range (xmin, xmax) x = + if (x <= xmin) then + in_range (xmin, xmax) (x -. xmin +. xmax ) + else if (x > xmax) then + in_range (xmin, xmax) (x -. xmax +. xmin ) + else + x + +let atom_id_of_int : int -> atom_id = + fun x -> ( assert (x>0) ; x) + +let distance_of_float : float -> distance = + fun x -> ( assert (x>=0.) ; Value x) + +let angle_of_float : float -> angle = + fun x -> Value (in_range (-180., 180.) x) + +let dihedral_of_float : float -> dihedral = + fun x -> Value (in_range (-360., 360.) x) + + +let atom_id_of_string : string -> atom_id = + fun i -> atom_id_of_int @@ int_of_string i + +let distance_of_string : string -> distance = + fun s -> + try + distance_of_float @@ float_of_string s + with _ -> Label s + +let angle_of_string : string -> angle = + fun s -> + try + angle_of_float @@ float_of_string s + with _ -> Label s + +let dihedral_of_string : string -> dihedral = + fun s -> + try + dihedral_of_float @@ float_of_string s + with _ -> Label s + + +let int_of_atom_id : atom_id -> int = fun x -> x + +let float_of_distance : float StringMap.t -> distance -> float = + fun map -> function + | Value x -> x + | Label s -> StringMap.find s map + +let float_of_angle : float StringMap.t -> angle -> float = + fun map -> function + | Value x -> x + | Label s -> StringMap.find s map + +let float_of_dihedral : float StringMap.t -> dihedral -> float = + fun map -> function + | Value x -> x + | Label s -> StringMap.find s map + + +type line = +| First of Element.t +| Second of (Element.t * distance) +| Third of (Element.t * atom_id * distance * atom_id * angle) +| Other of (Element.t * atom_id * distance * atom_id * angle * atom_id * dihedral ) +| Coord of (string * float) + + +let string_of_line map = + let f_r = float_of_distance map + and f_a = float_of_angle map + and f_d = float_of_dihedral map + and i_i = int_of_atom_id + in function +| First e -> Printf.sprintf "%-3s" (Element.to_string e) +| Second (e, r) -> Printf.sprintf "%-3s %5d %f" (Element.to_string e) 1 (f_r r) +| Third (e, i, r, j, a) -> Printf.sprintf "%-3s %5d %f %5d %f" (Element.to_string e) (i_i i) (f_r r) (i_i j) (f_a a) +| Other (e, i, r, j, a, k, d) -> Printf.sprintf "%-3s %5d %f %5d %f %5d %f" (Element.to_string e) (i_i i) (f_r r) (i_i j) (f_a a) (i_i k) (f_d d) +| Coord (c, f) -> Printf.sprintf "%s %f" c f + + +let line_of_string l = + let line_clean = + Str.split (Str.regexp " ") l + |> List.filter (fun x -> x <> "") + in + match line_clean with + | e :: [] -> First (Element.of_string e) + | e :: i :: r :: [] -> Second + (Element.of_string e, + distance_of_string r) + | e :: i :: r :: j :: a :: [] -> Third + (Element.of_string e, + atom_id_of_string i, + distance_of_string r, + atom_id_of_string j, + angle_of_string a) + | e :: i :: r :: j :: a :: k :: d :: [] -> Other + (Element.of_string e, + atom_id_of_string i, + distance_of_string r, + atom_id_of_string j, + angle_of_string a, + atom_id_of_string k, + dihedral_of_string d) + | c :: f :: [] -> Coord (c, float_of_string f) + | _ -> failwith ("Syntax error: "^l) + + +type t = (line array * float StringMap.t) + +let of_string t = + let l = + Str.split (Str.regexp "\n") t + |> List.map String.trim + |> List.filter (fun x -> x <> "") + |> List.map line_of_string + in + + let l = + match l with + | First _ :: Second _ :: Third _ :: _ + | First _ :: Second _ :: [] + | First _ :: [] -> l + | _ -> failwith "Syntax error" + in + + let (l, m) = + let rec work lst map = function + | (First _ as x) :: rest + | (Second _ as x) :: rest + | (Third _ as x) :: rest + | (Other _ as x) :: rest -> work (x::lst) map rest + | (Coord (c,f)) :: rest -> work lst (StringMap.add c f map) rest + | [] -> (List.rev lst, map) + in + work [] (StringMap.empty) l + in + (Array.of_list l, m) + + +(** Linear algebra *) + +let (|-) (x,y,z) (x',y',z') = + ( x-.x', y-.y', z-.z' ) + +let (|+) (x,y,z) (x',y',z') = + ( x+.x', y+.y', z+.z' ) + +let (|.) s (x,y,z) = + ( s*.x, s*.y, s*.z ) + +let dot (x,y,z) (x',y',z') = + x*.x' +. y*.y' +. z*.z' + +let norm u = + sqrt @@ dot u u + +let normalized u = + 1. /. (norm u) |. u + +let cross (x,y,z) (x',y',z') = + ((y *. z' -. z *. y'), -. (x *. z' -. z *. x'), (x *. y' -. y *. x')) + +let rotation_matrix axis angle = + (* Euler-Rodrigues formula for rotation matrix, taken from + https://github.com/jevandezande/zmatrix/blob/master/converter.py + *) + let a = + (cos (angle *. to_radian *. 0.5)) + in + let (b, c, d) = + (-. sin (angle *. to_radian *. 0.5)) |. (normalized axis) + in + Array.of_list @@ + [(a *. a +. b *. b -. c *. c -. d *. d, + 2. *. (b *. c -. a *. d), + 2. *. (b *. d +. a *. c)); + (2. *. (b *. c +. a *. d), + a *. a +. c *. c -.b *. b -. d *. d, + 2. *. (c *. d -. a *. b)); + (2. *. (b *. d -. a *. c), + 2. *. (c *. d +. a *. b), + a *. a +. d *. d -. b *. b -. c *. c)] +(* + [(a *. a +. b *. b -. c *. c -. d *. d, + 2. *. (b *. c +. a *. d), + 2. *. (b *. d -. a *. c)); + (2. *. (b *. c -. a *. d), + a *. a +. c *. c -.b *. b -. d *. d, + 2. *. (c *. d +. a *. b)); + (2. *. (b *. d +. a *. c), + 2. *. (c *. d -. a *. b), + a *. a +. d *. d -. b *. b -. c *. c)] +*) + + + +let apply_rotation_matrix rot u = + (dot rot.(0) u, dot rot.(1) u, dot rot.(2) u) + +let center_of_mass l = +let (x,y,z) = + let sum_mass, com = + Array.fold_left (fun (s,com) (e,x,y,z) -> + let mass = + Positive_float.to_float @@ Element.mass e + in + (s +. mass, ( mass |. (x,y,z) ) |+ com) ) + (0., (0.,0.,0.)) l + in + (1. /. sum_mass) |. com +in +Printf.printf "%f %f %f\n" x y z ; (x,y,z) + +let to_xyz (z,map) = + let result = + Array.make (Array.length z) None + in + + let get_cartesian_coord i = + match result.(i-1) with + | None -> failwith @@ Printf.sprintf "Atom %d is defined in the future" i + | Some (_, x, y, z) -> (x, y, z) + in + + + let append_line i' = + match z.(i') with + | First e -> + result.(i') <- Some (e, 0., 0., 0.) + | Second (e, r) -> + let r = + float_of_distance map r + in + result.(i') <- Some (e, 0., 0., r) + | Third (e, i, r, j, a) -> + begin + let i, r, j, a = + int_of_atom_id i, + float_of_distance map r, + int_of_atom_id j, + float_of_angle map a + in + let ui, uj = + get_cartesian_coord i, + get_cartesian_coord j + in + let u_ij = + (uj |- ui) + in + let rot = + rotation_matrix (0., 1., 0.) a + in + let new_vec = + apply_rotation_matrix rot ( r |. (normalized u_ij)) + in + let (x, y, z) = + new_vec |+ ui + in + result.(i') <- Some (e, x, y, z) + end + | Other (e, i, r, j, a, k, d) -> + begin + let i, r, j, a, k, d = + int_of_atom_id i, + float_of_distance map r, + int_of_atom_id j, + float_of_angle map a, + int_of_atom_id k, + float_of_dihedral map d + in + let ui, uj, uk = + get_cartesian_coord i, + get_cartesian_coord j, + get_cartesian_coord k + in + let u_ij, u_kj = + (uj |- ui) , (uj |- uk) + in + let normal = + cross u_ij u_kj + in + let new_vec = + r |. (normalized u_ij) + |> apply_rotation_matrix (rotation_matrix normal a) + |> apply_rotation_matrix (rotation_matrix u_ij d) + in + let (x, y, z) = + new_vec |+ ui + in + result.(i') <- Some (e, x, y, z) + end + | Coord _ -> () + in + Array.iteri (fun i _ -> append_line i) z; + let result = + Array.map (function + | Some x -> x + | None -> failwith "Some atoms were not defined" ) result + in + result + + +let to_xyz_string (l,map) = + String.concat "\n" + ( to_xyz (l,map) + |> Array.map (fun (e,x,y,z) -> + Printf.sprintf "%s %f %f %f\n" (Element.to_string e) x y z) + |> Array.to_list ) + + + diff --git a/ocaml/_tags b/ocaml/_tags index 3f5cd9b6..0935c0bb 100644 --- a/ocaml/_tags +++ b/ocaml/_tags @@ -1,3 +1,3 @@ -true: package(core,cryptokit,ZMQ,sexplib.syntax) +true: package(core,cryptokit,ZMQ,sexplib.syntax,str) true: thread false: profile diff --git a/ocaml/qp_create_ezfio_from_xyz.ml b/ocaml/qp_create_ezfio_from_xyz.ml index 710523e4..c79bf550 100644 --- a/ocaml/qp_create_ezfio_from_xyz.ml +++ b/ocaml/qp_create_ezfio_from_xyz.ml @@ -19,7 +19,7 @@ let spec = ~doc:"string Name of the pseudopotential" +> flag "cart" no_arg ~doc:" Compute AOs in the Cartesian basis set (6d, 10f, ...)" - +> anon ("xyz_file" %: file ) + +> anon ("(xyz_file|zmt_file)" %: file ) (** Handle dummy atoms placed on bonds *) @@ -93,7 +93,7 @@ let run ?o b c d m p cart xyz_file = (* Read molecule *) let molecule = - (Molecule.of_xyz_file xyz_file ~charge:(Charge.of_int c) + (Molecule.of_file xyz_file ~charge:(Charge.of_int c) ~multiplicity:(Multiplicity.of_int m) ) in let dummy = @@ -309,7 +309,8 @@ let run ?o b c d m p cart xyz_file = | None -> begin match String.rsplit2 ~on:'.' xyz_file with - | Some (x,"xyz") -> x^".ezfio" + | Some (x,"xyz") + | Some (x,"zmt") -> x^".ezfio" | _ -> xyz_file^".ezfio" end in @@ -640,9 +641,10 @@ let command = ============================ -Creates an EZFIO directory from a standard xyz file. The basis set is defined -as a single string if all the atoms are taken from the same basis set, -otherwise specific elements can be defined as follows: +Creates an EZFIO directory from a standard xyz file or from a z-matrix file +in Gaussian format. The basis set is defined as a single string if all the +atoms are taken from the same basis set, otherwise specific elements can be +defined as follows: -b \"cc-pcvdz | H:cc-pvdz | C:6-31g\" diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index eda2d9b4..21cacaad 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -1730,15 +1730,19 @@ subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) do j=shortcut(sh2,1),endi org_j = sort_idx(j,1) - ext = exa - do ni=1,Nint + ext = exa + popcnt(xor(sorted_i(1), sorted(1,j,1))) + if(ext > 4) then + cycle + endif + do ni=2,Nint ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1))) end do - if(ext <= 4) then - call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) - vt (org_i) = vt (org_i) + hij*u_0(org_j) - vt (org_j) = vt (org_j) + hij*u_0(org_i) + if(ext > 4) then + cycle endif + call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) + vt (org_i) = vt (org_i) + hij*u_0(org_j) + vt (org_j) = vt (org_j) + hij*u_0(org_i) enddo enddo enddo diff --git a/src/Integrals_Bielec/ao_bi_integrals.irp.f b/src/Integrals_Bielec/ao_bi_integrals.irp.f index 1dcea81f..2ebb402e 100644 --- a/src/Integrals_Bielec/ao_bi_integrals.irp.f +++ b/src/Integrals_Bielec/ao_bi_integrals.irp.f @@ -1211,7 +1211,7 @@ subroutine compute_ao_integrals_jl(j,l,n_integrals,buffer_i,buffer_value) cycle endif !DIR$ FORCEINLINE - integral = ao_bielec_integral(i,k,j,l) + integral = ao_bielec_integral(i,k,j,l) ! i,k : r1 j,l : r2 if (abs(integral) < thr) then cycle endif From 84f8556d8dc895e4e5edb9eb173184a3066ab7ca Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 8 Sep 2016 22:42:16 +0200 Subject: [PATCH 095/216] Reverted davidson --- src/Determinants/slater_rules.irp.f | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index 21cacaad..eda2d9b4 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -1730,19 +1730,15 @@ subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) do j=shortcut(sh2,1),endi org_j = sort_idx(j,1) - ext = exa + popcnt(xor(sorted_i(1), sorted(1,j,1))) - if(ext > 4) then - cycle - endif - do ni=2,Nint + ext = exa + do ni=1,Nint ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1))) end do - if(ext > 4) then - cycle + if(ext <= 4) then + call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) + vt (org_i) = vt (org_i) + hij*u_0(org_j) + vt (org_j) = vt (org_j) + hij*u_0(org_i) endif - call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) - vt (org_i) = vt (org_i) + hij*u_0(org_j) - vt (org_j) = vt (org_j) + hij*u_0(org_i) enddo enddo enddo From c510c045815ff146a860dd6108f1983891a03218 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 9 Sep 2016 00:03:04 +0200 Subject: [PATCH 096/216] Bug in verification of Zmatrix corrected --- ocaml/Zmatrix.ml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ocaml/Zmatrix.ml b/ocaml/Zmatrix.ml index 294b1112..0aae3441 100644 --- a/ocaml/Zmatrix.ml +++ b/ocaml/Zmatrix.ml @@ -133,6 +133,7 @@ let of_string t = let l = match l with | First _ :: Second _ :: Third _ :: _ + | First _ :: Second _ :: Coord _ :: [] | First _ :: Second _ :: [] | First _ :: [] -> l | _ -> failwith "Syntax error" @@ -312,15 +313,14 @@ let to_xyz (z,map) = | Some x -> x | None -> failwith "Some atoms were not defined" ) result in - result + Array.to_list result let to_xyz_string (l,map) = String.concat "\n" ( to_xyz (l,map) - |> Array.map (fun (e,x,y,z) -> - Printf.sprintf "%s %f %f %f\n" (Element.to_string e) x y z) - |> Array.to_list ) + |> List.map (fun (e,x,y,z) -> + Printf.sprintf "%s %f %f %f\n" (Element.to_string e) x y z) ) From 5e7d914f4de5200bdd2b41a3f7bf167ebf01fb0c Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 9 Sep 2016 19:31:30 +0200 Subject: [PATCH 097/216] Added -q to qp_set_frozen_core --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 2 +- scripts/qp_set_frozen_core.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 892e0e4b..cf65270b 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -36,7 +36,7 @@ program fci_zmq 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) + do while ( (N_det < N_det_max) .and. (maxval(abs(pt2(1:N_st))) > pt2_max) ) n_det_before = N_det call ZMQ_selection(max(1024-N_det, N_det), pt2) diff --git a/scripts/qp_set_frozen_core.py b/scripts/qp_set_frozen_core.py index 3f95a9e6..2bfd89e5 100755 --- a/scripts/qp_set_frozen_core.py +++ b/scripts/qp_set_frozen_core.py @@ -19,9 +19,13 @@ for charge in ezfio.nuclei_nucl_charge: mo_tot_num = ezfio.mo_basis_mo_tot_num +if len(sys.argv)>2: + if sys.argv[2] == '-q': + print nb + sys.exit(0) + if nb == 0: os.system( """qp_set_mo_class -act "[1-%d]" %s"""%(mo_tot_num, sys.argv[1]) ) else: os.system( """qp_set_mo_class -core "[1-%d]" -act "[%d-%d]" %s"""%(nb, nb+1, mo_tot_num, sys.argv[1]) ) - From e77738198534887cdd0b7d520516ddc6b4d20ff9 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 9 Sep 2016 19:39:28 +0200 Subject: [PATCH 098/216] config/ifort.cfg --- config/ifort.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/ifort.cfg b/config/ifort.cfg index d3a5f7b6..b04506d4 100644 --- a/config/ifort.cfg +++ b/config/ifort.cfg @@ -18,7 +18,7 @@ IRPF90_FLAGS : --ninja --align=32 # 0 : Deactivate # [OPTION] -MODE : DEBUG ; [ OPT | PROFILE | DEBUG ] : Chooses the section below +MODE : OPT ; [ OPT | PROFILE | DEBUG ] : Chooses the section below CACHE : 1 ; Enable cache_compile.py OPENMP : 1 ; Append OpenMP flags @@ -32,7 +32,7 @@ OPENMP : 1 ; Append OpenMP flags # [OPT] FC : -traceback -FCFLAGS : -xSSE4.2 -O2 -ip -ftz -g +FCFLAGS : -xHost -O2 -ip -ftz -g # Profiling flags ################# From 2094dbaef4e22042a4e31deb6f58d52ae255bb7f Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 9 Sep 2016 19:41:17 +0200 Subject: [PATCH 099/216] block config/ifort.cfg --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9d9c4fdb..ccf29a14 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ quantum_package.rc +config/ifort.cfg quantum_package_static.tar.gz build.ninja .ninja_log From fac640e39cffdc2e08ce061bba73bf200a24bdd8 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 11 Sep 2016 22:42:05 +0200 Subject: [PATCH 100/216] Patched apply_hole for temporary recompilation --- plugins/MRCC_Utils/mrcc_utils.irp.f | 8 ++++---- plugins/mrcepa0/dressing.irp.f | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index e1a91bd6..60c6fd9e 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -694,9 +694,9 @@ END_PROVIDER allocate(lref(N_det_non_ref)) lref = 0 do II = 1, N_det_ref - call apply_hole(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) + call apply_hole_local(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) if(.not. ok) cycle - call apply_particle(myMask, pp_exists(1, pp), myDet, ok, N_int) + call apply_particle_local(myMask, pp_exists(1, pp), myDet, ok, N_int) if(.not. ok) cycle ind = searchDet(psi_non_ref_sorted(1,1,1), myDet(1,1), N_det_non_ref, N_int) if(ind /= -1) then @@ -1054,7 +1054,7 @@ integer function excCmp(exc1, exc2) end function -subroutine apply_hole(det, exc, res, ok, Nint) +subroutine apply_hole_local(det, exc, res, ok, Nint) use bitmasks implicit none integer, intent(in) :: Nint @@ -1089,7 +1089,7 @@ subroutine apply_hole(det, exc, res, ok, Nint) end subroutine -subroutine apply_particle(det, exc, res, ok, Nint) +subroutine apply_particle_local(det, exc, res, ok, Nint) use bitmasks implicit none integer, intent(in) :: Nint diff --git a/plugins/mrcepa0/dressing.irp.f b/plugins/mrcepa0/dressing.irp.f index 88cd2c85..8df7e91a 100644 --- a/plugins/mrcepa0/dressing.irp.f +++ b/plugins/mrcepa0/dressing.irp.f @@ -25,13 +25,13 @@ use bitmasks iproc = omp_get_thread_num() + 1 if(mod(gen, 1000) == 0) print *, "mrcc ", gen, "/", N_det_generators do h=1, hh_shortcut(0) - call apply_hole(psi_det_generators(1,1,gen), hh_exists(1, h), mask, ok, N_int) + call apply_hole_local(psi_det_generators(1,1,gen), hh_exists(1, h), mask, ok, N_int) if(.not. ok) cycle omask = 0_bit_kind if(hh_exists(1, h) /= 0) omask = mask n = 1 do p=hh_shortcut(h), hh_shortcut(h+1)-1 - call apply_particle(mask, pp_exists(1, p), buf(1,1,n), ok, N_int) + call apply_particle_local(mask, pp_exists(1, p), buf(1,1,n), ok, N_int) if(ok) n = n + 1 if(n > N_det_non_ref) stop "MRCC..." end do From c7d339bb10edfee9e12f3e678fc1c4fa5bcd78b7 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 11 Sep 2016 22:45:40 +0200 Subject: [PATCH 101/216] PT2 OK --- plugins/MRCC_Utils/mrcc_utils.irp.f | 4 ++-- plugins/mrcepa0/mrcepa0_general.irp.f | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index e1a91bd6..a379c44d 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -842,8 +842,8 @@ END_PROVIDER endif f = psi_non_ref_coef(i,s) / rho_mrcc(i,s) ! Avoid numerical instabilities - f = min(f, 10.d0) - f = max(f, -10.d0) + f = min(f,10.d0) + f = max(f,-10.d0) norm = norm + f*f *rho_mrcc(i,s)*rho_mrcc(i,s) rho_mrcc(i,s) = f enddo diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index 53a0822d..4d0c41c9 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -76,16 +76,16 @@ subroutine run_pt2(N_st,energy) threshold_generators = 0.999d0 - N_det_generators = lambda_mrcc_pt3(0) + N_det_ref - N_det_selectors = lambda_mrcc_pt3(0) + N_det_ref + N_det_generators = lambda_mrcc_pt3(0) + N_det_selectors = lambda_mrcc_pt3(0) - psi_det_generators(:,:,:N_det_ref) = psi_ref(:,:,:N_det_ref) - psi_selectors(:,:,:N_det_ref) = psi_ref(:,:,:N_det_ref) - psi_coef_generators(:N_det_ref,:) = psi_ref_coef(:N_det_ref,:) - psi_selectors_coef(:N_det_ref,:) = psi_ref_coef(:N_det_ref,:) +! psi_det_generators(:,:,:N_det_ref) = psi_ref(:,:,:N_det_ref) +! psi_selectors(:,:,:N_det_ref) = psi_ref(:,:,:N_det_ref) +! psi_coef_generators(:N_det_ref,:) = psi_ref_coef(:N_det_ref,:) +! psi_selectors_coef(:N_det_ref,:) = psi_ref_coef(:N_det_ref,:) - do i=N_det_ref+1,N_det_generators - j = lambda_mrcc_pt3(i-N_det_ref) + do i=1,N_det_generators + j = lambda_mrcc_pt3(i) do k=1,N_int psi_det_generators(k,1,i) = psi_non_ref(k,1,j) psi_det_generators(k,2,i) = psi_non_ref(k,2,j) @@ -133,9 +133,9 @@ subroutine run_pt2(N_st,energy) - print *, "2-3 :",pt2, pt3 + print *, "3-2 :",pt3, pt2 print *, lambda_mrcc_pt3(0), N_det, N_det_ref, psi_coef(1,1), psi_ref_coef(1,1) - pt2 = pt2 - pt3 + pt2 = pt3 - pt2 print *, 'Final step' print *, 'N_det = ', N_det From df72e480cafda0709760e1612f504cee1c94d973 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 13 Sep 2016 09:37:58 +0200 Subject: [PATCH 102/216] MRCC convergence --- plugins/MRCC_Utils/mrcc_utils.irp.f | 32 ++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 86da33ef..f00eab14 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -783,6 +783,9 @@ END_PROVIDER x(i) = AtB(i) enddo + double precision :: factor, resold + factor = 1.d0 + resold = huge(1.d0) do k=0,100000 !$OMP PARALLEL default(shared) private(cx, i, j, a_col) @@ -798,7 +801,7 @@ END_PROVIDER do i=col_shortcut(a_col), col_shortcut(a_col) + N_col(a_col) - 1 cx = cx + x(AtA_ind(i)) * AtA_val(i) end do - x_new(a_col) = AtB(a_col) + cx + x_new(a_col) = AtB(a_col) + cx * factor end do !$OMP END DO @@ -806,15 +809,24 @@ END_PROVIDER res = 0.d0 do a_col=1,nex - do j=1,N_det_non_ref - i = A_ind(j,a_col) - if (i==0) exit - rho_mrcc(i,s) = rho_mrcc(i,s) + A_val(j,a_col) * X_new(a_col) - enddo - res = res + (X_new(a_col) - X(a_col))**2 - X(a_col) = X_new(a_col) + res = res + (X_new(a_col) - X(a_col))*(X_new(a_col) - X(a_col)) end do + if (res < resold) then + do a_col=1,nex + do j=1,N_det_non_ref + i = A_ind(j,a_col) + if (i==0) exit + rho_mrcc(i,s) = rho_mrcc(i,s) + A_val(j,a_col) * X_new(a_col) + enddo + X(a_col) = X_new(a_col) + end do +! factor = 1.d0 + else + factor = -factor * 0.5d0 + endif + resold = res + if(mod(k, 100) == 0) then print *, "res", k, res end if @@ -842,8 +854,8 @@ END_PROVIDER endif f = psi_non_ref_coef(i,s) / rho_mrcc(i,s) ! Avoid numerical instabilities - f = min(f,10.d0) - f = max(f,-10.d0) + f = min(f,2.d0) + f = max(f,-2.d0) norm = norm + f*f *rho_mrcc(i,s)*rho_mrcc(i,s) rho_mrcc(i,s) = f enddo From 243f46cbcae25e0b2b8aab18db629a0cf4740e78 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 13 Sep 2016 15:36:36 +0200 Subject: [PATCH 103/216] Don't mix same spin symmetry with s2eig --- src/Determinants/davidson.irp.f | 8 ++++---- src/Determinants/s2.irp.f | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Determinants/davidson.irp.f b/src/Determinants/davidson.irp.f index 5bc3768e..dbf437a1 100644 --- a/src/Determinants/davidson.irp.f +++ b/src/Determinants/davidson.irp.f @@ -457,7 +457,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun ! ---------------------- do k=1,N_st - call H_u_0(W(1,k,iter),U(1,k,iter),H_jj,sze,dets_in,Nint) + call H_u_0(W(1,k,iter),U(1,k,iter),H_jj,sze,dets_in,Nint) enddo @@ -530,7 +530,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun !$OMP END PARALLEL write(iunit,'(X,I3,X,100(X,F16.10,X,E16.6))') iter, to_print(:,1:N_st) - call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_states,converged) + call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_states_diag,converged) if (converged) then exit endif @@ -554,14 +554,14 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun do l=1,N_st c = u_dot_v(U(1,k,iter+1),U(1,l,iter2),sze) do i=1,sze - U(i,k,iter+1) -= c * U(i,l,iter2) + U(i,k,iter+1) = U(i,k,iter+1) - c * U(i,l,iter2) enddo enddo enddo do l=1,k-1 c = u_dot_v(U(1,k,iter+1),U(1,l,iter+1),sze) do i=1,sze - U(i,k,iter+1) -= c * U(i,l,iter+1) + U(i,k,iter+1) = U(i,k,iter+1) - c * U(i,l,iter+1) enddo enddo call normalize( U(1,k,iter+1), sze ) diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index 96e342cd..d34aad88 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -348,7 +348,8 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nma accu_precision_of_diag = 0.d0 do i = 1, nstates do j = i+1, nstates - if( ( dabs(s2(i,i) - s2(j,j)) .le.1.d-10 ) .and. (dabs(s2(i,j) + dabs(s2(i,j)))) .le.1.d-10) then + ! Do not combine states of the same spin symmetry + if( dabs(s2(i,i) - s2(j,j)) .le.0.5d0) then s2(i,j) = 0.d0 s2(j,i) = 0.d0 endif @@ -356,13 +357,14 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nma enddo do i = 1, nstates write(*,'(10(F10.6,X))')s2(i,:) + s2(i,i) = s2(i,i) enddo print*,'Diagonalizing the S^2 matrix' allocate(eigvalues(nstates),eigvectors(nstates,nstates)) call lapack_diagd(eigvalues,eigvectors,s2,nstates,nstates) - print*,'Eigenvalues of s^2' + print*,'Shifted Eigenvalues of s^2' do i = 1, nstates print*,'s2 = ',eigvalues(i) s2_eigvalues(i) = eigvalues(i) From 76f40872278499771a1b41ee9dfde4ad5c323460 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 15 Sep 2016 14:31:34 +0200 Subject: [PATCH 104/216] Print S2 in MRCC --- plugins/MRCC_Utils/mrcc_utils.irp.f | 2 ++ src/Determinants/s2.irp.f | 52 +++++++++++++++-------------- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index f00eab14..2b51368d 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -298,6 +298,8 @@ BEGIN_PROVIDER [ double precision, CI_energy_dressed, (N_states_diag) ] call write_time(output_determinants) do j=1,N_states_diag CI_energy_dressed(j) = CI_electronic_energy_dressed(j) + nuclear_repulsion + call write_double(output_determinants,CI_energy(j),'Energy of state '//trim(st)) + call write_double(output_determinants,CI_eigenvectors_s2(j),'S^2 of state '//trim(st)) enddo END_PROVIDER diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index d34aad88..2e2741b6 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -314,12 +314,7 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nma enddo enddo !$OMP END PARALLEL DO - print*,'Overlap matrix in the basis of the states considered' - do i = 1, nstates - write(*,'(10(F16.10,X))')overlap(i,:) - enddo call ortho_lowdin(overlap,size(overlap,1),nstates,psi_coefs_inout,size(psi_coefs_inout,1),n) - print*,'passed ortho' !$OMP PARALLEL DO COLLAPSE(2) DEFAULT(NONE) SCHEDULE(dynamic) & !$OMP PRIVATE(i,j) SHARED(overlap,psi_coefs_inout,nstates,n) @@ -336,41 +331,49 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nma enddo enddo !$OMP END PARALLEL DO - print*,'Overlap matrix in the basis of the Lowdin orthonormalized states ' - do i = 1, nstates - write(*,'(10(F16.10,X))')overlap(i,:) - enddo call get_uJ_s2_uI(keys_tmp,psi_coefs_inout,n_det,size(psi_coefs_inout,1),size(keys_tmp,3),s2,nstates) print*,'S^2 matrix in the basis of the states considered' - double precision :: accu_precision_diag,accu_precision_of_diag - accu_precision_diag = 0.d0 - accu_precision_of_diag = 0.d0 - do i = 1, nstates - do j = i+1, nstates - ! Do not combine states of the same spin symmetry - if( dabs(s2(i,i) - s2(j,j)) .le.0.5d0) then - s2(i,j) = 0.d0 - s2(j,i) = 0.d0 - endif - enddo - enddo do i = 1, nstates write(*,'(10(F10.6,X))')s2(i,:) s2(i,i) = s2(i,i) enddo - print*,'Diagonalizing the S^2 matrix' + double precision :: accu_precision_diag,accu_precision_of_diag + accu_precision_diag = 0.d0 + accu_precision_of_diag = 0.d0 + do i = 1, nstates + ! Do not combine states of the same spin symmetry + do j = i+1, nstates + if( dabs(s2(i,i) - s2(j,j)) .le.0.5d0) then + s2(i,j) = 0.d0 + s2(j,i) = 0.d0 + endif + enddo + ! Do not rotate if the diagonal is correct + if( dabs(s2(i,i) - expected_s2).le.5.d-3) then + do j = 1, nstates + if (j==i) cycle + s2(i,j) = 0.d0 + s2(j,i) = 0.d0 + enddo + endif + enddo + + print*,'Modified S^2 matrix that will be diagonalized' + do i = 1, nstates + write(*,'(10(F10.6,X))')s2(i,:) + s2(i,i) = s2(i,i) + enddo allocate(eigvalues(nstates),eigvectors(nstates,nstates)) call lapack_diagd(eigvalues,eigvectors,s2,nstates,nstates) - print*,'Shifted Eigenvalues of s^2' + print*,'Eigenvalues' do i = 1, nstates print*,'s2 = ',eigvalues(i) s2_eigvalues(i) = eigvalues(i) enddo - print*,'Building the eigenvectors of the S^2 matrix' allocate(psi_coefs_tmp(nmax_coefs,nstates)) psi_coefs_tmp = 0.d0 do j = 1, nstates @@ -386,7 +389,6 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nma do i = 1, n_det accu += psi_coefs_tmp(i,j) * psi_coefs_tmp(i,j) enddo - print*,'Norm of vector = ',accu accu = 1.d0/dsqrt(accu) do i = 1, n_det psi_coefs_inout(i,j) = psi_coefs_tmp(i,j) * accu From 9ddb60fd2e7dbd7debb975f18614cb898a247f6a Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 15 Sep 2016 16:11:34 +0200 Subject: [PATCH 105/216] Removed diagonalize_s2 --- plugins/MRCC_Utils/mrcc_utils.irp.f | 149 +++++++++++-------------- src/Determinants/EZFIO.cfg | 6 - src/Determinants/diagonalize_CI.irp.f | 155 +++++++++++--------------- 3 files changed, 131 insertions(+), 179 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 2b51368d..336b5596 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -167,7 +167,7 @@ END_PROVIDER if (s2_eig) then do j=1,N_det call get_s2_u0(psi_det,eigenvectors(1,j),N_det,N_det,s2) - if(dabs(s2-expected_s2).le.0.3d0)then + if(dabs(s2-expected_s2).le.0.5d0)then i_state += 1 do i=1,N_det CI_eigenvectors_dressed(i,i_state) = eigenvectors(i,j) @@ -193,95 +193,73 @@ END_PROVIDER deallocate(eigenvectors,eigenvalues) endif - if(diagonalize_s2.and.n_states_diag > 1.and. n_det >= n_states_diag)then - ! Diagonalizing S^2 within the "n_states_diag" states found - allocate(s2_eigvalues(N_states_diag)) - call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors_dressed,n_det,size(psi_det,3),size(CI_eigenvectors_dressed,1),min(n_states_diag,n_det),s2_eigvalues) + if(s2_eig.and.n_states_diag > 1.and. n_det >= n_states_diag)then + ! Diagonalizing S^2 within the "n_states_diag" states found + allocate(s2_eigvalues(N_states_diag)) + call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors_dressed,n_det,size(psi_det,3),size(CI_eigenvectors_dressed,1),min(n_states_diag,n_det),s2_eigvalues) - do j = 1, N_states_diag - do i = 1, N_det - psi_coef(i,j) = CI_eigenvectors_dressed(i,j) - enddo - enddo + do j = 1, N_states_diag + do i = 1, N_det + psi_coef(i,j) = CI_eigenvectors_dressed(i,j) + enddo + enddo - if(s2_eig)then + ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value + ! closer to the "expected_s2" set as input - ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value - ! closer to the "expected_s2" set as input + allocate(index_good_state_array(N_det),good_state_array(N_det)) + good_state_array = .False. + i_state = 0 + do j = 1, N_states_diag + if(dabs(s2_eigvalues(j)-expected_s2).le.0.5d0)then + good_state_array(j) = .True. + i_state +=1 + index_good_state_array(i_state) = j + endif + enddo + ! Sorting the i_state good states by energy + allocate(e_array(i_state),iorder(i_state)) + do j = 1, i_state + do i = 1, N_det + CI_eigenvectors_dressed(i,j) = psi_coef(i,index_good_state_array(j)) + enddo + CI_eigenvectors_s2_dressed(j) = s2_eigvalues(index_good_state_array(j)) + call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,j),n_det,psi_det,N_int,mrcc_state) + CI_electronic_energy_dressed(j) = e_0 + e_array(j) = e_0 + iorder(j) = j + enddo + call dsort(e_array,iorder,i_state) + do j = 1, i_state + CI_electronic_energy_dressed(j) = e_array(j) + CI_eigenvectors_s2_dressed(j) = s2_eigvalues(index_good_state_array(iorder(j))) + do i = 1, N_det + CI_eigenvectors_dressed(i,j) = psi_coef(i,index_good_state_array(iorder(j))) + enddo + ! call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,j),n_det,psi_det,N_int,mrcc_state) + ! print*,'e = ',CI_electronic_energy_dressed(j) + ! print*,' = ',e_0 + ! call get_s2_u0(psi_det,CI_eigenvectors_dressed(1,j),N_det,size(CI_eigenvectors_dressed,1),s2) + ! print*,'s^2 = ',CI_eigenvectors_s2_dressed(j) + ! print*,'= ',s2 + enddo + deallocate(e_array,iorder) - allocate(index_good_state_array(N_det),good_state_array(N_det)) - good_state_array = .False. - i_state = 0 - do j = 1, N_states_diag - if(dabs(s2_eigvalues(j)-expected_s2).le.0.3d0)then - good_state_array(j) = .True. - i_state +=1 - index_good_state_array(i_state) = j - endif - enddo - ! Sorting the i_state good states by energy - allocate(e_array(i_state),iorder(i_state)) - do j = 1, i_state - do i = 1, N_det - CI_eigenvectors_dressed(i,j) = psi_coef(i,index_good_state_array(j)) - enddo - CI_eigenvectors_s2_dressed(j) = s2_eigvalues(index_good_state_array(j)) - call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,j),n_det,psi_det,N_int,mrcc_state) - CI_electronic_energy_dressed(j) = e_0 - e_array(j) = e_0 - iorder(j) = j - enddo - call dsort(e_array,iorder,i_state) - do j = 1, i_state - CI_electronic_energy_dressed(j) = e_array(j) - CI_eigenvectors_s2_dressed(j) = s2_eigvalues(index_good_state_array(iorder(j))) - do i = 1, N_det - CI_eigenvectors_dressed(i,j) = psi_coef(i,index_good_state_array(iorder(j))) - enddo - ! call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,j),n_det,psi_det,N_int,mrcc_state) - ! print*,'e = ',CI_electronic_energy_dressed(j) - ! print*,' = ',e_0 - ! call get_s2_u0(psi_det,CI_eigenvectors_dressed(1,j),N_det,size(CI_eigenvectors_dressed,1),s2) - ! print*,'s^2 = ',CI_eigenvectors_s2_dressed(j) - ! print*,'= ',s2 - enddo - deallocate(e_array,iorder) + ! Then setting the other states without any specific energy order + i_other_state = 0 + do j = 1, N_states_diag + if(good_state_array(j))cycle + i_other_state +=1 + do i = 1, N_det + CI_eigenvectors_dressed(i,i_state + i_other_state) = psi_coef(i,j) + enddo + CI_eigenvectors_s2_dressed(i_state + i_other_state) = s2_eigvalues(j) + call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,i_state + i_other_state),n_det,psi_det,N_int,mrcc_state) + CI_electronic_energy_dressed(i_state + i_other_state) = e_0 + enddo + deallocate(index_good_state_array,good_state_array) - ! Then setting the other states without any specific energy order - i_other_state = 0 - do j = 1, N_states_diag - if(good_state_array(j))cycle - i_other_state +=1 - do i = 1, N_det - CI_eigenvectors_dressed(i,i_state + i_other_state) = psi_coef(i,j) - enddo - CI_eigenvectors_s2_dressed(i_state + i_other_state) = s2_eigvalues(j) - call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,i_state + i_other_state),n_det,psi_det,N_int,mrcc_state) - CI_electronic_energy_dressed(i_state + i_other_state) = e_0 - enddo - deallocate(index_good_state_array,good_state_array) - - else - - ! Sorting the N_states_diag by energy, whatever the S^2 value is - - allocate(e_array(n_states_diag),iorder(n_states_diag)) - do j = 1, N_states_diag - call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,j),n_det,psi_det,N_int,mrcc_state) - e_array(j) = e_0 - iorder(j) = j - enddo - call dsort(e_array,iorder,n_states_diag) - do j = 1, N_states_diag - CI_electronic_energy_dressed(j) = e_array(j) - do i = 1, N_det - CI_eigenvectors_dressed(i,j) = psi_coef(i,iorder(j)) - enddo - CI_eigenvectors_s2_dressed(j) = s2_eigvalues(iorder(j)) - enddo - deallocate(e_array,iorder) - endif - deallocate(s2_eigvalues) + deallocate(s2_eigvalues) endif @@ -297,6 +275,7 @@ BEGIN_PROVIDER [ double precision, CI_energy_dressed, (N_states_diag) ] character*(8) :: st call write_time(output_determinants) do j=1,N_states_diag + write(st,'(I4)') j CI_energy_dressed(j) = CI_electronic_energy_dressed(j) + nuclear_repulsion call write_double(output_determinants,CI_energy(j),'Energy of state '//trim(st)) call write_double(output_determinants,CI_eigenvectors_s2(j),'S^2 of state '//trim(st)) diff --git a/src/Determinants/EZFIO.cfg b/src/Determinants/EZFIO.cfg index b1c459ba..4ab84b7a 100644 --- a/src/Determinants/EZFIO.cfg +++ b/src/Determinants/EZFIO.cfg @@ -40,12 +40,6 @@ doc: Force the wave function to be an eigenfunction of S^2 interface: ezfio,provider,ocaml default: False -[diagonalize_s2] -type: logical -doc: Diagonalize the S^2 operator within the n_states_diag states required. Notice : the vectors are sorted by increasing S^2 values. -interface: ezfio,provider,ocaml -default: True - [threshold_davidson] type: Threshold doc: Thresholds of Davidson's algorithm diff --git a/src/Determinants/diagonalize_CI.irp.f b/src/Determinants/diagonalize_CI.irp.f index d4716b86..479c91a9 100644 --- a/src/Determinants/diagonalize_CI.irp.f +++ b/src/Determinants/diagonalize_CI.irp.f @@ -92,7 +92,7 @@ END_PROVIDER call get_s2_u0(psi_det,eigenvectors(1,j),N_det,size(eigenvectors,1),s2) s2_eigvalues(j) = s2 ! Select at least n_states states with S^2 values closed to "expected_s2" - if(dabs(s2-expected_s2).le.0.3d0)then + if(dabs(s2-expected_s2).le.0.5d0)then i_state +=1 index_good_state_array(i_state) = j good_state_array(j) = .True. @@ -133,7 +133,7 @@ END_PROVIDER print*,' We did not find any state with S^2 values close to ',expected_s2 print*,' We will then set the first N_states eigenvectors of the H matrix' print*,' as the CI_eigenvectors' - print*,' You should consider more states and maybe ask for diagonalize_s2 to be .True. or just enlarge the CI space' + print*,' You should consider more states and maybe ask for s2_eig to be .True. or just enlarge the CI space' print*,'' do j=1,min(N_states_diag,N_det) do i=1,N_det @@ -159,94 +159,73 @@ END_PROVIDER deallocate(eigenvectors,eigenvalues) endif - if(diagonalize_s2.and.n_states_diag > 1.and. n_det >= n_states_diag)then - ! Diagonalizing S^2 within the "n_states_diag" states found - allocate(s2_eigvalues(N_states_diag)) - call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors,n_det,size(psi_det,3),size(CI_eigenvectors,1),min(n_states_diag,n_det),s2_eigvalues) + + if( s2_eig.and.(n_states_diag > 1).and.(n_det >= n_states_diag) )then + ! Diagonalizing S^2 within the "n_states_diag" states found + allocate(s2_eigvalues(N_states_diag)) + call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors,n_det,size(psi_det,3),size(CI_eigenvectors,1),min(n_states_diag,n_det),s2_eigvalues) + + do j = 1, N_states_diag + do i = 1, N_det + psi_coef(i,j) = CI_eigenvectors(i,j) + enddo + enddo - do j = 1, N_states_diag - do i = 1, N_det - psi_coef(i,j) = CI_eigenvectors(i,j) - enddo - enddo - - if(s2_eig)then + ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value + ! closer to the "expected_s2" set as input + + allocate(index_good_state_array(N_det),good_state_array(N_det)) + good_state_array = .False. + i_state = 0 + do j = 1, N_states_diag + if(dabs(s2_eigvalues(j)-expected_s2).le.0.5d0)then + good_state_array(j) = .True. + i_state +=1 + index_good_state_array(i_state) = j + endif + enddo + ! Sorting the i_state good states by energy + allocate(e_array(i_state),iorder(i_state)) + do j = 1, i_state + do i = 1, N_det + CI_eigenvectors(i,j) = psi_coef(i,index_good_state_array(j)) + enddo + CI_eigenvectors_s2(j) = s2_eigvalues(index_good_state_array(j)) + call u0_H_u_0(e_0,CI_eigenvectors(1,j),n_det,psi_det,N_int) + CI_electronic_energy(j) = e_0 + e_array(j) = e_0 + iorder(j) = j + enddo + call dsort(e_array,iorder,i_state) + do j = 1, i_state + CI_electronic_energy(j) = e_array(j) + CI_eigenvectors_s2(j) = s2_eigvalues(index_good_state_array(iorder(j))) + do i = 1, N_det + CI_eigenvectors(i,j) = psi_coef(i,index_good_state_array(iorder(j))) + enddo + ! call u0_H_u_0(e_0,CI_eigenvectors(1,j),n_det,psi_det,N_int) + ! print*,'e = ',CI_electronic_energy(j) + ! print*,' = ',e_0 + ! call get_s2_u0(psi_det,CI_eigenvectors(1,j),N_det,size(CI_eigenvectors,1),s2) + ! print*,'s^2 = ',CI_eigenvectors_s2(j) + ! print*,'= ',s2 + enddo + deallocate(e_array,iorder) + + ! Then setting the other states without any specific energy order + i_other_state = 0 + do j = 1, N_states_diag + if(good_state_array(j))cycle + i_other_state +=1 + do i = 1, N_det + CI_eigenvectors(i,i_state + i_other_state) = psi_coef(i,j) + enddo + CI_eigenvectors_s2(i_state + i_other_state) = s2_eigvalues(j) + call u0_H_u_0(e_0,CI_eigenvectors(1,i_state + i_other_state),n_det,psi_det,N_int) + CI_electronic_energy(i_state + i_other_state) = e_0 + enddo + deallocate(index_good_state_array,good_state_array) - ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value - ! closer to the "expected_s2" set as input - - allocate(index_good_state_array(N_det),good_state_array(N_det)) - good_state_array = .False. - i_state = 0 - do j = 1, N_states_diag - if(dabs(s2_eigvalues(j)-expected_s2).le.0.3d0)then - good_state_array(j) = .True. - i_state +=1 - index_good_state_array(i_state) = j - endif - enddo - ! Sorting the i_state good states by energy - allocate(e_array(i_state),iorder(i_state)) - do j = 1, i_state - do i = 1, N_det - CI_eigenvectors(i,j) = psi_coef(i,index_good_state_array(j)) - enddo - CI_eigenvectors_s2(j) = s2_eigvalues(index_good_state_array(j)) - call u0_H_u_0(e_0,CI_eigenvectors(1,j),n_det,psi_det,N_int) - CI_electronic_energy(j) = e_0 - e_array(j) = e_0 - iorder(j) = j - enddo - call dsort(e_array,iorder,i_state) - do j = 1, i_state - CI_electronic_energy(j) = e_array(j) - CI_eigenvectors_s2(j) = s2_eigvalues(index_good_state_array(iorder(j))) - do i = 1, N_det - CI_eigenvectors(i,j) = psi_coef(i,index_good_state_array(iorder(j))) - enddo - ! call u0_H_u_0(e_0,CI_eigenvectors(1,j),n_det,psi_det,N_int) - ! print*,'e = ',CI_electronic_energy(j) - ! print*,' = ',e_0 - ! call get_s2_u0(psi_det,CI_eigenvectors(1,j),N_det,size(CI_eigenvectors,1),s2) - ! print*,'s^2 = ',CI_eigenvectors_s2(j) - ! print*,'= ',s2 - enddo - deallocate(e_array,iorder) - - ! Then setting the other states without any specific energy order - i_other_state = 0 - do j = 1, N_states_diag - if(good_state_array(j))cycle - i_other_state +=1 - do i = 1, N_det - CI_eigenvectors(i,i_state + i_other_state) = psi_coef(i,j) - enddo - CI_eigenvectors_s2(i_state + i_other_state) = s2_eigvalues(j) - call u0_H_u_0(e_0,CI_eigenvectors(1,i_state + i_other_state),n_det,psi_det,N_int) - CI_electronic_energy(i_state + i_other_state) = e_0 - enddo - deallocate(index_good_state_array,good_state_array) - - else - - ! Sorting the N_states_diag by energy, whatever the S^2 value is - - allocate(e_array(n_states_diag),iorder(n_states_diag)) - do j = 1, N_states_diag - call u0_H_u_0(e_0,CI_eigenvectors(1,j),n_det,psi_det,N_int) - e_array(j) = e_0 - iorder(j) = j - enddo - call dsort(e_array,iorder,n_states_diag) - do j = 1, N_states_diag - CI_electronic_energy(j) = e_array(j) - do i = 1, N_det - CI_eigenvectors(i,j) = psi_coef(i,iorder(j)) - enddo - CI_eigenvectors_s2(j) = s2_eigvalues(iorder(j)) - enddo - deallocate(e_array,iorder) - endif deallocate(s2_eigvalues) endif From 77b5e9968753b0b340ee563ed7ae7cdcd703f250 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 15 Sep 2016 22:01:46 +0200 Subject: [PATCH 106/216] Corrected memory access in MRCC --- plugins/MRCC_Utils/mrcc_utils.irp.f | 20 ++++++++++++-------- src/Determinants/diagonalize_CI.irp.f | 2 +- src/Determinants/s2.irp.f | 1 - 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 336b5596..b8ed005d 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -274,11 +274,11 @@ BEGIN_PROVIDER [ double precision, CI_energy_dressed, (N_states_diag) ] integer :: j character*(8) :: st call write_time(output_determinants) - do j=1,N_states_diag + do j=1,min(N_det,N_states_diag) write(st,'(I4)') j CI_energy_dressed(j) = CI_electronic_energy_dressed(j) + nuclear_repulsion - call write_double(output_determinants,CI_energy(j),'Energy of state '//trim(st)) - call write_double(output_determinants,CI_eigenvectors_s2(j),'S^2 of state '//trim(st)) + call write_double(output_determinants,CI_energy_dressed(j),'Energy of state '//trim(st)) + call write_double(output_determinants,CI_eigenvectors_s2_dressed(j),'S^2 of state '//trim(st)) enddo END_PROVIDER @@ -346,7 +346,9 @@ logical function is_generable(det1, det2, Nint) else tmp_array = (/s2, p2, s1, p1/) end if - f = searchExc(pp_exists(1,hh_shortcut(f)), tmp_array, hh_shortcut(f+1)-hh_shortcut(f)) + if (f /= -1) then + f = searchExc(pp_exists(1,hh_shortcut(f)), tmp_array, hh_shortcut(f+1)-hh_shortcut(f)) + endif is_generable = (f /= -1) end function @@ -667,12 +669,13 @@ END_PROVIDER N_col = 0 col_shortcut = 0 - !$OMP PARALLEL DO schedule(static,10) default(none) shared(psi_non_ref, hh_exists, pp_exists, N_int, A_val, A_ind)& + !$OMP PARALLEL default(none) shared(psi_non_ref, hh_exists, pp_exists, N_int, A_val, A_ind)& !$OMP shared(s, hh_shortcut, psi_ref_coef, N_det_non_ref, psi_non_ref_sorted, psi_non_ref_sorted_idx, psi_ref, N_det_ref)& !$OMP private(lref, pp, II, ok, myMask, myDet, ind, phase, wk) + allocate(lref(N_det_non_ref)) + !$OMP DO schedule(static,10) do hh = 1, hh_shortcut(0) do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 - allocate(lref(N_det_non_ref)) lref = 0 do II = 1, N_det_ref call apply_hole_local(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) @@ -701,10 +704,11 @@ END_PROVIDER A_ind(wk, pp) = i end if end do - deallocate(lref) end do end do - !$OMP END PARALLEL DO + !$OMP END DO + deallocate(lref) + !$OMP END PARALLEL AtB = 0d0 AtA_size = 0 diff --git a/src/Determinants/diagonalize_CI.irp.f b/src/Determinants/diagonalize_CI.irp.f index 479c91a9..54233fe4 100644 --- a/src/Determinants/diagonalize_CI.irp.f +++ b/src/Determinants/diagonalize_CI.irp.f @@ -24,7 +24,7 @@ BEGIN_PROVIDER [ double precision, CI_energy, (N_states_diag) ] integer :: j character*(8) :: st call write_time(output_determinants) - do j=1,N_states_diag + do j=1,min(N_det,N_states_diag) CI_energy(j) = CI_electronic_energy(j) + nuclear_repulsion write(st,'(I4)') j call write_double(output_determinants,CI_energy(j),'Energy of state '//trim(st)) diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index 2e2741b6..569392ac 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -59,7 +59,6 @@ BEGIN_PROVIDER [ double precision, expected_s2] double precision :: S S = (elec_alpha_num-elec_beta_num)*0.5d0 expected_s2 = S * (S+1.d0) -! expected_s2 = elec_alpha_num - elec_beta_num + 0.5d0 * ((elec_alpha_num - elec_beta_num)**2*0.5d0 - (elec_alpha_num-elec_beta_num)) endif END_PROVIDER From a583b543082ecf758e745dcfb627b494f1dca975 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 16 Sep 2016 18:57:15 +0200 Subject: [PATCH 107/216] Accelerated Davidson for multiple states --- src/Determinants/davidson.irp.f | 4 +- src/Determinants/slater_rules.irp.f | 79 ++++++++++++++++++++++------- 2 files changed, 62 insertions(+), 21 deletions(-) diff --git a/src/Determinants/davidson.irp.f b/src/Determinants/davidson.irp.f index dbf437a1..b751bcbc 100644 --- a/src/Determinants/davidson.irp.f +++ b/src/Determinants/davidson.irp.f @@ -456,9 +456,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun ! Compute W_k = H |u_k> ! ---------------------- - do k=1,N_st - call H_u_0(W(1,k,iter),U(1,k,iter),H_jj,sze,dets_in,Nint) - enddo + call H_u_0_nstates(W(1,1,iter),U(1,1,iter),H_jj,sze,dets_in,Nint,N_st,sze_8) ! Compute h_kl = = diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index d960445f..8ef69ce4 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -1647,17 +1647,35 @@ subroutine u0_H_u_0(e_0,u_0,n,keys_tmp,Nint) double precision, intent(out) :: e_0 double precision, intent(in) :: u_0(n) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + call u0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,1,n) +end + +subroutine u0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) + use bitmasks + implicit none + BEGIN_DOC + ! Computes e_0 = / + ! + ! n : number of determinants + ! + END_DOC + integer, intent(in) :: n,Nint, N_st, sze_8 + double precision, intent(out) :: e_0(N_st) + double precision, intent(in) :: u_0(sze_8,N_st) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - double precision :: H_jj(n) - double precision :: v_0(n) + double precision, allocatable :: H_jj(:), v_0(:,:) double precision :: u_dot_u,u_dot_v,diag_H_mat_elem integer :: i,j + allocate (H_jj(n), v_0(sze_8,N_st)) do i = 1, n H_jj(i) = diag_H_mat_elem(keys_tmp(1,1,i),Nint) enddo - call H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) - e_0 = u_dot_v(v_0,u_0,n)/u_dot_u(u_0,n) + call H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) + do i=1,N_st + e_0(i) = u_dot_v(v_0(1,i),u_0(1,i),n)/u_dot_u(u_0(1,i),n) + enddo end @@ -1676,9 +1694,26 @@ subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) double precision, intent(in) :: u_0(n) double precision, intent(in) :: H_jj(n) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - integer, allocatable :: idx(:) + call H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,1,n) +end + +subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) + use bitmasks + implicit none + BEGIN_DOC + ! Computes v_0 = H|u_0> + ! + ! n : number of determinants + ! + ! H_jj : array of + END_DOC + integer, intent(in) :: N_st,n,Nint, sze_8 + double precision, intent(out) :: v_0(sze_8,N_st) + double precision, intent(in) :: u_0(sze_8,N_st) + double precision, intent(in) :: H_jj(n) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) double precision :: hij - double precision, allocatable :: vt(:) + double precision, allocatable :: vt(:,:) integer :: i,j,k,l, jj,ii integer :: i0, j0 @@ -1686,7 +1721,7 @@ subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) integer(bit_kind), allocatable :: sorted(:,:,:), version(:,:,:) integer(bit_kind) :: sorted_i(Nint) - integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi + integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi, istate ASSERT (Nint > 0) @@ -1701,9 +1736,9 @@ subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(i,hij,j,k,jj,vt,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i)& - !$OMP SHARED(n,H_jj,u_0,keys_tmp,Nint,v_0,sorted,shortcut,sort_idx,version) - allocate(vt(n)) + !$OMP PRIVATE(i,hij,j,k,jj,vt,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& + !$OMP SHARED(n,H_jj,u_0,keys_tmp,Nint,v_0,sorted,shortcut,sort_idx,version,N_st,sze_8) + allocate(vt(sze_8,N_st)) Vt = 0.d0 !$OMP DO SCHEDULE(dynamic) @@ -1736,8 +1771,10 @@ subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) end do if(ext <= 4) then call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) - vt (org_i) = vt (org_i) + hij*u_0(org_j) - vt (org_j) = vt (org_j) + hij*u_0(org_i) + do istate=1,N_st + vt (org_i,istate) = vt (org_i,istate) + hij*u_0(org_j,istate) + vt (org_j,istate) = vt (org_j,istate) + hij*u_0(org_i,istate) + enddo endif enddo enddo @@ -1757,8 +1794,10 @@ subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) end do if(ext == 4) then call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) - vt (org_i) = vt (org_i) + hij*u_0(org_j) - vt (org_j) = vt (org_j) + hij*u_0(org_i) + do istate=1,N_st + vt (org_i,istate) = vt (org_i,istate) + hij*u_0(org_j,istate) + vt (org_j,istate) = vt (org_j,istate) + hij*u_0(org_i,istate) + enddo end if end do end do @@ -1766,16 +1805,20 @@ subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) !$OMP END DO NOWAIT !$OMP CRITICAL - do i=n,1,-1 - v_0(i) = v_0(i) + vt(i) + do istate=1,N_st + do i=n,1,-1 + v_0(i,istate) = v_0(i,istate) + vt(i,istate) + enddo enddo !$OMP END CRITICAL deallocate(vt) !$OMP END PARALLEL - do i=1,n - v_0(i) += H_jj(i) * u_0(i) + do istate=1,N_st + do i=1,n + v_0(i,istate) += H_jj(i) * u_0(i,istate) + enddo enddo deallocate (shortcut, sort_idx, sorted, version) end From 89be407d7e0d6d2f32967c80e61270532cc8d471 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 16 Sep 2016 23:00:13 +0200 Subject: [PATCH 108/216] Accelerated s2 --- src/Determinants/diagonalize_CI.irp.f | 42 +++--- src/Determinants/s2.irp.f | 177 +++++++++++++++++++++----- 2 files changed, 160 insertions(+), 59 deletions(-) diff --git a/src/Determinants/diagonalize_CI.irp.f b/src/Determinants/diagonalize_CI.irp.f index 54233fe4..2a071f83 100644 --- a/src/Determinants/diagonalize_CI.irp.f +++ b/src/Determinants/diagonalize_CI.irp.f @@ -48,7 +48,7 @@ END_PROVIDER integer :: i_other_state double precision, allocatable :: eigenvectors(:,:), eigenvalues(:) integer :: i_state - double precision :: s2,e_0 + double precision :: e_0 integer :: i,j,k double precision, allocatable :: s2_eigvalues(:) double precision, allocatable :: e_array(:) @@ -71,9 +71,9 @@ END_PROVIDER call davidson_diag(psi_det,CI_eigenvectors,CI_electronic_energy,& size(CI_eigenvectors,1),N_det,N_states_diag,N_int,output_determinants) - do j=1,N_states_diag - call get_s2_u0(psi_det,CI_eigenvectors(1,j),N_det,size(CI_eigenvectors,1),CI_eigenvectors_s2(j)) - enddo + + call get_s2_u0_nstates(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int,& + N_states_diag,size(CI_eigenvectors,1)) else if (diag_algorithm == "Lapack") then @@ -88,11 +88,11 @@ END_PROVIDER allocate (s2_eigvalues(N_det)) allocate(index_good_state_array(N_det),good_state_array(N_det)) good_state_array = .False. + call get_s2_u0_nstates(s2_eigvalues,eigenvectors,N_det,psi_det,N_int,& + N_det,size(eigenvectors,1)) do j=1,N_det - call get_s2_u0(psi_det,eigenvectors(1,j),N_det,size(eigenvectors,1),s2) - s2_eigvalues(j) = s2 ! Select at least n_states states with S^2 values closed to "expected_s2" - if(dabs(s2-expected_s2).le.0.5d0)then + if(dabs(s2_eigvalues(j)-expected_s2).le.0.5d0)then i_state +=1 index_good_state_array(i_state) = j good_state_array(j) = .True. @@ -117,12 +117,11 @@ END_PROVIDER if(i_state+i_other_state.gt.n_states_diag)then exit endif - call get_s2_u0(psi_det,eigenvectors(1,j),N_det,size(eigenvectors,1),s2) do i=1,N_det CI_eigenvectors(i,i_state+i_other_state) = eigenvectors(i,j) enddo CI_electronic_energy(i_state+i_other_state) = eigenvalues(j) - CI_eigenvectors_s2(i_state+i_other_state) = s2 + CI_eigenvectors_s2(i_state+i_other_state) = s2_eigvalues(i_state+i_other_state) enddo else @@ -146,14 +145,14 @@ END_PROVIDER deallocate(index_good_state_array,good_state_array) deallocate(s2_eigvalues) else + call get_s2_u0_nstates(CI_eigenvectors_s2,eigenvectors,N_det,psi_det,N_int,& + min(N_det,N_states_diag),size(eigenvectors,1)) ! Select the "N_states_diag" states of lowest energy do j=1,min(N_det,N_states_diag) - call get_s2_u0(psi_det,eigenvectors(1,j),N_det,N_det,s2) do i=1,N_det CI_eigenvectors(i,j) = eigenvectors(i,j) enddo CI_electronic_energy(j) = eigenvalues(j) - CI_eigenvectors_s2(j) = s2 enddo endif deallocate(eigenvectors,eigenvalues) @@ -162,7 +161,7 @@ END_PROVIDER if( s2_eig.and.(n_states_diag > 1).and.(n_det >= n_states_diag) )then ! Diagonalizing S^2 within the "n_states_diag" states found - allocate(s2_eigvalues(N_states_diag)) + allocate(s2_eigvalues(N_states_diag), e_array(N_states_diag)) call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors,n_det,size(psi_det,3),size(CI_eigenvectors,1),min(n_states_diag,n_det),s2_eigvalues) do j = 1, N_states_diag @@ -170,6 +169,7 @@ END_PROVIDER psi_coef(i,j) = CI_eigenvectors(i,j) enddo enddo + call u0_H_u_0_nstates(e_array,psi_coef,n_det,psi_det,N_int,N_states_diag,psi_det_size) ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value ! closer to the "expected_s2" set as input @@ -185,15 +185,13 @@ END_PROVIDER endif enddo ! Sorting the i_state good states by energy - allocate(e_array(i_state),iorder(i_state)) + allocate(iorder(i_state)) do j = 1, i_state do i = 1, N_det CI_eigenvectors(i,j) = psi_coef(i,index_good_state_array(j)) enddo CI_eigenvectors_s2(j) = s2_eigvalues(index_good_state_array(j)) - call u0_H_u_0(e_0,CI_eigenvectors(1,j),n_det,psi_det,N_int) - CI_electronic_energy(j) = e_0 - e_array(j) = e_0 + CI_electronic_energy(j) = e_array(j) iorder(j) = j enddo call dsort(e_array,iorder,i_state) @@ -203,14 +201,7 @@ END_PROVIDER do i = 1, N_det CI_eigenvectors(i,j) = psi_coef(i,index_good_state_array(iorder(j))) enddo - ! call u0_H_u_0(e_0,CI_eigenvectors(1,j),n_det,psi_det,N_int) - ! print*,'e = ',CI_electronic_energy(j) - ! print*,' = ',e_0 - ! call get_s2_u0(psi_det,CI_eigenvectors(1,j),N_det,size(CI_eigenvectors,1),s2) - ! print*,'s^2 = ',CI_eigenvectors_s2(j) - ! print*,'= ',s2 enddo - deallocate(e_array,iorder) ! Then setting the other states without any specific energy order i_other_state = 0 @@ -221,10 +212,9 @@ END_PROVIDER CI_eigenvectors(i,i_state + i_other_state) = psi_coef(i,j) enddo CI_eigenvectors_s2(i_state + i_other_state) = s2_eigvalues(j) - call u0_H_u_0(e_0,CI_eigenvectors(1,i_state + i_other_state),n_det,psi_det,N_int) - CI_electronic_energy(i_state + i_other_state) = e_0 + CI_electronic_energy(i_state + i_other_state) = e_array(i_state + i_other_state) enddo - deallocate(index_good_state_array,good_state_array) + deallocate(iorder,e_array,index_good_state_array,good_state_array) deallocate(s2_eigvalues) diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index 569392ac..086613de 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -69,41 +69,11 @@ BEGIN_PROVIDER [ double precision, s2_values, (N_states) ] ! array of the averaged values of the S^2 operator on the various states END_DOC integer :: i - double precision :: s2 - do i = 1, N_states - call get_s2_u0(psi_det,psi_coef(1,i),n_det,size(psi_coef,1),s2) - s2_values(i) = s2 - enddo + call get_s2_u0_nstates(s2_values,psi_coef,n_det,psi_det,N_int,N_states,psi_det_size) END_PROVIDER -subroutine get_s2_u0_old(psi_keys_tmp,psi_coefs_tmp,n,nmax,s2) - implicit none - use bitmasks - integer, intent(in) :: n,nmax - integer(bit_kind), intent(in) :: psi_keys_tmp(N_int,2,nmax) - double precision, intent(in) :: psi_coefs_tmp(nmax) - double precision, intent(out) :: s2 - integer :: i,j,l - double precision :: s2_tmp - s2 = 0.d0 - !$OMP PARALLEL DO DEFAULT(NONE) & - !$OMP PRIVATE(i,j,s2_tmp) SHARED(n,psi_coefs_tmp,psi_keys_tmp,N_int) REDUCTION(+:s2) SCHEDULE(dynamic) - do i=1,n - do j=i+1,n - call get_s2(psi_keys_tmp(1,1,i),psi_keys_tmp(1,1,j),s2_tmp,N_int) - s2 += psi_coefs_tmp(i)*psi_coefs_tmp(j)*s2_tmp - enddo - enddo - !$OMP END PARALLEL DO - s2 = s2+s2 - do i=1,n - call get_s2(psi_keys_tmp(1,1,i),psi_keys_tmp(1,1,i),s2_tmp,N_int) - s2 += psi_coefs_tmp(i)*psi_coefs_tmp(i)*s2_tmp - enddo - s2 += S_z2_Sz -end subroutine get_s2_u0(psi_keys_tmp,psi_coefs_tmp,n,nmax,s2) implicit none @@ -112,6 +82,148 @@ subroutine get_s2_u0(psi_keys_tmp,psi_coefs_tmp,n,nmax,s2) integer(bit_kind), intent(in) :: psi_keys_tmp(N_int,2,nmax) double precision, intent(in) :: psi_coefs_tmp(nmax) double precision, intent(out) :: s2 + call get_s2_u0_nstates(s2,psi_coefs_tmp,n,psi_keys_tmp,N_int,1,nmax) +end + + +subroutine get_s2_u0_nstates(s2,u_0,n,keys_tmp,Nint,N_st,sze_8) + use bitmasks + implicit none + BEGIN_DOC + ! Computes s2 = + ! + ! n : number of determinants + ! + END_DOC + integer, intent(in) :: N_st,n,Nint, sze_8 + double precision, intent(out) :: s2(N_st) + double precision, intent(in) :: u_0(sze_8,N_st) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + double precision :: s2_tmp + double precision :: s2t(N_st) + integer :: i,j,k,l, jj,ii + integer :: i0, j0 + + integer, allocatable :: shortcut(:,:), sort_idx(:,:) + integer(bit_kind), allocatable :: sorted(:,:,:), version(:,:,:) + integer(bit_kind) :: sorted_i(Nint) + + integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi, istate + + + ASSERT (Nint > 0) + ASSERT (Nint == N_int) + ASSERT (n>0) + PROVIDE ref_bitmask_energy davidson_criterion + + allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2)) + s2 = 0.d0 + + call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) + call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) + + !$OMP PARALLEL DEFAULT(NONE) & + !$OMP PRIVATE(i,s2_tmp,j,k,jj,s2t,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& + !$OMP SHARED(n,u_0,keys_tmp,Nint,s2,sorted,shortcut,sort_idx,version,N_st,sze_8) + s2t = 0.d0 + + !$OMP DO SCHEDULE(dynamic) + do sh=1,shortcut(0,1) + do sh2=sh,shortcut(0,1) + exa = 0 + do ni=1,Nint + exa = exa + popcnt(xor(version(ni,sh,1), version(ni,sh2,1))) + end do + if(exa > 2) then + cycle + end if + + do i=shortcut(sh,1),shortcut(sh+1,1)-1 + org_i = sort_idx(i,1) + if(sh==sh2) then + endi = i-1 + else + endi = shortcut(sh2+1,1)-1 + end if + do ni=1,Nint + sorted_i(ni) = sorted(ni,i,1) + enddo + + do j=shortcut(sh2,1),endi + org_j = sort_idx(j,1) + ext = exa + do ni=1,Nint + ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1))) + end do + if(ext <= 4) then + call get_s2(keys_tmp(1,1,org_i),keys_tmp(1,1,org_j),s2_tmp,Nint) + do istate=1,N_st + s2t(istate) = s2t(istate) + u_0(org_i,istate)*u_0(org_j,istate)*s2_tmp + enddo + endif + enddo + enddo + enddo + enddo + !$OMP END DO NOWAIT + + !$OMP DO SCHEDULE(dynamic) + do sh=1,shortcut(0,2) + do i=shortcut(sh,2),shortcut(sh+1,2)-1 + org_i = sort_idx(i,2) + do j=shortcut(sh,2),i-1 + org_j = sort_idx(j,2) + ext = 0 + do ni=1,Nint + ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2))) + end do + if(ext == 4) then + call get_s2(keys_tmp(1,1,org_i),keys_tmp(1,1,org_j),s2_tmp,Nint) + do istate=1,N_st + s2t(istate) = s2t(istate) + u_0(org_i,istate)*u_0(org_j,istate)*s2_tmp + enddo + end if + end do + end do + enddo + !$OMP END DO NOWAIT + + !$OMP CRITICAL + do istate=1,N_st + s2(istate) = s2(istate) + 2.d0*s2t(istate) + enddo + !$OMP END CRITICAL + + !$OMP END PARALLEL + + do i=1,n + call get_s2(keys_tmp(1,1,i),keys_tmp(1,1,i),s2_tmp,Nint) + do istate=1,N_st + s2(istate) = s2(istate) + u_0(i,istate)*u_0(i,istate)*s2_tmp + enddo + enddo + do istate=1,N_st + s2(istate) += S_z2_Sz + enddo + deallocate (shortcut, sort_idx, sorted, version) +end + + + + + + + + + + +subroutine get_s2_u0_nstates_old(psi_keys_tmp,psi_coefs_tmp,n,nmax,s2,N_st) + implicit none + use bitmasks + integer, intent(in) :: n,nmax, N_st + integer(bit_kind), intent(in) :: psi_keys_tmp(N_int,2,nmax) + double precision, intent(in) :: psi_coefs_tmp(nmax) + double precision, intent(out) :: s2 double precision :: s2_tmp integer :: i,j,l,jj,ii integer, allocatable :: idx(:) @@ -119,13 +231,12 @@ subroutine get_s2_u0(psi_keys_tmp,psi_coefs_tmp,n,nmax,s2) integer, allocatable :: shortcut(:), sort_idx(:) integer(bit_kind), allocatable :: sorted(:,:), version(:,:) integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi, pass - double precision :: davidson_threshold_bis allocate (shortcut(0:n+1), sort_idx(n), sorted(N_int,n), version(N_int,n)) s2 = 0.d0 - davidson_threshold_bis = threshold_davidson call sort_dets_ab_v(psi_keys_tmp, sorted, sort_idx, shortcut, version, n, N_int) + PROVIDE threshold_davidson !$OMP PARALLEL DEFAULT(NONE) & !$OMP PRIVATE(i,j,s2_tmp,sh, sh2, ni, exa, ext, org_i, org_j, endi, pass)& !$OMP SHARED(n,psi_coefs_tmp,psi_keys_tmp,N_int,threshold_davidson,shortcut,sorted,sort_idx,version)& From 342927be90f9573ea3794f27d30d83300384d15d Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 16 Sep 2016 23:45:03 +0200 Subject: [PATCH 109/216] Rewrote s2 --- plugins/FOBOCI/dress_simple.irp.f | 11 +- plugins/Full_CI/micro_pt2.irp.f | 61 ----- plugins/Full_CI_ZMQ/selection_slave.irp.f | 4 +- plugins/MRCC_Utils/mrcc_utils.irp.f | 128 ++++++---- src/Determinants/diagonalize_CI.irp.f | 8 +- src/Determinants/s2.irp.f | 284 ++++++++-------------- src/Determinants/slater_rules.irp.f | 6 +- 7 files changed, 197 insertions(+), 305 deletions(-) delete mode 100644 plugins/Full_CI/micro_pt2.irp.f diff --git a/plugins/FOBOCI/dress_simple.irp.f b/plugins/FOBOCI/dress_simple.irp.f index 99566a8e..dfa57865 100644 --- a/plugins/FOBOCI/dress_simple.irp.f +++ b/plugins/FOBOCI/dress_simple.irp.f @@ -207,16 +207,16 @@ subroutine dress_H_matrix_from_psi_det_input(psi_det_generators_input,Ndet_gener call lapack_diagd(eigvalues,eigvectors,dressed_H_matrix,Ndet_generators,Ndet_generators) ! Diagonalize the Dressed_H_matrix - double precision :: s2,E_ref(N_states) + double precision :: s2(N_det_generators),E_ref(N_states) integer :: i_state(N_states) integer :: n_state_good n_state_good = 0 if(s2_eig)then + call u_0_S2_u_0_nstates(s2,eigvectors,Ndet_generators,psi_det_generators_input,N_int,N_det_generators,size(eigvectors,1)) do i = 1, Ndet_generators - call get_s2_u0(psi_det_generators_input,eigvectors(1,i),Ndet_generators,Ndet_generators,s2) - print*,'s2 = ',s2 - print*,dabs(s2-expected_s2) - if(dabs(s2-expected_s2).le.0.3d0)then + print*,'s2 = ',s2(i) + print*,dabs(s2(i)-expected_s2) + if(dabs(s2(i)-expected_s2).le.0.3d0)then n_state_good +=1 i_state(n_state_good) = i E_ref(n_state_good) = eigvalues(i) @@ -274,7 +274,6 @@ subroutine dress_H_matrix_from_psi_det_input(psi_det_generators_input,Ndet_gener integer :: i_good_state(0:N_states) i_good_state(0) = 0 do i = 1, Ndet_generators - call get_s2_u0(psi_det_generators_input,eigvectors(1,i),Ndet_generators,Ndet_generators,s2) ! State following do k = 1, N_states accu = 0.d0 diff --git a/plugins/Full_CI/micro_pt2.irp.f b/plugins/Full_CI/micro_pt2.irp.f deleted file mode 100644 index 4ce7c4be..00000000 --- a/plugins/Full_CI/micro_pt2.irp.f +++ /dev/null @@ -1,61 +0,0 @@ -program micro_pt2 - implicit none - BEGIN_DOC -! Helper program to compute the PT2 in distributed mode. - END_DOC - - read_wf = .False. - SOFT_TOUCH read_wf - call provide_everything - call switch_qp_run_to_master - call run_wf - -end - -subroutine provide_everything - PROVIDE H_apply_buffer_allocated mo_bielec_integrals_in_map psi_det_generators psi_coef_generators psi_det_sorted_bit psi_selectors n_det_generators n_states generators_bitmask zmq_context -end - -subroutine run_wf - use f77_zmq - implicit none - - integer(ZMQ_PTR), external :: new_zmq_to_qp_run_socket - integer(ZMQ_PTR) :: zmq_to_qp_run_socket - double precision :: energy(N_states_diag) - - print *, 'Getting wave function' - zmq_context = f77_zmq_ctx_new () - - zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() - - ! TODO : do loop here - ! TODO : wait_state - call zmq_get_psi(zmq_to_qp_run_socket,1,energy,size(energy)) - integer :: j,k - do j=1,N_states_diag - do k=1,N_det - CI_eigenvectors(k,j) = psi_coef(k,j) - enddo - call get_s2_u0(psi_det,CI_eigenvectors(1,j),N_det,size(CI_eigenvectors,1),CI_eigenvectors_s2(j)) - enddo - if (.True.) then - do k=1,size(ci_electronic_energy) - ci_electronic_energy(k) = energy(k) - enddo - SOFT_TOUCH ci_electronic_energy CI_eigenvectors_s2 CI_eigenvectors - print *, energy(:) - endif - call write_double(6,ci_energy,'Energy') - zmq_state = 'h_apply_fci_pt2' - - call provide_everything - integer :: rc, i - - print *, 'Contribution to PT2 running' - - !$OMP PARALLEL PRIVATE(i) - i = omp_get_thread_num() - call H_apply_FCI_PT2_slave_tcp(i) - !$OMP END PARALLEL -end diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index ff87b479..438892d3 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -58,12 +58,12 @@ subroutine update_energy(energy) ! Update energy when it is received from ZMQ END_DOC integer :: j,k - do j=1,N_states_diag + do j=1,N_states_diag do k=1,N_det CI_eigenvectors(k,j) = psi_coef(k,j) enddo - call get_s2_u0(psi_det,CI_eigenvectors(1,j),N_det,size(CI_eigenvectors,1),CI_eigenvectors_s2(j)) enddo + call u_0_S2_u_0(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int) if (.True.) then do k=1,size(ci_electronic_energy) ci_electronic_energy(k) = energy(k) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index b8ed005d..210ce848 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -148,9 +148,8 @@ END_PROVIDER call davidson_diag_mrcc(psi_det,CI_eigenvectors_dressed,CI_electronic_energy_dressed,& size(CI_eigenvectors_dressed,1),N_det,N_states_diag,N_int,output_determinants,mrcc_state) - do j=1,N_states_diag - call get_s2_u0(psi_det,CI_eigenvectors_dressed(1,j),N_det,size(CI_eigenvectors_dressed,1),CI_eigenvectors_s2_dressed(j)) - enddo + call u_0_S2_u_0_nstates(CI_eigenvectors_s2_dressed,CI_eigenvectors_dressed,N_det,psi_det,N_int,& + N_states_diag,size(CI_eigenvectors_dressed,1)) else if (diag_algorithm == "Lapack") then @@ -160,53 +159,96 @@ END_PROVIDER call lapack_diag(eigenvalues,eigenvectors, & H_matrix_dressed,size(H_matrix_dressed,1),N_det) CI_electronic_energy_dressed(:) = 0.d0 - do i=1,N_det - CI_eigenvectors_dressed(i,1) = eigenvectors(i,1) - enddo - i_state = 0 if (s2_eig) then + i_state = 0 + allocate (s2_eigvalues(N_det)) + allocate(index_good_state_array(N_det),good_state_array(N_det)) + good_state_array = .False. + call u_0_S2_u_0_nstates(s2_eigvalues,eigenvectors,N_det,psi_det,N_int,& + N_det,size(eigenvectors,1)) do j=1,N_det - call get_s2_u0(psi_det,eigenvectors(1,j),N_det,N_det,s2) + ! Select at least n_states states with S^2 values closed to "expected_s2" if(dabs(s2-expected_s2).le.0.5d0)then i_state += 1 - do i=1,N_det - CI_eigenvectors_dressed(i,i_state) = eigenvectors(i,j) - enddo - CI_electronic_energy_dressed(i_state) = eigenvalues(j) - CI_eigenvectors_s2_dressed(i_state) = s2 + index_good_state_array(i_state) = j + good_state_array(j) = .True. endif - if (i_state.ge.N_states_diag) then + if (i_state==N_states) then exit endif enddo - else - do j=1,N_states_diag - call get_s2_u0(psi_det,eigenvectors(1,j),N_det,N_det,s2) - i_state += 1 - do i=1,N_det - CI_eigenvectors_dressed(i,i_state) = eigenvectors(i,j) + if (i_state /= 0) then + ! Fill the first "i_state" states that have a correct S^2 value + do j = 1, i_state + do i=1,N_det + CI_eigenvectors_dressed(i,j) = eigenvectors(i,index_good_state_array(j)) + enddo + CI_electronic_energy_dressed(j) = eigenvalues(index_good_state_array(j)) + CI_eigenvectors_s2_dressed(j) = s2_eigvalues(index_good_state_array(j)) enddo - CI_electronic_energy_dressed(i_state) = eigenvalues(j) - CI_eigenvectors_s2_dressed(i_state) = s2 + i_other_state = 0 + do j = 1, N_det + if(good_state_array(j))cycle + i_other_state +=1 + if(i_state+i_other_state.gt.n_states_diag)then + exit + endif + do i=1,N_det + CI_eigenvectors_dressed(i,i_state+i_other_state) = eigenvectors(i,j) + enddo + CI_electronic_energy_dressed(i_state+i_other_state) = eigenvalues(j) + CI_eigenvectors_s2_dressed(i_state+i_other_state) = s2_eigvalues(i_state+i_other_state) + enddo + + else + print*,'' + print*,'!!!!!!!! WARNING !!!!!!!!!' + print*,' Within the ',N_det,'determinants selected' + print*,' and the ',N_states_diag,'states requested' + print*,' We did not find any state with S^2 values close to ',expected_s2 + print*,' We will then set the first N_states eigenvectors of the H matrix' + print*,' as the CI_eigenvectors_dressed' + print*,' You should consider more states and maybe ask for s2_eig to be .True. or just enlarge the CI space' + print*,'' + do j=1,min(N_states_diag,N_det) + do i=1,N_det + CI_eigenvectors_dressed(i,j) = eigenvectors(i,j) + enddo + CI_electronic_energy_dressed(j) = eigenvalues(j) + CI_eigenvectors_s2_dressed(j) = s2_eigvalues(j) + enddo + endif + deallocate(index_good_state_array,good_state_array) + deallocate(s2_eigvalues) + else + call u_0_S2_u_0_nstates(CI_eigenvectors_s2_dressed,eigenvectors,N_det,psi_det,N_int,& + min(N_det,N_states_diag),size(eigenvectors,1)) + ! Select the "N_states_diag" states of lowest energy + do j=1,min(N_det,N_states_diag) + do i=1,N_det + CI_eigenvectors_dressed(i,j) = eigenvectors(i,j) + enddo + CI_electronic_energy_dressed(j) = eigenvalues(j) enddo endif deallocate(eigenvectors,eigenvalues) endif - - if(s2_eig.and.n_states_diag > 1.and. n_det >= n_states_diag)then - ! Diagonalizing S^2 within the "n_states_diag" states found - allocate(s2_eigvalues(N_states_diag)) - call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors_dressed,n_det,size(psi_det,3),size(CI_eigenvectors_dressed,1),min(n_states_diag,n_det),s2_eigvalues) + if( s2_eig.and.(n_states_diag > 1).and.(n_det >= n_states_diag) )then + ! Diagonalizing S^2 within the "n_states_diag" states found + allocate(s2_eigvalues(N_states_diag), e_array(N_states_diag)) + call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors_dressed,n_det,size(psi_det,3),size(CI_eigenvectors_dressed,1),min(n_states_diag,n_det),s2_eigvalues) + do j = 1, N_states_diag do i = 1, N_det psi_coef(i,j) = CI_eigenvectors_dressed(i,j) enddo enddo - + call u_0_H_u_0_nstates(e_array,psi_coef,n_det,psi_det,N_int,N_states_diag,psi_det_size) + ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value ! closer to the "expected_s2" set as input - + allocate(index_good_state_array(N_det),good_state_array(N_det)) good_state_array = .False. i_state = 0 @@ -218,15 +260,13 @@ END_PROVIDER endif enddo ! Sorting the i_state good states by energy - allocate(e_array(i_state),iorder(i_state)) + allocate(iorder(i_state)) do j = 1, i_state do i = 1, N_det CI_eigenvectors_dressed(i,j) = psi_coef(i,index_good_state_array(j)) enddo CI_eigenvectors_s2_dressed(j) = s2_eigvalues(index_good_state_array(j)) - call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,j),n_det,psi_det,N_int,mrcc_state) - CI_electronic_energy_dressed(j) = e_0 - e_array(j) = e_0 + CI_electronic_energy_dressed(j) = e_array(j) iorder(j) = j enddo call dsort(e_array,iorder,i_state) @@ -236,15 +276,8 @@ END_PROVIDER do i = 1, N_det CI_eigenvectors_dressed(i,j) = psi_coef(i,index_good_state_array(iorder(j))) enddo - ! call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,j),n_det,psi_det,N_int,mrcc_state) - ! print*,'e = ',CI_electronic_energy_dressed(j) - ! print*,' = ',e_0 - ! call get_s2_u0(psi_det,CI_eigenvectors_dressed(1,j),N_det,size(CI_eigenvectors_dressed,1),s2) - ! print*,'s^2 = ',CI_eigenvectors_s2_dressed(j) - ! print*,'= ',s2 enddo - deallocate(e_array,iorder) - + ! Then setting the other states without any specific energy order i_other_state = 0 do j = 1, N_states_diag @@ -254,15 +287,14 @@ END_PROVIDER CI_eigenvectors_dressed(i,i_state + i_other_state) = psi_coef(i,j) enddo CI_eigenvectors_s2_dressed(i_state + i_other_state) = s2_eigvalues(j) - call u0_H_u_0_mrcc(e_0,CI_eigenvectors_dressed(1,i_state + i_other_state),n_det,psi_det,N_int,mrcc_state) - CI_electronic_energy_dressed(i_state + i_other_state) = e_0 + CI_electronic_energy_dressed(i_state + i_other_state) = e_array(i_state + i_other_state) enddo - deallocate(index_good_state_array,good_state_array) - - deallocate(s2_eigvalues) - + deallocate(iorder,e_array,index_good_state_array,good_state_array) + + deallocate(s2_eigvalues) + endif - + END_PROVIDER BEGIN_PROVIDER [ double precision, CI_energy_dressed, (N_states_diag) ] diff --git a/src/Determinants/diagonalize_CI.irp.f b/src/Determinants/diagonalize_CI.irp.f index 2a071f83..58118461 100644 --- a/src/Determinants/diagonalize_CI.irp.f +++ b/src/Determinants/diagonalize_CI.irp.f @@ -72,7 +72,7 @@ END_PROVIDER call davidson_diag(psi_det,CI_eigenvectors,CI_electronic_energy,& size(CI_eigenvectors,1),N_det,N_states_diag,N_int,output_determinants) - call get_s2_u0_nstates(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int,& + call u_0_S2_u_0_nstates(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int,& N_states_diag,size(CI_eigenvectors,1)) @@ -88,7 +88,7 @@ END_PROVIDER allocate (s2_eigvalues(N_det)) allocate(index_good_state_array(N_det),good_state_array(N_det)) good_state_array = .False. - call get_s2_u0_nstates(s2_eigvalues,eigenvectors,N_det,psi_det,N_int,& + call u_0_S2_u_0_nstates(s2_eigvalues,eigenvectors,N_det,psi_det,N_int,& N_det,size(eigenvectors,1)) do j=1,N_det ! Select at least n_states states with S^2 values closed to "expected_s2" @@ -145,7 +145,7 @@ END_PROVIDER deallocate(index_good_state_array,good_state_array) deallocate(s2_eigvalues) else - call get_s2_u0_nstates(CI_eigenvectors_s2,eigenvectors,N_det,psi_det,N_int,& + call u_0_S2_u_0_nstates(CI_eigenvectors_s2,eigenvectors,N_det,psi_det,N_int,& min(N_det,N_states_diag),size(eigenvectors,1)) ! Select the "N_states_diag" states of lowest energy do j=1,min(N_det,N_states_diag) @@ -169,7 +169,7 @@ END_PROVIDER psi_coef(i,j) = CI_eigenvectors(i,j) enddo enddo - call u0_H_u_0_nstates(e_array,psi_coef,n_det,psi_det,N_int,N_states_diag,psi_det_size) + call u_0_H_u_0_nstates(e_array,psi_coef,n_det,psi_det,N_int,N_states_diag,psi_det_size) ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value ! closer to the "expected_s2" set as input diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index 086613de..c66bc714 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -69,38 +69,86 @@ BEGIN_PROVIDER [ double precision, s2_values, (N_states) ] ! array of the averaged values of the S^2 operator on the various states END_DOC integer :: i - call get_s2_u0_nstates(s2_values,psi_coef,n_det,psi_det,N_int,N_states,psi_det_size) + call u_0_S2_u_0_nstates(s2_values,psi_coef,n_det,psi_det,N_int,N_states,psi_det_size) END_PROVIDER -subroutine get_s2_u0(psi_keys_tmp,psi_coefs_tmp,n,nmax,s2) - implicit none - use bitmasks - integer, intent(in) :: n,nmax - integer(bit_kind), intent(in) :: psi_keys_tmp(N_int,2,nmax) - double precision, intent(in) :: psi_coefs_tmp(nmax) - double precision, intent(out) :: s2 - call get_s2_u0_nstates(s2,psi_coefs_tmp,n,psi_keys_tmp,N_int,1,nmax) -end - - -subroutine get_s2_u0_nstates(s2,u_0,n,keys_tmp,Nint,N_st,sze_8) +subroutine u_0_S2_u_0(e_0,u_0,n,keys_tmp,Nint) use bitmasks implicit none BEGIN_DOC - ! Computes s2 = + ! Computes e_0 = / + ! + ! n : number of determinants + ! + END_DOC + integer, intent(in) :: n,Nint + double precision, intent(out) :: e_0 + double precision, intent(in) :: u_0(n) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + call u_0_S2_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,1,n) +end + +subroutine u_0_S2_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) + use bitmasks + implicit none + BEGIN_DOC + ! Computes e_0 = / + ! + ! n : number of determinants + ! + END_DOC + integer, intent(in) :: n,Nint, N_st, sze_8 + double precision, intent(out) :: e_0(N_st) + double precision, intent(in) :: u_0(sze_8,N_st) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + + double precision, allocatable :: v_0(:,:) + double precision :: u_dot_u,u_dot_v + integer :: i,j + allocate (v_0(sze_8,N_st)) + + call S2_u_0_nstates(v_0,u_0,n,keys_tmp,Nint,N_st,sze_8) + do i=1,N_st + e_0(i) = u_dot_v(v_0(1,i),u_0(1,i),n)/u_dot_u(u_0(1,i),n) + S_z2_Sz + enddo +end + + + +subroutine S2_u_0(v_0,u_0,n,keys_tmp,Nint) + use bitmasks + implicit none + BEGIN_DOC + ! Computes v_0 = S^2|u_0> + ! + ! n : number of determinants + ! + END_DOC + integer, intent(in) :: n,Nint + double precision, intent(out) :: v_0(n) + double precision, intent(in) :: u_0(n) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + call S2_u_0_nstates(v_0,u_0,n,keys_tmp,Nint,1,n) +end + +subroutine S2_u_0_nstates(v_0,u_0,n,keys_tmp,Nint,N_st,sze_8) + use bitmasks + implicit none + BEGIN_DOC + ! Computes v_0 = S^2|u_0> ! ! n : number of determinants ! END_DOC integer, intent(in) :: N_st,n,Nint, sze_8 - double precision, intent(out) :: s2(N_st) + double precision, intent(out) :: v_0(sze_8,N_st) double precision, intent(in) :: u_0(sze_8,N_st) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) double precision :: s2_tmp - double precision :: s2t(N_st) + double precision, allocatable :: vt(:,:) integer :: i,j,k,l, jj,ii integer :: i0, j0 @@ -117,15 +165,16 @@ subroutine get_s2_u0_nstates(s2,u_0,n,keys_tmp,Nint,N_st,sze_8) PROVIDE ref_bitmask_energy davidson_criterion allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2)) - s2 = 0.d0 + v_0 = 0.d0 call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(i,s2_tmp,j,k,jj,s2t,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& - !$OMP SHARED(n,u_0,keys_tmp,Nint,s2,sorted,shortcut,sort_idx,version,N_st,sze_8) - s2t = 0.d0 + !$OMP PRIVATE(i,s2_tmp,j,k,jj,vt,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& + !$OMP SHARED(n,u_0,keys_tmp,Nint,v_0,sorted,shortcut,sort_idx,version,N_st,sze_8) + allocate(vt(sze_8,N_st)) + vt = 0.d0 !$OMP DO SCHEDULE(dynamic) do sh=1,shortcut(0,1) @@ -158,7 +207,8 @@ subroutine get_s2_u0_nstates(s2,u_0,n,keys_tmp,Nint,N_st,sze_8) if(ext <= 4) then call get_s2(keys_tmp(1,1,org_i),keys_tmp(1,1,org_j),s2_tmp,Nint) do istate=1,N_st - s2t(istate) = s2t(istate) + u_0(org_i,istate)*u_0(org_j,istate)*s2_tmp + vt (org_i,istate) = vt (org_i,istate) + s2_tmp*u_0(org_j,istate) + vt (org_j,istate) = vt (org_j,istate) + s2_tmp*u_0(org_i,istate) enddo endif enddo @@ -180,7 +230,8 @@ subroutine get_s2_u0_nstates(s2,u_0,n,keys_tmp,Nint,N_st,sze_8) if(ext == 4) then call get_s2(keys_tmp(1,1,org_i),keys_tmp(1,1,org_j),s2_tmp,Nint) do istate=1,N_st - s2t(istate) = s2t(istate) + u_0(org_i,istate)*u_0(org_j,istate)*s2_tmp + vt (org_i,istate) = vt (org_i,istate) + s2_tmp*u_0(org_j,istate) + vt (org_j,istate) = vt (org_j,istate) + s2_tmp*u_0(org_i,istate) enddo end if end do @@ -190,21 +241,22 @@ subroutine get_s2_u0_nstates(s2,u_0,n,keys_tmp,Nint,N_st,sze_8) !$OMP CRITICAL do istate=1,N_st - s2(istate) = s2(istate) + 2.d0*s2t(istate) + do i=n,1,-1 + v_0(i,istate) = v_0(i,istate) + vt(i,istate) + enddo enddo !$OMP END CRITICAL + deallocate(vt) !$OMP END PARALLEL do i=1,n call get_s2(keys_tmp(1,1,i),keys_tmp(1,1,i),s2_tmp,Nint) do istate=1,N_st - s2(istate) = s2(istate) + u_0(i,istate)*u_0(i,istate)*s2_tmp + v_0(i,istate) += s2_tmp * u_0(i,istate) enddo enddo - do istate=1,N_st - s2(istate) += S_z2_Sz - enddo + deallocate (shortcut, sort_idx, sorted, version) end @@ -214,116 +266,6 @@ end - - - -subroutine get_s2_u0_nstates_old(psi_keys_tmp,psi_coefs_tmp,n,nmax,s2,N_st) - implicit none - use bitmasks - integer, intent(in) :: n,nmax, N_st - integer(bit_kind), intent(in) :: psi_keys_tmp(N_int,2,nmax) - double precision, intent(in) :: psi_coefs_tmp(nmax) - double precision, intent(out) :: s2 - double precision :: s2_tmp - integer :: i,j,l,jj,ii - integer, allocatable :: idx(:) - - integer, allocatable :: shortcut(:), sort_idx(:) - integer(bit_kind), allocatable :: sorted(:,:), version(:,:) - integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi, pass - - allocate (shortcut(0:n+1), sort_idx(n), sorted(N_int,n), version(N_int,n)) - s2 = 0.d0 - call sort_dets_ab_v(psi_keys_tmp, sorted, sort_idx, shortcut, version, n, N_int) - - PROVIDE threshold_davidson - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(i,j,s2_tmp,sh, sh2, ni, exa, ext, org_i, org_j, endi, pass)& - !$OMP SHARED(n,psi_coefs_tmp,psi_keys_tmp,N_int,threshold_davidson,shortcut,sorted,sort_idx,version)& - !$OMP REDUCTION(+:s2) - - !$OMP DO SCHEDULE(dynamic) - do sh=1,shortcut(0) - - do sh2=1,sh - exa = 0 - do ni=1,N_int - exa += popcnt(xor(version(ni,sh), version(ni,sh2))) - end do - if(exa > 2) then - cycle - end if - - do i=shortcut(sh),shortcut(sh+1)-1 - if(sh==sh2) then - endi = i-1 - else - endi = shortcut(sh2+1)-1 - end if - - do j=shortcut(sh2),endi - ext = exa - do ni=1,N_int - ext += popcnt(xor(sorted(ni,i), sorted(ni,j))) - end do - if(ext <= 4) then - org_i = sort_idx(i) - org_j = sort_idx(j) - - if ( dabs(psi_coefs_tmp(org_j)) + dabs(psi_coefs_tmp(org_i))& - > threshold_davidson ) then - call get_s2(psi_keys_tmp(1,1,org_i),psi_keys_tmp(1,1,org_j),s2_tmp,N_int) - s2 = s2 + psi_coefs_tmp(org_i)*psi_coefs_tmp(org_j)*s2_tmp - endif - end if - end do - end do - end do - enddo - !$OMP END DO - - !$OMP END PARALLEL - - call sort_dets_ba_v(psi_keys_tmp, sorted, sort_idx, shortcut, version, n, N_int) - - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(i,j,s2_tmp,sh, sh2, ni, exa, ext, org_i, org_j, endi, pass)& - !$OMP SHARED(n,psi_coefs_tmp,psi_keys_tmp,N_int,threshold_davidson,shortcut,sorted,sort_idx,version)& - !$OMP REDUCTION(+:s2) - - !$OMP DO SCHEDULE(dynamic) - do sh=1,shortcut(0) - do i=shortcut(sh),shortcut(sh+1)-1 - do j=shortcut(sh),i-1 - ext = 0 - do ni=1,N_int - ext += popcnt(xor(sorted(ni,i), sorted(ni,j))) - end do - if(ext == 4) then - org_i = sort_idx(i) - org_j = sort_idx(j) - - if ( dabs(psi_coefs_tmp(org_j)) + dabs(psi_coefs_tmp(org_i))& - > threshold_davidson ) then - call get_s2(psi_keys_tmp(1,1,org_i),psi_keys_tmp(1,1,org_j),s2_tmp,N_int) - s2 = s2 + psi_coefs_tmp(org_i)*psi_coefs_tmp(org_j)*s2_tmp - endif - end if - end do - end do - enddo - !$OMP END DO - - !$OMP END PARALLEL - s2 = s2+s2 - do i=1,n - call get_s2(psi_keys_tmp(1,1,i),psi_keys_tmp(1,1,i),s2_tmp,N_int) - s2 = s2 + psi_coefs_tmp(i)*psi_coefs_tmp(i)*s2_tmp - enddo - s2 = s2 + S_z2_Sz - deallocate (shortcut, sort_idx, sorted, version) -end - subroutine get_uJ_s2_uI(psi_keys_tmp,psi_coefs_tmp,n,nmax_coefs,nmax_keys,s2,nstates) implicit none use bitmasks @@ -373,9 +315,9 @@ subroutine get_uJ_s2_uI(psi_keys_tmp,psi_coefs_tmp,n,nmax_coefs,nmax_keys,s2,nst enddo end -subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nmax_coefs,nstates,s2_eigvalues) +subroutine diagonalize_s2_betweenstates(keys_tmp,u_0,n,nmax_keys,nmax_coefs,nstates,s2_eigvalues) BEGIN_DOC -! You enter with nstates vectors in psi_coefs_inout that may be coupled by S^2 +! You enter with nstates vectors in u_0 that may be coupled by S^2 ! The subroutine diagonalize the S^2 operator in the basis of these states. ! The vectors that you obtain in output are no more coupled by S^2, ! which does not necessary mean that they are eigenfunction of S^2. @@ -388,11 +330,7 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nma use bitmasks integer, intent(in) :: n,nmax_keys,nmax_coefs,nstates integer(bit_kind), intent(in) :: keys_tmp(N_int,2,nmax_keys) - double precision, intent(inout) :: psi_coefs_inout(nmax_coefs,nstates) - -!integer, intent(in) :: ndets_real,ndets_keys,ndets_coefs,nstates -!integer(bit_kind), intent(in) :: keys_tmp(N_int,2,ndets_keys) -!double precision, intent(inout) :: psi_coefs_inout(ndets_coefs,nstates) + double precision, intent(inout) :: u_0(nmax_coefs,nstates) double precision, intent(out) :: s2_eigvalues(nstates) @@ -410,43 +348,37 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nma print*,'nstates = ',nstates allocate(s2(nstates,nstates),overlap(nstates,nstates)) !$OMP PARALLEL DO COLLAPSE(2) DEFAULT(NONE) SCHEDULE(dynamic) & - !$OMP PRIVATE(i,j) SHARED(overlap,psi_coefs_inout,nstates,n) + !$OMP PRIVATE(i,j) SHARED(overlap,u_0,nstates,n) do i = 1, nstates do j = 1, nstates if (i < j) then cycle else if (i == j) then - overlap(i,i) = u_dot_u(psi_coefs_inout(1,i),n) + overlap(i,i) = u_dot_u(u_0(1,i),n) else - overlap(i,j) = u_dot_v(psi_coefs_inout(1,j),psi_coefs_inout(1,i),n) + overlap(i,j) = u_dot_v(u_0(1,j),u_0(1,i),n) overlap(j,i) = overlap(i,j) endif enddo enddo !$OMP END PARALLEL DO - call ortho_lowdin(overlap,size(overlap,1),nstates,psi_coefs_inout,size(psi_coefs_inout,1),n) + call ortho_lowdin(overlap,size(overlap,1),nstates,u_0,size(u_0,1),n) - !$OMP PARALLEL DO COLLAPSE(2) DEFAULT(NONE) SCHEDULE(dynamic) & - !$OMP PRIVATE(i,j) SHARED(overlap,psi_coefs_inout,nstates,n) - do i = 1, nstates - do j = 1, nstates - if (i < j) then - cycle - else if (i == j) then - overlap(i,i) = u_dot_u(psi_coefs_inout(1,i),n) - else - overlap(i,j) = u_dot_v(psi_coefs_inout(1,j),psi_coefs_inout(1,i),n) - overlap(j,i) = overlap(i,j) - endif - enddo + double precision, allocatable :: v_0(:,:) + allocate ( v_0(size(u_0,1),nstates) ) + call S2_u_0_nstates(v_0,u_0,n,keys_tmp,N_int,nstates,size(u_0,1)) + + do i=1, nstates + do j=1,i + s2(j,i) = u_dot_v(u_0(1,i), v_0(1,j),n) + s2(i,j) = s2(j,i) + enddo enddo - !$OMP END PARALLEL DO - call get_uJ_s2_uI(keys_tmp,psi_coefs_inout,n_det,size(psi_coefs_inout,1),size(keys_tmp,3),s2,nstates) +! call get_uJ_s2_uI(keys_tmp,u_0,n_det,size(u_0,1),size(keys_tmp,3),s2,nstates) print*,'S^2 matrix in the basis of the states considered' do i = 1, nstates write(*,'(10(F10.6,X))')s2(i,:) - s2(i,i) = s2(i,i) enddo double precision :: accu_precision_diag,accu_precision_of_diag @@ -476,12 +408,11 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nma s2(i,i) = s2(i,i) enddo - allocate(eigvalues(nstates),eigvectors(nstates,nstates)) - call lapack_diagd(eigvalues,eigvectors,s2,nstates,nstates) + allocate(eigvectors(nstates,nstates)) + call lapack_diagd(s2_eigvalues,eigvectors,s2,nstates,nstates) print*,'Eigenvalues' do i = 1, nstates - print*,'s2 = ',eigvalues(i) - s2_eigvalues(i) = eigvalues(i) + print*,'s2 = ',s2_eigvalues(i) enddo allocate(psi_coefs_tmp(nmax_coefs,nstates)) @@ -490,27 +421,18 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,psi_coefs_inout,n,nmax_keys,nma do k = 1, nstates coef_contract = eigvectors(k,j) ! do i = 1, n_det - psi_coefs_tmp(i,j) += psi_coefs_inout(i,k) * coef_contract + psi_coefs_tmp(i,j) += u_0(i,k) * coef_contract enddo enddo enddo do j = 1, nstates - accu = 0.d0 + accu = 1.d0/u_dot_u(psi_coefs_tmp(1,j),n_det) do i = 1, n_det - accu += psi_coefs_tmp(i,j) * psi_coefs_tmp(i,j) - enddo - accu = 1.d0/dsqrt(accu) - do i = 1, n_det - psi_coefs_inout(i,j) = psi_coefs_tmp(i,j) * accu + u_0(i,j) = psi_coefs_tmp(i,j) * accu enddo enddo -!call get_uJ_s2_uI(keys_tmp,psi_coefs_inout,n_det,size(psi_coefs_inout,1),size(keys_tmp,3),s2,nstates) -!print*,'S^2 matrix in the basis of the NEW states considered' -!do i = 1, nstates -! write(*,'(10(F16.10,X))')s2(i,:) -!enddo - deallocate(s2,eigvalues,eigvectors,psi_coefs_tmp,overlap) + deallocate(s2,v_0,eigvectors,psi_coefs_tmp,overlap) end diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index 8ef69ce4..5e27253a 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -1634,7 +1634,7 @@ subroutine get_occ_from_key(key,occ,Nint) end -subroutine u0_H_u_0(e_0,u_0,n,keys_tmp,Nint) +subroutine u_0_H_u_0(e_0,u_0,n,keys_tmp,Nint) use bitmasks implicit none BEGIN_DOC @@ -1647,10 +1647,10 @@ subroutine u0_H_u_0(e_0,u_0,n,keys_tmp,Nint) double precision, intent(out) :: e_0 double precision, intent(in) :: u_0(n) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - call u0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,1,n) + call u_0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,1,n) end -subroutine u0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) +subroutine u_0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) use bitmasks implicit none BEGIN_DOC From bd9d32206857952ad043d08eb8215c0d8cb02118 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sat, 17 Sep 2016 01:54:44 +0200 Subject: [PATCH 110/216] Accelerated Davidson in MRCC --- plugins/MRCC_Utils/davidson.irp.f | 311 ++++++++++++++++------------ plugins/MRCC_Utils/mrcc_utils.irp.f | 4 +- src/Determinants/davidson.irp.f | 12 +- 3 files changed, 189 insertions(+), 138 deletions(-) diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index be8fbad5..746fef7a 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -96,7 +96,7 @@ subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nin integer, allocatable :: kl_pairs(:,:) integer :: k_pairs, kl - integer :: iter2 + integer :: iter2, sze_8 double precision, allocatable :: W(:,:,:), U(:,:,:), R(:,:) double precision, allocatable :: y(:,:,:,:), h(:,:,:,:), lambda(:) double precision :: diag_h_mat_elem @@ -134,11 +134,14 @@ subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nin enddo write(iunit,'(A)') trim(write_buffer) + integer, external :: align_double + sze_8 = align_double(sze) + allocate( & kl_pairs(2,N_st*(N_st+1)/2), & - W(sze,N_st,davidson_sze_max), & - U(sze,N_st,davidson_sze_max), & - R(sze,N_st), & + W(sze_8,N_st,davidson_sze_max), & + U(sze_8,N_st,davidson_sze_max), & + R(sze_8,N_st), & h(N_st,davidson_sze_max,N_st,davidson_sze_max), & y(N_st,davidson_sze_max,N_st,davidson_sze_max), & lambda(N_st*davidson_sze_max)) @@ -152,40 +155,52 @@ subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nin ! ============== - - k_pairs=0 - do l=1,N_st - do k=1,l - k_pairs+=1 - kl_pairs(1,k_pairs) = k - kl_pairs(2,k_pairs) = l + if (N_st > 1) then + + k_pairs=0 + do l=1,N_st + do k=1,l + k_pairs+=1 + kl_pairs(1,k_pairs) = k + kl_pairs(2,k_pairs) = l + enddo enddo - enddo - - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP SHARED(U,sze,N_st,overlap,kl_pairs,k_pairs, & - !$OMP Nint,dets_in,u_in) & - !$OMP PRIVATE(k,l,kl,i) - - - ! Orthonormalize initial guess - ! ============================ - - !$OMP DO - do kl=1,k_pairs - k = kl_pairs(1,kl) - l = kl_pairs(2,kl) - if (k/=l) then - overlap(k,l) = u_dot_v(U_in(1,k),U_in(1,l),sze) - overlap(l,k) = overlap(k,l) - else - overlap(k,k) = u_dot_u(U_in(1,k),sze) - endif - enddo - !$OMP END DO - !$OMP END PARALLEL + + !$OMP PARALLEL DEFAULT(NONE) & + !$OMP SHARED(U,sze,N_st,overlap,kl_pairs,k_pairs, & + !$OMP Nint,dets_in,u_in) & + !$OMP PRIVATE(k,l,kl,i) + + + ! Orthonormalize initial guess + ! ============================ + + !$OMP DO + do kl=1,k_pairs + k = kl_pairs(1,kl) + l = kl_pairs(2,kl) + if (k/=l) then + overlap(k,l) = u_dot_v(U_in(1,k),U_in(1,l),sze) + overlap(l,k) = overlap(k,l) + else + overlap(k,k) = u_dot_u(U_in(1,k),sze) + endif + enddo + !$OMP END DO + !$OMP END PARALLEL - call ortho_lowdin(overlap,size(overlap,1),N_st,U_in,size(U_in,1),sze) + call ortho_lowdin(overlap,size(overlap,1),N_st,U_in,size(U_in,1),sze) + + else + + overlap(1,1) = u_dot_u(U_in(1,1),sze) + double precision :: f + f = 1.d0 / dsqrt(overlap(1,1)) + do i=1,sze + U_in(i,1) = U_in(i,1) * f + enddo + + endif ! Davidson iterations ! =================== @@ -211,9 +226,7 @@ subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nin ! Compute W_k = H |u_k> ! ---------------------- - do k=1,N_st - call H_u_0_mrcc(W(1,k,iter),U(1,k,iter),H_jj,sze,dets_in,Nint,istate) - enddo + call H_u_0_mrcc_nstates(W(1,1,iter),U(1,1,iter),H_jj,sze,dets_in,Nint,istate,N_st,sze_8) ! Compute h_kl = = ! ------------------------------------------- @@ -364,8 +377,7 @@ subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nin end - -subroutine u0_H_u_0_mrcc(e_0,u_0,n,keys_tmp,Nint,istate) +subroutine u_0_H_u_0_mrcc(e_0,u_0,n,keys_tmp,Nint,istate) use bitmasks implicit none BEGIN_DOC @@ -374,14 +386,30 @@ subroutine u0_H_u_0_mrcc(e_0,u_0,n,keys_tmp,Nint,istate) ! n : number of determinants ! END_DOC - integer, intent(in) :: n,Nint + integer, intent(in) :: n,Nint,istate double precision, intent(out) :: e_0 double precision, intent(in) :: u_0(n) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + call u_0_H_u_0_mrcc_nstates(e_0,u_0,n,keys_tmp,Nint,1,n,istate) +end + +subroutine u_0_H_u_0_mrcc_nstates(e_0,u_0,n,keys_tmp,Nint,istate,N_st,sze_8) + use bitmasks + implicit none + BEGIN_DOC + ! Computes e_0 = / + ! + ! n : number of determinants + ! + END_DOC + integer, intent(in) :: n,Nint,N_st,sze_8 + double precision, intent(out) :: e_0(N_st) + double precision, intent(in) :: u_0(n,N_st) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) integer,intent(in) :: istate double precision :: H_jj(n) - double precision :: v_0(n) + double precision :: v_0(n,N_st) double precision :: u_dot_u,u_dot_v,diag_H_mat_elem integer :: i,j do i = 1, n @@ -392,12 +420,32 @@ subroutine u0_H_u_0_mrcc(e_0,u_0,n,keys_tmp,Nint,istate) H_jj(idx_ref(i)) += delta_ii(istate,i) enddo - call H_u_0_mrcc(v_0,u_0,H_jj,n,keys_tmp,Nint,istate) - e_0 = u_dot_v(v_0,u_0,n)/u_dot_u(u_0,n) + call H_u_0_mrcc_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,istate,N_st,sze_8) + do i=1,N_st + e_0(i) = u_dot_v(v_0(1,i),u_0(1,i),n)/u_dot_u(u_0(1,i),n) + enddo end -subroutine H_u_0_mrcc(v_0,u_0,H_jj,n,keys_tmp,Nint,istate) +subroutine H_u_0_mrcc(v_0,u_0,H_jj,n,keys_tmp,Nint,istate_in) + use bitmasks + implicit none + BEGIN_DOC + ! Computes v_0 = H|u_0> + ! + ! n : number of determinants + ! + ! H_jj : array of + END_DOC + integer, intent(in) :: n,Nint,istate_in + double precision, intent(out) :: v_0(n) + double precision, intent(in) :: u_0(n) + double precision, intent(in) :: H_jj(n) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + call H_u_0_mrcc_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,1,n) +end + +subroutine H_u_0_mrcc_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,istate_in,N_st,sze_8) use bitmasks implicit none BEGIN_DOC @@ -407,130 +455,135 @@ subroutine H_u_0_mrcc(v_0,u_0,H_jj,n,keys_tmp,Nint,istate) ! ! H_jj : array of END_DOC - integer, intent(in) :: n,Nint,istate - double precision, intent(out) :: v_0(n) - double precision, intent(in) :: u_0(n) + integer, intent(in) :: n,Nint,istate_in,N_st,sze_8 + double precision, intent(out) :: v_0(sze_8,N_st) + double precision, intent(in) :: u_0(sze_8,N_st) double precision, intent(in) :: H_jj(n) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - integer, allocatable :: idx(:) double precision :: hij - double precision, allocatable :: vt(:) + double precision, allocatable :: vt(:,:) integer :: i,j,k,l, jj,ii integer :: i0, j0 + integer(bit_kind) :: sorted_i(Nint) + - integer :: shortcut(0:n+1), sort_idx(n) - integer(bit_kind) :: sorted(Nint,n), version(Nint,n) + integer,allocatable :: shortcut(:,:), sort_idx(:,:) + integer(bit_kind), allocatable :: sorted(:,:,:), version(:,:,:) - integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi, pass -! - + integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi, pass, istate + + ASSERT (Nint > 0) ASSERT (Nint == N_int) ASSERT (n>0) - PROVIDE ref_bitmask_energy delta_ij - integer, parameter :: block_size = 157 - - - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(i,hij,j,k,idx,jj,vt,ii,sh, sh2, ni, exa, ext, org_i, org_j, endi, pass) & - !$OMP SHARED(n_det_ref,n_det_non_ref,idx_ref,idx_non_ref,n,H_jj,u_0,keys_tmp,Nint,v_0,istate,delta_ij,sorted,shortcut,sort_idx,version) - - - - !$OMP DO SCHEDULE(static) - do i=1,n - v_0(i) = H_jj(i) * u_0(i) - enddo - !$OMP END DO + PROVIDE ref_bitmask_energy + allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2)) + v_0 = 0.d0 - allocate(idx(0:n), vt(n)) + call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) + call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) + + !$OMP PARALLEL DEFAULT(NONE) & + !$OMP PRIVATE(i,hij,j,k,jj,vt,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& + !$OMP SHARED(n,H_jj,u_0,keys_tmp,Nint,v_0,sorted,shortcut,sort_idx,version,N_st,sze_8,& + !$OMP istate_in,delta_ij,N_det_ref,N_det_non_ref,idx_ref,idx_non_ref) + allocate(vt(sze_8,N_st)) Vt = 0.d0 - - !$OMP SINGLE - call sort_dets_ab_v(keys_tmp, sorted, sort_idx, shortcut, version, n, Nint) - !$OMP END SINGLE - - !$OMP DO SCHEDULE(dynamic) - do sh=1,shortcut(0) - do sh2=1,sh - exa = 0 - do ni=1,Nint - exa += popcnt(xor(version(ni,sh), version(ni,sh2))) - end do - if(exa > 2) then - cycle - end if - - do i=shortcut(sh),shortcut(sh+1)-1 - if(sh==sh2) then - endi = i-1 - else - endi = shortcut(sh2+1)-1 + do sh=1,shortcut(0,1) + do sh2=sh,shortcut(0,1) + exa = 0 + do ni=1,Nint + exa = exa + popcnt(xor(version(ni,sh,1), version(ni,sh2,1))) + end do + if(exa > 2) then + cycle end if - do j=shortcut(sh2),endi - ext = exa - do ni=1,Nint - ext += popcnt(xor(sorted(ni,i), sorted(ni,j))) - end do - if(ext <= 4) then - org_i = sort_idx(i) - org_j = sort_idx(j) - - call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) - vt (org_i) = vt (org_i) + hij*u_0(org_j) - vt (org_j) = vt (org_j) + hij*u_0(org_i) + do i=shortcut(sh,1),shortcut(sh+1,1)-1 + org_i = sort_idx(i,1) + if(sh==sh2) then + endi = i-1 + else + endi = shortcut(sh2+1,1)-1 end if - end do - end do - end do + do ni=1,Nint + sorted_i(ni) = sorted(ni,i,1) + enddo + + do j=shortcut(sh2,1),endi + org_j = sort_idx(j,1) + ext = exa + do ni=1,Nint + ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1))) + end do + if(ext <= 4) then + call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) + do istate=1,N_st + vt (org_i,istate) = vt (org_i,istate) + hij*u_0(org_j,istate) + vt (org_j,istate) = vt (org_j,istate) + hij*u_0(org_i,istate) + enddo + endif + enddo + enddo + enddo enddo - !$OMP END DO + !$OMP END DO NOWAIT - !$OMP SINGLE - call sort_dets_ba_v(keys_tmp, sorted, sort_idx, shortcut, version, n, Nint) - !$OMP END SINGLE - !$OMP DO SCHEDULE(dynamic) - do sh=1,shortcut(0) - do i=shortcut(sh),shortcut(sh+1)-1 - do j=shortcut(sh),i-1 + do sh=1,shortcut(0,2) + do i=shortcut(sh,2),shortcut(sh+1,2)-1 + org_i = sort_idx(i,2) + do j=shortcut(sh,2),i-1 + org_j = sort_idx(j,2) ext = 0 do ni=1,Nint - ext += popcnt(xor(sorted(ni,i), sorted(ni,j))) + ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2))) end do if(ext == 4) then - org_i = sort_idx(i) - org_j = sort_idx(j) call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) - vt (org_i) = vt (org_i) + hij*u_0(org_j) - vt (org_j) = vt (org_j) + hij*u_0(org_i) + do istate=1,N_st + vt (org_i,istate) = vt (org_i,istate) + hij*u_0(org_j,istate) + vt (org_j,istate) = vt (org_j,istate) + hij*u_0(org_i,istate) + enddo end if end do end do enddo - !$OMP END DO + !$OMP END DO NOWAIT - - !$OMP DO SCHEDULE(guided) + !$OMP DO do ii=1,n_det_ref i = idx_ref(ii) do jj = 1, n_det_non_ref j = idx_non_ref(jj) - vt (i) = vt (i) + delta_ij(istate,jj,ii)*u_0(j) - vt (j) = vt (j) + delta_ij(istate,jj,ii)*u_0(i) + do istate=1,N_st + vt (i,istate) = vt (i,istate) + delta_ij(istate_in,jj,ii)*u_0(j,istate) + vt (j,istate) = vt (j,istate) + delta_ij(istate_in,jj,ii)*u_0(i,istate) + enddo enddo enddo !$OMP END DO + !$OMP CRITICAL - do i=1,n - v_0(i) = v_0(i) + vt(i) + do istate=1,N_st + do i=n,1,-1 + v_0(i,istate) = v_0(i,istate) + vt(i,istate) + enddo enddo !$OMP END CRITICAL - deallocate(idx,vt) + + deallocate(vt) !$OMP END PARALLEL + + do istate=1,N_st + do i=1,n + v_0(i,istate) += H_jj(i) * u_0(i,istate) + enddo + enddo + deallocate (shortcut, sort_idx, sorted, version) + end diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 210ce848..2304e39b 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -129,7 +129,7 @@ END_PROVIDER integer :: i_other_state double precision, allocatable :: eigenvectors(:,:), eigenvalues(:) integer :: i_state - double precision :: s2,e_0 + double precision :: e_0 integer :: i,j,k double precision, allocatable :: s2_eigvalues(:) double precision, allocatable :: e_array(:) @@ -168,7 +168,7 @@ END_PROVIDER N_det,size(eigenvectors,1)) do j=1,N_det ! Select at least n_states states with S^2 values closed to "expected_s2" - if(dabs(s2-expected_s2).le.0.5d0)then + if(dabs(s2_eigvalues(j)-expected_s2).le.0.5d0)then i_state += 1 index_good_state_array(i_state) = j good_state_array(j) = .True. diff --git a/src/Determinants/davidson.irp.f b/src/Determinants/davidson.irp.f index b751bcbc..2d7b32bf 100644 --- a/src/Determinants/davidson.irp.f +++ b/src/Determinants/davidson.irp.f @@ -327,7 +327,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun integer :: k_pairs, kl integer :: iter2 - double precision, allocatable :: W(:,:,:), U(:,:,:), R(:,:), Wt(:) + double precision, allocatable :: W(:,:,:), U(:,:,:), R(:,:) double precision, allocatable :: y(:,:,:,:), h(:,:,:,:), lambda(:) double precision :: diag_h_mat_elem double precision :: residual_norm(N_st) @@ -335,7 +335,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun double precision :: to_print(2,N_st) double precision :: cpu, wall - !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: U, W, R, Wt, y, h, lambda + !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: U, W, R, y, h, lambda call write_time(iunit) @@ -369,10 +369,9 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun allocate( & kl_pairs(2,N_st*(N_st+1)/2), & - W(sze_8,N_st,davidson_sze_max), & - Wt(sze), & - U(sze_8,N_st,davidson_sze_max), & - R(sze_8,N_st), & + W(sze_8,N_st,davidson_sze_max), & + U(sze_8,N_st,davidson_sze_max), & + R(sze_8,N_st), & h(N_st,davidson_sze_max,N_st,davidson_sze_max), & y(N_st,davidson_sze_max,N_st,davidson_sze_max), & lambda(N_st*davidson_sze_max)) @@ -612,7 +611,6 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun deallocate ( & kl_pairs, & W, & - Wt, & U, & R, & h, & From cc947afc89eedcb49e4e2542c1d24fba8106b843 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sat, 17 Sep 2016 23:33:06 +0200 Subject: [PATCH 111/216] Corrected PT2 for MRCC --- plugins/MRCC_Utils/H_apply.irp.f | 2 +- plugins/MRCC_Utils/NEEDED_CHILDREN_MODULES | 2 +- plugins/MRCC_Utils/mrcc_utils.irp.f | 12 +- plugins/mrcepa0/mrcepa0_general.irp.f | 177 +++++++++++++++------ src/Determinants/slater_rules.irp.f | 8 + 5 files changed, 142 insertions(+), 59 deletions(-) diff --git a/plugins/MRCC_Utils/H_apply.irp.f b/plugins/MRCC_Utils/H_apply.irp.f index 0874e584..4d8964bf 100644 --- a/plugins/MRCC_Utils/H_apply.irp.f +++ b/plugins/MRCC_Utils/H_apply.irp.f @@ -32,7 +32,7 @@ s.unset_openmp() print s s = H_apply_zmq("mrcepa_PT2") -s.energy = "psi_ref_energy_diagonalized" +s.energy = "psi_energy" s.set_perturbation("epstein_nesbet_2x2") s.unset_openmp() print s diff --git a/plugins/MRCC_Utils/NEEDED_CHILDREN_MODULES b/plugins/MRCC_Utils/NEEDED_CHILDREN_MODULES index 7392852a..801d2f51 100644 --- a/plugins/MRCC_Utils/NEEDED_CHILDREN_MODULES +++ b/plugins/MRCC_Utils/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Perturbation Selectors_full Generators_full Psiref_Utils Psiref_CAS +Perturbation Selectors_full Generators_full Psiref_Utils Psiref_CAS diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 2304e39b..9c638845 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -7,7 +7,7 @@ END_PROVIDER BEGIN_PROVIDER [ double precision, lambda_mrcc, (N_states, N_det_non_ref) ] &BEGIN_PROVIDER [ integer, lambda_mrcc_pt2, (0:psi_det_size) ] -&BEGIN_PROVIDER [ integer, lambda_mrcc_pt3, (0:psi_det_size) ] +&BEGIN_PROVIDER [ integer, lambda_mrcc_kept, (0:psi_det_size) ] implicit none BEGIN_DOC ! cm/ or perturbative 1/Delta_E(m) @@ -23,7 +23,7 @@ END_PROVIDER N_lambda_mrcc_pt2 = 0 N_lambda_mrcc_pt3 = 0 lambda_mrcc_pt2(0) = 0 - lambda_mrcc_pt3(0) = 0 + lambda_mrcc_kept(0) = 0 do i=1,N_det_non_ref call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef, N_int, N_det_ref,& @@ -36,6 +36,7 @@ END_PROVIDER lambda_mrcc(k,i) = min(-1.d-32,psi_non_ref_coef(i,k)/ihpsi_current(k) ) lambda_pert = 1.d0 / (psi_ref_energy_diagonalized(k)-hii) if (lambda_pert / lambda_mrcc(k,i) < 0.5d0) then + ! Ignore lamdba i_pert_count += 1 lambda_mrcc(k,i) = 0.d0 if (lambda_mrcc_pt2(N_lambda_mrcc_pt2) /= i) then @@ -43,15 +44,16 @@ END_PROVIDER lambda_mrcc_pt2(N_lambda_mrcc_pt2) = i endif else - if (lambda_mrcc_pt3(N_lambda_mrcc_pt3) /= i) then + ! Keep lamdba + if (lambda_mrcc_kept(N_lambda_mrcc_pt3) /= i) then N_lambda_mrcc_pt3 += 1 - lambda_mrcc_pt3(N_lambda_mrcc_pt3) = i + lambda_mrcc_kept(N_lambda_mrcc_pt3) = i endif endif enddo enddo lambda_mrcc_pt2(0) = N_lambda_mrcc_pt2 - lambda_mrcc_pt3(0) = N_lambda_mrcc_pt3 + lambda_mrcc_kept(0) = N_lambda_mrcc_pt3 print*,'N_det_non_ref = ',N_det_non_ref print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) print*,'lambda max = ',maxval(dabs(lambda_mrcc)) diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index 4d0c41c9..b82bc613 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -59,49 +59,89 @@ subroutine run(N_st,energy) end -subroutine run_pt2(N_st,energy) +subroutine print_cas_coefs + implicit none + + integer :: i,j + print *, 'CAS' + print *, '===' + do i=1,N_det_cas + print *, psi_cas_coef(i,:) + call debug_det(psi_cas(1,1,i),N_int) + enddo + call write_double(6,ci_energy(1),"Initial CI energy") + +end + + + + +subroutine run_pt2_old(N_st,energy) implicit none integer :: i,j,k - double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) integer, intent(in) :: N_st double precision, intent(in) :: energy(N_st) - double precision :: pt3(N_st) - allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st)) - pt2 = 0.d0 - pt3 = 0d0 + double precision :: pt2_redundant(N_st), pt2(N_st) + double precision :: norm_pert(N_st),H_pert_diag(N_st) + + pt2_redundant = 0.d0 + pt2 = 0d0 !if(lambda_mrcc_pt2(0) == 0) return print*,'Last iteration only to compute the PT2' - threshold_selectors = 1.d0 - threshold_generators = 0.999d0 - - N_det_generators = lambda_mrcc_pt3(0) - N_det_selectors = lambda_mrcc_pt3(0) - -! psi_det_generators(:,:,:N_det_ref) = psi_ref(:,:,:N_det_ref) -! psi_selectors(:,:,:N_det_ref) = psi_ref(:,:,:N_det_ref) -! psi_coef_generators(:N_det_ref,:) = psi_ref_coef(:N_det_ref,:) -! psi_selectors_coef(:N_det_ref,:) = psi_ref_coef(:N_det_ref,:) - - do i=1,N_det_generators - j = lambda_mrcc_pt3(i) - do k=1,N_int - psi_det_generators(k,1,i) = psi_non_ref(k,1,j) - psi_det_generators(k,2,i) = psi_non_ref(k,2,j) - psi_selectors(k,1,i) = psi_non_ref(k,1,j) - psi_selectors(k,2,i) = psi_non_ref(k,2,j) + print * ,'Computing the redundant PT2 contribution' + + if (mrmode == 1) then + + N_det_generators = lambda_mrcc_kept(0) + N_det_selectors = lambda_mrcc_kept(0) + + do i=1,N_det_generators + j = lambda_mrcc_kept(i) + do k=1,N_int + psi_det_generators(k,1,i) = psi_non_ref(k,1,j) + psi_det_generators(k,2,i) = psi_non_ref(k,2,j) + psi_selectors(k,1,i) = psi_non_ref(k,1,j) + psi_selectors(k,2,i) = psi_non_ref(k,2,j) + enddo + do k=1,N_st + psi_coef_generators(i,k) = psi_non_ref_coef(j,k) + psi_selectors_coef(i,k) = psi_non_ref_coef(j,k) + enddo enddo - do k=1,N_st - psi_coef_generators(i,k) = psi_non_ref_coef(j,k) - psi_selectors_coef(i,k) = psi_non_ref_coef(j,k) + + else + + N_det_generators = N_det_non_ref + N_det_selectors = N_det_non_ref + + do i=1,N_det_generators + j = i + do k=1,N_int + psi_det_generators(k,1,i) = psi_non_ref(k,1,j) + psi_det_generators(k,2,i) = psi_non_ref(k,2,j) + psi_selectors(k,1,i) = psi_non_ref(k,1,j) + psi_selectors(k,2,i) = psi_non_ref(k,2,j) + enddo + do k=1,N_st + psi_coef_generators(i,k) = psi_non_ref_coef(j,k) + psi_selectors_coef(i,k) = psi_non_ref_coef(j,k) + enddo enddo - enddo + + endif SOFT_TOUCH N_det_selectors psi_selectors_coef psi_selectors N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed - SOFT_TOUCH psi_ref_coef_diagonalized psi_ref_energy_diagonalized! psi_coef_energy_diagonalized - call H_apply_mrcepa_PT2(pt2, norm_pert, H_pert_diag, N_st) + SOFT_TOUCH psi_ref_coef_diagonalized psi_ref_energy_diagonalized + + call H_apply_mrcepa_PT2(pt2_redundant, norm_pert, H_pert_diag, N_st) + print * ,'Computing the remaining contribution' + + threshold_selectors = 1.d0 + threshold_generators = 0.999d0 + N_det_generators = N_det_non_ref + N_det_ref N_det_selectors = N_det_non_ref + N_det_ref @@ -125,17 +165,15 @@ subroutine run_pt2(N_st,energy) enddo SOFT_TOUCH N_det_selectors psi_selectors_coef psi_selectors N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed - SOFT_TOUCH psi_ref_coef_diagonalized psi_ref_energy_diagonalized! psi_coef_energy_diagonalized - call H_apply_mrcepa_PT2(pt3, norm_pert, H_pert_diag, N_st) + SOFT_TOUCH psi_ref_coef_diagonalized psi_ref_energy_diagonalized + + call H_apply_mrcepa_PT2(pt2, norm_pert, H_pert_diag, N_st) -!!!!!!!!!!!!!!!! - - - - print *, "3-2 :",pt3, pt2 - print *, lambda_mrcc_pt3(0), N_det, N_det_ref, psi_coef(1,1), psi_ref_coef(1,1) - pt2 = pt3 - pt2 + print *, "Redundant PT2 :",pt2_redundant + print *, "Full PT2 :",pt2 + print *, lambda_mrcc_kept(0), N_det, N_det_ref, psi_coef(1,1), psi_ref_coef(1,1) + pt2 = pt2 - pt2_redundant print *, 'Final step' print *, 'N_det = ', N_det @@ -146,24 +184,59 @@ subroutine run_pt2(N_st,energy) print *, '-----' - call ezfio_set_full_ci_energy_pt2(energy+pt2) - deallocate(pt2,norm_pert) +! call ezfio_set_full_ci_energy_pt2(energy+pt2) end +subroutine run_pt2(N_st,energy) + implicit none + integer :: i,j,k + integer, intent(in) :: N_st + double precision, intent(in) :: energy(N_st) + double precision :: pt2(N_st) + double precision :: norm_pert(N_st),H_pert_diag(N_st) + + pt2 = 0d0 + !if(lambda_mrcc_pt2(0) == 0) return + + print*,'Last iteration only to compute the PT2' + + N_det_generators = N_det_cas + N_det_selectors = N_det_non_ref -subroutine print_cas_coefs - implicit none - - integer :: i,j - print *, 'CAS' - print *, '===' - do i=1,N_det_cas - print *, psi_cas_coef(i,:) - call debug_det(psi_cas(1,1,i),N_int) + do i=1,N_det_generators + do k=1,N_int + psi_det_generators(k,1,i) = psi_ref(k,1,i) + psi_det_generators(k,2,i) = psi_ref(k,2,i) + enddo + do k=1,N_st + psi_coef_generators(i,k) = psi_ref_coef(i,k) + enddo + enddo + do i=1,N_det + do k=1,N_int + psi_selectors(k,1,i) = psi_det_sorted(k,1,i) + psi_selectors(k,2,i) = psi_det_sorted(k,2,i) + enddo + do k=1,N_st + psi_selectors_coef(i,k) = psi_coef_sorted(i,k) + enddo enddo - call write_double(6,ci_energy(1),"Initial CI energy") -end + SOFT_TOUCH N_det_selectors psi_selectors_coef psi_selectors N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed + SOFT_TOUCH psi_ref_coef_diagonalized psi_ref_energy_diagonalized + call H_apply_mrcepa_PT2(pt2, norm_pert, H_pert_diag, N_st) + +! call ezfio_set_full_ci_energy_pt2(energy+pt2) + + print *, 'Final step' + print *, 'N_det = ', N_det + print *, 'N_states = ', N_states + print *, 'PT2 = ', pt2 + print *, 'E = ', energy + print *, 'E+PT2 = ', energy+pt2 + print *, '-----' + +end diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index 5e27253a..6e0da7b2 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -1935,3 +1935,11 @@ subroutine get_phase(key1,key2,phase,Nint) !DIR$ FORCEINLINE call get_excitation(key1, key2, exc, degree, phase, Nint) end + +BEGIN_PROVIDER [ double precision, psi_energy, (N_states) ] + implicit none + BEGIN_DOC +! Energy of the current wave function + END_DOC + call u_0_H_u_0_nstates(psi_energy,psi_coef,N_det,psi_det,N_int,N_states,psi_det_size) +END_PROVIDER From 7c2ed4214ed0f387357d762fb50a90588445e5ec Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 18 Sep 2016 00:33:19 +0200 Subject: [PATCH 112/216] Corrected S2 for MRCC --- plugins/MRCC_Utils/davidson.irp.f | 7 ++++--- plugins/MRCC_Utils/mrcc_utils.irp.f | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index 746fef7a..ece34dee 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -404,14 +404,14 @@ subroutine u_0_H_u_0_mrcc_nstates(e_0,u_0,n,keys_tmp,Nint,istate,N_st,sze_8) END_DOC integer, intent(in) :: n,Nint,N_st,sze_8 double precision, intent(out) :: e_0(N_st) - double precision, intent(in) :: u_0(n,N_st) + double precision, intent(in) :: u_0(sze_8,N_st) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) integer,intent(in) :: istate - double precision :: H_jj(n) - double precision :: v_0(n,N_st) + double precision, allocatable :: v_0(:,:), H_jj(:) double precision :: u_dot_u,u_dot_v,diag_H_mat_elem integer :: i,j + allocate(H_jj(n), v_0(sze_8,N_st)) do i = 1, n H_jj(i) = diag_H_mat_elem(keys_tmp(1,1,i),Nint) enddo @@ -424,6 +424,7 @@ subroutine u_0_H_u_0_mrcc_nstates(e_0,u_0,n,keys_tmp,Nint,istate,N_st,sze_8) do i=1,N_st e_0(i) = u_dot_v(v_0(1,i),u_0(1,i),n)/u_dot_u(u_0(1,i),n) enddo + deallocate(H_jj, v_0) end diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 9c638845..c2f57369 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -246,7 +246,7 @@ END_PROVIDER psi_coef(i,j) = CI_eigenvectors_dressed(i,j) enddo enddo - call u_0_H_u_0_nstates(e_array,psi_coef,n_det,psi_det,N_int,N_states_diag,psi_det_size) + call u_0_H_u_0_mrcc_nstates(e_array,psi_coef,n_det,psi_det,N_int,mrcc_state,N_states_diag,psi_det_size) ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value ! closer to the "expected_s2" set as input From c99b0cb2999ee2da0928c9f2fa447b96cc63d6c1 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 20 Sep 2016 09:49:20 +0200 Subject: [PATCH 113/216] Missing empty lines at end of basis sets --- data/basis/aug-cc-pcv5z | 2 ++ data/basis/aug-cc-pcvdz | 2 ++ data/basis/aug-cc-pcvqz | 2 ++ data/basis/aug-cc-pcvtz | 2 ++ data/basis/aug-cc-pv5z | 2 ++ data/basis/aug-cc-pv6z | 2 ++ data/basis/aug-cc-pvdz | 2 ++ data/basis/aug-cc-pvqz | 2 ++ data/basis/aug-cc-pvtz | 2 ++ data/basis/cc-pcv5z | 2 ++ data/basis/cc-pcv6z | 2 ++ data/basis/cc-pcvdz | 2 ++ data/basis/cc-pcvqz | 2 ++ data/basis/cc-pcvtz | 2 ++ data/basis/cc-pv5z | 2 ++ data/basis/cc-pv6z | 2 ++ data/basis/cc-pvdz | 2 ++ data/basis/cc-pvqz | 2 ++ data/basis/cc-pvtz | 2 ++ data/basis/chipman-dzp | 2 ++ data/basis/v5z-bfd | 2 ++ data/basis/vdz-ano-bfd | 2 ++ data/basis/vdz-bfd | 2 ++ data/basis/vqz-ano-bfd | 2 ++ data/basis/vqz-bfd | 2 ++ data/basis/vtz-ano-bfd | 2 ++ data/basis/vtz-bfd | 2 ++ 27 files changed, 54 insertions(+) diff --git a/data/basis/aug-cc-pcv5z b/data/basis/aug-cc-pcv5z index b2f69a7f..e7690eda 100644 --- a/data/basis/aug-cc-pcv5z +++ b/data/basis/aug-cc-pcv5z @@ -705,3 +705,5 @@ H 1 1 21.1040000 1.0000000 H 1 1 0.7420000 1.0000000 + + diff --git a/data/basis/aug-cc-pcvdz b/data/basis/aug-cc-pcvdz index 91e05234..21e387d3 100644 --- a/data/basis/aug-cc-pcvdz +++ b/data/basis/aug-cc-pcvdz @@ -893,3 +893,5 @@ D 1 1 11.4590000 1.0000000 D 1 1 0.2400000 1.0000000 + + diff --git a/data/basis/aug-cc-pcvqz b/data/basis/aug-cc-pcvqz index b51cdb26..ccffc20e 100644 --- a/data/basis/aug-cc-pcvqz +++ b/data/basis/aug-cc-pcvqz @@ -1594,3 +1594,5 @@ G 1 1 17.2430000 1.0000000 G 1 1 0.4590000 1.0000000 + + diff --git a/data/basis/aug-cc-pcvtz b/data/basis/aug-cc-pcvtz index 0d918bdb..bab856a3 100644 --- a/data/basis/aug-cc-pcvtz +++ b/data/basis/aug-cc-pcvtz @@ -1224,3 +1224,5 @@ F 1 1 13.6740000 1.0000000 F 1 1 0.4060000 1.0000000 + + diff --git a/data/basis/aug-cc-pv5z b/data/basis/aug-cc-pv5z index 50d2cab2..f069ed87 100644 --- a/data/basis/aug-cc-pv5z +++ b/data/basis/aug-cc-pv5z @@ -7065,3 +7065,5 @@ H 1 1 0.9303000 1.0000000 H 1 1 0.5800000 1.0000000 + + diff --git a/data/basis/aug-cc-pv6z b/data/basis/aug-cc-pv6z index b041e85e..7b1ae494 100644 --- a/data/basis/aug-cc-pv6z +++ b/data/basis/aug-cc-pv6z @@ -1515,3 +1515,5 @@ I 1 1 1.5066000 1.0000000 I 1 1 0.9926000 1.0000000 + + diff --git a/data/basis/aug-cc-pvdz b/data/basis/aug-cc-pvdz index 9ea395a2..6ba22f17 100644 --- a/data/basis/aug-cc-pvdz +++ b/data/basis/aug-cc-pvdz @@ -3485,3 +3485,5 @@ D 1 1 0.5030000 1.0000000 D 1 1 0.2155000 1.0000000 + + diff --git a/data/basis/aug-cc-pvqz b/data/basis/aug-cc-pvqz index ee6500f7..5539c11d 100644 --- a/data/basis/aug-cc-pvqz +++ b/data/basis/aug-cc-pvqz @@ -5685,3 +5685,5 @@ G 1 1 0.7395000 1.0000000 G 1 1 0.3590000 1.0000000 + + diff --git a/data/basis/aug-cc-pvtz b/data/basis/aug-cc-pvtz index 347d7acd..b9d1788f 100644 --- a/data/basis/aug-cc-pvtz +++ b/data/basis/aug-cc-pvtz @@ -4421,3 +4421,5 @@ F 1 1 0.6622000 1.0000000 F 1 1 0.3280000 1.0000000 + + diff --git a/data/basis/cc-pcv5z b/data/basis/cc-pcv5z index 268ec7b1..b46f1e0e 100644 --- a/data/basis/cc-pcv5z +++ b/data/basis/cc-pcv5z @@ -1614,3 +1614,5 @@ G 1 1 0.3023000 1.0000000 H 1 1 0.2534000 1.0000000 + + diff --git a/data/basis/cc-pcv6z b/data/basis/cc-pcv6z index 24be7b59..73d5f29f 100644 --- a/data/basis/cc-pcv6z +++ b/data/basis/cc-pcv6z @@ -1515,3 +1515,5 @@ I 1 1 1.5066000 1.0000000 I 1 1 24.5369000 1.0000000 + + diff --git a/data/basis/cc-pcvdz b/data/basis/cc-pcvdz index aee98b83..9c28d870 100644 --- a/data/basis/cc-pcvdz +++ b/data/basis/cc-pcvdz @@ -905,3 +905,5 @@ D 1 1 0.0537000 1.0000000 D 1 1 1.3743000 1.0000000 + + diff --git a/data/basis/cc-pcvqz b/data/basis/cc-pcvqz index 4534ab01..da85c7f1 100644 --- a/data/basis/cc-pcvqz +++ b/data/basis/cc-pcvqz @@ -1611,3 +1611,5 @@ G 1 1 0.1466000 1.0000000 G 1 1 1.5908000 1.0000000 + + diff --git a/data/basis/cc-pcvtz b/data/basis/cc-pcvtz index 3338e531..650c3962 100644 --- a/data/basis/cc-pcvtz +++ b/data/basis/cc-pcvtz @@ -1246,3 +1246,5 @@ F 1 1 0.1509000 1.0000000 F 1 1 1.3909000 1.0000000 + + diff --git a/data/basis/cc-pv5z b/data/basis/cc-pv5z index 39869ff5..6900f274 100644 --- a/data/basis/cc-pv5z +++ b/data/basis/cc-pv5z @@ -7212,3 +7212,5 @@ G 1 1 1.1040000 1.0000000 H 1 1 0.9303000 1.0000000 + + diff --git a/data/basis/cc-pv6z b/data/basis/cc-pv6z index f850752f..53f322ca 100644 --- a/data/basis/cc-pv6z +++ b/data/basis/cc-pv6z @@ -1323,3 +1323,5 @@ H 1 1 0.8871000 1.0000000 I 1 1 1.5066000 1.0000000 + + diff --git a/data/basis/cc-pvdz b/data/basis/cc-pvdz index 18eea48d..1685d42d 100644 --- a/data/basis/cc-pvdz +++ b/data/basis/cc-pvdz @@ -3367,3 +3367,5 @@ D 5 5 1.5075240 0.2667560 D 1 1 0.5030000 1.0000000 + + diff --git a/data/basis/cc-pvqz b/data/basis/cc-pvqz index 2fff4854..f7575ab7 100644 --- a/data/basis/cc-pvqz +++ b/data/basis/cc-pvqz @@ -5482,3 +5482,5 @@ F 1 1 0.9557000 1.0000000 G 1 1 0.7395000 1.0000000 + + diff --git a/data/basis/cc-pvtz b/data/basis/cc-pvtz index 332a7ec8..6e4c326c 100644 --- a/data/basis/cc-pvtz +++ b/data/basis/cc-pvtz @@ -4269,3 +4269,5 @@ D 1 1 0.3006000 1.0000000 F 1 1 0.6622000 1.0000000 + + diff --git a/data/basis/chipman-dzp b/data/basis/chipman-dzp index b0178ef4..f7410dd8 100644 --- a/data/basis/chipman-dzp +++ b/data/basis/chipman-dzp @@ -166,3 +166,5 @@ D 1 1 0.6650000 1.0000000 D 1 1 2.6600000 1.0000000 + + diff --git a/data/basis/v5z-bfd b/data/basis/v5z-bfd index c7533e9b..0afd2bfc 100644 --- a/data/basis/v5z-bfd +++ b/data/basis/v5z-bfd @@ -1017,3 +1017,5 @@ F 1 G 1 1 0.623669 1.000000 + + diff --git a/data/basis/vdz-ano-bfd b/data/basis/vdz-ano-bfd index 1adef6a1..f43040af 100644 --- a/data/basis/vdz-ano-bfd +++ b/data/basis/vdz-ano-bfd @@ -586,3 +586,5 @@ S 1 P 1 1 1.275000 1.000000 + + diff --git a/data/basis/vdz-bfd b/data/basis/vdz-bfd index 7d3ebb94..8ec29ffe 100644 --- a/data/basis/vdz-bfd +++ b/data/basis/vdz-bfd @@ -997,3 +997,5 @@ P 8 7 9.063386 -0.224631 8 16.737180 0.098422 + + diff --git a/data/basis/vqz-ano-bfd b/data/basis/vqz-ano-bfd index 3b38b145..ea1f38b9 100644 --- a/data/basis/vqz-ano-bfd +++ b/data/basis/vqz-ano-bfd @@ -2409,3 +2409,5 @@ G 1 H 1 1 3.164456 1.000000 + + diff --git a/data/basis/vqz-bfd b/data/basis/vqz-bfd index 5e1dd1f8..b0fc8d65 100644 --- a/data/basis/vqz-bfd +++ b/data/basis/vqz-bfd @@ -809,3 +809,5 @@ D 1 F 1 1 1.021427 1.000000 + + diff --git a/data/basis/vtz-ano-bfd b/data/basis/vtz-ano-bfd index a0e873c3..f6916f58 100644 --- a/data/basis/vtz-ano-bfd +++ b/data/basis/vtz-ano-bfd @@ -1850,3 +1850,5 @@ F 1 G 1 1 2.775762 1.000000 + + diff --git a/data/basis/vtz-bfd b/data/basis/vtz-bfd index 0b6bb3f4..2091118e 100644 --- a/data/basis/vtz-bfd +++ b/data/basis/vtz-bfd @@ -1279,3 +1279,5 @@ P 1 D 1 1 1.913792 1.000000 + + From 98059e87f5a630dc26ef4cbe5102ce049fa6d76f Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 20 Sep 2016 17:29:02 +0200 Subject: [PATCH 114/216] Extracting davidson from slater rules --- config/ifort.cfg | 2 +- plugins/All_singles/NEEDED_CHILDREN_MODULES | 2 +- plugins/CAS_SD/NEEDED_CHILDREN_MODULES | 2 +- plugins/CID/NEEDED_CHILDREN_MODULES | 2 +- plugins/CIS/NEEDED_CHILDREN_MODULES | 2 +- plugins/CISD/NEEDED_CHILDREN_MODULES | 2 +- plugins/Casino/NEEDED_CHILDREN_MODULES | 2 +- plugins/DDCI_selected/NEEDED_CHILDREN_MODULES | 2 +- plugins/FCIdump/NEEDED_CHILDREN_MODULES | 2 +- plugins/FOBOCI/NEEDED_CHILDREN_MODULES | 2 +- plugins/Full_CI/H_apply.irp.f | 22 -- plugins/Full_CI/NEEDED_CHILDREN_MODULES | 2 +- plugins/Perturbation/NEEDED_CHILDREN_MODULES | 2 +- .../Perturbation/delta_rho_perturbation.irp.f | 77 ------- plugins/Psiref_CAS/NEEDED_CHILDREN_MODULES | 2 +- plugins/QmcChem/NEEDED_CHILDREN_MODULES | 2 +- src/Davidson/davidson.irp.f | 3 + .../diagonalization.irp.f} | 65 +----- .../diagonalize_CI.irp.f | 16 -- .../diagonalize_CI_SC2.irp.f | 0 .../diagonalize_CI_mono.irp.f | 0 src/Davidson/parameters.irp.f | 62 ++++++ src/Davidson/u0Hu0.irp.f | 190 ++++++++++++++++++ src/Determinants/determinants.irp.f | 19 +- src/Determinants/s2.irp.f | 2 +- src/Determinants/slater_rules.irp.f | 189 ----------------- 26 files changed, 291 insertions(+), 382 deletions(-) delete mode 100644 plugins/Perturbation/delta_rho_perturbation.irp.f create mode 100644 src/Davidson/davidson.irp.f rename src/{Determinants/davidson.irp.f => Davidson/diagonalization.irp.f} (89%) rename src/{Determinants => Davidson}/diagonalize_CI.irp.f (96%) rename src/{Determinants => Davidson}/diagonalize_CI_SC2.irp.f (100%) rename src/{Determinants => Davidson}/diagonalize_CI_mono.irp.f (100%) create mode 100644 src/Davidson/parameters.irp.f create mode 100644 src/Davidson/u0Hu0.irp.f diff --git a/config/ifort.cfg b/config/ifort.cfg index b04506d4..255438cc 100644 --- a/config/ifort.cfg +++ b/config/ifort.cfg @@ -32,7 +32,7 @@ OPENMP : 1 ; Append OpenMP flags # [OPT] FC : -traceback -FCFLAGS : -xHost -O2 -ip -ftz -g +FCFLAGS : -xHost -O0 -ip -ftz -g # Profiling flags ################# diff --git a/plugins/All_singles/NEEDED_CHILDREN_MODULES b/plugins/All_singles/NEEDED_CHILDREN_MODULES index bb97ddb9..ee0ff040 100644 --- a/plugins/All_singles/NEEDED_CHILDREN_MODULES +++ b/plugins/All_singles/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Generators_restart Perturbation Properties Selectors_no_sorted Utils +Generators_restart Perturbation Properties Selectors_no_sorted Utils Davidson diff --git a/plugins/CAS_SD/NEEDED_CHILDREN_MODULES b/plugins/CAS_SD/NEEDED_CHILDREN_MODULES index f7264a0f..0b7ce8a9 100644 --- a/plugins/CAS_SD/NEEDED_CHILDREN_MODULES +++ b/plugins/CAS_SD/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Perturbation Selectors_full Generators_CAS +Perturbation Selectors_full Generators_CAS Davidson diff --git a/plugins/CID/NEEDED_CHILDREN_MODULES b/plugins/CID/NEEDED_CHILDREN_MODULES index afc8cfd4..1632a44d 100644 --- a/plugins/CID/NEEDED_CHILDREN_MODULES +++ b/plugins/CID/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Selectors_full SingleRefMethod +Selectors_full SingleRefMethod Davidson diff --git a/plugins/CIS/NEEDED_CHILDREN_MODULES b/plugins/CIS/NEEDED_CHILDREN_MODULES index afc8cfd4..1632a44d 100644 --- a/plugins/CIS/NEEDED_CHILDREN_MODULES +++ b/plugins/CIS/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Selectors_full SingleRefMethod +Selectors_full SingleRefMethod Davidson diff --git a/plugins/CISD/NEEDED_CHILDREN_MODULES b/plugins/CISD/NEEDED_CHILDREN_MODULES index afc8cfd4..1632a44d 100644 --- a/plugins/CISD/NEEDED_CHILDREN_MODULES +++ b/plugins/CISD/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Selectors_full SingleRefMethod +Selectors_full SingleRefMethod Davidson diff --git a/plugins/Casino/NEEDED_CHILDREN_MODULES b/plugins/Casino/NEEDED_CHILDREN_MODULES index aae89501..34de8ddb 100644 --- a/plugins/Casino/NEEDED_CHILDREN_MODULES +++ b/plugins/Casino/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Determinants +Determinants Davidson diff --git a/plugins/DDCI_selected/NEEDED_CHILDREN_MODULES b/plugins/DDCI_selected/NEEDED_CHILDREN_MODULES index f7264a0f..0b7ce8a9 100644 --- a/plugins/DDCI_selected/NEEDED_CHILDREN_MODULES +++ b/plugins/DDCI_selected/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Perturbation Selectors_full Generators_CAS +Perturbation Selectors_full Generators_CAS Davidson diff --git a/plugins/FCIdump/NEEDED_CHILDREN_MODULES b/plugins/FCIdump/NEEDED_CHILDREN_MODULES index aae89501..34de8ddb 100644 --- a/plugins/FCIdump/NEEDED_CHILDREN_MODULES +++ b/plugins/FCIdump/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Determinants +Determinants Davidson diff --git a/plugins/FOBOCI/NEEDED_CHILDREN_MODULES b/plugins/FOBOCI/NEEDED_CHILDREN_MODULES index f6c0c1c4..e40934be 100644 --- a/plugins/FOBOCI/NEEDED_CHILDREN_MODULES +++ b/plugins/FOBOCI/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Perturbation Selectors_no_sorted Hartree_Fock +Perturbation Selectors_no_sorted Hartree_Fock Davidson diff --git a/plugins/Full_CI/H_apply.irp.f b/plugins/Full_CI/H_apply.irp.f index 596c947a..9e22b965 100644 --- a/plugins/Full_CI/H_apply.irp.f +++ b/plugins/Full_CI/H_apply.irp.f @@ -30,28 +30,6 @@ s.unset_openmp() print s -s = H_apply("select_mono_delta_rho") -s.unset_double_excitations() -s.set_selection_pt2("delta_rho_one_point") -s.unset_openmp() -print s - -s = H_apply("pt2_mono_delta_rho") -s.unset_double_excitations() -s.set_perturbation("delta_rho_one_point") -s.unset_openmp() -print s - -s = H_apply("select_mono_di_delta_rho") -s.set_selection_pt2("delta_rho_one_point") -s.unset_openmp() -print s - -s = H_apply("pt2_mono_di_delta_rho") -s.set_perturbation("delta_rho_one_point") -s.unset_openmp() -print s - END_SHELL diff --git a/plugins/Full_CI/NEEDED_CHILDREN_MODULES b/plugins/Full_CI/NEEDED_CHILDREN_MODULES index 04ce9e78..ad5f053f 100644 --- a/plugins/Full_CI/NEEDED_CHILDREN_MODULES +++ b/plugins/Full_CI/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Perturbation Selectors_full Generators_full +Perturbation Selectors_full Generators_full Davidson diff --git a/plugins/Perturbation/NEEDED_CHILDREN_MODULES b/plugins/Perturbation/NEEDED_CHILDREN_MODULES index e29a6721..eba3650e 100644 --- a/plugins/Perturbation/NEEDED_CHILDREN_MODULES +++ b/plugins/Perturbation/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Properties Hartree_Fock +Properties Hartree_Fock Davidson diff --git a/plugins/Perturbation/delta_rho_perturbation.irp.f b/plugins/Perturbation/delta_rho_perturbation.irp.f deleted file mode 100644 index c95972a6..00000000 --- a/plugins/Perturbation/delta_rho_perturbation.irp.f +++ /dev/null @@ -1,77 +0,0 @@ -subroutine pt2_delta_rho_one_point(det_pert,c_pert,e_2_pert,H_pert_diag,Nint,ndet,n_st,minilist,idx_minilist,N_minilist) - use bitmasks - implicit none - integer, intent(in) :: Nint,ndet,n_st - integer(bit_kind), intent(in) :: det_pert(Nint,2) - double precision , intent(out) :: c_pert(n_st),e_2_pert(n_st),H_pert_diag(N_st) - double precision :: i_O1_psi_array(N_st) - double precision :: i_H_psi_array(N_st) - - integer, intent(in) :: N_minilist - integer, intent(in) :: idx_minilist(0:N_det_selectors) - integer(bit_kind), intent(in) :: minilist(Nint,2,N_det_selectors) - - BEGIN_DOC - ! compute the perturbatibe contribution to the Integrated Spin density at z = z_one point of one determinant - ! - ! for the various n_st states, at various level of theory. - ! - ! c_pert(i) = /( - ) - ! - ! e_2_pert(i) = c_pert(i) * - ! - ! H_pert_diag(i) = c_pert(i)^2 * - ! - ! To get the contribution of the first order : - ! - ! = sum(over i) e_2_pert(i) - ! - ! To get the contribution of the diagonal elements of the second order : - ! - ! [ + + sum(over i) H_pert_diag(i) ] / [1. + sum(over i) c_pert(i) **2] - ! - END_DOC - - integer :: i,j - double precision :: diag_H_mat_elem,diag_o1_mat_elem_alpha_beta - integer :: exc(0:2,2,2) - integer :: degree - double precision :: phase,delta_e,h,oii,diag_o1_mat_elem - integer :: h1,h2,p1,p2,s1,s2 - ASSERT (Nint == N_int) - ASSERT (Nint > 0) - -! call get_excitation_degree(HF_bitmask,det_pert,degree,N_int) -! if(degree.gt.degree_max_generators+1)then -! H_pert_diag = 0.d0 -! e_2_pert = 0.d0 -! c_pert = 0.d0 -! return -! endif - call i_O1_psi_alpha_beta(mo_integrated_delta_rho_one_point,det_pert,psi_selectors,psi_selectors_coef,Nint,N_det_selectors,psi_selectors_size,N_st,i_O1_psi_array) - - !call i_H_psi(det_pert,psi_selectors,psi_selectors_coef,Nint,N_det_selectors,psi_selectors_size,N_st,i_H_psi_array) - call i_H_psi_minilist(det_pert,minilist,idx_minilist,N_minilist,psi_selectors_coef,Nint,N_minilist,psi_selectors_size,N_st,i_H_psi_array) - - h = diag_H_mat_elem(det_pert,Nint) - oii = diag_O1_mat_elem_alpha_beta(mo_integrated_delta_rho_one_point,det_pert,N_int) - - - do i =1,N_st - if(CI_electronic_energy(i)>h.and.CI_electronic_energy(i).ne.0.d0)then - c_pert(i) = -1.d0 - e_2_pert(i) = selection_criterion*selection_criterion_factor*2.d0 - else if (dabs(CI_electronic_energy(i) - h) > 1.d-6) then - c_pert(i) = i_H_psi_array(i) / (CI_electronic_energy(i) - h) - e_2_pert(i) = c_pert(i) * (i_O1_psi_array(i)+i_O1_psi_array(i) ) + c_pert(i) * c_pert(i) * oii - H_pert_diag(i) = c_pert(i) * (i_O1_psi_array(i)+i_O1_psi_array(i) ) - else - c_pert(i) = -1.d0 - e_2_pert(i) = -dabs(i_H_psi_array(i)) - H_pert_diag(i) = c_pert(i) * i_O1_psi_array(i) - endif - enddo - - -end - diff --git a/plugins/Psiref_CAS/NEEDED_CHILDREN_MODULES b/plugins/Psiref_CAS/NEEDED_CHILDREN_MODULES index 7e790003..107c1643 100644 --- a/plugins/Psiref_CAS/NEEDED_CHILDREN_MODULES +++ b/plugins/Psiref_CAS/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Psiref_Utils +Psiref_Utils Davidson diff --git a/plugins/QmcChem/NEEDED_CHILDREN_MODULES b/plugins/QmcChem/NEEDED_CHILDREN_MODULES index aae89501..34de8ddb 100644 --- a/plugins/QmcChem/NEEDED_CHILDREN_MODULES +++ b/plugins/QmcChem/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Determinants +Determinants Davidson diff --git a/src/Davidson/davidson.irp.f b/src/Davidson/davidson.irp.f new file mode 100644 index 00000000..abe3b504 --- /dev/null +++ b/src/Davidson/davidson.irp.f @@ -0,0 +1,3 @@ +program davidson + stop 1 +end diff --git a/src/Determinants/davidson.irp.f b/src/Davidson/diagonalization.irp.f similarity index 89% rename from src/Determinants/davidson.irp.f rename to src/Davidson/diagonalization.irp.f index 2d7b32bf..8ece1c5c 100644 --- a/src/Determinants/davidson.irp.f +++ b/src/Davidson/diagonalization.irp.f @@ -1,20 +1,3 @@ -BEGIN_PROVIDER [ integer, davidson_iter_max ] - implicit none - BEGIN_DOC - ! Max number of Davidson iterations - END_DOC - davidson_iter_max = 100 -END_PROVIDER - -BEGIN_PROVIDER [ integer, davidson_sze_max ] - implicit none - BEGIN_DOC - ! Max number of Davidson sizes - END_DOC - ASSERT (davidson_sze_max <= davidson_iter_max) - davidson_sze_max = max(8,2*N_states_diag) -END_PROVIDER - subroutine davidson_diag(dets_in,u_in,energies,dim_in,sze,N_st,Nint,iunit) use bitmasks implicit none @@ -69,6 +52,9 @@ end logical function det_inf(key1, key2, Nint) use bitmasks implicit none + BEGIN_DOC +! Ordering function for determinants + END_DOC integer,intent(in) :: Nint integer(bit_kind),intent(in) :: key1(Nint, 2), key2(Nint, 2) integer :: i,j @@ -91,7 +77,6 @@ end function subroutine tamiser(key, idx, no, n, Nint, N_key) use bitmasks implicit none - BEGIN_DOC ! Uncodumented : TODO END_DOC @@ -619,47 +604,3 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun ) end -BEGIN_PROVIDER [ character(64), davidson_criterion ] - implicit none - BEGIN_DOC - ! Can be : [ energy | residual | both | wall_time | cpu_time | iterations ] - END_DOC - davidson_criterion = 'residual' -END_PROVIDER - -subroutine davidson_converged(energy,residual,wall,iterations,cpu,N_st,converged) - implicit none - BEGIN_DOC -! True if the Davidson algorithm is converged - END_DOC - integer, intent(in) :: N_st, iterations - logical, intent(out) :: converged - double precision, intent(in) :: energy(N_st), residual(N_st) - double precision, intent(in) :: wall, cpu - double precision :: E(N_st), time - double precision, allocatable, save :: energy_old(:) - - if (.not.allocated(energy_old)) then - allocate(energy_old(N_st)) - energy_old = 0.d0 - endif - - E = energy - energy_old - energy_old = energy - if (davidson_criterion == 'energy') then - converged = dabs(maxval(E(1:N_st))) < threshold_davidson - else if (davidson_criterion == 'residual') then - converged = dabs(maxval(residual(1:N_st))) < threshold_davidson - else if (davidson_criterion == 'both') then - converged = dabs(maxval(residual(1:N_st))) + dabs(maxval(E(1:N_st)) ) & - < threshold_davidson - else if (davidson_criterion == 'wall_time') then - call wall_time(time) - converged = time - wall > threshold_davidson - else if (davidson_criterion == 'cpu_time') then - call cpu_time(time) - converged = time - cpu > threshold_davidson - else if (davidson_criterion == 'iterations') then - converged = iterations >= int(threshold_davidson) - endif -end diff --git a/src/Determinants/diagonalize_CI.irp.f b/src/Davidson/diagonalize_CI.irp.f similarity index 96% rename from src/Determinants/diagonalize_CI.irp.f rename to src/Davidson/diagonalize_CI.irp.f index 58118461..07001902 100644 --- a/src/Determinants/diagonalize_CI.irp.f +++ b/src/Davidson/diagonalize_CI.irp.f @@ -1,19 +1,3 @@ -BEGIN_PROVIDER [ character*(64), diag_algorithm ] - implicit none - BEGIN_DOC - ! Diagonalization algorithm (Davidson or Lapack) - END_DOC - if (N_det > N_det_max_jacobi) then - diag_algorithm = "Davidson" - else - diag_algorithm = "Lapack" - endif - - if (N_det < N_states_diag) then - diag_algorithm = "Lapack" - endif - -END_PROVIDER BEGIN_PROVIDER [ double precision, CI_energy, (N_states_diag) ] implicit none diff --git a/src/Determinants/diagonalize_CI_SC2.irp.f b/src/Davidson/diagonalize_CI_SC2.irp.f similarity index 100% rename from src/Determinants/diagonalize_CI_SC2.irp.f rename to src/Davidson/diagonalize_CI_SC2.irp.f diff --git a/src/Determinants/diagonalize_CI_mono.irp.f b/src/Davidson/diagonalize_CI_mono.irp.f similarity index 100% rename from src/Determinants/diagonalize_CI_mono.irp.f rename to src/Davidson/diagonalize_CI_mono.irp.f diff --git a/src/Davidson/parameters.irp.f b/src/Davidson/parameters.irp.f new file mode 100644 index 00000000..66c500c3 --- /dev/null +++ b/src/Davidson/parameters.irp.f @@ -0,0 +1,62 @@ +BEGIN_PROVIDER [ integer, davidson_iter_max ] + implicit none + BEGIN_DOC + ! Max number of Davidson iterations + END_DOC + davidson_iter_max = 100 +END_PROVIDER + +BEGIN_PROVIDER [ integer, davidson_sze_max ] + implicit none + BEGIN_DOC + ! Max number of Davidson sizes + END_DOC + ASSERT (davidson_sze_max <= davidson_iter_max) + davidson_sze_max = max(8,2*N_states_diag) +END_PROVIDER + + +BEGIN_PROVIDER [ character(64), davidson_criterion ] + implicit none + BEGIN_DOC + ! Can be : [ energy | residual | both | wall_time | cpu_time | iterations ] + END_DOC + davidson_criterion = 'residual' +END_PROVIDER + +subroutine davidson_converged(energy,residual,wall,iterations,cpu,N_st,converged) + implicit none + BEGIN_DOC +! True if the Davidson algorithm is converged + END_DOC + integer, intent(in) :: N_st, iterations + logical, intent(out) :: converged + double precision, intent(in) :: energy(N_st), residual(N_st) + double precision, intent(in) :: wall, cpu + double precision :: E(N_st), time + double precision, allocatable, save :: energy_old(:) + + if (.not.allocated(energy_old)) then + allocate(energy_old(N_st)) + energy_old = 0.d0 + endif + + E = energy - energy_old + energy_old = energy + if (davidson_criterion == 'energy') then + converged = dabs(maxval(E(1:N_st))) < threshold_davidson + else if (davidson_criterion == 'residual') then + converged = dabs(maxval(residual(1:N_st))) < threshold_davidson + else if (davidson_criterion == 'both') then + converged = dabs(maxval(residual(1:N_st))) + dabs(maxval(E(1:N_st)) ) & + < threshold_davidson + else if (davidson_criterion == 'wall_time') then + call wall_time(time) + converged = time - wall > threshold_davidson + else if (davidson_criterion == 'cpu_time') then + call cpu_time(time) + converged = time - cpu > threshold_davidson + else if (davidson_criterion == 'iterations') then + converged = iterations >= int(threshold_davidson) + endif +end diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f new file mode 100644 index 00000000..0fd7e52e --- /dev/null +++ b/src/Davidson/u0Hu0.irp.f @@ -0,0 +1,190 @@ +subroutine u_0_H_u_0(e_0,u_0,n,keys_tmp,Nint) + use bitmasks + implicit none + BEGIN_DOC + ! Computes e_0 = / + ! + ! n : number of determinants + ! + END_DOC + integer, intent(in) :: n,Nint + double precision, intent(out) :: e_0 + double precision, intent(in) :: u_0(n) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + call u_0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,1,n) +end + +subroutine u_0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) + use bitmasks + implicit none + BEGIN_DOC + ! Computes e_0 = / + ! + ! n : number of determinants + ! + END_DOC + integer, intent(in) :: n,Nint, N_st, sze_8 + double precision, intent(out) :: e_0(N_st) + double precision, intent(in) :: u_0(sze_8,N_st) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + + double precision, allocatable :: H_jj(:), v_0(:,:) + double precision :: u_dot_u,u_dot_v,diag_H_mat_elem + integer :: i,j + allocate (H_jj(n), v_0(sze_8,N_st)) + do i = 1, n + H_jj(i) = diag_H_mat_elem(keys_tmp(1,1,i),Nint) + enddo + + call H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) + do i=1,N_st + e_0(i) = u_dot_v(v_0(1,i),u_0(1,i),n)/u_dot_u(u_0(1,i),n) + enddo +end + + +subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) + use bitmasks + implicit none + BEGIN_DOC + ! Computes v_0 = H|u_0> + ! + ! n : number of determinants + ! + ! H_jj : array of + END_DOC + integer, intent(in) :: n,Nint + double precision, intent(out) :: v_0(n) + double precision, intent(in) :: u_0(n) + double precision, intent(in) :: H_jj(n) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + call H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,1,n) +end + +subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) + use bitmasks + implicit none + BEGIN_DOC + ! Computes v_0 = H|u_0> + ! + ! n : number of determinants + ! + ! H_jj : array of + END_DOC + integer, intent(in) :: N_st,n,Nint, sze_8 + double precision, intent(out) :: v_0(sze_8,N_st) + double precision, intent(in) :: u_0(sze_8,N_st) + double precision, intent(in) :: H_jj(n) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + double precision :: hij + double precision, allocatable :: vt(:,:) + integer :: i,j,k,l, jj,ii + integer :: i0, j0 + + integer, allocatable :: shortcut(:,:), sort_idx(:,:) + integer(bit_kind), allocatable :: sorted(:,:,:), version(:,:,:) + integer(bit_kind) :: sorted_i(Nint) + + integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi, istate + + + ASSERT (Nint > 0) + ASSERT (Nint == N_int) + ASSERT (n>0) + PROVIDE ref_bitmask_energy + + allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2)) + v_0 = 0.d0 + + call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) + call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) + + !$OMP PARALLEL DEFAULT(NONE) & + !$OMP PRIVATE(i,hij,j,k,jj,vt,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& + !$OMP SHARED(n,H_jj,u_0,keys_tmp,Nint,v_0,sorted,shortcut,sort_idx,version,N_st,sze_8) + allocate(vt(sze_8,N_st)) + Vt = 0.d0 + + !$OMP DO SCHEDULE(dynamic) + do sh=1,shortcut(0,1) + do sh2=sh,shortcut(0,1) + exa = 0 + do ni=1,Nint + exa = exa + popcnt(xor(version(ni,sh,1), version(ni,sh2,1))) + end do + if(exa > 2) then + cycle + end if + + do i=shortcut(sh,1),shortcut(sh+1,1)-1 + org_i = sort_idx(i,1) + if(sh==sh2) then + endi = i-1 + else + endi = shortcut(sh2+1,1)-1 + end if + do ni=1,Nint + sorted_i(ni) = sorted(ni,i,1) + enddo + + do j=shortcut(sh2,1),endi + org_j = sort_idx(j,1) + ext = exa + do ni=1,Nint + ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1))) + end do + if(ext <= 4) then + call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) + do istate=1,N_st + vt (org_i,istate) = vt (org_i,istate) + hij*u_0(org_j,istate) + vt (org_j,istate) = vt (org_j,istate) + hij*u_0(org_i,istate) + enddo + endif + enddo + enddo + enddo + enddo + !$OMP END DO NOWAIT + + !$OMP DO SCHEDULE(dynamic) + do sh=1,shortcut(0,2) + do i=shortcut(sh,2),shortcut(sh+1,2)-1 + org_i = sort_idx(i,2) + do j=shortcut(sh,2),i-1 + org_j = sort_idx(j,2) + ext = 0 + do ni=1,Nint + ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2))) + end do + if(ext == 4) then + call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) + do istate=1,N_st + vt (org_i,istate) = vt (org_i,istate) + hij*u_0(org_j,istate) + vt (org_j,istate) = vt (org_j,istate) + hij*u_0(org_i,istate) + enddo + end if + end do + end do + enddo + !$OMP END DO NOWAIT + + !$OMP CRITICAL + do istate=1,N_st + do i=n,1,-1 + v_0(i,istate) = v_0(i,istate) + vt(i,istate) + enddo + enddo + !$OMP END CRITICAL + + deallocate(vt) + !$OMP END PARALLEL + + do istate=1,N_st + do i=1,n + v_0(i,istate) += H_jj(i) * u_0(i,istate) + enddo + enddo + deallocate (shortcut, sort_idx, sorted, version) +end + + diff --git a/src/Determinants/determinants.irp.f b/src/Determinants/determinants.irp.f index d0827f3b..0e62d524 100644 --- a/src/Determinants/determinants.irp.f +++ b/src/Determinants/determinants.irp.f @@ -1,5 +1,22 @@ use bitmasks +BEGIN_PROVIDER [ character*(64), diag_algorithm ] + implicit none + BEGIN_DOC + ! Diagonalization algorithm (Davidson or Lapack) + END_DOC + if (N_det > N_det_max_jacobi) then + diag_algorithm = "Davidson" + else + diag_algorithm = "Lapack" + endif + + if (N_det < N_states_diag) then + diag_algorithm = "Lapack" + endif +END_PROVIDER + + BEGIN_PROVIDER [ integer, N_det ] implicit none BEGIN_DOC @@ -872,4 +889,4 @@ subroutine apply_hole(det, s1, h1, res, ok, Nint) res(ii, s1) = ibclr(res(ii, s1), pos) ok = .true. -end subroutine \ No newline at end of file +end subroutine diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index c66bc714..3d3eda0b 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -162,7 +162,7 @@ subroutine S2_u_0_nstates(v_0,u_0,n,keys_tmp,Nint,N_st,sze_8) ASSERT (Nint > 0) ASSERT (Nint == N_int) ASSERT (n>0) - PROVIDE ref_bitmask_energy davidson_criterion + PROVIDE ref_bitmask_energy allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2)) v_0 = 0.d0 diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index 5e27253a..0d4a1567 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -1634,195 +1634,6 @@ subroutine get_occ_from_key(key,occ,Nint) end -subroutine u_0_H_u_0(e_0,u_0,n,keys_tmp,Nint) - use bitmasks - implicit none - BEGIN_DOC - ! Computes e_0 = / - ! - ! n : number of determinants - ! - END_DOC - integer, intent(in) :: n,Nint - double precision, intent(out) :: e_0 - double precision, intent(in) :: u_0(n) - integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - call u_0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,1,n) -end - -subroutine u_0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) - use bitmasks - implicit none - BEGIN_DOC - ! Computes e_0 = / - ! - ! n : number of determinants - ! - END_DOC - integer, intent(in) :: n,Nint, N_st, sze_8 - double precision, intent(out) :: e_0(N_st) - double precision, intent(in) :: u_0(sze_8,N_st) - integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - - double precision, allocatable :: H_jj(:), v_0(:,:) - double precision :: u_dot_u,u_dot_v,diag_H_mat_elem - integer :: i,j - allocate (H_jj(n), v_0(sze_8,N_st)) - do i = 1, n - H_jj(i) = diag_H_mat_elem(keys_tmp(1,1,i),Nint) - enddo - - call H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) - do i=1,N_st - e_0(i) = u_dot_v(v_0(1,i),u_0(1,i),n)/u_dot_u(u_0(1,i),n) - enddo -end - - -subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) - use bitmasks - implicit none - BEGIN_DOC - ! Computes v_0 = H|u_0> - ! - ! n : number of determinants - ! - ! H_jj : array of - END_DOC - integer, intent(in) :: n,Nint - double precision, intent(out) :: v_0(n) - double precision, intent(in) :: u_0(n) - double precision, intent(in) :: H_jj(n) - integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - call H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,1,n) -end - -subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) - use bitmasks - implicit none - BEGIN_DOC - ! Computes v_0 = H|u_0> - ! - ! n : number of determinants - ! - ! H_jj : array of - END_DOC - integer, intent(in) :: N_st,n,Nint, sze_8 - double precision, intent(out) :: v_0(sze_8,N_st) - double precision, intent(in) :: u_0(sze_8,N_st) - double precision, intent(in) :: H_jj(n) - integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - double precision :: hij - double precision, allocatable :: vt(:,:) - integer :: i,j,k,l, jj,ii - integer :: i0, j0 - - integer, allocatable :: shortcut(:,:), sort_idx(:,:) - integer(bit_kind), allocatable :: sorted(:,:,:), version(:,:,:) - integer(bit_kind) :: sorted_i(Nint) - - integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi, istate - - - ASSERT (Nint > 0) - ASSERT (Nint == N_int) - ASSERT (n>0) - PROVIDE ref_bitmask_energy davidson_criterion - - allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2)) - v_0 = 0.d0 - - call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) - call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) - - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(i,hij,j,k,jj,vt,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& - !$OMP SHARED(n,H_jj,u_0,keys_tmp,Nint,v_0,sorted,shortcut,sort_idx,version,N_st,sze_8) - allocate(vt(sze_8,N_st)) - Vt = 0.d0 - - !$OMP DO SCHEDULE(dynamic) - do sh=1,shortcut(0,1) - do sh2=sh,shortcut(0,1) - exa = 0 - do ni=1,Nint - exa = exa + popcnt(xor(version(ni,sh,1), version(ni,sh2,1))) - end do - if(exa > 2) then - cycle - end if - - do i=shortcut(sh,1),shortcut(sh+1,1)-1 - org_i = sort_idx(i,1) - if(sh==sh2) then - endi = i-1 - else - endi = shortcut(sh2+1,1)-1 - end if - do ni=1,Nint - sorted_i(ni) = sorted(ni,i,1) - enddo - - do j=shortcut(sh2,1),endi - org_j = sort_idx(j,1) - ext = exa - do ni=1,Nint - ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1))) - end do - if(ext <= 4) then - call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) - do istate=1,N_st - vt (org_i,istate) = vt (org_i,istate) + hij*u_0(org_j,istate) - vt (org_j,istate) = vt (org_j,istate) + hij*u_0(org_i,istate) - enddo - endif - enddo - enddo - enddo - enddo - !$OMP END DO NOWAIT - - !$OMP DO SCHEDULE(dynamic) - do sh=1,shortcut(0,2) - do i=shortcut(sh,2),shortcut(sh+1,2)-1 - org_i = sort_idx(i,2) - do j=shortcut(sh,2),i-1 - org_j = sort_idx(j,2) - ext = 0 - do ni=1,Nint - ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2))) - end do - if(ext == 4) then - call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) - do istate=1,N_st - vt (org_i,istate) = vt (org_i,istate) + hij*u_0(org_j,istate) - vt (org_j,istate) = vt (org_j,istate) + hij*u_0(org_i,istate) - enddo - end if - end do - end do - enddo - !$OMP END DO NOWAIT - - !$OMP CRITICAL - do istate=1,N_st - do i=n,1,-1 - v_0(i,istate) = v_0(i,istate) + vt(i,istate) - enddo - enddo - !$OMP END CRITICAL - - deallocate(vt) - !$OMP END PARALLEL - - do istate=1,N_st - do i=1,n - v_0(i,istate) += H_jj(i) * u_0(i,istate) - enddo - enddo - deallocate (shortcut, sort_idx, sorted, version) -end - subroutine get_double_excitation_phase(det1,det2,exc,phase,Nint) use bitmasks From d171e34a382b6570c05e507a2fe9f4e83c8f11a9 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 22 Sep 2016 11:28:27 +0200 Subject: [PATCH 115/216] Save Mono integrals to disk --- plugins/Full_CI/README.rst | 29 ++++ plugins/Full_CI/tree_dependency.png | Bin 100400 -> 112905 bytes src/Ezfio_files/ezfio.irp.f | 9 ++ src/Integrals_Bielec/README.rst | 132 ++++++++------- src/Integrals_Bielec/tree_dependency.png | Bin 41139 -> 46698 bytes src/Integrals_Monoelec/EZFIO.cfg | 12 ++ src/Integrals_Monoelec/README.rst | 80 +++++++-- src/Integrals_Monoelec/kin_ao_ints.irp.f | 53 +++--- src/Integrals_Monoelec/kin_mo_ints.irp.f | 45 +++--- src/Integrals_Monoelec/mo_mono_ints.irp.f | 13 +- src/Integrals_Monoelec/pot_ao_ints.irp.f | 153 ++++++++++-------- .../pot_ao_pseudo_ints.irp.f | 31 +++- src/Integrals_Monoelec/pot_mo_ints.irp.f | 59 +++---- .../pot_mo_pseudo_ints.irp.f | 40 ++--- src/Integrals_Monoelec/read_write.irp.f | 84 ++++++++++ src/Integrals_Monoelec/spread_dipole_mo.irp.f | 115 +++++-------- 16 files changed, 519 insertions(+), 336 deletions(-) create mode 100644 src/Integrals_Monoelec/EZFIO.cfg create mode 100644 src/Integrals_Monoelec/read_write.irp.f diff --git a/plugins/Full_CI/README.rst b/plugins/Full_CI/README.rst index 08a0d1ea..750db44c 100644 --- a/plugins/Full_CI/README.rst +++ b/plugins/Full_CI/README.rst @@ -107,6 +107,10 @@ h_apply_fci_pt2 excitations (of the same symmetry). Auto-generated by the ``generate_h_apply`` script. +h_apply_fci_pt2_collector + Collects results from the selection in an array of generators + + h_apply_fci_pt2_diexc Undocumented @@ -127,6 +131,19 @@ h_apply_fci_pt2_monoexc Assume N_int is already provided. +h_apply_fci_pt2_slave + 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_fci_pt2_slave_inproc + Computes a buffer using threads + + +h_apply_fci_pt2_slave_tcp + Computes a buffer over the network + + h_apply_pt2_mono_delta_rho 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. @@ -227,6 +244,18 @@ h_apply_select_mono_di_delta_rho_monoexc Assume N_int is already provided. +`micro_pt2 `_ + Helper program to compute the PT2 in distributed mode. + + +`provide_everything `_ + Undocumented + + +`run_wf `_ + Undocumented + + `var_pt2_ratio_run `_ Undocumented diff --git a/plugins/Full_CI/tree_dependency.png b/plugins/Full_CI/tree_dependency.png index caedb2e012d9b82e4111fc912d83e50fc7e5a356..158a3945d8762bd89be10243034247a58d87f738 100644 GIT binary patch literal 112905 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 literal 100400 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
  • 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 Ub(`A6h+msvVP$^S%rWr)0$=SJ&Hw-a diff --git a/src/Ezfio_files/ezfio.irp.f b/src/Ezfio_files/ezfio.irp.f index 9432020f..6d2beb0b 100644 --- a/src/Ezfio_files/ezfio.irp.f +++ b/src/Ezfio_files/ezfio.irp.f @@ -31,3 +31,12 @@ BEGIN_PROVIDER [ character*(128), ezfio_filename ] END_PROVIDER +BEGIN_PROVIDER [ character*(128), ezfio_work_dir ] + implicit none + BEGIN_DOC + ! EZFIO/work/ + END_DOC + call ezfio_set_work_empty(.False.) + ezfio_work_dir = trim(ezfio_filename)//'/work/' +END_PROVIDER + diff --git a/src/Integrals_Bielec/README.rst b/src/Integrals_Bielec/README.rst index a22d791d..d4471e2a 100644 --- a/src/Integrals_Bielec/README.rst +++ b/src/Integrals_Bielec/README.rst @@ -9,6 +9,12 @@ Here, all bi-electronic integrals (:math:`1/r_{12}`) are computed. As they have MO integral, use ``get_mo_bielec_integral(i,j,k,l,mo_integrals_map)`` or ``mo_bielec_integral(i,j,k,l)``. +The conventions are: + +* For AO integrals : (ik|jl) = (11|22) +* For MO integrals : = <12|12> + + Needed Modules ============== @@ -48,37 +54,41 @@ Documentation i(r1) j(r1) 1/r12 k(r2) l(r2) -`ao_bielec_integral_schwartz `_ +`ao_bielec_integral_schwartz `_ Needed to compute Schwartz inequalities -`ao_bielec_integral_schwartz_accel `_ +`ao_bielec_integral_schwartz_accel `_ integral of the AO basis or (ij|kl) i(r1) j(r1) 1/r12 k(r2) l(r2) -`ao_bielec_integrals_in_map `_ +`ao_bielec_integrals_in_map `_ Map of Atomic integrals i(r1) j(r2) 1/r12 k(r1) l(r2) -`ao_bielec_integrals_in_map_collector `_ +`ao_bielec_integrals_in_map_collector `_ Collects results from the AO integral calculation -`ao_bielec_integrals_in_map_slave `_ +`ao_bielec_integrals_in_map_slave `_ Computes a buffer of integrals +`ao_bielec_integrals_in_map_slave_inproc `_ + Computes a buffer of integrals. i is the ID of the current thread. + + +`ao_bielec_integrals_in_map_slave_tcp `_ + Computes a buffer of integrals. i is the ID of the current thread. + + `ao_integrals_map `_ AO integrals -`ao_integrals_threshold `_ - If || < ao_integrals_threshold then is zero - - -`ao_l4 `_ +`ao_l4 `_ Computes the product of l values of i,j,k,and l @@ -98,39 +108,27 @@ Documentation Frees the memory of the AO map -`clear_mo_map `_ +`clear_mo_map `_ Frees the memory of the MO map -`compute_ao_bielec_integrals `_ +`compute_ao_bielec_integrals `_ Compute AO 1/r12 integrals for all i and fixed j,k,l -`compute_ao_integrals_jl `_ +`compute_ao_integrals_jl `_ Parallel client for AO integrals -`disk_access_ao_integrals `_ - Read/Write AO integrals from/to disk [ Write | Read | None ] - - -`disk_access_mo_integrals `_ - Read/Write MO integrals from/to disk [ Write | Read | None ] - - -`do_direct_integrals `_ - Compute integrals on the fly - - -`dump_ao_integrals `_ +`dump_ao_integrals `_ Save to disk the $ao integrals -`dump_mo_integrals `_ +`dump_mo_integrals `_ Save to disk the $ao integrals -`eri `_ +`eri `_ ATOMIC PRIMTIVE bielectronic integral between the 4 primitives :: primitive_1 = x1**(a_x) y1**(a_y) z1**(a_z) exp(-alpha * r1**2) primitive_2 = x1**(b_x) y1**(b_y) z1**(b_z) exp(- beta * r1**2) @@ -152,7 +150,7 @@ Documentation t_w(i,2,k) = t(i) -`general_primitive_integral `_ +`general_primitive_integral `_ Computes the integral where p,q,r,s are Gaussian primitives @@ -174,126 +172,126 @@ Documentation Returns the number of elements in the AO map -`get_mo_bielec_integral `_ +`get_mo_bielec_integral `_ Returns one integral in the MO basis -`get_mo_bielec_integral_schwartz `_ +`get_mo_bielec_integral_schwartz `_ Returns one integral in the MO basis -`get_mo_bielec_integrals `_ +`get_mo_bielec_integrals `_ Returns multiple integrals in the MO basis, all i for j,k,l fixed. -`get_mo_bielec_integrals_ij `_ +`get_mo_bielec_integrals_ij `_ Returns multiple integrals in the MO basis, all i(1)j(2) 1/r12 k(1)l(2) i, j for k,l fixed. -`get_mo_map_size `_ +`get_mo_map_size `_ Return the number of elements in the MO map -`give_polynom_mult_center_x `_ +`give_polynom_mult_center_x `_ subroutine that returns the explicit polynom in term of the "t" variable of the following polynomw : I_x1(a_x, d_x,p,q) * I_x1(a_y, d_y,p,q) * I_x1(a_z, d_z,p,q) -`i_x1_new `_ +`i_x1_new `_ recursive function involved in the bielectronic integral -`i_x1_pol_mult `_ +`i_x1_pol_mult `_ recursive function involved in the bielectronic integral -`i_x1_pol_mult_a1 `_ +`i_x1_pol_mult_a1 `_ recursive function involved in the bielectronic integral -`i_x1_pol_mult_a2 `_ +`i_x1_pol_mult_a2 `_ recursive function involved in the bielectronic integral -`i_x1_pol_mult_recurs `_ +`i_x1_pol_mult_recurs `_ recursive function involved in the bielectronic integral -`i_x2_new `_ +`i_x2_new `_ recursive function involved in the bielectronic integral -`i_x2_pol_mult `_ +`i_x2_pol_mult `_ recursive function involved in the bielectronic integral -`insert_into_ao_integrals_map `_ +`insert_into_ao_integrals_map `_ Create new entry into AO map -`insert_into_mo_integrals_map `_ +`insert_into_mo_integrals_map `_ Create new entry into MO map, or accumulate in an existing entry -`integrale_new `_ +`integrale_new `_ calculate the integral of the polynom :: I_x1(a_x+b_x, c_x+d_x,p,q) * I_x1(a_y+b_y, c_y+d_y,p,q) * I_x1(a_z+b_z, c_z+d_z,p,q) between ( 0 ; 1) -`load_ao_integrals `_ +`load_ao_integrals `_ Read from disk the $ao integrals -`load_mo_integrals `_ +`load_mo_integrals `_ Read from disk the $ao integrals -`mo_bielec_integral `_ +`mo_bielec_integral `_ Returns one integral in the MO basis -`mo_bielec_integral_jj `_ +`mo_bielec_integral_jj `_ mo_bielec_integral_jj(i,j) = J_ij mo_bielec_integral_jj_exchange(i,j) = K_ij mo_bielec_integral_jj_anti(i,j) = J_ij - K_ij -`mo_bielec_integral_jj_anti `_ +`mo_bielec_integral_jj_anti `_ mo_bielec_integral_jj(i,j) = J_ij mo_bielec_integral_jj_exchange(i,j) = K_ij mo_bielec_integral_jj_anti(i,j) = J_ij - K_ij -`mo_bielec_integral_jj_anti_from_ao `_ +`mo_bielec_integral_jj_anti_from_ao `_ mo_bielec_integral_jj_from_ao(i,j) = J_ij mo_bielec_integral_jj_exchange_from_ao(i,j) = J_ij mo_bielec_integral_jj_anti_from_ao(i,j) = J_ij - K_ij -`mo_bielec_integral_jj_exchange `_ +`mo_bielec_integral_jj_exchange `_ mo_bielec_integral_jj(i,j) = J_ij mo_bielec_integral_jj_exchange(i,j) = K_ij mo_bielec_integral_jj_anti(i,j) = J_ij - K_ij -`mo_bielec_integral_jj_exchange_from_ao `_ +`mo_bielec_integral_jj_exchange_from_ao `_ mo_bielec_integral_jj_from_ao(i,j) = J_ij mo_bielec_integral_jj_exchange_from_ao(i,j) = J_ij mo_bielec_integral_jj_anti_from_ao(i,j) = J_ij - K_ij -`mo_bielec_integral_jj_from_ao `_ +`mo_bielec_integral_jj_from_ao `_ mo_bielec_integral_jj_from_ao(i,j) = J_ij mo_bielec_integral_jj_exchange_from_ao(i,j) = J_ij mo_bielec_integral_jj_anti_from_ao(i,j) = J_ij - K_ij -`mo_bielec_integral_schwartz `_ +`mo_bielec_integral_schwartz `_ Needed to compute Schwartz inequalities @@ -305,24 +303,36 @@ Documentation Computes an unique index for i,j,k,l integrals -`mo_integrals_map `_ +`mo_integrals_map `_ MO integrals -`mo_integrals_threshold `_ - If || < ao_integrals_threshold then is zero - - `n_pt_max_integrals_16 `_ Aligned n_pt_max_integrals -`n_pt_sup `_ +`n_pt_sup `_ Returns the upper boundary of the degree of the polynomial involved in the bielctronic integral : Ix(a_x,b_x,c_x,d_x) * Iy(a_y,b_y,c_y,d_y) * Iz(a_z,b_z,c_z,d_z) +`provide_all_mo_integrals `_ + Undocumented + + +`pull_integrals `_ + How the collector pulls the computed integrals + + +`push_integrals `_ + Push integrals in the push socket + + +`qp_ao_ints `_ + Increments a running calculation to compute AO integrals + + `read_ao_integrals `_ One level of abstraction for disk_access_ao_integrals and disk_access_mo_integrals diff --git a/src/Integrals_Bielec/tree_dependency.png b/src/Integrals_Bielec/tree_dependency.png index 4161fd0a3deffc1de0c778297340aa311043699d..92944e899eb7d3271fd968b45c3c3281e60e2061 100644 GIT binary patch literal 46698 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 diff --git a/src/Integrals_Monoelec/EZFIO.cfg b/src/Integrals_Monoelec/EZFIO.cfg new file mode 100644 index 00000000..04e49ec1 --- /dev/null +++ b/src/Integrals_Monoelec/EZFIO.cfg @@ -0,0 +1,12 @@ +[disk_access_mo_one_integrals] +type: Disk_access +doc: Read/Write MO one-electron integrals from/to disk [ Write | Read | None ] +interface: ezfio,provider,ocaml +default: None + +[disk_access_ao_one_integrals] +type: Disk_access +doc: Read/Write AO one-electron integrals from/to disk [ Write | Read | None ] +interface: ezfio,provider,ocaml +default: None + diff --git a/src/Integrals_Monoelec/README.rst b/src/Integrals_Monoelec/README.rst index 1d2d158b..2f5efd4f 100644 --- a/src/Integrals_Monoelec/README.rst +++ b/src/Integrals_Monoelec/README.rst @@ -111,11 +111,11 @@ Documentation Pseudo-potential -`ao_pseudo_integral_local `_ +`ao_pseudo_integral_local `_ Local pseudo-potential -`ao_pseudo_integral_non_local `_ +`ao_pseudo_integral_non_local `_ Local pseudo-potential @@ -141,23 +141,31 @@ Documentation Undocumented +`disk_access_ao_one_integrals `_ + Read/Write AO one-electron integrals from/to disk [ Write | Read | None ] + + +`disk_access_mo_one_integrals `_ + Read/Write MO one-electron integrals from/to disk [ Write | Read | None ] + + `do_print `_ Undocumented -`give_polynom_mult_center_mono_elec `_ +`give_polynom_mult_center_mono_elec `_ Undocumented -`i_x1_pol_mult_mono_elec `_ +`i_x1_pol_mult_mono_elec `_ Undocumented -`i_x2_pol_mult_mono_elec `_ +`i_x2_pol_mult_mono_elec `_ Undocumented -`int_gaus_pol `_ +`int_gaus_pol `_ Undocumented @@ -237,7 +245,7 @@ Documentation array of the integrals of MO_i * z^2 MO_j -`nai_pol_mult `_ +`nai_pol_mult `_ Undocumented @@ -269,26 +277,74 @@ Documentation Undocumented +`pseudo_dz_k_transp `_ + Transposed arrays for pseudopotentials + + +`pseudo_dz_kl_transp `_ + Transposed arrays for pseudopotentials + + +`pseudo_n_k_transp `_ + Transposed arrays for pseudopotentials + + +`pseudo_n_kl_transp `_ + Transposed arrays for pseudopotentials + + +`pseudo_v_k_transp `_ + Transposed arrays for pseudopotentials + + +`pseudo_v_kl_transp `_ + Transposed arrays for pseudopotentials + + +`read_ao_one_integrals `_ + One level of abstraction for disk_access_ao_integrals and disk_access_mo_integrals + + +`read_mo_one_integrals `_ + One level of abstraction for disk_access_ao_integrals and disk_access_mo_integrals + + +`read_one_e_integrals `_ + Read the 1-electron integrals into in A(m,n) from file 'filename' + + `save_ortho_mos `_ Undocumented -`v_e_n `_ +`v_e_n `_ Undocumented -`v_phi `_ +`v_phi `_ Undocumented -`v_r `_ +`v_r `_ Undocumented -`v_theta `_ +`v_theta `_ Undocumented -`wallis `_ +`wallis `_ Undocumented + +`write_ao_one_integrals `_ + One level of abstraction for disk_access_ao_integrals and disk_access_mo_integrals + + +`write_mo_one_integrals `_ + One level of abstraction for disk_access_ao_integrals and disk_access_mo_integrals + + +`write_one_e_integrals `_ + Write the 1-electron integrals stored in A(m,n) into file 'filename' + diff --git a/src/Integrals_Monoelec/kin_ao_ints.irp.f b/src/Integrals_Monoelec/kin_ao_ints.irp.f index 10b065b4..e3e92348 100644 --- a/src/Integrals_Monoelec/kin_ao_ints.irp.f +++ b/src/Integrals_Monoelec/kin_ao_ints.irp.f @@ -123,26 +123,37 @@ END_PROVIDER BEGIN_PROVIDER [double precision, ao_kinetic_integral, (ao_num_align,ao_num)] - implicit none - BEGIN_DOC - ! array of the priminitve basis kinetic integrals - ! \langle \chi_i |\hat{T}| \chi_j \rangle - END_DOC - integer :: i,j,k,l - - !$OMP PARALLEL DO DEFAULT(NONE) & - !$OMP PRIVATE(i,j) & - !$OMP SHARED(ao_num, ao_num_align, ao_kinetic_integral,ao_deriv2_x,ao_deriv2_y,ao_deriv2_z) - do j = 1, ao_num - !DEC$ VECTOR ALWAYS - !DEC$ VECTOR ALIGNED - do i = 1, ao_num - ao_kinetic_integral(i,j) = -0.5d0 * (ao_deriv2_x(i,j) + ao_deriv2_y(i,j) + ao_deriv2_z(i,j) ) - enddo - do i = ao_num +1,ao_num_align - ao_kinetic_integral(i,j) = 0.d0 - enddo - enddo - !$OMP END PARALLEL DO + implicit none + BEGIN_DOC + ! array of the priminitve basis kinetic integrals + ! \langle \chi_i |\hat{T}| \chi_j \rangle + END_DOC + integer :: i,j,k,l + + if (read_ao_one_integrals) then + call read_one_e_integrals('ao_kinetic_integral', ao_kinetic_integral,& + size(ao_kinetic_integral,1), size(ao_kinetic_integral,2)) + print *, 'AO kinetic integrals read from disk' + else + !$OMP PARALLEL DO DEFAULT(NONE) & + !$OMP PRIVATE(i,j) & + !$OMP SHARED(ao_num, ao_num_align, ao_kinetic_integral,ao_deriv2_x,ao_deriv2_y,ao_deriv2_z) + do j = 1, ao_num + !DEC$ VECTOR ALWAYS + !DEC$ VECTOR ALIGNED + do i = 1, ao_num + ao_kinetic_integral(i,j) = -0.5d0 * (ao_deriv2_x(i,j) + ao_deriv2_y(i,j) + ao_deriv2_z(i,j) ) + enddo + do i = ao_num +1,ao_num_align + ao_kinetic_integral(i,j) = 0.d0 + enddo + enddo + !$OMP END PARALLEL DO + endif + if (write_ao_one_integrals) then + call write_one_e_integrals('ao_kinetic_integral', ao_kinetic_integral,& + size(ao_kinetic_integral,1), size(ao_kinetic_integral,2)) + print *, 'AO kinetic integrals written to disk' + endif END_PROVIDER diff --git a/src/Integrals_Monoelec/kin_mo_ints.irp.f b/src/Integrals_Monoelec/kin_mo_ints.irp.f index 2bcbd5df..2cd00376 100644 --- a/src/Integrals_Monoelec/kin_mo_ints.irp.f +++ b/src/Integrals_Monoelec/kin_mo_ints.irp.f @@ -1,25 +1,26 @@ - BEGIN_PROVIDER [double precision, mo_kinetic_integral, (mo_tot_num_align,mo_tot_num)] - implicit none - integer :: i1,j1,i,j - double precision :: c_i1 +BEGIN_PROVIDER [double precision, mo_kinetic_integral, (mo_tot_num_align,mo_tot_num)] + implicit none + BEGIN_DOC + ! Kinetic energy integrals in the MO basis + END_DOC + + if (read_mo_one_integrals) then + call read_one_e_integrals('mo_kinetic_integral', mo_kinetic_integral,& + size(mo_kinetic_integral,1), size(mo_kinetic_integral,2)) + print *, 'MO kinetic integrals read from disk' + else + call ao_to_mo( & + ao_kinetic_integral, & + size(ao_kinetic_integral,1), & + mo_kinetic_integral, & + size(mo_kinetic_integral,1), & + ) + endif + if (write_mo_one_integrals) then + call write_one_e_integrals('mo_kinetic_integral', mo_kinetic_integral,& + size(mo_kinetic_integral,1), size(mo_kinetic_integral,2)) + print *, 'MO kinetic integrals written to disk' + endif - mo_kinetic_integral = 0.d0 - !$OMP PARALLEL DO DEFAULT(none) & - !$OMP PRIVATE(i,j,i1,j1,c_i1) & - !$OMP SHARED(mo_tot_num,ao_num,mo_coef,ao_Kinetic_integral, & - !$OMP mo_kinetic_integral) - do i = 1,mo_tot_num - do j = 1,mo_tot_num - do i1 = 1,ao_num - c_i1 = mo_coef(i1,i) - !DIR$ VECTOR ALIGNED - do j1 = 1,ao_num - mo_kinetic_integral(j,i) = mo_kinetic_integral(j,i) + c_i1*mo_coef(j1,j) *& - ao_Kinetic_integral(j1,i1) - enddo - enddo - enddo - enddo - !$OMP END PARALLEL DO END_PROVIDER diff --git a/src/Integrals_Monoelec/mo_mono_ints.irp.f b/src/Integrals_Monoelec/mo_mono_ints.irp.f index 5bae9868..50ab7ffa 100644 --- a/src/Integrals_Monoelec/mo_mono_ints.irp.f +++ b/src/Integrals_Monoelec/mo_mono_ints.irp.f @@ -1,14 +1,15 @@ BEGIN_PROVIDER [ double precision, mo_mono_elec_integral,(mo_tot_num_align,mo_tot_num)] implicit none - integer :: i,j,n,l + integer :: i,j,n,l BEGIN_DOC - ! array of the mono electronic hamiltonian on the MOs basis - ! : sum of the kinetic and nuclear electronic potential + ! array of the mono electronic hamiltonian on the MOs basis : + ! sum of the kinetic and nuclear electronic potential END_DOC print*,'Providing the mono electronic integrals' do j = 1, mo_tot_num - do i = 1, mo_tot_num - mo_mono_elec_integral(i,j) = mo_nucl_elec_integral(i,j) + mo_kinetic_integral(i,j) + mo_pseudo_integral(i,j) - enddo + do i = 1, mo_tot_num + mo_mono_elec_integral(i,j) = mo_nucl_elec_integral(i,j) + & + mo_kinetic_integral(i,j) + mo_pseudo_integral(i,j) + enddo enddo END_PROVIDER diff --git a/src/Integrals_Monoelec/pot_ao_ints.irp.f b/src/Integrals_Monoelec/pot_ao_ints.irp.f index 9e64d5e2..45b9067a 100644 --- a/src/Integrals_Monoelec/pot_ao_ints.irp.f +++ b/src/Integrals_Monoelec/pot_ao_ints.irp.f @@ -1,73 +1,86 @@ - BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral, (ao_num_align,ao_num)] - BEGIN_DOC -! interaction nuclear electron - END_DOC - implicit none - double precision :: alpha, beta, gama, delta - integer :: num_A,num_B - double precision :: A_center(3),B_center(3),C_center(3) - integer :: power_A(3),power_B(3) - integer :: i,j,k,l,n_pt_in,m - double precision ::overlap_x,overlap_y,overlap_z,overlap,dx,NAI_pol_mult - - ao_nucl_elec_integral = 0.d0 - - ! _ - ! /| / |_) - ! | / | \ - ! - - !$OMP PARALLEL & - !$OMP DEFAULT (NONE) & - !$OMP PRIVATE (i,j,k,l,m,alpha,beta,A_center,B_center,C_center,power_A,power_B, & - !$OMP num_A,num_B,Z,c,n_pt_in) & - !$OMP SHARED (ao_num,ao_prim_num,ao_expo_ordered_transp,ao_power,ao_nucl,nucl_coord,ao_coef_normalized_ordered_transp, & - !$OMP n_pt_max_integrals,ao_nucl_elec_integral,nucl_num,nucl_charge) - - n_pt_in = n_pt_max_integrals - - !$OMP DO SCHEDULE (dynamic) - - do j = 1, ao_num - num_A = ao_nucl(j) - power_A(1:3)= ao_power(j,1:3) - A_center(1:3) = nucl_coord(num_A,1:3) - - do i = 1, ao_num - - num_B = ao_nucl(i) - power_B(1:3)= ao_power(i,1:3) - B_center(1:3) = nucl_coord(num_B,1:3) - - do l=1,ao_prim_num(j) - alpha = ao_expo_ordered_transp(l,j) - - do m=1,ao_prim_num(i) - beta = ao_expo_ordered_transp(m,i) - - double precision :: c - c = 0.d0 - - do k = 1, nucl_num - double precision :: Z - Z = nucl_charge(k) - - C_center(1:3) = nucl_coord(k,1:3) - - c = c - Z*NAI_pol_mult(A_center,B_center,power_A,power_B,alpha,beta,C_center,n_pt_in) - - enddo - ao_nucl_elec_integral(i,j) = ao_nucl_elec_integral(i,j) + & - ao_coef_normalized_ordered_transp(l,j)*ao_coef_normalized_ordered_transp(m,i)*c - enddo - enddo - enddo - enddo - - !$OMP END DO - !$OMP END PARALLEL - - END_PROVIDER +BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral, (ao_num_align,ao_num)] + BEGIN_DOC + ! interaction nuclear electron + END_DOC + implicit none + double precision :: alpha, beta, gama, delta + integer :: num_A,num_B + double precision :: A_center(3),B_center(3),C_center(3) + integer :: power_A(3),power_B(3) + integer :: i,j,k,l,n_pt_in,m + double precision :: overlap_x,overlap_y,overlap_z,overlap,dx,NAI_pol_mult + + if (read_ao_one_integrals) then + call read_one_e_integrals('ao_ne_integral', ao_nucl_elec_integral, & + size(ao_nucl_elec_integral,1), size(ao_nucl_elec_integral,2)) + print *, 'AO N-e integrals read from disk' + else + + ao_nucl_elec_integral = 0.d0 + + ! _ + ! /| / |_) + ! | / | \ + ! + + !$OMP PARALLEL & + !$OMP DEFAULT (NONE) & + !$OMP PRIVATE (i,j,k,l,m,alpha,beta,A_center,B_center,C_center,power_A,power_B,& + !$OMP num_A,num_B,Z,c,n_pt_in) & + !$OMP SHARED (ao_num,ao_prim_num,ao_expo_ordered_transp,ao_power,ao_nucl,nucl_coord,ao_coef_normalized_ordered_transp,& + !$OMP n_pt_max_integrals,ao_nucl_elec_integral,nucl_num,nucl_charge) + + n_pt_in = n_pt_max_integrals + + !$OMP DO SCHEDULE (dynamic) + + do j = 1, ao_num + num_A = ao_nucl(j) + power_A(1:3)= ao_power(j,1:3) + A_center(1:3) = nucl_coord(num_A,1:3) + + do i = 1, ao_num + + num_B = ao_nucl(i) + power_B(1:3)= ao_power(i,1:3) + B_center(1:3) = nucl_coord(num_B,1:3) + + do l=1,ao_prim_num(j) + alpha = ao_expo_ordered_transp(l,j) + + do m=1,ao_prim_num(i) + beta = ao_expo_ordered_transp(m,i) + + double precision :: c + c = 0.d0 + + do k = 1, nucl_num + double precision :: Z + Z = nucl_charge(k) + + C_center(1:3) = nucl_coord(k,1:3) + + c = c - Z*NAI_pol_mult(A_center,B_center,power_A,power_B,alpha,beta,C_center,n_pt_in) + + enddo + ao_nucl_elec_integral(i,j) = ao_nucl_elec_integral(i,j) +& + ao_coef_normalized_ordered_transp(l,j)*ao_coef_normalized_ordered_transp(m,i)*c + enddo + enddo + enddo + enddo + + !$OMP END DO + !$OMP END PARALLEL + endif + if (write_ao_one_integrals) then + call write_one_e_integrals('ao_ne_integral', ao_nucl_elec_integral, & + size(ao_nucl_elec_integral,1), size(ao_nucl_elec_integral,2)) + print *, 'AO N-e integrals written to disk' + endif + + +END_PROVIDER BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral_per_atom, (ao_num_align,ao_num,nucl_num)] BEGIN_DOC diff --git a/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f b/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f index 789bc9ea..28437b27 100644 --- a/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f +++ b/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f @@ -1,17 +1,32 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral, (ao_num_align,ao_num)] implicit none BEGIN_DOC -! Pseudo-potential + ! Pseudo-potential integrals END_DOC - ao_pseudo_integral = 0.d0 - if (do_pseudo) then - if (pseudo_klocmax > 0) then - ao_pseudo_integral += ao_pseudo_integral_local - endif - if (pseudo_kmax > 0) then - ao_pseudo_integral += ao_pseudo_integral_non_local + + if (read_ao_one_integrals) then + call read_one_e_integrals('ao_pseudo_integral', ao_pseudo_integral,& + size(ao_pseudo_integral,1), size(ao_pseudo_integral,2)) + print *, 'AO pseudopotential integrals read from disk' + else + + ao_pseudo_integral = 0.d0 + if (do_pseudo) then + if (pseudo_klocmax > 0) then + ao_pseudo_integral += ao_pseudo_integral_local + endif + if (pseudo_kmax > 0) then + ao_pseudo_integral += ao_pseudo_integral_non_local + endif endif endif + + if (write_ao_one_integrals) then + call write_one_e_integrals('ao_pseudo_integral', ao_pseudo_integral,& + size(ao_pseudo_integral,1), size(ao_pseudo_integral,2)) + print *, 'AO pseudopotential integrals written to disk' + endif + END_PROVIDER BEGIN_PROVIDER [ double precision, ao_pseudo_integral_local, (ao_num_align,ao_num)] diff --git a/src/Integrals_Monoelec/pot_mo_ints.irp.f b/src/Integrals_Monoelec/pot_mo_ints.irp.f index 50019abb..27be6906 100644 --- a/src/Integrals_Monoelec/pot_mo_ints.irp.f +++ b/src/Integrals_Monoelec/pot_mo_ints.irp.f @@ -6,24 +6,24 @@ BEGIN_PROVIDER [double precision, mo_nucl_elec_integral, (mo_tot_num_align,mo_to ! interaction nuclear electron on the MO basis END_DOC - mo_nucl_elec_integral = 0.d0 - !$OMP PARALLEL DO DEFAULT(none) & - !$OMP PRIVATE(i,j,i1,j1,c_j1,c_i1) & - !$OMP SHARED(mo_tot_num,ao_num,mo_coef, & - !$OMP mo_nucl_elec_integral, ao_nucl_elec_integral) - do i = 1, mo_tot_num - do j = 1, mo_tot_num - do i1 = 1,ao_num - c_i1 = mo_coef(i1,i) - do j1 = 1,ao_num - c_j1 = c_i1*mo_coef(j1,j) - mo_nucl_elec_integral(j,i) = mo_nucl_elec_integral(j,i) + & - c_j1 * ao_nucl_elec_integral(j1,i1) - enddo - enddo - enddo - enddo - !$OMP END PARALLEL DO + if (read_mo_one_integrals) then + call read_one_e_integrals('mo_ne_integral', mo_nucl_elec_integral, & + size(mo_nucl_elec_integral,1), size(mo_nucl_elec_integral,2)) + print *, 'MO N-e integrals read from disk' + else + call ao_to_mo( & + ao_nucl_elec_integral, & + size(ao_nucl_elec_integral,1), & + mo_nucl_elec_integral, & + size(mo_nucl_elec_integral,1), & + ) + endif + if (write_mo_one_integrals) then + call write_one_e_integrals('mo_ne_integral', mo_nucl_elec_integral, & + size(mo_nucl_elec_integral,1), size(mo_nucl_elec_integral,2)) + print *, 'MO N-e integrals written to disk' + endif + END_PROVIDER @@ -38,23 +38,12 @@ BEGIN_PROVIDER [double precision, mo_nucl_elec_integral_per_atom, (mo_tot_num_al mo_nucl_elec_integral_per_atom = 0.d0 do k = 1, nucl_num - !$OMP PARALLEL DO DEFAULT(none) & - !$OMP PRIVATE(i,j,i1,j1,c_j1,c_i1) & - !$OMP SHARED(mo_tot_num,ao_num,mo_coef, & - !$OMP mo_nucl_elec_integral_per_atom, ao_nucl_elec_integral_per_atom,k) - do i = 1, mo_tot_num - do j = 1, mo_tot_num - do i1 = 1,ao_num - c_i1 = mo_coef(i1,i) - do j1 = 1,ao_num - c_j1 = c_i1*mo_coef(j1,j) - mo_nucl_elec_integral_per_atom(j,i,k) = mo_nucl_elec_integral_per_atom(j,i,k) + & - c_j1 * ao_nucl_elec_integral_per_atom(j1,i1,k) - enddo - enddo - enddo - enddo - !$OMP END PARALLEL DO + call ao_to_mo( & + ao_nucl_elec_integral_per_atom(1,1,k), & + size(ao_nucl_elec_integral_per_atom,1), & + mo_nucl_elec_integral_per_atom(1,1,k), & + size(mo_nucl_elec_integral_per_atom,1), & + ) enddo END_PROVIDER diff --git a/src/Integrals_Monoelec/pot_mo_pseudo_ints.irp.f b/src/Integrals_Monoelec/pot_mo_pseudo_ints.irp.f index 6c412e4b..9553aa6d 100644 --- a/src/Integrals_Monoelec/pot_mo_pseudo_ints.irp.f +++ b/src/Integrals_Monoelec/pot_mo_pseudo_ints.irp.f @@ -1,33 +1,27 @@ BEGIN_PROVIDER [double precision, mo_pseudo_integral, (mo_tot_num_align,mo_tot_num)] implicit none - integer :: i1,j1,i,j - double precision :: c_i1,c_j1 BEGIN_DOC ! interaction nuclear electron on the MO basis END_DOC - mo_pseudo_integral = 0.d0 - - if (.not.do_pseudo) then - return + if (read_mo_one_integrals) then + call read_one_e_integrals('mo_pseudo_integral', mo_pseudo_integral,& + size(mo_pseudo_integral,1), size(mo_pseudo_integral,2)) + print *, 'MO pseudopotential integrals read from disk' + else + call ao_to_mo( & + ao_pseudo_integral, & + size(ao_pseudo_integral,1), & + mo_pseudo_integral, & + size(mo_pseudo_integral,1), & + ) endif - !$OMP PARALLEL DO DEFAULT(none) & - !$OMP PRIVATE(i,j,i1,j1,c_j1,c_i1) & - !$OMP SHARED(mo_tot_num,ao_num,mo_coef, & - !$OMP mo_pseudo_integral, ao_pseudo_integral) - do i = 1, mo_tot_num - do j = 1, mo_tot_num - do i1 = 1,ao_num - c_i1 = mo_coef(i1,i) - do j1 = 1,ao_num - c_j1 = c_i1*mo_coef(j1,j) - mo_pseudo_integral(j,i) = mo_pseudo_integral(j,i) + & - c_j1 * ao_pseudo_integral(j1,i1) - enddo - enddo - enddo - enddo - !$OMP END PARALLEL DO + if (write_mo_one_integrals) then + call write_one_e_integrals('mo_pseudo_integral', mo_pseudo_integral,& + size(mo_pseudo_integral,1), size(mo_pseudo_integral,2)) + print *, 'MO pseudopotential integrals written to disk' + endif + END_PROVIDER diff --git a/src/Integrals_Monoelec/read_write.irp.f b/src/Integrals_Monoelec/read_write.irp.f new file mode 100644 index 00000000..697bf356 --- /dev/null +++ b/src/Integrals_Monoelec/read_write.irp.f @@ -0,0 +1,84 @@ + BEGIN_PROVIDER [ logical, read_ao_one_integrals ] +&BEGIN_PROVIDER [ logical, read_mo_one_integrals ] +&BEGIN_PROVIDER [ logical, write_ao_one_integrals ] +&BEGIN_PROVIDER [ logical, write_mo_one_integrals ] + + BEGIN_DOC + ! One level of abstraction for disk_access_ao_integrals and disk_access_mo_integrals + END_DOC + implicit none + + if (disk_access_ao_one_integrals.EQ.'Read') then + read_ao_one_integrals = .True. + write_ao_one_integrals = .False. + + else if (disk_access_ao_one_integrals.EQ.'Write') then + read_ao_one_integrals = .False. + write_ao_one_integrals = .True. + + else if (disk_access_ao_one_integrals.EQ.'None') then + read_ao_one_integrals = .False. + write_ao_one_integrals = .False. + + else + print *, 'bielec_integrals/disk_access_ao_integrals has a wrong type' + stop 1 + + endif + + if (disk_access_mo_one_integrals.EQ.'Read') then + read_mo_one_integrals = .True. + write_mo_one_integrals = .False. + + else if (disk_access_mo_one_integrals.EQ.'Write') then + read_mo_one_integrals = .False. + write_mo_one_integrals = .True. + + else if (disk_access_mo_one_integrals.EQ.'None') then + read_mo_one_integrals = .False. + write_mo_one_integrals = .False. + + else + print *, 'bielec_integrals/disk_access_mo_integrals has a wrong type' + stop 1 + + endif + +END_PROVIDER + +subroutine write_one_e_integrals(filename, A, m, n) + implicit none + BEGIN_DOC +! Write the 1-electron integrals stored in A(m,n) into file 'filename' + END_DOC + character(len=*), intent(in) :: filename + integer, intent(in) :: m,n + double precision, intent(in) :: A(m,n) + + integer :: iunit + integer, external :: getUnitAndOpen + character*(256) :: f + + iunit = getUnitAndOpen( trim(ezfio_work_dir)//trim(filename), 'W' ) + write(iunit) A + close(iunit) +end + +subroutine read_one_e_integrals(filename, A, m, n) + implicit none + BEGIN_DOC +! Read the 1-electron integrals into in A(m,n) from file 'filename' + END_DOC + character(len=*), intent(in) :: filename + integer, intent(in) :: m,n + double precision, intent(out) :: A(m,n) + + integer :: iunit + integer, external :: getUnitAndOpen + character*(256) :: f + + iunit = getUnitAndOpen( trim(ezfio_work_dir)//trim(filename), 'R' ) + read(iunit) A + close(iunit) +end + diff --git a/src/Integrals_Monoelec/spread_dipole_mo.irp.f b/src/Integrals_Monoelec/spread_dipole_mo.irp.f index d7306727..da91bee5 100644 --- a/src/Integrals_Monoelec/spread_dipole_mo.irp.f +++ b/src/Integrals_Monoelec/spread_dipole_mo.irp.f @@ -7,30 +7,26 @@ ! array of the integrals of MO_i * z MO_j END_DOC implicit none - integer :: i1,j1,i,j - double precision :: c_i1,c_j1 - mo_dipole_x = 0.d0 - mo_dipole_y = 0.d0 - mo_dipole_z = 0.d0 - !$OMP PARALLEL DO DEFAULT(none) & - !$OMP PRIVATE(i,j,i1,j1,c_j1,c_i1) & - !$OMP SHARED(mo_tot_num,ao_num,mo_coef, & - !$OMP mo_dipole_x,mo_dipole_y,mo_dipole_z,ao_dipole_x,ao_dipole_y,ao_dipole_z) - do i = 1, mo_tot_num - do j = 1, mo_tot_num - do i1 = 1,ao_num - c_i1 = mo_coef(i1,i) - do j1 = 1,ao_num - c_j1 = c_i1*mo_coef(j1,j) - mo_dipole_x(j,i) = mo_dipole_x(j,i) + c_j1 * ao_dipole_x(j1,i1) - mo_dipole_y(j,i) = mo_dipole_y(j,i) + c_j1 * ao_dipole_y(j1,i1) - mo_dipole_z(j,i) = mo_dipole_z(j,i) + c_j1 * ao_dipole_z(j1,i1) - enddo - enddo - enddo - enddo - !$OMP END PARALLEL DO + call ao_to_mo( & + ao_dipole_x, & + size(ao_dipole_x,1), & + mo_dipole_x, & + size(mo_dipole_x,1), & + ) + call ao_to_mo( & + ao_dipole_y, & + size(ao_dipole_y,1), & + mo_dipole_y, & + size(mo_dipole_y,1), & + ) + call ao_to_mo( & + ao_dipole_z, & + size(ao_dipole_z,1), & + mo_dipole_z, & + size(mo_dipole_z,1), & + ) + END_PROVIDER BEGIN_PROVIDER [double precision, mo_spread_x , (mo_tot_num_align,mo_tot_num)] @@ -42,60 +38,23 @@ END_PROVIDER ! array of the integrals of MO_i * z^2 MO_j END_DOC implicit none - integer :: i1,j1,i,j - double precision :: c_i1,c_j1 - - mo_nucl_elec_integral = 0.d0 - !$OMP PARALLEL DO DEFAULT(none) & - !$OMP PRIVATE(i,j,i1,j1,c_j1,c_i1) & - !$OMP SHARED(mo_tot_num,ao_num,mo_coef, & - !$OMP mo_spread_x,mo_spread_y,mo_spread_z,ao_spread_x,ao_spread_y,ao_spread_z) - do i = 1, mo_tot_num - do j = 1, mo_tot_num - do i1 = 1,ao_num - c_i1 = mo_coef(i1,i) - do j1 = 1,ao_num - c_j1 = c_i1*mo_coef(j1,j) - mo_spread_x(j,i) = mo_spread_x(j,i) + c_j1 * ao_spread_x(j1,i1) - mo_spread_y(j,i) = mo_spread_y(j,i) + c_j1 * ao_spread_y(j1,i1) - mo_spread_z(j,i) = mo_spread_z(j,i) + c_j1 * ao_spread_z(j1,i1) - enddo - enddo - enddo - enddo - !$OMP END PARALLEL DO -END_PROVIDER - - BEGIN_PROVIDER [double precision, mo_deriv_1_x , (mo_tot_num_align,mo_tot_num)] -&BEGIN_PROVIDER [double precision, mo_deriv_1_y , (mo_tot_num_align,mo_tot_num)] -&BEGIN_PROVIDER [double precision, mo_deriv_1_z , (mo_tot_num_align,mo_tot_num)] - BEGIN_DOC - ! array of the integrals of MO_i * d/dx MO_j - ! array of the integrals of MO_i * d/dy MO_j - ! array of the integrals of MO_i * d/dz MO_j - END_DOC - implicit none - integer :: i1,j1,i,j - double precision :: c_i1,c_j1 - - mo_nucl_elec_integral = 0.d0 - !$OMP PARALLEL DO DEFAULT(none) & - !$OMP PRIVATE(i,j,i1,j1,c_j1,c_i1) & - !$OMP SHARED(mo_tot_num,ao_num,mo_coef, & - !$OMP mo_deriv_1_x,mo_deriv_1_y,mo_deriv_1_z,ao_spread_x,ao_spread_y,ao_spread_z) - do i = 1, mo_tot_num - do j = 1, mo_tot_num - do i1 = 1,ao_num - c_i1 = mo_coef(i1,i) - do j1 = 1,ao_num - c_j1 = c_i1*mo_coef(j1,j) - mo_deriv_1_x(j,i) = mo_deriv_1_x(j,i) + c_j1 * ao_spread_x(j1,i1) - mo_deriv_1_y(j,i) = mo_deriv_1_y(j,i) + c_j1 * ao_spread_y(j1,i1) - mo_deriv_1_z(j,i) = mo_deriv_1_z(j,i) + c_j1 * ao_spread_z(j1,i1) - enddo - enddo - enddo - enddo - !$OMP END PARALLEL DO + call ao_to_mo( & + ao_spread_x, & + size(ao_spread_x,1), & + mo_spread_x, & + size(mo_spread_x,1), & + ) + call ao_to_mo( & + ao_spread_y, & + size(ao_spread_y,1), & + mo_spread_y, & + size(mo_spread_y,1), & + ) + call ao_to_mo( & + ao_spread_z, & + size(ao_spread_z,1), & + mo_spread_z, & + size(mo_spread_z,1), & + ) END_PROVIDER From dd60cda0eeaa889186ecd189ec9d84a1ff40be99 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 22 Sep 2016 12:15:20 +0200 Subject: [PATCH 116/216] --amend --- plugins/All_singles/README.rst | 70 +++++ plugins/CAS_SD/.gitignore | 3 + plugins/CAS_SD/README.rst | 100 +++++++ plugins/CAS_SD/tree_dependency.png | Bin 101918 -> 111575 bytes plugins/Full_CI/.gitignore | 1 + plugins/Generators_CAS/tree_dependency.png | Bin 62412 -> 68996 bytes plugins/Generators_full/tree_dependency.png | Bin 74306 -> 82663 bytes plugins/Generators_restart/README.rst | 37 +++ plugins/Hartree_Fock/.gitignore | 2 + plugins/Hartree_Fock/README.rst | 33 ++- plugins/Hartree_Fock/tree_dependency.png | Bin 58187 -> 70029 bytes plugins/MRCC_CASSD/.gitignore | 2 + plugins/MRCC_CASSD/README.rst | 22 +- plugins/MRCC_CASSD/tree_dependency.png | Bin 129883 -> 146992 bytes plugins/MRCC_Utils/.gitignore | 3 +- plugins/MRCC_Utils/README.rst | 161 ++++++----- plugins/MRCC_Utils/tree_dependency.png | Bin 108444 -> 131196 bytes plugins/Perturbation/README.rst | 24 +- plugins/Perturbation/tree_dependency.png | Bin 78201 -> 88474 bytes plugins/Properties/.gitignore | 38 +-- plugins/Properties/README.rst | 103 +++++++ plugins/Properties/tree_dependency.png | Bin 61273 -> 67884 bytes plugins/Psiref_CAS/.gitignore | 10 +- plugins/Psiref_CAS/README.rst | 12 +- plugins/Psiref_CAS/tree_dependency.png | Bin 7623 -> 75672 bytes plugins/Psiref_Utils/README.rst | 200 ++++++++------ plugins/Psiref_Utils/tree_dependency.png | Bin 3512 -> 70697 bytes plugins/Selectors_full/README.rst | 29 +- plugins/Selectors_full/tree_dependency.png | Bin 74062 -> 82406 bytes plugins/Selectors_no_sorted/README.rst | 162 +++++++++++ src/AO_Basis/README.rst | 122 +++++++-- src/Bitmask/README.rst | 195 ++++++++++++-- src/Determinants/README.rst | 281 +++++++++++++------- src/Determinants/tree_dependency.png | Bin 56529 -> 63258 bytes src/Ezfio_files/README.rst | 48 +++- src/Integrals_Bielec/.gitignore | 4 +- src/Integrals_Bielec/README.rst | 20 ++ src/Integrals_Monoelec/.gitignore | 2 + src/Integrals_Monoelec/README.rst | 70 ++--- src/MOGuess/.gitignore | 1 + src/MOGuess/README.rst | 16 +- src/MO_Basis/.gitignore | 28 +- src/MO_Basis/README.rst | 69 ++++- src/Pseudo/README.rst | 24 +- src/Utils/README.rst | 74 +++--- src/ZMQ/README.rst | 120 ++++++++- 46 files changed, 1558 insertions(+), 528 deletions(-) diff --git a/plugins/All_singles/README.rst b/plugins/All_singles/README.rst index b4b3f517..d3888edc 100644 --- a/plugins/All_singles/README.rst +++ b/plugins/All_singles/README.rst @@ -6,7 +6,77 @@ Needed Modules ============== .. Do not edit this section It was auto-generated .. by the `update_README.py` script. + + +.. image:: tree_dependency.png + +* `Generators_restart `_ +* `Perturbation `_ +* `Properties `_ +* `Selectors_no_sorted `_ +* `Utils `_ + Documentation ============= .. Do not edit this section It was auto-generated .. by the `update_README.py` script. + + +h_apply_just_1h_1p + 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_just_1h_1p_diexc + Undocumented + + +h_apply_just_1h_1p_diexcorg + Generate all double excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +h_apply_just_1h_1p_diexcp + Undocumented + + +h_apply_just_1h_1p_monoexc + Generate all single excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +h_apply_just_mono + 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_just_mono_diexc + Undocumented + + +h_apply_just_mono_diexcorg + Generate all double excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +h_apply_just_mono_diexcp + Undocumented + + +h_apply_just_mono_monoexc + Generate all single excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +`restart_more_singles `_ + Generates and select single excitations + on the top of a given restart wave function + + +`routine `_ + Undocumented + diff --git a/plugins/CAS_SD/.gitignore b/plugins/CAS_SD/.gitignore index b8827b3b..380d6cbf 100644 --- a/plugins/CAS_SD/.gitignore +++ b/plugins/CAS_SD/.gitignore @@ -22,6 +22,9 @@ Properties Pseudo Selectors_full Utils +ZMQ +cas_s +cas_s_selected cas_sd cas_sd_selected ezfio_interface.irp.f diff --git a/plugins/CAS_SD/README.rst b/plugins/CAS_SD/README.rst index f2d76615..11f5d4cc 100644 --- a/plugins/CAS_SD/README.rst +++ b/plugins/CAS_SD/README.rst @@ -118,6 +118,106 @@ Documentation Undocumented +h_apply_cas_s + 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_cas_s_diexc + Undocumented + + +h_apply_cas_s_diexcorg + Generate all double excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +h_apply_cas_s_diexcp + Undocumented + + +h_apply_cas_s_monoexc + Generate all single excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +h_apply_cas_s_pt2 + 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_cas_s_pt2_diexc + Undocumented + + +h_apply_cas_s_pt2_diexcorg + Generate all double excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +h_apply_cas_s_pt2_diexcp + Undocumented + + +h_apply_cas_s_pt2_monoexc + Generate all single excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +h_apply_cas_s_selected + 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_cas_s_selected_diexc + Undocumented + + +h_apply_cas_s_selected_diexcorg + Generate all double excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +h_apply_cas_s_selected_diexcp + Undocumented + + +h_apply_cas_s_selected_monoexc + Generate all single excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +h_apply_cas_s_selected_no_skip + 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_cas_s_selected_no_skip_diexc + Undocumented + + +h_apply_cas_s_selected_no_skip_diexcorg + Generate all double excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + +h_apply_cas_s_selected_no_skip_diexcp + Undocumented + + +h_apply_cas_s_selected_no_skip_monoexc + Generate all single excitations of key_in using the bit masks of holes and + particles. + Assume N_int is already provided. + + h_apply_cas_sd 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. diff --git a/plugins/CAS_SD/tree_dependency.png b/plugins/CAS_SD/tree_dependency.png index 185c2b27a73b771cce67c5b7f6d6a566b81375a0..e53499c9c12d19c1b043514f8fc6202dd7a4a13f 100644 GIT binary patch literal 111575 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

    hY16=hM(bF9FvJ zJQApH-z?qlQw|77+txm2d^!o2m0>ao8xgb}w%oaUcke`dTZ`-d*hCnyGmr})U&zP^ zFP8E>kJ@h2OtSUVpy{v#ENVUo3#P9mCyb|63Z*{ezn5NP6j|?jjgUw9seJ9Z*{1)X zLE-t)Adk`^i;+Q}$j4PFbckp=#+yb|kAI%9Qs7m=A}LQ9mfNN<=9E6JN|Lrq-uQLP zGfaIhBn*%u7w0K)oioGU&LW;94OyFjxVHZQxQ1P~JwQyqoSO|c&Ow+_EblQ8z`3pJ z;lmVuGSZj!51VM1tgAEwKH(n&ek4zm_hI7o*g*h<(Ii4T{rhiW|LJhm^44TB6_Ytp zSY;|J11IN^%l<`{Wm{LCK5=4k)*}FW_851@QONtl{g`zuubmzqTJDY-R$wO(n$E%X zQ(^mL)MVpdv^~1|Is5SGwxGI^x*_4JKNfB|XKTCT+)krV^Ra91Rb5$rVQ%*epEjL$ zo>!84>Ec?q?)@YOj(Rygl9+Dm{=?BG_(N@gZua*d56W-*z$++%-XtqdR|o4Bvk z%SEpA)oQF+cqij<{2=!7tbo!RU)VLtEkJ8hUA-DBQYIDzcXV=Ef8z?hRJ?kyW-it_ zR%R-jWor@HjlLL((5*L<4&J>B^==%p41Y30^3kJBO^;})q?NfY`TEi0$B~pP|Ncn- zOo3*n;FMq$Weu@T{49#!-!xH_69TwdniT}a!c44uXkdgShdkgfI1s_CsJhrWuoCr6 zZm4Zg_7gpUjQ9y4-~GEy=CimsZCiFCqXJ{5tmQ5F%o)YxUS7JB(~VqQ%bQLtXwYus zhcaCC)#|iL?_N!}-54RshWl%K4`76t>*q5^I@eG#(hl)Di;df41F0TX7(9|8KcUT1 z*M=n~-&GSdoOETz6J^<#3xp5ER^W*qxChNaCVtec)FQ1Jk)GbY5b?O0%34G;EFWPwol)>qR2il;ACDin9e z-&-b{_lQy0DNEJMYkjjB46M)t<{6IV^bS7tZ?}p3XXwoCO)mTaiC$OSnV+rjSrfy5 zm%}rTK_>vFHT3R~r@H=d5xM+)iOPTpoPRtqHj9a@x>b*(38GB!0&X(Y?Kyq&@R9Ii z!mVv5)Y$Z!%ZQdS<9;^!S*AMRWvicD?q{hJS&W$i{hew{FKX{~1e!sz3yp{`Z@Ve# z-`=oi&jvU7eAaegyBL2!90L3#^&SF9(=-`soi4H=A7RY@a7I(WgSC>s03obfwW`;b z@uHXAlgm$%OduUuxiX@8R^82pX4+U}PLB%zgltzne+56MWrS{`eZxH3bP^#zmE>U{ zpz5Vs_tNjy|DS;*1SJ*{#M%MdZ+K)aGt+FT!2!V6V!_)uRwIxuuC~Ts2<$x5jWah9 z``u0b%L+wSC)sXM&+z#W&}DYZQxxX~1y(*l1d&eTI<>@PEiFeh01@93tr}$Yv!&bX zM!($rVH=1?_5PMIwt8SFDg#W?+Ni7x)qNA!uVmB|Xf#U(l7Y!Yh!>gVq7hc8n!m*L zW!=|bV>Wtj_;FWBrKe`>b$3(dzwp%X;Ky}r{?l(QN0}%<)8>9{j(nV-xEa<0WKY znrH#i49QHg`jn*$MmjNGXAJ5$UTDS|8B=f6r1%TZ1A?ixZmmS|ODaG>)zZ*-xMu4J zk^Lw(x!&~`jU*75lfec-CUN2EiqT}~|nyqW*tR+%>iwrZ6 zj1)o;bw@(QmvM$ucfnB4a&|VuZN9ZsO*Z(OsCyU5WcCp^B!D+$p@R8S#g`FcPqSr< z2kBpl)^%XpSH!lnwmIYGpij=$L^uEB$)@7RjwZtc=p1DsfP~mXJ2VLQNE)%}!2441xx916pe6J~EHlrhaD�IYBo0>n4G~T(9OerHQAQ9JG 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

    wPWS?~P^%t?POHL0J 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 MnJ)Hc?K~p>4?X+1R{#J2 literal 101918 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�hLN@RL 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 diff --git a/plugins/Full_CI/.gitignore b/plugins/Full_CI/.gitignore index fe4ea27b..674f56da 100644 --- a/plugins/Full_CI/.gitignore +++ b/plugins/Full_CI/.gitignore @@ -28,6 +28,7 @@ full_ci full_ci_no_skip irpf90.make irpf90_entities +micro_pt2 tags target_pt2 var_pt2_ratio \ No newline at end of file diff --git a/plugins/Generators_CAS/tree_dependency.png b/plugins/Generators_CAS/tree_dependency.png index 5bbc55d0b6a24cd85c3d135b99c1e5b719a5a863..749ec258e40692ef51879cfe7259b68bf9a174b7 100644 GIT binary patch literal 68996 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%0DZ@{0Y7e5^l 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%0DCoPj- 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

    yec~N#>BwPs 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 literal 74306 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 + +Documentation +============= +.. Do not edit this section It was auto-generated +.. by the `update_README.py` script. + + +`n_det_generators `_ + Read the wave function + + +`psi_coef_generators `_ + read wf + .br + + +`psi_det_generators `_ + read wf + .br + + +`select_max `_ + Memo to skip useless selectors + + +`size_select_max `_ + Size of the select_max array + diff --git a/plugins/Hartree_Fock/.gitignore b/plugins/Hartree_Fock/.gitignore index f1a4ff4f..9f1c0929 100644 --- a/plugins/Hartree_Fock/.gitignore +++ b/plugins/Hartree_Fock/.gitignore @@ -5,6 +5,7 @@ AO_Basis Bitmask Electrons Ezfio_files +Huckel_guess IRPF90_man IRPF90_temp Integrals_Bielec @@ -15,6 +16,7 @@ Makefile Makefile.depend Nuclei Pseudo +SCF Utils ZMQ ezfio_interface.irp.f diff --git a/plugins/Hartree_Fock/README.rst b/plugins/Hartree_Fock/README.rst index aad4fd56..77521b94 100644 --- a/plugins/Hartree_Fock/README.rst +++ b/plugins/Hartree_Fock/README.rst @@ -25,6 +25,7 @@ Needed Modules * `Integrals_Bielec `_ * `MOGuess `_ +* `Bitmask `_ Documentation ============= @@ -32,11 +33,11 @@ Documentation .. by the `update_README.py` script. -`ao_bi_elec_integral_alpha `_ +`ao_bi_elec_integral_alpha `_ Alpha Fock matrix in AO basis set -`ao_bi_elec_integral_beta `_ +`ao_bi_elec_integral_beta `_ Alpha Fock matrix in AO basis set @@ -52,7 +53,7 @@ Documentation Diagonal Fock matrix in the MO basis -`diagonal_fock_matrix_mo_sum `_ +`diagonal_fock_matrix_mo_sum `_ diagonal element of the fock matrix calculated as the sum over all the interactions with all the electrons in the RHF determinant diagonal_Fock_matrix_mo_sum(i) = sum_{j=1, N_elec} 2 J_ij -K_ij @@ -62,23 +63,23 @@ Documentation Diagonal Fock matrix in the MO basis -`fock_matrix_alpha_ao `_ +`fock_matrix_alpha_ao `_ Alpha Fock matrix in AO basis set -`fock_matrix_alpha_mo `_ +`fock_matrix_alpha_mo `_ Fock matrix on the MO basis -`fock_matrix_ao `_ +`fock_matrix_ao `_ Fock matrix in AO basis set -`fock_matrix_beta_ao `_ +`fock_matrix_beta_ao `_ Alpha Fock matrix in AO basis set -`fock_matrix_beta_mo `_ +`fock_matrix_beta_mo `_ Fock matrix on the MO basis @@ -114,7 +115,7 @@ Documentation .br -`fock_mo_to_ao `_ +`fock_mo_to_ao `_ Undocumented @@ -134,7 +135,7 @@ Documentation S^-1 Beta density matrix in the AO basis x S^-1 -`hf_energy `_ +`hf_energy `_ Hartree-Fock energy @@ -142,18 +143,22 @@ Documentation Build the MOs using the extended Huckel model -`level_shift `_ +`level_shift `_ Energy shift on the virtual MOs to improve SCF convergence -`mo_guess_type `_ +`mo_guess_type `_ Initial MO guess. Can be [ Huckel | HCore ] -`n_it_scf_max `_ +`n_it_scf_max `_ Maximum number of SCF iterations +`no_oa_or_av_opt `_ + If true, skip the (inactive+core) --> (active) and the (active) --> (virtual) orbital rotations within the SCF procedure + + `run `_ Run SCF calculation @@ -165,6 +170,6 @@ Documentation optional: mo_basis.mo_coef -`thresh_scf `_ +`thresh_scf `_ Threshold on the convergence of the Hartree Fock energy diff --git a/plugins/Hartree_Fock/tree_dependency.png b/plugins/Hartree_Fock/tree_dependency.png index cb1d9738b4074f3ba0e882f29a4ba3fde03f9e5a..67de2eeeb7bb20fc07bb589d03836c671dff53d7 100644 GIT binary patch literal 70029 zcmX_o2RxN;|NpTf2_coNknAL1E1OUWNod%Tij3@;l~f27vPUQi$<9hbk}VXnB4j7q z|9yI1zyI~T9#79H=iK*oU)SgJUe^iH(Nf<{%|cBe5O$x^P}L<6NcHevPbyNp@{$mf zfdAQHenwrDuuc3=az$nofxt;PrK+Uo7C+tZdWG@tw$z*})y_kY0@;=$Q&MSqRdmQH zKAcl$v)yaZ_0qY!ZGOFPxkEqO`E7Sm$u;4b3p#tQQjkX+*6^RMIHX8*@$dSG{7=SS z?nWgy1rB*Po@mz@u#ZNv9 z;$PHuwYR??nZI=TvNWsKwQJXI-!8B;l8vRCV#X?Gk+;Ma%}LwWV1>Z&z2Bv$JzE!=+1?S}D(-Jv%`r{>|CR$-eZ;#bBP; zUH|d4T8l6FWn}QK8JL)u7#J9wJbAMFkW#DYkm*frs>mZLI))c6T+r3kH8wUrckbNz ze*^#Q^5qBe^hb`%vTHxr{qMj3_?f7moPMtRVuB2xA@Jlh55o&R0gwLfG5%1s^SUhN zp*y0Reosu87WB%phc{cLHC|ZYUr+e?(@G+)zpqcgn9F$QlhY>)l3%}m?dRu*pNWZy zFaC}E{QRP#BBn}pDi(I!lm;(3snV%ar+j?2z7^ZG=^5zj>*L-oTsTZmMIf9$eR^$e zZO4us_~|6m-`c99t=-bv`baA?t*NWCGjEGNARuGz<-gI_*Z1ku=_NZ{@YSnV&!1enx`g9_pq)uWV3x;jQin`?h=ig)E3=4@VC?~;>}OjVC%R#a4^r>E!q8}Ht+dSAgbUb*tUw|6HY zxy`zJw&#DNw>P5EGKVafi4jXd+}hUG_P~Jy*Z+;u($dw{)rqqTXLd3k(Ry1@a9m8x zf3NB0jT<)vgoxvFV`F1;v#^kmrC2O}kw73LBRg@TJcRLx%n9NM=TKk|ueV@3noec9 z5RkmJGwA*I@89S$C{#X z9eM&?wY9Y!9UX0L#J6Q;W>&dnK)PFBU0wawt(mE>xmZaDXw+O>iWE6TB_z}elB1)e z%gf8(h}l%q?qlr1`T6DLyI&7*2P<+meEzJd zp`mf+%!Baoqaq^u7cTr+UZ$lY4tqyO|M9~*gSbXc9esV5_2u8b+nbW|@`<%WhK7bK zRcX1o;m%Gv3fP2SzJ!H@xUVf;zjB2&u317%jGBff{)Fo-9Uc1Vbh{iC^NZ~4a?DcQgM9^W-Z(iq{cMgawjX+b;J6iih-!{XK>CZKqUA3M zCnW6#yq2e9BO`T9O@BQ5@20Yfidh#YIqu~nZG;9BBjfGK&KDb~~&y8rwf%dH;9 z#Kg3+vXWy|?t&}I`@6JXPfyQj=6mVw@h=zj^|6tB{&X3f&(x}u;iEbzx~gCKxDoOS3w1}YDwsfUNLomd`iWc2mj-d?ZTUi|Y1zpF7| zdec#w?;mO=9*MV96L6@xLEG9Dbu}2NsRKKy9%{3C%w?+A|U~R$(jE0f@>`w zW#W%14)uMCefCUEP3>0S+v~k=u6oJ)t}cujs*^X;Yx+F$? z!SZU(Z6nEd>lANP?fduG?Xq%m`C(L%d)>Y<>XJJ+IH-rS%egO%-uvRUbLWpJ?K}C$ zIO*>cNyJDq%KB^=lPoP;sZ;j6p=kX@`0ahPa;Ue$td2$BxpOC6VQYUv*nVA2D)LY)N1p<#=J!_L2%K_TVP!|v zqcyf_haR19En_w;ne(Oa@QQXTlzX}_{XgUx%?Oggt(8=!(dDQ_jV4*Uj`|J8l7idwwL5PbHEcS(ORPoxIVd(j;lESgY#K?G>$IFyJ$WRev3LtkD(jn5rIyj3zvhaJ zwZ-!=k*3h!Q&r?yGkL0fIbrEC;kKJ>LlarFh}prD=gvhG6-j*dx{pF(-MP51z!lYq z>iI$Dk^EjJ0-@TEtoq}QO>kRTA| zW~*j}z2*Q8Tm3GyRk_YC7e?OvN?@mxu-j1|wp%jMti)kN&D50hE{Wospg-OQRFVF> z4@$&5dsb9fXqNZ8QgHM`P7Xcc(a|bZ7M4dDygXc_DIMicf7xE}@Sq|zbY*L(t8d52 zdoq&{+P3m5Re(r$BAv2=AK zhk|K0i|;&R5wq>v_E>PfxL9~|yV-ZpTQa#iJ>~Ul6#rZA19vtzH#>ggvA{ESQ?E{t zbjA(*oIF2q{fXo4+rWOV(>?QxEeiGZ^;1(*7HoTXZWDXxU9HSPtR%G2J$v>5+>C!o zV5G^5B8V^R85qodFYV~+y1+>fc;>tIEA#Z}xhyH(>TN5HW3Mh13P?)2cIR9?D0%B` zVWFJovXF1!(hv3_kLisguZ-_-pSp0N3xx%^$?ki}eACe?(ftokMe&-kG4Uu6@9)Q_ zrY1U8DSN;iZ|}{*n_uq+1p)6`urUQb$Alce_GJT?TUJ&EpmVvx`tSEayZ-$7gL}W(owIZI?jT|1`p1CM5B42Rl)lY-^k@qR2LN)C*TPOsPYY&E zpVs|gG3bDq(@ z)|a-nJyRu|53$5TPuA7d0bW%)Pw9Jjls$dg{my-nS>(!odivzlRDWmdN5m@f9Ss_A zswGJQw1Ad|=E_^^w$zgk8Z5=SQcvp0 zCjh#~#KhntG2XvdmXoVkT^tX-dlyjXedB>-5h9c%5VCS|9%6)r`CulEj1n?3GLn*# zs;a7hVJj-+a@bh&!5+@*>JE>LSeToGK9Q5wq@Ri+#ULZw+}t$#65v6kdli&QkAPp7 zCJ+4srCBdu0<;4KV|co`Rp%?@f!7#U`6N7k{5Udl0jTlaJ6Uoin%%p}29Ak}R?Dba zGu>&V^Y^G5Uj&>qe)kVqK7P!^8x_KSEg?RB`uA@(R#yD9wXvC-$eDO#gN1VybP}A$ z%F62M)#sU+Y1eqpXJ|UyzOABt`g3!0J}o25RorK?-;Gr|IPz1 z(vv59Wex6FqPipeK&?Ahb6G|~3O=}oSmKh>eXI_EWD7Nee>3>pY~El1BbN&Rko)-o1=#_(X&8gl~X{5SVGmfBJ@D*lTI6lv|GOwiB8WouDFzE zN)n=4=DofgxRdej_HM;T4~fKFC781zfRc`uT^9RS3Xm9_M%bv#i6{IC>z+ONmW>Rt zTa&25(IQ6AA|oBQHdZNiF*n>&p%-Vhmsg--p{5PKy|LnO`SLgS#h=%2+(2i*9(iS$ zZ_aZ~ezmo&E#&_FwdsNu=A*{%TxX3PDtO65`SK(g$ajB97Fhnsd-duV86~ZhjLd7J zatT4fsfDp7%$Ff0h0?5_0Z6?LrbkdeC-3dscV4Rt;CBxmJOE6kJ#J$6RK)0$si>jQ z)2OJ9rs$*jw3Pk>#NzOWOzF}3-`Vw*m7Z_ku31{f%Q(Nx%d>Aul+(T5p4x*=ZGswo z_0!`Q=Q9&exYAD9b58gYH?DEb{feP9-4|f0eO12OeJJ#~CM_fLd0|xkggeeY^qt&> z`A1HIyx_f}c+aklMrosAadUC~_^^xq=Z`1E!lXal*f8B&fFg$bxN_ynewrQKLy8t` zc-G|A>w7(8V`KBowVAQ%QRIxST(SBbS}hQ5*<2|FvhGv6U5XPEXVxmQWY; zxT94Yj?K^hJK-`tVKH%lDw5xDoHEqNNMO0hrq}%H)gWh``*gvz-iytWw{G1!6DAMvVaiG7Ata9NG%=FKTk z$TMfoK=}bXCN}UQtdG#0dFFPO?d|PgieO$H{uH~GX9wx(dxJ-JbgwE=)9O!$+Plea z0W5;heS7DAJgQOFb2;bbOMz}BrTcWo_%~;+CMOf{ZeD=<5UOO^Tfi+3AEv<5p`ZjRlQOLvu)cQvdMt|b!LMJzAUMa8&4GW{ih1UAl4&lBOd^T3PvJFt?w>SR|64i%f&XZ)?FOtu_D84Tj zv&!_b{rQ=+)KoMkJT~Zhe$G;lQvDj~Q26TxdWNQ^;vys8k2%W8%D#E?CXbdxYq7hmr*+9 zw^l~*yaf$jLm|!K_E$URwoD!>g!Kj_!^OpA`ZGXh7qig4kPtJ`{T&%+A%WG%uv#+# z+p+NT2rgHyO=d$NG|Z=T9v>Q-$5tpSlTlEpg5rm#r6!1{{qWRskA+w)aES;XUr(8{ zV5nNHjJS2+Gbso3{7B%a;$l}14;ie`GzRP&t5$YT^dSzfIlq(?GcT_VpeEE4nz*-$ zo9$n}YHMmPLD`z0cc1$~Li`;%{LT(s3UnsZI(Bh#)JEu6u7-v^8>@@kYg0#w7jmGd zk1;YE+Yq8bnu-HaurV_;n_K1;x5Rq>JLp@SpWj>JU~%qTn;#h^N&w4$SVW^F%RRNH zZ{J=-!Ku?OC@26WX=@ukjE^A7J)B~{ddr-%fwQ1I-MD!ZQr?p%LuR`tIcSyWb1d#K z9q6-|{Sd;429G&h0csrjeb)Vkt!-CF$B1KT#a_ca(;5)Iu>+A0zgPMC{%U`ol9Gbj z>py-$r^+;egGUhiktbP)4=-03(G1y_Ty1*VD9v*q_V_g|^gWO@h>+jDeM2>5`Gtza z;~lxzv)tvk|6b3YGT-ejtPhWk=V)+Wzkbcm%4$#$IKVF;0MRbJ%{n3?0viK+GW5#a zC%Q-$hj2McO3EG!yHP4?>Qo)R{%FRK4-nu4b$^l(AOvFFEUtQ?VEFr!5~oxI&zAp= z+_IV&sb8LDW8}>CK3R4<=rl2bJm-M~0U?}Zydl3?lW|Z@(he*KdUT<@cXwyJdeyHU zi}eMm7Gl-i+99H}*7Q`^Uh&PI2_Q+_*6bS{1B2qSvPvION&{T6ZZl>s;Q|#L!Er3sIT9Bf3M)j(1R#HPjaiaSZM2{BUjhfTwV~k8A9*` z4LUzl5_Ha=FUQ1yR*;dBCd#_||9i8%a(Qu9lv0Q>z{Lvg3znBJ$BmxB?2BXfudR%P zAD;DEaFY$XKHht9@7^cb2D!k%Uy>BIp@k8rPzXEU=n1shvNEe{*SM+LA?Qwa@;gcA z^c?I0xBNIV|3SO?^XKpV{l^}v%imKSM&*eXzAWK7^BvvG0tGk{Y{sw79BiL~ihQ2k z+}heuPw(xu7Iro^HnG@^)$ye9@o@__UU4Rrk%?`7KgE@`soZ>8bstr(wj$ea(7-Tv z`H;i-e@H2|Zd+cxy1Kqz&}$=~bkrFB#Mt!o!`dMUo1VPu9lVggX}AOLTGZX&3&zKt z)H1%f%Hh4Vr+cV@jyCv&$5K{V+1kqs*&rHau(|8L37qt*nA5tv%N8{U|3IT zMq|9XnE97q*D#@r)Ct1-;Yo zS=QD(VB)}15J-9P;?%-*_*5D^H?CjbLmgxzarujb06%}5wK#etTq;g_KBoI1Q}Bx3 zsid{Fa_>96&c+bZIs3_O;9ZDSW#wOTS@vykPr%(5-U8O5^yDwlfuR`VYIAdQfsr{n zvEjSA{u38ZK5>JiK$3>JEC7=F6nZ8o8-D)!l>$xQ3G@ujM9nU2VhHv_biG_tl*9k!C-Me=Kr~+;8X5fi)&dSb?YP7@)cv&n~lQ-(R_%on(m@t6A zD_k_;_2*yciPP-~QN^$B-Md#T76?J+k!HtHKv*W~xVX4Ih2CpPr;O)@=G|o3=?L_g zvJ{ju7*|@~SnbFZsZ};1`k9$<~!2Pl+xC~dYej+ymq*73D*X9rw zQi>f`4)`p_$A1F`8+ulEcQ>~JKe4%h4Z?XFpLat;u9ab>B1>EOq|L){0qWB};)q7m z=N0t$NUz)eVex_r2AofacU4;WseCf)>}yK zUc5WcU}}1LAg?2)MJC~vrKKg{Aa3URb^fh(o)Zd+?OY5Y1C`!!sPZ5XNlD>9Wu0W$ zse{bX_C#vHn7)7a;+f7?PRRpy0iVmt$|@--Nl#bZ*!SvqM#nEm{OXJ;*i@jTMAUTd z?~iB`pI(6E7KLq^S>G_FH15@|uV0VHeue_DM0pqMPo*U&L^Tzkh;{|)xc0T7fok&s zuXIi=hr^1O&&iV%0X2%byf<&&tQ+4A!xXlw^)XN@`Gre{hB2|R7cX5xy*WL`;%dVX zq6*^cv$}8&&R9g&nQ&dU>p)dy7i zDmxPv?HJXk>gwv&*4FlRxEYL7S$ofdV46wd^C#RZGBSRmum7H&77`Y2qlCIeEqi)Y z^gl^Sh*(E>d3kww(law}OR-}8!^#_X#ie@2+31si4O?EjmRV72DTYN0vPlV8 z>m(l)BP;DVV51PTpn^hDBex&auy{a>@bvTq&6be~>peCEcMQ)R&Lcn-EY#rIl#X8{BqZpyP`^G*{{6}G{r|E6 z^3Bkbe707{Ay#>9%-6?|6B;>oH0I{y2=VjpY<2+yLJ1%cfTH-%XGlp)pN$bEIqOU< zQJ;}|!`j+3-w>ZoeAa&^Apm>8p~QkjAq)67P|Bh508@5Hd{V(wVxePT+qk=zR#y7x z=;&bXii;&}_`W45a%yO6YinrS1ABS!0G$DP%}#3SXUDIFq2$B|^unBq;8qtgewX#= zHmh=fBloI9>31l47#}`-fHd~>DKoAW+jA)~9J}V#tKa*jrNSuwi8rNib0=(HLo(;2 zGQWQP7uwFq$jI;Ca;PFGV9qh^JoHqlX=&SA>$6}RZ;OkeO_2jpQBt0emges{@`Q~x zcyYS-_)=#|US8{`Pd8v}p)1CTn)!Q?D$-jn{%rQ${PXpRputn2i(E;e%KIZPEHGjp z7*}|}ki&Y1uZvB94i@}xWM*at2U9*d{iMz%B_gAwB&Nm`a%fugI;meZZU#$naL^as z8U@ObQc4KTW0knJ03`bQE@8!o%dc5CMjm#OVVf#ZD>leAHY#--0}aOQLT|-}!f>3B z_v381mgMaMD-`O727Y%#;&?r4bA z0Hr8J=o;Wr&|~S?SScfk(j|Og#1IICjm^!G;bF@%Y5Alo(;8A|=RfJ`Jh8W^-goCk znpj!=lpOR5prx~e?~936KY7wYiuF1LW#}F(tZOZaMtP=wkd)rMS@;}#9DD&CIWKHV z&P#q9w~0D}gvwO+D|=lPX*_wN@bPs1JI6MreE?$(Dl3E$64dyocdLQCmVc}th z5Xj>~M~~LSZ~YD22p%rQI#WxhfL0yZrVoL&?e#wE2f`ZjG$O0VVn2hXoabW#`T-OZ z7ZJI|!y3a`*U{eY2*3}HPey8`0R<9@d+*sV zU#tr76u>>hwr%#_Q72jfu)y&X+0qGmv zEn>Wzk&zLF=&-`#_XC zC}9IxO+-Wl|B#uA+>vURKM%kWtE`(23XT@`QE=0>Bkx>(BOUY%TU;aCJCNttei}x` zsGW?w0NkIch-LY&bO9$kcCCUZU7u~`p1t)F)@4{wro=Ngy7oWJ^3okC95UrWpfv!K3q2>_NzY zH&a&S1YdZyN~us}(tg_Da)*(R_7ak$Rr!?_KAU}mgC-X*u4X3rOwP9|cvWq0od82{ z7!DND4|})%1=V6FIbs)NWqFmA>_+XIzUkPzXn^%>oKjLHg@qU1*hBme4pt8jQvd3^ zl>D}+=u5oxc@vYWoE%N&DeY6IfTd9UMiy7!7%K4i%5CpA6k?Wf4}JJ0eFrITm3%ih zJr$r#Id&VNdbBZ0UD<7chan`4L*aF5>H=D&tBcEN*D=g9)(hO1S55|kr@VS82~y6J zOl6|7vaDyV`nT1gr=T6Swo1878v-VU*JDMV@Y#@(Nos^$Q+GH>`B2~KhSt_O030C^ zk)QK!z*A^U^6m@iSRd2!Oh0>UmeKYh<5_lo6X4~&tIGB2N~x||=9NeBf9yN)eo(@f z=H}>=qResOK3@a0-l_92JTLES+G6Fd{ zdGfAnpJO1~`)+wfZ%4odA`no<%l=9?efgq){yZ5$Rb4&p444ZAA-Ut1MS+5vk546# z2((now_E5re1d|ry#?xOQ^BJzrp|@8j1wEDv~*+XMI+aKx=#}feu{HYx)9&m6Y>G{ zED5^!8NY#<#Vch_jV&$VYH4^KSLQumw-55wu)$!Z_lav?h$zO^_BXa$TEX=*m2BRh zhU|$88SSTjq-_jR42SPVK42dj_tU5P2;!hAc&u}xs6klyJ2%(b)dhnFk^m7Rz>jFH zq<2zwQBkR_eDG(phVpV^%Q(jgm(RVu7qKb<3tL)<(Hyc66XxOJVGW*k;sbfL7r;MK zl?&bZ%*`M<<*G%*@nDb&jY99)*_FlxH6R=QCRxHwW|BK zYuLU74`gXYsf==Pq%Cvss46Et$_TK>enOt}RQJIBKkLLhuODfK1Y$kk)PU*?NDN8# z`I{mDrJPHJrvhj?PwX(-LA%xQevfwy2LQdu*;bhi8BK@?{4Bp`}!9 z%p3_pi1}t-#8Oe-piyeLk%yG$`Xh87{7o!xCNX9NmAcI1&&z2El18PkYz_d!#Jb4y zSfp%QtMxEo>)+WyJ8TVM;RJjRp}M|4Gu#z%BnTOVI}s7Yf@EaG7F-J{5M_`+Sfc%i zwMQVJZ$UM&v$gf!+9(B#kG_zi9s2Mg)Ed6t4=4gsVq$MfOJnOtAdqm#c`y-vOiuP$ zXjqCJAP^ta!h$1wp4L|T?X6AV0@{sT5vnOV%hSCb&)d&9-rn??t9hz`AQM3mhy$_$ zD&7^5=o-_{NeaH4^Gy&x(>i_)djIX8Gq_-66k0pP#myaD^|CUgim2O>5i-uk{Tv^s zB$POgQMcQ2sMW8}yh=C}TuVZLlX#l>r(~jqB-=pwl#PyUo zq#-w@srgW|n6$CebKM*Ck?;e6rA~n5RK=zahk}ogv96)vy`OjF2ZA{7!N4OVH@TGn zKM)AuItZ<%^vw)b9rgKxRV~L`g>0PjMRzBsB|Q11KYvg_>+1J`-&<%*NM!+Ee}|ZZ zmP+}byyf3fNEwGBXlZE)cjo5i{DOrk0gI;FubEn#TUd|~K&EO< zE)0Gcgj2>Fp@H^;0jM!?s%tLFB>H{rDWA<52Jh+i+TL%$BR%;Rz+Ynhff_tSUxSb7 z^rcJBG$oPn!wq5y5KIFfULE*GcVQt|7;9bgoRNM|qTeu)afh>8e>ndTA_;En;s_$3 z9}tAGnRaM4+7Vge^81oq!IS0vy5{EQ(FZC5{QY-Gxv55XfgGb7dU$%05ww!z`z`W) z6jn@|vR}R=B|tc(WXSstkftK=dq3176M|xNBH0_x)r1Fjc@GZSx~zt?ciL(%g`Kox zd`WX?^-uYkrTjB=*X%gLFk2dl^i3Mj@WBIKzZPK~_Im7L=Pw7(kkoGuEVK5mdGf!Ij|El!eZ39ZL6m6x-I`-L1*X*!&4a-}_yEQxk}k z0^(}pNxsH!ts~0HJdikpW=^>`K#IY{WDp7ak3GN7xrGnr`DLt@!D{O2 zl!QA)DNhd0rw>&$v(NncwUdD6Y!#lH+SDdCOo>g#@uR!Vgr3X6xu>n|(8c6`+x60Y z&-G+IeSL^CpF9Lrx#r=~1JZ$V0l&N%VCC^PiZrvf&dRZirqlU5=Rs4_q`XxB{W zVh?d6dUG1FVV{u@fa$T)z3uir&&{PHJYwBX)Bio$<E!4`O{Gf#yg{^;uf z0fWZ>Pp4Su<>C=GqRT)y53mzH3##mO>qhW5I)XizU}Je2&@u&KVrnW0hF(_Iz1ktf zv3a8oAY}6ER|sbV5Elsna1rl-M~0vHGg+e6$%KSV35e|rP znbQj-5?aQ;c6X;5*jS3WQ<-Rh(<932@vWn|`BlC7zf!Y37HvWxFj0@8)x%G}A|eSM zTf5^ZR|KE9cqgdSr4cP}gfqb2buV7vSd-$IobLkoA|XH+YI9Mu?sy3nU+8(n6&pm~ z6zY|F7^_*nA!=5$Rh9dqnwO{Io4l$j1%fFuq|g&=B-Y{Up!^2(9bW5s9$ZjNck$Gz zo$TS;SbUacdryIR;tAk}?7xq+Jr6edfdYZJ#?M*;t?(+s#(sZOnu=|DNj>~HHK3Sz zPz&8j88{vf=eA>*jw; z1Xh8gIU+P3Z>-cVZLHoVDC+4weyiV;R$29SCihM6^u+?JKPyQLOiZ26BO{x^y5!31 z-=p^$@e-7?r4NU!AGz1GRB>jhgth38w+Ww;&ai-_VB50~Y$55_!x z{MM?OW!J7Km* zt%w*?2G{micpA9GO*CUW&%15Fo*Jz}7RY0ZVqtXyF2czC3fzuo^&^ea84*8<2Ytv0 znz-C4#bkD9jq9tc5Qkl6-Nn2h--5@&dK^A2Wv!=i>eM*{0~7fF`XuqP?hL`Tjkg?) zG|JY>%$yNt0jdGfdXaP`ToKO+GS$uN*Rg$Q=;)x15$*tH@1812{tH3N3yK09h?*L| zM$1puf>42B=|RL5tJn%ipTPY=UqThr<(Tl&AqwN9eyvyUs90N0W)|J8Gfycr0Y`#1 z5uvRaGhr+}1Wm1&LpQvT+k7F!Z1lmsd!omWW0$Val+RjvU(`1=v_?*;{RiAv=7w@E7J#yS zQ2G1mwzXZ%##;55Bk~Fp!^8fyL-MPmjHS&6Iu|YkX+;RMWCXM(BMW3ZSZM^CTCIbY zP6;HcxVZTF^D&KsyGSR^lPUH66rn>y#9SneWm$7VdEK0w6j)=09&bUKL@}YOojA zwSxW(!3%^JJ`z#{>J2;hrHg`!;G@Qy8rf&v10w3(Es7@&sOKz9?i)p8CE=)yOU1HSS&WNm5r7T`26kX)+f zm^dp`IH*FK@ZONpdHHe@(`(mX7UV8W`?9dm85kXN?Ig2_B^OXEm#3?*UxfA#bcTZ= zPyj60v`iQn7=Ygav-4=lCwuLuqQK+UAu?zt${rw?BG6{l{OsPndm?EHDmol7nm<8G zAo~Fahp58;nm}Z~$3~*t;ZHL9FLV(ehQ`mIrx88G>NHdrzYCEy_j0iosu^B}io-pc zlVyjvAX*BFw;?6zAH^G?{E*EM{HMgp9bB6%`|R)En_xki>FL#RsXDH>NqBJZez|2H z#zU14=J0VtT|Vc~r+4WR0yHkrm>ELen%7aEv?Y~LwlDn-P?<*Nq8%?aPYiM!MfU@H zvf=cIB_~yuom6^N#@zt4(FmL?06k}8+nnqY#0R5)+S%E0aB$!{=3Ap%V<6DCcXTi^ zFu>SkU}QvTf;*6*m4NLc1JVU1kVD2Q&K~aiccvd|JY?l(F)_qcApCHg?WmCvp{NH8;p zW(5`!U;_jWH>?M^crr3t&%{GCcs|{lqA!93j6*cIHb{3cWMP{?+lL&B@LqU$cv6x{ z^lFOQ3v>~nP+UV=N(wf)8T7;`Nv@9Zy)|PdgMh$#$8C6JUqx{zI`h$pM>qps~PhH&ee|} z#GexrShRWJb}G+=?^{}KmK)#zy8 zm#}QYiq{tC=@wL4sDMSq#o^Gwphuv)!qN}A=C=7VH zS#33w37D6Pcke*V!A)B)W^sOQJi2-cz!*(Bb{5(+KmZ8=(X=C)F`{Pg1F@pN_4R4R zOYKQWrDC}b1Ioc+9zrVYZ;XL=?$Ft5tq?4D`t&I+!-pu9`Bg9G2Tx*R?hS0HQqqWt ziq3&xFE69}xi~mP#J_NRJnUEsxC8YblpET)o`5q#qbRtj>`)e{=SZGEN75UhrJn=l zb?aSHIqnXQxn1(thAH_gwdpZ zHr&M7h~^9g^tiaRMVDV+hGK*s_)zLzdYkB~my60vQtb3Oh&E${hPb5UK9lG)Y3)mYTyUj0eP(@o|Be9cM3}Y+GvnylGg@_v zwEd@miXll^@0EH`r%WGs`Z=~2#2AcT1U7nl_@^B+2Mi?9B<*EIGNDOT6>V7<&by1FPQ9bdmn zB6_&p{>y187g0x?k}`aKespnl_w3{7Xo#Y?nPgw!6ZC@CxTgdHSA;dF+Lk=Z4>AF( zSMH;WBBuG)6|R@NY$Af0izl$Kfbt#hsjBtZxWJ54Q`_-uFQRa59lL-L{+$Foh=-1W z(|s6Xu@9Z!ZKA6PA3f^3zATIhu%pQ{%)wqF+ySQ{8goBU8HrouV~Y+kCI#OaaV$5; z`-b&m8KD`YUk{2z!*~^t4?}}b^#xPJXzf#FVh`VUP3bpIA30&C;r!$n8%t7c1}9M@dKUo?N(?0hk0w9=fP&9Ez%npA zz$Py)R$%}sgznHb5mG*O>$_A=?SXP8P~Om{G5E#F(uA`+B3qNhI3W$_q@W)T`lmU1ys_u5GO zUxWhF1#KRKD2Opz)V&#bMfmMoJfuQl#Lxkj%6q06< zNa+j!-J&AqW^q1j79+?*Y;4p)sjpvarRZeoy~LcYx#<{$VxM8=hC5zh2`n93JGiH1 zj+T(D`vOY|yk|HEPlz}GF(Jn_+bJnwMnFA*=3%ZlP3mZDF)6I>j$er$#5q{^LtR*o z*fHCDLs4o^y8T0-kdji<#;^!5U{=ZE<>WYorcpZ$bv^U zTFNKkBKq3e{3@RpSDbUCQ*}KgezVWT2rUvQ2#sr{b}qY&Q3$v>!cTXVH^*fGpCqeoN_eYl)&ev(Mk%W5H99^d~E z2UtxRdiJ;V^*xJ?4Kdz>ye{0$fWLyfV8QIoh?cv7=s%Duur1Ki?gms~AUUwiC3dViL2=X(#B3AN8(XO$`l(;sgu& z6je)>+MX00DIhxB$McMg_Yn$XJ9!ljIJ&st)WjM@*77R&v{`zSM9tc9?DQ(-4rdr@ z3&RPcqoY`^vg``i+j;2z4OiE{Xy4&;ZHBOzK=z6dH*J<2G-cZ*E@dO}t)t^Sj;|g% zWTxjdrAH&W+DI)ESPwT2D$!R965KSd&Z0i7QCc+1q(3hjH^cYH0?$~`g znmK)VzNF5GAN5*P;j%itC9F}@1^5ZI5)9T2?6Pj6AXebRaG1#OFv(*!EXP2|wzjsg zSy7+0vvy91n0E*HOthVma|!ut9qv&)Y(Ul~`dA!IJjjT+Qt^2vS&J=>GKA)Hx&Uz*GxfA&vi`JHjeK) zKA?`IBUeHhZ!Jp0Ucs|cPHC;KCN%rQSksN~Attwx9zQB1#5z)NnC~GXu?7ZT8>5au zx2D(f6g+_mx&P$J1%y%|J0SfCWRBJV@4Qi1fQk_~8OfpwrDu;G>FDVN){mfA2AiC3 zuqwc+gNRv-Ed7h%-DW{GrkY9en-7jwuC(}W1vm>)?@AQ-q>7COK=}8NTsh8id(8dt z^HTN~h2hZJoicI$tsq68*AmQ9%$HgkxH&{vx}sGgw<0I4!RuFCHRntu<(D!jzwIyX}!nge(oNv;(ZB@ zy>yBeHU7zy|FA1*Ebdwcwv1Em z*ulJSA5P`J&)=0!%c~G8W&fiZ+xZ+2kliVePY~nT!77twC8adY@O?qJ@`=4Exw*42 z0)W8)ck;rRB2lndP@a&4$5W`;akiZT7YEnnWoqg$cKznlE0~4oCS*olv!?p19VJ(a z(X?`O6bq<j$@y&uVvY*z&Iu1(2#%s`t=L= z19%3y#Ol49kKSS(Cm=Howuem)EA4{}YaIz?cjQjqs9wAC+MSRM0O3(jEZG>+HR#E4 zPX8A&TdN3Zpw1u^gQRCIN*ziF2%W+C^I$&T5t)5oTYKBl@kf6`8@xqlym$pU5D@tM zu#*ne-xAwl%|J3+#M{7~S-xCSRPXogjscDtuX9`j!9Fpj>o z-=FeY%BhX?@J7qX#!)}lencdvEU0v-CWm3z2=nokU?)`_Cbk==*Xk$E@$m8{N;%+r zK@RNSpBx>45Cp>c_WltOpR22Xe0m}Xe?iu1q7?`8@@cPi1{nCXV=E3og9K(LdAj{8 zGYL=hqP{+FM;2$$v76mOWm@dx?$p^T{P!-4VEe9RdoD_4&RmypN9_N z7H3^+Pmdb}P=xO^U4FB*>Jh&l0=*8P2KiVBphvHih$<-f;^Yff4m#8ApPzA@)f8ct zq?YJ&`*k?@m_DHnVx79od=GIJO51NU$947a;lqfW-$~f`0GbBEa+Qf8T@=PZW=_sK zk3Tm`Z6lOZh{pP+ed|y+vRM#Yh?Y%fCr-1?AV}W5$K`-4QzSpmGoc@YF|cLLjg4*G1E>OA&{n)W`z6?zOVw{(ZTW?sU_?a4tcM8&YYWBuU>i24^uqb z1&RQU2Q9@zdgAx*{`#fBR(b?d(~P76;&ypf(ot*r=>D9YwYz$CFFU(@k0e$*0#oF) z-)a9KY|vCwa|rT0A0Lq74hSfIHKsTuaD;~kUQ%Ss_+^B8Ua4VGs{J@TZT-Pi6kB^4 zGm4A?<&>csW6VbS=Y|GrBxG@7fo1w2F@bjF3eC7x0D%CN9`C1>`5-#yae)LH@!UyH+I=icpU5P!SD^<{iY1B$`ZsDngMJvQ z2Bl|!-eWpJ*4+`21{mV@_xR!cenJKof)yT7oY>XV&|Xn~QdENf1>UXOA#^|hgWw9A znVo}Uu%|~OvjfW?BlBz=QvQ-2w`KK_)mwm9f`{+}4El z4>=T!ne&y>G_$b2=3=pE=g4DG%{trL>)^0b z#U>{~(ZYh8pvcEWNtROD~?k^gqDS_;&L5|@(00|fXv`2iA%NMiO!r+h_s>?VcK#tj4hng2DHwYGt)57Jd2d1t02g&is#kiSSs z9?Ia9hB_-6I{pom9?bJ1SHy(E_G%08C|m$a`7d)Zq;{UCJD@7!m=j7_@bWVD0c=JT zu3u^tp)wF7i5`c?*w+MT)|W1^1Sv<{*6Vrs`nB5S&{U(H^KS1-v@38fIdy=Z-Cy`} zQM`h$5A;j~f7DzL$+DYVzPwBQ$SkSx>M6#kM%L+St4P!uC@n*7Av!>f?BTPO@rs=L z4<1zTT(-%%Do?mmS-AzF262-u@HL=3SjE6x(8F5dB%z~ztE;<;?M2L5+`9EqM)x66 zC?fa&{{2d0R3>nP>HhWx@~EUvPOA6j`FC48Pk!#|deSt8aF@n00c&xzk;#GY5sI8T zFFIk70-2dHbTuetcGQLBm6WU?RtUUF(q*RPkl&L)J z+aH9tVV4w~i@NDt4EtURhY8%+?yjFLmnwwu(&?r6KBGr ze}_l%hxb;^h~sSO?BXY*+2e!Peh?Gd4_BE;5B%nrD7w}E3~F&y)NyuhaQ$^q02~j& z6qW=Y(v)IlV;ijSq_j=b$-;I49cD2;6}7{<(;C9QcnbTaNcu|!_)3FcjB=F>an15x zD|7!GbY&m5@OtR6TsK7)l;V?msE{vhYb$m7)$aBXis853-m%e9aHxA{_P-CTZEejf zEj`dTQ02P~b(JbNv5{Kg&1XDi#6SQ&aGD(JLK;{e9z)1M^WWH!N#4tFvqN;qW&x#% z(tn9wBMW1B4EOnm!Y^a#Q57)R*lo-Ycmj8VHSHr1Le)@L4$ON+25?-=K#(6O1s+rF z$ULH_CYfi5jI`Lh_m-3q*XI7Wn=Fdi&)Kw;s~)6XFf zs&v(Wm&V4#R14cPDPE{XfK+)z0lgIIiI2?wHx~S)6z1n<`k{B%}34dBn!=l*xb z2pkA@+YYu+u5&PM&aGFlj^ZeLOVI_ z5Y3C3=+VKnD=zt1vBkC~)j;kYF zyL1W#4i}CR=_YFoT8-=iQken*Nbn-P4>c2+xxIT+b^{E&eob3?p~Uw?U`l4@I81;? z-1r&Af?{R|&a)?>d*F)zaGpl$#0lt0 z#aOIGMG);+Lc2RUj(-tCTH=riBw`#3!q@Lupt|7C+1V$qequuD=w-bcfX7S>tAP>V z3{L1EQ>a=;Yb!C=G*%O*F1R8f6=A?*xIn1P4)|2$f5cpLe}fqxA79ps z7en?^=(P-l$X0byFS#@ZivuTAET~d3N?0Yw|!)*-;8g$QHzb%SNc=`SYOKp^w`g zyt{!{z|6oVG4Qn$tt^`O-ZH4g_Ac#r7Ol!v zSX88J#}%TAa58~_L#((E&@pT;45B{sZ}b?vRK^lBEU-F@vkfH~5i(LzI5nYC!$MCW zXz~`IQlkO@E+9aNw=67-(BPT)56z#^={mG1TowFMTx9J=kOZ&wgXS1aF|Z>2B zEX6L`r^@NQ4rWck5vI4c*4EbGla|PC=We&Xt{rG^k9_*n1z=-o$q6T;Zr!3i8&5?; z6L?w_zlm=`<8Y=3Rr6hFJOWn=+hOE$8IsK)132FdYJ)>lFe+<@8X6nVCdhQ*a5ehS zFb8rR$*<+D3ojcP^*dMzQzPAjz5%ZZ17)KX;_)Sf`2W>T(vq}js;o*vWi+Ko3J*z0LRPX@+CxMO$xgC8luuTqqq ztRnS$T|U3>AHQ+`;nVYx`@XO1dcV*2c^>C+9H*DJ*;Yzm|Lnk;A1wvFdJD;NN~N;WW{60_BS`*o}T{m`}Zyi z3IRDj@NHBSZMjC4JiHu(>OX@G5gM^zkXi7_;9ynd0*@1s3oi~wo+*oB%D;yOW_TP~ z>pOnDx&HWA~hO z=p+gPMgs8GhzGoAB0nMRpE`Bix6dsO*kC~I{+1?ZNL@5{F8zF)kd2nB*C1JZpD}230nj7lsi#AoK#u79+n~h|KrDFq39eK_ii;h z5_mar?)s*t)UKp}n%%m|2sK|;1EdgU-_Yz}v!irL?>9w_eS_OT&i7+h83-Al(MG0E zMDyy@sRGQ5fHr@%wkBkoZ?Lf+ph6S1TQ@deuWRqtpr<%?Y`&9IRKDV9$(~8H7Ps%) zr@Z1q`u6PrODJt_-bB=gXGp7#+p=E8P4H;w+BNn@+!*a!EFqB9(ncpmX0P$$hpr3O zUIU?3?qO#QEm8W4U|_eTQe&Y44XYTXdN!^hiFB`}Te z!@7itz@K!^f_!3l2w-V6>ywghCu$80EXb$^9K%($Z9+-(up#M{ILbI3|0KaCSPmKu zQ_>1RLG!GqG!+=s-1YFvP0}vlkc4LsSFz=$`m469g&0K9uPQ}43;S6?AvNXbCpH@A z3V{HHpVwJG+Q2kTuH<#CY#S^cGn05fvLkudt}(`HB#Ldql6B3!Ah@p~_iJbo? zy?QNrei0Ht7wtjw{ryivpP^R6?kE5LW)D~m)!lI$SkiE-2W{KD0|`*^+&w+_4wxk? z6ux|k>8t<5!$!9jUpnp6PgiLbq}80MsLEO(s$C6UskwiO3$R9WQ&Yqw<)6*XzhISu zP$6c_J}NEYxcuUO{{aABVyAMBlH?cplRQ(LrKP8vMtjD(7%sx(Z?h{JLQ)s$VB54v zx`rGK{+2r+BVvTBdfRFD%hgcwqy=TfkzWw^S zyl{_k7t$+1UmyLq3Uzvap%C>W>`_)w$Xmn&fX9Obf80eth0V3nbQEH9sqjSlsX8V1 zhykzKu2t5S#FJX~nyIC2j02F-%1Zh+1_nhBA9jy*LQ5Woax(SE1w;LEd5#zOH4hMU zXL^Y)I36B>XCB{GuX^y{O>M16Zmzr5W!{_LOMoE;k&JQP)~*Xr+4ih#laEG-9@aPu zx^&r$(tp4cWVDAp_vD^E>&J%PxbZqz4TfbD_MhIoF}dcaq7tY;i;(sd#}M=^8q9bp z!4M|C-lOJJxR8g`DPtgh1OqKB79;l@U;f2tE-4n}jX{bV80S0~VSTi?zRoFbEXeIK zv*8`r)*6^Ml)*{#%lDr>`#XqPd`t|rm_3*waMj(U$W2a}CJ%+W;-ZIN! zepuZBPUQ<1rZ^3<7b4QrCxdUPkDPtuYH2CWa(abi&ZJJD_YQu|Dp$(^Xs7g>L{0c@ zF@InSKKaP%-qK4P1Ijg{h3pSxF9ErlMdBLI1AP5y%bK~dJ|Rr&MC5S!fu zo0*n7II|yXmDrw_8z-wbd5L?}2fzFf3Bi&QIS9#uAk+XAS+$fH@YsTCmtG)zYbws6 z#iOe<%5M&_Yl+P>7{6C%du@n(Sa9xKHzA^=)^&wOKeq|jz~YF>s0w2Sxtad1xDMrs zP_(Hu)lY*QMzkS(bn7{`6g20rO1FKnY`PHt-N5&tlHYg$aIe$y@0D{`ztG_YrlW}y3+n@0gMYpS*eer zF)uzL*fS93t*xzz>%_HT)ygp5;i3|>svkVK7Ldb91r82f>c9*P8=^{TEj2yFyk@G- zU-A?rwwl)zN?bp2fKngJ5XeBlVd}b%hQIo*URu7P`^x>NYww-$IRSrn5*eA|&7@L|$Pd&dd=k#gKC53->Xs!N3@+1g!Tbz68ycr&Ko**n9zSNzE z53fR6jr!=$9gz$`p?UOZD~?f}w`azOJH~|@#at}_d;eRam6etzeAWJ|fT;*14us>u z<@8&%VTd`wXEIACVNT9WbOIKq2JGIkZ=Z#!>8j>>_na}>rp~qnbZng(&k?8(`A0=s z^iQvxmJ?7~=uD8Tnh0-PI(BZ|8P=MCL{$N|DLPC^8bT8dEv;|yit6@FbGNK^L}Mu- z5RdHWyb1c40M@*wsE#&I83^#$zDncCz#HFn?{J$YxjowO7G9p0SJk6`ld3mt+Efyd z6Y#c!@{Ej&TdG@dG*jhL1Pm#7f>u^)f=ah;gC^!iKAh25#d4HU7WuKXccRwq|KjL8 zrE92oC#3Vpp^2BA+QySLaZD>90rEOG{d~_Woyq_@F(T@f{oeG$|KS4cEEVZ|tA|Aw zX?{$AlMCrE_ui9=xiyoOpUhggFqCc<#dlSeiiU=)u)}uQ8_T(1vBVomfyG3GbT>?4 z(U2SL_X#IGg1GzpbHU$AVnlfRB_K!MzpbgvX*;znWKDg|(*9_&N6xW~Udfj6}P%XRY)7s*Kd z==&pHRNb-|G-z9aoNwjWkt1jCI0KAw_U?LD*SMNnpaen$%^pyNYla|mN#WnXhgfT= zX=$;EqMJZm9L6w?OVSLmewE!8IBS-afEU!0i!0vabO6~1FNc52~j(qX_e-co7vv&$?YVmhtHl3YwSsYY42T9pkGp;>h+4e?0Q87?i5NN zlDk?Ec!Ut*aQM9BpzUce1&<>HMl3Vh&Ir?8%Dtp_qPM4O)=WS30L{3iVL(r9!`rfN z#o2E9Iqt36#@ULkitY6V{WL1;z7Rttko&}jkDfcXVgGh2SegE!lgyDdZqcK!-?#zI zu$za5u5Q0q&E2C`ww%lrH)wkZC8H4G)u<3;(iKYLm$h4h0f-KuPQLQ zB3^Y>PiyT(3l{X<tk%Uy3G;k5O)XzMaOPDf*#~=mBDuj z@b0DX?%g|5t&3rQ>;(U&ls|?-H;u?bDWkLT;ZsM2I=ZYeBHB~U;%#y5(4^%cTboMn zR#&$@oZdVCS;cksmxM5W$H1@;j|RZyzvF5odMA*CO7|UZRa_{yxN4Mlkmq+BU#&#*) zzp9lL<==R1%?p*!clJMsduepNv*Cs+9f@o#45F@UA@5RsZJLxp?@w@`sb1sB2HgY2 zqVvkp?pwHHLSc|xCT>gQ9j<8lZR0*~NW9tlR)od=ol#)^Xs6uzQ(P?_hpDiJ9zGm( z_+Em`EAZ|82DzfPKq$O%qo0vc7Py;{Q3-yp>Uwi#&Xf?u@(383);Jk_>({Mv!|yzN z_!HU!l+u10$1h**(Pu4i>XwgDip$iskHg9g!$lEm9m5pTd-^Sf5fT<9kF@?C8s#+` z-hwG93iJ+b@ic+oy2tbOty|lVN?4#PhOz@$)2U0%tZNk&^KgF*7%<4pX%!x%aNZqm z?&Y}Pbp1A5d&k17!~eH_+qTm7PVN{AfuiM9g_mgZ#w~Rk%8|M93VIb*Z12FUwITA- z#W}OeT-Uu~9ei0Gx_Y%ufwn6spkY;Is;wHe>|dacKe6t;;@9 zHy3*XrkJl;c1=OFg2*;{WL|DL>h1E2Kp%yd0K8jE+FUQ~J)o)8UaWLucFQ+Jo;%Om zAL;!F2bXD=R_9PRSMAvIC4{v%tmn&T&-$51J1MR>htdk2M{MesjvnuZYp)&}_j2H? z&Q?bTx9b?}ure@^h%OQY*P*$NE}(Gx_wT1m+dK15ZgbOE7l6PKf4)t4TR$kgy$z}e z*#JCXs`UE$i4byE{xi#Y>%)aLo_)57H6fY~Ma5MafV--y$U8Tb25<^qzATDrAO%SG zz~R>q&k(+4T->#|E;_(Rf~dJHX~0JV)FBYDF2zM~@RbD*&BI>a-)~B1`qZ@l9^AO0 zxTzF}F=(_@^}bi_el`XB*Ld6Q>8Ybb$UeA#e?(awlq4lx8-1I?XN`*L?iACukz+JAwiG-g z_Qi75msxl03RGt#*S?fDsH1?7Xw$3SX68!wf$9QqMb12NqfJ51EE;Q6nxjoEf>Pf+ zx^?o%k%%ic>wbLDDhVxezecA}LZGJ+(%CUWkMG;HtC59;J=+mhUCz^Rl;Wce^A#d(3I-GhT4ih5exN%bL<}g{rzl&8Pbv2cMhWtm_9K2Z2$*Q;)0@CH zMciITpFur|pW0n=Hzg4A4_v;{4Yr{TN$u?Pqtc=P)E;BT8BRY`<7zo80kE9!o3MUe z0fdU&N@}mlM;F1^8^)7fjaKDs+s}dyMDAdh&yZ4L!jwL2${hc)Xo{BVXB~ylWKy=s zN;@KnLJ3YeOSM8%uTMg0oHV&V=vt}2C1$26L9X&nkg%}J3MI*O9(loOdclCDfFn(x zQ?8_5qwfk)rY`T^qem^zSG^R?-^|SVO}i)_=c#>vT$cnr+c9MEURqA}PjZ)=+;`Hy zHO>{BmxMBb7|(0M1XvGKArCFjrMq8M963w#Oq``G4~hgT$LB+M$M2UjUkx=p^-{C- zWk);7f$2?MjM`_yQZZjJvCnr7a{5!$Y9NDDK(jXNkBiW+LmdS|3aBJ{X2m**Ymee; zXSUvzL<%9s;cVC-KX3aEdnaNRnI<2!VVS84_ftf*pij+v)6#gyNQihe$`e?Tpj-y$ zMev_9=Ld34`?cTPf|OJwi?1GFbF=kltmh8S#2q7;embpzrehq}yRBw#1Oo7{mXRLN zjE;xSB(G-YR3$0u>~i2xnzvjGML;jRtA{{wNF;EE;ZksmP8&BuG)bbtX_5IsMdhj| zi5D2`{*3;7V^AnS(10li-2CW5gI3DMI^Eo7KSQlt&T+f;M6xZxk z`jK(Pv2L4zPH{)?u`$(DhC~97BC>2C-fhSgpFTwtVZ)tAX@a~LKsf7;oBwj@c_pux z(oRlCVw90ViC4+dVAi`g)iV9YWnk*0FLlae`pck06kUg!YKq_(!l3$tS0<4nWYbRn zOY47w&HebFj-3o1vkA@nCr9mm>0{Qf-|{6(dIPFnynawrm*K@pueG&r?&vh`07M|D z_JomAMAjs^4gC)C*8GbXgE=G^Gg9@-OWyg;)2E^$ljO9%K{QLj0Pz$~t(wk`x=X@l zp-UBilLUfh?9NssHQaA|uty5S^f_0gj$){aPXIB3R!+ZuSgO*H0y!b2=S2z5&%~ar zY3_0ok(IBngm>(9GZqCqR8if#Tq-D{ zT>g8J@C)RbeR|T97z~MDLDA`M?x&wtf#hyR=$BIBT4sLGEP*dQ6I=}kS@PusN( zvcgx=6*@SH_xiCBi}4hD@c40SO_9{wxt9T0IQ$8lZuSfA0F80nxEP8@^QB9>-HgRM z#|#)t%?T6ku^D-;SlDEANS)oGR9qkDlnKHhzV6?5)PXfcT=g^WzS)(H@ATRjI1gkR zoB_gdey}yfx=c+tqZE@6DRaMPzF;%84hK@$- zGxPoil|Vh92EOUDXKlb`JQ`GrSB@is7ySli`}+&e--`{Oj_8_;U*$tZaUh)yM02p> z#=d}2C`tjpeN&&F9{S4JB#mY&7GK{18z~KYCN+Hcpvw~P*;DD{_I}d|su*1rgArlT z-1qI=n}JpsUePId@b9#~f1Z_g-s2g6C9&=EEKn}K9lVRJqIiZL8<$0iMz>H)%Q2j& z%FFa+rM)-H4c8?P699L5C6MhA>x(b`^Za>Q-)4+#+KKqCzM&;nho0cUx9b!cy9ELi zudK&;*L|%coeZ%dGJH5?1AP{gSC$#T`0QV>>jub+WJv$~BOx53eaBHnmlBJsga_>$ zxbtbN0~aH3lbg1Cf`YWHEF}jqtlRcy*$#^rTYMY-r-@stthfJEpKmEtO|Uz>tmsb? zEy`8-U4=!Q!CfIuM(#(&{`q!>178dQ3uE}Q$5#Ymtk?JDZLwpm1L}Koj`Q0Anu#Q3 z6UU1E1xw4ChfheV!9HsK*rs*D1s^giY_@DBP;iif5%5u*I`r4MnL*Z~I*Eu!7~oH~ z6v>!xq035~SK&60Vh~Dk+3DZAH=H`0pxG#ZDal57C0SZqZ{5<90%9jo5clH2*48x4 zN(}v>-eH#<6dWAaYt?F++^lD4b-y~V-zk$v7(Y7kSdFN3mX-j&Zw-SVM(YgFfh9?+ za#&Bs9pI2gR_pRP?%?>N6vTYdiG9w&cVOwdW-$)#$IqY6SGp`+8ai37=;wSDhV%7t z55noNu~G3Eo2$oHpP|xs+&w&=k*(ud42Aa>(hHjEP0BfsKad*{i}4p}#0Ut0OGe<| zI(7?2>W0{f<%Dck{PW$r(f_7ocpe5DXBlCWD6S!EYlr@JJl`rC8%5b!oKTI8xITZz zJe?*hFhpgwhj>ef5jg6tShcET(2st9i5$D!j6DzCc@YpJ621eA7GJC~ogSiGZyVh-Z&K=NIG6j>vK?JdvqZ}cS{LkCl`>$%1G>+Zpp6_9%wDd1cg&@Oy5oszd2krzx z2!hp8jsp5A|JWt_3z)m>GZbr zP*4Gw0w&oP=b%sT8s~Igs`Ao&E3PzX>ejo8yKWxB^;df{Vv->1KHC)jJf;5Fu?Y)! zxcnqiEh8S`hzJ1`G<4x)=Svgj#78YLFTzNCP-XYAp7oNfAL&WG>u-CDOCMlD(X1zKO`Xj8$zYL7FlJ@d12eTqp1 zVD&05M<;U)YI&6es8{p*T*x`z-b?OQ&$b`TAsx;PJu+1=DWqBJ)~?;Sn%R!4LP9ic z9I;w)o+T1s5N^`7p4UN|DYZ?8nVZ!og>GkJ`ZTAfbC;pD*BoucD2$4j0Z+ErH(v76=PW_EUK$shIRcK=)^yX)o_x~Fz4-jUR_QlgO5Q1*KMI{GJs65|dxnFU0D zt9F|z!u_XDchQeLmFVugWJwO809^(>HPAhe^}%?wV08ZH-Z=ZB{?d-QC=K9-i7xz@ zu>kW$_6a9Px}kq-@$yR?Z$0kVpLQy zbVrfqh^IjQIeoVneu*#%^39u*TF?hESmu*0ylQhDHG6h1LHIFeoZx`->*&!6&-$1Q zCYJ$86K5vS(8CUlG`41vwGD_ClwUSQRZI66cjqx<#K|OZvC9LOu3h^Ja3S-bPO1n0 z?{`I9{-e-)&E2`2Pn_~2FGgLv0R&IPBkAYGD4)R4D^C!@@tgwt?6)mm-T3K~XlYBt zqx{0LAcdy;p+y2s)%Nk(g)`{O0kWrb_x+_mIdpmXmah{gPNexc^5P%YF(OT# zqLAALjR5urCtT4{i1iSP*ZKNB0hr?ds?~_4+_*zOmJ6C))=D16nPD_*#3;fd z<0wQJnt~A`#SW|43ePrPlb4OQ#Zr!b`X_k)c^WY(`1?Y#r_&~?OfVpvIkT4D8E@Pa z&JtC}mx{>vXl{OI+<#)0|L!u5^a+Lm3y(mcinh808msT$cSBdE=MR)sqhXjeZ0)z8Yl&JOCSNIz zNG#)~Zdq+Zn#sdvP1R^bS=x}Ikcg4_j&yUAw>~B_<%yT9A?Z7 zBe1&iW6O2%MDEi^e5kB)j_BNbKEuPv>DZs>Ij>OH@T_WQR99EW#Kl1y;bg`$0s(||M+5W4)x_D&M7+FY{P(e(Hq>>Ms3 zu$kFwZ~#L(N9viU>!4Ie)(ClO&z|8IN{j&^TYmrMBsJ(dyf&(=&T-5D%A;bBb|IJeb1N*h0mW)qY$C!<}EV_+(aEH-xQ~?>&If65Ij>mi&MiTbf?hxuId>|Mnl+;24MhA>!Trtlq#v5{`H~D(* z>C?$KGwhJm(LSQp7&%p5ku}I2<8s+BsEx?&djyXhKbtDa&wLdu>X6Q@W(*l7_L1kY z>B5Q7EIQaC61?*O!%h2^K6a6fU)zkS#CR_+^kY4rIUVd0>okS2X#gEd@w3D)2Mj&G zo4XDLA}A-i4$Rr5gZrmx4c^tGd-ox5tO}?txjz&(@Vr7cIcau>_R|edvFNO6`c#Be zz$4BlPiBFVG;$XyaHy9frYbF5h#}UC7wx+iUx}Prey|rY0@)2`7Fs|- z-KcV5YHICnC^V%D3#sG3|G1~)4b9DO-M)RhsHm1G&hZpd8QE1)b{W=>1fv(kF23Yu z>MWL%`PB0_of#hq*K#BlJgzD2bYdV)-O8xIY%@LR&r;9 z{+XMYoRY>6dEH+&w_-@cPmqPk%}J8g6=d=Zr${KYVA?b@Kh|S4q#03x)w%N~k|P2k zI-|QKB~t9FS8_|j485mJIm+G5&X&nbu9ffHnL!_n0*{-z;UM7R2^bN0Q&R2%+|+D0 zno5WiA2#R@c~8XDN*4&T)Ph{^8__i_Z}ALr91xuGg*#7xpBV?PIbymG-7bYar%itB zhJ9o%1hjC5x)M9lblrXMAZ}_(KeZk`PNJ9md-4Z5H8<5dV`D-L4n+$$Ege@tbRc&i3K`okz++0VapcR(XX5%%j!V$R>KHLOjOK2=V8pDN{_vJ zKOa)#8RN&R>F8`)ZXB*CenXQOdYGZ`Rnr!hza;u_g5q<97djlvE_u3BO!4!<5*#*& zTj4lwe6*gz3)-}441F)c7<XYPmfnWIbtx?D2DZe*m6!b_E1>+ z_dn@g)jVbD)b}4huIKxZKQI#-Ouy)4P%#%)Fta2MW4EKce{la?`Si-+%ibhz+jgG= zVC9EL-oCyY6X&sY zn66^nh5YPLZtnQ)hx0nC>gqC<1p_EZxY`;ThoHnVn8YeWG4J0L#&_+bGfvwq_~n%z zJZb9{TjHUAQFTCE>-LMGMN6O+fnKtNniSGTU>{DJ1TB#)nE)utfSw)KHQFHGyk1MZ zEJhvV|FZ!f;j)+E9T0Onurt6`5l6b$OC^L{`&qqv^?H5g_K1N)hM;A)9xxzs>a7@V ztnTo&%SmHE^!3#e*fCVs@Ylh=%F5(|SB#G;^5-|c0k;#@MV{!n`P*z)<#hZXF2F)_ z_c%d$SWF5N;%t}J%RlQA$AsHIoRw@L3ZPi0E*~zRI(95-YF#o66^cJ=?LWZI>7Iv6 z`p<2~s2%B`I5zW?^Q@dlm<8ppaF;SqUkCC;ZOQ10tJkjm`1Y;vq`c!BNJ2&q+2bjR zXJ2}pc5_ZgbEO3(eOXCZN>I*t9!3IV(Z{K37a3%Aibmv=4|uz=1T! zLjU|ampJ)^sRoh?03#H#RVob}P>Qn7zm8o~jxK5hDSBsy@B~rUxpQ=1@Ml<$Z2-J^ z>(>Sz!~BC+Zd-%ScHV*oo%0k@m~hCE8vXA8P@694$B6$&l+|LL9D9hpQs7b=AeWZE zRr5P$GK313_~d*}8i|&6aAX#AA|PzhwZFzdW77(_HZX%Z$GN;SKKE&~P+?rGy5K}B=`=G+AA_GakO7lHZ0!GvKKEUoB~cSkwVrjCp(Dojn@ zz55x}TBp2=-d#n?umdCKlWua{(JBY;z#EZZ;i%co?M#EbO2XAn)n-`ciIfM|btH+7 z$D_yBK;$^=WfnDj9NpGEG~ZYiq}4N1zNMgH^YZii@amP}L^VbgkRXH{)z%^Jw_o`| z^RH6rajwjhDLy{TSZzWMP6EkDcw!j{Pf?$)Go#4%YC&SS{ap=DYw5vP@A&gMJgS|? zP^fm%l9Qg9rZoM2vZI&~M6yUXXZ>(J9ga>CcFt0j51r=Z&^xiUJf_{BV1t3e(4;ac zfsF#eieNmOZNSkEF`tB)V;xFQ)KrsVY3WbL4tvlek{76YWu7^?-UP>QJvV$u zs7)qMUR5Pw?U-LSEFgl}rkd|%0XeitgQpp$q^25HFH0!$Cxt>73%e}e&-|IB zs)?oB&BZqR*C=&8@;L1_IJ>BLFtPA?6@yFSWm3?fBg3VwtG~icxI6i~YLrvv%8yT0 zV35cql&4?=)hVa(ALlHCpf zo5XByh37(869m!$&_j{;{qKl3wNmT`tnZLNIn7?FtAu-ah|M#ui5m4DGu{(&y{^@Z zB_mf&BY|bl*P{CQ1gDQ)IrEpsAB`G^zC@>SX;si!>dCWcLV!P!f`X$_^FR7*#4v*4 z>(DRj9BZq7{`?Qi)M&wAgG9Mn3-u^{G97wOAgA$D%acKa?|=A$Haz^-|Q+4hmHLl!+*j*_~4Zs+)t9G`yhGoYndFbxz51AxPfh%%Qi?}0XehT^Zr2@T8CsX*%&I`p@H&@VUwlnu5^R0G{)+wlXhzXb`5 zNqa<8Meo_y7D@6H`> z>UZKGT`a&`URd+c>2=Da{{WMMfXj=9GC#L;%ZGxiYahlVTz@tB$8x(pPMHqV)07ij z#L>KDPE^UX3^LD;1_|91e)|0Ry@MC+#FGI!I{h_PFpQm^Nw8g44;w-10z!?({b)l1 zu3ppGxUk%5JXBYIYyb0`?2y|FVXqfV8A_EZ>PB9FhwOa){=KyB3n7ri-K$lOwE`u7 z?Mq9>#D4m8$jgkToY(W5;yV zDBY-^H5KDX%g>$rPUr*lgY?E6RQ#VQTcqt5$=794Zmd;A$!@R@yAYwj-)wNoE(83`%%BY7(g4uJ5(hvkyWXbRtEmLs0kUW=rHGrB4( z#HQ}rH5EryUOX!hmbx!&Qr39p(xm(L9#?%=fKb1-cgQ{>DnnNcHX-rGyi5LtUI zb&5lPd4{(D)(~9&HcUgqYL(Y^M~^`hHF>^X6iUyR$#AC^f`y{&SG(DZuLPF}A2QBD z&|0Dx`2~!%ZBb?0lmKr)N+^2PVit^Qis5qnG8FSI-ySr*efMrH+*eWoPBC&|j(%J( zNufwbnwz!fEWC5@FhvE=f~CnQZ|e5afQ((c z0|)k+*+zqhPq+e8m+?<~_B`jv5EaFgSMGktK7RfT4PyZ2$^+tz|OiF8gW+>Mruk? z7o^gTps*%JZhZKG7CKa1_yFWUdpPRIBA3E$dUez38cUq}!lZ?FAS5gr_y&29rvYI| zTN8i`QBV36gk8?h_o3%->^*))bcIU#FDkA=OatP~Q%X&}`{W5$AK!Rualn1Lmvl!`f1W)U#^LH-Q8IC^3fonq7uSa)K_41{1o_S0sAYa*d&%?7U zcYtx^_^cyIB%Ww&0^|UdSzH>h>@GPhrogZ9WOvHMNr=j|c9QWN^4UB9@XSmmS`sNZ zQRqI@Y7BbJANCSpR!7Yw1>W6xauopa1 z-b#UsXiNY*Lli3YvKdtd_uo- zeT?7|fIW4-XyLX*I#M}z@5>tE*XBh7vS88EVd;;-G{rK3|J8%?KODt z%CmF-(DXM`pHKHPHTl~TQfM5X$qbAtOJaHaqGd#Ow%GBYo1s|7R|4|qagbfqK8O+q zl4+{!e_iD|_3Icnx0ZLuPf?Y$0<0vA=`>m(vx4nQEl>M<$z#2wK5y$$Q1eLVE?lUq zsVRR_N`C>{4->eRD^{RRkd~22cxcn{2{n!UC*@9^YW39YV$13nd}5CK5*={*-|ya` zcGBBgoQ~F-l%ZiDT%~hY#Nvj*NZt4QgJz^bXZ63n=?+Tcavwf&=a+ETl4l7LNL_Z_93;jx#w224KY z)HVL#obK!CskEuI`3zn5s=bjz4zNPo+ghVX3?}SmXrndL{xjU)s>qu7;uZI{U|og=l_1y-g2A&D~o zESnmBJx+b4rH(oG*z==y4LW;s&KYt)w3(6uV+Pe3k*aEyfuZNyy1M8aPOU*;HTw8? z6hZ_0_U(W2F(SG8f2ol(@~&NT6(Rs3AAMEpk+1LpIoLU(;0KQ|M!zyinvs>6^|=w| z-{}c5N3h{m>`F{Q1fj)yZfgP~$OM6dh9}^(lK&-q3j%`Stn0oZ<7n!OmY|#KD8-(FzH`E+hZqWev%4H2mpN2tMDyZ3R4L;9Zo;U8{q#@Sz&SEBV^8KesSL}O{g|i zk*`ab9cj5ld=M?It&5)JdtbfELGRP=2jtCEFT<7$Cl z+X*sn8v_WYAWq||rWY$A047|L$Wz|w`<1=wIM#9aW2hflH<@4njesjB+KSr0>cYUN z{a!~1hYq9S*NlkG)f|x>!}cH>AdOJFDdRX;ycSyP9S}ARO=!NEYj1w@U)L{IjSUVV zg`3E}1$`5fLr0G$R0NW1Glapy%#4Xq7#(N`!q|MQaB23F5Re220;pJL@$!Ox)5;M9 zG*ZwyMV$%P#w1Bq4;3992Cb;b^Xc3-Ui1#Um9>7AOHE0U5Rzl%?@+y@27j&Z^lTI40ZLm~46a$o zeX7Ts&gNPvvNYzeMBA#|r3=%}F|DaHo#5pau|?@?XtV6PyK$p?+k)iQ*3{_lxrC1L zYHOzn*tZJQ`dtUC$MCdqtb5jMuLff`h=5+Y8Q?ImzhBsoocC8NyFbY!+_Rg;rXJU> z)OZGEtSGuBdd?O}SIOZ!(a9I?h~E8Gla^C{O9{B0b^Gu29V!gNgkvXFqSAN1thu3g zw)gVi#t%PK)O}&pAwjyfu1-q8H&*xTS16UvW2>Xp6u*Wl%pMRrx?)L9p#+U-_l79_ zX#KQjv2564e@i;g-3APgbU^8>w#`}*$d5bw{}ob53hVS)fw$5xqL3@AdDkNFljihCEubV| zh9sO_Mz#a6hgOar(6J>{1@e0bu}ESXdzX%3xHL_QgUcL~NBXb0oLi1R4i%Hh+Oxd7_}~G|D>^`2yn*Uypa{e=7Qy0s=mU4zT@d|YuuQ4b#Ggwaai5QK;^cHO15Xnz!QQFA6f|Iklk4E9X4<5E=y9{5TjjUVP{ zw4E^67cY+ASYPELUoJ&hX6K#I^`RZ?6`-~#}mo?`fBza2+6 zNKJ-r)#zqd&=tY)}Z-v{@>PQaVe}u=ufh2+>Ipw5Dk7!0^Y;4%vp+feVQbTKP@h`FBPWyFeRw;y)jJsZG?^eOwJAJ6T4#*DA!?NLxd?c zpVP8fFR2VF^>o~rGcvT89*kqdj~^7yXZP!{kCPb0Vr`Ad+v;IF@pjB~`uFMc%5+0g z5={uQVNe8Wf`BuRoic!+NGvI}m{N0s!M-)dtNwpg2P|`}UwCL}7q!kR;@gJ6}jpb(Qk4X3dY)FO+@N)-Ge68m71`5sRtl=n_(M zf=Dle4@RaK$WNahMhhgQvnt>>=CFQ5_iqWA@~6{w?@lbMn|#u@SLZuwDm9WB@0u)t zw@&+f(46GYRE=;VKde>i9{WbaC?E1#dG@HXa{Pe_*VTipf59t<$3fdUMe(|hLiOpw zlb*S>?P1(@VD(8|?3$ILTr*1X*^9~NADvs!-TqgFrdj{~Jjb23%MR5)$ZvfF{s)tq zp&M%JOb@Jnj6^{p_7?}eiOc-z$>3FI34_7+r>8^=5yC6nPX z9hjSx04fAThW%cPtZpH+M0A|8c$>z4LUKj>6Koy`#3YCvCU-&ow9_Q<; z?XYgUC&Ogx%T*yMTV;sGdh<@LKbB89obuflk|>1R93{CPjPe91gFB6~X4W-b+odj< z1248AC>9;rmM@nUaJX!Tg?@U6#9EylZS5!orT}5hYg<6wj@@bYogh*pbPuOBrZa(U z2HKX40ZVxh1fpU)!=vT5Z_l7-NCL}bWVRE%Mx*TeNux~J+kkOA5*)K=8qNUT!AJKCWf!v}&}U_qn#g7-jex+SEnsQhc$utEgK4jqd5%v0L{O$zLY z!46*lb=di7%)%bL$QS#D)uoC@^f*6pCnUtJ2EMR5Gag?t?s>fB5E<*8T(6$8a*}(R z$wy+=;OCcNvWXO++xslc%}K=ow0%QDPD7@RbVwd6iCMS!&5A^FPsX>Uszug%{ z%K%@f_f@Aw*qJsibpfUl`!8R9PDdG<2=yO^8YWKed>3$R9uDpqp-ksNdxmc*zzi=C z>C;=3#=BXz{)uTl*HMc|U!Tg76-|y0V{TMicuxLHq+(eVq>(?=5;z;Rg;?YDW12k{Nifk`4pE9!v z_6rc-jfxvO z6p3Qa7Ike~b|EB5g|rF=aevNP+1CW_EIY0=zJQBXO9+IR@xSf|ez0^~7A{O|)x8QS zIX}OJC3K;Kxrl!Y6}mr6aiXe2Aid>a$=O6kHSq$m2gDk+SKb_c z+fQGGD+S5#2JKH>oxRUqct{BcA4d>~2OJf~W&dHeF=fik_FnO>ec0GbpgTcFU>HWl zQ~SXq_I2>Q4|iaPzG(h@>!otD`Y#ZOc^*%aLVVfY$h z&&}&>FL>^B$_obe24=z@4ns2QF-QLWH+bPfmz7W#fX-=OxZNEIESq@Vbo|oT+YKD| zkVHk(L3?%;v z9+v6VLYsxM9%9{aXr~vHpoXw377m`e`y!WMT+j`hiJvhakWkT`XvHBM(FLDmyna3% zB0im0P>|QriBKx*ow`aaUhCZ4$)q5hEZk#{-FN)!i|kaUh`ftAw|3)Sv9aDh$oTE2 zPd~nX<&#JydV2m-0XPYF0Yc^{hI|FAR*5lKJs$ZwX2C4062BX6j@V5GPLz2N>CiZp zOaj>s6KgHs_kO$Fj;`ViwIJij3S~jyDZrz4o!iVnVQILa$999HEf znWiTQY_y#oCOX>M0X^hFvt>QPjNDm?fT+wir}o}5X%~ET6E5@bcVgLVDat)cG(=-3($3!Em`82 zHyeAFhOZ>ocNS?xo#p~Kh`AwIwyj0;<5LWV4qXQU2}--qX@7}#n~iSE)TB#m58&;I zHv~m~&)~jN)2+i!knDC)y)lFeMn<2_KM;kHZ~mX(rXeAlb?%l#1>*p4>;bJ4|*nT0_I z4!DEUcHvq!oN-!3lVT@rE!W>cx9?oq8*R*0_|R!MM|6g~Hg1Qd{Y#J;Kx5@~w6?^>04FBR4|gIft1 zYe@PY{}h*wDvQmg`m0`3{vj2V>-X65ptLMW{`yqg-@hjE1Jy7T^Zv7EiL8>TJwPGY z_*Bf6Lxz+Y3$oF7aGIPvIo|!VO3VT8J#DN~Siv4)^6+j2hp?~_?7j7PxBJnUh0F!s ze0rnAq@fN**N%9GAt#iK6in=6DAS04NOQ#BhS$|XWdq^&Lhy4t#S%+W>`9a2q()?_ z`cE`1z*vF)Rhph;k~m?nxZX4#dMGdeV!d&D>>zVmCc@&H>g!v~y%Mr6-r`=-uoq3c z-#gUDGVRMFY-uC5E0n>EAxe(_+(-AT*`1S5Mjm23##=LA?ZpVH2`vx3m z@CJ~dF+f+qcjCyz`DDEu6Zok{7tt@Uwz4X=^GKvW|M^i))_?y^9lR+zX(=2Mlu_)n zOW6<|>8_GZky~H2Jl$TjuC7Yna^qgH%fS#d$|IZ7w(m)l)Fc1+Y>P?|Tqbc4$)hPc0;E8FG9X03s;%(%*5{pCQ* zL=Sxx#LPt7#2!O6o*t1!l*K{0qfI|{@VnG~kg9T0Za0Xe$Q@UW_K_j-@q-y)%K+M* zNv1DQSdq9hZ8L=ay`q$kJgi;q&9ZvG9TgTW?`2P?y=UHV$RTMJ=vl*Oj_U5Pb9`K&+02`D>%YO2S=u_zibeDpIWHU zE;;1`MB4Qu!oaBIW9XQRLpQ9H=6TgTQA$3bGmUe(23x}sjVLO3q~y8&I;oci3>pNm z5w&VWc6{aQz4qbLoA;VZW|S;rkq}IPW=jpvMn>Hi-(f|??VC5p;&@|UQh6nB$@1kf z730&J*ipo&QKRIx ztcg@lZ@Z;uqf6-k+;QbfPpz>p(5APB6vJvF>F1j>mNbWA4Ij>xDc5@=M<3R6A3lq= z4b4XwzfC_D29+(nsS?M#e?92*^KSN1O>kkie&oT8 zjSktEVGT0wj@LOjBlrPa*)+FnpFl#dDfygz;Mv;{7z(PYT!aUetatRfR9i4UpsWvH=9b;_UTYn zkjlSp-{g6iYcssC(Zd8?DM$TZ7T&O?6?&XM6a!rBF1oLe%Wp%;=Br}mNV4Kq37S51 z*&D@XHIh3JH5wR*{`rBZ#Xp4AwPyMw34z!`lC*J!x{9@nO{``$gf?}+H;UdJJA5Wh zay3>Xv%ZXtBsXyQ@E*FlRX06I?Kr4;0osz_EF8Rx@i!Sa53N052W4X7@0puVgl-~{= zA*ujbAudi-?zr%Y+wjiY<>VAB0?6zD1E~8i*hz7vHwYu7XerGu^5gq0-P6XsqS6t? zQ-JG~0?@18zpo6mD%-4MdPZ)AWMmD1!2c?F@<%MlR)mD?7_{I48W5O-v%5-}w9{9_ z+Xu2E)#Hg-ZxI{+FIV7+i!X+NnLl1cC4pNgM-M!zdhEMSE3H&v>P+e-d=^slKqE^U zzJfzAH3VWI(S(~x`jE4EAR+AG!}QXCgnPEqy;atDgkf<9W<=&K3Rkv`CKG=H7DlR6 zUu*D;Oc+8XZD`iY+yx7MgX+U=5gA19^Q*`$=KA}GfIFj@Cj(JVuN2)E$Yp6G(pg!s zfXB}Q{MwSvsk{4Se_hED`(}7~HPz36MFB3z35{@ZpVjQ^Oy%XC(?$=}{pYXmAzwxW zPy(L~lFoE69tYBmAO#(|lAuX?#DU5d%uza~3}LS*T8>J70*`dU1nR6_n@WrA%)YTo z{th5CBT1ny{=|q9y|5O8-0R1;Z=b{gii#=~q~h`8gcZwkA24@x>sB$2k;HZD-Gvqo zVF9I51LXMGTAeaHwrt#(Iy*@vMq|x|W;TX6h>$)q&laB1q?5j{8JD)g>+_@;Gs3|a z$^5Y?u<$(_gj~w)O;0UyPuEN@`X~|q2%JAHd=U11(96*FgU4Ajch}yYbI!D7cc;i_ z+sAo$T%v6X>V3iQUsf$&7l>T9N0031c<(O=39;O5q%z*kXYLGoOi;d#vF|C(NC(NH zPbBHv~k;9zs;*s+Tw@pLgy7&(;zwa`GG{c$C zdl8R3yf2J7EQ$gHB7T#iL9xhwSVu7;j_kVp!@zB=rDvF^vtithQv5Fa@GA#i+J1QV z?gg*4$WE_}^2Uta}5(|uL&{yWYODo&j}3owgH>^zc-Ytt&Ha|!@B zv+`&+@%9_S5VsMVt9NZqNEl!x8s`Gv5?V%HUVlW7K?1CXyH!<|0|s1RX@u-#k}a!@ z>SSc!!SbnE872jUD&ip;IuO?>KQN!*hN05vN?JTPh$gekV+<>_d z_i`d6X$OZ027-{2Ls^P{sc#)hM|@p-+XbwRuuvfQ5025OIYuKZ)w}t>^}l~0r`@7! z8+GEq2+YCNJC`h@bx8g zX_}fg06z&b_L+kTJt;({FeG;zyW=l@`uXJx76IIYbx)Osj|hOCMtsD%Y0YW9ochUI z9Q3h*i;Ib2aD>uti^j(?8@v2)o;>*{PletHN0?~5_@T0Po8G}Afgub2(O0ptvAF@I zZ^y@P9r1{Nd#=O1Pc6YX>3n~(VM_yd<))n~Iv`tF&8Fj=P0$%-2+ zLb#D3v>4prt+19{`W}3NYf7*7@?W9xzgstO*KBof75;vAM)iLd=4ab=GyXi?dX`3z zWMoK3`ya>4eay|31fXRaci5 zRK{Iehn-%%+r!`GQ70zW`?@+VH$Hr#f-?@<3 zBM4s8r;j+BPWnlfGRoEUfX+Y4qM%%0IHH! IFOBC{jO#@c#$&3gB+@RrbaaAN?C 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 literal 58187 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 +`mrcc_noiter `_ Undocumented + +`n_it_mrcc_max `_ + Maximum number of MRCC iterations + + +`print_cas_coefs `_ + Undocumented + + +`run `_ + Undocumented + + +`run_pt2 `_ + Undocumented + + +`thresh_mrcc `_ + Threshold on the convergence of the MRCC energy + diff --git a/plugins/MRCC_CASSD/tree_dependency.png b/plugins/MRCC_CASSD/tree_dependency.png index 480c38a8c069ef81016195c70387cd1c8a48cb8a..e73ff16588824e00b433bf7d4d8f93720b88d85b 100644 GIT binary patch literal 146992 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 literal 108444 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

    EoJ%5P_(&5vQM4 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 z zlae~Q+hi)myUq*=7=L&9#fulA4@()Ej=r#kx8Zx`1=n7$x7&OP?8d(TAPT6*SDjWQ z%t~p<4z!xJ`^o@Hrb2{CBOSVi%JTBDRxY}Vc#aqv8DUlUokR^Nr;gYH2OT~=qhG5} zULOTtusuCFsP^e6wxRC^`8p&LKp4G}Tra3W^Ali1&@UTvJ|<((A5GuB{ULqfSyfy6 zop2x~<-$4%tChw#EwglfW5*|fZnniZwcbvE-`d#uVk{ zt#x(P8aAwriM~{b7yZ=Ve5uG_t&zAn#%*3gdXMS@rI8U6gQEu~9mPIv|Q4*gq4&QAf0ke+ZmSgSoEsw>X<{EC*a^A2~XobjXAFK z$eTBAM0hooIUQ>S!9JGE5%Z$^q+^YvQbL2nV|SwG23oJ1;}t3m+;brXAYP(_thIu(P$e?91hm0H z6R_!p?9qyXEc|#CB^nj#g`sLb&QPS6k0|u8*u1$0+Ad?Jw6?B}lykU>%KN&y|6*es zamFvTj7=JwV@ykg#U*?Wh@CPNnjngu6YZ}%L%N|aPU1uCBBA|R5sJRTv6dSHB^Vzc z&sPqv0CrXgKz6vIf`Jy`WS1m~Mgvq7zS?wgfs>0K{1#y1DoO3;-{4MZB^bq>h>V2$ z`j5hD<|B2}mkeq`#b*X_fw#^84Qg&diQy~-!DzVFNvd{qJgO4rYse=U= zxJkrfD6OXd?D68Kco^LB!v0gtlW1+m1D@Aj!~Q3o~^qCMHJMJY0AG zL6dVnh0bv3YrPP@(Dx2?Qs}-3$pQ3zeO&9q|3mt7PZASDQ%Yg_r%=Ix?>Cqe@q!D6 z|K_3o80ShwAYB7S)Gb&}$Q2}CmzB#l!K;cnw9L{(Ua@(z&X^EI-}l>$o$sDoxro9Q zq%Z)Nh)^56OIpMU6&DvH!M^-CezpO3D(Ab=P$gs=^W{z*iXs1*-HKSKoZI-;!PCH+ zCjHw9=2ZPZUtP=vF)8q|n2Hiio>IN*UgW8uP;2Y^IX!(Q3q7VpVjlC}(TG1KRl;Qb e|NHYySI=k1l`_ +`pt2_epstein_nesbet `_ compute the standard Epstein-Nesbet perturbative first order coefficient and second order energetic contribution .br for the various N_st states. @@ -250,7 +250,7 @@ perturb_buffer_moller_plesset .br -`pt2_epstein_nesbet_2x2 `_ +`pt2_epstein_nesbet_2x2 `_ compute the Epstein-Nesbet 2x2 diagonalization coefficient and energetic contribution .br for the various N_st states. @@ -261,7 +261,7 @@ perturb_buffer_moller_plesset .br -`pt2_epstein_nesbet_sc2 `_ +`pt2_epstein_nesbet_sc2 `_ compute the standard Epstein-Nesbet perturbative first order coefficient and second order energetic contribution .br for the various N_st states, but with the CISD_SC2 energies and coefficients @@ -272,7 +272,7 @@ perturb_buffer_moller_plesset .br -`pt2_epstein_nesbet_sc2_no_projected `_ +`pt2_epstein_nesbet_sc2_no_projected `_ compute the Epstein-Nesbet perturbative first order coefficient and second order energetic contribution .br for the various N_st states, @@ -283,7 +283,7 @@ perturb_buffer_moller_plesset .br that can be repeated by repeating all the double excitations .br - : you repeat all the correlation energy already taken into account in CI_electronic_energy(1) + : you repeat all the correlation energy already taken into account in electronic_energy(1) .br that could be repeated to this determinant. .br @@ -296,7 +296,7 @@ perturb_buffer_moller_plesset H_pert_diag = c_pert -`pt2_epstein_nesbet_sc2_projected `_ +`pt2_epstein_nesbet_sc2_projected `_ compute the Epstein-Nesbet perturbative first order coefficient and second order energetic contribution .br for the various N_st states, @@ -307,7 +307,7 @@ perturb_buffer_moller_plesset .br that can be repeated by repeating all the double excitations .br - : you repeat all the correlation energy already taken into account in CI_electronic_energy(1) + : you repeat all the correlation energy already taken into account in electronic_energy(1) .br that could be repeated to this determinant. .br @@ -336,7 +336,7 @@ perturb_buffer_moller_plesset than pt2_max in absolute value -`pt2_moller_plesset `_ +`pt2_moller_plesset `_ compute the standard Moller-Plesset perturbative first order coefficient and second order energetic contribution .br for the various n_st states. @@ -347,7 +347,7 @@ perturb_buffer_moller_plesset .br -`remove_small_contributions `_ +`remove_small_contributions `_ Remove determinants with small contributions. N_states is assumed to be provided. @@ -356,15 +356,15 @@ perturb_buffer_moller_plesset Undocumented -`selection_criterion `_ +`selection_criterion `_ Threshold to select determinants. Set by selection routines. -`selection_criterion_factor `_ +`selection_criterion_factor `_ Threshold to select determinants. Set by selection routines. -`selection_criterion_min `_ +`selection_criterion_min `_ Threshold to select determinants. Set by selection routines. diff --git a/plugins/Perturbation/tree_dependency.png b/plugins/Perturbation/tree_dependency.png index dac64544cb6c498388ac5a9454a798358b9acc67..166e803538d2b3dd73708e8b6f2358236b44369f 100644 GIT binary patch literal 88474 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 A9smFU literal 78201 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 z

      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 BT5|vZ diff --git a/plugins/Psiref_CAS/.gitignore b/plugins/Psiref_CAS/.gitignore index d98a4abc..69ebdc69 100644 --- a/plugins/Psiref_CAS/.gitignore +++ b/plugins/Psiref_CAS/.gitignore @@ -6,24 +6,20 @@ Bitmask Determinants Electrons Ezfio_files -Generators_full -Hartree_Fock IRPF90_man IRPF90_temp Integrals_Bielec Integrals_Monoelec -MOGuess MO_Basis Makefile Makefile.depend Nuclei -Perturbation -Properties Pseudo -Selectors_full +Psiref_Utils Utils +ZMQ ezfio_interface.irp.f irpf90.make irpf90_entities -mrcc_general +overwrite_with_cas tags \ No newline at end of file diff --git a/plugins/Psiref_CAS/README.rst b/plugins/Psiref_CAS/README.rst index 1715049a..5d511317 100644 --- a/plugins/Psiref_CAS/README.rst +++ b/plugins/Psiref_CAS/README.rst @@ -75,6 +75,10 @@ Documentation determinants. idx_cas gives the indice of the CAS determinant in psi_det. +`overwrite_w_cas `_ + Undocumented + + `psi_ref `_ 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. @@ -85,10 +89,14 @@ Documentation determinants. idx_cas gives the indice of the CAS determinant in psi_det. -`psi_ref_coef_restart `_ +`psi_ref_coef_inv `_ + 1/psi_ref_coef + + +`psi_ref_coef_restart `_ Projection of the CAS wave function on the restart wave function. -`psi_ref_restart `_ +`psi_ref_restart `_ Projection of the CAS wave function on the restart wave function. diff --git a/plugins/Psiref_CAS/tree_dependency.png b/plugins/Psiref_CAS/tree_dependency.png index 1a922bdc9f8cb45c740e92b62e4311278fa59419..5e496a28aa9e857cba5805029c1079bc88651e3b 100644 GIT binary patch literal 75672 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 +* `Determinants `_ + Documentation ============= .. Do not edit this section It was auto-generated @@ -129,14 +140,6 @@ Documentation 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)) @@ -151,11 +154,11 @@ Documentation Compute 1st dimension such that it is aligned for vectorization. -`apply_rotation `_ +`apply_rotation `_ Apply the rotation found by find_rotation -`approx_dble `_ +`approx_dble `_ Undocumented @@ -178,10 +181,6 @@ Documentation Binomial coefficients -`catch_signal `_ - What to do on Ctrl-C. If two Ctrl-C are pressed within 1 sec, the calculation if aborted. - - `dble_fact `_ Undocumented @@ -224,6 +223,10 @@ Documentation Undocumented +`extract_ref `_ + Replaces the total wave function by the normalized projection on the reference + + `f_integral `_ function that calculates the following integral \int_{\-infty}^{+\infty} x^n \exp(-p x^2) dx @@ -237,7 +240,7 @@ Documentation 1/n! -`find_rotation `_ +`find_rotation `_ Find A.C = B @@ -263,11 +266,11 @@ Documentation Undocumented -`get_index_in_psi_ref_sorted_bit `_ +`get_index_in_psi_ref_sorted_bit `_ Returns the index of the determinant in the ``psi_ref_sorted_bit`` array -`get_pseudo_inverse `_ +`get_pseudo_inverse `_ Find C = A^-1 @@ -302,7 +305,7 @@ Documentation Undocumented -`h_matrix_ref `_ +`h_matrix_ref `_ Undocumented @@ -387,7 +390,7 @@ Documentation been done going from psi_ref to psi_non_ref -`i2radix_sort `_ +`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. @@ -412,14 +415,14 @@ Documentation contains the new order of the elements. -`i8radix_sort `_ +`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 `_ +`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. @@ -444,14 +447,14 @@ Documentation contains the new order of the elements. -`idx_non_ref `_ +`idx_non_ref `_ Set of determinants which are not part of the reference, defined from the application of the reference bitmask on the determinants. idx_non_ref gives the indice of the determinant in psi_det. idx_non_ref_rev gives the reverse. -`idx_non_ref_rev `_ +`idx_non_ref_rev `_ Set of determinants which are not part of the reference, defined from the application of the reference bitmask on the determinants. idx_non_ref gives the indice of the determinant in psi_det. @@ -532,21 +535,21 @@ Documentation 1/i -`iradix_sort `_ +`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 `_ +`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. -`is_in_psi_ref `_ +`is_in_psi_ref `_ True if the determinant ``det`` is in the wave function @@ -568,7 +571,7 @@ Documentation contains the new order of the elements. -`lapack_diag `_ +`lapack_diag `_ Diagonalize matrix H .br H is untouched between input and ouptut @@ -579,7 +582,7 @@ Documentation .br -`lapack_diag_s2 `_ +`lapack_diag_s2 `_ Diagonalize matrix H .br H is untouched between input and ouptut @@ -590,7 +593,7 @@ Documentation .br -`lapack_diagd `_ +`lapack_diagd `_ Diagonalize matrix H .br H is untouched between input and ouptut @@ -601,7 +604,7 @@ Documentation .br -`lapack_partial_diag `_ +`lapack_partial_diag `_ Diagonalize matrix H .br H is untouched between input and ouptut @@ -616,19 +619,23 @@ Documentation n! +`lowercase `_ + Transform to lower case + + `multiply_poly `_ Multiply two polynomials D(t) =! D(t) +( B(t)*C(t)) -`n_det_non_ref `_ +`n_det_non_ref `_ Set of determinants which are not part of the reference, defined from the application of the reference bitmask on the determinants. idx_non_ref gives the indice of the determinant in psi_det. idx_non_ref_rev gives the reverse. -`normalize `_ +`normalize `_ Normalizes vector u u is expected to be aligned in memory. @@ -637,8 +644,26 @@ Documentation Number of current OpenMP threads -`ortho_lowdin `_ - Compute C_new=C_old.S^-1/2 canonical orthogonalization. +`ortho_canonical `_ + Compute C_new=C_old.U.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 + + +`ortho_lowdin `_ + Compute C_new=C_old.S^-1/2 orthogonalization. .br overlap : overlap matrix .br @@ -708,46 +733,54 @@ Documentation Current status for displaying progress bars. Global variable. -`psi_coef_ref_diagonalized `_ +`psi_non_ref `_ + Set of determinants which are not part of the reference, defined from the application + of the reference bitmask on the determinants. + idx_non_ref gives the indice of the determinant in psi_det. + idx_non_ref_rev gives the reverse. + + +`psi_non_ref_coef `_ + Set of determinants which are not part of the reference, defined from the application + of the reference bitmask on the determinants. + idx_non_ref gives the indice of the determinant in psi_det. + idx_non_ref_rev gives the reverse. + + +`psi_non_ref_coef_restart `_ + Set of determinants which are not part of the reference, defined from the application + of the reference bitmask on the determinants. + idx_non_ref gives the indice of the determinant in psi_det. + But this is with respect to the restart wave function. + + +`psi_non_ref_coef_sorted_bit `_ + Reference determinants sorted to accelerate the search of a random determinant in the wave + function. + + +`psi_non_ref_coef_transp `_ + Transposed psi_non_ref_coef + + +`psi_non_ref_restart `_ + Set of determinants which are not part of the reference, defined from the application + of the reference bitmask on the determinants. + idx_non_ref gives the indice of the determinant in psi_det. + But this is with respect to the restart wave function. + + +`psi_non_ref_sorted_bit `_ + Reference determinants sorted to accelerate the search of a random determinant in the wave + function. + + +`psi_ref_coef_diagonalized `_ Undocumented -`psi_non_ref `_ - Set of determinants which are not part of the reference, defined from the application - of the reference bitmask on the determinants. - idx_non_ref gives the indice of the determinant in psi_det. - idx_non_ref_rev gives the reverse. - - -`psi_non_ref_coef `_ - Set of determinants which are not part of the reference, defined from the application - of the reference bitmask on the determinants. - idx_non_ref gives the indice of the determinant in psi_det. - idx_non_ref_rev gives the reverse. - - -`psi_non_ref_coef_restart `_ - Set of determinants which are not part of the reference, defined from the application - of the reference bitmask on the determinants. - idx_non_ref gives the indice of the determinant in psi_det. - But this is with respect to the restart wave function. - - -`psi_non_ref_coef_sorted_bit `_ - Reference determinants sorted to accelerate the search of a random determinant in the wave - function. - - -`psi_non_ref_restart `_ - Set of determinants which are not part of the reference, defined from the application - of the reference bitmask on the determinants. - idx_non_ref gives the indice of the determinant in psi_det. - But this is with respect to the restart wave function. - - -`psi_non_ref_sorted_bit `_ - Reference determinants sorted to accelerate the search of a random determinant in the wave - function. +`psi_ref_coef_normalized `_ + Normalized coefficients of the reference `psi_ref_coef_sorted_bit `_ @@ -755,11 +788,15 @@ Documentation function. -`psi_ref_energy `_ +`psi_ref_coef_transp `_ + Transposed psi_ref_coef + + +`psi_ref_energy `_ Undocumented -`psi_ref_energy_diagonalized `_ +`psi_ref_energy_diagonalized `_ Undocumented @@ -772,6 +809,10 @@ Documentation Recenter two polynomials +`ref_hamiltonian_matrix `_ + H matrix in the Reference space + + `rint `_ .. math:: .br @@ -819,7 +860,7 @@ Documentation to be in integer*8 format -`set_zero_extra_diag `_ +`set_zero_extra_diag `_ Undocumented @@ -837,11 +878,16 @@ Documentation Stop the progress bar -`trap_signals `_ - What to do when a signal is caught. Here, trap Ctrl-C and call the control_C subroutine. +`svd `_ + Compute A = U.D.Vt + .br + LDx : leftmost dimension of x + .br + Dimsneion of A is m x n + .br -`u_dot_u `_ +`u_dot_u `_ Compute diff --git a/plugins/Psiref_Utils/tree_dependency.png b/plugins/Psiref_Utils/tree_dependency.png index 20482ad271ec0b92fa509b7d9012bb5389eb7a94..c527d617403bb6e97b3cf4a60e88cba622d10552 100644 GIT binary patch literal 70697 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 N!Z>HUGdAvF{~!C?l==Vw literal 3512 zcmW-k2UHVF7so?D4IuRk5P}d&UPL4yNH0>PNPvLIqgSaSRca9FML?P{K2!wNPE?;F`JBD#xbqO=5p z21I?DxP2i;5fa5276asirAyRbNkg8OgoH-d_g!3EqRvhmsZKBffk3)k{s112 zN8x+i$%pO1yr~KKC=@EOYp(xfVfRqG)Kr)=vxj3%$=K$o!x6YM;?-bND+Ggm_LNg8 z^!4=gbai$0^jz7TZVeLxObH4Ce(jia^PP{Q-hG{Ggo>j&$r97m;evwdj{LNDajgU1 z3aS};-~ULjd}xE!ArnJlVFG8}f(i%-AP@)vf!2t_pYQ*usYxlyw-WT~%}D^T%A%qo z4La>6$*gkA`5KH<8_8`T4n-l6k9Epuw6ND!lHAGf?*bh!OM)C6J@Qq(WNbYtG4YK} ztzJ2`<03mdI~yAtJG)J-MZBqwj?TRLQ#>9Kz9K?2;ss25%^fh4G`tmTEiEne_4UWp zkB*NSgw@p4uKdvu;ql|grUv`cu*7?E@NNeG-6dln6lRs%B1v6yHTJC*qFMjC$`XyT zi;9GJcz7f#we~M0I;*Rzr=_IE+uPd}^3k%gvS_ri1ObEOJ_%gSXkqB|l$&Y8 zk*lk#8yXr~TU*KGI~Bts@$uTu?(R$F88=!2zJGl3_w_tyzm zEh7&X`3M*uF0QP?!ovLg{NmzbJpN{>>B-CsjZ7*w;d$>K5Noc~ z50KLF@o`HB9I2|R*IVJ3^Z>l&1Pj^t+R!)~sftFki9q@Jt*xxAZr_%Xmv5l;@-1={ zVnY}HT#`>>Vq&BzwE3NG#ASSsomAsL|NK*1>m$P> z^%-IL(g7_lUSd{xiM^t!sj0H^o{T8uBwerkaHTv0$<3@SE-$~o(1T|cz%DIwv`$CT zPY&4x6oliUEWr1b@ZqktW;K)6%}VplnRZn*H9I6Xfj}@eGU~6Ush!-mwr+MGfO9AB z{U8r=Gk%Qwu)VzrtjtPsbgnDuQHR`K4`Ol-9Zf# z6n^&MR{O-yu6MVDoFk)o-CK1&yg6z&<{i`K%D?8J%xDWcrp7Q+!Do zIHK+5tFS1VmGdj5(9KH(4EpNT{N`T!>{Y%rSLs*qEQiUveW)|yeGWhT2!+ozED1uQD<|EWX@0ns|kJf6ozU$i=3R0 zm*;6^6BmzvF%)w^dr$xN_!Mo&F3B68pk>B=NeQI){Z!O9iZydXH>10^y}+?8RN2W1 z_UrxsOn@BdRM(wssDb8X&FR~J&@k^&(AYNuebac;p{VcBZLALGx7ewj;|)76O<5^D zUkOE_vdc7p2{P?EA_YZ)R{#5JStln^+L7{vb8UT{H5Lv+)S2*K)P%4Lf@^teEUv-6 z&FhZ0O^}*weMGrVwi$Dc&X7e)J0|lJWdC*E+=1=&mzjif5UqQa%i$5vHVlv23Kk4= z7>&Zik0_6h?VhPfN6-(KBW`FYnStC-C~0X4o!U(y84?!0ofSBn0a6 zXU3KQMtOy@dRcSx z_*^4%`?OzM2Nv-IA=dAU)5()r)9KePI>R2QNh|iL1_pM`3CDl_oM|XZf&GvCPDN0% zq>p~H`U_BCa*!V6ppX#JcsLv$`+XFLXrkd_x_0cQTzu9?8MI5xkM4YYZXC^dNp>bcN9B*G$-`B=<6BhnwP!~Hsar~F^Ymag6dRO7C@P{)1rDCmVvFWbU3%U9t)Kt1 zr&BmwPk-)v27~hH(Z1W&Vl`%nmbYYq62qfMP6}}!z)`2?93P!iR;Kj&e;>J`3CTvs z4Och^L4iRdS01N;bFcCPvD$t8 z!Mkhlw19vB)zHl#!-H4$AwR}NI3Y_XgD(-ef!%WQ)IRC1UV>&hLk_Ee!n>XCPGp?a zCh2V+TwDU21@V+C8P<|WP@IYW72@dD@9M?U+bb;3vl3J?EF#a-+xyNdc+g$0bEf@O zgz{%k%2C(D9LBh5->9S2iUjSsTHD4c3*5LA3V#KS_5tz`^%X?x#p?-g>GnPDII5?w zZ&CB;ZoqXF6$yL~Q1$HX?V}gD;<*d4IXOA{6~p(vywu!tgYD#rMzlM6BogT@D8tY2 z@kE_DuRpuZPjgGlz-GHj^RL6h*KLLT9(}y_18;Jp)U5JB^U2ZvI)iD`9?g&D5)lz` zMn5%|2%dcFe53co zgI_Q;3z8k_u^6Tw`TzTdKFIosB&9ac~eK8l@*E1GVyA=#;N0 zL_WNo{%@9;StV5Djn|hdjvF+mpr9b~<_i zqB9ze-l7~!(Xk2{-B;0Q`;)$OdNKzi2*8!)!Qu}8xmcT8zzFVV&*kFqwJQnQ)a6}1 zM-8gCm1Oqw=g)z9UsYA5adv|LaMx$LrJa0*4r|G5pzwMW;hvY2XqKAN6mxAs--lQC0a!R{ z`6B?RWQmgao_g|cjlFb~&bkHWl3t%pv8euAf-o>JfB{~BIe^4M8JBbV0{`eQ?qo6c zrYL5!2*W~bQn$3Z1Yu)i!=jqdrjErIaR#UuPU0smU zzpE|W+}suy762G}hwCJAzV9x~%k%Q{vz!6o(-{U}s|A1!1dN+3(OkmVz`y{5Im(Dv zelxiNPtzlr1&4%$1PA|aLqkolSkZVUFtsIkeRMW1PU9;~M;qZd>8)_ExA$!azhgW+ zJDc$`B{emW$pnkR*fc*N-9mD+B+Sjti4fW}uU#Bo-xm`T`|V%9YXO}e83ASnG7-K9 z39K(tHlv%hcIor63kqOBWqOO4QilsKyHw6qC<_4C=fE+*4uUYzBAD%@_|CYWMvvUN zbI138w^o8w3b7Smymn059kz1yw8fzl@qe3z`P? for perturbation. -`psi_selectors_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_selectors_coef `_ Determinants on which we apply for perturbation. -`psi_selectors_coef_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_selectors_diag_h_mat `_ Diagonal elements of the H matrix for each selectors -`psi_selectors_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_selectors_size `_ Undocumented + +`zmq_get_psi `_ + Get the wave function from the qp_run scheduler + + +`zmq_put_psi `_ + Put the wave function on the qp_run scheduler + diff --git a/plugins/Selectors_full/tree_dependency.png b/plugins/Selectors_full/tree_dependency.png index f49b2e9aa97f40c734dd371bd86aa39a4536d20d..66b2e88a9fca077a49a10576a39202d0dcd7da5c 100644 GIT binary patch literal 82406 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 K*-i{(~gxA7`O+xR6AcxO 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 +Needed Modules +============== +.. Do not edit this section It was auto-generated +.. by the `update_README.py` script. + + +.. image:: tree_dependency.png + +* `Determinants `_ + +Documentation +============= +.. Do not edit this section It was auto-generated +.. by the `update_README.py` script. + + +`coef_hf_selector `_ + energy of correlation per determinant respect to the Hartree Fock determinant + .br + for the all the double excitations in the selectors determinants + .br + E_corr_per_selectors(i) = * c(D_i)/c(HF) if |D_i> is a double excitation + .br + E_corr_per_selectors(i) = -1000.d0 if it is not a double excitation + .br + coef_hf_selector = coefficient of the Hartree Fock determinant in the selectors determinants + + +`delta_e_per_selector `_ + energy of correlation per determinant respect to the Hartree Fock determinant + .br + for the all the double excitations in the selectors determinants + .br + E_corr_per_selectors(i) = * c(D_i)/c(HF) if |D_i> is a double excitation + .br + E_corr_per_selectors(i) = -1000.d0 if it is not a double excitation + .br + coef_hf_selector = coefficient of the Hartree Fock determinant in the selectors determinants + + +`double_index_selectors `_ + degree of excitation respect to Hartree Fock for the wave function + .br + for the all the selectors determinants + .br + double_index_selectors = list of the index of the double excitations + .br + n_double_selectors = number of double excitations in the selectors determinants + + +`e_corr_double_only `_ + energy of correlation per determinant respect to the Hartree Fock determinant + .br + for the all the double excitations in the selectors determinants + .br + E_corr_per_selectors(i) = * c(D_i)/c(HF) if |D_i> is a double excitation + .br + E_corr_per_selectors(i) = -1000.d0 if it is not a double excitation + .br + coef_hf_selector = coefficient of the Hartree Fock determinant in the selectors determinants + + +`e_corr_per_selectors `_ + energy of correlation per determinant respect to the Hartree Fock determinant + .br + for the all the double excitations in the selectors determinants + .br + E_corr_per_selectors(i) = * c(D_i)/c(HF) if |D_i> is a double excitation + .br + E_corr_per_selectors(i) = -1000.d0 if it is not a double excitation + .br + coef_hf_selector = coefficient of the Hartree Fock determinant in the selectors determinants + + +`e_corr_second_order `_ + energy of correlation per determinant respect to the Hartree Fock determinant + .br + for the all the double excitations in the selectors determinants + .br + E_corr_per_selectors(i) = * c(D_i)/c(HF) if |D_i> is a double excitation + .br + E_corr_per_selectors(i) = -1000.d0 if it is not a double excitation + .br + coef_hf_selector = coefficient of the Hartree Fock determinant in the selectors determinants + + +`exc_degree_per_selectors `_ + degree of excitation respect to Hartree Fock for the wave function + .br + for the all the selectors determinants + .br + double_index_selectors = list of the index of the double excitations + .br + n_double_selectors = number of double excitations in the selectors determinants + + +`i_h_hf_per_selectors `_ + energy of correlation per determinant respect to the Hartree Fock determinant + .br + for the all the double excitations in the selectors determinants + .br + E_corr_per_selectors(i) = * c(D_i)/c(HF) if |D_i> is a double excitation + .br + E_corr_per_selectors(i) = -1000.d0 if it is not a double excitation + .br + coef_hf_selector = coefficient of the Hartree Fock determinant in the selectors determinants + + +`inv_selectors_coef_hf `_ + energy of correlation per determinant respect to the Hartree Fock determinant + .br + for the all the double excitations in the selectors determinants + .br + E_corr_per_selectors(i) = * c(D_i)/c(HF) if |D_i> is a double excitation + .br + E_corr_per_selectors(i) = -1000.d0 if it is not a double excitation + .br + coef_hf_selector = coefficient of the Hartree Fock determinant in the selectors determinants + + +`inv_selectors_coef_hf_squared `_ + energy of correlation per determinant respect to the Hartree Fock determinant + .br + for the all the double excitations in the selectors determinants + .br + E_corr_per_selectors(i) = * c(D_i)/c(HF) if |D_i> is a double excitation + .br + E_corr_per_selectors(i) = -1000.d0 if it is not a double excitation + .br + coef_hf_selector = coefficient of the Hartree Fock determinant in the selectors determinants + + +`n_det_selectors `_ + For Single reference wave functions, the number of selectors is 1 : the + Hartree-Fock determinant + + +`n_double_selectors `_ + degree of excitation respect to Hartree Fock for the wave function + .br + for the all the selectors determinants + .br + double_index_selectors = list of the index of the double excitations + .br + n_double_selectors = number of double excitations in the selectors determinants + + +`psi_selectors `_ + Determinants on which we apply for perturbation. + + +`psi_selectors_coef `_ + Determinants on which we apply for perturbation. + + +`psi_selectors_diag_h_mat `_ + Diagonal elements of the H matrix for each selectors + + +`psi_selectors_size `_ + Undocumented + diff --git a/src/AO_Basis/README.rst b/src/AO_Basis/README.rst index 0596085c..ae9acdf0 100644 --- a/src/AO_Basis/README.rst +++ b/src/AO_Basis/README.rst @@ -56,56 +56,72 @@ Documentation .. by the `update_README.py` script. -`ao_coef `_ - AO Coefficients, read from input. Those should not be used directly, as the MOs are expressed on the basis of **normalized** AOs. +`ao_cartesian `_ + If true, use AOs in Cartesian coordinates (6d,10f,...) + + +`ao_coef `_ + Primitive coefficients, read from input. Those should not be used directly, as the MOs are expressed on the basis of **normalized** AOs. + + +`ao_coef_normalization_factor `_ + Coefficients including the AO normalization + + +`ao_coef_normalization_libint_factor `_ + Coefficients including the AO normalization `ao_coef_normalized `_ Coefficients including the AO normalization -`ao_coef_normalized_ordered `_ +`ao_coef_normalized_ordered `_ Sorted primitives to accelerate 4 index MO transformation -`ao_coef_normalized_ordered_transp `_ +`ao_coef_normalized_ordered_transp `_ Transposed ao_coef_normalized_ordered -`ao_expo `_ - expo for each primitive of each ao_basis +`ao_expo `_ + Exponents for each primitive of each AO -`ao_expo_ordered `_ +`ao_expo_ordered `_ Sorted primitives to accelerate 4 index MO transformation -`ao_expo_ordered_transp `_ +`ao_expo_ordered_transp `_ Transposed ao_expo_ordered -`ao_l `_ +`ao_l `_ ao_l = l value of the AO: a+b+c in x^a y^b z^c -`ao_l_char `_ +`ao_l_char `_ ao_l = l value of the AO: a+b+c in x^a y^b z^c -`ao_l_char_space `_ +`ao_l_char_space `_ Undocumented +`ao_l_max `_ + ao_l = l value of the AO: a+b+c in x^a y^b z^c + + `ao_md5 `_ - MD5 key characteristic of the AO basis + MD5 key, specific of the AO basis -`ao_nucl `_ - Index of the nuclei on which the ao is centered +`ao_nucl `_ + Index of the nucleus on which the AO is centered -`ao_num `_ - number of ao +`ao_num `_ + number of AOs `ao_num_align `_ @@ -137,11 +153,17 @@ Documentation :math:`\int \chi_i(r) \chi_j(r) dr)` -`ao_power `_ - power for each dimension for each ao_basis +`ao_power `_ + Powers of x, y and z for each AO -`ao_prim_num `_ +`ao_power_index `_ + Unique index given to a triplet of powers: + .br + 1/2 (l-n_x)*(l-n_x+1) + n_z + 1 + + +`ao_prim_num `_ Number of primitives per atomic orbital @@ -149,15 +171,63 @@ Documentation Undocumented -`ao_prim_num_max_align `_ +`ao_prim_num_max_align `_ Number of primitives per atomic orbital aligned -`l_to_charater `_ +`ao_value `_ + return the value of the ith ao at point r + + +`cart_to_sphe_0 `_ + Spherical -> Cartesian Transformation matrix for l=0 + + +`cart_to_sphe_1 `_ + Spherical -> Cartesian Transformation matrix for l=1 + + +`cart_to_sphe_2 `_ + Spherical -> Cartesian Transformation matrix for l=2 + + +`cart_to_sphe_3 `_ + Spherical -> Cartesian Transformation matrix for l=3 + + +`cart_to_sphe_4 `_ + Spherical -> Cartesian Transformation matrix for l=4 + + +`cart_to_sphe_5 `_ + Spherical -> Cartesian Transformation matrix for l=5 + + +`cart_to_sphe_6 `_ + Spherical -> Cartesian Transformation matrix for l=6 + + +`cart_to_sphe_7 `_ + Spherical -> Cartesian Transformation matrix for l=7 + + +`cart_to_sphe_8 `_ + Spherical -> Cartesian Transformation matrix for l=8 + + +`cart_to_sphe_9 `_ + Spherical -> Cartesian Transformation matrix for l=9 + + +`give_all_aos_at_r `_ + gives the values of aos at a given point r + + +`l_to_charater `_ character corresponding to the "L" value of an AO orbital -`n_aos_max `_ +`n_aos_max `_ Number of AOs per atom @@ -169,21 +239,21 @@ Documentation Undocumented -`nucl_aos `_ +`nucl_aos `_ List of AOs attached on each atom -`nucl_list_shell_aos `_ +`nucl_list_shell_aos `_ Index of the shell type Aos and of the corresponding Aos Per convention, for P,D,F and G AOs, we take the index of the AO with the the corresponding power in the "X" axis -`nucl_n_aos `_ +`nucl_n_aos `_ Number of AOs per atom -`nucl_num_shell_aos `_ +`nucl_num_shell_aos `_ Index of the shell type Aos and of the corresponding Aos Per convention, for P,D,F and G AOs, we take the index of the AO with the the corresponding power in the "X" axis diff --git a/src/Bitmask/README.rst b/src/Bitmask/README.rst index 697ef620..fbf13d22 100644 --- a/src/Bitmask/README.rst +++ b/src/Bitmask/README.rst @@ -72,16 +72,16 @@ Documentation Transform a bit string to a string for printing -`cas_bitmask `_ +`cas_bitmask `_ Bitmasks for CAS reference determinants. (N_int, alpha/beta, CAS reference) -`cis_ijkl_bitmask `_ - Bitmask to include all possible single excitations from Hartree-Fock +`closed_shell_ref_bitmask `_ + Undocumented -`core_bitmask `_ - Reunion of the inactive, active and virtual bitmasks +`core_bitmask `_ + Core orbitals bitmask `debug_det `_ @@ -98,7 +98,11 @@ Documentation Bitmask to include all possible MOs -`generators_bitmask `_ +`full_ijkl_bitmask_4 `_ + Undocumented + + +`generators_bitmask `_ Bitmasks for generator determinants. (N_int, alpha/beta, hole/particle, generator). .br @@ -118,7 +122,7 @@ Documentation .br -`generators_bitmask_restart `_ +`generators_bitmask_restart `_ Bitmasks for generator determinants. (N_int, alpha/beta, hole/particle, generator). .br @@ -138,64 +142,160 @@ Documentation .br -`hf_bitmask `_ +`hf_bitmask `_ Hartree Fock bit mask -`i_bitmask_gen `_ +`i_bitmask_gen `_ Current bitmask for the generators -`inact_bitmask `_ - Bitmasks for the inactive orbitals that are excited in post CAS method +`inact_bitmask `_ + inact_bitmask : Bitmask of the inactive orbitals which are supposed to be doubly excited + in post CAS methods + n_inact_orb : Number of inactive orbitals + virt_bitmask : Bitmaks of vritual orbitals which are supposed to be recieve electrons + in post CAS methods + n_virt_orb : Number of virtual orbitals -`inact_virt_bitmask `_ +`inact_virt_bitmask `_ Reunion of the inactive and virtual bitmasks +`index_holes_bitmask `_ + Index of the holes in the generators_bitmasks + + +`index_particl_bitmask `_ + Index of the holes in the generators_bitmasks + + +`initialize_bitmask_to_restart_ones `_ + Initialization of the generators_bitmask to the restart bitmask + + +`is_a_1h `_ + Undocumented + + +`is_a_1h1p `_ + Undocumented + + +`is_a_1h2p `_ + Undocumented + + +`is_a_1p `_ + Undocumented + + +`is_a_2p `_ + Undocumented + + `is_a_two_holes_two_particles `_ Undocumented -`list_inact `_ +`is_the_hole_in_det `_ Undocumented +`is_the_particl_in_det `_ + Undocumented + + +`list_act `_ + list of active orbitals + + +`list_core `_ + List of the core orbitals that are never excited in post CAS method + + +`list_inact `_ + list_inact : List of the inactive orbitals which are supposed to be doubly excited + in post CAS methods + list_virt : List of vritual orbitals which are supposed to be recieve electrons + in post CAS methods + + `list_to_bitstring `_ Returns the physical string "string(N_int,2)" from the array of occupations "list(N_int*bit_kind_size,2) -`list_virt `_ - Undocumented +`list_virt `_ + list_inact : List of the inactive orbitals which are supposed to be doubly excited + in post CAS methods + list_virt : List of vritual orbitals which are supposed to be recieve electrons + in post CAS methods -`n_cas_bitmask `_ +`modify_bitmasks_for_hole `_ + modify the generators_bitmask in order that one can only excite + the electrons occupying i_hole + + +`modify_bitmasks_for_hole_in_out `_ + modify the generators_bitmask in order that one can only excite + the electrons occupying i_hole + + +`modify_bitmasks_for_particl `_ + modify the generators_bitmask in order that one can only excite + the electrons to the orbital i_part + + +`n_act_orb `_ + number of active orbitals + + +`n_cas_bitmask `_ Number of bitmasks for CAS -`n_generators_bitmask `_ +`n_core_orb `_ + Core orbitals bitmask + + +`n_generators_bitmask `_ Number of bitmasks for generators -`n_inact_orb `_ - Bitmasks for the inactive orbitals that are excited in post CAS method +`n_generators_bitmask_restart `_ + Number of bitmasks for generators + + +`n_inact_orb `_ + inact_bitmask : Bitmask of the inactive orbitals which are supposed to be doubly excited + in post CAS methods + n_inact_orb : Number of inactive orbitals + virt_bitmask : Bitmaks of vritual orbitals which are supposed to be recieve electrons + in post CAS methods + n_virt_orb : Number of virtual orbitals `n_int `_ Number of 64-bit integers needed to represent determinants as binary strings -`n_virt_orb `_ - Bitmasks for the inactive orbitals that are excited in post CAS method +`n_virt_orb `_ + inact_bitmask : Bitmask of the inactive orbitals which are supposed to be doubly excited + in post CAS methods + n_inact_orb : Number of inactive orbitals + virt_bitmask : Bitmaks of vritual orbitals which are supposed to be recieve electrons + in post CAS methods + n_virt_orb : Number of virtual orbitals `number_of_holes `_ Undocumented -`number_of_holes_verbose `_ +`number_of_holes_verbose `_ Undocumented @@ -203,7 +303,7 @@ Documentation Undocumented -`number_of_particles_verbose `_ +`number_of_particles_verbose `_ Undocumented @@ -211,22 +311,61 @@ Documentation Subroutine to print the content of a determinant using the '+-' notation +`print_generators_bitmasks_holes `_ + Undocumented + + +`print_generators_bitmasks_holes_for_one_generator `_ + Undocumented + + +`print_generators_bitmasks_particles `_ + Undocumented + + +`print_generators_bitmasks_particles_for_one_generator `_ + Undocumented + + `print_spindet `_ Subroutine to print the content of a determinant using the '+-' notation -`ref_bitmask `_ +`ref_bitmask `_ Reference bit mask, used in Slater rules, chosen as Hartree-Fock bitmask -`reunion_of_bitmask `_ +`reunion_of_bitmask `_ Reunion of the inactive, active and virtual bitmasks -`unpaired_alpha_electrons `_ +`reunion_of_cas_inact_bitmask `_ + Reunion of the inactive, active and virtual bitmasks + + +`reunion_of_core_inact_bitmask `_ + Reunion of the inactive, active and virtual bitmasks + + +`set_bitmask_hole_as_input `_ + set the generators_bitmask for the holes + as the input_bimask + + +`set_bitmask_particl_as_input `_ + set the generators_bitmask for the particles + as the input_bimask + + +`unpaired_alpha_electrons `_ Bitmask reprenting the unpaired alpha electrons in the HF_bitmask -`virt_bitmask `_ - Bitmasks for the inactive orbitals that are excited in post CAS method +`virt_bitmask `_ + inact_bitmask : Bitmask of the inactive orbitals which are supposed to be doubly excited + in post CAS methods + n_inact_orb : Number of inactive orbitals + virt_bitmask : Bitmaks of vritual orbitals which are supposed to be recieve electrons + in post CAS methods + n_virt_orb : Number of virtual orbitals diff --git a/src/Determinants/README.rst b/src/Determinants/README.rst index bd5c91ab..c6685945 100644 --- a/src/Determinants/README.rst +++ b/src/Determinants/README.rst @@ -15,22 +15,26 @@ Documentation .. by the `update_README.py` script. -`a_operator `_ +`a_operator `_ Needed for diag_H_mat_elem -`abs_psi_coef_max `_ +`abs_psi_coef_max `_ Max and min values of the coefficients -`abs_psi_coef_min `_ +`abs_psi_coef_min `_ Max and min values of the coefficients -`ac_operator `_ +`ac_operator `_ Needed for diag_H_mat_elem +`apply_excitation `_ + Undocumented + + `apply_mono `_ Undocumented @@ -39,12 +43,12 @@ Documentation Energy of the reference bitmask used in Slater rules -`bitstring_to_list_ab `_ +`bitstring_to_list_ab `_ Gives the inidices(+1) of the bits set to 1 in the bit string For alpha/beta determinants -`bitstring_to_list_ab_old `_ +`bitstring_to_list_ab_old `_ Gives the inidices(+1) of the bits set to 1 in the bit string For alpha/beta determinants @@ -82,11 +86,11 @@ Documentation N_states lowest eigenvalues of the CI matrix -`ci_sc2_eigenvectors `_ +`ci_sc2_eigenvectors `_ Eigenvectors/values of the CI matrix -`ci_sc2_electronic_energy `_ +`ci_sc2_electronic_energy `_ Eigenvectors/values of the CI matrix @@ -115,11 +119,11 @@ Documentation Initial guess vectors are not necessarily orthonormal -`connected_to_ref `_ +`connected_to_ref `_ Undocumented -`connected_to_ref_by_mono `_ +`connected_to_ref_by_mono `_ Undocumented @@ -128,11 +132,15 @@ Documentation After calling this subroutine, N_det, psi_det and psi_coef need to be touched -`create_minilist `_ +`create_microlist `_ Undocumented -`create_minilist_find_previous `_ +`create_minilist `_ + Undocumented + + +`create_minilist_find_previous `_ Undocumented @@ -141,11 +149,11 @@ Documentation of alpha and beta determinants -`davidson_converged `_ +`davidson_converged `_ True if the Davidson algorithm is converged -`davidson_criterion `_ +`davidson_criterion `_ Can be : [ energy | residual | both | wall_time | cpu_time | iterations ] @@ -217,7 +225,7 @@ Documentation ||Da||_i \sum_j C_{ij}**2 -`det_coef `_ +`det_coef `_ det_coef @@ -225,7 +233,7 @@ Documentation Undocumented -`det_occ `_ +`det_occ `_ det_occ @@ -241,16 +249,20 @@ Documentation Diagonalization algorithm (Davidson or Lapack) -`diag_h_mat_elem `_ +`diag_h_elements_sc2 `_ + Eigenvectors/values of the CI matrix + + +`diag_h_mat_elem `_ Computes -`diag_h_mat_elem_fock `_ +`diag_h_mat_elem_fock `_ Computes when i is at most a double excitation from a reference. -`diagonalize_ci `_ +`diagonalize_ci `_ Replace the coefficients of the CI states by the coefficients of the eigenstates of the CI matrix @@ -260,11 +272,26 @@ Documentation eigenstates of the CI matrix -`diagonalize_ci_sc2 `_ +`diagonalize_ci_sc2 `_ Replace the coefficients of the CI states_diag by the coefficients of the eigenstates of the CI matrix +`diagonalize_s2 `_ + Diagonalize the S^2 operator within the n_states_diag states required. Notice : the vectors are sorted by increasing S^2 values. + + +`diagonalize_s2_betweenstates `_ + You enter with nstates vectors in psi_coefs_inout that may be coupled by S^2 + The subroutine diagonalize the S^2 operator in the basis of these states. + The vectors that you obtain in output are no more coupled by S^2, + which does not necessary mean that they are eigenfunction of S^2. + n,nmax,nstates = number of determinants, physical dimension of the arrays and number of states + keys_tmp = array of integer(bit_kind) that represents the determinants + psi_coefs(i,j) = coeff of the ith determinant in the jth state + VECTORS ARE SUPPOSED TO BE ORTHONORMAL IN INPUT + + `do_mono_excitation `_ Apply the mono excitation operator : a^{dager}_(i_particle) a_(i_hole) of spin = ispin on key_in @@ -282,18 +309,34 @@ Documentation for a given couple of hole/particle excitations i. +`doubly_occ_empty_in_couple `_ + n_couples is the number of couples of orbitals to be checked + couples(i,1) = first orbital of the ith couple + couples(i,2) = second orbital of the ith couple + returns the array couples_out + couples_out(i) = .True. if det_in contains + an orbital empty in the ith couple AND + an orbital doubly occupied in the ith couple + + +`doubly_occ_empty_in_couple_and_no_hund_elsewhere `_ + n_couples is the number of couples of orbitals to be checked + couples(i,1) = first orbital of the ith couple + couples(i,2) = second orbital of the ith couple + returns the array couples_out + couples_out(i) = .True. if det_in contains + an orbital empty in the ith couple AND + an orbital doubly occupied in the ith couple + + `expected_s2 `_ Expected value of S2 : S*(S+1) -`fill_h_apply_buffer_no_selection `_ +`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 @@ -306,7 +349,7 @@ Documentation idx(0) is the number of determinants that interact with key1 -`filter_connected_i_h_psi0 `_ +`filter_connected_i_h_psi0 `_ returns the array idx which contains the index of the .br determinants in the array key1 that interact @@ -316,7 +359,7 @@ Documentation idx(0) is the number of determinants that interact with key1 -`filter_connected_i_h_psi0_sc2 `_ +`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 @@ -348,7 +391,7 @@ Documentation Returns the excitation degree between two determinants -`get_excitation_degree_vector `_ +`get_excitation_degree_vector `_ Applies get_excitation_degree to an array of determinants @@ -364,11 +407,11 @@ Documentation Returns the index of the determinant in the ``psi_det_sorted_bit`` array -`get_mono_excitation `_ +`get_mono_excitation `_ Returns the excitation operator between two singly excited determinants and the phase -`get_occ_from_key `_ +`get_occ_from_key `_ Returns a list of occupation numbers from a bitstring @@ -384,6 +427,19 @@ Documentation Undocumented +`get_uj_s2_ui `_ + returns the matrix elements of S^2 "s2(i,j)" between the "nstates" states + psi_coefs_tmp(:,i) and psi_coefs_tmp(:,j) + + +`getmobiles `_ + Undocumented + + +`give_index_of_doubly_occ_in_active_space `_ + Undocumented + + `h_apply_buffer_allocated `_ Buffer of determinants/coefficients/perturbative energy for H_apply. Uninitialized. Filled by H_apply subroutines. @@ -402,7 +458,7 @@ Documentation Undocumented -`h_u_0 `_ +`h_u_0 `_ Computes v_0 = H|u_0> .br n : number of determinants @@ -410,19 +466,19 @@ Documentation H_jj : array of -`i_h_j `_ +`i_h_j `_ Returns where i and j are determinants -`i_h_j_phase_out `_ +`i_h_j_phase_out `_ Returns where i and j are determinants -`i_h_j_verbose `_ +`i_h_j_verbose `_ Returns where i and j are determinants -`i_h_psi `_ +`i_h_psi `_ Computes = \sum_J c_J . .br Uses filter_connected_i_H_psi0 to get all the |J> to which |i> @@ -431,14 +487,14 @@ Documentation minilists -`i_h_psi_minilist `_ +`i_h_psi_minilist `_ Computes = \sum_J c_J . .br Uses filter_connected_i_H_psi0 to get all the |J> to which |i> is connected. The |J> are searched in short pre-computed lists. -`i_h_psi_sc2 `_ +`i_h_psi_sc2 `_ for the various Nstate .br returns in addition @@ -452,7 +508,7 @@ Documentation to repeat the excitations -`i_h_psi_sc2_verbose `_ +`i_h_psi_sc2_verbose `_ for the various Nstate .br returns in addition @@ -466,7 +522,7 @@ Documentation to repeat the excitations -`i_h_psi_sec_ord `_ +`i_h_psi_sec_ord `_ for the various Nstates @@ -481,19 +537,11 @@ Documentation 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_connected_to `_ + Undocumented -`is_connected_to `_ +`is_connected_to_by_mono `_ Undocumented @@ -517,6 +565,14 @@ Documentation Energy of the reference bitmask used in Slater rules +`n_closed_shell `_ + Undocumented + + +`n_closed_shell_cas `_ + Undocumented + + `n_det `_ Number of determinants in the wave function @@ -534,15 +590,15 @@ Documentation determinants. idx_cas gives the indice of the CAS determinant in psi_det. -`n_det_max `_ +`n_det_max `_ Max number of determinants in the wave function -`n_det_max_jacobi `_ +`n_det_max_jacobi `_ Maximum number of determinants diagonalized by Jacobi -`n_det_max_property `_ +`n_det_max_property `_ Max number of determinants in the wave function when you select for a given property @@ -562,11 +618,15 @@ Documentation psi_occ_pattern(:,2,j) = jth occ_pattern of the wave function : represent all the double occupation +`n_open_shell `_ + Undocumented + + `n_single_exc_bitmasks `_ Number of single excitation bitmasks -`n_states `_ +`n_states `_ Number of states to consider @@ -574,6 +634,16 @@ Documentation Number of states to consider for the diagonalization +`neutral_no_hund_in_couple `_ + n_couples is the number of couples of orbitals to be checked + couples(i,1) = first orbital of the ith couple + couples(i,2) = second orbital of the ith couple + returns the array couples_out + couples_out(i) = .True. if det_in contains + an orbital empty in the ith couple AND + an orbital doubly occupied in the ith couple + + `nucl_elec_ref_bitmask_energy `_ Energy of the reference bitmask used in Slater rules @@ -590,7 +660,15 @@ Documentation Number of possible determinants for a given occ_pattern -`one_body_dm_mo `_ +`one_body_dm_ao_alpha `_ + one body density matrix on the AO basis : rho_AO(alpha) , rho_AO(beta) + + +`one_body_dm_ao_beta `_ + one body density matrix on the AO basis : rho_AO(alpha) , rho_AO(beta) + + +`one_body_dm_mo `_ One-body density matrix @@ -602,19 +680,23 @@ Documentation Alpha and beta one-body density matrix for each state -`one_body_single_double_dm_mo_alpha `_ +`one_body_single_double_dm_mo_alpha `_ Alpha and beta one-body density matrix for each state -`one_body_single_double_dm_mo_beta `_ +`one_body_single_double_dm_mo_beta `_ Alpha and beta one-body density matrix for each state -`one_body_spin_density_mo `_ +`one_body_spin_density_ao `_ + one body spin density matrix on the AO basis : rho_AO(alpha) - rho_AO(beta) + + +`one_body_spin_density_mo `_ rho(alpha) - rho(beta) -`only_single_double_dm `_ +`only_single_double_dm `_ If true, The One body DM is calculated with ignoring the Double<->Doubles extra diag elements @@ -683,11 +765,11 @@ Documentation Undocumented -`psi_coef_max `_ +`psi_coef_max `_ Max and min values of the coefficients -`psi_coef_min `_ +`psi_coef_min `_ Max and min values of the coefficients @@ -695,13 +777,6 @@ Documentation 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 @@ -738,13 +813,6 @@ Documentation 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 @@ -752,13 +820,6 @@ Documentation 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. @@ -787,15 +848,23 @@ Documentation psi_occ_pattern(:,2,j) = jth occ_pattern of the wave function : represent all the double occupation +`pull_pt2 `_ + Pull PT2 calculation in the collector + + +`push_pt2 `_ + Push PT2 calculation to the collector + + `put_gess `_ Undocumented -`read_dets `_ +`read_dets `_ Reads the determinants from the EZFIO file -`read_wf `_ +`read_wf `_ If true, read the wave function from the EZFIO file @@ -816,7 +885,7 @@ Documentation be set before calling this function. -`s2_eig `_ +`s2_eig `_ Force the wave function to be an eigenfunction of S^2 @@ -832,27 +901,35 @@ Documentation z component of the Spin +`save_hf `_ + Undocumented + + `save_natorb `_ Undocumented -`save_natural_mos `_ +`save_natural_mos `_ Save natural orbitals, obtained by diagonalization of the one-body density matrix in the MO basis -`save_wavefunction `_ +`save_ref_determinant `_ + Undocumented + + +`save_wavefunction `_ Save the wave function into the EZFIO file -`save_wavefunction_general `_ +`save_wavefunction_general `_ Save the wave function into the EZFIO file -`save_wavefunction_specified `_ +`save_wavefunction_specified `_ Save the wave function into the EZFIO file -`save_wavefunction_unsorted `_ +`save_wavefunction_unsorted `_ Save the wave function into the EZFIO file @@ -860,7 +937,7 @@ Documentation Undocumented -`set_natural_mos `_ +`set_natural_mos `_ Set natural orbitals, obtained by diagonalization of the one-body density matrix in the MO basis @@ -882,13 +959,6 @@ Documentation Uncodumented : TODO -`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 @@ -899,7 +969,7 @@ Documentation Return an integer*8 corresponding to a determinant index for searching -`state_average_weight `_ +`state_average_weight `_ Weights in the state-average calculation of the density matrix @@ -907,7 +977,7 @@ Documentation Uncodumented : TODO -`target_energy `_ +`target_energy `_ Energy that should be obtained when truncating the wave function (optional) @@ -915,11 +985,11 @@ Documentation convergence of the correlation energy of SC2 iterations -`threshold_davidson `_ +`threshold_davidson `_ Thresholds of Davidson's algorithm -`threshold_generators `_ +`threshold_generators `_ Thresholds on generators (fraction of the norm) @@ -927,6 +997,13 @@ Documentation Thresholds on selectors (fraction of the norm) +`u0_h_u_0 `_ + Computes e_0 = / + .br + n : number of determinants + .br + + `write_spindeterminants `_ Undocumented diff --git a/src/Determinants/tree_dependency.png b/src/Determinants/tree_dependency.png index f9eb10c3b673a02cdca8b6208943df8d84ca26e8..9184383e153a6e4f20de3027baef58f1d96398b3 100644 GIT binary patch literal 63258 zcmYhj2RN61`#$~-Sy@R)NJv(aMA<}CDoIgfCyGe65JFN$K1O8kD1=02lB~?kkQE|Z zHvjY8^ZOph|9+0g$C3AV-LG+7=XIXvb^B{vRHdb6qb3jtv}e_nH3+w`Y0#epUMFD~GX5<$XT;&e2b8rxBYVPUjsp+gWedp=vIi$)? zciY(5>tcInXPO58moHzOWJ+?p&u~R*$6rn;DtcKzYFqTwWeaMG{=u0C-<&26+0pkgsii%Xx_?pavi=fxDw+?xTNZFpyMbH%7_x21$%m4&5cR(7`PgTv8{_sq>TcrWhS zwM)FRtE($VN7&VMeQvlWXuo9O#Wa(T)Xn2N7O0a`?%chL*VNb73keD~>uFxUF2F>+ zgRr)?=HTGa(a~}3+BFFY3Hni*$s)4BGtt`^OKTD2?}X#_?RDkefY_DA!_8$AKCwku7H$5Y#VRkd=|aYh`3)^lsk7I~p4sa|7+jUYtw${{8#v>Z*#03V!g?4 zp|LUTLbQb2+G2b>7rr-(^l?5*gHZGAT}#Unhd(!zl$303Z67?y%gC5$&$xokOWeOQ zGKRMmVyea#j*E%C2o0SXDBoV0Gx1j*8X98cX8;p^vts zb>B0!56Czvq-bLMSAF_qD6-F}nf<}`)@E{Y^5ILd&F1;n^UNA!q#Zl5uH(q+s8U$$ z#DPtCosn_s{?O;{yxZ79IDd&rNn_t)_V3%5ktC}U@0ppI`O#(R_h@}YXlUsDlX^Nj zU3FnXV@+|{X=#4;<_zK38~ULd{3Uo%u1U>{7ca1q5yIEStouuXgBeIXAK9A+rxv__ zuV3yiD%yj3C1<7xTN=goV zxIa8UT5nWun67&L`gQC9IrohZDJi4jM|At0$2fFONw`#$kkG1`m<*4_dAJXKroy3m zqg(h^CznM3vC`)2?CkBingjG4Qp!m!@2v;Q?)6D^d6|e~l)wG-MC5HpzP`8W{qk(z zLZjpW;#b9C{^odbNy(YMkGO$StbO_R*7|4vJ-LCDnn#`f5SCItd^maXOF} zH}&=VhpGd<$7_qpjUpA8`}`$dF@qGBcu;?8k?z^B9GRiAfOqsl*m-6@fU~TVl-} zr*|&)7910)+KY~{>sG<#sb5__I3;^RMG$1 zn@$nLDH|na{~NQ85A$lX;kamhyK2f()QZjAnu0~-kQ z$~X~v{h!Osu2LtT<7X1N{*G5zc&a(!bks#bx7oksx`iZ!itfB@_3edA3~bcu>I5H> zFF_P>?$k`yf3A{cZ#0;38E8FJ;UY|SlJ452z*{C(nzyH9Q$kdNJUrZRK#o8#x7bl1 zK`O-&`O>pV-ec7A?K{0i)t5967ie?xNSUZ@?041#mcG-purREqHngHu<2AfPZPq|2 zyjLoAy4+{+{j{dQ%96I|EoxCo3RAJ1cO<)5ym|}QyH~0jdwSNsJl}uy>eV=pts-9* zS_={q#q6F!>o`wOMK?EDi2w@1gjJ!iurfj6OW@|1Y7zVO;>Ebtu_u@oyL|~ zQiu4{J5MNiuuC)h2dVb-1hX6smK?ynczJJ2Hf3E`QzH2^e9-uqrf$H-;vN#h(3s>0 zB^NzMH#ahZX$@WSd*}vK%SZ(NTLhyh8Y5&SdS0E^`bF2$m{WRE^%#N*co&6biU~O@?6UO&mLQ(3}jil6z9%8QXnvp**VY^2ltbad%Y72j-_*$A>YM9 za{9E*0$RybV-6%vS$%}G5|Q&T-X_6|?G&`?r`KO}@lht6-k z^eUrXo*VX+5s^;ZcmVXK0)J%i(V^odRh!_7nsLe=bo5%We`8 zJ;JF|1j6?(W>Kxp&A~5Th&}kFu8!{^Cgs;ba%LcE2&Q7qJ=CpjmElJa z{_+dGb3{cww&cq-9IQfv3jC|`jz4s0RfklKc>Uo-c zUWMj4$1Vclqoa2?bH%XdE|!X@6WLcT22IM@3$83&($L+NtXVPY6~Kb`BwfB*wlcJf zFZ7h-v>tIhyF2KexU3dCbgi%7xMAEz$gjDUGhSZUuXID#;HC5Cn*QxGZ*F{FSadJ% z(p~VJZd;FOT@LCyJl+3>t+g)9TO_&Ae&&8yXV!$#h3`|y-GoOAV@-G6TY`&$Y?k6v zQmSifYrDJmdFu<;jY*5`J9hl^#zru`ymD)sYwY%4E7L)x$JI(|ypPYR{OAj5j1HNa z@^G&oJ~&ez)YZey`{K7n;mlFvNbO`z( z@kyzy68AwfGc`jl+gUE|u)jH}zZW|VJVMlxY4=N*I~4_+Rs1#7X!`y8H#ax8l(h6w z{SsCNhDY`%n<+iHzP`mav>w>%cb(Z>o6MfI7v^EyNK%qD$<;wFngy(*qUwHc6|KNk zA;qmW251B9wK=f8IecKC7C_r0(e}5fSvI)Tu zwS22y2_PRCP6G{%oZTP88-vM_dzW~C_$4Jfo0_ZvMs_g^JFP7WbnI3vRu&A4m9np^ zsksf@^3mbXxpU`i?d(2F@vD^rW~|kiiVY79-Rm!@9kceaPueGW!OO&y(;8ISG#WuIM$d7CYL-*L0#l$5@54+FkXpU02YUy6+)+gR0^ z)SqU+jt020>V4nc+l!o9V_mv*O+}@;(woA{(lRG-S1UsoCyfgS;K$Zdrvc`WKcarD zF}m>1_t#IJP_D2#{5L%31PmhYzOho}N6*2|e(lYT0-y%+9@#x?7l;7KKvh*$Pwz)d zk}6Q0jxhFJ=?MTNi?&oEYCY{Oo|cgzASbs4XjOQx@6+%caZ=X*6ao+yjHlQHn_*kg zdIMbL-EPt^bvYp|9epva>E-d;(?5zXU%pIEPOjreo^jsZehDxzTd(LvRMa`{kkm_Y za)@w|k*vUk_!d#}1#0nE0RH!We7HaO$tO9PH$&_9)D$~Ay9`k3lP6D(nS3$i;1Ji^ zxpU{l#6+R>z{Lv}tjx^~b9FGFCxL<35()fg?0nD2Mrv~vm|IvVQe>C7F5h!@KJ`-l z@A5J|sx4~j`Gtk!Cr(sLDVU?a1U#*8Xi&dMyhM&1ITWG>L^JsBs;sP3=H5NYdhiV? zsu%~%tiqlKpeO{V9RxZ$I=s;R-?iuP#mC=o-AE}blS3JH{P+TDpqDRS%5c&L)vT|q zJO&EF-hBL+m5t4qgD3errd<5>`}YzHDL}rnPBJ8(KXC>oCQccBBD-|y5()s6WLZ`0 zDxZz-WBTwN`u{Er@#akqLPdXn|G>aNXD3VJrZ^kzq}st4lv$7Wsc_V{rCnM;iMOzT zN{vu~nyl*I)z!9zB|!pRdIo!r=cIuS)9f z>-={$G|)^M9=y2|cdrr^9gRu^^+-$o*r!iQ`2&aimERQmkt@T7n&er+JtW;im`ZoKBoLfpttr*^rre zWvjWnJ0r3Y)AZ?+SEXTOWTXxtxsFaG77x3!+;slMwdYJ+Ow_$SJx(%2bhzeOGmK&Z zMLwNhTl>GOtLy8it4m+LtJ5$BZlFv@_}82hqknQz(rGRRN}o^I{NfP+E@3l?xyN3ri*JpOn`0x9dmEXV zeK8b`R8RHs*_l=Cl}~}3`sAv%_VPFBnIC0tuJz$Zq#dT3+uBa21ymbX)9!GQZ2tQ~ zjTc3Gs2cB|KYx@GG`JY-?CemqqE`1;PJDQrj9_kM^~YqwRP1`urZ}D7@ngpn5C5K= zyu!}}$PRYH)HFFQO*KUm=Phg|g~?INPU_}mwX0XZzrLC&CMG7gwKAMtzQq<8L27Xr zh%01baiZ;j+hPbx&DzkzSpQtQ+g)Ex-yLvY8Qk8Q*?#!&;l)^)iII`V_R0*&=K@}b z9W>WL5&!wi7ZHOp83~EMD8P6GG6)1pvQJ3jaWc-_Ow^^NrOSVMDUQ+}w89A%PyA8p z+S%K?-e2mKUy z><%1=^YZfAxr^D5Bg6%f=g*HKM392S#7|XK!x%c!iQ+afkW+zO*x1z&6%ek#-U7qQ5yh1|RN`vs!#}}f8LXDY$p~6rUWw!QPJ%4-UC^J)2yV;+W z=OaWAY3SdOewN}k&-ZrT*=m%Ml7fgNzq!~ZIq>ko^7KttSJy0_PYoNZ3%jVPOG-<5 zxVbyt-t7JU-N#ib-@+EL0P$Dt^z!O) za+^rsV0MTf_K^5t4oPpShG)TYNjpxfpFNwAo(@z{_Hb1UqvAP$1AlFQ0SBj_wxOZn zwQC(EsLGq-=s#Xk`i(r3oMPx#Gw9hPX0i(miO)* za?RS`vspY|XGl;;8__s8wUaaYkD$`t1gpZ$!?V3IOyA|k$VN^4b82ShF1&(~m(ijo zkRu}_1H2IO0(Ma);E*4Y!Qw$`Lz2L&1h1s3JFhKH5a*yVngVl>P5W!FTAQJtsudVY zroO{&42Tvnvwen-MhZ~|!2pv9LQ&V$TMur_XLcR;{IgR)9eKHiqv3t0+ zu^M{#(#0t83D7e{NJZS&7annN+H0w+t2;PIcvn8M#{1~rANOsi!#M1pPKRQbVEc?9 z9bv<@-oZj@@^lT}H`TC(7ld>6Isg0uVy#tAGw#|;pDhmH{#he!`=fs znuBd_wqwT*EN}qJ(O7v8BC3&=lES~Yihz5lB6o0NmjyG6(BU}zAhU2f6rqxhj^-00kH+=~y?g5F4dq)) zN5k~^=)0z+mEK?j#0A(k zxB5{1leaji^YjChURgT1iC~z%#YmTL{@pLN+rjB^@#&A35Rvj-muo?@0+mIChr2Jf zsIs1+w4fwWbn7X&%fh+cv_#>rT-Vr0{GzU06VPuW`Xx{7?Sds31FCT@4|ys?%6rH~ z)Q6o*!IbhcQV||i4I)ze+dm3+shq2fFOzw=BFfLNCK8b(&*-nr7g}qU2iDPHs_Ph1 zyk(Vlem6M3e)n}NGR1zU;peCQ=mh?9%gUBcOf&1RY|@U`FJ1U1Z7HFf zVily$cOIbq!i8!6-`dx%z1H(m<9&hf-Xy=xo|(>NkLCQ`jV!diHhDBdt7lW& zNydG3e$-}>F5Lk4eCzDlv&*Gwe4(2w!$FfUklRH2jT1Gey#rW zrl(^+8J`=>6|;b_RZ*c(ZL)VSh{A@3tel)?AkHdJ#oy#J+FVyPGsGn%u5pJfuIT1p zrT0XM0-Bl)2|{J}8ZR^Q4p{m;oTAZ^xe+4 zC&b0^;v&63395q(lt`!uBb-ha$UEF2>3Mlqpz8d?8^Fk6)RK$*lSvHhbZNFm%3KWK z{DE?wpE*s>P3@DIoh=`^*N5=P`PL(Z&zThD8UP_r1pvG5{(g|$D-Yd)rM0yq6u1Cc z_EM6OcoN?5C^@<$Xz(*o=IB!q^f^HZ0JX?)S{oXIpML)A84WEhU?Ye`y9vg)rkZ~u z0%9w0IKmTDB}wNDS2pi>&(K;^B+!ePXEima`4Orp8sQ^HK(h8h5lFyl6%-aG#X-k$ zVL;YR&`2MQY`H5Y81_0X?KZwDsl{A8DkLPt-=FFNRm??I`N*>5aSfTCXTM9ZemEVc z*e_loUPR=$M0R0soq_VQC`KywQaz~!0ZM@BDc<{1T|yiZk0@7YZQsmZrZGEcO<3P= zXZS*CX=r>MOCfFDzJ2(H2d#diRo~3Z=KuWrC1l+;@yhn&)Ppfl0=Rk>&6=H?bfLyQ>Bh89QeosgYi!ksm099%udR!Arh71Ge!Bum0|vem!w?|bhNg%E^kA!sjJx= zqNX*%O4O{{pm;&ELJ_eT|H&pL{vac@&-bIb-BXB&*z5Q-Ute-MzohgqF>&#HFk-H? zKYp17Dj}HT`j{PuL(1g60n-6^Z-b~x_En&uI<=r^67fC%@cNh_on{*F)F*9iJ1jLMq!AM`{~ms`~olz zwQ4aWdg!O-h6)Dnqf{yNd$$TNBhHb)H`}LG$**5iD>5wVjs5)j^VhFm$p83da1hg) z8@RUjMwB+b5QQ=#Gk)H`e;-xcg$uMjE}v1U9`eJ+?(OQLNzUDqJesU&f#3xq)878X zn*8h3RPsN0jfSE?U}N~;secy=%AY?Kco}o)^t4gQVub(u_gAl8A$nr8T$G7vX=CH# zf&v>b7-sj5~Qh5%?cp1c3~T_E-D8 zf^89MhA{}HkW3ILLBjwS{int&&Sv%LF_n4L-174B;$pkaB!OoBsoEp9y7>R|0`S%$ z9AHA~>I8*_g#`pArlxoqC?WP>)Z>jYkdZMP?9)uYb=}V-I{J3s@(r!eanbhOx4);fRYreps5CiUSo_ zR8$B6tG^Vx#aqCp%D{^kANzM5IdXw7l&CL1ejGoc+{^h#DXPXSuZ1l1#S7GRdl>zh z*x8>2rXDl;^w>zRS#&H6rwf(K4`5^r6cH9Df4os!P3;LpP0NU#MwE)diHV6|Fi=I~ zC-_0IgpQ8OU?PdQpO;rz^{5>$V=d4bFrU-r+7g1{`SbNi>}Q~GpE(n_?>PD7IMHJJ?-8$j=cgklMi?5#_{pQ?==tvkgGf*@yFE4n#VeCAN1%Lrk z{lS9=qdfG<6iKyUK>&S-3mnYNn-`K=h~ywX2cj@=NLJEhoQ`mr+xlOaEx;dwf!x^K z1j#800^crJH7m*6j@*k2>n;h}^5Lqjnb|L-fL{=bkqvk6p6j9dwY2b5f$IZgV5nlw zW8XMJ)J8@}_x|r|Rw#xLxcs^YCda+%G179RKSiEy}syk1H zv#F`+C@c$nd|x^`m?uAQ#b_g-fU*4W;R6UYshBdmiB?eDCr_QCE#@)}9?WR}`Lx+7D`WbKDY>p=d(ICY?d)ARnv=f}jH$SL$JEwcDsygq-MWzUzV|yvvV{mQ-J00x9vb2Z1 zb4pQ>Gq5X6H^_n8n=>9b`@RC-6kSViNFNc`6G}|4efIRJW-RC4y-Ph|uh`-XJeP19 zHo>Tm`}6{8#>u(8_VmGmi0Hnj@vFiaF<&vhsJgA*N4q{qPN*23L(&5^eewMH{X;`` zcctZ>=Xv@0DgCNYH+a>L{yla(JCiq}9$LI5*fQf>_w7wbs1&{@DF&Ce2sc)4@9*aT zhyOw?8R6B=7?4a#WtTR4N`WV>20RjKYLuP|PTQNyEskC3wODE-`!9hUu3H<9 zXKf~P*@6A1p=h7J{)+itZW+=F0CK!Za9V2WUkTl&%=VrhDeHb28P0N}D&N0<9SU}y zqO?(+$z@-h9+@4i8vl&KXa~WpF)GDJD6qAsg8ZUL1o(#^2*;I`gQ!-1>wLz~v%IbN z5+L61m)*;M4tA)Xf=#NVgjlH)2%vGSC@)okl423jL$1IH>l>z#&C&$^LViFx|CRY- zo#430S%1o5ij`mp#$fz2Gz3BgSm6Sj>dQCwcNw0LkoXpP%v+t$pwz|Q={ydpFr8m7 z&gLw$G(T>&@D&0Df$&nDv)|a>M^9wnz14m?KP0)yE#2=|Q3C?qz?1{Jf{n^LzIb~_ zvw&s>lT`}vD$-dXr|fGnZ|Z96OEFR>ta`*3Z+=1z-uv!WfNjAUxM=L`@?r4;O^5;& zENES4%Yl!@#Zc~ez)r)>aq-fH3pdLio(ibuX7mRJ^ndmY@O;V&V4~KOl!AnW1Yj1- zb$-5Hj-jHaW^09{+TFWCFV*=ND1n-*2EiVKXfAWtx%B{4C!(K=vvY#=@4xf&J*BRN zI>MYQf7#UzZrR{oq5Wk_K z;*(0UKfT{!(XroI^_KRvk*0nJyCOYeY?&@cW>?+M2e^6u{P|IXgyoVx$3^gy>Fi2< z0o8*xpn)dts}xfVxSd$<;{uc;JTd?^QQ=8Scm(z^Z~Ygr?v=EQf6C%>azs_GDWomt z%B~+t9-z%+)G1#Gs2)NdDCz&(LX)9|n-aftscG=einRUj_W1aC#ihL(e$%~01AR&B zaa7MfSJ5gmWN6*EetqAbJ){JPxF*(l&wZ;DMItE3$RK`Xs(Tzt{g(bi>D1WG!(>0w<;FLt?ytb_{VT!dUOA==v7XU_N{Z4nF+ zBPqQe&et9$5TvC)t}o9x+S&bpXx8%bdWtD?fIYGl%D?JGWQ{|-y#Ls8Jzd@PwoCFm z2mqZfG-nMA4iIuoYUmcLBLEKO=H`&@Slh{07n<;rgoFgdAyPv8iCDoF5Gi{IhQ`LW zi{qCUX)B?;QAmvpp@yaS@c)~s?b#}NVm(}i+=NUBA|AmJ1P~pzfI4QxQ$fSoecc6$ z%nkyyu6-_-Pm|FXa!NiCV|)JIe)3uv`33KuQVQvE2TnS`SHh#jMD9`l_;q$bwJ2Ik z1()6y>%QWYNSNmQw@TMnn7z1AE0Yt_Wn_^B2!xYTQrwh7Q&TjACqY5l8-H;uWT(fm z)Dh&hAdGx96UKOvBdf!AYd245Y`|#cBE`a)PR)kS_UK9z?CS&8B{Zjs@J7G zLpgx%nhOY;QN}>_QzQhCs@Ftvg8p<{W83S5RjkDf01FXp#+ws7t(n!;W2Ef=^c0*v zI`%b$2XfRx^jEBWmxY9eg|B+!g6?=)Jd(LN7NV*by1WuPaUz?>N zX=`sF3U#I{C|80$CY`%HeruPf0yK^B37umX5BMu9F_5_#6xv>S1+>U{9>&DWBC9`& z9+c9qcABUG`@%$6mj_64|KzL6dkiY2l_2U}^zPg7T7>b9VHybp9L$RUH~i$Z$r`y| zsspsIV_2l>j7?1T>bmp0Lsf+`MOXSN!P`%FU_YeTL#IxiLWUsNjC>8@yuDx6&%2;t z2}DO&TFJXTGA@ghgy87t%_6mJwY9mPq4l~>L-@7sZ|vHW>~9PEMOa-*IpD=)C)oUI*f+ZFxTpmZ0%=(f($V+t zhnT2A-_dbMiQlSYB2$ElWI}jUTIvQ$4_x87b5Bu?EBx(5vLYqOtxx5lqC?_`yA4iA zxiVHpM%&-*89?Ly%B@{pAMSRF5FVA4ZB1GQ%ee>0*`~Ek9KQGpT!Nm+GAe04KEC+g z2kUZm6NSO>8_r?t=08lr# zO;9uVh}4`M1_G3?HT_~O!M?oPK`0!3le7)G-P07dwpn=8&s%;q2bTT$=>#M@sdN@T3X;wK=;tihP;!isCrX#;wtpe z{V+^GBLi|-??1=0WMh~|RD^_?GixFUOD@JzZfoMt&pfcP`QW^eDpl1+3&m>}flFMR zX;Oh}3IZ$q4-|wP_$)@LlC7kwa?)M;m4P2=@N(Rcx2^#P&gTT$~ zxJ5b8FPA4&eE+@#h#Tdx8)lO=lq>*jAQy*3v+Tnm_lWBTbVuRTd9zweCEs-ya-x#Ptp>%@K-xg*u~19!cgzTcjt9RQUdp;k^jJ}N*)c^omceZB9MyJTF(MSaED<6% zrQqbsH+e6?5Kv9jnr(h6;PYX+WjS(#Y5)FAF$pR%+RL|YjiOG5EE5qE16$4p?)_Vw ze4IKTeaYj_S|Mugka3iw2+&kiR3KD^neW1Qj5;Rp*)tHnPJfIKs+k~bqS(b0~;peXyv;l7f z_5iF4F3@dNA5T)UQOd<_V<-KO(SWmhe)S=9fX{R&FrJOA?I)>!${>BeA_P#vh@=3T^Z z0I!4ehI$^7&;J;!kC27e)_ymS9!wU3uSi%JL>ZAKlV=U6nqenFbW%RJ_z*iJ)r*pL>(%D^z3(9 z51dte)OhRa>s{A0_4Q*l_{j)x_JHL={$^oe0o2DYy1Kmy?Td;$mr&CEkI%($!4}~s zWC3+P(Cn}>#jU&u3TjF}$LprRker^*znL;WZ%cRtwhu&WVWH$&xu0K6e9wl$4b*;U znZO5+m9!H{RvSAzkQg*@aM94%+1vm5bHTi7S6)e?5??67Hip5ncW(kqEFdN3jfft9 zkBp4WzJQy=+uIu_b?xs?bF$M6$+*S&6fpN-Lm@Aurt%RUArZN3dfH-29URUW6jLm{ zL66cZ8E9KBX2g~k#wLjoc4#xOalLaG%)6#$;)l0NNAr?3fz%-K&T1;9wVgN+`+g*h z6K5%*H!~|s{l2YYsA$iEL5LX|d%!H{2!{htJU>$MWqH!tt>b_XKU=^69E=TkOVN$d>ZT9nbq`?&Dh@y$4#fxNuqQD#&6Ui22?XSo=N zpMsUp)=ujDap=$?qVJ92u^MkrcQ;yEia&gCLK;AOO>waxdFYqmYhz)Y1^M~>2BnDy zAR@HvL0U%(1)LF2#Z3_OaYV3o&_E1D4Qtrc)p!|2B9M2r3=Epg@?hU$@_*cD_5kKE z33fU-C?Q{H-Ma(;p?)xm2m|Wsny*9-^}H=D<=8y3CaGy=Wz}dZX7pxQ15~i2xHyoM zR{6R6cC7pNL&PuUzi(&P{_XYozIvfjG%9Jm%7HD3_$~5+`Vq8*W{7vkkDq=(<6Wt- zYB|rCWx5}%6ue#F0MJ>5;aXZMFQ}TBBn=%088GMcG+QG>OQoz3_PFG2)CkbttUmO3 zxwN;odc{rvee2)6`R2ou>G5%e+rSLa<`9h3`9iCW;UkORP7DHxa@{cthZO_u(kS~eEp`cwL)${glHVHgn)%KSs`=PUxg9EuO#V z7iroy7<)vhR8lmL7$~*naPQN-e*O6)Qd6ywFi#W{dLj{>dq&&%gKADMAB4ks&9H1As0oD3TP+;QM zu?0{;qWYiFlwQ=XnkA4TeXkutHx944f%U(Lrk)?jyYb(MBmc~WhR-aJPC=1idk zjV{zB_;vD48R@leF{yp=q@?u6w2n|L)ZP8P{+qM3f1BxqJG+{z0_=Th z6pUb@e#;3a8XE@{T@Vb@FSetyas)($0`2;dG)Xffsc49VEfGu^hJFuzV{x`Wnb~D7 zaNVxI9hv$wU!IiY4YiaaWL}``pJX2IrvnyUPeip|aUie_< zsNtxTfJU1bY!9RW0B+@(*b{tGQfp{0(z-GT`ygm*%;FtE57S59Z4<;^$5D!(*;XJ0 z$ViOv^P$`}h^MFt!JW^^Aw7X67;sy@3C<+-LbTlK$R1kl=TDUrQP;riqkCcWz$sf^ zDBAc2_>pat`}!;1M;F5|qs-4FC{K83HB-9WPvr1dW(Uz#A|S}XWzN5~wQh~71~zXG zKr;lb@go7gCMX|v#5Dl~rbg9uwzZ+DNGz_&Am2Pho$pGUrX5FvP%+sXI?ixiWakrzQorG2e2N}o&gkxsr-HR8$L0Zan*{5!7JOmK~a4)S)1yw^VCIo17 z;NimaweZ9?L;aRRRnh2=z_BG-fiTV@%kFpmJ>H5M2N26ZIBafgkdY`t&C}C+<>yD? zI|u9oMJ2;k0F8^~TWgaZTMKajlj*M4iz$EYy(u>3ypu5dWxur^tZjhdm~i+qt8~P~ z-$6krxZ4RsEpl5Nd^kuM;4Bt`AuxZ}rbwESPvEPukp*;08uMLBbG!;9AzQ^MMy&oO3(f?*? zX}SECB#9jp_!%BmHC{Sb;)lLEMYNZpwE+LwAMUWD`3Wx*wd0?j6EJk6Qg)xKW&vb? zExsi-!4dlef?s0pMQtYP(bkmn0Js3LoehlkJBjP!SG5l~nI{_+&Bd6g;NalcSeV82 z!Y*5Jfx709visWI?F{D|c7s0L@UR*d-1*5}q!$|*nf~&e=uTLG0cF@x!@+(NrS~@6 z+gYWCMw=y^6F1gZ>WVaQTu|_Jjgeq{%LGbReSQ4{4`&r2v07M60FoEj&}2gPMOLSk z$=5!H0tUU3R$Vy>@L^R2blecl9%sc)4@=x5)^Z=md^j?PJV(W*a;H>Zce9s%1r zT*|+Gg-1uDN2n6X!3AYV-v9zQ_ynGz&a&b}7k(_wPQk6FkmaEG99Ft~bk z37vs=-6w8f<8UN-mXHu^9z6I613axth zlg<4@Vncub77i-~9Xq5l!E49N=_9r6o|(;46Dq2!N3qj^7Em6J*%q2w)sq(IzJ|#Mmte@T%Zzw~QBAl(zEEd4b=jUXv$07< z1%-$3;*5%l+Mq)c+z5ae_zcrr9UY3LD2R9fAMC8GPwct2!9V$d%mV!o(y}I@k2Poz zE%Umi0VfP(e5m#Rb54kt*qO89NI{N;<1kDq0j6dy5s`1z)jKESec|ppCM^6+tv$Su zNt6FSbj3iL8%6llsqvyEE^Cx;EIXxCjQeEA5mXj9V;dU}8z~61mq9ilIsov(%K=Rm zq_-s6le4_pp3dag{+|~>aB*kI4Na<4QRvphmYdK^am9~x@${u+Z(qLe8KRe`|95(9MabGLZ3Ja&ZM%xU3W&!e5Okhv`?Xkd0wk=-4p`khR~w(M>97UFQD} zYR8F#2M2K%IyH$FJhzwG4v7-igOt=8r53F9&^L%QZk1ZR96uX_$8w(|K21O>we;Hw zuIY&Ie9`F^G)`$}>z9IvlZy+o7iQauU2=IqNQWHOe0c;(kcr5n4PU=jNU)}VMAZsl ze6K6V2)lhe@-Lu<4#kNL@l~&{oePjEclmspDc|OtR1l{o9?lN!92#mLr6QX_B`2qq zXZwy5ov!G7lE=YBas1A_g&U)U0)il6+`sFl8_Lqte4#L}izP~WQD_bDr=Wu-t7_jLsIFioV7oLkG@M0+1_j~H;1$2YFc1Mu zOv$+{%4M-gBmni#Upt=rRFdf0zDXUf2x}e)(I-Hdfq`WXf7m((pJ@VCAhm%9Ll8qf z28rSC(o(e)f5B-6UIBr#(L$9PuuBez}R%6^-CV5D@c7XbNi0bK3PX8**IvEpW}1i5q5~{?@Vh!@}NrU$TcTH zc2Mm_K!Uams9@R{bs~WINU_r#H^xV8PHK!g4;tL&eEm_BJ2(Q7CEuxqpy|WGHNUv{ zSt@u3(G3Zf2z*)&o$?->RoNSn$k|Y6(Q&;6MF(uf!}*c3n7dkt;dmVyTo8PSZPYD z7+N|$;OxTt*wI2u64!KFloiBZjTFNP;()v|Q1x4YTTjYqHeQ(i!0LG35Bkg(`PHE9=xi`GHA=_MN}>_ALxm?;=!S%5vyT830sNc^NTb z!V&eDhJQ|A%*($n0P#0m5%p+Dd=(ReHagrL+*!GSYLlDzXaEgs01(@arDI# z>3albv6nRX3KDz;=r1~gnwlEsyz-R&ZzfL#9Z2dSYRc>HP!c0&hq##2{(zfzb90l5 z>{HYU6xeri=v2@5Aa(6dnWiq}wnm(M-E1H^UU&BPN0G)-}CGHA% z2d@*BQbD0*xYcSK3vH!eHRmjk?mL9aHxAGCZ3R<%Dr6IUzR zlQT0h?$_9jU>*@7wA7)t!CBEujOH(1pmNy+5^Oo1y4jqe<#3SF7FE#nks$l}r+bCq z!{!N5!%al~yNOBnoqkmb!zU9;X(6t?!y`=)*>s2RXMmV{`t+&G->H34LthbY!S$f> zg`$Fqa71c`$0rxqlaDX8rsIN!HQo!hYwab(j;`FQni`7UVBdT2$%8TgO{_y9)?mXk zA$5OI=YtK3c`4XLaMYB5ywK0`7g3DZtJZUn#PjFS(2IzOG$E7NWmrHEv5vyXf9x4- zx_Y_BD#-c3<0weC(KvIQmB!M${U#`4um`YStgWS{q&$E2nVpmKVp`kLo5hdqxvDI9 zH;m34>?<}<=JYuo4SE&k@$qIe1bZZ0H5i$D;%mPKqT1|Y&ro~*n-Z~wyI|E!|oj*iPEbO^N^ z(hh*RM0AD5;5+8#KuMHdHN!}dTWF`Hoed}2d{lY5&}s7WeUH4j~7Zf zKp+sSOk`yZel4wliG0u{P=a2`d${wKYLRq!Pb9+-Ms(zZ(8RLvDkaQ<<{iK(!RbQ_ zg%=m`z@TG|Krqhz06r5J=w(=a=ZHZ#>b$;d0=g+0k1;bdLrz8QJXh}RU3E8Z6CE;z zXf}~!h6;1+^;+uJ(Rpkdv}2+lXKN6|8(hk0M0HVw1IyQG9yf~4MqF4xTzEuLrQ!b? zF7Xpy%gH+Fi#VD^deacfG0R=Rk)iIZqY+?00vpXtIKGMo*P0@at|JfN(C(x0Ei80& zc3y>;jse1ZD9Vb@1xHkCniw~6u9>FAI_wE%<;M?xIAs>q{bJ_((I`#o3M32e~>l1c>2iN5y2& zkXONe_2b7w5bIb$T;|slWhG(e?)Kf>D`PjeWuEgFwQUz`MJ-6L5r z$wTmgBN|uD|GdW&6B$0Wzkq@8C=_dRbJ63+tE9pQcPu=;h-a6yBgT@E?C9_;NyQz4 zgM$D+iYz@c0!EuCNwaYV(Nj{QWVFF>@88cYEL6>u6OV_j3yBUFN)`M>t@Yu94lmXfjLDw6HFf#mol8n&GPKU6 zwH;QE{E3onV!}T*!;$jS6-D#1kV^piSIy&idq{YU$5nQmXX{B*Vjr-JE^ zkrChZEpP1)r%sK9j{I_;zCJ*F<_~&9(Px5Y3OpjdQl%Wrf3HA@#q_H{xbW$<*?%tim-b0J=?b~=X z0F~~~95A$y7Emq?c_hFf+uCXitrB-^Z)?jqdZ8B~s2Iu{VuN~|=r(sNf5b`tgIfYR zsCH01C&PzNfHhq2ql1-`(@EyxZ|+agA_ZEDNL=Vx;^|iiVM5nlyji*gjSRdX9;E;! z0Z(wq%j+$+zpJiJ^S)J#E*v@x>M-=XkzD_n5Fel8G&cl)TZ`!cn%H&{Q1GddS@{!w zXp8!Hr5a+7u8&3-1T#EEq=g1o|MhF|)Ce)y0==%IehB;TKltoXo4wU5LemMAZfAUL zQ_}!CYTvv$LQuGV-5K3kNa(CDUm9Zn5yL3l+n~b)1O#xhFcQk%Yw&^)@mV{cGWoPn zq%zHw92xfwCm1rpCSSR-0Q3$W()*2CJ04_rMp?NbTJjQ{ER}{xJW1*4l<(7ZNfXokG&ND%LSSj)S`@dj)a6Vv@M8D^W6MNq$mSwzt z-GhEZ7-rDshad!g?!NRY6QUyMAyIL0GQu-Fa{}xlo`yCqaev|01rkpU=oZZv)S z=HTdfn1K@6t*Nom=g{emLE9pHFOalqD-BO{!$D1L?LxHuq7y4M)!}D_CrG{zE~0fn z3EEjYiU}GR0M2o9l%n|Y<8Zc03tp|5kz`S5QL&}MEN^>b;S${C?oE&(g4CjJ;5VFE{p$x6#oELeHqT9M~?gfRv0P~;tc5O=|P4g^4&Pg zNS-2sf^4=|QKd}%{tZ@4=@JLKjX|X#_unuK+1b^#DMlKP=c(zUJ;P0hxB)8xAXwmj z$!Xl6l2t&>@J@1akd_``OTZNnx2x5?&q`bjNWWoGQFX?-U|%`q-DUD!@WeJ46W^&a zwqZA4Rh|$6Q4Yr}I@=B4yzV&uG=LOo3G5GXe6g`$)s*h|)C{|Ue+O8A-%b`a%>PH$ zd&l+Mzy1HOrnF0wN|UIJGAf!XNhqrb4cVaxm8c|=(ICmnJZ;KIW|PXwKC{avQiw?P zy}z8-_5Iy`zu)^0m+SoK-D^Cb$MZNI$K&xhR=HLNYmle$RH~2$pzvl*4LL|XMyDsP zxj|ylTw_^Y!5&^@=fHC;)m2JeK;qlkhf>GvJ4zY`^w75SZ}|AY;`GO^8+zV3z5n3B zDApezd=^Z%+nk4Q3crG7M^U|u+cJM>+5C*ItG@mYR1@9I%$g=BURmtxQhoS6h`WOJ z=3bLOzIwHg3f<^FL{npl%PXp$OwHtxA_-8qkVyfFXqXgM{@Lu7!J0iZyf8sJucYLX zX&yj-9lkp)V`qo^Hz|oKLKom&aQ?wp$Hr#>Eo`ozy?z{u3pVPkJE_+aFcQuv;E=>+ zpU=KnJ_w%?qh$3S4TZC|?`~wH4IehFe&>-+aeSgiA3IBL|rHfiobI|8;)EGWMa-!?UEop~VDqNUb# zcJ8fP^KuJ!01}GQE6>AjvVZ1xo-q^qi7tZSeX}*33}&iwlnn>}ecJMF^2CYqLK>j= zrDF+Fb&tiZ%1>$d8PMPzx!qQ+$=O8ilGA<^XM&LFrGNj(E<-O}WIvoGqCd{ADe!<7 zNhUxNS-H=vU(GiQe|KMBHGWZ#&9Ik=(415qPplbLJpGi&GKX%_ZR4>0qd{g_99_F~ zx!yY*fSlVV`{}%XI&O$y+{B2sQ_Gb1{o47FZ!xkVN`!UydMhex~~^ErKpU&B4E*rK5g zu+Zy(do?vQ=zT%hQ5FuKIPtToX&iSoZd@zWpeV^#^TFas5C6sd(+2^1PgXl#NHtC^ zk8Fmf0rqjh>T4pg47~5SAx@|N?E9=?=#t+Lx$RlD;_1XD$1Z(k!={$%8kdYLhV?&U zw+}LY%XQaesxCohAaOxLAe9i2OA9RaVE4i#+`AAe!=-?TB}=qD!aX?gCH9Lr$)F zY~J$YgDYM^kd}AU)YY9ee}3<%*A#d4zNZYOC2IjGDo(X-w{sZl5Y^yJkIcj4E!`*A z-$xx|o8bhD@t`3KGawDYXYyn#(_wog*s{i-G%TsJx~Z>mP3ijJUGKo~=ToqB5ON8{ zs5Z6M!e&^)PDTGF1vfT&kfyQ&Csii#RX3#&ZR%K_G;g!dml zI3SQmH_t=iWLzPGpj!}p#*Rfy84Dc^HzV#N&GgJ_WqsFHDeR@-y;%0#+Z728HDKrE z4mo>%YIpD6U0X+|daCj6a=+W}29`L@n>zK|@1{Eb(Oi@pO zQ@`Al+%dU&gBE*(6nkbWOre>Pfe|U>Di%_+3=IScfn@_J_cMvZi^907xY@Kfgm_@_ zVtJesBm~0fil(2B4hFTZ7j? zhs5|`M~&YXyHmAXi2N}6OGwV|v*i(OpVgdXT~bY`$l5bVANhrpZ3@cY8~@GyzVL0s zwhN%P+1~V{d-dqy^2+3c3Pvkt!#68ljGaEcn@~gcTC&kpQan~zuq#5hsg8b=bN*Tb zRIrbEM_{3|15E_SV6mKg-qJym2B-5{m1(G z@m3>$H#}d~mDE=d2#KpEjDqna#5kte{_U4b0#6m?q`Z$< z>1=4&&Jo)*ri)LSBy04~TU4-w)R`f6AP69iA zzFiOhIR*3UVqCi;qDid1I3-Zju1CKuCnpG;9D)GfMDz#Je)KEhVv5tD4U=M`BnSS> z@v>(*&T+h#eCx!M6oipc1&^WF+*3)z}q_3GX-`~EkoC4#-z@qc-4tAaBdanG(Q-k9*cxC5n zSMJ_DxqEl8t;_dSsLL0JhgXwfla{LwRhaO@X7+t^q3A$KhRKO>W5!4caw(%cJynlB zEh^eoUJN``EXm3i;tc}+;apP?SP(S+eWM!qKJ4WA-2S8y> z#E&}cmQWGnVSCWzzJ?`PC`1ncL^Y2$ISxO8J=p@}))y{ZVAZ8}2@dV}mO5WT;9t?s zg`fv5=F6u~YzZZ0<(>UzsefG%x+oh+fe?*6l-0K=GE%yWe$B;885wsuu>ZPD%_cQW zt8@JL?Z>2E|3Xziwo8^c!?Wl##iQ2X1-ynKv9W`#mAe%v9~;`Y+s2MU0hwN^zTc&) zm2Iiel%xbYh!gNUy?t9%OKa8BAq@&_2D$O%_#3>d(7r@9=TsgjV5tZ}J|AqWfbXc( z2mg(AiYCN5fbIc(`lx#B%&hwDmGjdXAF_&5Vj|f7bJ(RJHjP<1#xk-eZ&kzBTGEQk z*1@4&qd@fp;h5y*us9A=b za6Zn{yM4%+DIrU{Ce&(^^P@sRDeF6a{Eu(n$c*cJ!8X28v(Qr7oRP8T-Ut2yU)=EH zKPA&o(YC4x?6y`O8pT*&-yXet56v6t=+NsCArSZp^nz0L(%Qy$4D|j$HwRBK*SHoQ zn{;zJ`AclWpvhp~)e z3Oz_lRac!1w~mhUQ-j^oR!rmQA^dXeCKU|uUJ*^<3t9|^V|H+GLdY4eAJQv?JlfeN zU+$Us*}5X)4WTs%DkPpcpXMMkSzTW#$WY_1lN+6juQDh($qP1zY6l!PN4R7zX<$;4O*kq1it3!uB<`$u*?H>z`I z-#S324Jj$eI&&PBE*>#reeSj{Mikc-v`!v9vNJVZ>8Ww83Od|3pkpq6VnO)sAfJ(X zwdq)HBHfUYNuoG3`sCsI_8`GMVNJzoHS__Z5%R^0PoF;q;K)a`Y+w z*u2;W4=4w+UNf^Rw{GFpHzG=@wjt^w`7#L|(ZC`4tMmjv2Y(cqGy6?Ujgs(}{;8=* z5zS8E(_=+G4t3ZTiQND9@1r~GMzyFC?KgGy?8BHKRH*C8sa4d;hOd&CSS;URBxn~c zanId8M4=?@J%OXoVI`7SeEY$JOL6U&lefKHa1QG~!Y({+Q9qCzkQFpBAb_szu)TMn zdCEu~P*y_X2IpkAv0^Xru?HUr`fxz>{OZx;kX1l_kc02anIz*ot*6PSd;Y;8igYQc zlIPmc)I>5(KDX!RfR4DBH<3t)7@Cg{?CY|ItVkLba{V)oninsVDU}-}Gu(-4oGukj zoNJYpqN~k{goFs`%8H6DaNI?DK7Mt&`63_)jcDPbMKS^pbaG*P?YZ&)%LQ1jU)N*4 z`zQcAk(xhl-2Q$0FjR|w7%!1==SV?;PUhp96)p0s)E3Kct||%1Lw-P(i;#vkP~+!~ zvDi2G`|GIpzkc(kn3d#eHkpD((M<6Cx~-_F2p5OylrsHZSuL=;;k84_ggQ^_=TLsW z)|KCJzust*b8A?LK!A=%bq{}8Pbxi7BJ4;!P4A)y1L8}oZZg@(&g0}24WXS45w10{ zxnBO6g_F(v>RcD>JiPYznt1v>O{Zq9*5^3AKwN(E=#hkguZ!p%eSEK>;kIm_6I$}T zkuI8=nLM`A@x>_T!v?fKeInQj0+J`10in~T6>FKD%a_#MXJ6d8 z6Y=5hepWU)3*SPQ6@rgKZ)5B62ag|zm%MYp+|Eg^=~-DnzkTcUd<#@mN_V>juanb0 zYWEd?HSPRb_o@1wF;RGNW=_`b-9|zXv4Y|pE1I}1I+DR<f}y3&yr;Hs-+`h^weEH@NX^0o096tTkZ=J5kD{1_8wk&In%3gr zJby4T1jl4NF8{m~!PL*6FOexO->j{82Yib(lT27!`@rtqdDPy$3;$%e8PiTQvA4H( zbi91&(&WIvxNDnwu&mkdG}aQVbf=M(1Nb31LEoUKt^M!ayQ0k%cLs#_=1o$lN~Zxs zkucItK|Xfiq~%lv^5dI;!Xv!BX_+Ync*gOXD4Ik*n4Mkr&FLfxfWYF%)|RG3qs^@p z8?p^}E#w5GhTH@R8JQO;G~AEvh(dO$-%JtPNRFWN=;x?W0jY5(V1GX~Ip_^+j>;Ie z5hu%*^mL$S=+)eRANC?B5a8nUnO&~emeh)&m;5qw`}RLTYSi6YYt6cMf5*!GYes7H z+p{OXaZ`GFM+JpW5f@w~e`IMV;jXV)?JDbrN{G-$dIB?nzhGCHu{}sm-ani040%+PXm?Jx;S$S3n>Biu6WPzrwa?k+>g8^kjJ^c*@41E8*k^GM5nOhdh29L$yesKs@3+JRl;M#C1xH zzY+qJ8jFksT$#oIA7UH)RZr82{{G&S^o^bzFs9mT-{WM$Pm3HdzrbZO?!rfM(z&7( z2n-syncGy_cJtP?YcZ`VFxJS|1pzo3J|g$bpFu&G8}H}R_~54Vd(lO*1jGU?5KEG% z-n~VA2=4-dLEyxR*J{HVW|EK~@!}gl+k7si?=^BO?8~BICs378-u-ywqHD`nR!sX1 zMp<#?JUn!9Yy^=7vT%AKDIs|+JuyBs10M|h-W#VX7A7CeV)zp+1gJyq-_Oyb>qOl* zMnEA6$qExEOsGUjJFIFK=~?#Py;Dby+>o8E8)o%BzC}L&S6j;$_M#~843LxGl$puN z(UvGsaS%x=PJtd%zVaC+uz=aeRa10%h4|Nt?m*IPLqMb<^3WkDe#lA7s#L+zuDm{P z;|sGJ>%o! zY=Cev;q=|_Dio@JIwbFv%inY85Jzg!*?~~B2~2tV$Dabt@o#6%>JesiFhRT-y09N;HnIi4})2G{+sqp2? z391Sf9owHj|M}-?RjS1>_HHW=32g!Yt@O(-MWyAVUh=ZRuK->v&UTxr$n)`R9*f{$ z&_1VZ@68)G4lw{aRXDFENsrJvn;oyM5cI+SNy@CBbIs0Aqzr z6$KUq^Y-B}BD)H+7k7Je#1Nzcq!s7LvNZZq3iGsw44Fz(&__Di zj^Yo{hXY`RmGp={c8$rULtieFSp?QHc<^ABTE~E7pD3CS@F#(tFSq@kLyMdhs->ZU zc&5Z!b9>c-_O@k`34M^^SG(Sp{zCX)F0Xax=*cWa@t;#Nb3XFut0&&xjg}A$h4oGk z;qHS6tWw_b1GEaq6yAMvb9X224W9Sucw9r9e7^74vC=}#{_LPkkNtls&B5$;K*)%!qf?;5jK91~nXh4z+ zDP~ku0s2A|dJNJ`#mr3TQB~SpQE2re;MRi*%v&Ij!(J73W;Id1R|E|yWy+c2@|{?9!!veOV?NjoqV`1 z#BK2##9$7(O?wkMYwnrv65DQWz&k@(8B9GdCFL3&T-;eLqVrY`wT4!>gL?B}qEu7I z=Yhq8o3%C@oeC~p#iIbLD%JYx1kEH2O7W;ssV`jUQw<8Q5$5&GaHH^ngQnGMk{rv1 zCd)TA>ks8+2{x))y{A}`wX3U31^_5v@fRw4rKqTeA`8H z>yAq&4jpo_H^)Sh9SOhB&EA}vsbr4E(7_#*l|76*7Hb*1v781+#ZB7+H;SWfr^8aM zrbkPccW}o;0?Y>esZ3$wit-$TY%*rR?5PyZf4rxuccih`;b&&;t9S3jmItiL(>*CQ zz%X~6J7-szh}3O4i>Pv~bdrrZJ$A^i7?A`isP&362)V(-(+7xvJoZN`$`%gk-4EX@ zDk^Hnmb_}D35~H60>Qbw6PgQ}7UK~e>@idCQ0KjK@C4vd7+|?ca@vD8D7>v*y%UUU z^)Z>!=3l?8CY&UGhR%%W&$GU@(}9(dv29!3`}dfTL&gbv`XNF(n!_6|DCeDIK=SS4 z^5Q-!26uHd;STKu+NMva^dqT4k?!b2>|L08#9;vCy-`v4x z{Q8VST!>K(a*M1i?J%qAe|GIEDl2=U4fA-YpnR;g-G-VzO{n=xhAC&22fgUoFcL+BC10YT}IXyxWc zlOaR6oFrpK?#EG0Vx%JAH_1gC44lWQ_l&%PU%sJgSB+uP1l$#L;gfxn`}U_W5)@6Dc(WY zyN9i})p<*?PlnGanPla5zvkPI4B>g8t|dsrgtPN@{PWLS>d-keW@K&M`Wtx&v#vrn zioy%Hi9jbo*UO6gAY+8=JsF(~kYDf|wf^FzG~2(DxcmJ12Fu3IHq*VyrGck@PkL!) zVq(Kr8Jc3^D8``bop@5_q&L0j|u zle6@@NK2zo<}_xo+~%HJ8p8X?p$)UnhJNI_`+M6+Sd}PogXXMMysPhvO4P?(oVY*& zopoJ*tP&pJ8|iMG&VagA&}@mVJAxw8jnfbM^^`;N zk}Fe^a3zHF(azppQXqL%(X+)%(C+kMc?AXLcX5p09+zwqZ8*!BZ3AyKYVdOoGfJrr zOS_s3t9cdVzaLl1;lqyrsQw&7+C$!H>?fT~F^?M~u-K8ym!E?Gy?7A^E7`%LyX;#2 z<>AA#fsQ8{N0_FP<mX*XVNO<7#{8u)_8N61*#NW>{eSR!=M;-3SztKa*nKZOO@XzB)Za?K;XtOj zZ}cIm9g|<1^?`s+(LvN&`{0$~+ACYBtTh~r|DQC2hX?UV1awHcB&DQ$Z?BmR}ERUSUp9YC96XbXP=wYrY4_+uZTGy zwQr_R@To`Cv_v0j57?lS3zxUT#RT+iSNW_mGu0y&5X z<+z=Y?-dm%^8|Njxwheq2i(5h^ubs*Wt#Fe@}G2Nps3~KL=E1kYjATDWeU;XJfcR_ z1ZiunZ9246nWt>34t(uqIZTgp^oix<^JDwe^h)=H=hw~6p(Ot1bd$demLFA;lQYL+ zagOYpQyAFk=<15jY9;gJI;@44vzRuQ<4EIl5D=incQig@#@!~^Ke;`#A6$gCPuP53 z_1fG*ol0l*`?;O#M-3ZRNom>i{d=?iCKd-Uv2T4a#B34~25@{1?0KsKX-eMD$GSoh z!XWB*N^JMu!z|;^Rp@q5;x?Pler7x8zEMnu1r)lt6=>yB&a_jH{?sQka1nVDgafzU z87f~p4)ySGy&rF~lWcoP?mcgGj;2IG)v(EF#Vr+Tzzf%)63L^o#Q zDF-F2Y_TETa0qN{Um_9%^wlUvH?Ib}!Z05N|;u4aLCFp&ep6>>tQNh_t^1 zRVrUqudlI%#o9O{UN^-GHR)lP1e0>{#d=7xEjj#vM4EOLg zQ>L_APCRXHXjnrB5*=Q`F_{?!x&B8fVTmW9&%dW2WAVC1nE?k;i_=>nf#P%f?*vbX0$yITK@&;) zhzqEXzTr;%yi2iO!HMKelo~(3yx@gvfW+~FISm*dr>%`?D%~yV6`UU_DPF0CAS(Qo zWS>vPR6=+0n=3**FN@|Esuo(R}DzAV7ET-Ai}Yb}&?5LuxSP^vpZEK595nnFn5s!pc@RrR7(I&jDCe zwEK8)c#jfSQEJN98rW+GDi<{>8?NI;GO1MrwR#rScS8k_+> zy?R05gFHk6?5S~?YKnP4@>jO?=_vfvG#U+flb)VV^u$MD+qP|4S=>zrVb|zGcscy( zr2p&4i4!Mw?`}MFD%KEI=U(fg2Uym?WH)sNAcGc~Vejqbbq!rU zM?^5zgnalkx;R+x)VT9!&016MUP#j&SsVX_hd2F{==lm(1a)QJym`-`KL~bfCf@PZSiC>5pK&`iT?Cm{N#By+!FB z`sa50Ig;>Xy>s`jv6bR5&<>s^jyyqgbkFg+ z(RnI#R6TI`Fw7;JIS(yCc_aMm2{cb|uOLT)O=@FvN}TdE;nb?)prVInv#A$F>JghP zb5xJ4$zUF><^rvWIAg_J?)XskOS!h|R= zK>)awqVfF&&dLo-_@4pP?Q>1WQetrGC z>btpayi*n+!g=UqNudTzR>d5uOW5Q@*)_=O`E0yala`y3Dh=(L|f`CaHLIOJ{r>^5_Jq8<1gV1u{cQNZa(B$Pwz2=mRT5_uNA1ABpw z?%VfWRGqYcQpk9PT2w7xbq%%SH1Gjab&RQfjN=kn3&4Saf$hZC+%t0YP}vfx*WZZm znJ^Y=E%JRceotG=@SpyyPZVV&E7T5frES98TZ8A$g>x8KI^HOo0*NLW3KXchB@d0= zxKRpdYAVqVWsXZ%zM7m3HIN=Um;A5^Q>GY%*_mu59Pzq2*Zb%|d7zL%?SoxaP65C!YUvGOm9hG3Z z$`wD!i-drYT{-3;2>!*=O;e~IDe6J`If$z#x=CkUe|9n2Cew>H4Y|PxkK-pG4#61p zc5$hNG!U{haBv0|O!|c3b?a^roPy?jkiv!=T%u^aksUtqc=rN9bLMl`qYEb0)8U&I z8cO3jXpYNzwU0dczN{L~BpyCNK2}|8?HQ~WB@M%olds>8( zF2_dOW-1QOuV{$dhu_lU)3ZQwUF#Mfz?TQtffp~jWw3Hbf;XDsoPB)@3d@kUtz@xG#Iq_=)Qd`>BiusNy}{5Dm;fT77tiI zm~)f<6oS0of2F)B3t zXOy?KXRkIrpi?cx&UWi>V}oby%$c^;|3nWq z*mkp*xw${@K`=Bl+_j{y3ri04IBmwiMn+55*YUCHs=lt+#PiJn(?)@YwAJqHI8aO(3|D{WxPU{c( zUoOB7ul*z^zST;NqpkrR{S_Jz`y>Rm&dVnIY3Yhfa?baJHT##1w`;4G8^3VL%KcDv({4R}pY94>f@yuQasX+C+^x}o8%^K33%H zx*7MiwpQo5zv5&A<#x}M&tOG@0Ii66p{~{Pqtj?Y>*-BjfR~_k&wL=eHvOdqxrZRA zg&lsEvx(f1NadM7*?z}{qo36Ca36s!pBAW)^MBck-%j0DXzTO;r%}FmccCS0SS{1` z@@G^T+&SG}6$(kCQpS+!WC(=2_YZ%e9}AuE?}2&~)@aWjJ$9RkV@YQ)HSoXdV9yIe zvSHx1nqg}!%OxeRpI>$Rios)Boz!wt?o_B3u+fC=fYNqQK*vcY+&&;>Btt5wIxd!0 zBZXDWz&mlnYWqSp<~7S-$V~V~>cPI3U(`2QS|oHqL*L^c%xI1bn^|bJb9yGS*x(J! z{D8F|Nx#dH0sg8j7t1^i_%=ZZUAC#hA1A)l4h~yrR|ulD=`zQ)dPA=%N`S;@YiCjW zNC^<1ll7inSkgPSJOD&+-n?E56dpc)+_SkSCj)6tcQZ5mT4o}7;k6R~(ZgP<>l!sI zlA?qtT{3T4&5a#{&i*(1FE=Sj9Z>>AbPbD1r>2jHh!FXIfGCb>Uvpa1A&|vawR)l; zTeatm*mlNr`SxL@&bjMHxS{bQ3&SYA;{~JQQD@LfQo|x?cUoBe%BE1{(>Zf4dDg9q z9z2C=LRIH2=1xL9u+;JdipAx(R^opl#G|xu8u5L?Xivjq$pO-f=u|JS-w^S;7L3*5 zp#>_#@(mIKWQE@^lxz-m{XieXvBds6YuwrT z)=z&WmZV9PE(j~!-`++4()Y%)bab5%I2;`fbUU0vx2H@4_y5fiyjp1IDsMYz(CSsI zNDxrBP?4GF>m!VPKH_`eXwN?gS*b8zYVB%68`PWD=BYncTSEgL^doV-kPp-RE?;eW02aYe~pxrNaTP1t4r*xH}oitn$ z*zE9(&(`{p0(?J|6JHa3z003eIMwcbB6YfUUcahdT|G3?MKa`Vs-Y+rU}dme;V6oc z@_;1@#0BR7sG7chWf(U7+Tx(7=x8OIdQ-uf5|cei_20ew>OjWk{C|jh2QFL)@OeP? z#{|bYxN7b8A=p!Ef=4wkc`4O&FLO~ZrDei%rfio8 z@O*(A!ni&sjcyg;N&+{%#K6-zi_R|fgoYP=(TR)3j~fTcYFGU@ADs!8Y4)V7T?=SN zW>gSB4o%qt!()IhaWy2YmzIi!WUyKNxiFn(CE=;6rrG znKUMGvd8ulu;Kvap#uQkack8RWv>Z?nltdVdj+J+TamroOIcn|dFbTHt>TIaGupE6 z;zdlB7s24kO>)NaQcs8v@lq)8{AzZnD+wLx7jGC1Wm(Vt2S0(31f4g{ZoG(qYMEJyqLx)`d`|CS1nd)tv| ztaxLdKJ6_k4rQkCUeO?V8LCnicb5n-Y?1z%>4@5nzV7z^bF}cT_w}7XH-?&`@%<=s zWcoibBmXNNgc-?J0?P_o>$)231saJ#zWgwFE{tBwcHJHJ{NlOYyCw4VH26L^tNbb= z6lg?})liyJce}#U!Ub*zU45Yl=^jNWM{|_Q^a?J2`{3xiSFYekfNZxnc%`-V$qN^{ zx=Fu&V@Llx6!cqC zOdf(1()AFt51jiL!)2O1Vk7U|uq@iVrY>tSW_UO>rh{CWA1y*d-Sl2`Tm}Y3j_fmi%;6cw29`q22fIHth@*b0lWfehiaEUIl`nRCGtnhfw0XX#{j+c{4q!GKEMI%SoH7(QN$ga zUKEfn&E<@>2J)W0KJs9h2YeRib|(8FkYm!1Zg#0o!HHd>?wBAD6Jx)in1&iexGsV- z4}?^Z55Oj$iV9DV{Z7;GF^i6r5f>3^P^`K56To!z=#n=JuzRJFVHPy^lwMe&abJ!m zr2DvW{Y_0nc{;ggJZ(u{5iTjKsEFNi3`%g<<=Ev)QLU4X<<1w4Rrq?E4xCl@AO(_s z%$RXDNStw?MJHeW%&fi$M{D_Y$gGHaSUsg%d?k#545!ba#^yv}$3S#~PHOOlhNCu!{9B2H6z&+X+rw?XV{DYJ9KL0NOmF1c&5cus4_7GE$yn_REe$CP z?+FkO=3TTU0@H(!zHmeTHBiK6N*svz%&;(yR7%%(S(N(VJ3Qwvi`kWY!2Z3vb-Fpq zWse=~M2@rcxf!`<*4c80X%bQ^DKFtG2ttNQW@RXz9{&rjJ2uHc4`kjdU8H|GUpdVg zuhg#}>ATw=n4z#0LMDKewbA1^JX_O~+_JG;w$r(A|_FL!=^lGis473Lt%ciN(2#%Ud7gR)^G( zJ;OCeVqyy*%A=q)$b;jk1ZM?T{`yK%!0z?ysR$_{EkY8+lx4t&HbJO0i-LKVd_a=W z*q$Dks0If{k>hRN+_}pbY1#7(SOKSBECy*vYh3ob>S33=6aAdCvvW|8VVIR|dm_#U zz(kY*u#!xNth5qlI79oQ44+Q`n>p^_-o2-I8YIeZ-@Ms9uDfzq*le(6X?7NAt@!42 zaaqd%Cnxb(%}w&OrE8rCq&5Z$9mkgW!*fhYfme~ek?Z&j>8_I_2{KqC%^9n0@#&& zR=ixdOa&8aY!pQ$I!r#J{(VET?HA1+Ia2xLQsoZz!~sZ43|7fktz@f5yo08}s&`$# zva^nk_-LcQO|R|W*E(Xs0?HXqlvP&J9T4p@<4U@#bSJba$^CiF<9R6%-$)|p0TS=kEm~R5#le@5+M@67i z$SE4C57+N>{>hh$s|kdJOK-QBOd&i_EfCTGXOx!JMANO+J;g$&cW9@-7yPf|`0=8>?JVAY{j4@fW0OMt z(9la^5=~}O4mdVJ3c5X@d0bw(awYwzb_-n)&icD&A5wgcXDgX=h&9`{O_2Cw(qtYO+fJ_um#8_4DP5hF7 zCKWEXRCl1-&U#qTnnH*qxL*ArNPS5_uig|5tCUrd>@p(O=vg}XPr zPmwUW>GWmsK@h#rUc0?G?Pd*go~;^duBgS!{r&qls~I%ikSiQYmyu^No~Hc%MP%z_ zz<>UHtD++Ek@lnlil%KsgyvuSKwM(bURZTc4=rA?364EH8XB#+(tnU}cz0U}=$p$A z5m~vA+;QvNXk1#`*fhHIQDgm8!$fBU1Vb>^&Kvv3#pS>~1P%Z`t5%P2lcBPweu#yS z&HSvfIE6+;aC@N%{FqvoE-hqPPV+K3FFK1~B}-PVEYv}w~=r0lGo4eTvQ z=Opmeu7594pA%o??)UGXWF?I;>&0EWYG~w9s2adVf*7=ElXO5u1zr>bfah7d4&0YE zxD>E_?(|Pfk;s4L35t5Cix>6swQjt6|30}TC3#Is3j7!{ywz5rWn5wu{~o6d#QH)& zMf<5a|Mo&G0w6-bhz66Pt;eCt0&-z-5DGYfO0=wB7A9PP#(}sH}U# zYGy(ohSE*Yu*TVlf~;|e1(kvOIyn^;KX?kIwKd>ep9vE5WjcfzRmbCL2 z+qbe5uyomIoi#%^f!39DOy}306oC zg{29AKFsu`_Q07nT^(ZCJD{;;ajJ?gBS+SwI|P(x;?~d&B*8bBoPdd9cv7$=7Khz7 zu2D(qm`ct{!E&rL__G#)9xr+ps+MsJ(bF)MPd1m^gdSYd`>SN{}pxgoHBWGb~&a}4^c5lONn>Q3D z^Z`5sEEn5BuBK^Zb)ecci9sUc#~P~vL2&k-=437^^+GE%fD_5Sp*|Ih{u4;8c#>e{CdoUDT(AH-!YZrKeNarj=_0}zr41FVpsPw&%&J@z5%FQ6Lq8};iA~C? zu%k&&t9zO%G0Q|#Gf8E|8mWR4MXzZ`lkkM-=(LZaj>6YzCgA5X#}<++^e}3}ONCfX; zd2ZW{I_c_Cpv}auh+~u=zDBwON*#PeM;@{?4;z>C6$#coG~^wxSgRtae@17xwzLC} zxr0HfwwhW3SKE=NBr5jkBXG71A)-+%`x(y|CF6=l&)BygB{n!36JaH292C zX~@#E`fmm+&{AKuSJ84j&~_TAx#K)V#vQm1IxM~Vsu9>KSm8q|OhEPs)dAo( zrxwXSfAWD9U?M|*6_ciGPFSqNlx!i)VI4>+&md%U1)Hc5H*V|_rB_7t%I0B*5xq(4 zUq|p>$tm~{nn>{Y%inA4^i`d;%>TzbV|DQtIM_6t(U?Sx{3y;VeY1dyYUujTG64#2 z*)-cR;ErpRQ;sbAxw`u!F+KqwGHp0NEe?YLUJAt>6%~Jh|IB0d^dCm<%GcqI3=>#v z_3MZqR60MSYhem)Oi$N6xh`S#X*i9%OK6`-?P=7DT3X{LOz0@k?gC|p3k}DI>n54u zeqP!fo{o*DsXDM}YRk1g438b*=~;jSzxX=;=ZU_psS*67Qp>O3y0!e**J)&DeE2R3 zZl>DvG6xQ9rzJ_VCB5$C#fyK6j_7YVq$tmPPTTDi$u*5Uw=!)GbaF?gBrbYgp+@0} zS^|y>XDurnxh#0@o%f$Qfi8hH#wuKIz#PFK+k0oUUrO-Wf=%nPx1H zSj^8iZsa?-Wo(3CE+a#lPp*qK#jVnzQbdAc_(jj3?~G%B$-B32FaKUm-Gn(E83i^q z5zwu9$JC>Hs^X@Gg>BEt>HX5fES23y^2`fh_q8PzRb5|cVhvxI6fq||yT?g6k>UmP zLd1ae&a{p(W5-g!6AAfdQ7)%%RJ|d{r+lis7v>aEvn6%S%4fYY{9TfDyF5 zjC@bMJ;g+x3gOeIb(UL!^0;pDPp*$D(^9ndSq=dT3{vxlc4%1Gy3iNJy4KVnTp{gB zj`MeMMJ*Pp{t(&NZQu}TA5R=SSO9B<-Aro+w&RWL_VVY;I`muA8Yks6p+de(iL9=* zhJ>2Cw4R)CFV#uM{13l4e|TKLnfgb&XFgl{@A)fgzMBnGYJ^GV0nsE3 zs8L_Q!OQLC?%yfWS1gua@3HsJ%$E+jxH{G2IS7D3FFV$;9fAvcpHzd)T5tQKJu27~ zlQQ5pf~`RWTZT>rG)|)-tFVpmUw7)h;RTn933q(Df(~qjeRZzee$}HE89(6L4>oww z7Ph|)HsJHz;6!-o@NV!K2ciO?XbHvz}_ELFmIDpo&s86K5%VJ~G6q<0` zF#Zwd)75+1fX~!7fSpk0Vt@+gcRhae=+mmieo|vdoY}Q{(i3Bv=L>E;S+UjBtT65{%cXyxkXU8{xiTtV~}?TD9s&{?OO0 z6aa;sQ4kv`TTtUIZ`W_1HEGhZH8Y8pd>uo>diCt7-e?paw_gQ{B~C9q`q^8?olaO? z87e7I3dS@YHg!!B`s3@ zd-DsZ(gflCgUTQ(eV}#hPn;KBt3Z7yn^^n)eF5$kq`C~WaENWrZIy+GAt@XUEWG@! ztc^t}!b0KOF1u_@N?4(t2ro1E3C0*)ib=lAuy21IuV_^)n3?m}xgX=5I!a4wt?fVaw&7p{ zhO`+!m7UOhgoNq3R+@=4i{AK0^)Hj1-rd^aF6qm@AdZrwjiVRy@S(?ndn)?&(n2_r zhI;qKHF*6DJ8%zH9NZOL7Ehd*-_pzNk-Cx?DXH_#18`uAg$exLEZwPM1LnGp4_$Wc zEQ;t;NpCp!>{;z)EdcbOF>qtP8%qeiCZ8{R)re3f{azOKIp_$RW7~+gzMs!J4A>@a zP?0G#unq13r5kGxN9zFt228oIm;thn1~RN<>sCo&3dAXN$)mOnu)@`Q;j2CK zd-Ng%k?_z;JrcmcL0jdA7JtFCV(R=lL!Z>#USU!)IaPjR#tg#m?7a#}m5gvPs!{U6 z*os0CYH#p(-G?CpN#UQhzF#etmUN*74TdNhF$%VfJ6`aLmd}L?g3KdBJ3HNBX0PA9 z^Mj0hZtc#qZbLwhgk2S)Iw1I^9`iI6(&MoXN)KF+^=H2U6c$-9>$;`)&r3a?# zUqIuBgRlYg_%2ZZe zPMWhsN}#8)` zkxdgYqu96Jy}S7O^*S^#EcU<12b{ng7^%?~$5jFmq{@xpoPEjZ+CT*?XL1A3yJ9fE`qD&dfW>k$;*a1m`7((kio7P6i=CmU`~` z*|eOT!1i|$5(0&LN0n|YtVIP&YDBb zJ4{Q>SvpiVLOgw1!cSm_x|Egc3>IbLo6a#OBI_p_NqwQ_ z(pQ+ACxh3+K%mvo-D?M6un9AfBqdQ+ z>11whH68!(14@r-fE{Ro8Vru=!@y}QUzRL!TKHBm>-yXmN#+45elaoUIRPjv-5zbJ zddGwhlFdEoZf#;JH)P1(W5<;03~&EiE3Ka6F-u_0k>-}U;tZ>Z=SX(3}8 zpzODA$Y`2L*O>9ixN_*gd)7U;k5S|7*;KxcPO#fpNJ3kSMT0cj~}0J|7`e94~ZE= zO0cDB6Ia#b$C6E$c;K*jga1O{<-FxwcKPS+Crz!jSda85FHL-@4vS+-Y9FlgTxjC0i%|k!OkD$eJJfziP-&Bavi_^BkDKNTv_-A@JOS zX$uxuGgb1;96MAV6!FXdG!BJV%&XeyxsSY+sQ-s^8}-yW{XBomg2J!kKsIUW$Uf|` z>$!LXoX8*Ahg~(scy%&o8y88^vz!WqbdAe>UsuO4Hs}Tl+1qtKjz+`9kw&`#k{O6! zj>FP?dNV{#ngSGuMsp;Rwe>o*90o6f2xKeQZDCF4g9kfZzhZHT36=S*MSdJyf##Df zGzU{tH$zo=QA>G@*lA$MR2kawK*j*XP@-Y!YtR~dU<=Y}k$hBr6-Qa5xx;wRxaBNfJRre296+_9fgy1VnHi9u zZy={Vy5ZL!*rZ~^6#GbkNOD*F+^IbySt1NCwi06O-Xze^xkXKs3nn+P)I&KG5wYCZ*_IDp5;x{VK;BOJMK*% zw-mw%86mHiOcNm**eO~M`W-k!UQ8rODuDJp6iA&=9xhnod!rCiKK>%Pp z{Y!haHW@c)sF~`hNWN#U$9l$4(-AJWU%N@vKc{=f!WjE|RV^0pX`e_6o=@7mQ~-d` z+3{Io;lLwd>b6nDVEgrB`cSqv zKcwE*89mIlo5$gxQEOvEv>bhbr`0T{10si>`(jcyei~wVYZ=866?O4+&U?A;HubuA zrmS5%2)k~s?sEJhnaNVbD53ln^g%?bx_Wv~sdX0V`4+$W@oe|#Lt;~RM$q+s z9DQRaP6T@C-TLqH>-N^!v4kf!5`wy*9qwZlWu-pve;(?~Xb6~3wT4@cCU%WBhm@R{ z7?cr=-!f#i?SL~J{{Az5oo5Zg`DXbZP4wJBkxYalp9msyY5(_&we@u5&}mdIflil>ebUDAv|+3_MkXg5ies~+X4u?b(Z=h2+ddD$9wI^Jgz8W>Mz#IMC6(VsjC$_ z1B288Ipb0Xfs@W>l!tmQQ9$mloJr92g{K3s8f=PlXUSOmVJRH1dln|0zx8dh%j@i%2S z0~Pya3}=~KuCKS)-7J5_(cbrl;W+GbPS3hmqucAN zG*6`HyzyKp&!oa#H8szmDN&pX@94wFj~Sk(iZ-69oB&9~OI`Zd@%25MW0%w7IcjnD z>a%Ae2mn7AtE=*!Lue4PL&5${IDKh%aXl~H%IxD~4<9-N=b0z7o55aGV5u0$aBE%c zBM-ioD%!a22{WkK#9ZN3vd@v>aWb0W>e{oI<<}8U0g6sB9{p7AouUzP>Ji0SLSoR@ z4i7cQ8g3j}(yI9ZCld%c&+gyv$JAbf)b6#36)MD?1JTS!2}T?Fy4; zGlGE@B9S;2(u#V0=f4l|K4RvgXEDFT+uP#JrtLO((dez5jXUfXPG|oES7!Jh0Mw`V z$JGf%Zx(cQh>`A4{91kRyj1z9j6CmVl%{wGh~qZ{=y(+rcQ4TCWqTjVDoKh?1A7x{Rbm)^+!JT<}2H(5Fx9;g}3A z+VUvL(wZ(A1F_J%EfHUCho63BrO1<4x3s&TCnoU8%S*o!A|a$b5lIV+JPyu580od2 zOg5}Kx0c0H@`P6Uj&0kXv~9lJ`2D-c$79-j+*GcK&-CeU836G6(Phiu|2N{FsEJtG z2$rc!@{_fswy~LNW4)f;=#q59J9dKxF>?DY2Ru($TI3$$sX7z;1#n08`rz-6;KN?H zFdTj#s_WLUKrQwPs#sVkT>ioMMebo>1<&8?8x`vq2i+{AN~-A^bXPc0t&E-I z=N8Ba%$gxlds4Nze4XySH{-0`j2p2k8}IA;VMfbIx$HUWt4pa6U1bJeHXcAP8A3{3 z>;;0@j*+XsDS8#cGoo=zN?x0wiX#nul;t~K4RiJXR&wO z0WmN=UNKbfjpoxpwJuyQnZNSD49|T)NyU4NJ8{x(%FeEQ)wptMAWlDC`%gal)YcFC zmO-iM{3{MC#Ucpk$$;f!#%${oEJ=70xA_1_b5&I*zIAlRjHa}wy6GMkJJsv_$EVj+ zy<6hHBdN5O!M?k4J}-@l>1l3$x)AxL(hU>F+4lTDO`UmMPkGq>kF}5_ifEJUhJ;kK z5{a=>mR1=gB(hXmgceJSLQ;gRO%W+kQBqB)P-!8lCP^Yo67_qZ=J`FZ=lo%2UZZd4 zd(P+cx$pbBuj{(Q-q+Pl1E=KCZJ^XVO@&$JIX2kz0z`1_jlQ9r{A}VBID#kEW-vPw zruOd-8Hg?D$Nm_{yu(C?qWkv(pfiqybQRTWWTlN||4UR1w>li(I%yOBGBo(%Sb_b~RYr@BzzO!l_c)tnm(lFZuKN*$)AS4?nDOqUDyQE4g2d9W|H13k<}~ z$>$q(RuFy4O$*GCAM-3=h>Gge^qnu^Epd#WH?U;n0`$~j2E%QCgt|I-KJk?T$9PceI6E5m2ghIi$;pygw0s?z{xht~u#AQ%P1fk# zsEm@TZqZ3Bj85dqNp|O#^k2H9bY{$wIfn-iQ?o1 zm^l-y8MgPKtj;-voKGbGeVQ2Ofzts5RYVD75*$PH#|r z{+P(_*453)=VLnOYz=6IcY-E_%cXQTo#(*7g>6H5Y_tmh{PT#@9N#B@m5@Xg7gNI& zdk!mc8#iXmFqLUJ>&5T_i9cxAOom6=M~xVb>k-Mdp5AZB5`0|F@?%V#HI5$4(gl%a z!b72H$i>wzUM4UOzb`B`_O>FdyETuu%?H}$YW$pFvul3%sT=P;a1cB z_)4~o2C`xvPn)YJQ}vWV$i{zvSG%SW-?)!T*{ zR&U;D@Z_281H!`xEi*rfe*oZ z!SMB#sNPISU_!6Ap<&vyqk|{e5sN9^oDLqgqA|3!GL4To5*X-78yxRII@*^#iSRaQ zKBngjm$XA$FD@tmlDU^EUcZ0+vbTFUe%iDWNb|#n*;0mCtoL3t%D@F9x#8>xymc^E zhgcezO|vHDS6*RZ|1S$Arm&n+f19(60Pw&|;9wx4_w~)jzQlg-r|x>Fhjev+vR5hH zI|&iWdme$GFxH^B-c_`s8q|5Is90NCB0>=7TywPJ8fK$J_-<+H*QXChlA()vzYy63 zOLLM^xF_5aj+f+`=m`!T$|GO`iXy?2DC_;DtG6m31^OW>3Dgl(vLqKEJ~VK-V4i2` zp1p+$nVx6+FFa9^flb!%~OiiMH>8lW!4j zYtNoFi!O&`ef_&CQ1-aM1tXjg4;hPc^9vF)fLe@(uOA(0!aS8DL#L&6w7b=mCsEeJ zX5`4#R+KI-)c68lj-Nwbf9={`stedsYa>l(P=l(>*eyfv_SZ&cG>;xX{-N%R4x>l? zIwzpZm>Sz(iQ~W`A!PIgrpgTZ*h4FbMR&1qgGF7)&i^=OtR&tU)ImJHKn~f7{69tg zGaYXpbR#y?>9)<-FB-Ajx@Du(TMiVGM~|`yc^C*p&X9E{r&IYO_QhO>K-??%NJ>al zR2rV-9BVU_n=ti(qj9s;F?MF|1;Q$-bM|ak0qBPb&DNj{E~9q`N zgLVjMC_t?DFHwBTm93SJa)+Bgy1A!m$c2QKl(9dwSPlw1w&0*>iqduPnXsa({(N0}gfASB`0o8y0K2){^-Y!IW88n4l7e z7gfBiMg{0q+JLqbwbQ_XDZLY<{y!IBpiSguYt}RX6PpUP*TMPUBsreYelsvs^v>WQ z3;FO9e0eB)Ox-7zQ__)rPW_ zh+k+qh=+?BbMWk;j=j9I%iLjy8~%aWEw(ll6$_H@Ee>7T(|*^pF1d`ANn@cPn&6Ft z6a5X)i@&g_hHo9+X{8cNKEGYM;hvqfk#{v8(W@Y9`%XeE4F0c2w~; z_?B<=9?Z2chY?t=@+tFPoZl-R4sA}Nf5CO6k^Tx7N{S|m=(aV9z68J->`x)yC9tkNUdde zLPk+g81w!3uzKGoZq!sy?%x+0qr=jQ!sz0!r$I%Y#vu%ylY);K&2q2vs+^=%^gq0P z%VBu#!i6ay)-1=~DGJ*+Rhm%xLF_`9$EbQ|H}W>(B4B}NJ{KAa7o0A%uIF?{gop>$ zUTRNnQK&x^%QD=TK>(7tY8-}Q%3-1b2~XR;^i zMZpV1`BQA|)28DSD%UD)`S4Nid2ObfM_cq_Uz!wR_39B?%LeCU__V*tyH`ZYzQfnf z-fH>dMR`g_-4}71PI17Ea%=V4*J^R!>MhV8!V zw^WmG7`&XR1^;Wd);sq>L(WV$rUMPoA9}Uh4^CbdQ-8OcInQ&dKeOfqLF86?y4C%0 z*Im1Ld%q?HqluLsuUtwN0y4AdM~<9*?};e7iPBqrZ?kbi*N7BQNHY%jTWl)TD%JRQ*8sq(#+;UCA_!GkxjEh7POGV@@uJB!X_a;npjjAd zEn2anr+~55u?3fs5)*G&!~!P*vh0Xj@BsF|AkeNEomeR$HniGQPo8}>Zx8ldf*1TX z&6c?;?*ra7g~zA;PHBkiz?`4>IPpVM&q$ZDUXE0sdHu>bSSlTDl^q2iW0G9f z0pti?By8W0K%D3#Gk^>vTzEq+>h><~ZaHMH5@yTjRfn! zP{hT808HO}O&nl*zobN*49Pw@aew&}`0ae*4J~TAc)^QsQ0mI6c@(ojqeQHJpMH^C zVdZ4&y=^WfmK}RsT?2OQ|5BE?iDmDc-o4ukCCB&wutPl|F5GhKUwh{IZ>^jXPnz+n zGL%D%j;V6W=?Mg)Dnk+3MHnnKJ3eLRmUvX3o@6>|f>*Bn?eyRWHiEz&C^NYJd%U;1 ze)`^tJU}8|V?zv1;#UV`W1*X8rAM(Jgm#XTkKM8%P3`ko~?s(M=bX#}>2&EiI71ZkfAiX0O z;`*5*=x)C^dYkqzmNeKPLvls0i8}#hg!e>fhX0Ci;iGxMM^OiAZqD4yb1ytpSWBdx z=gP8xoDNDUfL89I+D&prHtf$NG)AOW`}MiWt$+5 zkjPjK@uSegC#rICumL^?wL|h4e)8n4%GkP=`SGtk zB7OXOXx3gId?Lo;wqrP@SMn+!`~H8G*fY3RB(jy3&hZ~zbSpC+0OWnuFv^sib2*l` z<%bL@t8KLOkmuAyh`Mu&1F1>IfIWBJZR(Csw@9$}e;M^)C)Jk(q{HPBjXk;=tym%d zZb$6h4qbyUoCqI({Y&kl^j+KN?w5?q|cU^?CLmowoQzqNFkvr5&D_$NI++cim|AwYby6jSs_;R zgdPYcoa_fmk|}J-iYgvI#>LgYd1V13{+JPXVGPE292U5E#s4lEW~qPu_YpSJDw^KF zg7hP4a-m^B=TmUfEtxjFXpS)Za8QQ-5e%=gJRDr=)<LxBG;#n__V*|&7T=kK`$|f-B>#ZlY-)C`=Mv@MGl6ksb8n}ac_LLN=`kg{>0S=7oHgiK`%!sK40{GZW)kD6|Qem2B{`_q$ahxBt_5=2|h|bpiBnFu-n&YtMB+ zkjI9}_i+T?9yh4);T6WtjE=*xo+Sk!Mf;l;OJ@??|2>o~fY|XAf_4x6NYduM(OwF1 z7R<6N)iA+W>wUl?sy|W@&=asFE=CPC%`~9 z8*d0lg{~rn3XtT8;xXz^>=WZ8*?p9XkPPV~<2M{b8cZ4nCq_I7voK4!@!R!~^Wg_J zV)ulT1AvAH$0DYK08xk15p+iB__%{eu*JDqs5|ZFUi0!2X!|0Prx=Yr?;kMxJVOj? z_;Q5roc+(C2F;X?n5&%&J4{wV!9RATU}Px$-pq|knNaTm&lQvb6%Vg9X#09x(YO$) zi80`w^7UoJ8jc@;NtWVX766CW#wkMtns@gxH=uB#ON`~%iTd~|S^SGRUI!>Ed$8JQ zQ;~ne>S4MNz461KZv|(KEF?bo<=Vr*(gbjmCcYe&Om>9s;sH(bgC- ziYO7Rp-S!|U|7JHoBgX#X1_rzQ8^8wwxoX(6vQOxKRYe*MYr(B8(^&;nj6l_;cG*3 zge=SjN+t;4-86x*9X>*YU%7VROmPoGorgI_2gzr%tf_0xX3Ki7>}njc?D_q`12BXQ zBu9k+cTWC&g5F~%7bkkrXi`XCtgN;w#EXaan#iJqrurlNGHVwB*H9UVN?W$*1EShm z;`TI0-r(RvzsxGc;X!6GPs1nIiHMN?UiJ`82U-R!5Bei)5tikiBubTlYn7n4x{+vT zh#bK!qU!8eZg+v_m)yPyVjWbLx9@Lti1uoXaCuh04J#%k)FELMfXve&vfc+|! zQ-=JF-RJD{qH%WMs0wiw9i2zu?oLy3HG`mBdsZq}|F*ZEcN3oYSKN3&!b?hSmVV$1 zf(ZBYDP*WY#S&coSvIVBa9}R}g?-1L85wq7isLe5BA!V1?#;}fZ~w_x1Oa3^N8gV7 zZr+AOCvcf-r-LR7n>ra#fs5>du1EO%kI{Yf&oDt9?hGCI=5EJwacU8NyeGGiv9%v? zH-8(2;gabWXn^Z-S}_Wbwrz-7x0JZALg`kX*#9;tu1J7dP^&g>>Xxtn$}I)cR=y58VT-LQMv^K+sZrJnS(LsV45C75=2YW zKxM#_zaULF)+BjN94<*9AEY+aq}PuQuVWwJYAxb;oZ8|S zXwdGc#8w(UZ%Ab1AHRL(anfP93=z2VV=AnJ)qvJW=3r}W8RN9t-dO|R^k}6mh_w)JTExOxzq64p4T>7n2DUf4rV0NYx?p1vpLBo zrJI_}0y@^1G6jTfTCq_I+l`W_r^JJ^AA!MQXij+WQ#iVGQd>-vRR>*3zH`UcEjYlB zcLDLm1rY7?E?UcC9xec9$0cxl(Lr~)=etKn^UU-zigbWmiHq>h&K zj!4{NS47SAHq>ygF=hP{TV0MHWrQxxq1~u+d1y;|e~dScH}dHzPDDZCm)_Any?CX4 zn4#)R!V#u|o=j`vbj&kb+(mfflx)CvBOVfBGIjGjxn+cj3d(D|U4<6&3$NG+tY#e3 zB}@K%|A(}%s84{F8mZ^DqU`A?`QX67ei2VRzP%6o`uJD}V9;-Pu$2C?7AGV_7V`|J zbF0*doM*g{LunO#)Yr@%!OR)>6AjvXzw+_@htJ;c>x-blF0!@*FEYZn&-ze9J$MQ| zHNqcrYYW3QMUkJy`ry9LJc9$?r2&|Mei57*=L2^LY7@$8h^e%@#WTPP`G%A@3782Z z>{x`$2dD>B2MoI6_mQGy;)DsuL*fUL05MGjHI%s8hp^fec)95;HppTKEpI$kOGU(^ zv-Xh`GYME9W*w~$)mG6Jr%!=CL*vXg9aU8?hyz&Kln)LH^=TWYDe9k|m6YK13iF5i zU6SC!{lZ==e))1Yr=a6ndfcL9VDf{r@%vm%{sM3(%lM6K7~K{S_7vk4OIBhiOtSsU zEp>POyLZUQJjgA0rh^~(9Xdp7>3~a*pK#Uf{i$3;uNKGBkW;4uT;#{7-4(y#32TqS zf`a?s%|>!AVVJ-fXxr0tvq(aDHeX{gzA- z>rfggrDbJiX}e5sqp&JPmF*534`IP%)-0RI9`l%BT3+5pn#w8TY|ZxT-nELURd;EF zu3B}f#tqs$TB_@p4bOSCjZ1JqhXN7=K^lO;V*La3$8o?^{dGe>7p0Q@%VmSqj z^XjX+Z%B z|ErfT`?)9%#5@nWH8;PNv+>ii5*m+$H?pI7Z%i&duZOIHz*T&RcPEt3VgE<6|?NPpv3Ca8n_ zPUvWrcwsX3TsbELH7CkU=KCISn8U6hj3F(!{Jm@LfaG+weoQ~)l=<~)S0#-8*qeT( zhIjd%-~njm__mk7FJXiq&FkGG2frA1Juau0y;ZD=$B*dD#*i7COh42(j*$EOtf1f} z{5!D*Ff)7j(h)8#71x3EM-LwY)bF7LBHIANcxNMTH_B39!EEw0KRVEt2$gIoZX&8$pV)U_-w|qvqK{ZZK3| zo;JBIbry%ZMEFUuVz#JzFW+f`8@V+Q*3ja`qA?h)zM7@EK^&Z9-?(torvtg`AMU8F zrFA>MuQDS8!(~pHs&^GliXRTQz&|n(699{oq&wnfX@o9{vH{Bi0PX5bu9<6 z#D}f%X&`b?^^nu4%M!lkS zx`deXSo~?kLK$+ovrG*})E(y$#a*T|BnQWy4F)g8f%TX_qLPR`pXNm1q(AJ++c>jLh9obatq>W{L^A*?I>+RcpF8H#clUVSqU2L|&u&pup_48iN_cz^e#y*9iBKT8Io^$~QC7^A4qU^7{ZP z%e`&4qoS^J6kXm6{rRt%xI=wFCj{@l;nAf{Xtw(h}8U zxxi4d@$o0zwGrO_q!U)Mnw4)7f(<8adW&G=?_zwe_|W}bs5XbgaXTEV$_5=<<}HZ!N^7~4X8!1IIW@hb8kDI-0vhWMOx zJ^+>;q=3bvLjmWi4Bg4WFm~Z$+Can;dF4+$?hT$7j|XvbeVS>_0%FN=0nII6p7=%h>iSS_TiEuiwA_r7_rD-vAusw|W6w#|Jjc zR;*AvGzJQEuRiwxp6Qwfo4$Dd{QRQPIqH%mGtDi*S~WKXLEdfdETd&D*){QA_DZqi zoG&9|VFB|eM>=(HmR(`}SK=Jf1DHqBzR&s1OP3CRq)bf?7o}5Xk^l{etFwF*i%2fc zQd~T|4F~JH@5XS#+fWk!21L&N%xw(!;;z9S`$4kB$xW{Yvl(aw@#oI%dtl?&o*##W zFk^@)*2ynmOu&&s%rs%4t?${VluXOx;968z}k!dq^V~=9ZW!Cx8_swqIk? zxS=Zj04UX0I4aw(nYStWNw?|p#Ar!Tdy=p4qQ}c$OHrz7?Fyd{Z(n$kRJ3GU^tS-H zP+t`n78=#+3^7G*2+<0+SMh?Ms(&V)7BVBzi5YarQOn_@ibs#+t~t8gF8c_)1SZYN z>AM&gw~=^9Ulsj&DOa5rs~h}55IdmU z5kZ|lVdGuwAY*K*kUo(Y_RCMlHxr|729c))2lt1+2eJYT#GiN~wD&6RNJvUT;l#__ zS9vr&;K^UiaRi&j7#1v}_kp*3BGo%J7l$oP*WHZ7*t_92%qCbuKdu?7{($>cmX6v8 z@D$zx05yo6-i#S<7L0mDl}ZX5ID&YjbQl}6CBFY^R0qVTYdG+*VUeVQBN&^B=Y0rdbtNSs{B_27X~ zSC!AeYfNL<{hwA2oi5%dJS`-C8hqBRy9e!&zdk!h4;9dgRsdKZ*%2=RnkzD376{#P z$lyGiZdD&vV~C8CE2S-mFenxZnw~zGa?{kK(8q@P(2QXg*$+il9nR7o@R|TSV4Rcj zEIc*kN}fWhy3g$Mpejvt_Hdy@)BhV@dpo5QSl8Mxi4fWAaW)K@SJl$`4l#sM=~`SI z=JJT5Yk2R#OQO@l_>O5opId)Hks)0&9(!|_+wqVZ~^5$;@gWCE?_5wViSZBmmahuHj&bD^jS$W(>eGdt{7;{hl{=nj-8;h<*HQyE|)#_ zwEw!pVV;m6(&=7{!lu(!<0edq!V^?b)z&_lYj39{5i(lT9Kn;Oa*>db5WH~brlLnq zctd(bKC%u#b*gJ1EqK+;#>_2NKU&Un1snS8$H{_+fHLv;Dx*VY1%BqZo!^f{eI;H9;pL!?N5aps7#iDF`UG|VdKFkiFg z7o)m@Ox3aCr7dBrbZOIg`8-jiKxtt{O@peeEX~XKctB6_M|%{9rIG$l z*3ck+X`7Am38-~of=U@#IO*>2$+Ep8Wgf%=%z20{gCE)4us{fn zp~7#+OLyy5eyy{%o45vuH#*wZ)KqfFk(tj7hjdh}GlufavBKc&h$pkJ^ttgOth4;- zmescBbJ6#h+i}z#^bi3-p*KtA51??1IC^veIjKQ;|I|3Y8V9w;X+Z;{yA*xYN^jEif{QPD@ixouC@~=B|>1cM62uZIlA63bRc0 z@5x&vn=nxjgc-_}d%Ddczytho7;?05!KH-MnP25J>%-4$jk`oCI@k|+FLp3F|NP@X ziA@;Kv7})PsTIVikQU~mMSyHL0zt26$Y1((IYm(rZSdb)&$7(bmXPmhB z>WAw0Pd7E{sd%I{UvZtCI$;<%Ca^&UTDu$R5F$DpZ*M?m$ygS`&PFkFL z|Iz<_bM3q4`o^jQGwbom+=d44PlKV}7i5r1CldWg6-^!gZ2Gu!j!dI<9>+TFfNH_J zX_gl}@jdV+{mgh^r3LfnzbGh3-u;=mR@f&ZAR-%^hwcE2$ovPhHl~Z^I#BT|h>=9N z`6F)CE%OnIrA*2j^HgdsMqSXxxumVcXRF7iUTtWmsmAbk^8jqH(y;;gj z=TJUje<^iuuFUAv3H%3+u8r%52ThT6iwW5ZzAkvNz2}|f^m6Ew@SYO9q$RwkZ>?;X zubKIGrrbUjr-Y!bqvNlf;Jdo4LqwPgHYPEML`8tu{)dbtCv+Eq8z6+}pf|I!iW;r( z(2nZW+q)w^)h%%2`=8x}_Qp-mmRznKQ4rU7f9Jl{<9?X_)4PAtg1Hu2=O5ea-cDY( z?aAQ~?2pZ*-^#wX zwHUnW~8)_K&AX>rTftBbm+<={J9GQ(c8iy_Sk3$we=2UW+(?YPvq z)_V43D>7m_x|vG`$}U}G6&?j|%x{HC(~AKH2W@K{{KtklR3yjdE)=b!1dX`LmsL)J z5b-1}Np+NtUhp*u2JMn*TzZ~srQj?ff5=2;zg7GRQ}wlz--(3Noo&n1!lNmfR{p(W zPL<(#S^!ar=>ST zIWWr(@7YC4IURfO;-!;^o`Q;F{KU2MWx5O9J6BBa13CI*oBwdWU}$87u=H8OH$oYS z7epNn7hd^dzb6ifG~P|Pg`7;C$fwsskK+U_$RAqwVRkcS4$V@10vDw+F?_V=zot9R z-qY0Ep}Uuagc)7$4cn;?oNz=Fw4L4vchs6*ppF-`DV|;)A)o5$MbOuFpVYpIV@3GH zFHG_Z8GRQImW#~R3fvrAmH)^^bdS&zk=m7etCaA5x}wy;IIcWd%U`PI@7G(0>c2 z?AHxbYGe+xc}A(L3tqF&E8HDbI!hav#GvEXA^1aQ?6Z5SLxsJYu77VyBp^xPLd**J)T#~3U|~ZlZI(9 ze{a$2yT=W-`I6<3$y%w(T(=mn6#+r^Eu{eZzJ01?<>l6{^)bH6u6TK2Gz)Y>?m5Tx zpDNH$>>kWk*yF->;8WjTcL~spNj8qQf$6WcI(iY!t_AMW^&H~yX+N)8jQ{I~#nQ*) zf-j#S_yuIWwb9T%W*qeLYtxr!IXgDLyl!-@==QB!v?UfR^>J>}|MA9$M4fpAZ^PF| zMXL*8W?|vstwrY6i=B5|OBzL#I0%{J_qu#;4}oqZ1l*y{k3aveJ|C!midFD%x^s@Ak&Dkp`Am%u2L@SDmQouW z&A2t8aGGzr&d$4*F-vZgejtMld2iu&DazG>?4a7Uuudb@YT>2l*+)hi{u@%dcjwtP zqX)V&)?wq6GKidi$oDC#+F!cn$+%U2YZ20^Y<>>d_o|o_1ki)ZE2hL#H z$&67Gvt*u)*Ps6ID0m^O3Aw?W`(0l2Q^-5LU_F{+A=WDOCu#3R-P0XFL+mDA@zrkr z;}x@u99)o;vZO8_?cuK)YMy~j3$wDq(27~yFuqo_L`hl`o_!8r9knagQlvmvr0cZE zEi>&k(|^3}!{-cC%x1;TH2V(Ly*X#}zz~Hjhr}gHg|Eb^a~p0^I8?g)j#zmiJ>8Qq&KOa{g+{MOEwb_tCA+c} z9cj1QZ%zHSBKhLqCLhNRmLm24m#XP6&2V-fDf!J!rddc<>1c$R)mFUQ{{vr|R`)dH zX!w-pb>-E~_^9zo9iIl>z}1-~&L0P1Q_pT#Ry6jxNt znCH7#G*qW7g@ZtACOB$~sl^Jf z&khg$GiSgB`YerLt~!l8jqiag@ zY1-Pm0rJGTEb%zd*PRimPO^+oiCH3g2;W%~b@HUC%i$Lq5lU;fL+GCF4o z&n7GY$*AeWziwWU-g6ZyaF*R2CQa2J$1|wRQA?nVVZ{a@^1C|YBCof|0UB;Q;~ud5 zVP?^aYiD-9?G>{`;ZE4znb8HncrLn@@P>f6${Ua8GI?rUzJ6QmnhAjgM!}_$wPB?X z8+W#R|9*y!rAoK@b2K?wLYXQM@W@%G_1cPFQUTIasf(q)Z1Pvosj zT=fLE8pqol{WlddHJlg1_6aj1$sMg!-G1lp)a}|w#TjH%rxFmJZkW>5%T#?8-YE1R z1~K*IST4F$u@SlTK)=3ygU3{En6eW|tcwenNp@Bi`Oe=~sVNsO*h}x)G;FeW^FOiJ zv*&yfBW&!71`vNLQimHBA9mh_2K?&C1Dl}I19`P0M~-aXJ>%ma?)qo)Y8N!TK2_P& z0t#@Zi7>@`g}VORBQSgNj2Vte<>=<-w7{Q%uTE!@XAZIJK!${hd(bZAnx_2b2o=R>hUyzSYT@Rj69AWz~xKJ3YO!*13yt zC<{gJysf$U`EwEv&X=wYyCapUk?;yQ=k$V6rCzFEyvrMvPYlH=zI8SC$dNN(-l4!i zmCbYc8#i>u=<7%2)xvi)U?2$j%+#r2k8SOj`Y)K1m%Z5QLp@wx^fo<`Ab5x~O7hySag#l_b(p)>g=Uyv$x&?L_4Yd@e#NXW z;-Vhod29Xr*B5gaUR&L{YHPbT;Mm>!t$W$viQO%izRXKXwYocZY2RXz|8wfr6$RRG zD%!82)7)AeyZ;=Ctokc0BhzSh^XCc0R(Ffm50bu$j8t-rRPy0zqsE*Bl{}+ZQPq1& zc}A-1EUMDv-=E%*M^E?^K2qUh+Unoa(<2i7pn3Rg>c@lxuFq_5^nURe?vGFj2nc8@ zmf&dp^ob>2C0TQRVL?q*b$-4-f?I57^?ORSEu5U39Q1)T12c(3v#z5XquUMM?9ALR05wRme<$1fM5^sA$gXO0kytMCzX8D+cW9vx ze*E>zE?HB6DX8?~jBEMJmx9ArWfF4_2P!0!#+>*guiM$Fr+2ipv_z}&`&Q=_6coHB zADvxY+!LLCNn5Cy8J>$`9IdP}Uy=_y8ylsL?J@RL6q}?N{1x(XssWz0tF?wmuYCW1O#JBVLx1larddS?%Rv)~uqUi_uruwo}J= z+t}LT_naIYadC0xAD+smwCCw>roG@3MDy{2nwr|RYu7%1{(S7%G0RsOIXOFnln7$0 zzlpuQJ;oY;XKih5YMS!BO}(WjOCj0P*47q-WoL)$)UL3^&{?fHa`oS_GC$UVj}t`5X-5~A#hDog7Z(Ov+L?s~&U22uRCLUkZsNG-UygtO{tXEU zA)i=OLqo&G#RWf)A3x5(z_4xGw(NcJer6(9JUl$koH=v*_HF#Ua^=eH+a)@O`I&-n z_1^yud3kvm85t$s9TP^$XK4AkR21O(h6%JBf7KY#w>#ppmyAOp7yZuwJJ*W&E#maXLD{(}cjPEPNoR4pIg4WfyWV+!Is za%AdPPnpYf?~%iYA2ph7r#AgF`E_7mAkSF2xu~%4$1wT0W==k~`YUYP7W@KVK01oq z$Ngke`Z?`Zl_o9WQLGGw$=danN5{l`Yi~C;Hy6M2XHwGf=Z9#~`i>6fKQW&qDZF_O z9XfRE*g~~0O&Hh7hi6koEn4G_+xIpft(128rH5(jd^bGQJBWt;_{EDCF*28P4O&`T z`6C;*u^xVU!bMP3JaT)CAD6VN!$@m;^*hrQKlKAe(IW( zk7Xn6JpSqL?-4xQQK#jPspp;?HLNhIrr?|srld1;bo~7}>vFDM$-|hK`!xeUTjR@& zYXYJUU1s0C+lZ6>`Ddd+@6%`anDpPeExZq6cKP*PSXA`R!spAEvvqc`u?5u+<%kLPA1q z@GkrBZ*DX`{BNe>DlJiEUeK0s^3L3k#=$|8qepW&PuwbBU!IsL-jqQe1aDL&N*a2O z6SqFRduOupXKJD|$M?9L;#yO4^NE{38X6<_A31Ua*H&`9ga6Aq^#N2Wx^q{rcGq)z zxsQK3KtmI_w6wG^(N$BUW2u6FYUs7LfO(OjJ-$ED{gv~?CD+(3RJhZC=b8ecTqjGd zyIx-JNb~qR{N%=s8#4###duNn`rLoF;0}g{hZiPtE03A@g3qDy=BjF*>p zu*apZr_|Z{#*Nu;Mb`VJC;A<{HbjL8R#qN9s`5pyhSr2H!|EJP`e{N~i6`&;VPR#x zknyR%zkjjMi<@(DXUwa9HU_bztHpM2=b8?o(A0-={+^%zM7lupRr#nPy?PvxmbOoj zuA5u(lCWh>X(g?EI3|uwUqw$#%T!a;q3zU^6Zd#*Q1%z5@qcj_`dAt5Dayx|ZG=Df zr0UTxxoaBGztr0#yGEtNE94@ma)zyXi{GCq_hZUeyWT!~HkkUvfR`!gz<~poE?v?I zq%Fbux97-|vq>k!(?#jHf%U1=LFA35ZdTyDV@~)6^aHQO?UY>V>jm>Dy&B&DUo|2I{ zwTVg9RQJ&jLS}m@bIMeyJ=fX%0w}g^ljGfV=un>9u{U>I?uE$qlB?(UH|H;3UYxDx zwsvg~za+;qdWwdDOH546=KA$&^I3w2a_w+)6C)8m*0JH1rOA`~_D|Pp=7zL1qs+$i zvrp@EBf(A6FLf8*?TYHSob5Ugd^wl5y85W9q=#G8F@-+6Z_g{{{iqghYi|rVs9g9+ zyOqtdXT|ecIGs$j=ilL79v*9Tb*EJy(;JgZUVLTcMrY1d;j61WEAq*Vn~1%U8*X=g z0DG9&hVb$6aL|A34mP{CS6-f$P;p;1N~PNf?(A$>m{4&kc5|($P%+;7Ze-tdxi4|| z>C+b)TNt<HE4~?sb=$n`E1tYsM#)-uL}Jtn2r^JZQ%Co|2E)vAuns!Ngsv z%^}(0o?Y<@@`T*2>C-VWj6qamqjE3x6-`W*`}&zxc_T<;^H`roubgNVg=XcBG6vVW zxw$n0-k!bZZ)MZs522i}?SQoZZj{~tB=zC+LZoD(IPHxWTW^1WW% zl5Q*+nHLh}3kC-VFXbA9*lrL1SslAAX;)!!acpdC`t#=>VvjS#(o&c38C;^4mcE;F z#L^N_O;M55y^Z8~YIK!$u4^0b4i!Gi$KtC;Z{4C`&qQS}X7~`e>md&JXA3l6&FuSR*&)MlczyH7%f_P-gb;!QtakIC=CYJk^F0U?( z84YjW2)4SSeCD=S$sBvdw?})!MzrmRFO>NXRc>sirFd<(IVws{fQpvF&F!>agWS7! zau;_te4tuc^!=RW9kD}2ow~c2VWNyVDJ`w8u8uk@RZ$1k(`^%d;MF`Mc?AUuocp{E z?Vl-1;_hX`HS4X*^TWzv>r#g2R{}5eHlt~M~IFNE6z0aA3 zV5H?aynXWf7C{3le}95lxcXBpwW#RWkt4PP@BE)0=6uJfDjiiX4Q}zszT$aPNsJ*&f2G`fd_u76D8dRXxUG%(s`}a@JPA8vuNk?kJ zVc^~7mZR+NI8>!IWu;D>(AU$`)7KXsZAmFr6x-|5~{mvT>M z=j`C!u{UxD1A|#T{qv;$T#eh(KcIaz)l!Dnih(0`RxkwmWTLSV5Pf z_cQfEZb`}Q_0_*8Po4}43fjAOFY2}$6Rpo=cky(jhRkj3T3+jaEtXspGPbOLPF}xq z^{R!1#me&X>C>lweJeUAz+%F=77rG3MJELFqb91pXhMZpc z-6q=>f5K&T=>{Mlb|_`VPJX=&;C`FQ}xVpA8&fS{G2S$r*JA<)cD}wT<2B$Q>RZqj*9Y_siv7J8Dj*1W3PDn^yz~K z4^W~ThUXd@8b~A(VBhbH-2V~sSndZ89=tX6ZMeUGW+0GT@apUAw6ve3WJO>^o%+q! zx4B;4BgPIOw)}S_k(rr!=hoW$I}eH5eV6cBcX!Qky$`0dOHfbZ_MDlzdT2_@P+iEL zV!Ixz&_AaBJUdbFQo4G2;={uoR+nb8vkzNaPh4w$oTHP^d+^|W6+RQ7D9Nd*DQw2) z&YmsxSb3e0(3^QNtJifX1hCMuU5je(5lUtTG5Ujt4z(r9dM%89_VJ-$4|#3Y_;9%S zNqt=%J3BkRMeO|e#6+&a+n7g>9wj8G^D(8QqyWot?b>BQhVqu-uYEBR8aUN)>|U<3 zgLqzMBGFk{)=ElBPEPZye}AW|#RfP#k#wRSKL(8LeS7El$&+u3iavk)=Jq-B;<+b+ zArBsWx*Xa@C$EUg5yKcCA3v&+viPef>*Y)S2$kyUYT(!{z`I+wiinEVNXc31Fj8e? zW;V67fTiH@Se`!+p|YKxJ^^U9{Pu6aB3denPGN;o8eqV801?|;DoQ@(%K;|fbpPahc>A%7bH1ZFJIr7`Ee=iQiP zVwo8k2Np{Je}B75OLI;C{P`0Q9rur)V`JAXECQXMYTZ-fJ#h5sQ6L(@f5+j&U`Eu0 zgoFeY&P`4IjD|-0;LZt^?RK%GO-44CWM5AXED2R%+1~Wcf2Yn z@Kuua0xVQ`q3`Vb{m6e?+KS6xl{nV8wrw+6^o`0)HPj7FirYNjd5&&Gn@DTESOv;kW;eoScxFfqU9qS6a+O z+Mj2sR*i1M$DbI%gW096_Qo>#((`f9T}o?_|l3X`<}=~r6I#orwlw~j9R=pSgQpj32I95NAgls zn93im?Cg3AuXlhkl6l9SMLTF7PNhn`=Myd@jWDl{yf+a}YtbNBlj5^{ZY0~>s z+AW(D#>dA|m7YdLEuf5f&era7u;f)yCd)GF7HtV0i#;waA3mrj%5bu>1~^L$ofdrJ z1*W#~x6KQ48o!?!9Q1KkViYsc{ZvRNKlH4iz_BIf7|7Js0&_J_&vmmVDT0vZ;^yYw zSeiABQ28-2ac8Dq-gT08j00ry%rGiOMMVWRcnwumX{S+=8E4+d=H^5D_gi$owmorc z@?J>DsWNwk@Rwv#%|}I1{rJe$XDKObtE<=^F6Zd_J1a3aS5+BJ_r4t)8-tz!Du^qu zmExsk7sMGFd9YLk1V+D?IPTX-D0f@P^!MM~x#PMD6cta;idWZf%&c(osGI}C857UY zCiArLa7J)gtSh=b;zpbiX>5D;a7#Ijg6HBgm1EiRLuq{i2xuHN2{In+J9f-Y754#Q zKS2?Kx=|&?`ypGeAQCDF6(O>P0n>NW`njNa2ot?$> zok$WgH#WY3LLG_A1RWO;5RjGS2KRd5h3%k}JZHqkZ-KsHSehFfXXobLN%0#1Ld!G-Fa~|b^=cbQNDr&?_?d0MLb(YXQo2S;}gmGT@&j zRaT2~saU*N*zOMo1$fNxoy}cckviQ|2TneoZ{&{Dt)k($rClwXzc&r^CKVrGMdw4(!AkPu9D%6u^ z(?*)z$;$fp$&+G}+WSxi-g%}m{zU05WSL}>svvo$VXMJ*dv{HBuMN4z?fW9?3p3BGHomq_mU25N|=?~?R!$O$XokhPk}|-6GP7uqiP@1`p|06G?E`~ozdLw&K=`6 z%_H)BOc=8GgaiY9{VA-yN00oRl}Kg~{QN@7%gd{(ett>+;+U`xbyHgh|TB;ix6rN~T=-#a&X zrme59r)wnMx_J{%QKcAD!jhsoAvx0bRbqw;-`wJ&toxEs=MMQ&I@G9V-^*MWI6Y;t zg#qk<65t9$f&v5U0gYTHzs$Ctm_BS!{k_TnNZ6n75I@STM4OwLVQ!Ih zu-ZaIixQIm$qPw0SeckEXlmvGP+>yYeaTBME8Byq&q=P;c1CTa3}1z04r$jJ%tY+E zy}iBI#Bk;@CM@vTO_%`k5KKpZs~XE{St^mwy7kZY_@)mnEzqS_SEefyB^~*Ngz}P- z2=cdL>53i3H$b)VNUupqW+Zq71%E;D!SDdv=gxJPx#W6#Z@RQY;VCrUb7#(cEw=B&;vfrj*aeH&JTbjq zyb$n~yL-kJOA2U;!iQ&~D|dQwQuWLk6b(aCP@aXrr(NIL#AIbF?PWV~5yic36WIBu zD^>&pb|`$K@J^DS>MqvMn9ikS;f>JI)_(Nxp$HzdRD8nIr}vzl!o{&|C3^f};|en@ zx%ppUO+=#^ZUhP^akpjwRXW7^E@NH4jxEUuc;j77&CacxmmkaV2t}*12JhUt(|Pdy z7U-}xHNJ&c&Yo@BV_)vg({S$STc@QNF5Z#FCbrjw@;UA(k9z) zg+a9@89m8-PnxH{mqaEcgkIDRr-zyjbYfL60NuZ^a2|?h-NA#jj+p&xCx8I~Td#>+ z=?epF!sbFlbJjax9%bm_rAvR-b~X;rp*$@wFHAgD+H6cOUL?PUYlP4>IW@&;mf+HR zdn7&4^P`SRc>9w(r zEn{P8D6F&d5^ux{O##x%r5RUubMv3sR|*0Qb?xnQamul=h_k8xGk4lXvWmu%i)_Lb z93PjqlJ_x^1e`HN33Bx7(Z{(7U*7^M8j;86F89 zF(d7gyC=R^Q{czV5(WH%n#>U*FtZdri&o%1T*(1!0eu_6fd81ChA7`Ex4^@DsRc)EX=C5--ln6ePwW>P9-vA4#`;`*u3I4DEwaXOD@Ciyu3dnwivY zIl8T2UcVL>j|C3K0nF&SChr(DzNJ6A~BaT6sDO zS0gKHTaJun7Nzb{l1;jF%Q(o+*cc!=a5RNC(GrU4Q(XL{c{r0*!uFe3fy`kXiKark zwHyT&8{=F78vypN0`Y?Y)s4UF z>sQI84XEFlJHzC71R@!ItL3zIz$F7M$CJB{^d^U zf-Qy-kH4a!5ms%4ng^o<4jsk~J{Jrx92OSGx4f>CbCQ{LDEa=68bR(l%^K`)9s>ss zf4rv53|EQT*ZbGXqcYi|t|8BF!pF{}UMQ?U&BBqK+kW<5h28b*=hw<$)E)dyf}_>G zfs26$H_$+b>F!u~PU!Ljji(8ElR^IBSwO1zsOq*0-E!)n8A zDJv__Z(gp9iu%ka<3Kva6!iS<+j!WZg@t)K+2CgL{@(^D;IU2CR9A1}f4&7QUH8I; z3-~-}8|3+`SD}Q7Mym!G{L#83IBfVHe{X2WJ@I1y&U~Hk-@j*nZ$6N929l!>&uB#} z;2+9DO-&8{(9sduXlBB>&|rCe5T+#Pa#U0leqwil-2{3!dQxaRwc?aO6&QbK=Pik1 z8+l!I{>UPjqVOTRx>7b$Fpt`M$&_2v`~wU?7w3P6qobpf6V|;B&C4vTGCVf;cQ}jz zmv77hj4@IP3kf;gx^?SzE4~TRk3nG#YhVpDgv{)0_vQKP7cYM90K$>+ILI0dVgv=^ z$&)8x|Bl4OL`WWwxf8FS8qCPe1yKO+#v%8cF0qYlQC9(eSKYB zUAWNN+FFbQQ{jlJ8;E&wax$(LoFgfT2RI-*TlHYng$!-XO)-YeG&FZ`s_rA(ck^-O z>%_&zYL~Q4|Gz9iEYA1j$z?pfD_6dDbokZ}p>mv*mL~mH#ux(WOSm2pdxL5G>Xk_0 z`4?D8d3l;s#Vm}BjI6AXYyzC0>kK+bFmOo&bvJzYfaMLZ5`Te9+Vt;$Hh|In_S)3v zw6fq6h;T`t_kvWNI8m08;;X_3;2RhisH~*)A^ybWJ*|4j9=SpRc!i^&0LCw@(bBTA zGkg!higUN3F3~AbsF{rB)%$~pwSoIkc=!MM^$UUwD9k_WGb|%7awjbn$X2Dt$}RBi z^XDVLZ5O--4(x%(MuQK5J2*dZ(| z3|*;uyfZB5th7jUHlUxHcyx3$W+L{f|M|d{F;E@@_luE~va+%iMM(h7xM(RUDXdJ3 zmKb1dR>)-R>{8Kop~{S8;}^&SDqT}ULwNHrrXWg@Wkq|*L>uXiX}*pnH5log)g_1p z5ANNQtN(BI&!0{+zM(i*{2tb11dRB|$d2xAYiMf;eNY^!H*c;kYv$R$mlpL4TVw*h z5K112lmvxpU|%DO>wy~M?*}N_7p9UBH z*b1Av>&$; z&>L`WUDxy5d^DlCVOrzBtzt+aKw*6c?>cHwXc+;8zO$W9jW^;ugg%ThuBd(p^OMYE zfG|ey#gT2|?Nsu3>JK9$$tG}Y>>F5@=z5WWbVBc!7;?Yn= zX#M^>_c%`ChEJ_YNFfL9M+Izppr2n#oezbat{IwzH4Z{0CN;zPlVxjd$e!b@f_nG< z46pWWtY5x*HP~5`^g~-q3pI%A#EBE&jd)r=ewYE0gbs)C%)&780s6--Z0NE1 zH=WoOpapo^I4$b-zI`d=?_^~)+4(>rS>n#0!*2bOkR=aYe%W9qlI`Q2Mjx$uYwTkx zbV>>W<^Ud*tihOtPEdMA#u&WeV|aq%;-1rQ7w6{Y>aKlde7*)xyvxvwEX&jkVDE?e zDaIj(VN_AMhp7bu6&xIVtlWuK;opRYDia8*s-yEIMLDd_pr0`)9b)v_V&8GlrGkQ$ zUuDxv?(1K6NlK+y@BXAPRK(j<_wmaYozG(+Tq$6cM>lqkKnd*<#%Kd)6L8PD7)uuFiaRuofuER4>lXb_5av>c^17 z8_)(viMV{0WBpQxSnlsr4#n0EcjS%?7)75$O*)x;hQDQ=hwrHocBEE zh*rI%umASu@LA$6O18LPx-n1?q7u--K`J@*x2$Djw<|z3N=;4u8CyWJ$y%Xu81s{Y zVC3WsQIC`Lk|FwkG)Dg4^FIIf?Hiu43g1TrF6xVa{2pn;FlxyBHFFQ<+@aGGa5%lF zXeS}Z8&OxRqYuyvg6&^3z{JFKde(WtnKif;g^-?}9=p-dj@~z8E4viZG4bXNP5>RF zeBxHJT9Qux9fQGwt%+2Bx$UX2DdHiSNA}}05ckOwP*k-0)wN&*t5&3zUl$icGVCkL z%c~li9VKhrfa7q7m}&ih0*~nA^`nGR=G@ahxHguasGy(#j*bo0!2u4mG0f} zO|V6-FhDqn)BnWP`JgVV*mH+jr+dn}>g#Dd+{(kk+Sb=r{$pyKDIRgy%67Bn51q}- z-_#3ZFbsDwG8$Q0s_;jqJbShdax-AVO$YlJyUX6l#v#|5t7pyxd3#sGW~$4oYWMzZ z+d%iuykHZ79n`l?yd%DqkeH%KZJod@xE^OG{MUJ0#ZI>K&@>C(ntd z?b4cRpf7Ogb^F3#Sdq&1OK^nZ!Hp}AUU%+`$+P-=ut=)2ScilD$)iV~rtiwZLLgp9GyU>N;h-NW&kFSK)h)XX_d%wjPa8 z!DBvM>>;MeA9?E3DHOJluC*4_9eM@^?mijj6q3schQGf@S1c$Z^GiV&BO4LF8X6oV z2#96emaj83If0#2R2pEQoL;Wo<%4`3)Efj~c2`!_sr9KnP>+`JST3^e!g9y=8hHM_ zM#w2Cz31tJT-gw@k07uT{rsrt1IarG05}T^6>%>tOquaVN|+1<@uj<4)^#SStZW6c zRg>L-)qen$hLxUg%gU}wdSI!50sokF1tLY|>b9@kOi*p!ys(GKUttq5+52{n$0I9c z<$9c-e4~Z(o-0$wiK;kBM@&0{u*}NRExfb%YcugQCWcGalfy$`A>Xu~G%E~@Ap2oT z(rmAyola3zK-@-FZUqIgn~jZA+BGjf|2!WPFg`iMB+;#G3V;Q1;@hd8?bt~-5fBU? zynP|;^Es!F?%Dmbsde@BSv}6jo+U1-jC8e*BL>Au$lbpE_g=-qyIiUx&vJ5X^(gmn zQ-1ctm>x?1)YfQ-m4ynkQ5vA&`l#+8$q$zDqhh%X`}MCu?P`yv}H zi?oATIo}t5dQWUC7f*cRb&Kq<# z?%TDQ{S=aK-iLv(xR`l~#jPK}5@4;g@)CU}e2yJd@`-zM-4xFQU{?O;0{Z!wEVMC* z$(UB|MWpRpcXw7R>z+N$<^{^7@{iP*vo7U~yVSPdsQzsC*52Bhk_d17VQkm7cN-Qj z?;58!y@>2`;gup_I$4yI13kVFPB#;^UHf^Jo zF7@Th7jlGZ-*VHo%7+N$Q4sg<->*BCIV-HGw%h%+=Lp;Cz}E&9D<9oPU`*mJa1oaI zvx}hM7BfeYR7Hpa3IQz8Zw(E!1X+QMunXU|OEAg)GyC@_Q3l!B?XMpFyU5I)5k%;QpW#%V49nqQ_ z|Jl231SOE{hK^o6YIC+k4;;VLuBVhd)DK?rCk1W?*mq8VI!sjYP|D7qT&%>UI9O5W z`fE=slmIF@RNPb0$b#D{u4$C1-MoXA3JEqGpyz$5NjYZe>hTwj48TxG($MPWImhIz2J5P226j^>m<$eup_e0^&iJV`(y#9gnAl|JlxdVrM%&yi&S~G+e`x zBXqV_+vw?kxsXdF2F5OX|d3CLsAgCyeXHvmc408%$7;V46yi8{Ve4WzGA}z_7uXwy16t7gTkpdwx^Fim z(ui!%ylRMys`HQCMX4IU#;Znt!~epbb9(lBxTnu00hUqWhMz65QEJDZPLu_$^o&|D z-?B-$N)n1Ms zvViNT)eC?AhzkkvL^gttK~dLw%jP6Ou2J$+hr=1cqJYBiBcs+#Ts&E;S9}3 zkn}z5?9|lMKoMc~jqvioT7gh%%72~QVdOmFq85c=0gHk>o`ZE>UHs83hyE~Yb6Z;* z;s#C({_GBI&VMGa9E=(t9eo-XCmk@uAH?msw22V1XywSJ^v=6%Xjp01$V5~DhFt7^ zRCiuqzXvH=I01m&k~@a2C3SiVzhfH$3&!|@{GGo1&M5slXe02$CgKAK%wfui@n?u* zV5^_~yNXMM_mR@W=e0CIlRe~<=O^>@EQGk4njv^#%%z8uHQ(5FixYAP2cJ39=qI?% zF|Ty&K1{p95_{lFQ^|4mQV+y89T9FI?jmmts+HOEO61CdtqL72E$K_a-ep1kD07p$ z+K9Z^f64P!;)Nc>DS1=Lw20@xfkynFs;Yial49}i<|pNioI5cKk&YOLfk`$la&lysNB3Qe9Wrx9z}A1;E-cf7f#V%N6laXoNK7{3E962>Pfty} zDJdbJ<~KtcQ*f=J$3hgeOyBCI$$~a~M2zDub=7!U3v@qO1f@XDwNOYZ{+_ng>~ClL zYJTMC(LV4N=wO=&L<=wnzBy3~n(6r==PvpV0QQNQ%*{6z_~7k+(DV6$szAn$KuV#1r) z#;|3}l~-nspnvV_YK+fQK!!lD5M8;k^2atpr4XK7m%$y|zjMQuyIgE>5+-J5ps;jA zY`nZSE*spw2Jzpjrb>>q`*UZfLAmQJa>?lO9G}>HPA9`h{U4KsiGa!&8XVmH=EgoLk+C;> zv5$^ao8&?oS%{cZORKI9?TA)AT#BdB1!J~h3go5?3y6+xO@|1 z<9zHz7^wevc@;D?><1s8kO@-0XkjseWDvOK$Bqstkr3ISNTIa?DIp~#KgbYEg7iKC ziad-zK#$GLo`Vnn_<{xhNc& z0RhxvUxC`3oSjQbO9l1b%ph7EbKIT_MOuy+N_5pm(Rmj57|as4tS8t7T-DJb%EMCy z-L0qRq>zwiAidCDeQzEWv;|;J;wNMd0|Tz$S_CQ}=s-Ba@L?#MZoK7>#*lyd^a-`o zpzKyit%>mN2k^n}-X)xBX}BraVzNo~O~{gwQ~W=FLYoH9d}82sKuXFD!wVIYJ=DU4 zIqV<=JF-CcWD&d#nF*+H8QN!4FF3QlGO~+_$>g7G7qc(wYNwO7F%0CCv|)~Xb8v%05--EKRrC&>Iv2lIAEJ!Z$qDkT8649 zEtNb@D4K|{7d6?|L1unwdHLDK9XGeo>G*Tu{6V#dMLqQK@p(70(e z8a?HR+lDj`;TMJg4S}Iaq7e|lJ>ZxZ4kh)!(R(@0m04J*%^Ly#X}C@)?5}xi+?L|> zTTHZ6kguC4kIqY|@<+mp0F2>=4?{O$w32)zDBTdk{wOuT`h{N}B(c!YRmlTp+I9|S_Kj~XoRD|0&^*emcaYiA6e~bS+ATE4-dD(3~sr=QeIj}}rAIKrN zc~~VN>TaMcOG_x-2Lh?P%yr{km!XMgxUB}0`*su-H3?G^Fr79PFCi4$$w1Cx{4DLE;nPh6=# zc6O$HPl1jJknMx27Rq+!L&ecnO2p7^G?2^^Fx36)`90gvya7h_9}yx{E$4 z1j(XRQFdVEtcU&NL)S!x`xmIjP<=_0kO2@k`)YGbON)8A6s=UZN0Hly!UTh8q`yBY zrl+W&-NuPuW01{HQ@|`=2bV&g38LiB+_`h2)Jw^5o4>+mxSK2;GL~X72pOQ7qMs~U zH4Om&V3aEV9#p42d$a^t;_VobGrDCdqf&9zSNC_v&=aJcbxl6~Hvs_=gYM z*KCuv1f5MK2k~NJE?l(S@O<1n{QqoF)ErA6`9&elw&dd)$qi<&h8-;vE}2`Sgk@;T zrzs7x(R<5Pk$ukdJ#BNY((}sb6Iwn}4}TNuq0y}H8z}aUAf@@+@yITDkna66IYq_9 z_%P*}u778sY-jOFKm#Mm@)U1`rT`f4=8dd0r2{_h5|&-aOCtJYb{oNgbRpVi-` z(gk8U|8#o%a~ASV%)zw~*{6Q}`spA6q5!uBKSz(|O}j*$!QH7C8YU_vCtVEs7i~*9 zcJFK|R;#J$Q2wI(qvl}@rsV=I0(rc{tSNzpu(gYeFCS)IoSzpEZIRm)douk)b|%R< zp?-JfOWz=iN7S;iavD3Ts!n)N$x~4PTgiKUwenAqT^{g5lxKzBI3rF%WlmIFT*i6) z5o9Cy^T;l)oD2jp*DA54Vn2$9jGUSP!X(Ig3=Iv@NJX)YQayw4!NZsorE-Ku1wP^Z z*}v}o3dy?cy3N!F zz78F8y#|!}>{KuxQzM*h++lsHD(!`fT3Wx?SEe^0B%x*_Z*t?-tvbF35NGieq1>6i za(Z#pH9fpFudtAcfd4mpkW^j0_s}6E9uA_$0&$k#_vayq#I`q%8*!5wtx#p$U***c#K`D5aLImzkluf_j+ZwY&p&aq#XuPnCY)ZvJ*LL z$P>u1cmd0P3Ha3Ay^T5S-&Z8<`dfc|mH@9id*Q;z0J=SwvUO&md_AxqAZa_UEjyz_ zOTX;aTL{h&7WatTkOJs+@C?(ZCF0%t6;C(;6YgGoPf0*ltX!Q7e*1O}dGcKF-;K3t zFI|x&=I4sIcA2GqUqqRqIrda|T+QODCt|-9(y2<9zW?~~CNC4iK^d8ZMze~A&Z~!6 zClCkD+qYj#l?*yPm&XvrL$1K_=1m`8-~3P&eS7<((nIYBg=R;Y_#-861kn&PVP2~> zO-)wFHKVMf7e&FoJRr&YUhN=~I(8UDC~6Q#ufBCFx|MLKMwH9e*W>pgF?UsdM~-Q$ zi7q%bfH#-*^rR62ALcpF_^Atk@ojlIx&oQGxeYH}Vg>Yzzk=B z5fcN}HyPd+o_r>wtn3a@J#Y^&4bof{o@=GQ%sI(3i3tl6A3gKiLi)w#ZLENzEIW5r z3(7=B!M$-`ngNppQeQ_LROa>^pOh5)L{eQQ$`3q`sw!ea4uQ+}DW+(~^}aZ`i7bE) z|M&qgOa2C^B)Sd`GmsaGK^9QLvC=g{#V`of>4a^ z+TgITjnR}aWR~zmC=fS1Ld6{Rt9m?i+!F&)nu_cf{3m7ZuE%k4HrCd`$oJA447DpD z5VZ&lA?vZsG9j>@HaS>;W(G73XV-Wy19iT(`8qfY*pUmaUU0@~9ykU8_#vI!=kt9YVUUYpg zmP1%^u?uk3xpUh(y~}x!$USi)wrwQP&(HGnmai;=#;fE>sSfg);2ucJ3tE| zA!;{n2&1Ela%zwnQPr{~qkAppVEol>Z5oGJk;9xp=n~*dhsK}n|DNhh@3g@-<^Puj z=AW(jD z1bh&InsDGRKvOgtWw2@?y6fQ~ir@IR=7N;>!zFGWo5OJ|m z(K3KM9a$rVk_%ldkN)fgT&#SZ?QO1wbmes^Sril$$ROs2n&^-OW&THRVMoNd4{=*R z#maS?AB8Gu=q)$1vEH|FXC&UGU*%LLIX1~d3oln({BffhaTmHi7883&T5c{wn`a>f z#aJ37vG48eJ0=89C%t`pQcUa<(i5Vh%o93JyWLXQz2&~Vw!NyXOw&1FnF66&{*Nnq zXPSpiIES=pV!t_E#ES>8nUnv4_x2~z(O*HKjdmrThy8c8)ag1NS!Cnk0|z8sXZjJL z!d>k-a`p8CxzWlaG-36*R|@JrebTPkD{qAfcM%dCyw;N^IVa>!6H|k~mnU+`(N|0t z4-3Yv{$RJiy|0%*{YQ?pEl#o^Ie7ps7X}X`sTSj0Wb;*|M6Y*R8CGt*OK-b_w5B0; zzJpL(F}ZurN|QtUUZbRBI14uDNX92KxskertGxiVsQ#e%k>~Du-P4sD>op9rKSoAC z$4ogNy)M9NURapwc2-3V1Q(Z(*d6&IX_rw?CrwB%iruc=yRj})oX`YD;Z4?9gOq&K zZ?8-hZz4}(4tkpIFNIWYDKQllp6>3_<%flN4c%u?_3aUyab4ArUGsCcWc1;o#RNGF zHCc`a#nhOyL0}C%wk%u!oLqw7jaWjTmoX=M9ef}Ix3T{SIW*i|ytuP- zU^KxqagT|S5x_+rJ)Ht0mOguMEd_zDF;mWl(bTlGkCtNl_wWDA=?Al%yhfANl2D4h zWd?7SK*QU|6ofcGPSjzh9r@tfn-_dcV<89sxop8UiS4lOK>m?uw;qjg`EH;&^{j&7=y zT{x7#^4p>T=!dP6`Ymrd*XFe@%F9cE35Yb#RcM=idzI{aO8uRkhNeGdXb}Vl{UU<2 znd-{++Q6%b2qOf?aA`n|9~~y=*B>KG85l@|aJQFlkaDqpx$BOw`Uy+rcW|$9dxNt} z6<09V%1TNAd9zJ9G*DGe<(h7S)_%~9Ve|4EabzB_M_?b$HjR^p@D8d|TC|1g9fR!Z zUBuq|u=wp17q7r?)1eVDfv=7*gS$*+pWrSe4-w;l+Zn@P<0FkeH~<-1pCtQJyyxBB zSK(f*uC1Z#0NN^D%}g9x8z>&jczmk+}*u`7XQiO{2lCNcu@k9RvFq`l@F1`CE~k{<*ks% zR!~$#7a!E-ywGd&x>v8FXJY}22th6IgJItxH2EUd0E>Jk7)(b`5Lrx6GL$z0s)dz> zI!^NC%WiVg`yb;xfUs!0^@U7F>g}&JI^SHa}>SXk`$#f-= z*&H-cNFJd7E#}1-qN1XFoovLHWfE~y_3MlV2n&lbpjiwuBqV8MBB{yx2402&qK>3* z-8Frli$b%i)X3oHBF5g(P$d<9LksQ|iW~YlAhzHJrh4C&{jV7hwW73?{iKJmhzQWK zLZlxw6SU&wFwFC~ps@O^aDdes;xb@RAy4tI1&%b*h5RfMK`0qG;Gm#}BGgx1AJ_{u z5vE$UrT}%=0IG9daF7b$LHzZRBT$oojUXS&*B{vNpCqsPpD(Q z#V0@q+A}Il!wi}Pn^pVr7?3Pm%j0kq83gkJrhN543*bAvikjxqc^&A9POlI8Y{k{$#~9K`7zkdg+*M2d0Q+|KVSr zQ}x_A^aSGhZKvJ`f{umwPY^fVYH&o3kxy23KvX;|+y}NaU1uTT zt&pfN6Cn0NR7Xm*-$4RQk$`uZyS&P(z$E0Luv!to>9IIRJ;kD0225Z zGChFS=ylQ(c!WnxHc0f|kjVYnq&j6>6wZcuh3=8yT6E0m;oTx|O8${dHAN&=Zr%C= z0s`uZr;B74yj0jH=skD0x1VlwQ@|Kwks}uL1R`=mf*>O;$W^}k-#N4q1^D?1(B#}D zRHY+NTUg*hN#B}$+WCisRf@VVgLo6L5SA3)@qkEH6P_`It!%|u0a_n8qpOfruybU+ zcmYRFr_%G}H(S;T559A(X3-JOS7>`h>hnu2+C~@5}R>f0DxgvzXzkffdZpN!u z@I!9GYr=yJx_{qi1m3>9!u|+sCgjb2LSPxM1KGvRZIAV2WRwT|`usT`dd{3RWB$O$ zXOLN{!u(g^tE;UAAV%j>9dm3;FXBAQuG?_?0H5X0pHodF6`n#48V?ad!oTzh`ack` zsF4yt|GVgIMBCIgG;(p#6LRb1??vw#KtLPvB1f>c6kfNBMT-Zrq*dS9> zB}INY7&Z$-aOu0Drtd*nrE%*WK;ua&vn{;m0+??E=jdKel=)nt zt8BZoUH9_U8w)o+`TIzWE66Ev*syHgbcI61Z2F`~uk5c5=>t3>b~n%5tngYoW7m2T z9?JC5#a>Z@z>A>Z*r8{0d)51Wnt)l?jE%i*w?lQ@SoGRJiNOr{)%!NsRwz;rAyhdz z0`;_@;Lh)#be#haI)M{VBsLMy#nJUQT%R2zN$op}0OsDvn$nVzE#1+)s?rqy?cKYH z2nPkcNMNpj>0{R)X-f>WkW6_L6Jupzq0Ad`Yr6Mj01Js&3CwO*l}= zyStY|1O=VQGxnX)3l0cUPJ$$d9Rqw|reX}aVZ{F^31BAb>G;r{@#^G2#3?1E!$*z; z-@l(nZ{dpCfVl{P4ECg-g`|Lq&~CiHAsx2Mg9jh5pz`ShcNq=t5QDaN`TTkL$DRYx zcyAYWuI74kd%~tuS80dd?-~mlYpKvE>OK%eP3_gwhinl!jsA& zLb-6VuhI+n8%CPECxz(?G!>vf4c$Qp4>m!0={E9HGBzGSOv_SC7o&-HA#@Hn&~!#K zC>W}$ZYOxa>$~YLYHOoujNCC>`?4_3P#wvd>}(DYl)v|AdN(ZoqCuLL>K*)K*RP{I zKsA7q$fl#wNU7MoRf7#kFe3xD*MI;0M|X95Pul)an)7IV*n3Xs)924OiuPu!mNM*& zkwE8(rR5tmj@cCt4h&!yxo3Ad&e)3!NeWDflrK$7&jxR#kj-{KKc(BZCBwQ;3GLpF zE(A(SU+~XQhq(V}p)ViVYtz8vM~-}0^k^ceiJ!P+-__6{rs#d+OdLy8XvHU3Q5l64Ig2rQ*K=U zxu>;qf4sWa#<~aQJW=)iyZfU%#`i3Yp_OQ6e1baQPh&f~``_8%ZXst4zM+>{3Dx`b zX|f*hqDy+-%lX>l@mQKccpqKW_s%Uatlfd8K|wT_ z%{~3|j_PQQ1acw%3P^zWt2s(jT8y)*iin6Hy|jvH4K#Foyb`b1f@}jI-VoBHd^)`Y z6k!TFOHz^?e84e^{LgWnCF z5V`2+LZJPIS{&i^+K>-+bMO?5WB4LbjHud6-6BZc7p`296cb}1(AQILQo9vyv!rAR zHtu{0!C6cc?5o&LU{~ODDCuwBNc_o4TnoK%R$cw{r5+j2RS7Gv&`R5$QcR=;L=lwV znm;g(|I0&;$0J&Ue&7Dn!&pSXRU@Zc;tZRyXCuo1WKne^gN`jtYVtT<9*DP-*o>Y- zc5bqLe~ssqBzpG5@t%ttze4pkQ*i7eBDR=PM+00P4>0ue_ebxjLFo1Ljxj{av6=le zV2<7BqZs{|!@BX9Zd1UW<-}iN$*LfbtaUN&2xhN-o zlk20EI%-+_3x!YJ_7Rl}`mA>qoS`vhqc`2I_GsvP!m=$wW{kb#Q!~+`-|&4un-2B16~fZ|JTT z1yHlO{K+%Ew`lSQxw7$F8a;Y*>S76T(XUaIR~;=^kF64V z<@3?YrGJ0DT~g8vC^=>C_D>(U4d3tj_+pG1^PyGduuwDR@NllZ>=8-Oui`LTy>jKw#;w0dM+i2*Vt$+r>bbZp!1~<0{$GQijpN~KApos&}gMCQV zR5|!5$qO~G=48uMoAhEmjoy1lOh4?ylEB!gF#Kq!vbwsAsOr-%le``GkckA;RCu|jMky87WoWIdcB9Xohm@2Q zdS|8g=FPG%-_3h7V)J}m#qObbu@km>s%`MMCRY#%IYY(z-G{ioZBT+~DJiB~qPh}2 z3@W#2%z9fL>@Yn#Dhj$Dy^1IRTwUSb5JBHe*HQTrI!p7*>jn+Kx-@Isk+hejo}xyF zwMfdNqoe0s`Zl^Wb5V}Y%b(qC@()>%cv45sJ z;pvav2`9i8Cs{ zKa!u1Yj80+Q|6MPHffuW?L7&FE50pwn;_Id(RXhy-yjg-GiM3{Sch}|B_m>Ioc{Fjc61xKq4_y>Zk%@_Eh_70!mY>QgdXs7vL-weCcOuRPb?x3A z1?u5o`WXNg_`8 zGPI{|uyA%`R{Zm6Lxo5wGNrDu@p(y!{f*7T_IP)&EJ$ZilMH&^y+3gPi8$5nwT;@N zXMo@22&j@lE#Z1Y6t5dynd}HMJ?40oCqw%mLE^QZC2u*v&4JzEmmW2g1SdgXw0XnqW;~x z0XjNj#eOAp>DJfQ^7zPe$0s|j7;)r*|DSpQx3EL=21<=Yj@?i;LNV+c>|>9$&sPwH z1ut9RDxlu5l@v6wbh9CO^lxvG-1DqQ5_#Y{S65^@)+aJE4_m*dZzIeC5L|2FLZ6+) zo%h9Yv$dndJDv}=o?s4LH4;0C%I+HuTdzhh)@d}c3YpBF(LLoPf;J+|=B}WUTJ~t_ z#2KVhR+bi9dQ0yHNb}>pcr^@uFOHq9x#XhDFHt&vAJV|5zjCBU}qt(Myi#T=M#Cz@I6Yo8{bFo9Tv`m3>{W6r0RI+Fo_65NReG!`h*&*%SX z`Cs9b{aPv~+l$A3le-Nd$>zv>u?|e*b+$ihWU-AEVFj1SV+2ZKf{OQqQJ>+BJP#l`fo z9CGe>WKgU%S_u$|&^fxWdB=wZ^XLC*|60sa z?{txdSIU{`F|_xP@#Bd%l_aYo5ssx;fNpDVQ>c$m33b};`>(xKXWIf1fJBDCQL+9! zN)SF^;YEk7EpJ1TlN-1{+n|ajPK+AeO5!EEQGsr&hPV$tRC_aM5yaBqp`2_`NGwSQ=hSGJ5Mz%=VSV|;B z4yYZlAHl3{=FE8@XR{JH=LrQgCKZD%*R-I97s0X?I@ zK(1qC^$0xh)hoZ;o!yFl1(^yX56@O+*)oJcK|FL$q^I+x?mvOBK`a37ZVctPny*6pKTRN6p@I# z#ydgwpPiQkh(yKYs9tjz2h) zWMrry1gD8(#t)Iv;S~95>_9Me{aUM7DkSLD%F6J<8qN!JrGPs81W;t3@N`omzG>31 zgfNP>Ww044AAWLA4_p7saTgvg^N$5c8AVuX#DU2<`C@+-VjTtyL>nRymtpoGJNmb| z9YU0ijg5&R)hSq+y5CHWXCz29eSNuF93%P3yP^)Q6cI-$eYnNm-rq^2pex?|y#TQ; z($dip9QJ;WfqQjUc6R+%=jDr$8b=S;wBMg!#8X}*wDj`epjr8e&=Dan`ekYTeo#06 z%?RNC%$cL`z4+(_5-UQU|*#EF2_Cnu+-Du@7QxDEfQR6&6u)3`BJA129S zz4P}gfsioK#BxM{V_*11jvK*S)9(UKW7#nbu^D`YzaLT-0_v&IwuW-7?%aMZ0etup z4^MFMV#F<@v%$f^T!V%r2YcJAgR0ySvPJGi*)$ZG9&v{G?*8 z9dTK)u86z9H|50*;HU8JSFT?_nx@PzQQ&dMHg^cQ#It9lAr4zVm`mts)M+9T7kawD z(UB=g)Z0&Ta�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 bKE;yi15y)PuM!0;63v-4-|>RI*Y5uVU#8Vi diff --git a/src/Ezfio_files/README.rst b/src/Ezfio_files/README.rst index 90e717bc..6b494339 100644 --- a/src/Ezfio_files/README.rst +++ b/src/Ezfio_files/README.rst @@ -181,6 +181,10 @@ Documentation variable if it is set, or as the 1st argument of the command line. +`ezfio_work_dir `_ + EZFIO/work/ + + `getunitandopen `_ :f: file name @@ -195,6 +199,10 @@ Documentation .br +output_all_singles + Output file for All_singles + + output_ao_basis Output file for AO_Basis @@ -203,12 +211,8 @@ output_bitmask Output file for Bitmask -output_cisd - Output file for CISD - - -output_cisd_selected - Output file for CISD_selected +output_cas_sd + Output file for CAS_SD `output_cpu_time_0 `_ @@ -227,18 +231,22 @@ output_ezfio_files Output file for Ezfio_files -output_fcidump - Output file for FCIdump - - output_full_ci Output file for Full_CI +output_generators_cas + Output file for Generators_CAS + + output_generators_full Output file for Generators_full +output_generators_restart + Output file for Generators_restart + + output_hartree_fock Output file for Hartree_Fock @@ -259,8 +267,12 @@ output_moguess Output file for MOGuess -output_mp2 - Output file for MP2 +output_mrcc_cassd + Output file for MRCC_CASSD + + +output_mrcc_utils + Output file for MRCC_Utils output_nuclei @@ -279,12 +291,20 @@ output_pseudo Output file for Pseudo +output_psiref_cas + Output file for Psiref_CAS + + +output_psiref_utils + Output file for Psiref_Utils + + output_selectors_full Output file for Selectors_full -output_singlerefmethod - Output file for SingleRefMethod +output_selectors_no_sorted + Output file for Selectors_no_sorted output_utils diff --git a/src/Integrals_Bielec/.gitignore b/src/Integrals_Bielec/.gitignore index 1d52a821..aaf8a3d5 100644 --- a/src/Integrals_Bielec/.gitignore +++ b/src/Integrals_Bielec/.gitignore @@ -17,4 +17,6 @@ ZMQ ezfio_interface.irp.f irpf90.make irpf90_entities -tags \ No newline at end of file +qp_ao_ints +tags +test_integrals \ No newline at end of file diff --git a/src/Integrals_Bielec/README.rst b/src/Integrals_Bielec/README.rst index d4471e2a..98fbbb92 100644 --- a/src/Integrals_Bielec/README.rst +++ b/src/Integrals_Bielec/README.rst @@ -88,6 +88,10 @@ Documentation AO integrals +`ao_integrals_threshold `_ + If || < ao_integrals_threshold then is zero + + `ao_l4 `_ Computes the product of l values of i,j,k,and l @@ -120,6 +124,18 @@ Documentation Parallel client for AO integrals +`disk_access_ao_integrals `_ + Read/Write AO integrals from/to disk [ Write | Read | None ] + + +`disk_access_mo_integrals `_ + Read/Write MO integrals from/to disk [ Write | Read | None ] + + +`do_direct_integrals `_ + Compute integrals on the fly + + `dump_ao_integrals `_ Save to disk the $ao integrals @@ -307,6 +323,10 @@ Documentation MO integrals +`mo_integrals_threshold `_ + If || < ao_integrals_threshold then is zero + + `n_pt_max_integrals_16 `_ Aligned n_pt_max_integrals diff --git a/src/Integrals_Monoelec/.gitignore b/src/Integrals_Monoelec/.gitignore index e8bd9b05..577068de 100644 --- a/src/Integrals_Monoelec/.gitignore +++ b/src/Integrals_Monoelec/.gitignore @@ -12,7 +12,9 @@ Makefile.depend Nuclei Pseudo Utils +check_orthonormality ezfio_interface.irp.f irpf90.make irpf90_entities +save_ortho_mos tags \ No newline at end of file diff --git a/src/Integrals_Monoelec/README.rst b/src/Integrals_Monoelec/README.rst index 2f5efd4f..d92cea0a 100644 --- a/src/Integrals_Monoelec/README.rst +++ b/src/Integrals_Monoelec/README.rst @@ -102,20 +102,20 @@ Documentation interaction nuclear electron -`ao_nucl_elec_integral_per_atom `_ +`ao_nucl_elec_integral_per_atom `_ ao_nucl_elec_integral_per_atom(i,j,k) = - where Rk is the geometry of the kth atom `ao_pseudo_integral `_ - Pseudo-potential + Pseudo-potential integrals -`ao_pseudo_integral_local `_ +`ao_pseudo_integral_local `_ Local pseudo-potential -`ao_pseudo_integral_non_local `_ +`ao_pseudo_integral_non_local `_ Local pseudo-potential @@ -153,40 +153,22 @@ Documentation Undocumented -`give_polynom_mult_center_mono_elec `_ +`give_polynom_mult_center_mono_elec `_ Undocumented -`i_x1_pol_mult_mono_elec `_ +`i_x1_pol_mult_mono_elec `_ Undocumented -`i_x2_pol_mult_mono_elec `_ +`i_x2_pol_mult_mono_elec `_ Undocumented -`int_gaus_pol `_ +`int_gaus_pol `_ Undocumented -`mo_deriv_1_x `_ - array of the integrals of MO_i * d/dx MO_j - array of the integrals of MO_i * d/dy MO_j - array of the integrals of MO_i * d/dz MO_j - - -`mo_deriv_1_y `_ - array of the integrals of MO_i * d/dx MO_j - array of the integrals of MO_i * d/dy MO_j - array of the integrals of MO_i * d/dz MO_j - - -`mo_deriv_1_z `_ - array of the integrals of MO_i * d/dx MO_j - array of the integrals of MO_i * d/dy MO_j - array of the integrals of MO_i * d/dz MO_j - - `mo_dipole_x `_ array of the integrals of MO_i * x MO_j array of the integrals of MO_i * y MO_j @@ -206,12 +188,12 @@ Documentation `mo_kinetic_integral `_ - Undocumented + Kinetic energy integrals in the MO basis `mo_mono_elec_integral `_ - array of the mono electronic hamiltonian on the MOs basis - : sum of the kinetic and nuclear electronic potential + array of the mono electronic hamiltonian on the MOs basis : + sum of the kinetic and nuclear electronic potential `mo_nucl_elec_integral `_ @@ -227,25 +209,25 @@ Documentation interaction nuclear electron on the MO basis -`mo_spread_x `_ +`mo_spread_x `_ array of the integrals of MO_i * x^2 MO_j array of the integrals of MO_i * y^2 MO_j array of the integrals of MO_i * z^2 MO_j -`mo_spread_y `_ +`mo_spread_y `_ array of the integrals of MO_i * x^2 MO_j array of the integrals of MO_i * y^2 MO_j array of the integrals of MO_i * z^2 MO_j -`mo_spread_z `_ +`mo_spread_z `_ array of the integrals of MO_i * x^2 MO_j array of the integrals of MO_i * y^2 MO_j array of the integrals of MO_i * z^2 MO_j -`nai_pol_mult `_ +`nai_pol_mult `_ Undocumented @@ -277,27 +259,27 @@ Documentation Undocumented -`pseudo_dz_k_transp `_ +`pseudo_dz_k_transp `_ Transposed arrays for pseudopotentials -`pseudo_dz_kl_transp `_ +`pseudo_dz_kl_transp `_ Transposed arrays for pseudopotentials -`pseudo_n_k_transp `_ +`pseudo_n_k_transp `_ Transposed arrays for pseudopotentials -`pseudo_n_kl_transp `_ +`pseudo_n_kl_transp `_ Transposed arrays for pseudopotentials -`pseudo_v_k_transp `_ +`pseudo_v_k_transp `_ Transposed arrays for pseudopotentials -`pseudo_v_kl_transp `_ +`pseudo_v_kl_transp `_ Transposed arrays for pseudopotentials @@ -317,23 +299,23 @@ Documentation Undocumented -`v_e_n `_ +`v_e_n `_ Undocumented -`v_phi `_ +`v_phi `_ Undocumented -`v_r `_ +`v_r `_ Undocumented -`v_theta `_ +`v_theta `_ Undocumented -`wallis `_ +`wallis `_ Undocumented diff --git a/src/MOGuess/.gitignore b/src/MOGuess/.gitignore index 797574f4..a912636d 100644 --- a/src/MOGuess/.gitignore +++ b/src/MOGuess/.gitignore @@ -4,6 +4,7 @@ AO_Basis Electrons Ezfio_files +H_CORE_guess IRPF90_man IRPF90_temp Integrals_Monoelec diff --git a/src/MOGuess/README.rst b/src/MOGuess/README.rst index 06a21370..3fca60c0 100644 --- a/src/MOGuess/README.rst +++ b/src/MOGuess/README.rst @@ -28,7 +28,11 @@ Documentation .. by the `update_README.py` script. -`ao_ortho_lowdin_coef `_ +`ao_ortho_canonical_nucl_elec_integral `_ + Undocumented + + +`ao_ortho_lowdin_coef `_ matrix of the coefficients of the mos generated by the orthonormalization by the S^{-1/2} canonical transformation of the aos ao_ortho_lowdin_coef(i,j) = coefficient of the ith ao on the jth ao_ortho_lowdin orbital @@ -38,15 +42,11 @@ Documentation Undocumented -`ao_ortho_lowdin_overlap `_ +`ao_ortho_lowdin_overlap `_ overlap matrix of the ao_ortho_lowdin supposed to be the Identity -`guess_mimi `_ - Produce `H_core` MO orbital - - `h_core_guess `_ Produce `H_core` MO orbital output: mo_basis.mo_tot_num mo_basis.mo_label mo_basis.ao_md5 mo_basis.mo_coef mo_basis.mo_occ @@ -55,7 +55,3 @@ Documentation `hcore_guess `_ Produce `H_core` MO orbital - -`prog_truncate_mo `_ - Truncate MO set - diff --git a/src/MO_Basis/.gitignore b/src/MO_Basis/.gitignore index 8eb04d30..110e93f9 100644 --- a/src/MO_Basis/.gitignore +++ b/src/MO_Basis/.gitignore @@ -1,17 +1,17 @@ -# Automatically created by /home/razoa/quantum_package/scripts/module/module_handler.py -IRPF90_temp -IRPF90_man -irpf90_entities -tags -irpf90.make -Makefile -Makefile.depend -build.ninja -.ninja_log +# Automatically created by $QP_ROOT/scripts/module/module_handler.py .ninja_deps -ezfio_interface.irp.f -Utils -Nuclei +.ninja_log AO_Basis Electrons -Ezfio_files \ No newline at end of file +Ezfio_files +IRPF90_man +IRPF90_temp +Makefile +Makefile.depend +Nuclei +Utils +ezfio_interface.irp.f +irpf90.make +irpf90_entities +swap_mos +tags \ No newline at end of file diff --git a/src/MO_Basis/README.rst b/src/MO_Basis/README.rst index afc6008b..aa99670b 100644 --- a/src/MO_Basis/README.rst +++ b/src/MO_Basis/README.rst @@ -58,7 +58,44 @@ Documentation .. by the `update_README.py` script. -`ao_to_mo `_ +`ao_cart_to_sphe_coef `_ + matrix of the coefficients of the mos generated by the + orthonormalization by the S^{-1/2} canonical transformation of the aos + ao_cart_to_sphe_coef(i,j) = coefficient of the ith ao on the jth ao_ortho_canonical orbital + + +`ao_cart_to_sphe_inv `_ + AO_cart_to_sphe_coef^(-1) + + +`ao_cart_to_sphe_num `_ + matrix of the coefficients of the mos generated by the + orthonormalization by the S^{-1/2} canonical transformation of the aos + ao_cart_to_sphe_coef(i,j) = coefficient of the ith ao on the jth ao_ortho_canonical orbital + + +`ao_cart_to_sphe_overlap `_ + AO overlap matrix in the spherical basis set + + +`ao_ortho_canonical_coef `_ + matrix of the coefficients of the mos generated by the + orthonormalization by the S^{-1/2} canonical transformation of the aos + ao_ortho_canonical_coef(i,j) = coefficient of the ith ao on the jth ao_ortho_canonical orbital + + +`ao_ortho_canonical_num `_ + matrix of the coefficients of the mos generated by the + orthonormalization by the S^{-1/2} canonical transformation of the aos + ao_ortho_canonical_coef(i,j) = coefficient of the ith ao on the jth ao_ortho_canonical orbital + + +`ao_ortho_canonical_overlap `_ + overlap matrix of the ao_ortho_canonical. + Expected to be the Identity + + +`ao_to_mo `_ Transform A from the AO basis to the MO basis @@ -67,7 +104,7 @@ Documentation generate MOs -`mix_mo_jk `_ +`mix_mo_jk `_ subroutine that rotates the jth MO with the kth MO to give two new MO's that are '+' = 1/sqrt(2) (|j> + |k>) @@ -80,17 +117,21 @@ Documentation Undocumented -`mo_as_eigvectors_of_mo_matrix_sort_by_observable `_ +`mo_as_eigvectors_of_mo_matrix_sort_by_observable `_ Undocumented -`mo_coef `_ +`mo_as_svd_vectors_of_mo_matrix `_ + Undocumented + + +`mo_coef `_ Molecular orbital coefficients on AO basis set mo_coef(i,j) = coefficient of the ith ao on the jth mo mo_label : Label characterizing the MOS (local, canonical, natural, etc) -`mo_coef_transp `_ +`mo_coef_transp `_ Molecular orbital coefficients on AO basis set @@ -102,13 +143,13 @@ Documentation Density matrix in MO basis (virtual MOs) -`mo_label `_ +`mo_label `_ Molecular orbital coefficients on AO basis set mo_coef(i,j) = coefficient of the ith ao on the jth mo mo_label : Label characterizing the MOS (local, canonical, natural, etc) -`mo_occ `_ +`mo_occ `_ MO occupation numbers @@ -116,15 +157,15 @@ Documentation Undocumented -`mo_sort_by_observable `_ +`mo_sort_by_observable `_ Undocumented -`mo_to_ao `_ +`mo_to_ao `_ Transform A from the MO basis to the AO basis -`mo_to_ao_no_overlap `_ +`mo_to_ao_no_overlap `_ Transform A from the MO basis to the S^-1 AO basis @@ -132,11 +173,11 @@ Documentation Total number of molecular orbitals and the size of the keys corresponding -`mo_tot_num_align `_ +`mo_tot_num_align `_ Aligned variable for dimensioning of arrays -`s_mo_coef `_ +`s_mo_coef `_ Product S.C where S is the overlap matrix in the AO basis and C the mo_coef matrix. @@ -147,3 +188,7 @@ Documentation `save_mos_truncated `_ Undocumented + +`swap_mos `_ + Undocumented + diff --git a/src/Pseudo/README.rst b/src/Pseudo/README.rst index cba187aa..2b3f87dd 100644 --- a/src/Pseudo/README.rst +++ b/src/Pseudo/README.rst @@ -28,15 +28,19 @@ Documentation .. by the `update_README.py` script. -`do_pseudo `_ +`do_pseudo `_ Using pseudo potential integral or not -`pseudo_dz_k `_ +`nucl_charge_remove `_ + Nuclear charges removed + + +`pseudo_dz_k `_ test -`pseudo_dz_kl `_ +`pseudo_dz_kl `_ test @@ -44,23 +48,23 @@ Documentation R_maxof the QMC grid -`pseudo_grid_size `_ +`pseudo_grid_size `_ Nb of points of the QMC grid -`pseudo_klocmax `_ +`pseudo_klocmax `_ test -`pseudo_kmax `_ +`pseudo_kmax `_ test -`pseudo_lmax `_ +`pseudo_lmax `_ test -`pseudo_n_k `_ +`pseudo_n_k `_ test @@ -68,10 +72,10 @@ Documentation test -`pseudo_v_k `_ +`pseudo_v_k `_ test -`pseudo_v_kl `_ +`pseudo_v_kl `_ test diff --git a/src/Utils/README.rst b/src/Utils/README.rst index ecd5db56..03ec80f5 100644 --- a/src/Utils/README.rst +++ b/src/Utils/README.rst @@ -14,14 +14,6 @@ Documentation 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)) @@ -36,11 +28,11 @@ Documentation Compute 1st dimension such that it is aligned for vectorization. -`apply_rotation `_ +`apply_rotation `_ Apply the rotation found by find_rotation -`approx_dble `_ +`approx_dble `_ Undocumented @@ -63,10 +55,6 @@ Documentation Binomial coefficients -`catch_signal `_ - What to do on Ctrl-C. If two Ctrl-C are pressed within 1 sec, the calculation if aborted. - - `dble_fact `_ Undocumented @@ -122,7 +110,7 @@ Documentation 1/n! -`find_rotation `_ +`find_rotation `_ Find A.C = B @@ -148,7 +136,7 @@ Documentation Undocumented -`get_pseudo_inverse `_ +`get_pseudo_inverse `_ Find C = A^-1 @@ -257,7 +245,7 @@ Documentation Hermite polynomial -`i2radix_sort `_ +`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. @@ -282,14 +270,14 @@ Documentation contains the new order of the elements. -`i8radix_sort `_ +`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 `_ +`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. @@ -388,14 +376,14 @@ Documentation 1/i -`iradix_sort `_ +`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 `_ +`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. @@ -420,7 +408,7 @@ Documentation contains the new order of the elements. -`lapack_diag `_ +`lapack_diag `_ Diagonalize matrix H .br H is untouched between input and ouptut @@ -431,7 +419,7 @@ Documentation .br -`lapack_diag_s2 `_ +`lapack_diag_s2 `_ Diagonalize matrix H .br H is untouched between input and ouptut @@ -442,7 +430,7 @@ Documentation .br -`lapack_diagd `_ +`lapack_diagd `_ Diagonalize matrix H .br H is untouched between input and ouptut @@ -453,7 +441,7 @@ Documentation .br -`lapack_partial_diag `_ +`lapack_partial_diag `_ Diagonalize matrix H .br H is untouched between input and ouptut @@ -468,12 +456,16 @@ Documentation n! +`lowercase `_ + Transform to lower case + + `multiply_poly `_ Multiply two polynomials D(t) =! D(t) +( B(t)*C(t)) -`normalize `_ +`normalize `_ Normalizes vector u u is expected to be aligned in memory. @@ -482,8 +474,26 @@ Documentation Number of current OpenMP threads -`ortho_lowdin `_ - Compute C_new=C_old.S^-1/2 canonical orthogonalization. +`ortho_canonical `_ + Compute C_new=C_old.U.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 + + +`ortho_lowdin `_ + Compute C_new=C_old.S^-1/2 orthogonalization. .br overlap : overlap matrix .br @@ -597,7 +607,7 @@ Documentation to be in integer*8 format -`set_zero_extra_diag `_ +`set_zero_extra_diag `_ Undocumented @@ -624,11 +634,7 @@ Documentation .br -`trap_signals `_ - What to do when a signal is caught. Here, trap Ctrl-C and call the control_C subroutine. - - -`u_dot_u `_ +`u_dot_u `_ Compute diff --git a/src/ZMQ/README.rst b/src/ZMQ/README.rst index f189ce24..187af23e 100644 --- a/src/ZMQ/README.rst +++ b/src/ZMQ/README.rst @@ -5,38 +5,134 @@ ZMQ Socket address : defined as an environment variable : QP_RUN_ADDRESS +Needed Modules +============== +.. Do not edit this section It was auto-generated +.. by the `update_README.py` script. + + +.. image:: tree_dependency.png + +* `Utils `_ + Documentation ============= .. Do not edit this section It was auto-generated .. by the `update_README.py` script. -`qp_run_address `_ +`add_task_to_taskserver `_ + Get a task from the task server + + +`connect_to_taskserver `_ + Connect to the task server and obtain the worker ID + + +`disconnect_from_taskserver `_ + Disconnect from the task server + + +`end_parallel_job `_ + End a new parallel job with name 'name'. The slave tasks execute subroutine 'slave' + + +`end_zmq_pair_socket `_ + Terminate socket on which the results are sent. + + +`end_zmq_pull_socket `_ + Terminate socket on which the results are sent. + + +`end_zmq_push_socket `_ + Terminate socket on which the results are sent. + + +`end_zmq_to_qp_run_socket `_ + Terminate the socket from the application to qp_run + + +`get_task_from_taskserver `_ + Get a task from the task server + + +`new_parallel_job `_ + Start a new parallel job with name 'name'. The slave tasks execute subroutine 'slave' + + +`new_zmq_pair_socket `_ + Socket on which the collector and the main communicate + + +`new_zmq_pull_socket `_ + Socket on which the results are sent. If thread is 1, use inproc + + +`new_zmq_push_socket `_ + Socket on which the results are sent. If thread is 1, use inproc + + +`new_zmq_to_qp_run_socket `_ + Socket on which the qp_run process replies + + +`qp_run_address `_ Address of the qp_run socket Example : tcp://130.120.229.139:12345 -`zmq_context `_ - Context for the ZeroMQ library - - -`zmq_port `_ +`reset_zmq_addresses `_ Undocumented -`zmq_port_start `_ +`switch_qp_run_to_master `_ + Address of the master qp_run socket + Example : tcp://130.120.229.139:12345 + + +`task_done_to_taskserver `_ + Get a task from the task server + + +`zmq_context `_ + Context for the ZeroMQ library + + +`zmq_delete_task `_ + When a task is done, it has to be removed from the list of tasks on the qp_run + queue. This guarantees that the results have been received in the pull. + + +`zmq_port `_ + Return the value of the ZMQ port from the corresponding integer + + +`zmq_port_start `_ Address of the qp_run socket Example : tcp://130.120.229.139:12345 -`zmq_socket_pull `_ +`zmq_socket_pair_inproc_address `_ Socket which pulls the results (2) -`zmq_socket_push `_ - Socket on which to push the results (1) +`zmq_socket_pull_inproc_address `_ + Socket which pulls the results (2) -`zmq_to_qp_run_socket `_ - Socket on which the qp_run process replies +`zmq_socket_pull_tcp_address `_ + Socket which pulls the results (2) + + +`zmq_socket_push_inproc_address `_ + Socket which pulls the results (2) + + +`zmq_socket_push_tcp_address `_ + Socket which pulls the results (2) + + +`zmq_state `_ + Threads executing work through the ZeroMQ interface From 69a60559ebb3942f856616a6f9ef386189421712 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 22 Sep 2016 12:28:12 +0200 Subject: [PATCH 117/216] Bug with gfortran --- src/Integrals_Monoelec/kin_mo_ints.irp.f | 2 +- src/Integrals_Monoelec/pot_mo_ints.irp.f | 4 ++-- src/Integrals_Monoelec/pot_mo_pseudo_ints.irp.f | 2 +- src/Integrals_Monoelec/spread_dipole_mo.irp.f | 12 ++++++------ 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Integrals_Monoelec/kin_mo_ints.irp.f b/src/Integrals_Monoelec/kin_mo_ints.irp.f index 2cd00376..2301c23d 100644 --- a/src/Integrals_Monoelec/kin_mo_ints.irp.f +++ b/src/Integrals_Monoelec/kin_mo_ints.irp.f @@ -13,7 +13,7 @@ BEGIN_PROVIDER [double precision, mo_kinetic_integral, (mo_tot_num_align,mo_tot_ ao_kinetic_integral, & size(ao_kinetic_integral,1), & mo_kinetic_integral, & - size(mo_kinetic_integral,1), & + size(mo_kinetic_integral,1) & ) endif if (write_mo_one_integrals) then diff --git a/src/Integrals_Monoelec/pot_mo_ints.irp.f b/src/Integrals_Monoelec/pot_mo_ints.irp.f index 27be6906..6798b509 100644 --- a/src/Integrals_Monoelec/pot_mo_ints.irp.f +++ b/src/Integrals_Monoelec/pot_mo_ints.irp.f @@ -15,7 +15,7 @@ BEGIN_PROVIDER [double precision, mo_nucl_elec_integral, (mo_tot_num_align,mo_to ao_nucl_elec_integral, & size(ao_nucl_elec_integral,1), & mo_nucl_elec_integral, & - size(mo_nucl_elec_integral,1), & + size(mo_nucl_elec_integral,1) & ) endif if (write_mo_one_integrals) then @@ -42,7 +42,7 @@ BEGIN_PROVIDER [double precision, mo_nucl_elec_integral_per_atom, (mo_tot_num_al ao_nucl_elec_integral_per_atom(1,1,k), & size(ao_nucl_elec_integral_per_atom,1), & mo_nucl_elec_integral_per_atom(1,1,k), & - size(mo_nucl_elec_integral_per_atom,1), & + size(mo_nucl_elec_integral_per_atom,1) & ) enddo END_PROVIDER diff --git a/src/Integrals_Monoelec/pot_mo_pseudo_ints.irp.f b/src/Integrals_Monoelec/pot_mo_pseudo_ints.irp.f index 9553aa6d..f2fee5f4 100644 --- a/src/Integrals_Monoelec/pot_mo_pseudo_ints.irp.f +++ b/src/Integrals_Monoelec/pot_mo_pseudo_ints.irp.f @@ -13,7 +13,7 @@ BEGIN_PROVIDER [double precision, mo_pseudo_integral, (mo_tot_num_align,mo_tot_n ao_pseudo_integral, & size(ao_pseudo_integral,1), & mo_pseudo_integral, & - size(mo_pseudo_integral,1), & + size(mo_pseudo_integral,1) & ) endif if (write_mo_one_integrals) then diff --git a/src/Integrals_Monoelec/spread_dipole_mo.irp.f b/src/Integrals_Monoelec/spread_dipole_mo.irp.f index da91bee5..aa5ef8aa 100644 --- a/src/Integrals_Monoelec/spread_dipole_mo.irp.f +++ b/src/Integrals_Monoelec/spread_dipole_mo.irp.f @@ -12,19 +12,19 @@ ao_dipole_x, & size(ao_dipole_x,1), & mo_dipole_x, & - size(mo_dipole_x,1), & + size(mo_dipole_x,1) & ) call ao_to_mo( & ao_dipole_y, & size(ao_dipole_y,1), & mo_dipole_y, & - size(mo_dipole_y,1), & + size(mo_dipole_y,1) & ) call ao_to_mo( & ao_dipole_z, & size(ao_dipole_z,1), & mo_dipole_z, & - size(mo_dipole_z,1), & + size(mo_dipole_z,1) & ) END_PROVIDER @@ -42,19 +42,19 @@ END_PROVIDER ao_spread_x, & size(ao_spread_x,1), & mo_spread_x, & - size(mo_spread_x,1), & + size(mo_spread_x,1) & ) call ao_to_mo( & ao_spread_y, & size(ao_spread_y,1), & mo_spread_y, & - size(mo_spread_y,1), & + size(mo_spread_y,1) & ) call ao_to_mo( & ao_spread_z, & size(ao_spread_z,1), & mo_spread_z, & - size(mo_spread_z,1), & + size(mo_spread_z,1) & ) END_PROVIDER From 2d8b3f75f33a1463e58caeec0ccec5ac15e7bf87 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 22 Sep 2016 12:45:27 +0200 Subject: [PATCH 118/216] Bug --- src/Integrals_Monoelec/pot_mo_ints.irp.f | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Integrals_Monoelec/pot_mo_ints.irp.f b/src/Integrals_Monoelec/pot_mo_ints.irp.f index b6a024e9..7c7e306f 100644 --- a/src/Integrals_Monoelec/pot_mo_ints.irp.f +++ b/src/Integrals_Monoelec/pot_mo_ints.irp.f @@ -32,6 +32,7 @@ BEGIN_PROVIDER [double precision, mo_nucl_elec_integral_per_atom, (mo_tot_num_al ! where Rk is the geometry of the kth atom END_DOC + integer :: k mo_nucl_elec_integral_per_atom = 0.d0 do k = 1, nucl_num call ao_to_mo( & From 402a16fbd4b54768b7857978bd2ff92a8eedb9a3 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 22 Sep 2016 16:26:54 +0200 Subject: [PATCH 119/216] moved psi_energy --- src/Davidson/u0Hu0.irp.f | 7 +++++++ src/Determinants/slater_rules.irp.f | 7 ------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 0fd7e52e..a298f61c 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -187,4 +187,11 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) deallocate (shortcut, sort_idx, sorted, version) end +BEGIN_PROVIDER [ double precision, psi_energy, (N_states) ] + implicit none + BEGIN_DOC +! Energy of the current wave function + END_DOC + call u_0_H_u_0_nstates(psi_energy,psi_coef,N_det,psi_det,N_int,N_states,psi_det_size) +END_PROVIDER diff --git a/src/Determinants/slater_rules.irp.f b/src/Determinants/slater_rules.irp.f index ab70fe34..6acae282 100644 --- a/src/Determinants/slater_rules.irp.f +++ b/src/Determinants/slater_rules.irp.f @@ -1747,10 +1747,3 @@ subroutine get_phase(key1,key2,phase,Nint) call get_excitation(key1, key2, exc, degree, phase, Nint) end -BEGIN_PROVIDER [ double precision, psi_energy, (N_states) ] - implicit none - BEGIN_DOC -! Energy of the current wave function - END_DOC - call u_0_H_u_0_nstates(psi_energy,psi_coef,N_det,psi_det,N_int,N_states,psi_det_size) -END_PROVIDER From 1746a14717b3fcce6d7582c77132661ec3f99637 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 22 Sep 2016 21:52:25 +0200 Subject: [PATCH 120/216] Compiles with gfortran --- plugins/Full_CI_ZMQ/selection_slave.irp.f | 2 +- plugins/MRCC_Utils/davidson.irp.f | 34 ----- src/Davidson/u0Hu0.irp.f | 16 --- src/Determinants/guess_lowest_state.irp.f | 162 ---------------------- src/Determinants/s2.irp.f | 16 --- 5 files changed, 1 insertion(+), 229 deletions(-) delete mode 100644 src/Determinants/guess_lowest_state.irp.f diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index 438892d3..c3514565 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -63,7 +63,7 @@ subroutine update_energy(energy) CI_eigenvectors(k,j) = psi_coef(k,j) enddo enddo - call u_0_S2_u_0(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int) + call u_0_S2_u_0_nstates(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int) if (.True.) then do k=1,size(ci_electronic_energy) ci_electronic_energy(k) = energy(k) diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index ece34dee..713b3f61 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -377,22 +377,6 @@ subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nin end -subroutine u_0_H_u_0_mrcc(e_0,u_0,n,keys_tmp,Nint,istate) - use bitmasks - implicit none - BEGIN_DOC - ! Computes e_0 = / - ! - ! n : number of determinants - ! - END_DOC - integer, intent(in) :: n,Nint,istate - double precision, intent(out) :: e_0 - double precision, intent(in) :: u_0(n) - integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - call u_0_H_u_0_mrcc_nstates(e_0,u_0,n,keys_tmp,Nint,1,n,istate) -end - subroutine u_0_H_u_0_mrcc_nstates(e_0,u_0,n,keys_tmp,Nint,istate,N_st,sze_8) use bitmasks implicit none @@ -428,24 +412,6 @@ subroutine u_0_H_u_0_mrcc_nstates(e_0,u_0,n,keys_tmp,Nint,istate,N_st,sze_8) end -subroutine H_u_0_mrcc(v_0,u_0,H_jj,n,keys_tmp,Nint,istate_in) - use bitmasks - implicit none - BEGIN_DOC - ! Computes v_0 = H|u_0> - ! - ! n : number of determinants - ! - ! H_jj : array of - END_DOC - integer, intent(in) :: n,Nint,istate_in - double precision, intent(out) :: v_0(n) - double precision, intent(in) :: u_0(n) - double precision, intent(in) :: H_jj(n) - integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - call H_u_0_mrcc_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,1,n) -end - subroutine H_u_0_mrcc_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,istate_in,N_st,sze_8) use bitmasks implicit none diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index a298f61c..f871f5f0 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -1,19 +1,3 @@ -subroutine u_0_H_u_0(e_0,u_0,n,keys_tmp,Nint) - use bitmasks - implicit none - BEGIN_DOC - ! Computes e_0 = / - ! - ! n : number of determinants - ! - END_DOC - integer, intent(in) :: n,Nint - double precision, intent(out) :: e_0 - double precision, intent(in) :: u_0(n) - integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - call u_0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,1,n) -end - subroutine u_0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) use bitmasks implicit none diff --git a/src/Determinants/guess_lowest_state.irp.f b/src/Determinants/guess_lowest_state.irp.f deleted file mode 100644 index f6d0a004..00000000 --- a/src/Determinants/guess_lowest_state.irp.f +++ /dev/null @@ -1,162 +0,0 @@ -program first_guess - use bitmasks - implicit none - BEGIN_DOC - ! Select all the determinants with the lowest energy as a starting point. - END_DOC - integer :: i,j - double precision, allocatable :: orb_energy(:) - double precision :: E - integer, allocatable :: kept(:) - integer :: nelec_kept(2) - character :: occ_char, keep_char - - PROVIDE H_apply_buffer_allocated psi_det - allocate (orb_energy(mo_tot_num), kept(0:mo_tot_num)) - nelec_kept(1:2) = 0 - kept(0) = 0 - - print *, 'Orbital energies' - print *, '================' - print *, '' - do i=1,mo_tot_num - keep_char = ' ' - occ_char = '-' - orb_energy(i) = mo_mono_elec_integral(i,i) - do j=1,elec_beta_num - if (i==j) cycle - orb_energy(i) += mo_bielec_integral_jj_anti(i,j) - enddo - do j=1,elec_alpha_num - orb_energy(i) += mo_bielec_integral_jj(i,j) - enddo - if ( (orb_energy(i) > -.5d0).and.(orb_energy(i) < .1d0) ) then - kept(0) += 1 - keep_char = 'X' - kept( kept(0) ) = i - if (i <= elec_beta_num) then - nelec_kept(2) += 1 - endif - if (i <= elec_alpha_num) then - nelec_kept(1) += 1 - endif - endif - if (i <= elec_alpha_num) then - if (i <= elec_beta_num) then - occ_char = '#' - else - occ_char = '+' - endif - endif - print '(I4, 3X, A, 3X, F10.6, 3X, A)', i, occ_char, orb_energy(i), keep_char - enddo - - - integer, allocatable :: list (:,:) - integer(bit_kind), allocatable :: string(:,:) - allocate ( list(N_int*bit_kind_size,2), string(N_int,2) ) - - string = ref_bitmask - call bitstring_to_list( string(1,1), list(1,1), elec_alpha_num, N_int) - call bitstring_to_list( string(1,2), list(1,2), elec_beta_num , N_int) - - psi_det_alpha_unique(:,1) = string(:,1) - psi_det_beta_unique (:,1) = string(:,2) - N_det_alpha_unique = 1 - N_det_beta_unique = 1 - - integer :: i1,i2,i3,i4,i5,i6,i7,i8,i9 - - psi_det_size = kept(0)**(nelec_kept(1)+nelec_kept(2)) - print *, kept(0), nelec_kept(:) - call write_int(6,psi_det_size,'psi_det_size') - TOUCH psi_det_size - -BEGIN_SHELL [ /usr/bin/python ] - -template_alpha_ext = """ -do %(i2)s = %(i1)s-1,1,-1 - list(elec_alpha_num-%(i)d,1) = kept(%(i2)s) - call list_to_bitstring( string(1,1), list(1,1), elec_alpha_num, N_int) -""" - -template_alpha = """ -do %(i2)s = %(i1)s-1,1,-1 - list(elec_alpha_num-%(i)d,1) = kept(%(i2)s) - call list_to_bitstring( string(1,1), list(1,1), elec_alpha_num, N_int) - N_det_alpha_unique += 1 - psi_det_alpha_unique(:,N_det_alpha_unique) = string(:,1) -""" - -template_beta_ext = """ -do %(i2)s = %(i1)s-1,1,-1 - list(elec_beta_num-%(i)d,2) = kept(%(i2)s) - call list_to_bitstring( string(1,2), list(1,2), elec_beta_num, N_int) -""" -template_beta = """ -do %(i2)s = %(i1)s-1,1,-1 - list(elec_beta_num-%(i)d,2) = kept(%(i2)s) - call list_to_bitstring( string(1,2), list(1,2), elec_beta_num, N_int) - N_det_beta_unique += 1 - psi_det_beta_unique(:,N_det_beta_unique) = string(:,2) -""" - -def write(template_ext,template,imax): - print "case(%d)"%(imax) - def aux(i2,i1,i,j): - if (i==imax-1): - print template%locals() - else: - print template_ext%locals() - i += 1 - j -= 1 - if (i != imax): - i1 = "i%d"%(i) - i2 = "i%d"%(i+1) - aux(i2,i1,i,j) - print "enddo" - - i2 = "i1" - i1 = "kept(0)+1" - i = 0 - aux(i2,i1,i,imax) - -def main(): - print """ - select case (nelec_kept(1)) - case(0) - continue - """ - for imax in range(1,10): - write(template_alpha_ext,template_alpha,imax) - - print """ - end select - - select case (nelec_kept(2)) - case(0) - continue - """ - for imax in range(1,10): - write(template_beta_ext,template_beta,imax) - print "end select" - -main() - -END_SHELL - - TOUCH N_det_alpha_unique N_det_beta_unique psi_det_alpha_unique psi_det_beta_unique - call create_wf_of_psi_bilinear_matrix(.False.) - call diagonalize_ci - j= N_det - do i=1,N_det - if (psi_average_norm_contrib_sorted(i) < 1.d-6) then - j = i-1 - exit - endif -! call debug_det(psi_det_sorted(1,1,i),N_int) - enddo - call save_wavefunction_general(j,N_states,psi_det_sorted,size(psi_coef_sorted,1),psi_coef_sorted) - - deallocate(orb_energy, kept, list, string) -end diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index 3d3eda0b..ca7a0590 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -75,22 +75,6 @@ END_PROVIDER -subroutine u_0_S2_u_0(e_0,u_0,n,keys_tmp,Nint) - use bitmasks - implicit none - BEGIN_DOC - ! Computes e_0 = / - ! - ! n : number of determinants - ! - END_DOC - integer, intent(in) :: n,Nint - double precision, intent(out) :: e_0 - double precision, intent(in) :: u_0(n) - integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - call u_0_S2_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,1,n) -end - subroutine u_0_S2_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) use bitmasks implicit none From 605e8743f90459f78cf72efd471f552ad52991f6 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 22 Sep 2016 22:16:14 +0200 Subject: [PATCH 121/216] Added missing file --- src/Davidson/NEEDED_CHILDREN_MODULES | 1 + src/Davidson/guess_lowest_state.irp.f | 162 ++++++++++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100644 src/Davidson/NEEDED_CHILDREN_MODULES create mode 100644 src/Davidson/guess_lowest_state.irp.f diff --git a/src/Davidson/NEEDED_CHILDREN_MODULES b/src/Davidson/NEEDED_CHILDREN_MODULES new file mode 100644 index 00000000..aae89501 --- /dev/null +++ b/src/Davidson/NEEDED_CHILDREN_MODULES @@ -0,0 +1 @@ +Determinants diff --git a/src/Davidson/guess_lowest_state.irp.f b/src/Davidson/guess_lowest_state.irp.f new file mode 100644 index 00000000..f6d0a004 --- /dev/null +++ b/src/Davidson/guess_lowest_state.irp.f @@ -0,0 +1,162 @@ +program first_guess + use bitmasks + implicit none + BEGIN_DOC + ! Select all the determinants with the lowest energy as a starting point. + END_DOC + integer :: i,j + double precision, allocatable :: orb_energy(:) + double precision :: E + integer, allocatable :: kept(:) + integer :: nelec_kept(2) + character :: occ_char, keep_char + + PROVIDE H_apply_buffer_allocated psi_det + allocate (orb_energy(mo_tot_num), kept(0:mo_tot_num)) + nelec_kept(1:2) = 0 + kept(0) = 0 + + print *, 'Orbital energies' + print *, '================' + print *, '' + do i=1,mo_tot_num + keep_char = ' ' + occ_char = '-' + orb_energy(i) = mo_mono_elec_integral(i,i) + do j=1,elec_beta_num + if (i==j) cycle + orb_energy(i) += mo_bielec_integral_jj_anti(i,j) + enddo + do j=1,elec_alpha_num + orb_energy(i) += mo_bielec_integral_jj(i,j) + enddo + if ( (orb_energy(i) > -.5d0).and.(orb_energy(i) < .1d0) ) then + kept(0) += 1 + keep_char = 'X' + kept( kept(0) ) = i + if (i <= elec_beta_num) then + nelec_kept(2) += 1 + endif + if (i <= elec_alpha_num) then + nelec_kept(1) += 1 + endif + endif + if (i <= elec_alpha_num) then + if (i <= elec_beta_num) then + occ_char = '#' + else + occ_char = '+' + endif + endif + print '(I4, 3X, A, 3X, F10.6, 3X, A)', i, occ_char, orb_energy(i), keep_char + enddo + + + integer, allocatable :: list (:,:) + integer(bit_kind), allocatable :: string(:,:) + allocate ( list(N_int*bit_kind_size,2), string(N_int,2) ) + + string = ref_bitmask + call bitstring_to_list( string(1,1), list(1,1), elec_alpha_num, N_int) + call bitstring_to_list( string(1,2), list(1,2), elec_beta_num , N_int) + + psi_det_alpha_unique(:,1) = string(:,1) + psi_det_beta_unique (:,1) = string(:,2) + N_det_alpha_unique = 1 + N_det_beta_unique = 1 + + integer :: i1,i2,i3,i4,i5,i6,i7,i8,i9 + + psi_det_size = kept(0)**(nelec_kept(1)+nelec_kept(2)) + print *, kept(0), nelec_kept(:) + call write_int(6,psi_det_size,'psi_det_size') + TOUCH psi_det_size + +BEGIN_SHELL [ /usr/bin/python ] + +template_alpha_ext = """ +do %(i2)s = %(i1)s-1,1,-1 + list(elec_alpha_num-%(i)d,1) = kept(%(i2)s) + call list_to_bitstring( string(1,1), list(1,1), elec_alpha_num, N_int) +""" + +template_alpha = """ +do %(i2)s = %(i1)s-1,1,-1 + list(elec_alpha_num-%(i)d,1) = kept(%(i2)s) + call list_to_bitstring( string(1,1), list(1,1), elec_alpha_num, N_int) + N_det_alpha_unique += 1 + psi_det_alpha_unique(:,N_det_alpha_unique) = string(:,1) +""" + +template_beta_ext = """ +do %(i2)s = %(i1)s-1,1,-1 + list(elec_beta_num-%(i)d,2) = kept(%(i2)s) + call list_to_bitstring( string(1,2), list(1,2), elec_beta_num, N_int) +""" +template_beta = """ +do %(i2)s = %(i1)s-1,1,-1 + list(elec_beta_num-%(i)d,2) = kept(%(i2)s) + call list_to_bitstring( string(1,2), list(1,2), elec_beta_num, N_int) + N_det_beta_unique += 1 + psi_det_beta_unique(:,N_det_beta_unique) = string(:,2) +""" + +def write(template_ext,template,imax): + print "case(%d)"%(imax) + def aux(i2,i1,i,j): + if (i==imax-1): + print template%locals() + else: + print template_ext%locals() + i += 1 + j -= 1 + if (i != imax): + i1 = "i%d"%(i) + i2 = "i%d"%(i+1) + aux(i2,i1,i,j) + print "enddo" + + i2 = "i1" + i1 = "kept(0)+1" + i = 0 + aux(i2,i1,i,imax) + +def main(): + print """ + select case (nelec_kept(1)) + case(0) + continue + """ + for imax in range(1,10): + write(template_alpha_ext,template_alpha,imax) + + print """ + end select + + select case (nelec_kept(2)) + case(0) + continue + """ + for imax in range(1,10): + write(template_beta_ext,template_beta,imax) + print "end select" + +main() + +END_SHELL + + TOUCH N_det_alpha_unique N_det_beta_unique psi_det_alpha_unique psi_det_beta_unique + call create_wf_of_psi_bilinear_matrix(.False.) + call diagonalize_ci + j= N_det + do i=1,N_det + if (psi_average_norm_contrib_sorted(i) < 1.d-6) then + j = i-1 + exit + endif +! call debug_det(psi_det_sorted(1,1,i),N_int) + enddo + call save_wavefunction_general(j,N_states,psi_det_sorted,size(psi_coef_sorted,1),psi_coef_sorted) + + deallocate(orb_energy, kept, list, string) +end From 8ca37e49cfbc6eb1007f44a14dad323773c9edec Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 22 Sep 2016 23:15:21 +0200 Subject: [PATCH 122/216] Added tool to compute the overlap between wf --- ocaml/qp_overlap_of_wf.ml | 67 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 ocaml/qp_overlap_of_wf.ml diff --git a/ocaml/qp_overlap_of_wf.ml b/ocaml/qp_overlap_of_wf.ml new file mode 100644 index 00000000..c405b363 --- /dev/null +++ b/ocaml/qp_overlap_of_wf.ml @@ -0,0 +1,67 @@ +open Input_determinants_by_hand +open Qptypes + +let () = + let ezfio, ezfio' = + try + Sys.argv.(1), Sys.argv.(2) + with Invalid_argument _ -> + raise (Invalid_argument (Printf.sprintf + "Syntax : %s EZFIO1 EZFIO2" Sys.argv.(0))) + in + + let fetch_wf filename = + Ezfio.set_file filename; + let mo_tot_num = + Ezfio.get_mo_basis_mo_tot_num () + |> MO_number.of_int + in + let d = + Determinants_by_hand.read () + in + let n_det = + Det_number.to_int d.Determinants_by_hand.n_det + in + let keys = + Array.map (Determinant.to_string ~mo_tot_num) + d.Determinants_by_hand.psi_det + and values = + Array.map Det_coef.to_float + d.Determinants_by_hand.psi_coef + in + let hash = + Hashtbl.create n_det + in + for i=0 to n_det-1 + do + Hashtbl.add hash keys.(i) values.(i); + done; + hash + in + + let overlap wf wf' = + let result, norm, norm' = + Hashtbl.fold (fun k c (accu,norm,norm') -> + let c' = + try Hashtbl.find wf' k + with Not_found -> 0. + in + (accu +. c *. c' , + norm +. c *. c , + norm'+. c'*. c' ) + ) wf (0.,0.,0.) + in + Printf.printf "%f %f %f\n" result norm norm'; + result /. (norm *. norm') + in + + let wf, wf' = + fetch_wf ezfio, + fetch_wf ezfio' + in + + let o = + overlap wf wf' + in + Printf.printf "Overlap : %f\n" o + From 0112cf20f34e5603a0f0af8e2b76fdc74a104f2c Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 23 Sep 2016 09:38:20 +0200 Subject: [PATCH 123/216] automatic make -C ocaml --- ocaml/Makefile | 2 +- plugins/mrcepa0/EZFIO.cfg | 2 +- src/Davidson/u0Hu0.irp.f | 18 ------------------ 3 files changed, 2 insertions(+), 20 deletions(-) diff --git a/ocaml/Makefile b/ocaml/Makefile index 31330c66..7d51986f 100644 --- a/ocaml/Makefile +++ b/ocaml/Makefile @@ -79,7 +79,7 @@ git: ${QP_ROOT}/install/EZFIO/Ocaml/ezfio.ml: $(NINJA) -C ${QP_ROOT}/install/EZFIO -Input_auto_generated.ml qp_edit.ml: +Input_auto_generated.ml qp_edit.ml: $(filter-out Input_auto_generated.ml, $(wildcard Input_*.ml)) ei_handler.py ocaml_global clean: diff --git a/plugins/mrcepa0/EZFIO.cfg b/plugins/mrcepa0/EZFIO.cfg index 9979f537..903e6e95 100644 --- a/plugins/mrcepa0/EZFIO.cfg +++ b/plugins/mrcepa0/EZFIO.cfg @@ -1,5 +1,5 @@ [lambda_type] -type: Strictly_positive_int +type: Positive_int doc: lambda type ( 0 = none, 1 = last version ) interface: ezfio,provider,ocaml default: 0 diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index f871f5f0..09a1c348 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -27,24 +27,6 @@ subroutine u_0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) end -subroutine H_u_0(v_0,u_0,H_jj,n,keys_tmp,Nint) - use bitmasks - implicit none - BEGIN_DOC - ! Computes v_0 = H|u_0> - ! - ! n : number of determinants - ! - ! H_jj : array of - END_DOC - integer, intent(in) :: n,Nint - double precision, intent(out) :: v_0(n) - double precision, intent(in) :: u_0(n) - double precision, intent(in) :: H_jj(n) - integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - call H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,1,n) -end - subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) use bitmasks implicit none From 9c50e4de2eecd3b13a96d59b05aff10a563524c8 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 23 Sep 2016 10:01:26 +0200 Subject: [PATCH 124/216] Optimized ninja --- plugins/FOBOCI/dress_simple.irp.f | 2 +- plugins/Full_CI_ZMQ/selection_slave.irp.f | 2 +- plugins/MRCC_Utils/mrcc_utils.irp.f | 6 +++--- scripts/compilation/qp_create_ninja.py | 10 +++++++++- scripts/module/create_executables_list.sh | 2 +- src/Davidson/diagonalize_CI.irp.f | 8 ++++---- src/Davidson/u0Hu0.irp.f | 4 ++-- src/Determinants/s2.irp.f | 4 ++-- 8 files changed, 23 insertions(+), 15 deletions(-) diff --git a/plugins/FOBOCI/dress_simple.irp.f b/plugins/FOBOCI/dress_simple.irp.f index dfa57865..a18f8fe5 100644 --- a/plugins/FOBOCI/dress_simple.irp.f +++ b/plugins/FOBOCI/dress_simple.irp.f @@ -212,7 +212,7 @@ subroutine dress_H_matrix_from_psi_det_input(psi_det_generators_input,Ndet_gener integer :: n_state_good n_state_good = 0 if(s2_eig)then - call u_0_S2_u_0_nstates(s2,eigvectors,Ndet_generators,psi_det_generators_input,N_int,N_det_generators,size(eigvectors,1)) + call u_0_S2_u_0(s2,eigvectors,Ndet_generators,psi_det_generators_input,N_int,N_det_generators,size(eigvectors,1)) do i = 1, Ndet_generators print*,'s2 = ',s2(i) print*,dabs(s2(i)-expected_s2) diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index c3514565..438892d3 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -63,7 +63,7 @@ subroutine update_energy(energy) CI_eigenvectors(k,j) = psi_coef(k,j) enddo enddo - call u_0_S2_u_0_nstates(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int) + call u_0_S2_u_0(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int) if (.True.) then do k=1,size(ci_electronic_energy) ci_electronic_energy(k) = energy(k) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index c2f57369..91e8c120 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -150,7 +150,7 @@ END_PROVIDER call davidson_diag_mrcc(psi_det,CI_eigenvectors_dressed,CI_electronic_energy_dressed,& size(CI_eigenvectors_dressed,1),N_det,N_states_diag,N_int,output_determinants,mrcc_state) - call u_0_S2_u_0_nstates(CI_eigenvectors_s2_dressed,CI_eigenvectors_dressed,N_det,psi_det,N_int,& + call u_0_S2_u_0(CI_eigenvectors_s2_dressed,CI_eigenvectors_dressed,N_det,psi_det,N_int,& N_states_diag,size(CI_eigenvectors_dressed,1)) @@ -166,7 +166,7 @@ END_PROVIDER allocate (s2_eigvalues(N_det)) allocate(index_good_state_array(N_det),good_state_array(N_det)) good_state_array = .False. - call u_0_S2_u_0_nstates(s2_eigvalues,eigenvectors,N_det,psi_det,N_int,& + call u_0_S2_u_0(s2_eigvalues,eigenvectors,N_det,psi_det,N_int,& N_det,size(eigenvectors,1)) do j=1,N_det ! Select at least n_states states with S^2 values closed to "expected_s2" @@ -223,7 +223,7 @@ END_PROVIDER deallocate(index_good_state_array,good_state_array) deallocate(s2_eigvalues) else - call u_0_S2_u_0_nstates(CI_eigenvectors_s2_dressed,eigenvectors,N_det,psi_det,N_int,& + call u_0_S2_u_0(CI_eigenvectors_s2_dressed,eigenvectors,N_det,psi_det,N_int,& min(N_det,N_states_diag),size(eigenvectors,1)) ! Select the "N_states_diag" states of lowest energy do j=1,min(N_det,N_states_diag) diff --git a/scripts/compilation/qp_create_ninja.py b/scripts/compilation/qp_create_ninja.py index cc1c8aa8..e2acbf7f 100755 --- a/scripts/compilation/qp_create_ninja.py +++ b/scripts/compilation/qp_create_ninja.py @@ -788,9 +788,17 @@ def create_build_ninja_global(): " command = module_handler.py clean --all", " description = Cleaning all modules", ""] + l_string += ["rule make_ocaml", + " command = make -C {0}/ocaml".format(QP_ROOT), + " pool = console", + " description = Compiling OCaml tools", + ""] + + l_string += ["build dummy_target: update_build_ninja_root", + "build ocaml_target: make_ocaml", "", - "build all: make_all dummy_target", + "build all: make_all dummy_target ocaml_target", "default all", "", "build clean: make_clean dummy_target", diff --git a/scripts/module/create_executables_list.sh b/scripts/module/create_executables_list.sh index 66e9ef2d..8299a505 100755 --- a/scripts/module/create_executables_list.sh +++ b/scripts/module/create_executables_list.sh @@ -11,7 +11,7 @@ fi cd ${QP_ROOT}/data rm -f executables -EXES=$(find -L ${QP_ROOT}/src -executable -type f | grep -e "${QP_ROOT}/src/[^/]*/[^/]*$" |sort ) +EXES=$(find -L ${QP_ROOT}/src -maxdepth 2 -depth -executable -type f | grep -e "${QP_ROOT}/src/[^/]*/[^/]*$" |sort ) for EXE in $EXES do diff --git a/src/Davidson/diagonalize_CI.irp.f b/src/Davidson/diagonalize_CI.irp.f index 07001902..291fd0bc 100644 --- a/src/Davidson/diagonalize_CI.irp.f +++ b/src/Davidson/diagonalize_CI.irp.f @@ -56,7 +56,7 @@ END_PROVIDER call davidson_diag(psi_det,CI_eigenvectors,CI_electronic_energy,& size(CI_eigenvectors,1),N_det,N_states_diag,N_int,output_determinants) - call u_0_S2_u_0_nstates(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int,& + call u_0_S2_u_0(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int,& N_states_diag,size(CI_eigenvectors,1)) @@ -72,7 +72,7 @@ END_PROVIDER allocate (s2_eigvalues(N_det)) allocate(index_good_state_array(N_det),good_state_array(N_det)) good_state_array = .False. - call u_0_S2_u_0_nstates(s2_eigvalues,eigenvectors,N_det,psi_det,N_int,& + call u_0_S2_u_0(s2_eigvalues,eigenvectors,N_det,psi_det,N_int,& N_det,size(eigenvectors,1)) do j=1,N_det ! Select at least n_states states with S^2 values closed to "expected_s2" @@ -129,7 +129,7 @@ END_PROVIDER deallocate(index_good_state_array,good_state_array) deallocate(s2_eigvalues) else - call u_0_S2_u_0_nstates(CI_eigenvectors_s2,eigenvectors,N_det,psi_det,N_int,& + call u_0_S2_u_0(CI_eigenvectors_s2,eigenvectors,N_det,psi_det,N_int,& min(N_det,N_states_diag),size(eigenvectors,1)) ! Select the "N_states_diag" states of lowest energy do j=1,min(N_det,N_states_diag) @@ -153,7 +153,7 @@ END_PROVIDER psi_coef(i,j) = CI_eigenvectors(i,j) enddo enddo - call u_0_H_u_0_nstates(e_array,psi_coef,n_det,psi_det,N_int,N_states_diag,psi_det_size) + call u_0_H_u_0(e_array,psi_coef,n_det,psi_det,N_int,N_states_diag,psi_det_size) ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value ! closer to the "expected_s2" set as input diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 09a1c348..b875ff33 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -1,4 +1,4 @@ -subroutine u_0_H_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) +subroutine u_0_H_u_0(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) use bitmasks implicit none BEGIN_DOC @@ -158,6 +158,6 @@ BEGIN_PROVIDER [ double precision, psi_energy, (N_states) ] BEGIN_DOC ! Energy of the current wave function END_DOC - call u_0_H_u_0_nstates(psi_energy,psi_coef,N_det,psi_det,N_int,N_states,psi_det_size) + call u_0_H_u_0(psi_energy,psi_coef,N_det,psi_det,N_int,N_states,psi_det_size) END_PROVIDER diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index ca7a0590..8db1ff17 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -69,13 +69,13 @@ BEGIN_PROVIDER [ double precision, s2_values, (N_states) ] ! array of the averaged values of the S^2 operator on the various states END_DOC integer :: i - call u_0_S2_u_0_nstates(s2_values,psi_coef,n_det,psi_det,N_int,N_states,psi_det_size) + call u_0_S2_u_0(s2_values,psi_coef,n_det,psi_det,N_int,N_states,psi_det_size) END_PROVIDER -subroutine u_0_S2_u_0_nstates(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) +subroutine u_0_S2_u_0(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) use bitmasks implicit none BEGIN_DOC From 18ff53e063e6ec9d22a6374e3df1160fc1c7efd1 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 23 Sep 2016 14:23:03 +0200 Subject: [PATCH 125/216] Improved diagonalization --- plugins/FOBOCI/routines_foboci.irp.f | 2 +- plugins/MRCC_Utils/davidson.irp.f | 17 +- plugins/MRCC_Utils/mrcc_utils.irp.f | 2 +- plugins/MRCC_Utils_new/EZFIO.cfg | 4 - .../MRCC_Utils_new/NEEDED_CHILDREN_MODULES | 1 - plugins/MRCC_Utils_new/README.rst | 168 ------- plugins/MRCC_Utils_new/davidson.irp.f | 430 ------------------ plugins/MRCC_Utils_new/mrcc_amplitudes.irp.f | 93 ---- plugins/MRCC_Utils_new/mrcc_dress.irp.f | 183 -------- plugins/MRCC_Utils_new/mrcc_general.irp.f | 67 --- plugins/MRCC_Utils_new/mrcc_utils.irp.f | 179 -------- plugins/MRCC_Utils_new/tree_dependency.png | Bin 108444 -> 0 bytes plugins/QmcChem/dressed_dmc.irp.f | 2 +- plugins/mrcepa0/EZFIO.cfg | 2 +- scripts/compilation/qp_create_ninja.py | 2 +- src/Davidson/diagonalization.irp.f | 159 +++---- src/Davidson/diagonalize_CI.irp.f | 2 +- src/Davidson/diagonalize_CI_mono.irp.f | 2 +- src/Determinants/SC2.irp.f | 216 --------- src/Determinants/options.irp.f | 3 + 20 files changed, 86 insertions(+), 1448 deletions(-) delete mode 100644 plugins/MRCC_Utils_new/EZFIO.cfg delete mode 100644 plugins/MRCC_Utils_new/NEEDED_CHILDREN_MODULES delete mode 100644 plugins/MRCC_Utils_new/README.rst delete mode 100644 plugins/MRCC_Utils_new/davidson.irp.f delete mode 100644 plugins/MRCC_Utils_new/mrcc_amplitudes.irp.f delete mode 100644 plugins/MRCC_Utils_new/mrcc_dress.irp.f delete mode 100644 plugins/MRCC_Utils_new/mrcc_general.irp.f delete mode 100644 plugins/MRCC_Utils_new/mrcc_utils.irp.f delete mode 100644 plugins/MRCC_Utils_new/tree_dependency.png delete mode 100644 src/Determinants/SC2.irp.f diff --git a/plugins/FOBOCI/routines_foboci.irp.f b/plugins/FOBOCI/routines_foboci.irp.f index 4aca60d7..6fc60fae 100644 --- a/plugins/FOBOCI/routines_foboci.irp.f +++ b/plugins/FOBOCI/routines_foboci.irp.f @@ -799,7 +799,7 @@ end call dress_diag_elem_2h2p(dressing_H_mat_elem,N_det) call dress_diag_elem_2h1p(dressing_H_mat_elem,N_det,lmct,i_hole) call dress_diag_elem_1h2p(dressing_H_mat_elem,N_det,lmct,i_hole) - call davidson_diag_hjj(psi_det,psi_coef,dressing_H_mat_elem,energies,size(psi_coef,1),N_det,N_states_diag,N_int,output_determinants) + call davidson_diag_hjj(psi_det,psi_coef,dressing_H_mat_elem,energies,size(psi_coef,1),N_det,N_states,N_states_diag,N_int,output_determinants) do i = 1, 2 print*,'psi_coef = ',psi_coef(i,1) enddo diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index 713b3f61..7bde219a 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -1,7 +1,4 @@ - - - -subroutine davidson_diag_mrcc(dets_in,u_in,energies,dim_in,sze,N_st,Nint,iunit,istate) +subroutine davidson_diag_mrcc(dets_in,u_in,energies,dim_in,sze,N_st,N_st_diag,Nint,iunit,istate) use bitmasks implicit none BEGIN_DOC @@ -22,7 +19,7 @@ subroutine davidson_diag_mrcc(dets_in,u_in,energies,dim_in,sze,N_st,Nint,iunit,i ! ! Initial guess vectors are not necessarily orthonormal END_DOC - integer, intent(in) :: dim_in, sze, N_st, Nint, iunit, istate + integer, intent(in) :: dim_in, sze, N_st, Nint, iunit, istate, N_st_diag integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) double precision, intent(inout) :: u_in(dim_in,N_st) double precision, intent(out) :: energies(N_st) @@ -31,6 +28,7 @@ subroutine davidson_diag_mrcc(dets_in,u_in,energies,dim_in,sze,N_st,Nint,iunit,i double precision :: diag_h_mat_elem integer :: i ASSERT (N_st > 0) + ASSERT (N_st_diag >= N_st) ASSERT (sze > 0) ASSERT (Nint > 0) ASSERT (Nint == N_int) @@ -52,11 +50,11 @@ subroutine davidson_diag_mrcc(dets_in,u_in,energies,dim_in,sze,N_st,Nint,iunit,i !$OMP END DO !$OMP END PARALLEL - call davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iunit,istate) + call davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_diag,Nint,iunit,istate) deallocate (H_jj) end -subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iunit,istate) +subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_diag,Nint,iunit,istate) use bitmasks implicit none BEGIN_DOC @@ -79,7 +77,7 @@ subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nin ! ! Initial guess vectors are not necessarily orthonormal END_DOC - integer, intent(in) :: dim_in, sze, N_st, Nint, istate + integer, intent(in) :: dim_in, sze, N_st, Nint, istate, N_st_diag integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) double precision, intent(in) :: H_jj(sze) integer, intent(in) :: iunit @@ -106,6 +104,9 @@ subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nin double precision :: cpu, wall !PROVIDE det_connections +if (N_st_diag /= N_st) then + stop 'N_st_diag /= N_st todo in davidson' +endif call write_time(iunit) call wall_time(wall) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 91e8c120..9876c756 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -149,7 +149,7 @@ END_PROVIDER if (diag_algorithm == "Davidson") then call davidson_diag_mrcc(psi_det,CI_eigenvectors_dressed,CI_electronic_energy_dressed,& - size(CI_eigenvectors_dressed,1),N_det,N_states_diag,N_int,output_determinants,mrcc_state) + size(CI_eigenvectors_dressed,1),N_det,N_states,N_states_diag,N_int,output_determinants,mrcc_state) call u_0_S2_u_0(CI_eigenvectors_s2_dressed,CI_eigenvectors_dressed,N_det,psi_det,N_int,& N_states_diag,size(CI_eigenvectors_dressed,1)) diff --git a/plugins/MRCC_Utils_new/EZFIO.cfg b/plugins/MRCC_Utils_new/EZFIO.cfg deleted file mode 100644 index 789f30ef..00000000 --- a/plugins/MRCC_Utils_new/EZFIO.cfg +++ /dev/null @@ -1,4 +0,0 @@ -[energy] -type: double precision -doc: Calculated MRCC energy -interface: ezfio \ No newline at end of file diff --git a/plugins/MRCC_Utils_new/NEEDED_CHILDREN_MODULES b/plugins/MRCC_Utils_new/NEEDED_CHILDREN_MODULES deleted file mode 100644 index 5b16423e..00000000 --- a/plugins/MRCC_Utils_new/NEEDED_CHILDREN_MODULES +++ /dev/null @@ -1 +0,0 @@ -Perturbation Selectors_full Generators_full Psiref_Utils diff --git a/plugins/MRCC_Utils_new/README.rst b/plugins/MRCC_Utils_new/README.rst deleted file mode 100644 index 6f070867..00000000 --- a/plugins/MRCC_Utils_new/README.rst +++ /dev/null @@ -1,168 +0,0 @@ -=========== -MRCC Module -=========== - -Multi-Reference Coupled Cluster. - -Needed Modules -============== - -.. Do not edit this section. It was auto-generated from the -.. 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 from the -.. by the `update_README.py` script. - -`apply_excitation_operator `_ - Undocumented - - -`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 - - -`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 - - -`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 - - -`get_excitation_operators_for_one_ref `_ - This subroutine provides all the amplitudes and excitation operators - that one needs to go from the reference to the non reference wave function - you enter with det_ref that is a reference determinant - .br - N_connect_ref is the number of determinants belonging to psi_non_ref - that are connected to det_ref. - .br - amplitudes_phase_less(i) = amplitude phase less t_{I->i} = * lambda_mrcc(i) * phase(I->i) - .br - excitation_operators(:,i) represents the holes and particles that - link the ith connected determinant to det_ref - if :: - excitation_operators(5,i) = 2 :: double excitation alpha - excitation_operators(5,i) = -2 :: double excitation beta - !! excitation_operators(1,i) :: hole 1 - !! excitation_operators(2,i) :: particle 1 - !! excitation_operators(3,i) :: hole 2 - !! excitation_operators(4,i) :: particle 2 - else if :: - excitation_operators(5,i) = 1 :: single excitation alpha - !! excitation_operators(1,i) :: hole 1 - !! excitation_operators(2,i) :: particle 1 - else if :: - excitation_operators(5,i) = -1 :: single excitation beta - !! excitation_operators(3,i) :: hole 1 - !! excitation_operators(4,i) :: particle 1 - else if :: - !! excitation_operators(5,i) = 0 :: double excitation alpha/beta - !! excitation_operators(1,i) :: hole 1 alpha - !! excitation_operators(2,i) :: particle 1 alpha - !! excitation_operators(3,i) :: hole 2 beta - !! excitation_operators(4,i) :: particle 2 beta - - -`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 - - -`lambda_mrcc `_ - cm/ or perturbative 1/Delta_E(m) - - -`lambda_pert `_ - cm/ or perturbative 1/Delta_E(m) - - -`mrcc_dress `_ - Undocumented - - -`mrcc_iterations `_ - Undocumented - - -`run_mrcc `_ - Undocumented - - -`set_generators_bitmasks_as_holes_and_particles `_ - Undocumented - diff --git a/plugins/MRCC_Utils_new/davidson.irp.f b/plugins/MRCC_Utils_new/davidson.irp.f deleted file mode 100644 index 0c7bebbd..00000000 --- a/plugins/MRCC_Utils_new/davidson.irp.f +++ /dev/null @@ -1,430 +0,0 @@ -subroutine davidson_diag_mrcc(dets_in,u_in,energies,dim_in,sze,N_st,Nint,iunit,istate) - use bitmasks - implicit none - BEGIN_DOC - ! Davidson diagonalization. - ! - ! dets_in : bitmasks corresponding to determinants - ! - ! u_in : guess coefficients on the various states. Overwritten - ! on exit - ! - ! dim_in : leftmost dimension of u_in - ! - ! sze : Number of determinants - ! - ! N_st : Number of eigenstates - ! - ! iunit : Unit number for the I/O - ! - ! Initial guess vectors are not necessarily orthonormal - END_DOC - integer, intent(in) :: dim_in, sze, N_st, Nint, iunit, istate - integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) - double precision, intent(inout) :: u_in(dim_in,N_st) - double precision, intent(out) :: energies(N_st) - double precision, allocatable :: H_jj(:) - - double precision :: diag_h_mat_elem - integer :: i - ASSERT (N_st > 0) - ASSERT (sze > 0) - ASSERT (Nint > 0) - ASSERT (Nint == N_int) - PROVIDE mo_bielec_integrals_in_map - allocate(H_jj(sze)) - - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP SHARED(sze,H_jj,N_det_ref,dets_in,Nint,istate,delta_ii,idx_ref) & - !$OMP PRIVATE(i) - !$OMP DO SCHEDULE(guided) - do i=1,sze - H_jj(i) = diag_h_mat_elem(dets_in(1,1,i),Nint) - enddo - !$OMP END DO - !$OMP DO SCHEDULE(guided) - do i=1,N_det_ref - H_jj(idx_ref(i)) += delta_ii(i,istate) - enddo - !$OMP END DO - !$OMP END PARALLEL - - call davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iunit,istate) - deallocate (H_jj) -end - -subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iunit,istate) - use bitmasks - implicit none - BEGIN_DOC - ! Davidson diagonalization with specific diagonal elements of the H matrix - ! - ! H_jj : specific diagonal H matrix elements to diagonalize de Davidson - ! - ! dets_in : bitmasks corresponding to determinants - ! - ! u_in : guess coefficients on the various states. Overwritten - ! on exit - ! - ! dim_in : leftmost dimension of u_in - ! - ! sze : Number of determinants - ! - ! N_st : Number of eigenstates - ! - ! iunit : Unit for the I/O - ! - ! Initial guess vectors are not necessarily orthonormal - END_DOC - integer, intent(in) :: dim_in, sze, N_st, Nint, istate - integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) - double precision, intent(in) :: H_jj(sze) - integer, intent(in) :: iunit - double precision, intent(inout) :: u_in(dim_in,N_st) - double precision, intent(out) :: energies(N_st) - - integer :: iter - integer :: i,j,k,l,m - logical :: converged - - double precision :: overlap(N_st,N_st) - double precision :: u_dot_v, u_dot_u - - integer, allocatable :: kl_pairs(:,:) - integer :: k_pairs, kl - - integer :: iter2 - double precision, allocatable :: W(:,:,:), U(:,:,:), R(:,:) - double precision, allocatable :: y(:,:,:,:), h(:,:,:,:), lambda(:) - double precision :: diag_h_mat_elem - double precision :: residual_norm(N_st) - character*(16384) :: write_buffer - double precision :: to_print(2,N_st) - double precision :: cpu, wall - - PROVIDE det_connections - - call write_time(iunit) - call wall_time(wall) - call cpu_time(cpu) - write(iunit,'(A)') '' - write(iunit,'(A)') 'Davidson Diagonalization' - write(iunit,'(A)') '------------------------' - write(iunit,'(A)') '' - call write_int(iunit,N_st,'Number of states') - call write_int(iunit,sze,'Number of determinants') - write(iunit,'(A)') '' - write_buffer = '===== ' - do i=1,N_st - write_buffer = trim(write_buffer)//' ================ ================' - enddo - write(iunit,'(A)') trim(write_buffer) - write_buffer = ' Iter' - do i=1,N_st - write_buffer = trim(write_buffer)//' Energy Residual' - enddo - write(iunit,'(A)') trim(write_buffer) - write_buffer = '===== ' - do i=1,N_st - write_buffer = trim(write_buffer)//' ================ ================' - enddo - write(iunit,'(A)') trim(write_buffer) - - allocate( & - kl_pairs(2,N_st*(N_st+1)/2), & - W(sze,N_st,davidson_sze_max), & - U(sze,N_st,davidson_sze_max), & - R(sze,N_st), & - h(N_st,davidson_sze_max,N_st,davidson_sze_max), & - y(N_st,davidson_sze_max,N_st,davidson_sze_max), & - lambda(N_st*davidson_sze_max)) - - ASSERT (N_st > 0) - ASSERT (sze > 0) - ASSERT (Nint > 0) - ASSERT (Nint == N_int) - - ! Initialization - ! ============== - - k_pairs=0 - do l=1,N_st - do k=1,l - k_pairs+=1 - kl_pairs(1,k_pairs) = k - kl_pairs(2,k_pairs) = l - enddo - enddo - - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP SHARED(U,sze,N_st,overlap,kl_pairs,k_pairs, & - !$OMP Nint,dets_in,u_in) & - !$OMP PRIVATE(k,l,kl,i) - - - ! Orthonormalize initial guess - ! ============================ - - !$OMP DO - do kl=1,k_pairs - k = kl_pairs(1,kl) - l = kl_pairs(2,kl) - if (k/=l) then - overlap(k,l) = u_dot_v(U_in(1,k),U_in(1,l),sze) - overlap(l,k) = overlap(k,l) - else - overlap(k,k) = u_dot_u(U_in(1,k),sze) - endif - enddo - !$OMP END DO - !$OMP END PARALLEL - - call ortho_lowdin(overlap,size(overlap,1),N_st,U_in,size(U_in,1),sze) - - ! Davidson iterations - ! =================== - - converged = .False. - - do while (.not.converged) - - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(k,i) SHARED(U,u_in,sze,N_st) - do k=1,N_st - !$OMP DO - do i=1,sze - U(i,k,1) = u_in(i,k) - enddo - !$OMP END DO - enddo - !$OMP END PARALLEL - - do iter=1,davidson_sze_max-1 - - ! Compute W_k = H |u_k> - ! ---------------------- - - do k=1,N_st - call H_u_0_mrcc(W(1,k,iter),U(1,k,iter),H_jj,sze,dets_in,Nint,istate) - enddo - - ! Compute h_kl = = - ! ------------------------------------------- - - do l=1,N_st - do k=1,N_st - do iter2=1,iter-1 - h(k,iter2,l,iter) = u_dot_v(U(1,k,iter2),W(1,l,iter),sze) - h(k,iter,l,iter2) = h(k,iter2,l,iter) - enddo - enddo - do k=1,l - h(k,iter,l,iter) = u_dot_v(U(1,k,iter),W(1,l,iter),sze) - h(l,iter,k,iter) = h(k,iter,l,iter) - enddo - enddo - - !DEBUG H MATRIX - !do i=1,iter - ! print '(10(x,F16.10))', h(1,i,1,1:i) - !enddo - !print *, '' - !END - - ! Diagonalize h - ! ------------- - call lapack_diag(lambda,y,h,N_st*davidson_sze_max,N_st*iter) - - ! Express eigenvectors of h in the determinant basis - ! -------------------------------------------------- - - do k=1,N_st - do i=1,sze - U(i,k,iter+1) = 0.d0 - W(i,k,iter+1) = 0.d0 - do l=1,N_st - do iter2=1,iter - U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1) - W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1) - enddo - enddo - enddo - enddo - - ! Compute residual vector - ! ----------------------- - - do k=1,N_st - do i=1,sze - R(i,k) = lambda(k) * U(i,k,iter+1) - W(i,k,iter+1) - enddo - residual_norm(k) = u_dot_u(R(1,k),sze) - to_print(1,k) = lambda(k) + nuclear_repulsion - to_print(2,k) = residual_norm(k) - enddo - - write(iunit,'(X,I3,X,100(X,F16.10,X,E16.6))'), iter, to_print(:,1:N_st) - call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_st,converged) - if (converged) then - exit - endif - - - ! Davidson step - ! ------------- - - do k=1,N_st - do i=1,sze - U(i,k,iter+1) = -1.d0/max(H_jj(i) - lambda(k),1.d-2) * R(i,k) - enddo - enddo - - ! Gram-Schmidt - ! ------------ - - double precision :: c - do k=1,N_st - do iter2=1,iter - do l=1,N_st - c = u_dot_v(U(1,k,iter+1),U(1,l,iter2),sze) - do i=1,sze - U(i,k,iter+1) -= c * U(i,l,iter2) - enddo - enddo - enddo - do l=1,k-1 - c = u_dot_v(U(1,k,iter+1),U(1,l,iter+1),sze) - do i=1,sze - U(i,k,iter+1) -= c * U(i,l,iter+1) - enddo - enddo - call normalize( U(1,k,iter+1), sze ) - enddo - - !DEBUG : CHECK OVERLAP - !print *, '===' - !do k=1,iter+1 - ! do l=1,k - ! c = u_dot_v(U(1,1,k),U(1,1,l),sze) - ! print *, k,l, c - ! enddo - !enddo - !print *, '===' - !pause - !END DEBUG - - - enddo - - if (.not.converged) then - iter = davidson_sze_max-1 - endif - - ! Re-contract to u_in - ! ----------- - - do k=1,N_st - energies(k) = lambda(k) - do i=1,sze - u_in(i,k) = 0.d0 - do iter2=1,iter - do l=1,N_st - u_in(i,k) += U(i,l,iter2)*y(l,iter2,k,1) - enddo - enddo - enddo - enddo - - enddo - - write_buffer = '===== ' - do i=1,N_st - write_buffer = trim(write_buffer)//' ================ ================' - enddo - write(iunit,'(A)') trim(write_buffer) - write(iunit,'(A)') '' - call write_time(iunit) - - deallocate ( & - kl_pairs, & - W, & - U, & - R, & - h, & - y, & - lambda & - ) - abort_here = abort_all -end - -subroutine H_u_0_mrcc(v_0,u_0,H_jj,n,keys_tmp,Nint,istate) - use bitmasks - implicit none - BEGIN_DOC - ! Computes v_0 = H|u_0> - ! - ! n : number of determinants - ! - ! H_jj : array of - END_DOC - integer, intent(in) :: n,Nint,istate - double precision, intent(out) :: v_0(n) - double precision, intent(in) :: u_0(n) - double precision, intent(in) :: H_jj(n) - integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) - integer, allocatable :: idx(:) - double precision :: hij - double precision, allocatable :: vt(:) - integer :: i,j,k,l, jj,ii - integer :: i0, j0 - ASSERT (Nint > 0) - ASSERT (Nint == N_int) - ASSERT (n>0) - PROVIDE ref_bitmask_energy delta_ij - integer, parameter :: block_size = 157 - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(i,hij,j,k,idx,jj,ii,vt) & - !$OMP SHARED(n_det_ref,n_det_non_ref,idx_ref,idx_non_ref,n,H_jj,u_0,keys_tmp,Nint,v_0,istate,delta_ij) - !$OMP DO SCHEDULE(static) - do i=1,n - v_0(i) = H_jj(i) * u_0(i) - enddo - !$OMP END DO - allocate(idx(0:n), vt(n)) - Vt = 0.d0 - !$OMP DO SCHEDULE(guided) - do i=1,n - idx(0) = i - call filter_connected_davidson(keys_tmp,keys_tmp(1,1,i),Nint,i-1,idx) - do jj=1,idx(0) - j = idx(jj) - if ( (dabs(u_0(j)) > 1.d-7).or.((dabs(u_0(i)) > 1.d-7)) ) then - call i_H_j(keys_tmp(1,1,j),keys_tmp(1,1,i),Nint,hij) - hij = hij - vt (i) = vt (i) + hij*u_0(j) - vt (j) = vt (j) + hij*u_0(i) - endif - enddo - enddo - !$OMP END DO - - !$OMP DO SCHEDULE(guided) - do ii=1,n_det_ref - i = idx_ref(ii) - do jj = 1, n_det_non_ref - j = idx_non_ref(jj) - vt (i) = vt (i) + delta_ij(ii,jj,istate)*u_0(j) - vt (j) = vt (j) + delta_ij(ii,jj,istate)*u_0(i) - enddo - enddo - !$OMP END DO - !$OMP CRITICAL - do i=1,n - v_0(i) = v_0(i) + vt(i) - enddo - !$OMP END CRITICAL - deallocate(idx,vt) - !$OMP END PARALLEL -end - - diff --git a/plugins/MRCC_Utils_new/mrcc_amplitudes.irp.f b/plugins/MRCC_Utils_new/mrcc_amplitudes.irp.f deleted file mode 100644 index 6746bee1..00000000 --- a/plugins/MRCC_Utils_new/mrcc_amplitudes.irp.f +++ /dev/null @@ -1,93 +0,0 @@ -subroutine get_excitation_operators_for_one_ref(det_ref,i_state,ndetnonref,N_connect_ref,excitation_operators,amplitudes_phase_less,index_connected) - use bitmasks - implicit none - integer(bit_kind), intent(in) :: det_ref(N_int,2) - integer, intent(in) :: i_state,ndetnonref - integer*2, intent(out) :: excitation_operators(5,ndetnonref) - integer, intent(out) :: index_connected(ndetnonref) - integer, intent(out) :: N_connect_ref - double precision, intent(out) :: amplitudes_phase_less(ndetnonref) - - integer :: i,j,k,l,degree,h1,p1,h2,p2,s1,s2 - integer :: exc(0:2,2,2) - double precision :: phase,hij - BEGIN_DOC - ! This subroutine provides all the amplitudes and excitation operators - ! that one needs to go from the reference to the non reference wave function - ! you enter with det_ref that is a reference determinant - ! - ! N_connect_ref is the number of determinants belonging to psi_non_ref - ! that are connected to det_ref. - ! - ! amplitudes_phase_less(i) = amplitude phase less t_{I->i} = * lambda_mrcc(i) * phase(I->i) - ! - ! excitation_operators(:,i) represents the holes and particles that - ! link the ith connected determinant to det_ref - ! if :: - ! excitation_operators(5,i) = 2 :: double excitation alpha - ! excitation_operators(5,i) = -2 :: double excitation beta - !!! excitation_operators(1,i) :: hole 1 - !!! excitation_operators(2,i) :: particle 1 - !!! excitation_operators(3,i) :: hole 2 - !!! excitation_operators(4,i) :: particle 2 - ! else if :: - ! excitation_operators(5,i) = 1 :: single excitation alpha - !!! excitation_operators(1,i) :: hole 1 - !!! excitation_operators(2,i) :: particle 1 - ! else if :: - ! excitation_operators(5,i) = -1 :: single excitation beta - !!! excitation_operators(3,i) :: hole 1 - !!! excitation_operators(4,i) :: particle 1 - ! else if :: - !!! excitation_operators(5,i) = 0 :: double excitation alpha/beta - !!! excitation_operators(1,i) :: hole 1 alpha - !!! excitation_operators(2,i) :: particle 1 alpha - !!! excitation_operators(3,i) :: hole 2 beta - !!! excitation_operators(4,i) :: particle 2 beta - END_DOC - N_connect_ref = 0 - do i = 1, ndetnonref - call i_H_j_phase_out(det_ref,psi_non_ref(1,1,i),N_int,hij,phase,exc,degree) - if (dabs(hij) <= mo_integrals_threshold) then - cycle - endif - N_connect_ref +=1 - index_connected(N_connect_ref) = i - call decode_exc(exc,degree,h1,p1,h2,p2,s1,s2) - amplitudes_phase_less(N_connect_ref) = hij * lambda_mrcc(i_state,i) !*phase - - if (degree==2) then - - excitation_operators(1,N_connect_ref) = h1 - excitation_operators(2,N_connect_ref) = p1 - excitation_operators(3,N_connect_ref) = h2 - excitation_operators(4,N_connect_ref) = p2 - if(s1==s2.and.s1==1)then ! double alpha - excitation_operators(5,N_connect_ref) = 2 - elseif(s1==s2.and.s1==2)then ! double beta - excitation_operators(5,N_connect_ref) = -2 - else ! double alpha/beta - excitation_operators(5,N_connect_ref) = 0 - endif - - else if(degree==1) then - - if(s1==1)then ! mono alpha - excitation_operators(5,N_connect_ref) = 1 - excitation_operators(1,N_connect_ref) = h1 - excitation_operators(2,N_connect_ref) = p1 - else ! mono beta - excitation_operators(5,N_connect_ref) = -1 - excitation_operators(3,N_connect_ref) = h1 - excitation_operators(4,N_connect_ref) = p1 - endif - - else - - N_connect_ref-=1 - - endif - - enddo - -end diff --git a/plugins/MRCC_Utils_new/mrcc_dress.irp.f b/plugins/MRCC_Utils_new/mrcc_dress.irp.f deleted file mode 100644 index ee998995..00000000 --- a/plugins/MRCC_Utils_new/mrcc_dress.irp.f +++ /dev/null @@ -1,183 +0,0 @@ -subroutine mrcc_dress(ndetref,ndetnonref,nstates,delta_ij_,delta_ii_) - use bitmasks - implicit none - integer, intent(in) :: ndetref,nstates,ndetnonref - double precision, intent(inout) :: delta_ii_(ndetref,nstates),delta_ij_(ndetref,ndetnonref,nstates) - integer :: i,j,k,l,m - integer :: i_state - integer :: N_connect_ref - integer*2,allocatable :: excitation_operators(:,:) - double precision, allocatable :: amplitudes_phase_less(:) - double precision, allocatable :: coef_test(:) - integer(bit_kind), allocatable :: key_test(:,:) - integer, allocatable :: index_connected(:) - integer :: i_hole,i_particle,ispin,i_ok,connected_to_ref,index_wf - integer, allocatable :: idx_vector(:) - double precision :: phase_ij - double precision :: dij,phase_la - double precision :: hij,phase - integer :: exc(0:2,2,2),degree - logical :: is_in_wavefunction - double precision, allocatable :: delta_ij_tmp(:,:,:), delta_ii_tmp(:,:) - logical, external :: is_in_psi_ref - - i_state = 1 - allocate(excitation_operators(5,N_det_non_ref)) - allocate(amplitudes_phase_less(N_det_non_ref)) - allocate(index_connected(N_det_non_ref)) - - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP SHARED(N_det_ref, N_det_non_ref, psi_ref, i_state, & - !$OMP N_connect_ref,index_connected,psi_non_ref, & - !$OMP excitation_operators,amplitudes_phase_less, & - !$OMP psi_non_ref_coef,N_int,lambda_mrcc, & - !$OMP delta_ii_,delta_ij_,psi_ref_coef,nstates, & - !$OMP mo_integrals_threshold,idx_non_ref_rev) & - !$OMP PRIVATE(i,j,k,l,hil,phase_il,exc,degree,t_il, & - !$OMP key_test,i_ok,phase_la,hij,phase_ij,m, & - !$OMP dij,idx_vector,delta_ij_tmp, & - !$OMP delta_ii_tmp,phase) - allocate(idx_vector(0:N_det_non_ref)) - allocate(key_test(N_int,2)) - allocate(delta_ij_tmp(size(delta_ij_,1),size(delta_ij_,2),nstates)) - allocate(delta_ii_tmp(size(delta_ij_,1),nstates)) - delta_ij_tmp = 0.d0 - delta_ii_tmp = 0.d0 - - do i = 1, N_det_ref - !$OMP SINGLE - call get_excitation_operators_for_one_ref(psi_ref(1,1,i),i_state,N_det_non_ref,N_connect_ref,excitation_operators,amplitudes_phase_less,index_connected) - print*,'N_connect_ref =',N_connect_ref - print*,'N_det_non_ref =',N_det_non_ref - !$OMP END SINGLE - !$OMP BARRIER - - !$OMP DO SCHEDULE(dynamic) - do l = 1, N_det_non_ref -! print *, l, '/', N_det_non_ref - double precision :: t_il,phase_il,hil - call i_H_j_phase_out(psi_ref(1,1,i),psi_non_ref(1,1,l),N_int,hil,phase_il,exc,degree) - t_il = hil * lambda_mrcc(i_state,l) - if (dabs(t_il) < mo_integrals_threshold) then - cycle - endif - ! loop on the non ref determinants - - do j = 1, N_connect_ref - ! loop on the excitation operators linked to i - - do k = 1, N_int - key_test(k,1) = psi_non_ref(k,1,l) - key_test(k,2) = psi_non_ref(k,2,l) - enddo - - ! we apply the excitation operator T_I->j - call apply_excitation_operator(key_test,excitation_operators(1,j),i_ok) - if(i_ok.ne.1)cycle - - ! we check if such determinant is already in the wave function - if(is_in_wavefunction(key_test,N_int))cycle - - ! we get the phase for psi_non_ref(l) -> T_I->j |psi_non_ref(l)> - call get_excitation(psi_non_ref(1,1,l),key_test,exc,degree,phase_la,N_int) - - ! we get the phase T_I->j - call i_H_j_phase_out(psi_ref(1,1,i),psi_non_ref(1,1,index_connected(j)),N_int,hij,phase_ij,exc,degree) - - ! we compute the contribution to the coef of key_test - dij = t_il * hij * phase_la *phase_ij *lambda_mrcc(i_state,index_connected(j)) * 0.5d0 - if (dabs(dij) < mo_integrals_threshold) then - cycle - endif - - ! we compute the interaction of such determinant with all the non_ref dets - call filter_connected(psi_non_ref,key_test,N_int,N_det_non_ref,idx_vector) - - do k = 1, idx_vector(0) - m = idx_vector(k) - call i_H_j_phase_out(key_test,psi_non_ref(1,1,m),N_int,hij,phase,exc,degree) - delta_ij_tmp(i,m,i_state) += hij * dij - enddo - - - enddo - - if(dabs(psi_ref_coef(i,i_state)).le.5.d-5) then - delta_ii_tmp(i,i_state) -= & - delta_ij_tmp(i,l,i_state) * psi_non_ref_coef(l,i_state) & - / psi_ref_coef(i,i_state) - endif - - enddo - !$OMP END DO - enddo - - !$OMP CRITICAL - delta_ij_ = delta_ij_ + delta_ij_tmp - delta_ii_ = delta_ii_ + delta_ii_tmp - !$OMP END CRITICAL - - deallocate(delta_ii_tmp,delta_ij_tmp) - deallocate(idx_vector) - deallocate(key_test) - !$OMP END PARALLEL - - deallocate(excitation_operators) - deallocate(amplitudes_phase_less) - -end - - - -subroutine apply_excitation_operator(key_in,excitation_operator,i_ok) - use bitmasks - implicit none - integer(bit_kind), intent(inout) :: key_in - integer, intent (out) :: i_ok - integer*2 :: excitation_operator(5) - integer :: i_particle,i_hole,ispin - ! Do excitation - if(excitation_operator(5)==1)then ! mono alpha - i_hole = excitation_operator(1) - i_particle = excitation_operator(2) - ispin = 1 - call do_mono_excitation(key_in,i_hole,i_particle,ispin,i_ok) - else if (excitation_operator(5)==-1)then ! mono beta - i_hole = excitation_operator(3) - i_particle = excitation_operator(4) - ispin = 2 - call do_mono_excitation(key_in,i_hole,i_particle,ispin,i_ok) - else if (excitation_operator(5) == -2 )then ! double beta - i_hole = excitation_operator(1) - i_particle = excitation_operator(2) - ispin = 2 - call do_mono_excitation(key_in,i_hole,i_particle,ispin,i_ok) - if(i_ok.ne.1)return - i_hole = excitation_operator(3) - i_particle = excitation_operator(4) - ispin = 2 - call do_mono_excitation(key_in,i_hole,i_particle,ispin,i_ok) - - else if (excitation_operator(5) == 2 )then ! double alpha - i_hole = excitation_operator(1) - i_particle = excitation_operator(2) - ispin = 1 - call do_mono_excitation(key_in,i_hole,i_particle,ispin,i_ok) - if(i_ok.ne.1)return - i_hole = excitation_operator(3) - i_particle = excitation_operator(4) - ispin = 1 - call do_mono_excitation(key_in,i_hole,i_particle,ispin,i_ok) - - else if (excitation_operator(5) == 0 )then ! double alpha/alpha - i_hole = excitation_operator(1) - i_particle = excitation_operator(2) - ispin = 1 - call do_mono_excitation(key_in,i_hole,i_particle,ispin,i_ok) - if(i_ok.ne.1)return - i_hole = excitation_operator(3) - i_particle = excitation_operator(4) - ispin = 2 - call do_mono_excitation(key_in,i_hole,i_particle,ispin,i_ok) - endif -end diff --git a/plugins/MRCC_Utils_new/mrcc_general.irp.f b/plugins/MRCC_Utils_new/mrcc_general.irp.f deleted file mode 100644 index 245fcb05..00000000 --- a/plugins/MRCC_Utils_new/mrcc_general.irp.f +++ /dev/null @@ -1,67 +0,0 @@ -subroutine run_mrcc - implicit none - call set_generators_bitmasks_as_holes_and_particles - call mrcc_iterations -end - -subroutine mrcc_iterations - implicit none - - integer :: i,j - - double precision :: E_new, E_old, delta_e - integer :: iteration - E_new = 0.d0 - delta_E = 1.d0 - iteration = 0 - do while (delta_E > 1.d-8) - iteration += 1 - print *, '===========================' - print *, 'MRCC Iteration', iteration - print *, '===========================' - print *, '' - E_old = sum(ci_energy_dressed) - call write_double(6,ci_energy_dressed(1),"MRCC energy") - call diagonalize_ci_dressed - E_new = sum(ci_energy_dressed) - delta_E = dabs(E_new - E_old) -! stop - if (iteration > 200) then - exit - endif - enddo - call write_double(6,ci_energy_dressed(1),"Final MRCC energy") - call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) - call save_wavefunction - -end - -subroutine set_generators_bitmasks_as_holes_and_particles - implicit none - integer :: i,k - do k = 1, N_generators_bitmask - do i = 1, N_int - ! Pure single part - generators_bitmask(i,1,1,k) = holes_operators(i,1) ! holes for pure single exc alpha - generators_bitmask(i,1,2,k) = particles_operators(i,1) ! particles for pure single exc alpha - generators_bitmask(i,2,1,k) = holes_operators(i,2) ! holes for pure single exc beta - generators_bitmask(i,2,2,k) = particles_operators(i,2) ! particles for pure single exc beta - - ! Double excitation - generators_bitmask(i,1,3,k) = holes_operators(i,1) ! holes for first single exc alpha - generators_bitmask(i,1,4,k) = particles_operators(i,1) ! particles for first single exc alpha - generators_bitmask(i,2,3,k) = holes_operators(i,2) ! holes for first single exc beta - generators_bitmask(i,2,4,k) = particles_operators(i,2) ! particles for first single exc beta - - generators_bitmask(i,1,5,k) = holes_operators(i,1) ! holes for second single exc alpha - generators_bitmask(i,1,6,k) = particles_operators(i,1) ! particles for second single exc alpha - generators_bitmask(i,2,5,k) = holes_operators(i,2) ! holes for second single exc beta - generators_bitmask(i,2,6,k) = particles_operators(i,2) ! particles for second single exc beta - - enddo - enddo - touch generators_bitmask - - - -end diff --git a/plugins/MRCC_Utils_new/mrcc_utils.irp.f b/plugins/MRCC_Utils_new/mrcc_utils.irp.f deleted file mode 100644 index d97696e5..00000000 --- a/plugins/MRCC_Utils_new/mrcc_utils.irp.f +++ /dev/null @@ -1,179 +0,0 @@ - BEGIN_PROVIDER [ double precision, lambda_mrcc, (N_states,psi_det_size) ] -&BEGIN_PROVIDER [ double precision, lambda_pert, (N_states,psi_det_size) ] - implicit none - BEGIN_DOC - ! cm/ or perturbative 1/Delta_E(m) - END_DOC - integer :: i,k - double precision :: ihpsi(N_states), hii - integer :: i_ok - i_ok = 0 - - do i=1,N_det_non_ref - call i_h_psi(psi_non_ref(1,1,i), psi_ref, psi_ref_coef, N_int, N_det_ref,& - size(psi_ref_coef,1), n_states, ihpsi) - call i_h_j(psi_non_ref(1,1,i),psi_non_ref(1,1,i),N_int,hii) - do k=1,N_states - lambda_pert(k,i) = 1.d0 / (psi_ref_energy_diagonalized(k)-hii) - if (dabs(ihpsi(k)).le.1.d-3) then - i_ok +=1 - lambda_mrcc(k,i) = lambda_pert(k,i) - else - lambda_mrcc(k,i) = psi_non_ref_coef(i,k)/ihpsi(k) - endif - enddo - enddo - print*,'N_det_non_ref = ',N_det_non_ref - print*,'Number of Perturbatively treated determinants = ',i_ok - print*,'psi_coef_ref_ratio = ',psi_ref_coef(2,1)/psi_ref_coef(1,1) - -END_PROVIDER - - - - -!BEGIN_PROVIDER [ double precision, delta_ij_non_ref, (N_det_non_ref, N_det_non_ref,N_states) ] -!implicit none -!BEGIN_DOC -!! Dressing matrix in SD basis -!END_DOC -!delta_ij_non_ref = 0.d0 -!call H_apply_mrcc_simple(delta_ij_non_ref,N_det_non_ref) -!END_PROVIDER - - BEGIN_PROVIDER [ double precision, delta_ij, (N_det_ref,N_det_non_ref,N_states) ] -&BEGIN_PROVIDER [ double precision, delta_ii, (N_det_ref,N_states) ] - implicit none - BEGIN_DOC - ! Dressing matrix in N_det basis - END_DOC - integer :: i,j,m - delta_ij = 0.d0 - delta_ii = 0.d0 - call mrcc_dress(N_det_ref,N_det_non_ref,N_states,delta_ij,delta_ii) - write(33,*)delta_ij - write(34,*)delta_ii -END_PROVIDER - -BEGIN_PROVIDER [ double precision, h_matrix_dressed, (N_det,N_det,N_states) ] - implicit none - BEGIN_DOC - ! Dressed H with Delta_ij - END_DOC - integer :: i, j,istate,ii,jj - do istate = 1,N_states - do j=1,N_det - do i=1,N_det - h_matrix_dressed(i,j,istate) = h_matrix_all_dets(i,j) - enddo - enddo - do ii = 1, N_det_ref - i =idx_ref(ii) - h_matrix_dressed(i,i,istate) += delta_ii(ii,istate) - do jj = 1, N_det_non_ref - j =idx_non_ref(jj) - h_matrix_dressed(i,j,istate) += delta_ij(ii,jj,istate) - h_matrix_dressed(j,i,istate) += delta_ij(ii,jj,istate) - enddo - enddo - enddo -END_PROVIDER - - - BEGIN_PROVIDER [ double precision, CI_electronic_energy_dressed, (N_states_diag) ] -&BEGIN_PROVIDER [ double precision, CI_eigenvectors_dressed, (N_det,N_states_diag) ] -&BEGIN_PROVIDER [ double precision, CI_eigenvectors_s2_dressed, (N_states_diag) ] - implicit none - BEGIN_DOC - ! Eigenvectors/values of the CI matrix - END_DOC - integer :: i,j - - do j=1,N_states_diag - do i=1,N_det - CI_eigenvectors_dressed(i,j) = psi_coef(i,j) - enddo - enddo - - if (diag_algorithm == "Davidson") then - - integer :: istate - istate = 1 - call davidson_diag_mrcc(psi_det,CI_eigenvectors_dressed,CI_electronic_energy_dressed,& - size(CI_eigenvectors_dressed,1),N_det,N_states_diag,N_int,output_determinants,istate) - - else if (diag_algorithm == "Lapack") then - - double precision, allocatable :: eigenvectors(:,:), eigenvalues(:) - allocate (eigenvectors(size(H_matrix_dressed,1),N_det)) - allocate (eigenvalues(N_det)) - call lapack_diag(eigenvalues,eigenvectors, & - H_matrix_dressed,size(H_matrix_dressed,1),N_det) - CI_electronic_energy_dressed(:) = 0.d0 - do i=1,N_det - CI_eigenvectors_dressed(i,1) = eigenvectors(i,1) - enddo - integer :: i_state - double precision :: s2 - i_state = 0 - if (s2_eig) then - do j=1,N_det - call get_s2_u0(psi_det,eigenvectors(1,j),N_det,N_det,s2) - if(dabs(s2-expected_s2).le.0.3d0)then - i_state += 1 - do i=1,N_det - CI_eigenvectors_dressed(i,i_state) = eigenvectors(i,j) - enddo - CI_electronic_energy_dressed(i_state) = eigenvalues(j) - CI_eigenvectors_s2_dressed(i_state) = s2 - endif - if (i_state.ge.N_states_diag) then - exit - endif - enddo - else - do j=1,N_states_diag - call get_s2_u0(psi_det,eigenvectors(1,j),N_det,N_det,s2) - i_state += 1 - do i=1,N_det - CI_eigenvectors_dressed(i,i_state) = eigenvectors(i,j) - enddo - CI_electronic_energy_dressed(i_state) = eigenvalues(j) - CI_eigenvectors_s2_dressed(i_state) = s2 - enddo - endif - deallocate(eigenvectors,eigenvalues) - endif - -END_PROVIDER - -BEGIN_PROVIDER [ double precision, CI_energy_dressed, (N_states_diag) ] - implicit none - BEGIN_DOC - ! N_states lowest eigenvalues of the dressed CI matrix - END_DOC - - integer :: j - character*(8) :: st - call write_time(output_determinants) - do j=1,N_states_diag - CI_energy_dressed(j) = CI_electronic_energy_dressed(j) + nuclear_repulsion - enddo - -END_PROVIDER - -subroutine diagonalize_CI_dressed - implicit none - BEGIN_DOC -! Replace the coefficients of the CI states by the coefficients of the -! eigenstates of the CI matrix - END_DOC - integer :: i,j - do j=1,N_states_diag - do i=1,N_det - psi_coef(i,j) = CI_eigenvectors_dressed(i,j) - enddo - enddo - SOFT_TOUCH psi_coef - -end diff --git a/plugins/MRCC_Utils_new/tree_dependency.png b/plugins/MRCC_Utils_new/tree_dependency.png deleted file mode 100644 index 500e5d43cef50c14d1fbe3da85a9b19213ad6866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108444 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

      EoJ%5P_(&5vQM4 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 z zlae~Q+hi)myUq*=7=L&9#fulA4@()Ej=r#kx8Zx`1=n7$x7&OP?8d(TAPT6*SDjWQ z%t~p<4z!xJ`^o@Hrb2{CBOSVi%JTBDRxY}Vc#aqv8DUlUokR^Nr;gYH2OT~=qhG5} zULOTtusuCFsP^e6wxRC^`8p&LKp4G}Tra3W^Ali1&@UTvJ|<((A5GuB{ULqfSyfy6 zop2x~<-$4%tChw#EwglfW5*|fZnniZwcbvE-`d#uVk{ zt#x(P8aAwriM~{b7yZ=Ve5uG_t&zAn#%*3gdXMS@rI8U6gQEu~9mPIv|Q4*gq4&QAf0ke+ZmSgSoEsw>X<{EC*a^A2~XobjXAFK z$eTBAM0hooIUQ>S!9JGE5%Z$^q+^YvQbL2nV|SwG23oJ1;}t3m+;brXAYP(_thIu(P$e?91hm0H z6R_!p?9qyXEc|#CB^nj#g`sLb&QPS6k0|u8*u1$0+Ad?Jw6?B}lykU>%KN&y|6*es zamFvTj7=JwV@ykg#U*?Wh@CPNnjngu6YZ}%L%N|aPU1uCBBA|R5sJRTv6dSHB^Vzc z&sPqv0CrXgKz6vIf`Jy`WS1m~Mgvq7zS?wgfs>0K{1#y1DoO3;-{4MZB^bq>h>V2$ z`j5hD<|B2}mkeq`#b*X_fw#^84Qg&diQy~-!DzVFNvd{qJgO4rYse=U= zxJkrfD6OXd?D68Kco^LB!v0gtlW1+m1D@Aj!~Q3o~^qCMHJMJY0AG zL6dVnh0bv3YrPP@(Dx2?Qs}-3$pQ3zeO&9q|3mt7PZASDQ%Yg_r%=Ix?>Cqe@q!D6 z|K_3o80ShwAYB7S)Gb&}$Q2}CmzB#l!K;cnw9L{(Ua@(z&X^EI-}l>$o$sDoxro9Q zq%Z)Nh)^56OIpMU6&DvH!M^-CezpO3D(Ab=P$gs=^W{z*iXs1*-HKSKoZI-;!PCH+ zCjHw9=2ZPZUtP=vF)8q|n2Hiio>IN*UgW8uP;2Y^IX!(Q3q7VpVjlC}(TG1KRl;Qb e|NHYySI=k1l 0) + ASSERT (N_st_diag >= N_st) ASSERT (sze > 0) ASSERT (Nint > 0) ASSERT (Nint == N_int) - ! Initialization - ! ============== - - - if (N_st > 1) then - - k_pairs=0 - do l=1,N_st - do k=1,l - k_pairs+=1 - kl_pairs(1,k_pairs) = k - kl_pairs(2,k_pairs) = l - enddo - enddo - - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP SHARED(U,sze,N_st,overlap,kl_pairs,k_pairs, & - !$OMP Nint,dets_in,u_in) & - !$OMP PRIVATE(k,l,kl) - - - ! Orthonormalize initial guess - ! ============================ - - !$OMP DO - do kl=1,k_pairs - k = kl_pairs(1,kl) - l = kl_pairs(2,kl) - if (k/=l) then - overlap(k,l) = u_dot_v(U_in(1,k),U_in(1,l),sze) - overlap(l,k) = overlap(k,l) - else - overlap(k,k) = u_dot_u(U_in(1,k),sze) - endif - enddo - !$OMP END DO - !$OMP END PARALLEL - - call ortho_lowdin(overlap,size(overlap,1),N_st,U_in,size(U_in,1),sze) - - else - - overlap(1,1) = u_dot_u(U_in(1,1),sze) - double precision :: f - f = 1.d0 / dsqrt(overlap(1,1)) - do i=1,sze - U_in(i,1) = U_in(i,1) * f - enddo - - endif - ! Davidson iterations ! =================== @@ -424,40 +380,57 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun do while (.not.converged) - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(k,i) SHARED(U,u_in,sze,N_st) do k=1,N_st - !$OMP DO do i=1,sze U(i,k,1) = u_in(i,k) enddo - !$OMP END DO enddo - !$OMP END PARALLEL + + do k=N_st+1,N_st_diag + do i=1,sze + call RANDOM_NUMBER(U(i,k,1)) + U(i,k,1) = U(i,k,1) - 0.5d0 + enddo + enddo + ! Compute overlap matrix + call DGEMM('T','N', N_st_diag, N_st_diag, sze, & + 1.d0, U(1,1,1), size(U,1), U(1,1,1), size(U,1), & + 0.d0, overlap, size(overlap,1)) + + call ortho_lowdin(overlap,size(overlap,1),N_st_diag,U,size(U,1),sze) + do iter=1,davidson_sze_max-1 ! Compute W_k = H |u_k> ! ---------------------- - call H_u_0_nstates(W(1,1,iter),U(1,1,iter),H_jj,sze,dets_in,Nint,N_st,sze_8) + call H_u_0_nstates(W(1,1,iter),U(1,1,iter),H_jj,sze,dets_in,Nint,N_st_diag,sze_8) ! Compute h_kl = = ! ------------------------------------------- - do l=1,N_st - do k=1,N_st + !$OMP PARALLEL PRIVATE(k,l,iter2) SHARED(h,U,W,sze,iter) + do l=1,N_st_diag + !$OMP DO + do k=1,N_st_diag do iter2=1,iter-1 h(k,iter2,l,iter) = u_dot_v(U(1,k,iter2),W(1,l,iter),sze) h(k,iter,l,iter2) = h(k,iter2,l,iter) enddo enddo + !$OMP END DO + enddo + do l=1,N_st_diag + !$OMP DO do k=1,l h(k,iter,l,iter) = u_dot_v(U(1,k,iter),W(1,l,iter),sze) h(l,iter,k,iter) = h(k,iter,l,iter) enddo + !$OMP END DO enddo + !$OMP END PARALLEL !DEBUG H MATRIX !do i=1,iter @@ -468,16 +441,16 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun ! Diagonalize h ! ------------- - call lapack_diag(lambda,y,h,N_st*davidson_sze_max,N_st*iter) + call lapack_diag(lambda,y,h,N_st_diag*davidson_sze_max,N_st_diag*iter) ! Express eigenvectors of h in the determinant basis ! -------------------------------------------------- !$OMP PARALLEL DEFAULT(NONE) & !$OMP PRIVATE(k,i,l,iter2) & - !$OMP SHARED(U,W,R,y,iter,lambda,N_st,sze,to_print, & - !$OMP residual_norm,nuclear_repulsion) - do k=1,N_st + !$OMP SHARED(U,W,R,y,iter,lambda,N_st_diag,sze,to_print, & + !$OMP residual_norm,nuclear_repulsion,N_st) + do k=1,N_st_diag !$OMP DO do i=1,sze U(i,k,iter+1) = 0.d0 @@ -485,7 +458,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun enddo !$OMP END DO do iter2=1,iter - do l=1,N_st + do l=1,N_st_diag !$OMP DO do i=1,sze U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1) @@ -504,15 +477,17 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun enddo !$OMP END DO !$OMP SINGLE - residual_norm(k) = u_dot_u(R(1,k),sze) - to_print(1,k) = lambda(k) + nuclear_repulsion - to_print(2,k) = residual_norm(k) + if (k <= N_st) then + residual_norm(k) = u_dot_u(R(1,k),sze) + to_print(1,k) = lambda(k) + nuclear_repulsion + to_print(2,k) = residual_norm(k) + endif !$OMP END SINGLE enddo !$OMP END PARALLEL write(iunit,'(X,I3,X,100(X,F16.10,X,E16.6))') iter, to_print(:,1:N_st) - call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_states_diag,converged) + call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_st,converged) if (converged) then exit endif @@ -521,7 +496,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun ! Davidson step ! ------------- - do k=1,N_st + do k=1,N_st_diag do i=1,sze U(i,k,iter+1) = -1.d0/max(H_jj(i) - lambda(k),1.d-2) * R(i,k) enddo @@ -531,9 +506,9 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun ! ------------ double precision :: c - do k=1,N_st + do k=1,N_st_diag do iter2=1,iter - do l=1,N_st + do l=1,N_st_diag c = u_dot_v(U(1,k,iter+1),U(1,l,iter2),sze) do i=1,sze U(i,k,iter+1) = U(i,k,iter+1) - c * U(i,l,iter2) @@ -571,12 +546,12 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun ! Re-contract to u_in ! ----------- - do k=1,N_st + do k=1,N_st_diag energies(k) = lambda(k) do i=1,sze u_in(i,k) = 0.d0 do iter2=1,iter - do l=1,N_st + do l=1,N_st_diag u_in(i,k) += U(i,l,iter2)*y(l,iter2,k,1) enddo enddo @@ -595,8 +570,8 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,Nint,iun deallocate ( & kl_pairs, & - W, & - U, & + W, residual_norm, & + U, overlap, & R, & h, & y, & diff --git a/src/Davidson/diagonalize_CI.irp.f b/src/Davidson/diagonalize_CI.irp.f index 291fd0bc..dcf8101d 100644 --- a/src/Davidson/diagonalize_CI.irp.f +++ b/src/Davidson/diagonalize_CI.irp.f @@ -54,7 +54,7 @@ END_PROVIDER if (diag_algorithm == "Davidson") then call davidson_diag(psi_det,CI_eigenvectors,CI_electronic_energy,& - size(CI_eigenvectors,1),N_det,N_states_diag,N_int,output_determinants) + size(CI_eigenvectors,1),N_det,N_states,N_states_diag,N_int,output_determinants) call u_0_S2_u_0(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int,& N_states_diag,size(CI_eigenvectors,1)) diff --git a/src/Davidson/diagonalize_CI_mono.irp.f b/src/Davidson/diagonalize_CI_mono.irp.f index 3f9b94ec..b45d03d6 100644 --- a/src/Davidson/diagonalize_CI_mono.irp.f +++ b/src/Davidson/diagonalize_CI_mono.irp.f @@ -16,7 +16,7 @@ if (diag_algorithm == "Davidson") then call davidson_diag(psi_det,CI_eigenvectors_mono,CI_electronic_energy, & - size(CI_eigenvectors_mono,1),N_det,N_states_diag,N_int,output_determinants) + size(CI_eigenvectors_mono,1),N_det,N_states,N_states_diag,N_int,output_determinants) else if (diag_algorithm == "Lapack") then diff --git a/src/Determinants/SC2.irp.f b/src/Determinants/SC2.irp.f deleted file mode 100644 index 4f321b87..00000000 --- a/src/Determinants/SC2.irp.f +++ /dev/null @@ -1,216 +0,0 @@ -subroutine CISD_SC2(dets_in,u_in,energies,diag_H_elements,dim_in,sze,N_st,Nint,convergence) - use bitmasks - implicit none - BEGIN_DOC - ! CISD+SC2 method :: take off all the disconnected terms of a CISD (selected or not) - ! - ! dets_in : bitmasks corresponding to determinants - ! - ! u_in : guess coefficients on the various states. Overwritten - ! on exit - ! - ! dim_in : leftmost dimension of u_in - ! - ! sze : Number of determinants - ! - ! N_st : Number of eigenstates - ! - ! Initial guess vectors are not necessarily orthonormal - END_DOC - integer, intent(in) :: dim_in, sze, N_st, Nint - integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) - double precision, intent(inout) :: u_in(dim_in,N_st) - double precision, intent(out) :: energies(N_st) - double precision, intent(out) :: diag_H_elements(dim_in) - double precision, intent(in) :: convergence - ASSERT (N_st > 0) - ASSERT (sze > 0) - ASSERT (Nint > 0) - ASSERT (Nint == N_int) - integer :: iter - integer :: i,j,k,l,m - logical :: converged - double precision :: overlap(N_st,N_st) - double precision :: u_dot_v, u_dot_u - - integer :: degree,N_double,index_hf - double precision :: hij_elec, e_corr_double,e_corr,diag_h_mat_elem,inv_c0 - double precision :: e_corr_double_before,accu,cpu_2,cpu_1 - integer,allocatable :: degree_exc(:), index_double(:) - integer :: i_ok - double precision,allocatable :: e_corr_array(:),H_jj_ref(:),H_jj_dressed(:),hij_double(:) - integer(bit_kind), allocatable :: doubles(:,:,:) - - - allocate (doubles(Nint,2,sze),e_corr_array(sze),H_jj_ref(sze),H_jj_dressed(sze),& - index_double(sze), degree_exc(sze), hij_double(sze)) - call write_time(output_determinants) - write(output_determinants,'(A)') '' - write(output_determinants,'(A)') 'CISD SC2' - write(output_determinants,'(A)') '========' - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP SHARED(sze,N_st, & - !$OMP H_jj_ref,Nint,dets_in,u_in) & - !$OMP PRIVATE(i) - - !$OMP DO SCHEDULE(guided) - do i=1,sze - H_jj_ref(i) = diag_h_mat_elem(dets_in(1,1,i),Nint) - enddo - !$OMP END DO NOWAIT - !$OMP END PARALLEL - - N_double = 0 - e_corr = 0.d0 - e_corr_double = 0.d0 - do i = 1, sze - call get_excitation_degree(ref_bitmask,dets_in(1,1,i),degree,Nint) - degree_exc(i) = degree+1 - if(degree==0)then - index_hf=i - else if (degree == 2)then - N_double += 1 - index_double(N_double) = i - doubles(:,:,N_double) = dets_in(:,:,i) - call i_H_j(ref_bitmask,dets_in(1,1,i),Nint,hij_elec) - hij_double(N_double) = hij_elec - e_corr_array(N_double) = u_in(i,1)* hij_elec - e_corr_double += e_corr_array(N_double) - e_corr += e_corr_array(N_double) - else if (degree == 1)then - call i_H_j(ref_bitmask,dets_in(1,1,i),Nint,hij_elec) - e_corr += u_in(i,1)* hij_elec - endif - enddo - inv_c0 = 1.d0/u_in(index_hf,1) - do i = 1, N_double - e_corr_array(i) = e_corr_array(i) * inv_c0 - enddo - e_corr = e_corr * inv_c0 - e_corr_double = e_corr_double * inv_c0 - converged = .False. - e_corr_double_before = e_corr_double - iter = 0 - do while (.not.converged) - iter +=1 - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(i,j,degree,accu) & - !$OMP SHARED(H_jj_dressed,sze,H_jj_ref,index_hf,N_int,N_double,& - !$OMP dets_in,doubles,degree_exc,e_corr_array,e_corr_double) - !$OMP DO SCHEDULE(STATIC) - do i=1,sze - H_jj_dressed(i) = H_jj_ref(i) - if (i==index_hf)cycle - accu = -e_corr_double - select case (N_int) - case (1) - do j=1,N_double - degree = & - popcnt(xor( dets_in(1,1,i),doubles(1,1,j))) + & - popcnt(xor( dets_in(1,2,i),doubles(1,2,j))) - - if (degree<=ishft(degree_exc(i),1)) then - accu += e_corr_array(j) - endif - enddo - case (2) - do j=1,N_double - degree = & - popcnt(xor( dets_in(1,1,i),doubles(1,1,j))) + & - popcnt(xor( dets_in(1,2,i),doubles(1,2,j))) + & - popcnt(xor( dets_in(2,1,i),doubles(2,1,j))) + & - popcnt(xor( dets_in(2,2,i),doubles(2,2,j))) - - if (degree<=ishft(degree_exc(i),1)) then - accu += e_corr_array(j) - endif - enddo - case (3) - do j=1,N_double - degree = & - popcnt(xor( dets_in(1,1,i),doubles(1,1,j))) + & - popcnt(xor( dets_in(1,2,i),doubles(1,2,j))) + & - popcnt(xor( dets_in(2,1,i),doubles(2,1,j))) + & - popcnt(xor( dets_in(2,2,i),doubles(2,2,j))) + & - popcnt(xor( dets_in(3,1,i),doubles(3,1,j))) + & - popcnt(xor( dets_in(3,2,i),doubles(3,2,j))) - - if (degree<=ishft(degree_exc(i),1)) then - accu += e_corr_array(j) - endif - enddo - case default - do j=1,N_double - call get_excitation_degree(dets_in(1,1,i),doubles(1,1,j),degree,N_int) - if (degree<=degree_exc(i)) then - accu += e_corr_array(j) - endif - enddo - end select - H_jj_dressed(i) -= accu - enddo - !$OMP END DO - !$OMP END PARALLEL - - if(sze<=N_det_max_jacobi)then - double precision, allocatable :: eigenvectors(:,:), eigenvalues(:),H_matrix_tmp(:,:) - allocate (H_matrix_tmp(size(H_matrix_all_dets,1),sze),eigenvalues(sze),eigenvectors(size(H_matrix_all_dets,1),sze)) - do j=1,sze - do i=1,sze - H_matrix_tmp(i,j) = H_matrix_all_dets(i,j) - enddo - enddo - do i = 1,sze - H_matrix_tmp(i,i) = H_jj_dressed(i) - enddo - call lapack_diag(eigenvalues,eigenvectors, & - H_matrix_tmp,size(H_matrix_all_dets,1),sze) - do j=1,min(N_states_diag,sze) - do i=1,sze - u_in(i,j) = eigenvectors(i,j) - enddo - energies(j) = eigenvalues(j) - enddo - deallocate (H_matrix_tmp, eigenvalues, eigenvectors) - else - call davidson_diag_hjj(dets_in,u_in,H_jj_dressed,energies,dim_in,sze,N_st,Nint,output_determinants) - endif - - e_corr_double = 0.d0 - inv_c0 = 1.d0/u_in(index_hf,1) - do i = 1, N_double - e_corr_array(i) = u_in(index_double(i),1)*inv_c0 * hij_double(i) - e_corr_double += e_corr_array(i) - enddo - write(output_determinants,'(A,I3)') 'SC2 Iteration ', iter - write(output_determinants,'(A)') '------------------' - write(output_determinants,'(A)') '' - write(output_determinants,'(A)') '===== ================' - write(output_determinants,'(A)') 'State Energy ' - write(output_determinants,'(A)') '===== ================' - do i=1,N_st - write(output_determinants,'(I5,1X,F16.10)') i, energies(i)+nuclear_repulsion - enddo - write(output_determinants,'(A)') '===== ================' - write(output_determinants,'(A)') '' - call write_double(output_determinants,(e_corr_double - e_corr_double_before),& - 'Delta(E_corr)') - converged = dabs(e_corr_double - e_corr_double_before) < convergence - converged = converged - if (converged) then - do i = 1, dim_in - diag_H_elements(i) = H_jj_dressed(i) - H_jj_ref(i) - enddo - exit - endif - e_corr_double_before = e_corr_double - - enddo - - call write_time(output_determinants) - deallocate (doubles,e_corr_array,H_jj_ref,H_jj_dressed, & - index_double, degree_exc, hij_double) - -end - - diff --git a/src/Determinants/options.irp.f b/src/Determinants/options.irp.f index d4283128..365021db 100644 --- a/src/Determinants/options.irp.f +++ b/src/Determinants/options.irp.f @@ -12,6 +12,9 @@ BEGIN_PROVIDER [ integer, N_states_diag ] else N_states_diag = N_states endif + if (N_states_diag < N_states) then + N_states_diag = N_states + endif call write_time(output_determinants) call write_int(output_determinants, N_states_diag, & From c8a5cf37cdd26e0d9e6d134ae7f3002e68bb32f2 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 23 Sep 2016 16:16:48 +0200 Subject: [PATCH 126/216] Working on davidson --- configure | 1 - plugins/Full_CI_ZMQ/fci_zmq.irp.f | 50 ++++++++++++++++-------------- src/Davidson/diagonalization.irp.f | 23 ++++++-------- src/Davidson/u0Hu0.irp.f | 31 ++++++++++++------ 4 files changed, 58 insertions(+), 47 deletions(-) diff --git a/configure b/configure index 2e0d6c49..19016136 100755 --- a/configure +++ b/configure @@ -543,7 +543,6 @@ def recommendation(): print "" print "Finally :" print " ninja" - print " make -C ocaml" print "" print "You can install more plugin with the qp_module.py install command" print "PS : For more info on compiling the code, read the README.md" diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 0a50a623..dbf8414b 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -3,12 +3,10 @@ program fci_zmq integer :: i,j,k logical, external :: detEq - double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) - integer :: N_st, degree - integer(bit_kind) :: chk + double precision, allocatable :: pt2(:) + integer :: degree - N_st = N_states - allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st)) + allocate (pt2(N_states)) pt2 = 1.d0 diag_algorithm = "Lapack" @@ -24,20 +22,22 @@ program fci_zmq 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 *, '-----' + do k=1,N_states + print*,'State ',k + print *, 'PT2 = ', pt2(k) + print *, 'E = ', CI_energy(k) + print *, 'E+PT2 = ', CI_energy(k) + pt2(k) + print *, '-----' + enddo 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) integer :: n_det_before print*,'Beginning the selection ...' - E_CI_before = CI_energy + E_CI_before(1:N_states) = CI_energy(1:N_states) - do while ( (N_det < N_det_max) .and. (maxval(abs(pt2(1:N_st))) > pt2_max) ) + do while ( (N_det < N_det_max) .and. (maxval(abs(pt2(1:N_states))) > pt2_max) ) n_det_before = N_det call ZMQ_selection(max(1024-N_det, N_det), pt2) @@ -56,14 +56,13 @@ program fci_zmq 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) + 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 @@ -76,7 +75,7 @@ program fci_zmq print*,'Delta E = ',E_CI_before(i)+ pt2(i) - (E_CI_before(1) + pt2(1)) enddo endif - E_CI_before = CI_energy + E_CI_before(1:N_states) = CI_energy(1:N_states) call ezfio_set_full_ci_energy(CI_energy) enddo N_det = min(N_det_max,N_det) @@ -86,15 +85,18 @@ program fci_zmq print*,'Last iteration only to compute the PT2' threshold_selectors = 1.d0 threshold_generators = 0.9999d0 - E_CI_before = CI_energy + E_CI_before(1:N_states) = CI_energy(1:N_states) call ZMQ_selection(1, pt2) print *, 'Final step' print *, 'N_det = ', N_det print *, 'N_states = ', N_states - print *, 'PT2 = ', pt2 - print *, 'E = ', E_CI_before - print *, 'E+PT2 = ', E_CI_before+pt2 - print *, '-----' + do k=1,N_states + print *, 'State', k + print *, 'PT2 = ', pt2 + print *, 'E = ', E_CI_before + print *, 'E+PT2 = ', E_CI_before+pt2 + print *, '-----' + enddo call ezfio_set_full_ci_energy_pt2(E_CI_before+pt2) endif call save_wavefunction diff --git a/src/Davidson/diagonalization.irp.f b/src/Davidson/diagonalization.irp.f index 21b13113..22a77cae 100644 --- a/src/Davidson/diagonalization.irp.f +++ b/src/Davidson/diagonalization.irp.f @@ -505,24 +505,21 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! Gram-Schmidt ! ------------ - double precision :: c + double precision :: c(N_st_diag) do k=1,N_st_diag do iter2=1,iter - do l=1,N_st_diag - c = u_dot_v(U(1,k,iter+1),U(1,l,iter2),sze) - do i=1,sze - U(i,k,iter+1) = U(i,k,iter+1) - c * U(i,l,iter2) - enddo - enddo - enddo - do l=1,k-1 - c = u_dot_v(U(1,k,iter+1),U(1,l,iter+1),sze) - do i=1,sze - U(i,k,iter+1) = U(i,k,iter+1) - c * U(i,l,iter+1) - enddo + call dgemv('T',sze,N_st_diag,1.d0,U(1,1,iter2),size(U,1), & + U(1,k,iter+1),1,0.d0,c,1) + call dgemv('N',sze,N_st_diag,-1.d0,U(1,1,iter2),size(U,1), & + c,1,1.d0,U(1,k,iter+1),1) enddo + call dgemv('T',sze,N_st_diag,1.d0,U(1,1,iter+1),size(U,1), & + U(1,k,iter+1),1,0.d0,c,1) + call dgemv('N',sze,k-1,-1.d0,U(1,1,iter+1),size(U,1), & + c,1,1.d0,U(1,k,iter+1),1) call normalize( U(1,k,iter+1), sze ) enddo + !DEBUG : CHECK OVERLAP !print *, '===' diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index b875ff33..0339c31f 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -43,7 +43,7 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) double precision, intent(in) :: H_jj(n) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) double precision :: hij - double precision, allocatable :: vt(:,:) + double precision, allocatable :: vt(:,:), ut(:,:) integer :: i,j,k,l, jj,ii integer :: i0, j0 @@ -52,7 +52,12 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) integer(bit_kind) :: sorted_i(Nint) integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi, istate + integer :: N_st_8 + integer, external :: align_double + !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut + + N_st_8 = align_double(N_st) ASSERT (Nint > 0) ASSERT (Nint == N_int) @@ -60,15 +65,23 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) PROVIDE ref_bitmask_energy allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2)) + allocate(ut(N_st_8,n)) + v_0 = 0.d0 + do i=1,n + do istate=1,N_st + ut(istate,i) = u_0(i,istate) + enddo + enddo + call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) !$OMP PARALLEL DEFAULT(NONE) & !$OMP PRIVATE(i,hij,j,k,jj,vt,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& - !$OMP SHARED(n,H_jj,u_0,keys_tmp,Nint,v_0,sorted,shortcut,sort_idx,version,N_st,sze_8) - allocate(vt(sze_8,N_st)) + !$OMP SHARED(n,H_jj,keys_tmp,ut,Nint,v_0,sorted,shortcut,sort_idx,version,N_st,N_st_8) + allocate(vt(N_st_8,n)) Vt = 0.d0 !$OMP DO SCHEDULE(dynamic) @@ -102,8 +115,8 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) if(ext <= 4) then call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) do istate=1,N_st - vt (org_i,istate) = vt (org_i,istate) + hij*u_0(org_j,istate) - vt (org_j,istate) = vt (org_j,istate) + hij*u_0(org_i,istate) + vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) + vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) enddo endif enddo @@ -125,8 +138,8 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) if(ext == 4) then call i_H_j(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),Nint,hij) do istate=1,N_st - vt (org_i,istate) = vt (org_i,istate) + hij*u_0(org_j,istate) - vt (org_j,istate) = vt (org_j,istate) + hij*u_0(org_i,istate) + vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) + vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) enddo end if end do @@ -137,7 +150,7 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) !$OMP CRITICAL do istate=1,N_st do i=n,1,-1 - v_0(i,istate) = v_0(i,istate) + vt(i,istate) + v_0(i,istate) = v_0(i,istate) + vt(istate,i) enddo enddo !$OMP END CRITICAL @@ -150,7 +163,7 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) v_0(i,istate) += H_jj(i) * u_0(i,istate) enddo enddo - deallocate (shortcut, sort_idx, sorted, version) + deallocate (shortcut, sort_idx, sorted, version, ut) end BEGIN_PROVIDER [ double precision, psi_energy, (N_states) ] From 0d8bbad7508de8dbe791f2a692a6feae3008eaa8 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 23 Sep 2016 17:37:15 +0200 Subject: [PATCH 127/216] LAPACK in davidson --- src/Davidson/diagonalization.irp.f | 114 +++++++---------------------- 1 file changed, 26 insertions(+), 88 deletions(-) diff --git a/src/Davidson/diagonalization.irp.f b/src/Davidson/diagonalization.irp.f index 22a77cae..16604f03 100644 --- a/src/Davidson/diagonalization.irp.f +++ b/src/Davidson/diagonalization.irp.f @@ -316,6 +316,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia integer :: iter2 double precision, allocatable :: W(:,:,:), U(:,:,:), R(:,:) double precision, allocatable :: y(:,:,:,:), h(:,:,:,:), lambda(:) + double precision, allocatable :: c(:), H_small(:,:) double precision :: diag_h_mat_elem double precision, allocatable :: residual_norm(:) character*(16384) :: write_buffer @@ -365,6 +366,8 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia y(N_st_diag,davidson_sze_max,N_st_diag,davidson_sze_max), & residual_norm(N_st_diag), & overlap(N_st_diag,N_st_diag), & + c(N_st_diag*davidson_sze_max), & + H_small(N_st_diag,N_st_diag), & lambda(N_st_diag*davidson_sze_max)) ASSERT (N_st > 0) @@ -393,17 +396,19 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia enddo enddo - ! Compute overlap matrix + ! Compute overlap matrix Ut.U to orthonormalize U + ! ----------------------------------------------- + call DGEMM('T','N', N_st_diag, N_st_diag, sze, & 1.d0, U(1,1,1), size(U,1), U(1,1,1), size(U,1), & 0.d0, overlap, size(overlap,1)) - + call ortho_lowdin(overlap,size(overlap,1),N_st_diag,U,size(U,1),sze) do iter=1,davidson_sze_max-1 - ! Compute W_k = H |u_k> - ! ---------------------- + ! Compute |W_k> = \sum_i |i> + ! ----------------------------------------- call H_u_0_nstates(W(1,1,iter),U(1,1,iter),H_jj,sze,dets_in,Nint,N_st_diag,sze_8) @@ -411,34 +416,10 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! Compute h_kl = = ! ------------------------------------------- - !$OMP PARALLEL PRIVATE(k,l,iter2) SHARED(h,U,W,sze,iter) - do l=1,N_st_diag - !$OMP DO - do k=1,N_st_diag - do iter2=1,iter-1 - h(k,iter2,l,iter) = u_dot_v(U(1,k,iter2),W(1,l,iter),sze) - h(k,iter,l,iter2) = h(k,iter2,l,iter) - enddo - enddo - !$OMP END DO - enddo - do l=1,N_st_diag - !$OMP DO - do k=1,l - h(k,iter,l,iter) = u_dot_v(U(1,k,iter),W(1,l,iter),sze) - h(l,iter,k,iter) = h(k,iter,l,iter) - enddo - !$OMP END DO - enddo - !$OMP END PARALLEL + call dgemm('T','N', N_st_diag*iter, N_st_diag, sze, & + 1.d0, U, size(U,1), W(1,1,iter), size(W,1), & + 0.d0, h(1,1,1,iter), size(h,1)*size(h,2)) - !DEBUG H MATRIX - !do i=1,iter - ! print '(10(x,F16.10))', h(1,i,1,1:i) - !enddo - !print *, '' - !END - ! Diagonalize h ! ------------- call lapack_diag(lambda,y,h,N_st_diag*davidson_sze_max,N_st_diag*iter) @@ -446,45 +427,24 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! Express eigenvectors of h in the determinant basis ! -------------------------------------------------- - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(k,i,l,iter2) & - !$OMP SHARED(U,W,R,y,iter,lambda,N_st_diag,sze,to_print, & - !$OMP residual_norm,nuclear_repulsion,N_st) + call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, & + 1.d0, U, size(U,1), y, size(y,1)*size(y,2), 0.d0, U(1,1,iter+1), size(U,1)) + call dgemm('N','N',sze,N_st_diag,N_st_diag*iter, & + 1.d0, W, size(W,1), y, size(y,1)*size(y,2), 0.d0, W(1,1,iter+1), size(W,1)) + + ! Compute residual vector + ! ----------------------- + do k=1,N_st_diag - !$OMP DO - do i=1,sze - U(i,k,iter+1) = 0.d0 - W(i,k,iter+1) = 0.d0 - enddo - !$OMP END DO - do iter2=1,iter - do l=1,N_st_diag - !$OMP DO - do i=1,sze - U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1) - W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1) - enddo - !$OMP END DO NOWAIT - enddo - enddo - - ! Compute residual vector - ! ----------------------- - - !$OMP DO do i=1,sze R(i,k) = lambda(k) * U(i,k,iter+1) - W(i,k,iter+1) enddo - !$OMP END DO - !$OMP SINGLE if (k <= N_st) then residual_norm(k) = u_dot_u(R(1,k),sze) to_print(1,k) = lambda(k) + nuclear_repulsion to_print(2,k) = residual_norm(k) endif - !$OMP END SINGLE enddo - !$OMP END PARALLEL write(iunit,'(X,I3,X,100(X,F16.10,X,E16.6))') iter, to_print(:,1:N_st) call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_st,converged) @@ -505,14 +465,11 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! Gram-Schmidt ! ------------ - double precision :: c(N_st_diag) do k=1,N_st_diag - do iter2=1,iter - call dgemv('T',sze,N_st_diag,1.d0,U(1,1,iter2),size(U,1), & + call dgemv('T',sze,N_st_diag*iter,1.d0,U,size(U,1), & U(1,k,iter+1),1,0.d0,c,1) - call dgemv('N',sze,N_st_diag,-1.d0,U(1,1,iter2),size(U,1), & + call dgemv('N',sze,N_st_diag*iter,-1.d0,U,size(U,1), & c,1,1.d0,U(1,k,iter+1),1) - enddo call dgemv('T',sze,N_st_diag,1.d0,U(1,1,iter+1),size(U,1), & U(1,k,iter+1),1,0.d0,c,1) call dgemv('N',sze,k-1,-1.d0,U(1,1,iter+1),size(U,1), & @@ -520,20 +477,6 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia call normalize( U(1,k,iter+1), sze ) enddo - - !DEBUG : CHECK OVERLAP - !print *, '===' - !do k=1,iter+1 - ! do l=1,k - ! c = u_dot_v(U(1,1,k),U(1,1,l),sze) - ! print *, k,l, c - ! enddo - !enddo - !print *, '===' - !pause - !END DEBUG - - enddo if (.not.converged) then @@ -545,15 +488,10 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia do k=1,N_st_diag energies(k) = lambda(k) - do i=1,sze - u_in(i,k) = 0.d0 - do iter2=1,iter - do l=1,N_st_diag - u_in(i,k) += U(i,l,iter2)*y(l,iter2,k,1) - enddo - enddo - enddo enddo + call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, 1.d0, & + U, size(U,1), y, size(y,1)*size(y,2), & + 0.d0, u_in, size(u_in,1)) enddo @@ -569,7 +507,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia kl_pairs, & W, residual_norm, & U, overlap, & - R, & + R, c, & h, & y, & lambda & From 7851bfa8f3ea3fc3f0121137b20ed21b34dfc18c Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 23 Sep 2016 19:12:15 +0200 Subject: [PATCH 128/216] Davidson slow but working --- src/Davidson/diagonalization.irp.f | 115 ++++++++++++++++++++++------- src/Davidson/parameters.irp.f | 1 + 2 files changed, 90 insertions(+), 26 deletions(-) diff --git a/src/Davidson/diagonalization.irp.f b/src/Davidson/diagonalization.irp.f index 16604f03..7094ba5b 100644 --- a/src/Davidson/diagonalization.irp.f +++ b/src/Davidson/diagonalization.irp.f @@ -380,31 +380,32 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! =================== converged = .False. + + do k=N_st+1,N_st_diag + do i=1,sze + call RANDOM_NUMBER(u_in(i,k)) + u_in(i,k) = u_in(i,k) - 0.5d0 + enddo + + ! Gram-Schmidt + ! ------------ + call dgemv('T',sze,k-1,1.d0,u_in,size(u_in,1), & + u_in(1,k),1,0.d0,c,1) + call dgemv('N',sze,k-1,-1.d0,u_in,size(u_in,1), & + c,1,1.d0,u_in(1,k),1) + call normalize( u_in(1,k), sze ) + + enddo + do while (.not.converged) - do k=1,N_st + do k=1,N_st_diag do i=1,sze U(i,k,1) = u_in(i,k) enddo enddo - do k=N_st+1,N_st_diag - do i=1,sze - call RANDOM_NUMBER(U(i,k,1)) - U(i,k,1) = U(i,k,1) - 0.5d0 - enddo - enddo - - ! Compute overlap matrix Ut.U to orthonormalize U - ! ----------------------------------------------- - - call DGEMM('T','N', N_st_diag, N_st_diag, sze, & - 1.d0, U(1,1,1), size(U,1), U(1,1,1), size(U,1), & - 0.d0, overlap, size(overlap,1)) - - call ortho_lowdin(overlap,size(overlap,1),N_st_diag,U,size(U,1),sze) - do iter=1,davidson_sze_max-1 ! Compute |W_k> = \sum_i |i> @@ -416,10 +417,25 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! Compute h_kl = = ! ------------------------------------------- +! +! do l=1,N_st_diag +! do k=1,N_st_diag +! do iter2=1,iter-1 +! h(k,iter2,l,iter) = u_dot_v(U(1,k,iter2),W(1,l,iter),sze) +! h(k,iter,l,iter2) = h(k,iter2,l,iter) +! enddo +! enddo +! do k=1,l +! h(k,iter,l,iter) = u_dot_v(U(1,k,iter),W(1,l,iter),sze) +! h(l,iter,k,iter) = h(k,iter,l,iter) +! enddo +! enddo + call dgemm('T','N', N_st_diag*iter, N_st_diag, sze, & 1.d0, U, size(U,1), W(1,1,iter), size(W,1), & 0.d0, h(1,1,1,iter), size(h,1)*size(h,2)) + ! Diagonalize h ! ------------- call lapack_diag(lambda,y,h,N_st_diag*davidson_sze_max,N_st_diag*iter) @@ -427,10 +443,27 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! Express eigenvectors of h in the determinant basis ! -------------------------------------------------- - call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, & - 1.d0, U, size(U,1), y, size(y,1)*size(y,2), 0.d0, U(1,1,iter+1), size(U,1)) - call dgemm('N','N',sze,N_st_diag,N_st_diag*iter, & - 1.d0, W, size(W,1), y, size(y,1)*size(y,2), 0.d0, W(1,1,iter+1), size(W,1)) + do k=1,N_st_diag + do i=1,sze + U(i,k,iter+1) = 0.d0 + W(i,k,iter+1) = 0.d0 + enddo + do iter2=1,iter + do l=1,N_st_diag + do i=1,sze + U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1) + W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1) + enddo + enddo + enddo + enddo + + +! call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, & +! 1.d0, U, size(U,1), y, size(y,1)*size(y,2), 0.d0, U(1,1,iter+1), size(U,1)) +! call dgemm('N','N',sze,N_st_diag,N_st_diag*iter, & +! 1.d0, W, size(W,1), y, size(y,1)*size(y,2), 0.d0, W(1,1,iter+1), size(W,1)) + ! Compute residual vector ! ----------------------- @@ -452,7 +485,6 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia exit endif - ! Davidson step ! ------------- @@ -466,14 +498,33 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! ------------ do k=1,N_st_diag + +! do iter2=1,iter +! do l=1,N_st_diag +! c(1) = u_dot_v(U(1,k,iter+1),U(1,l,iter2),sze) +! do i=1,sze +! U(i,k,iter+1) = U(i,k,iter+1) - c(1) * U(i,l,iter2) +! enddo +! enddo +! enddo + call dgemv('T',sze,N_st_diag*iter,1.d0,U,size(U,1), & U(1,k,iter+1),1,0.d0,c,1) call dgemv('N',sze,N_st_diag*iter,-1.d0,U,size(U,1), & c,1,1.d0,U(1,k,iter+1),1) - call dgemv('T',sze,N_st_diag,1.d0,U(1,1,iter+1),size(U,1), & + +! do l=1,k-1 +! c(1) = u_dot_v(U(1,k,iter+1),U(1,l,iter+1),sze) +! do i=1,sze +! U(i,k,iter+1) = U(i,k,iter+1) - c(1) * U(i,l,iter+1) +! enddo +! enddo + + call dgemv('T',sze,k-1,1.d0,U(1,1,iter+1),size(U,1), & U(1,k,iter+1),1,0.d0,c,1) call dgemv('N',sze,k-1,-1.d0,U(1,1,iter+1),size(U,1), & c,1,1.d0,U(1,k,iter+1),1) + call normalize( U(1,k,iter+1), sze ) enddo @@ -489,9 +540,21 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia do k=1,N_st_diag energies(k) = lambda(k) enddo - call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, 1.d0, & - U, size(U,1), y, size(y,1)*size(y,2), & - 0.d0, u_in, size(u_in,1)) + + do k=1,N_st_diag + do i=1,sze + u_in(i,k) = 0.d0 + do iter2=1,iter + do l=1,N_st_diag + u_in(i,k) += U(i,l,iter2)*y(l,iter2,k,1) + enddo + enddo + enddo + enddo + +! call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, 1.d0, & +! U, size(U,1), y, N_st_diag*davidson_sze_max, & +! 0.d0, u_in, size(u_in,1)) enddo diff --git a/src/Davidson/parameters.irp.f b/src/Davidson/parameters.irp.f index 66c500c3..a78ff7f1 100644 --- a/src/Davidson/parameters.irp.f +++ b/src/Davidson/parameters.irp.f @@ -13,6 +13,7 @@ BEGIN_PROVIDER [ integer, davidson_sze_max ] END_DOC ASSERT (davidson_sze_max <= davidson_iter_max) davidson_sze_max = max(8,2*N_states_diag) + davidson_sze_max = 3 END_PROVIDER From dc287d7fe2506d0a4e9ad2d78fc7f150d65e94c4 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sat, 24 Sep 2016 02:03:22 +0200 Subject: [PATCH 129/216] Changed N_states --- src/Davidson/diagonalize_CI.irp.f | 27 ++-- src/Davidson/parameters.irp.f | 3 +- src/Determinants/determinants.irp.f | 4 +- src/Determinants/s2.irp.f | 223 ++++++++++++++-------------- src/Utils/util.irp.f | 54 ++----- 5 files changed, 141 insertions(+), 170 deletions(-) diff --git a/src/Davidson/diagonalize_CI.irp.f b/src/Davidson/diagonalize_CI.irp.f index dcf8101d..b6e57cb9 100644 --- a/src/Davidson/diagonalize_CI.irp.f +++ b/src/Davidson/diagonalize_CI.irp.f @@ -8,7 +8,7 @@ BEGIN_PROVIDER [ double precision, CI_energy, (N_states_diag) ] integer :: j character*(8) :: st call write_time(output_determinants) - do j=1,min(N_det,N_states_diag) + do j=1,min(N_det,N_states) CI_energy(j) = CI_electronic_energy(j) + nuclear_repulsion write(st,'(I4)') j call write_double(output_determinants,CI_energy(j),'Energy of state '//trim(st)) @@ -39,7 +39,7 @@ END_PROVIDER integer, allocatable :: iorder(:) ! Guess values for the "N_states_diag" states of the CI_eigenvectors - do j=1,min(N_states_diag,N_det) + do j=1,min(N_states,N_det) do i=1,N_det CI_eigenvectors(i,j) = psi_coef(i,j) enddo @@ -148,12 +148,14 @@ END_PROVIDER allocate(s2_eigvalues(N_states_diag), e_array(N_states_diag)) call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors,n_det,size(psi_det,3),size(CI_eigenvectors,1),min(n_states_diag,n_det),s2_eigvalues) - do j = 1, N_states_diag + double precision, allocatable :: psi_coef_tmp(:,:) + allocate(psi_coef_tmp(psi_det_size,N_states_diag)) + do j = 1, N_states do i = 1, N_det - psi_coef(i,j) = CI_eigenvectors(i,j) + psi_coef_tmp(i,j) = CI_eigenvectors(i,j) enddo enddo - call u_0_H_u_0(e_array,psi_coef,n_det,psi_det,N_int,N_states_diag,psi_det_size) + call u_0_H_u_0(e_array,psi_coef_tmp,n_det,psi_det,N_int,N_states_diag,psi_det_size) ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value ! closer to the "expected_s2" set as input @@ -172,7 +174,7 @@ END_PROVIDER allocate(iorder(i_state)) do j = 1, i_state do i = 1, N_det - CI_eigenvectors(i,j) = psi_coef(i,index_good_state_array(j)) + CI_eigenvectors(i,j) = psi_coef_tmp(i,index_good_state_array(j)) enddo CI_eigenvectors_s2(j) = s2_eigvalues(index_good_state_array(j)) CI_electronic_energy(j) = e_array(j) @@ -183,7 +185,7 @@ END_PROVIDER CI_electronic_energy(j) = e_array(j) CI_eigenvectors_s2(j) = s2_eigvalues(index_good_state_array(iorder(j))) do i = 1, N_det - CI_eigenvectors(i,j) = psi_coef(i,index_good_state_array(iorder(j))) + CI_eigenvectors(i,j) = psi_coef_tmp(i,index_good_state_array(iorder(j))) enddo enddo @@ -193,12 +195,17 @@ END_PROVIDER if(good_state_array(j))cycle i_other_state +=1 do i = 1, N_det - CI_eigenvectors(i,i_state + i_other_state) = psi_coef(i,j) + CI_eigenvectors(i,i_state + i_other_state) = psi_coef_tmp(i,j) enddo CI_eigenvectors_s2(i_state + i_other_state) = s2_eigvalues(j) CI_electronic_energy(i_state + i_other_state) = e_array(i_state + i_other_state) enddo - deallocate(iorder,e_array,index_good_state_array,good_state_array) + do j=1,N_states + do i=1,N_det + psi_coef(i,j) = psi_coef_tmp(i,j) + enddo + enddo + deallocate(iorder,e_array,index_good_state_array,good_state_array,psi_coef_tmp) deallocate(s2_eigvalues) @@ -213,7 +220,7 @@ subroutine diagonalize_CI ! eigenstates of the CI matrix END_DOC integer :: i,j - do j=1,N_states_diag + do j=1,N_states do i=1,N_det psi_coef(i,j) = CI_eigenvectors(i,j) enddo diff --git a/src/Davidson/parameters.irp.f b/src/Davidson/parameters.irp.f index a78ff7f1..d9c82e3c 100644 --- a/src/Davidson/parameters.irp.f +++ b/src/Davidson/parameters.irp.f @@ -12,8 +12,7 @@ BEGIN_PROVIDER [ integer, davidson_sze_max ] ! Max number of Davidson sizes END_DOC ASSERT (davidson_sze_max <= davidson_iter_max) - davidson_sze_max = max(8,2*N_states_diag) - davidson_sze_max = 3 + davidson_sze_max = 8*N_states END_PROVIDER diff --git a/src/Determinants/determinants.irp.f b/src/Determinants/determinants.irp.f index 0e62d524..1f2863eb 100644 --- a/src/Determinants/determinants.irp.f +++ b/src/Determinants/determinants.irp.f @@ -242,7 +242,7 @@ END_PROVIDER END_PROVIDER -BEGIN_PROVIDER [ double precision, psi_coef, (psi_det_size,N_states_diag) ] +BEGIN_PROVIDER [ double precision, psi_coef, (psi_det_size,N_states) ] implicit none BEGIN_DOC ! The wave function coefficients. Initialized with Hartree-Fock if the EZFIO file @@ -255,7 +255,7 @@ BEGIN_PROVIDER [ double precision, psi_coef, (psi_det_size,N_states_diag) ] character*(64) :: label psi_coef = 0.d0 - do i=1,N_states_diag + do i=1,N_states psi_coef(i,i) = 1.d0 enddo diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index 8db1ff17..78b2d1e7 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -300,123 +300,120 @@ subroutine get_uJ_s2_uI(psi_keys_tmp,psi_coefs_tmp,n,nmax_coefs,nmax_keys,s2,nst end subroutine diagonalize_s2_betweenstates(keys_tmp,u_0,n,nmax_keys,nmax_coefs,nstates,s2_eigvalues) - BEGIN_DOC -! You enter with nstates vectors in u_0 that may be coupled by S^2 -! The subroutine diagonalize the S^2 operator in the basis of these states. -! The vectors that you obtain in output are no more coupled by S^2, -! which does not necessary mean that they are eigenfunction of S^2. -! n,nmax,nstates = number of determinants, physical dimension of the arrays and number of states -! keys_tmp = array of integer(bit_kind) that represents the determinants -! psi_coefs(i,j) = coeff of the ith determinant in the jth state -! VECTORS ARE SUPPOSED TO BE ORTHONORMAL IN INPUT - END_DOC - implicit none - use bitmasks - integer, intent(in) :: n,nmax_keys,nmax_coefs,nstates - integer(bit_kind), intent(in) :: keys_tmp(N_int,2,nmax_keys) - double precision, intent(inout) :: u_0(nmax_coefs,nstates) - double precision, intent(out) :: s2_eigvalues(nstates) - - - double precision,allocatable :: s2(:,:),overlap(:,:) - double precision, allocatable :: eigvalues(:),eigvectors(:,:) - integer :: i,j,k - double precision, allocatable :: psi_coefs_tmp(:,:) - double precision :: accu,coef_contract - double precision :: u_dot_u,u_dot_v - - print*,'' - print*,'*********************************************************************' - print*,'Cleaning the various vectors by diagonalization of the S^2 matrix ...' - print*,'' - print*,'nstates = ',nstates - allocate(s2(nstates,nstates),overlap(nstates,nstates)) - !$OMP PARALLEL DO COLLAPSE(2) DEFAULT(NONE) SCHEDULE(dynamic) & - !$OMP PRIVATE(i,j) SHARED(overlap,u_0,nstates,n) - do i = 1, nstates - do j = 1, nstates - if (i < j) then - cycle - else if (i == j) then - overlap(i,i) = u_dot_u(u_0(1,i),n) - else - overlap(i,j) = u_dot_v(u_0(1,j),u_0(1,i),n) - overlap(j,i) = overlap(i,j) - endif - enddo - enddo - !$OMP END PARALLEL DO - call ortho_lowdin(overlap,size(overlap,1),nstates,u_0,size(u_0,1),n) - - double precision, allocatable :: v_0(:,:) - allocate ( v_0(size(u_0,1),nstates) ) - call S2_u_0_nstates(v_0,u_0,n,keys_tmp,N_int,nstates,size(u_0,1)) - - do i=1, nstates - do j=1,i - s2(j,i) = u_dot_v(u_0(1,i), v_0(1,j),n) - s2(i,j) = s2(j,i) + BEGIN_DOC + ! You enter with nstates vectors in u_0 that may be coupled by S^2 + ! The subroutine diagonalize the S^2 operator in the basis of these states. + ! The vectors that you obtain in output are no more coupled by S^2, + ! which does not necessary mean that they are eigenfunction of S^2. + ! n,nmax,nstates = number of determinants, physical dimension of the arrays and number of states + ! keys_tmp = array of integer(bit_kind) that represents the determinants + ! psi_coefs(i,j) = coeff of the ith determinant in the jth state + ! VECTORS ARE SUPPOSED TO BE ORTHONORMAL IN INPUT + END_DOC + implicit none + use bitmasks + integer, intent(in) :: n,nmax_keys,nmax_coefs,nstates + integer(bit_kind), intent(in) :: keys_tmp(N_int,2,nmax_keys) + double precision, intent(inout) :: u_0(nmax_coefs,nstates) + double precision, intent(out) :: s2_eigvalues(nstates) + + + double precision,allocatable :: s2(:,:),overlap(:,:) + double precision, allocatable :: eigvectors(:,:,:) + integer :: i,j,k + double precision, allocatable :: psi_coefs_tmp(:,:) + double precision :: accu,coef_contract + double precision :: u_dot_u,u_dot_v + + print*,'' + print*,'*********************************************************************' + print*,'Cleaning the various vectors by diagonalization of the S^2 matrix ...' + print*,'' + print*,'nstates = ',nstates + allocate(s2(nstates,nstates),overlap(nstates,nstates)) + overlap = 0.d0 + call dgemm('T','N',nstates,nstates,n, 1.d0, u_0, size(u_0,1), & + u_0, size(u_0,1), 0.d0, overlap, size(overlap,1)) + call ortho_lowdin(overlap,size(overlap,1),nstates,u_0,size(u_0,1),n) + + double precision, allocatable :: v_0(:,:) + allocate ( v_0(size(u_0,1),nstates) ) + call S2_u_0_nstates(v_0,u_0,n,keys_tmp,N_int,nstates,size(u_0,1)) + + call dgemm('T','N',nstates,nstates,n, 1.d0, u_0, size(u_0,1), & + v_0, size(v_0,1), 0.d0, s2, size(s2,1)) + + print*,'S^2 matrix in the basis of the states considered' + do i = 1, nstates + write(*,'(100(F5.2,X))')s2(i,:) enddo - enddo - -! call get_uJ_s2_uI(keys_tmp,u_0,n_det,size(u_0,1),size(keys_tmp,3),s2,nstates) - print*,'S^2 matrix in the basis of the states considered' - do i = 1, nstates - write(*,'(10(F10.6,X))')s2(i,:) - enddo - - double precision :: accu_precision_diag,accu_precision_of_diag - accu_precision_diag = 0.d0 - accu_precision_of_diag = 0.d0 - do i = 1, nstates - ! Do not combine states of the same spin symmetry - do j = i+1, nstates - if( dabs(s2(i,i) - s2(j,j)) .le.0.5d0) then - s2(i,j) = 0.d0 - s2(j,i) = 0.d0 - endif + + double precision :: accu_precision_diag,accu_precision_of_diag + accu_precision_diag = 0.d0 + accu_precision_of_diag = 0.d0 + do i = 1, nstates + ! Do not combine states of the same spin symmetry + do j = i+1, nstates + if( dabs(s2(i,i) - s2(j,j)) .le.0.5d0) then + s2(i,j) = 0.d0 + s2(j,i) = 0.d0 + endif + enddo + ! Do not rotate if the diagonal is correct + if( dabs(s2(i,i) - expected_s2).le.5.d-3) then + do j = 1, nstates + if (j==i) cycle + s2(i,j) = 0.d0 + s2(j,i) = 0.d0 + enddo + endif enddo - ! Do not rotate if the diagonal is correct - if( dabs(s2(i,i) - expected_s2).le.5.d-3) then - do j = 1, nstates - if (j==i) cycle - s2(i,j) = 0.d0 - s2(j,i) = 0.d0 - enddo - endif - enddo - - print*,'Modified S^2 matrix that will be diagonalized' - do i = 1, nstates - write(*,'(10(F10.6,X))')s2(i,:) - s2(i,i) = s2(i,i) - enddo - - allocate(eigvectors(nstates,nstates)) - call lapack_diagd(s2_eigvalues,eigvectors,s2,nstates,nstates) - print*,'Eigenvalues' - do i = 1, nstates - print*,'s2 = ',s2_eigvalues(i) - enddo - - allocate(psi_coefs_tmp(nmax_coefs,nstates)) - psi_coefs_tmp = 0.d0 - do j = 1, nstates - do k = 1, nstates - coef_contract = eigvectors(k,j) ! - do i = 1, n_det - psi_coefs_tmp(i,j) += u_0(i,k) * coef_contract - enddo + + print*,'Modified S^2 matrix that will be diagonalized' + do i = 1, nstates + write(*,'(10(F5.2,X))')s2(i,:) + s2(i,i) = s2(i,i) enddo - enddo - do j = 1, nstates - accu = 1.d0/u_dot_u(psi_coefs_tmp(1,j),n_det) - do i = 1, n_det - u_0(i,j) = psi_coefs_tmp(i,j) * accu - enddo - enddo + + allocate(eigvectors(nstates,nstates,2)) +! call svd(s2, size(s2,1), eigvectors, size(eigvectors,1), s2_eigvalues,& +! eigvectors(1,1,2), size(eigvectors,1), nstates, nstates) - deallocate(s2,v_0,eigvectors,psi_coefs_tmp,overlap) + call lapack_diagd(s2_eigvalues,eigvectors,s2,nstates,nstates) + print*,'Eigenvalues' + double precision :: t(nstates), iorder(nstates) + do i = 1, nstates + t(i) = dabs(s2_eigvalues(i)) + iorder(i) = i + enddo + call dsort(t,iorder,nstates) + do i = 1, nstates + s2_eigvalues(i) = t(i) + do j=1,nstates + eigvectors(j,i,2) = eigvectors(j,iorder(i),1) + enddo + print*,'s2 = ',s2_eigvalues(i) + enddo + + allocate(psi_coefs_tmp(nmax_coefs,nstates)) + psi_coefs_tmp = 0.d0 + do j = 1, nstates + do k = 1, nstates + coef_contract = eigvectors(k,j,2) ! + do i = 1, n_det + psi_coefs_tmp(i,j) += u_0(i,k) * coef_contract + enddo + enddo + enddo + do j = 1, nstates + accu = 1.d0/u_dot_u(psi_coefs_tmp(1,j),n_det) + do i = 1, n_det + u_0(i,j) = psi_coefs_tmp(i,j) * accu + enddo + enddo + + deallocate(s2,v_0,eigvectors,psi_coefs_tmp,overlap ) + end diff --git a/src/Utils/util.irp.f b/src/Utils/util.irp.f index 91a61a43..751610a5 100644 --- a/src/Utils/util.irp.f +++ b/src/Utils/util.irp.f @@ -303,23 +303,10 @@ double precision function u_dot_v(u,v,sze) END_DOC integer, intent(in) :: sze double precision, intent(in) :: u(sze),v(sze) + double precision, external :: ddot - integer :: i,t1, t2, t3, t4 - - ASSERT (sze > 0) - t1 = 0 - t2 = sze/4 - t3 = t2+t2 - t4 = t3+t2 - u_dot_v = 0.d0 - !DIR$ VECTOR ALWAYS - do i=1,t2 - u_dot_v = u_dot_v + u(t1+i)*v(t1+i) + u(t2+i)*v(t2+i) + & - u(t3+i)*v(t3+i) + u(t4+i)*v(t4+i) - enddo - do i=t4+t2+1,sze - u_dot_v = u_dot_v + u(i)*v(i) - enddo + !DIR$ FORCEINLINE + u_dot_v = ddot(sze,u,1,v,1) end @@ -330,28 +317,10 @@ double precision function u_dot_u(u,sze) END_DOC integer, intent(in) :: sze double precision, intent(in) :: u(sze) + double precision, external :: ddot - integer :: i - integer :: t1, t2, t3, t4 - - ASSERT (sze > 0) - t1 = 0 - t2 = sze/4 - t3 = t2+t2 - t4 = t3+t2 - u_dot_u = 0.d0 -! do i=1,t2 -! u_dot_u = u_dot_u + u(t1+i)*u(t1+i) + u(t2+i)*u(t2+i) + & -! u(t3+i)*u(t3+i) + u(t4+i)*u(t4+i) -! enddo -! do i=t4+t2+1,sze -! u_dot_u = u_dot_u+u(i)*u(i) -! enddo - - !DIR$ VECTOR ALWAYS - do i=1,sze - u_dot_u = u_dot_u + u(i)*u(i) - enddo + !DIR$ FORCEINLINE + u_dot_u = ddot(sze,u,1,u,1) end @@ -364,18 +333,17 @@ subroutine normalize(u,sze) integer, intent(in) :: sze double precision, intent(inout):: u(sze) double precision :: d - double precision, external :: u_dot_u + double precision, external :: dnrm2 integer :: i !DIR$ FORCEINLINE - d = u_dot_u(u,sze) + d = dnrm2(sze,u,1) if (d /= 0.d0) then - d = 1.d0/dsqrt( d ) + d = 1.d0/d endif if (d /= 1.d0) then - do i=1,sze - u(i) = d*u(i) - enddo + !DIR$ FORCEINLINE + call dscal(sze,d,u,1) endif end From 7f60089223c5977106eb872e0d3c17efccbfc835 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sat, 24 Sep 2016 02:21:27 +0200 Subject: [PATCH 130/216] Davidson is broken because N_states < N_states_diag --- plugins/Generators_full/generators.irp.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Generators_full/generators.irp.f b/plugins/Generators_full/generators.irp.f index a61fc5c5..14bc18d4 100644 --- a/plugins/Generators_full/generators.irp.f +++ b/plugins/Generators_full/generators.irp.f @@ -30,7 +30,7 @@ END_PROVIDER ! Hartree-Fock determinant END_DOC integer :: i, k - do i=1,N_det + do i=1,N_det_generators do k=1,N_int psi_det_generators(k,1,i) = psi_det_sorted(k,1,i) psi_det_generators(k,2,i) = psi_det_sorted(k,2,i) From f75ce67a8749f92cce038324e74502151f840cc5 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 25 Sep 2016 22:14:17 +0200 Subject: [PATCH 131/216] FIxed Davidson --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 84 ++++++++++++----------- plugins/Full_CI_ZMQ/selection_slave.irp.f | 2 +- plugins/Generators_full/generators.irp.f | 2 + src/Davidson/diagonalize_CI.irp.f | 20 +++--- src/Davidson/parameters.irp.f | 2 +- 5 files changed, 56 insertions(+), 54 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index dbf8414b..5c4f15a4 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -1,11 +1,11 @@ program fci_zmq implicit none integer :: i,j,k - logical, external :: detEq + logical, external :: detEq double precision, allocatable :: pt2(:) integer :: degree - + allocate (pt2(N_states)) pt2 = 1.d0 @@ -30,10 +30,10 @@ program fci_zmq print *, '-----' enddo endif - double precision :: E_CI_before(N_states) + double precision :: E_CI_before(N_states) - - integer :: n_det_before + + integer :: n_det_before print*,'Beginning the selection ...' E_CI_before(1:N_states) = CI_energy(1:N_states) @@ -44,16 +44,16 @@ program fci_zmq 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 + 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 - + print *, 'N_det = ', N_det print *, 'N_states = ', N_states do k=1, N_states @@ -64,42 +64,44 @@ program fci_zmq enddo print *, '-----' 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 + 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 + 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(1:N_states) = CI_energy(1:N_states) 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 - print*,'Last iteration only to compute the PT2' - threshold_selectors = 1.d0 - threshold_generators = 0.9999d0 - E_CI_before(1:N_states) = CI_energy(1:N_states) - call ZMQ_selection(1, pt2) - print *, 'Final step' - print *, 'N_det = ', N_det - print *, 'N_states = ', N_states - do k=1,N_states - print *, 'State', k - print *, 'PT2 = ', pt2 - print *, 'E = ', E_CI_before - print *, 'E+PT2 = ', E_CI_before+pt2 - print *, '-----' - enddo - call ezfio_set_full_ci_energy_pt2(E_CI_before+pt2) - endif - call save_wavefunction + if (N_det > N_det_max) then + N_det = N_det_max + touch N_det psi_det psi_coef + call diagonalize_CI + endif + if(do_pt2_end)then + print*,'Last iteration only to compute the PT2' + threshold_selectors = 1.d0 + threshold_generators = 0.9999d0 + E_CI_before(1:N_states) = CI_energy(1:N_states) + call ZMQ_selection(1, pt2) + print *, 'Final step' + print *, 'N_det = ', N_det + print *, 'N_states = ', N_states + do k=1,N_states + print *, 'State', k + print *, 'PT2 = ', pt2 + print *, 'E = ', E_CI_before + print *, 'E+PT2 = ', E_CI_before+pt2 + print *, '-----' + enddo + call ezfio_set_full_ci_energy_pt2(E_CI_before+pt2) + endif + call save_wavefunction end diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index 438892d3..4c365238 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -58,7 +58,7 @@ subroutine update_energy(energy) ! Update energy when it is received from ZMQ END_DOC integer :: j,k - do j=1,N_states_diag + do j=1,N_states do k=1,N_det CI_eigenvectors(k,j) = psi_coef(k,j) enddo diff --git a/plugins/Generators_full/generators.irp.f b/plugins/Generators_full/generators.irp.f index 14bc18d4..eea5821b 100644 --- a/plugins/Generators_full/generators.irp.f +++ b/plugins/Generators_full/generators.irp.f @@ -30,6 +30,8 @@ END_PROVIDER ! Hartree-Fock determinant END_DOC integer :: i, k + psi_coef_generators = 0.d0 + psi_det_generators = 0_bit_kind do i=1,N_det_generators do k=1,N_int psi_det_generators(k,1,i) = psi_det_sorted(k,1,i) diff --git a/src/Davidson/diagonalize_CI.irp.f b/src/Davidson/diagonalize_CI.irp.f index b6e57cb9..e6b230b5 100644 --- a/src/Davidson/diagonalize_CI.irp.f +++ b/src/Davidson/diagonalize_CI.irp.f @@ -8,8 +8,10 @@ BEGIN_PROVIDER [ double precision, CI_energy, (N_states_diag) ] integer :: j character*(8) :: st call write_time(output_determinants) - do j=1,min(N_det,N_states) + do j=1,min(N_det,N_states_diag) CI_energy(j) = CI_electronic_energy(j) + nuclear_repulsion + enddo + do j=1,min(N_det,N_states) write(st,'(I4)') j call write_double(output_determinants,CI_energy(j),'Energy of state '//trim(st)) call write_double(output_determinants,CI_eigenvectors_s2(j),'S^2 of state '//trim(st)) @@ -38,14 +40,14 @@ END_PROVIDER double precision, allocatable :: e_array(:) integer, allocatable :: iorder(:) - ! Guess values for the "N_states_diag" states of the CI_eigenvectors + ! Guess values for the "N_states" states of the CI_eigenvectors do j=1,min(N_states,N_det) do i=1,N_det CI_eigenvectors(i,j) = psi_coef(i,j) enddo enddo - do j=N_det+1,N_states_diag + do j=min(N_states,N_det)+1,N_states_diag do i=1,N_det CI_eigenvectors(i,j) = 0.d0 enddo @@ -143,14 +145,15 @@ END_PROVIDER endif - if( s2_eig.and.(n_states_diag > 1).and.(n_det >= n_states_diag) )then + if( s2_eig.and.(N_states_diag > 1).and.(N_det >= N_states_diag) )then ! Diagonalizing S^2 within the "n_states_diag" states found allocate(s2_eigvalues(N_states_diag), e_array(N_states_diag)) - call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors,n_det,size(psi_det,3),size(CI_eigenvectors,1),min(n_states_diag,n_det),s2_eigvalues) + call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors,N_det,size(psi_det,3), & + size(CI_eigenvectors,1),min(n_states_diag,n_det),s2_eigvalues) double precision, allocatable :: psi_coef_tmp(:,:) allocate(psi_coef_tmp(psi_det_size,N_states_diag)) - do j = 1, N_states + do j = 1, N_states_diag do i = 1, N_det psi_coef_tmp(i,j) = CI_eigenvectors(i,j) enddo @@ -200,11 +203,6 @@ END_PROVIDER CI_eigenvectors_s2(i_state + i_other_state) = s2_eigvalues(j) CI_electronic_energy(i_state + i_other_state) = e_array(i_state + i_other_state) enddo - do j=1,N_states - do i=1,N_det - psi_coef(i,j) = psi_coef_tmp(i,j) - enddo - enddo deallocate(iorder,e_array,index_good_state_array,good_state_array,psi_coef_tmp) deallocate(s2_eigvalues) diff --git a/src/Davidson/parameters.irp.f b/src/Davidson/parameters.irp.f index d9c82e3c..82315495 100644 --- a/src/Davidson/parameters.irp.f +++ b/src/Davidson/parameters.irp.f @@ -12,7 +12,7 @@ BEGIN_PROVIDER [ integer, davidson_sze_max ] ! Max number of Davidson sizes END_DOC ASSERT (davidson_sze_max <= davidson_iter_max) - davidson_sze_max = 8*N_states + davidson_sze_max = N_states+7 END_PROVIDER From 8e47ce1a3c876fc197a9b43c6c3a0c4509321b33 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 25 Sep 2016 22:23:36 +0200 Subject: [PATCH 132/216] Gaussian vectors in Davidson --- src/Davidson/diagonalization.irp.f | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Davidson/diagonalization.irp.f b/src/Davidson/diagonalization.irp.f index 7094ba5b..802fee95 100644 --- a/src/Davidson/diagonalization.irp.f +++ b/src/Davidson/diagonalization.irp.f @@ -322,6 +322,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia character*(16384) :: write_buffer double precision :: to_print(2,N_st) double precision :: cpu, wall + include 'constants.include.F' !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: U, W, R, y, h, lambda @@ -382,9 +383,13 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia converged = .False. do k=N_st+1,N_st_diag + double precision :: r1, r2 do i=1,sze - call RANDOM_NUMBER(u_in(i,k)) - u_in(i,k) = u_in(i,k) - 0.5d0 + call random_number(r1) + call random_number(r2) + u_in(i,k) = dsqrt(-2.d0*dlog(r1))*dcos(dtwo_pi*r2) +! call RANDOM_NUMBER(u_in(i,k)) +! u_in(i,k) = u_in(i,k) - 0.5d0 enddo ! Gram-Schmidt From 4d31da34ff896cbbbc86e8ca62b630581c33bf72 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 25 Sep 2016 22:55:07 +0200 Subject: [PATCH 133/216] Accelerated davidson --- src/Davidson/diagonalization.irp.f | 58 +++++++++++++++--------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/Davidson/diagonalization.irp.f b/src/Davidson/diagonalization.irp.f index 802fee95..463edd3a 100644 --- a/src/Davidson/diagonalization.irp.f +++ b/src/Davidson/diagonalization.irp.f @@ -388,8 +388,6 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia call random_number(r1) call random_number(r2) u_in(i,k) = dsqrt(-2.d0*dlog(r1))*dcos(dtwo_pi*r2) -! call RANDOM_NUMBER(u_in(i,k)) -! u_in(i,k) = u_in(i,k) - 0.5d0 enddo ! Gram-Schmidt @@ -422,7 +420,7 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! Compute h_kl = = ! ------------------------------------------- -! + ! do l=1,N_st_diag ! do k=1,N_st_diag ! do iter2=1,iter-1 @@ -436,11 +434,10 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! enddo ! enddo - call dgemm('T','N', N_st_diag*iter, N_st_diag, sze, & - 1.d0, U, size(U,1), W(1,1,iter), size(W,1), & + call dgemm('T','N', N_st_diag*iter, N_st_diag, sze, & + 1.d0, U, size(U,1), W(1,1,iter), size(W,1), & 0.d0, h(1,1,1,iter), size(h,1)*size(h,2)) - ! Diagonalize h ! ------------- call lapack_diag(lambda,y,h,N_st_diag*davidson_sze_max,N_st_diag*iter) @@ -453,21 +450,23 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia U(i,k,iter+1) = 0.d0 W(i,k,iter+1) = 0.d0 enddo - do iter2=1,iter - do l=1,N_st_diag - do i=1,sze - U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1) - W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1) - enddo - enddo - enddo enddo +! do k=1,N_st_diag +! do iter2=1,iter +! do l=1,N_st_diag +! do i=1,sze +! U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1) +! W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1) +! enddo +! enddo +! enddo +! enddo -! call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, & -! 1.d0, U, size(U,1), y, size(y,1)*size(y,2), 0.d0, U(1,1,iter+1), size(U,1)) -! call dgemm('N','N',sze,N_st_diag,N_st_diag*iter, & -! 1.d0, W, size(W,1), y, size(y,1)*size(y,2), 0.d0, W(1,1,iter+1), size(W,1)) + call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, & + 1.d0, U, size(U,1), y, size(y,1)*size(y,2), 0.d0, U(1,1,iter+1), size(U,1)) + call dgemm('N','N',sze,N_st_diag,N_st_diag*iter, & + 1.d0, W, size(W,1), y, size(y,1)*size(y,2), 0.d0, W(1,1,iter+1), size(W,1)) ! Compute residual vector @@ -544,22 +543,23 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia do k=1,N_st_diag energies(k) = lambda(k) - enddo - - do k=1,N_st_diag do i=1,sze u_in(i,k) = 0.d0 - do iter2=1,iter - do l=1,N_st_diag - u_in(i,k) += U(i,l,iter2)*y(l,iter2,k,1) - enddo - enddo enddo enddo +! do k=1,N_st_diag +! do i=1,sze +! do iter2=1,iter +! do l=1,N_st_diag +! u_in(i,k) += U(i,l,iter2)*y(l,iter2,k,1) +! enddo +! enddo +! enddo +! enddo -! call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, 1.d0, & -! U, size(U,1), y, N_st_diag*davidson_sze_max, & -! 0.d0, u_in, size(u_in,1)) + call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, 1.d0, & + U, size(U,1), y, N_st_diag*davidson_sze_max, & + 0.d0, u_in, size(u_in,1)) enddo From a30a00bab9e136b2d8be02410e2943415d738d13 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 25 Sep 2016 23:28:25 +0200 Subject: [PATCH 134/216] Moved n_states_diag --- ocaml/Input_determinants_by_hand.ml | 17 ----------------- ocaml/qptypes_generator.ml | 8 ++------ scripts/compilation/qp_create_ninja.py | 6 +++--- src/Davidson/EZFIO.cfg | 12 ++++++++++++ src/Determinants/EZFIO.cfg | 12 ------------ src/Determinants/determinants.irp.f | 2 +- src/Determinants/options.irp.f | 25 ------------------------- 7 files changed, 18 insertions(+), 64 deletions(-) create mode 100644 src/Davidson/EZFIO.cfg delete mode 100644 src/Determinants/options.irp.f diff --git a/ocaml/Input_determinants_by_hand.ml b/ocaml/Input_determinants_by_hand.ml index c69c8ad9..76080b02 100644 --- a/ocaml/Input_determinants_by_hand.ml +++ b/ocaml/Input_determinants_by_hand.ml @@ -93,23 +93,6 @@ end = struct ;; - let read_n_states_diag () = - if not (Ezfio.has_determinants_n_states_diag ()) then - read_n_states () - |> States_number.to_int - |> Ezfio.set_determinants_n_states_diag - ; - Ezfio.get_determinants_n_states_diag () - |> States_number.of_int - ;; - - let write_n_states_diag ~n_states n = - let n_states = States_number.to_int n_states - and n = States_number.to_int n - in - Ezfio.set_determinants_n_states_diag (max n_states n) - ;; - let read_expected_s2 () = if not (Ezfio.has_determinants_expected_s2 ()) then begin diff --git a/ocaml/qptypes_generator.ml b/ocaml/qptypes_generator.ml index d04d6629..ee988ccb 100644 --- a/ocaml/qptypes_generator.ml +++ b/ocaml/qptypes_generator.ml @@ -47,12 +47,8 @@ let input_data = " * States_number : int assert (x > 0) ; - if (x > 100) then - warning \"More than 100 states\"; - if (Ezfio.has_determinants_n_states_diag ()) then - assert (x <= (Ezfio.get_determinants_n_states_diag ())) - else if (Ezfio.has_determinants_n_states ()) then - assert (x <= (Ezfio.get_determinants_n_states ())); + if (x > 1000) then + warning \"More than 1000 states\"; * Bit_kind_size : int begin match x with diff --git a/scripts/compilation/qp_create_ninja.py b/scripts/compilation/qp_create_ninja.py index b5ae96e5..b495019a 100755 --- a/scripts/compilation/qp_create_ninja.py +++ b/scripts/compilation/qp_create_ninja.py @@ -796,10 +796,10 @@ def create_build_ninja_global(): l_string += ["build dummy_target: update_build_ninja_root", - "build ocaml_target: make_ocaml | dummy_target", + "build ocaml_target: make_ocaml all", "", - "build all: make_all dummy_target ocaml_target", - "default all", + "build all: make_all dummy_target", + "default ocaml_target", "", "build clean: make_clean dummy_target", "", ] diff --git a/src/Davidson/EZFIO.cfg b/src/Davidson/EZFIO.cfg new file mode 100644 index 00000000..de2a6954 --- /dev/null +++ b/src/Davidson/EZFIO.cfg @@ -0,0 +1,12 @@ +[threshold_davidson] +type: Threshold +doc: Thresholds of Davidson's algorithm +interface: ezfio,provider,ocaml +default: 1.e-12 + +[n_states_diag] +type: States_number +doc: n_states_diag +default: 1 +interface: ezfio,provider,ocaml + diff --git a/src/Determinants/EZFIO.cfg b/src/Determinants/EZFIO.cfg index 4ab84b7a..41e05bda 100644 --- a/src/Determinants/EZFIO.cfg +++ b/src/Determinants/EZFIO.cfg @@ -40,12 +40,6 @@ doc: Force the wave function to be an eigenfunction of S^2 interface: ezfio,provider,ocaml default: False -[threshold_davidson] -type: Threshold -doc: Thresholds of Davidson's algorithm -interface: ezfio,provider,ocaml -default: 1.e-12 - [threshold_generators] type: Threshold doc: Thresholds on generators (fraction of the norm) @@ -58,12 +52,6 @@ doc: Thresholds on selectors (fraction of the norm) interface: ezfio,provider,ocaml default: 0.999 -[n_states_diag] -type: States_number -doc: n_states_diag -default: 1 -interface: ezfio,provider,ocaml - [n_int] interface: ezfio doc: n_int diff --git a/src/Determinants/determinants.irp.f b/src/Determinants/determinants.irp.f index 1f2863eb..7d88634e 100644 --- a/src/Determinants/determinants.irp.f +++ b/src/Determinants/determinants.irp.f @@ -11,7 +11,7 @@ BEGIN_PROVIDER [ character*(64), diag_algorithm ] diag_algorithm = "Lapack" endif - if (N_det < N_states_diag) then + if (N_det < N_states) then diag_algorithm = "Lapack" endif END_PROVIDER diff --git a/src/Determinants/options.irp.f b/src/Determinants/options.irp.f deleted file mode 100644 index 365021db..00000000 --- a/src/Determinants/options.irp.f +++ /dev/null @@ -1,25 +0,0 @@ -BEGIN_PROVIDER [ integer, N_states_diag ] - implicit none - BEGIN_DOC -! Number of states to consider for the diagonalization - END_DOC - - logical :: has - PROVIDE ezfio_filename - call ezfio_has_determinants_n_states_diag(has) - if (has) then - call ezfio_get_determinants_n_states_diag(N_states_diag) - else - N_states_diag = N_states - endif - if (N_states_diag < N_states) then - N_states_diag = N_states - endif - - call write_time(output_determinants) - call write_int(output_determinants, N_states_diag, & - 'N_states_diag') - - -END_PROVIDER - From 72bff78dba2f03064c5a9beb34cd194d0e62b3f7 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 26 Sep 2016 20:34:16 +0200 Subject: [PATCH 135/216] Normalize in input of Davidson --- plugins/Full_CI/full_ci.irp.f | 24 ++++++++------ plugins/Full_CI_ZMQ/fci_zmq.irp.f | 3 +- plugins/Full_CI_ZMQ/selection.irp.f | 15 +++++++-- plugins/Perturbation/perturbation.template.f | 1 - src/Davidson/diagonalization.irp.f | 35 +++++++++++--------- src/Determinants/determinants.irp.f | 4 +-- src/Determinants/s2.irp.f | 3 +- tests/bats/qp.bats | 4 +-- 8 files changed, 52 insertions(+), 37 deletions(-) diff --git a/plugins/Full_CI/full_ci.irp.f b/plugins/Full_CI/full_ci.irp.f index e6d0f7f2..7070bd13 100644 --- a/plugins/Full_CI/full_ci.irp.f +++ b/plugins/Full_CI/full_ci.irp.f @@ -40,7 +40,7 @@ program full_ci integer :: n_det_before print*,'Beginning the selection ...' - E_CI_before = CI_energy + E_CI_before(1:N_states) = CI_energy(1:N_states) 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) @@ -49,13 +49,16 @@ program full_ci 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 + + if (N_det > N_det_max) then + N_det = N_det_max + psi_det = psi_det_sorted + psi_coef = psi_coef_sorted + touch N_det psi_det psi_coef psi_det_sorted psi_coef_sorted psi_average_norm_contrib_sorted + endif + + call save_wavefunction if(n_det_before == N_det)then selection_criterion = selection_criterion * 0.5d0 @@ -69,7 +72,6 @@ program full_ci 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 @@ -82,8 +84,8 @@ program full_ci 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) + E_CI_before(1:N_states) = CI_energy(1:N_states) + call ezfio_set_full_ci_energy(CI_energy(1)) enddo N_det = min(N_det_max,N_det) touch N_det psi_det psi_coef @@ -101,7 +103,7 @@ program full_ci print *, 'E = ', CI_energy print *, 'E+PT2 = ', CI_energy+pt2 print *, '-----' - call ezfio_set_full_ci_energy_pt2(CI_energy+pt2) + call ezfio_set_full_ci_energy_pt2(CI_energy(1)+pt2(1)) endif call save_wavefunction deallocate(pt2,norm_pert) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 5c4f15a4..47e79b7c 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -44,6 +44,8 @@ program fci_zmq PROVIDE psi_coef PROVIDE psi_det PROVIDE psi_det_sorted + + call diagonalize_CI if (N_det > N_det_max) then psi_det = psi_det_sorted @@ -51,7 +53,6 @@ program fci_zmq N_det = N_det_max soft_touch N_det psi_det psi_coef endif - call diagonalize_CI call save_wavefunction print *, 'N_det = ', N_det diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index c1f529dc..2364c2e4 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -93,10 +93,19 @@ subroutine select_connected(i_generator,E0,pt2,b) particle_mask(k,1) = iand(generators_bitmask(k,1,s_part,l), not(psi_det_generators(k,1,i_generator)) ) particle_mask(k,2) = iand(generators_bitmask(k,2,s_part,l), not(psi_det_generators(k,2,i_generator)) ) - hole_mask(k,1) = ior(generators_bitmask(k,1,s_hole,l), generators_bitmask(k,1,s_part,l)) - hole_mask(k,2) = ior(generators_bitmask(k,2,s_hole,l), generators_bitmask(k,2,s_part,l)) - particle_mask(k,:) = hole_mask(k,:) +! hole_mask(k,1) = ior(generators_bitmask(k,1,s_hole,l), generators_bitmask(k,1,s_part,l)) +! hole_mask(k,2) = ior(generators_bitmask(k,2,s_hole,l), generators_bitmask(k,2,s_part,l)) +! particle_mask(k,1) = hole_mask(k,1) +! particle_mask(k,2) = hole_mask(k,2) enddo + print *, 'det' + call debug_det(psi_det_generators(1,1,i_generator),N_int) + print *, 'hole' + call debug_det(hole_mask,N_int) + print *, 'particle_mask' + call debug_det(particle_mask,N_int) + print *, '' + pause call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) enddo diff --git a/plugins/Perturbation/perturbation.template.f b/plugins/Perturbation/perturbation.template.f index 7bb08c21..a445bec0 100644 --- a/plugins/Perturbation/perturbation.template.f +++ b/plugins/Perturbation/perturbation.template.f @@ -131,7 +131,6 @@ subroutine perturb_buffer_$PERT(i_generator,buffer,buffer_size,e_2_pert_buffer,c ! TODO OLD ! if(is_connected_to(buffer(1,1,i), microlist_gen(:,:,1:ptr_microlist_gen(1)-1), Nint, N_microlist_gen(0))) then ! TODO OLD - ASSERT ( N_microlist_gen(0) <= buffer_size) if(is_connected_to(buffer(1,1,i), microlist_gen(1,1,1), Nint, N_microlist_gen(0))) then cycle end if diff --git a/src/Davidson/diagonalization.irp.f b/src/Davidson/diagonalization.irp.f index 463edd3a..085a35b7 100644 --- a/src/Davidson/diagonalization.irp.f +++ b/src/Davidson/diagonalization.irp.f @@ -381,25 +381,28 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! =================== converged = .False. + + do k=1,N_st_diag - do k=N_st+1,N_st_diag - double precision :: r1, r2 - do i=1,sze - call random_number(r1) - call random_number(r2) - u_in(i,k) = dsqrt(-2.d0*dlog(r1))*dcos(dtwo_pi*r2) - enddo + if (k > N_st) then + do i=1,sze + double precision :: r1, r2 + call random_number(r1) + call random_number(r2) + u_in(i,k) = dsqrt(-2.d0*dlog(r1))*dcos(dtwo_pi*r2) + enddo + endif ! Gram-Schmidt ! ------------ - call dgemv('T',sze,k-1,1.d0,u_in,size(u_in,1), & + call dgemv('T',sze,k-1,1.d0,u_in,size(u_in,1), & u_in(1,k),1,0.d0,c,1) - call dgemv('N',sze,k-1,-1.d0,u_in,size(u_in,1), & + call dgemv('N',sze,k-1,-1.d0,u_in,size(u_in,1), & c,1,1.d0,u_in(1,k),1) - call normalize( u_in(1,k), sze ) - + call normalize(u_in(1,k),sze) enddo + do while (.not.converged) @@ -461,8 +464,8 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! enddo ! enddo ! enddo - - +! +! call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, & 1.d0, U, size(U,1), y, size(y,1)*size(y,2), 0.d0, U(1,1,iter+1), size(U,1)) call dgemm('N','N',sze,N_st_diag,N_st_diag*iter, & @@ -511,19 +514,19 @@ subroutine davidson_diag_hjj(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_st_dia ! enddo ! enddo ! enddo - +! call dgemv('T',sze,N_st_diag*iter,1.d0,U,size(U,1), & U(1,k,iter+1),1,0.d0,c,1) call dgemv('N',sze,N_st_diag*iter,-1.d0,U,size(U,1), & c,1,1.d0,U(1,k,iter+1),1) - +! ! do l=1,k-1 ! c(1) = u_dot_v(U(1,k,iter+1),U(1,l,iter+1),sze) ! do i=1,sze ! U(i,k,iter+1) = U(i,k,iter+1) - c(1) * U(i,l,iter+1) ! enddo ! enddo - +! call dgemv('T',sze,k-1,1.d0,U(1,1,iter+1),size(U,1), & U(1,k,iter+1),1,0.d0,c,1) call dgemv('N',sze,k-1,-1.d0,U(1,1,iter+1),size(U,1), & diff --git a/src/Determinants/determinants.irp.f b/src/Determinants/determinants.irp.f index 7d88634e..3850ab40 100644 --- a/src/Determinants/determinants.irp.f +++ b/src/Determinants/determinants.irp.f @@ -90,6 +90,7 @@ BEGIN_PROVIDER [ integer(bit_kind), psi_det, (N_int,2,psi_det_size) ] logical :: exists character*64 :: label + psi_det = 0_bit_kind if (read_wf) then call ezfio_has_determinants_N_int(exists) if (exists) then @@ -255,7 +256,7 @@ BEGIN_PROVIDER [ double precision, psi_coef, (psi_det_size,N_states) ] character*(64) :: label psi_coef = 0.d0 - do i=1,N_states + do i=1,min(N_states,psi_det_size) psi_coef(i,i) = 1.d0 enddo @@ -331,7 +332,6 @@ END_PROVIDER iorder(i) = i enddo call dsort(psi_average_norm_contrib_sorted,iorder,N_det) - !DIR$ IVDEP do i=1,N_det do j=1,N_int psi_det_sorted(j,1,i) = psi_det(j,1,iorder(i)) diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index 78b2d1e7..a9722df7 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -381,7 +381,8 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,u_0,n,nmax_keys,nmax_coefs,nsta call lapack_diagd(s2_eigvalues,eigvectors,s2,nstates,nstates) print*,'Eigenvalues' - double precision :: t(nstates), iorder(nstates) + double precision :: t(nstates) + integer :: iorder(nstates) do i = 1, nstates t(i) = dabs(s2_eigvalues(i)) iorder(i) = i diff --git a/tests/bats/qp.bats b/tests/bats/qp.bats index 78ed973d..aa283916 100644 --- a/tests/bats/qp.bats +++ b/tests/bats/qp.bats @@ -68,7 +68,7 @@ function run_FCI() { ezfio set_file $1 ezfio set perturbation do_pt2_end True ezfio set determinants n_det_max $2 - ezfio set determinants threshold_davidson 1.e-10 + ezfio set davidson threshold_davidson 1.e-10 qp_run full_ci $1 energy="$(ezfio get full_ci energy)" @@ -83,7 +83,7 @@ function run_all_1h_1p() { ezfio set_file $1 ezfio set determinants n_det_max $2 ezfio set perturbation pt2_max $3 - ezfio set determinants threshold_davidson 1.e-10 + ezfio set davidson threshold_davidson 1.e-10 qp_run all_1h_1p $1 | tee $1.F1h1p.out energy="$(ezfio get all_singles energy)" From 80805e7abca46fae01964df625de6f0cfae359a8 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 27 Sep 2016 09:28:34 +0200 Subject: [PATCH 136/216] N_det_generators <= N_det_selectors --- plugins/Full_CI_ZMQ/selection.irp.f | 12 ---- plugins/Full_CI_ZMQ/selection_double.irp.f | 82 ++++++++++++---------- plugins/Full_CI_ZMQ/selection_single.irp.f | 8 ++- plugins/Selectors_full/selectors.irp.f | 40 ++++++----- src/Determinants/determinants.irp.f | 4 ++ 5 files changed, 75 insertions(+), 71 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 2364c2e4..ff32d56b 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -93,19 +93,7 @@ subroutine select_connected(i_generator,E0,pt2,b) particle_mask(k,1) = iand(generators_bitmask(k,1,s_part,l), not(psi_det_generators(k,1,i_generator)) ) particle_mask(k,2) = iand(generators_bitmask(k,2,s_part,l), not(psi_det_generators(k,2,i_generator)) ) -! hole_mask(k,1) = ior(generators_bitmask(k,1,s_hole,l), generators_bitmask(k,1,s_part,l)) -! hole_mask(k,2) = ior(generators_bitmask(k,2,s_hole,l), generators_bitmask(k,2,s_part,l)) -! particle_mask(k,1) = hole_mask(k,1) -! particle_mask(k,2) = hole_mask(k,2) enddo - print *, 'det' - call debug_det(psi_det_generators(1,1,i_generator),N_int) - print *, 'hole' - call debug_det(hole_mask,N_int) - print *, 'particle_mask' - call debug_det(particle_mask,N_int) - print *, '' - pause call select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) call select_singles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,b) enddo diff --git a/plugins/Full_CI_ZMQ/selection_double.irp.f b/plugins/Full_CI_ZMQ/selection_double.irp.f index d31f9a6a..83418307 100644 --- a/plugins/Full_CI_ZMQ/selection_double.irp.f +++ b/plugins/Full_CI_ZMQ/selection_double.irp.f @@ -4,15 +4,15 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p use selection_types implicit none - integer, intent(in) :: i_generator - integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) - double precision, intent(in) :: fock_diag_tmp(mo_tot_num) - double precision, intent(in) :: E0(N_states) + integer, intent(in) :: i_generator + integer(bit_kind), intent(in) :: hole_mask(N_int,2), particle_mask(N_int,2) + double precision, intent(in) :: fock_diag_tmp(mo_tot_num) + double precision, intent(in) :: E0(N_states) double precision, intent(inout) :: pt2(N_states) type(selection_buffer), intent(inout) :: buf double precision :: mat(N_states, mo_tot_num, mo_tot_num) - integer :: h1,h2,s1,s2,i1,i2,ib,sp,k + integer :: h1,h2,s1,s2,s3,i1,i2,ib,sp,k,i integer(bit_kind) :: hole(N_int,2), particle(N_int,2), mask(N_int, 2) logical :: fullMatch, ok @@ -30,40 +30,48 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) + !call assert(psi_det_generators(1,1,i_generator) == psi_det_sorted(1,1,i_generator), "sorted selex") do s1=1,2 - do s2=s1,2 - sp = s1 - if(s1 /= s2) sp = 3 - do i1=N_holes(s1),1,-1 ! Generate low excitations first - ib = 1 - if(s1 == s2) ib = i1+1 - do i2=N_holes(s2),ib,-1 ! Generate low excitations first - h1 = hole_list(i1,s1) - h2 = hole_list(i2,s2) - call apply_holes(psi_det_generators(1,1,i_generator), s1,h1,s2,h2, mask, ok, N_int) - !call assert(ok, irp_here) - - logical :: banned(mo_tot_num, mo_tot_num,2) - logical :: bannedOrb(mo_tot_num, 2) - - banned = .false. - bannedOrb = .false. - bannedOrb(h1, s1) = .true. - bannedOrb(h2, s2) = .true. - - call spot_isinwf(mask, psi_det_sorted, i_generator, N_det, banned, fullMatch) - if(fullMatch) cycle - if(sp /= 2) call spot_occupied(mask(1,1), bannedOrb(1,1)) - if(sp /= 1) call spot_occupied(mask(1,2), bannedOrb(1,2)) - - mat = 0d0 - call splash_pq(mask, sp, psi_det_sorted, i_generator, N_det_selectors, bannedOrb, banned, mat) - call fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_diag_tmp, E0, pt2, mat, buf) - end do - end do - end do - end do + do s2=s1,2 + sp = s1 + if(s1 /= s2) sp = 3 + do i1=N_holes(s1),1,-1 ! Generate low excitations first + ib = 1 + if(s1 == s2) ib = i1+1 + do i2=N_holes(s2),ib,-1 ! Generate low excitations first + h1 = hole_list(i1,s1) + h2 = hole_list(i2,s2) + call apply_holes(psi_det_generators(1,1,i_generator), s1,h1,s2,h2, mask, ok, N_int) + !call assert(ok, irp_here) + + logical :: banned(mo_tot_num, mo_tot_num,2) + logical :: bannedOrb(mo_tot_num, 2) + + banned = .false. + bannedOrb(h1, s1) = .true. + bannedOrb(h2, s2) = .true. + + bannedOrb(1:mo_tot_num, 1:2) = .true. + do s3=1,2 + do i=1,N_particles(s3) + bannedOrb(particle_list(i,s3), s3) = .false. + enddo + enddo + + + call spot_isinwf(mask, psi_det_sorted, i_generator, N_det, banned, fullMatch) + if(fullMatch) cycle + if(sp /= 2) call spot_occupied(mask(1,1), bannedOrb(1,1)) + if(sp /= 1) call spot_occupied(mask(1,2), bannedOrb(1,2)) + + mat = 0d0 + call splash_pq(mask, sp, psi_det_sorted, i_generator, N_det_selectors, bannedOrb, banned, mat) + call fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_diag_tmp, E0, pt2, mat, buf) + enddo + enddo + enddo + enddo end subroutine diff --git a/plugins/Full_CI_ZMQ/selection_single.irp.f b/plugins/Full_CI_ZMQ/selection_single.irp.f index a49ae879..77d985af 100644 --- a/plugins/Full_CI_ZMQ/selection_single.irp.f +++ b/plugins/Full_CI_ZMQ/selection_single.irp.f @@ -16,7 +16,7 @@ subroutine select_singles(i_gen,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf double precision :: vect(N_states, mo_tot_num) logical :: bannedOrb(mo_tot_num) - integer :: i, k + integer :: i, j, k integer :: h1,h2,s1,s2,i1,i2,ib,sp integer(bit_kind) :: hole(N_int,2), particle(N_int,2), mask(N_int, 2) logical :: fullMatch, ok @@ -44,8 +44,10 @@ subroutine select_singles(i_gen,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf h1 = hole_list(i,sp) call apply_hole(psi_det_generators(1,1,i_gen), sp, h1, mask, ok, N_int) !call assert(ok, irp_here) - bannedOrb = .false. - bannedOrb(h1) = .true. + bannedOrb = .true. + do j=1,N_particles(sp) + bannedOrb(particle_list(j, sp)) = .false. + end do call spot_hasBeen(mask, sp, psi_det_sorted, i_gen, N_det, bannedOrb, fullMatch) if(fullMatch) cycle call spot_occupied(mask(1,sp), bannedOrb) diff --git a/plugins/Selectors_full/selectors.irp.f b/plugins/Selectors_full/selectors.irp.f index 6fbad9ec..62f0aeaa 100644 --- a/plugins/Selectors_full/selectors.irp.f +++ b/plugins/Selectors_full/selectors.irp.f @@ -6,25 +6,27 @@ BEGIN_PROVIDER [ integer, psi_selectors_size ] END_PROVIDER BEGIN_PROVIDER [ integer, N_det_selectors] - implicit none - BEGIN_DOC - ! For Single reference wave functions, the number of selectors is 1 : the - ! Hartree-Fock determinant - END_DOC - integer :: i - double precision :: norm - call write_time(output_determinants) - norm = 0.d0 - N_det_selectors = N_det - do i=1,N_det - norm = norm + psi_average_norm_contrib_sorted(i) - if (norm > threshold_selectors) then - N_det_selectors = i-1 - exit - endif - enddo - N_det_selectors = max(N_det_selectors,1) - call write_int(output_determinants,N_det_selectors,'Number of selectors') + implicit none + BEGIN_DOC + ! For Single reference wave functions, the number of selectors is 1 : the + ! Hartree-Fock determinant + END_DOC + integer :: i + double precision :: norm, norm_max + call write_time(output_determinants) + N_det_selectors = N_det + if (threshold_generators < 1.d0) then + norm = 0.d0 + do i=1,N_det + norm = norm + psi_average_norm_contrib_sorted(i) + if (norm > threshold_selectors) then + N_det_selectors = i-1 + exit + endif + enddo + N_det_selectors = max(N_det_selectors,1) + endif + call write_int(output_determinants,N_det_selectors,'Number of selectors') END_PROVIDER BEGIN_PROVIDER [ integer(bit_kind), psi_selectors, (N_int,2,psi_selectors_size) ] diff --git a/src/Determinants/determinants.irp.f b/src/Determinants/determinants.irp.f index 3850ab40..39b0f58e 100644 --- a/src/Determinants/determinants.irp.f +++ b/src/Determinants/determinants.irp.f @@ -306,6 +306,10 @@ BEGIN_PROVIDER [ double precision, psi_average_norm_contrib, (psi_det_size) ] psi_coef(i,k)*psi_coef(i,k)*f enddo enddo + f = 1.d0/sum(psi_average_norm_contrib(1:N_det)) + do i=1,N_det + psi_average_norm_contrib(i) = psi_average_norm_contrib(i)*f + enddo END_PROVIDER From 669e5cbd6f8de766fee6144e54a0ce4ee18bd1cd Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 27 Sep 2016 10:10:39 +0200 Subject: [PATCH 137/216] Put fast davidson in mrcc --- ocaml/qp_overlap_of_wf.ml | 3 +- plugins/MRCC_Utils/davidson.irp.f | 295 ++++++++++++++-------------- plugins/MRCC_Utils/mrcc_utils.irp.f | 18 +- 3 files changed, 155 insertions(+), 161 deletions(-) diff --git a/ocaml/qp_overlap_of_wf.ml b/ocaml/qp_overlap_of_wf.ml index c405b363..816256fa 100644 --- a/ocaml/qp_overlap_of_wf.ml +++ b/ocaml/qp_overlap_of_wf.ml @@ -51,7 +51,6 @@ let () = norm'+. c'*. c' ) ) wf (0.,0.,0.) in - Printf.printf "%f %f %f\n" result norm norm'; result /. (norm *. norm') in @@ -63,5 +62,5 @@ let () = let o = overlap wf wf' in - Printf.printf "Overlap : %f\n" o + print_float (abs_float o) diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index 7bde219a..085799f6 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -21,8 +21,8 @@ subroutine davidson_diag_mrcc(dets_in,u_in,energies,dim_in,sze,N_st,N_st_diag,Ni END_DOC integer, intent(in) :: dim_in, sze, N_st, Nint, iunit, istate, N_st_diag integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) - double precision, intent(inout) :: u_in(dim_in,N_st) - double precision, intent(out) :: energies(N_st) + double precision, intent(inout) :: u_in(dim_in,N_st_diag) + double precision, intent(out) :: energies(N_st_diag) double precision, allocatable :: H_jj(:) double precision :: diag_h_mat_elem @@ -72,41 +72,45 @@ subroutine davidson_diag_hjj_mrcc(dets_in,u_in,H_jj,energies,dim_in,sze,N_st,N_s ! sze : Number of determinants ! ! N_st : Number of eigenstates + ! + ! N_st_diag : Number of states in which H is diagonalized ! ! iunit : Unit for the I/O ! ! Initial guess vectors are not necessarily orthonormal END_DOC - integer, intent(in) :: dim_in, sze, N_st, Nint, istate, N_st_diag + integer, intent(in) :: dim_in, sze, N_st, N_st_diag, Nint, istate integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) double precision, intent(in) :: H_jj(sze) integer, intent(in) :: iunit - double precision, intent(inout) :: u_in(dim_in,N_st) - double precision, intent(out) :: energies(N_st) + double precision, intent(inout) :: u_in(dim_in,N_st_diag) + double precision, intent(out) :: energies(N_st_diag) + integer :: sze_8 integer :: iter integer :: i,j,k,l,m logical :: converged - double precision :: overlap(N_st,N_st) + double precision, allocatable :: overlap(:,:) double precision :: u_dot_v, u_dot_u integer, allocatable :: kl_pairs(:,:) integer :: k_pairs, kl - integer :: iter2, sze_8 + integer :: iter2 double precision, allocatable :: W(:,:,:), U(:,:,:), R(:,:) double precision, allocatable :: y(:,:,:,:), h(:,:,:,:), lambda(:) + double precision, allocatable :: c(:), H_small(:,:) double precision :: diag_h_mat_elem - double precision :: residual_norm(N_st) + double precision, allocatable :: residual_norm(:) character*(16384) :: write_buffer double precision :: to_print(2,N_st) double precision :: cpu, wall + include 'constants.include.F' - !PROVIDE det_connections -if (N_st_diag /= N_st) then - stop 'N_st_diag /= N_st todo in davidson' -endif + !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: U, W, R, y, h, lambda + + PROVIDE nuclear_repulsion call write_time(iunit) call wall_time(wall) @@ -116,6 +120,7 @@ endif write(iunit,'(A)') '------------------------' write(iunit,'(A)') '' call write_int(iunit,N_st,'Number of states') + call write_int(iunit,N_st_diag,'Number of states in diagonalization') call write_int(iunit,sze,'Number of determinants') call write_int(iunit,istate,'Using dressing for state ') write(iunit,'(A)') '' @@ -139,15 +144,20 @@ endif sze_8 = align_double(sze) allocate( & - kl_pairs(2,N_st*(N_st+1)/2), & - W(sze_8,N_st,davidson_sze_max), & - U(sze_8,N_st,davidson_sze_max), & - R(sze_8,N_st), & - h(N_st,davidson_sze_max,N_st,davidson_sze_max), & - y(N_st,davidson_sze_max,N_st,davidson_sze_max), & - lambda(N_st*davidson_sze_max)) + kl_pairs(2,N_st_diag*(N_st_diag+1)/2), & + W(sze_8,N_st_diag,davidson_sze_max), & + U(sze_8,N_st_diag,davidson_sze_max), & + R(sze_8,N_st_diag), & + h(N_st_diag,davidson_sze_max,N_st_diag,davidson_sze_max), & + y(N_st_diag,davidson_sze_max,N_st_diag,davidson_sze_max), & + residual_norm(N_st_diag), & + overlap(N_st_diag,N_st_diag), & + c(N_st_diag*davidson_sze_max), & + H_small(N_st_diag,N_st_diag), & + lambda(N_st_diag*davidson_sze_max)) ASSERT (N_st > 0) + ASSERT (N_st_diag >= N_st) ASSERT (sze > 0) ASSERT (Nint > 0) ASSERT (Nint == N_int) @@ -156,145 +166,121 @@ endif ! ============== - if (N_st > 1) then - - k_pairs=0 - do l=1,N_st - do k=1,l - k_pairs+=1 - kl_pairs(1,k_pairs) = k - kl_pairs(2,k_pairs) = l + do k=1,N_st_diag + + if (k > N_st) then + do i=1,sze + double precision :: r1, r2 + call random_number(r1) + call random_number(r2) + u_in(i,k) = dsqrt(-2.d0*dlog(r1))*dcos(dtwo_pi*r2) enddo - enddo + endif - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP SHARED(U,sze,N_st,overlap,kl_pairs,k_pairs, & - !$OMP Nint,dets_in,u_in) & - !$OMP PRIVATE(k,l,kl,i) - - - ! Orthonormalize initial guess - ! ============================ - - !$OMP DO - do kl=1,k_pairs - k = kl_pairs(1,kl) - l = kl_pairs(2,kl) - if (k/=l) then - overlap(k,l) = u_dot_v(U_in(1,k),U_in(1,l),sze) - overlap(l,k) = overlap(k,l) - else - overlap(k,k) = u_dot_u(U_in(1,k),sze) - endif - enddo - !$OMP END DO - !$OMP END PARALLEL + ! Gram-Schmidt + ! ------------ + call dgemv('T',sze,k-1,1.d0,u_in,size(u_in,1), & + u_in(1,k),1,0.d0,c,1) + call dgemv('N',sze,k-1,-1.d0,u_in,size(u_in,1), & + c,1,1.d0,u_in(1,k),1) + call normalize(u_in(1,k),sze) + enddo - call ortho_lowdin(overlap,size(overlap,1),N_st,U_in,size(U_in,1),sze) - else - - overlap(1,1) = u_dot_u(U_in(1,1),sze) - double precision :: f - f = 1.d0 / dsqrt(overlap(1,1)) - do i=1,sze - U_in(i,1) = U_in(i,1) * f - enddo - - endif - ! Davidson iterations - ! =================== - - - integer :: iteration converged = .False. do while (.not.converged) - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(k,i) SHARED(U,u_in,sze,N_st) - do k=1,N_st - !$OMP DO + + do k=1,N_st_diag do i=1,sze U(i,k,1) = u_in(i,k) enddo - !$OMP END DO enddo - !$OMP END PARALLEL - + do iter=1,davidson_sze_max-1 - - ! Compute W_k = H |u_k> - ! ---------------------- + ! Compute |W_k> = \sum_i |i> + ! ----------------------------------------- + + call H_u_0_mrcc_nstates(W(1,1,iter),U(1,1,iter),H_jj,sze,dets_in,Nint,istate,N_st_diag,sze_8) - call H_u_0_mrcc_nstates(W(1,1,iter),U(1,1,iter),H_jj,sze,dets_in,Nint,istate,N_st,sze_8) ! Compute h_kl = = ! ------------------------------------------- - do l=1,N_st - do k=1,N_st - do iter2=1,iter-1 - h(k,iter2,l,iter) = u_dot_v(U(1,k,iter2),W(1,l,iter),sze) - h(k,iter,l,iter2) = h(k,iter2,l,iter) - enddo - enddo - do k=1,l - h(k,iter,l,iter) = u_dot_v(U(1,k,iter),W(1,l,iter),sze) - h(l,iter,k,iter) = h(k,iter,l,iter) - enddo - enddo - !DEBUG H MATRIX - !do i=1,iter - ! print '(10(x,F16.10))', h(1,i,1,1:i) - !enddo - !print *, '' - !END - +! do l=1,N_st_diag +! do k=1,N_st_diag +! do iter2=1,iter-1 +! h(k,iter2,l,iter) = u_dot_v(U(1,k,iter2),W(1,l,iter),sze) +! h(k,iter,l,iter2) = h(k,iter2,l,iter) +! enddo +! enddo +! do k=1,l +! h(k,iter,l,iter) = u_dot_v(U(1,k,iter),W(1,l,iter),sze) +! h(l,iter,k,iter) = h(k,iter,l,iter) +! enddo +! enddo + + call dgemm('T','N', N_st_diag*iter, N_st_diag, sze, & + 1.d0, U, size(U,1), W(1,1,iter), size(W,1), & + 0.d0, h(1,1,1,iter), size(h,1)*size(h,2)) + ! Diagonalize h ! ------------- - call lapack_diag(lambda,y,h,N_st*davidson_sze_max,N_st*iter) + call lapack_diag(lambda,y,h,N_st_diag*davidson_sze_max,N_st_diag*iter) ! Express eigenvectors of h in the determinant basis ! -------------------------------------------------- - do k=1,N_st + do k=1,N_st_diag do i=1,sze U(i,k,iter+1) = 0.d0 W(i,k,iter+1) = 0.d0 - do l=1,N_st - do iter2=1,iter - U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1) - W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1) - enddo - enddo enddo enddo - +! do k=1,N_st_diag +! do iter2=1,iter +! do l=1,N_st_diag +! do i=1,sze +! U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1) +! W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1) +! enddo +! enddo +! enddo +! enddo +! +! + call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, & + 1.d0, U, size(U,1), y, size(y,1)*size(y,2), 0.d0, U(1,1,iter+1), size(U,1)) + call dgemm('N','N',sze,N_st_diag,N_st_diag*iter, & + 1.d0, W, size(W,1), y, size(y,1)*size(y,2), 0.d0, W(1,1,iter+1), size(W,1)) + + ! Compute residual vector ! ----------------------- - do k=1,N_st + do k=1,N_st_diag do i=1,sze R(i,k) = lambda(k) * U(i,k,iter+1) - W(i,k,iter+1) enddo - residual_norm(k) = u_dot_u(R(1,k),sze) - to_print(1,k) = lambda(k) + nuclear_repulsion - to_print(2,k) = residual_norm(k) + if (k <= N_st) then + residual_norm(k) = u_dot_u(R(1,k),sze) + to_print(1,k) = lambda(k) + nuclear_repulsion + to_print(2,k) = residual_norm(k) + endif enddo - - write(iunit,'(X,I3,X,100(X,F16.10,X,E16.6))') iter, to_print(:,1:N_st) + + write(iunit,'(X,I3,X,100(X,F16.10,X,E16.6))') iter, to_print(:,1:N_st) call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_st,converged) if (converged) then exit endif - ! Davidson step ! ------------- - do k=1,N_st + do k=1,N_st_diag do i=1,sze U(i,k,iter+1) = -1.d0/max(H_jj(i) - lambda(k),1.d-2) * R(i,k) enddo @@ -303,37 +289,36 @@ endif ! Gram-Schmidt ! ------------ - double precision :: c - do k=1,N_st - do iter2=1,iter - do l=1,N_st - c = u_dot_v(U(1,k,iter+1),U(1,l,iter2),sze) - do i=1,sze - U(i,k,iter+1) -= c * U(i,l,iter2) - enddo - enddo - enddo - do l=1,k-1 - c = u_dot_v(U(1,k,iter+1),U(1,l,iter+1),sze) - do i=1,sze - U(i,k,iter+1) -= c * U(i,l,iter+1) - enddo - enddo + do k=1,N_st_diag + +! do iter2=1,iter +! do l=1,N_st_diag +! c(1) = u_dot_v(U(1,k,iter+1),U(1,l,iter2),sze) +! do i=1,sze +! U(i,k,iter+1) = U(i,k,iter+1) - c(1) * U(i,l,iter2) +! enddo +! enddo +! enddo +! + call dgemv('T',sze,N_st_diag*iter,1.d0,U,size(U,1), & + U(1,k,iter+1),1,0.d0,c,1) + call dgemv('N',sze,N_st_diag*iter,-1.d0,U,size(U,1), & + c,1,1.d0,U(1,k,iter+1),1) +! +! do l=1,k-1 +! c(1) = u_dot_v(U(1,k,iter+1),U(1,l,iter+1),sze) +! do i=1,sze +! U(i,k,iter+1) = U(i,k,iter+1) - c(1) * U(i,l,iter+1) +! enddo +! enddo +! + call dgemv('T',sze,k-1,1.d0,U(1,1,iter+1),size(U,1), & + U(1,k,iter+1),1,0.d0,c,1) + call dgemv('N',sze,k-1,-1.d0,U(1,1,iter+1),size(U,1), & + c,1,1.d0,U(1,k,iter+1),1) + call normalize( U(1,k,iter+1), sze ) enddo - - !DEBUG : CHECK OVERLAP - !print *, '===' - !do k=1,iter+1 - ! do l=1,k - ! c = u_dot_v(U(1,1,k),U(1,1,l),sze) - ! print *, k,l, c - ! enddo - !enddo - !print *, '===' - !pause - !END DEBUG - enddo @@ -344,17 +329,25 @@ endif ! Re-contract to u_in ! ----------- - do k=1,N_st + do k=1,N_st_diag energies(k) = lambda(k) do i=1,sze u_in(i,k) = 0.d0 - do iter2=1,iter - do l=1,N_st - u_in(i,k) += U(i,l,iter2)*y(l,iter2,k,1) - enddo - enddo enddo enddo +! do k=1,N_st_diag +! do i=1,sze +! do iter2=1,iter +! do l=1,N_st_diag +! u_in(i,k) += U(i,l,iter2)*y(l,iter2,k,1) +! enddo +! enddo +! enddo +! enddo + + call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, 1.d0, & + U, size(U,1), y, N_st_diag*davidson_sze_max, & + 0.d0, u_in, size(u_in,1)) enddo @@ -368,9 +361,9 @@ endif deallocate ( & kl_pairs, & - W, & - U, & - R, & + W, residual_norm, & + U, overlap, & + R, c, & h, & y, & lambda & diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 9876c756..c429bc03 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -140,7 +140,7 @@ END_PROVIDER integer :: mrcc_state mrcc_state = N_states - do j=1,N_states_diag + do j=1,min(N_states,N_det) do i=1,N_det CI_eigenvectors_dressed(i,j) = psi_coef(i,j) enddo @@ -241,12 +241,14 @@ END_PROVIDER allocate(s2_eigvalues(N_states_diag), e_array(N_states_diag)) call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors_dressed,n_det,size(psi_det,3),size(CI_eigenvectors_dressed,1),min(n_states_diag,n_det),s2_eigvalues) + double precision, allocatable :: psi_coef_tmp(:,:) + allocate(psi_coef_tmp(psi_det_size,N_states_diag)) do j = 1, N_states_diag do i = 1, N_det - psi_coef(i,j) = CI_eigenvectors_dressed(i,j) + psi_coef_tmp(i,j) = CI_eigenvectors_dressed(i,j) enddo enddo - call u_0_H_u_0_mrcc_nstates(e_array,psi_coef,n_det,psi_det,N_int,mrcc_state,N_states_diag,psi_det_size) + call u_0_H_u_0_mrcc_nstates(e_array,psi_coef_tmp,n_det,psi_det,N_int,mrcc_state,N_states,psi_det_size) ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value ! closer to the "expected_s2" set as input @@ -265,7 +267,7 @@ END_PROVIDER allocate(iorder(i_state)) do j = 1, i_state do i = 1, N_det - CI_eigenvectors_dressed(i,j) = psi_coef(i,index_good_state_array(j)) + CI_eigenvectors_dressed(i,j) = psi_coef_tmp(i,index_good_state_array(j)) enddo CI_eigenvectors_s2_dressed(j) = s2_eigvalues(index_good_state_array(j)) CI_electronic_energy_dressed(j) = e_array(j) @@ -276,7 +278,7 @@ END_PROVIDER CI_electronic_energy_dressed(j) = e_array(j) CI_eigenvectors_s2_dressed(j) = s2_eigvalues(index_good_state_array(iorder(j))) do i = 1, N_det - CI_eigenvectors_dressed(i,j) = psi_coef(i,index_good_state_array(iorder(j))) + CI_eigenvectors_dressed(i,j) = psi_coef_tmp(i,index_good_state_array(iorder(j))) enddo enddo @@ -286,12 +288,12 @@ END_PROVIDER if(good_state_array(j))cycle i_other_state +=1 do i = 1, N_det - CI_eigenvectors_dressed(i,i_state + i_other_state) = psi_coef(i,j) + CI_eigenvectors_dressed(i,i_state + i_other_state) = psi_coef_tmp(i,j) enddo CI_eigenvectors_s2_dressed(i_state + i_other_state) = s2_eigvalues(j) CI_electronic_energy_dressed(i_state + i_other_state) = e_array(i_state + i_other_state) enddo - deallocate(iorder,e_array,index_good_state_array,good_state_array) + deallocate(iorder,e_array,index_good_state_array,good_state_array,psi_coef_tmp) deallocate(s2_eigvalues) @@ -325,7 +327,7 @@ subroutine diagonalize_CI_dressed(lambda) END_DOC double precision, intent(in) :: lambda integer :: i,j - do j=1,N_states_diag + do j=1,N_states do i=1,N_det psi_coef(i,j) = lambda * CI_eigenvectors_dressed(i,j) + (1.d0 - lambda) * psi_coef(i,j) enddo From 9e5ec756b3cfa09ddd659e716d8d94636b12a7dd Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 27 Sep 2016 10:31:08 +0200 Subject: [PATCH 138/216] Fixed Context finalization error in OCaml --- ocaml/qp_run.ml | 1 + 1 file changed, 1 insertion(+) diff --git a/ocaml/qp_run.ml b/ocaml/qp_run.ml index 1d44f35f..8a221614 100644 --- a/ocaml/qp_run.ml +++ b/ocaml/qp_run.ml @@ -43,6 +43,7 @@ let run ~master exe ezfio_file = try_new_port 41279 in ZMQ.Socket.close dummy_socket; + ZMQ.Context.terminate zmq_context; result in let time_start = From c5501ef1f9a382f86edbe93847665394f52d6644 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 27 Sep 2016 15:55:38 +0200 Subject: [PATCH 139/216] Include S^2 inside davidson --- plugins/Full_CI/full_ci.irp.f | 4 +- plugins/Full_CI_ZMQ/selection_double.irp.f | 16 +-- scripts/generate_h_apply.py | 12 +- src/Davidson/diagonalize_CI.irp.f | 7 +- src/Davidson/diagonalize_CI_mono.irp.f | 4 +- src/Davidson/u0Hu0.irp.f | 155 +++++++++++++++++++++ src/Determinants/s2.irp.f | 67 ++++++++- 7 files changed, 238 insertions(+), 27 deletions(-) diff --git a/plugins/Full_CI/full_ci.irp.f b/plugins/Full_CI/full_ci.irp.f index 7070bd13..70a6ec43 100644 --- a/plugins/Full_CI/full_ci.irp.f +++ b/plugins/Full_CI/full_ci.irp.f @@ -100,8 +100,8 @@ program full_ci print *, 'N_det = ', N_det print *, 'N_states = ', N_states print *, 'PT2 = ', pt2 - print *, 'E = ', CI_energy - print *, 'E+PT2 = ', CI_energy+pt2 + print *, 'E = ', CI_energy(1:N_states) + print *, 'E+PT2 = ', CI_energy(1:N_states)+pt2(1:N_states) print *, '-----' call ezfio_set_full_ci_energy_pt2(CI_energy(1)+pt2(1)) endif diff --git a/plugins/Full_CI_ZMQ/selection_double.irp.f b/plugins/Full_CI_ZMQ/selection_double.irp.f index 83418307..3e602c21 100644 --- a/plugins/Full_CI_ZMQ/selection_double.irp.f +++ b/plugins/Full_CI_ZMQ/selection_double.irp.f @@ -425,19 +425,19 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) if(lbanned(putj, ma) .or. banned(putj, puti,bant)) cycle hij = (integral8(p1, p2, putj, hfix)-integral8(p2,p1,putj,hfix)) * get_phase_bi(phasemask, ma, ma, putj, p1, hfix, p2) !call debug_hij(hij, gen, mask, mi, ma, puti, putj) - tmp_row(:,putj) += hij * coefs + tmp_row(1:N_states,putj) += hij * coefs(1:N_states) end do do putj=hfix+1, mo_tot_num if(lbanned(putj, ma) .or. banned(putj, puti,bant)) cycle hij = (integral8(p1, p2, hfix, putj)-integral8(p2,p1,hfix,putj)) * get_phase_bi(phasemask, ma, ma, hfix, p1, putj, p2) !call debug_hij(hij, gen, mask, mi, ma, puti, putj) - tmp_row(:,putj) += hij * coefs + tmp_row(1:N_states,putj) += hij * coefs(1:N_states) end do if(ma == 1) then - mat(:,:,puti) += tmp_row(:,:) + mat(1:N_states,1:mo_tot_num,puti) += tmp_row(1:N_states,1:mo_tot_num) else - mat(:,puti,:) += tmp_row(:,:) + mat(1:N_states,puti,1:mo_tot_num) += tmp_row(1:N_states,1:mo_tot_num) end if end if @@ -585,12 +585,12 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) call apply_particles(mask, 1,p1,2,p2, det, ok, N_int) !call assert(ok, "zsdq") call i_h_j(gen, det, N_int, hij) - mat(:, p1, p2) += coefs * hij + mat(:, p1, p2) += coefs(:) * hij else hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) phase = get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) !call debug_hij(hij, gen, mask, 1, 2, p1, p2) - mat(:, p1, p2) += coefs * hij + mat(:, p1, p2) += coefs(:) * hij end if end do end do @@ -605,10 +605,10 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) if(puti == p1 .or. putj == p2 .or. puti == p2 .or. putj == p1) then call apply_particles(mask, sp,puti,sp,putj, det, ok, N_int) call i_h_j(gen, det, N_int, hij) - mat(:, puti, putj) += coefs * hij + mat(:, puti, putj) += coefs(:) * hij else hij = (integral8(p1, p2, puti, putj) - integral8(p2, p1, puti, putj))* get_phase_bi(phasemask, sp, sp, puti, p1 , putj, p2) - mat(:, puti, putj) += coefs * hij + mat(:, puti, putj) += coefs(:) * hij !call debug_hij(hij, gen, mask, sp, sp, puti, putj) end if end do diff --git a/scripts/generate_h_apply.py b/scripts/generate_h_apply.py index d90a0e92..bd66611b 100755 --- a/scripts/generate_h_apply.py +++ b/scripts/generate_h_apply.py @@ -439,13 +439,13 @@ class H_apply_zmq(H_apply): enddo """ % (self.energy) self.data["copy_buffer"] = """ - do i=1,N_det_generators - do k=1,N_st - pt2(k) = pt2(k) + pt2_generators(k,i) - norm_pert(k) = norm_pert(k) + norm_pert_generators(k,i) - H_pert_diag(k) = H_pert_diag(k) + H_pert_diag_generators(k,i) + do i=1,N_det_generators + do k=1,N_st + pt2(k) = pt2(k) + pt2_generators(k,i) + norm_pert(k) = norm_pert(k) + norm_pert_generators(k,i) + H_pert_diag(k) = H_pert_diag(k) + H_pert_diag_generators(k,i) + enddo enddo - enddo """ def set_selection_pt2(self,pert): diff --git a/src/Davidson/diagonalize_CI.irp.f b/src/Davidson/diagonalize_CI.irp.f index e6b230b5..8e9a0543 100644 --- a/src/Davidson/diagonalize_CI.irp.f +++ b/src/Davidson/diagonalize_CI.irp.f @@ -55,12 +55,13 @@ END_PROVIDER if (diag_algorithm == "Davidson") then - call davidson_diag(psi_det,CI_eigenvectors,CI_electronic_energy,& - size(CI_eigenvectors,1),N_det,N_states,N_states_diag,N_int,output_determinants) + call davidson_diag_HS2(psi_det,CI_eigenvectors, & + size(CI_eigenvectors,1),CI_electronic_energy, & + N_det,N_states,N_states_diag,N_int,output_determinants) call u_0_S2_u_0(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int,& N_states_diag,size(CI_eigenvectors,1)) - + else if (diag_algorithm == "Lapack") then diff --git a/src/Davidson/diagonalize_CI_mono.irp.f b/src/Davidson/diagonalize_CI_mono.irp.f index b45d03d6..1de9a211 100644 --- a/src/Davidson/diagonalize_CI_mono.irp.f +++ b/src/Davidson/diagonalize_CI_mono.irp.f @@ -34,7 +34,7 @@ i_state = 0 if (s2_eig) then do j=1,N_det - call get_s2_u0(psi_det,eigenvectors(1,j),N_det,N_det,s2) + call get_s2_u0(psi_det,eigenvectors(1,j),N_det,s2,N_det) if(dabs(s2-expected_s2).le.0.3d0)then print*,'j = ',j print*,'e = ',eigenvalues(j) @@ -54,7 +54,7 @@ enddo else do j=1,N_states_diag - call get_s2_u0(psi_det,eigenvectors(1,j),N_det,N_det,s2) + call get_s2_u0(psi_det,eigenvectors(1,j),N_det,s2,N_det) if(dabs(eigenvectors(1,j)).gt.0.9d0)then i_state += 1 do i=1,N_det diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 0339c31f..daef3ee5 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -174,3 +174,158 @@ BEGIN_PROVIDER [ double precision, psi_energy, (N_states) ] call u_0_H_u_0(psi_energy,psi_coef,N_det,psi_det,N_int,N_states,psi_det_size) END_PROVIDER + + + + +subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) + use bitmasks + implicit none + BEGIN_DOC + ! Computes v_0 = H|u_0> and s_0 = S^2 |u_0> + ! + ! n : number of determinants + ! + ! H_jj : array of + ! + ! S2_jj : array of + END_DOC + integer, intent(in) :: N_st,n,Nint, sze_8 + double precision, intent(out) :: v_0(sze_8,N_st), s_0(sze_8,N_st) + double precision, intent(in) :: u_0(sze_8,N_st) + double precision, intent(in) :: H_jj(n), S2_jj(n) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + double precision :: hij,s2 + double precision, allocatable :: vt(:,:), ut(:,:), st(:,:) + integer :: i,j,k,l, jj,ii + integer :: i0, j0 + + integer, allocatable :: shortcut(:,:), sort_idx(:,:) + integer(bit_kind), allocatable :: sorted(:,:,:), version(:,:,:) + integer(bit_kind) :: sorted_i(Nint) + + integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi, istate + integer :: N_st_8 + + integer, external :: align_double + !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut + + N_st_8 = align_double(N_st) + + ASSERT (Nint > 0) + ASSERT (Nint == N_int) + ASSERT (n>0) + PROVIDE ref_bitmask_energy + + allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2)) + allocate(ut(N_st_8,n)) + + v_0 = 0.d0 + s_0 = 0.d0 + + do i=1,n + do istate=1,N_st + ut(istate,i) = u_0(i,istate) + enddo + enddo + + call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) + call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) + + !$OMP PARALLEL DEFAULT(NONE) & + !$OMP PRIVATE(i,hij,s2,j,k,jj,vt,st,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& + !$OMP SHARED(n,keys_tmp,ut,Nint,v_0,s_0,sorted,shortcut,sort_idx,version,N_st,N_st_8) + allocate(vt(N_st_8,n),st(N_st_8,n)) + Vt = 0.d0 + St = 0.d0 + + !$OMP DO SCHEDULE(dynamic) + do sh=1,shortcut(0,1) + do sh2=sh,shortcut(0,1) + exa = 0 + do ni=1,Nint + exa = exa + popcnt(xor(version(ni,sh,1), version(ni,sh2,1))) + end do + if(exa > 2) then + cycle + end if + + do i=shortcut(sh,1),shortcut(sh+1,1)-1 + org_i = sort_idx(i,1) + if(sh==sh2) then + endi = i-1 + else + endi = shortcut(sh2+1,1)-1 + end if + do ni=1,Nint + sorted_i(ni) = sorted(ni,i,1) + enddo + + do j=shortcut(sh2,1),endi + org_j = sort_idx(j,1) + ext = exa + do ni=1,Nint + ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1))) + end do + if(ext <= 4) then + call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij) + call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2) + do istate=1,n_st + vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) + vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) + st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) + st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) + enddo + endif + enddo + enddo + enddo + enddo + !$OMP END DO NOWAIT + + !$OMP DO SCHEDULE(dynamic) + do sh=1,shortcut(0,2) + do i=shortcut(sh,2),shortcut(sh+1,2)-1 + org_i = sort_idx(i,2) + do j=shortcut(sh,2),i-1 + org_j = sort_idx(j,2) + ext = 0 + do ni=1,Nint + ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2))) + end do + if(ext == 4) then + call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij) + call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2) + do istate=1,n_st + vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) + vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) + st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) + st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) + enddo + end if + end do + end do + enddo + !$OMP END DO NOWAIT + + !$OMP CRITICAL + do istate=1,N_st + do i=n,1,-1 + v_0(i,istate) = v_0(i,istate) + vt(istate,i) + s_0(i,istate) = s_0(i,istate) + st(istate,i) + enddo + enddo + !$OMP END CRITICAL + + deallocate(vt,st) + !$OMP END PARALLEL + + do istate=1,N_st + do i=1,n + v_0(i,istate) = v_0(i,istate) + H_jj(i) * u_0(i,istate) + s_0(i,istate) = s_0(i,istate) + s2_jj(i)* u_0(i,istate) + enddo + enddo + deallocate (shortcut, sort_idx, sorted, version, ut) +end + diff --git a/src/Determinants/s2.irp.f b/src/Determinants/s2.irp.f index a9722df7..c6bb8390 100644 --- a/src/Determinants/s2.irp.f +++ b/src/Determinants/s2.irp.f @@ -1,4 +1,4 @@ -subroutine get_s2(key_i,key_j,s2,Nint) +subroutine get_s2(key_i,key_j,Nint,s2) implicit none use bitmasks BEGIN_DOC @@ -189,7 +189,7 @@ subroutine S2_u_0_nstates(v_0,u_0,n,keys_tmp,Nint,N_st,sze_8) ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1))) end do if(ext <= 4) then - call get_s2(keys_tmp(1,1,org_i),keys_tmp(1,1,org_j),s2_tmp,Nint) + call get_s2(keys_tmp(1,1,org_i),keys_tmp(1,1,org_j),Nint,s2_tmp) do istate=1,N_st vt (org_i,istate) = vt (org_i,istate) + s2_tmp*u_0(org_j,istate) vt (org_j,istate) = vt (org_j,istate) + s2_tmp*u_0(org_i,istate) @@ -212,7 +212,7 @@ subroutine S2_u_0_nstates(v_0,u_0,n,keys_tmp,Nint,N_st,sze_8) ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2))) end do if(ext == 4) then - call get_s2(keys_tmp(1,1,org_i),keys_tmp(1,1,org_j),s2_tmp,Nint) + call get_s2(keys_tmp(1,1,org_i),keys_tmp(1,1,org_j),Nint,s2_tmp) do istate=1,N_st vt (org_i,istate) = vt (org_i,istate) + s2_tmp*u_0(org_j,istate) vt (org_j,istate) = vt (org_j,istate) + s2_tmp*u_0(org_i,istate) @@ -235,7 +235,7 @@ subroutine S2_u_0_nstates(v_0,u_0,n,keys_tmp,Nint,N_st,sze_8) !$OMP END PARALLEL do i=1,n - call get_s2(keys_tmp(1,1,i),keys_tmp(1,1,i),s2_tmp,Nint) + call get_s2(keys_tmp(1,1,i),keys_tmp(1,1,i),Nint,s2_tmp) do istate=1,N_st v_0(i,istate) += s2_tmp * u_0(i,istate) enddo @@ -275,12 +275,12 @@ subroutine get_uJ_s2_uI(psi_keys_tmp,psi_coefs_tmp,n,nmax_coefs,nmax_keys,s2,nst allocate(idx(0:n)) !$OMP DO SCHEDULE(dynamic) do i = n,1,-1 ! Better OMP scheduling - call get_s2(psi_keys_tmp(1,1,i),psi_keys_tmp(1,1,i),s2_tmp,N_int) + call get_s2(psi_keys_tmp(1,1,i),psi_keys_tmp(1,1,i),N_int,s2_tmp) accu += psi_coefs_tmp(i,ll) * s2_tmp * psi_coefs_tmp(i,jj) call filter_connected(psi_keys_tmp,psi_keys_tmp(1,1,i),N_int,i-1,idx) do kk=1,idx(0) j = idx(kk) - call get_s2(psi_keys_tmp(1,1,i),psi_keys_tmp(1,1,j),s2_tmp,N_int) + call get_s2(psi_keys_tmp(1,1,i),psi_keys_tmp(1,1,j),N_int,s2_tmp) accu += psi_coefs_tmp(i,ll) * s2_tmp * psi_coefs_tmp(j,jj) + psi_coefs_tmp(i,jj) * s2_tmp * psi_coefs_tmp(j,ll) enddo enddo @@ -418,3 +418,58 @@ subroutine diagonalize_s2_betweenstates(keys_tmp,u_0,n,nmax_keys,nmax_coefs,nsta end +subroutine i_S2_psi_minilist(key,keys,idx_key,N_minilist,coef,Nint,Ndet,Ndet_max,Nstate,i_S2_psi_array) + use bitmasks + implicit none + integer, intent(in) :: Nint, Ndet,Ndet_max,Nstate,idx_key(Ndet), N_minilist + integer(bit_kind), intent(in) :: keys(Nint,2,Ndet) + integer(bit_kind), intent(in) :: key(Nint,2) + double precision, intent(in) :: coef(Ndet_max,Nstate) + double precision, intent(out) :: i_S2_psi_array(Nstate) + + integer :: i, ii,j, i_in_key, i_in_coef + double precision :: phase + integer :: exc(0:2,2,2) + double precision :: s2ij + integer :: idx(0:Ndet) + BEGIN_DOC +! Computes = \sum_J c_J . +! +! Uses filter_connected_i_H_psi0 to get all the |J> to which |i> +! is connected. The |J> are searched in short pre-computed lists. + END_DOC + + ASSERT (Nint > 0) + ASSERT (N_int == Nint) + ASSERT (Nstate > 0) + ASSERT (Ndet > 0) + ASSERT (Ndet_max >= Ndet) + i_S2_psi_array = 0.d0 + + call filter_connected_i_H_psi0(keys,key,Nint,N_minilist,idx) + if (Nstate == 1) then + + do ii=1,idx(0) + i_in_key = idx(ii) + i_in_coef = idx_key(idx(ii)) + !DIR$ FORCEINLINE + call get_s2(keys(1,1,i_in_key),key,Nint,s2ij) + ! TODO : Cache misses + i_S2_psi_array(1) = i_S2_psi_array(1) + coef(i_in_coef,1)*s2ij + enddo + + else + + do ii=1,idx(0) + i_in_key = idx(ii) + i_in_coef = idx_key(idx(ii)) + !DIR$ FORCEINLINE + call get_s2(keys(1,1,i_in_key),key,Nint,s2ij) + do j = 1, Nstate + i_S2_psi_array(j) = i_S2_psi_array(j) + coef(i_in_coef,j)*s2ij + enddo + enddo + + endif + +end From 99bfb591e1a9eb8f399dcdc39d716ecbeda4e060 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 27 Sep 2016 16:28:27 +0200 Subject: [PATCH 140/216] Forgot file --- src/Davidson/diagonalization_hs2.irp.f | 387 +++++++++++++++++++++++++ 1 file changed, 387 insertions(+) create mode 100644 src/Davidson/diagonalization_hs2.irp.f diff --git a/src/Davidson/diagonalization_hs2.irp.f b/src/Davidson/diagonalization_hs2.irp.f new file mode 100644 index 00000000..7ebf222b --- /dev/null +++ b/src/Davidson/diagonalization_hs2.irp.f @@ -0,0 +1,387 @@ +subroutine davidson_diag_hs2(dets_in,u_in,dim_in,energies,sze,N_st,N_st_diag,Nint,iunit) + use bitmasks + implicit none + BEGIN_DOC + ! Davidson diagonalization. + ! + ! dets_in : bitmasks corresponding to determinants + ! + ! u_in : guess coefficients on the various states. Overwritten + ! on exit + ! + ! dim_in : leftmost dimension of u_in + ! + ! sze : Number of determinants + ! + ! N_st : Number of eigenstates + ! + ! iunit : Unit number for the I/O + ! + ! Initial guess vectors are not necessarily orthonormal + END_DOC + integer, intent(in) :: dim_in, sze, N_st, N_st_diag, Nint, iunit + integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) + double precision, intent(inout) :: u_in(dim_in,N_st_diag) + double precision, intent(out) :: energies(N_st) + double precision, allocatable :: H_jj(:), S2_jj(:) + + double precision :: diag_h_mat_elem + integer :: i + ASSERT (N_st > 0) + ASSERT (sze > 0) + ASSERT (Nint > 0) + ASSERT (Nint == N_int) + PROVIDE mo_bielec_integrals_in_map + allocate(H_jj(sze), S2_jj(sze)) + + !$OMP PARALLEL DEFAULT(NONE) & + !$OMP SHARED(sze,H_jj,S2_jj, dets_in,Nint) & + !$OMP PRIVATE(i) + !$OMP DO SCHEDULE(guided) + do i=1,sze + H_jj(i) = diag_h_mat_elem(dets_in(1,1,i),Nint) + call get_s2(dets_in(1,1,i),dets_in(1,1,i),Nint,S2_jj(i)) + enddo + !$OMP END DO + !$OMP END PARALLEL + + call davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_st,N_st_diag,Nint,iunit) + deallocate (H_jj,S2_jj) +end + + +subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_st,N_st_diag,Nint,iunit) + use bitmasks + implicit none + BEGIN_DOC + ! Davidson diagonalization with specific diagonal elements of the H matrix + ! + ! H_jj : specific diagonal H matrix elements to diagonalize de Davidson + ! + ! S2_jj : specific diagonal S^2 matrix elements + ! + ! dets_in : bitmasks corresponding to determinants + ! + ! u_in : guess coefficients on the various states. Overwritten + ! on exit + ! + ! dim_in : leftmost dimension of u_in + ! + ! sze : Number of determinants + ! + ! N_st : Number of eigenstates + ! + ! N_st_diag : Number of states in which H is diagonalized + ! + ! iunit : Unit for the I/O + ! + ! Initial guess vectors are not necessarily orthonormal + END_DOC + integer, intent(in) :: dim_in, sze, N_st, N_st_diag, Nint + integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) + double precision, intent(in) :: H_jj(sze), S2_jj(sze) + integer, intent(in) :: iunit + double precision, intent(inout) :: u_in(dim_in,N_st_diag) + double precision, intent(out) :: energies(N_st_diag) + + integer :: sze_8 + integer :: iter + integer :: i,j,k,l,m + logical :: converged + + double precision, allocatable :: overlap(:,:) + double precision :: u_dot_v, u_dot_u + + integer, allocatable :: kl_pairs(:,:) + integer :: k_pairs, kl + + integer :: iter2 + double precision, allocatable :: W(:,:,:), U(:,:,:), R(:,:), S(:,:,:) + double precision, allocatable :: y(:,:,:,:), h(:,:,:,:), lambda(:), s2(:) + double precision, allocatable :: c(:), H_small(:,:) + double precision :: diag_h_mat_elem + double precision, allocatable :: residual_norm(:) + character*(16384) :: write_buffer + double precision :: to_print(3,N_st) + double precision :: cpu, wall + include 'constants.include.F' + + !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: U, W, R, S, y, h, lambda + + PROVIDE nuclear_repulsion + + call write_time(iunit) + call wall_time(wall) + call cpu_time(cpu) + write(iunit,'(A)') '' + write(iunit,'(A)') 'Davidson Diagonalization' + write(iunit,'(A)') '------------------------' + write(iunit,'(A)') '' + call write_int(iunit,N_st,'Number of states') + call write_int(iunit,N_st_diag,'Number of states in diagonalization') + call write_int(iunit,sze,'Number of determinants') + write(iunit,'(A)') '' + write_buffer = '===== ' + do i=1,N_st + write_buffer = trim(write_buffer)//' ================ =========== ===========' + enddo + write(iunit,'(A)') trim(write_buffer) + write_buffer = ' Iter' + do i=1,N_st + write_buffer = trim(write_buffer)//' Energy S^2 Residual' + enddo + write(iunit,'(A)') trim(write_buffer) + write_buffer = '===== ' + do i=1,N_st + write_buffer = trim(write_buffer)//' ================ =========== ===========' + enddo + write(iunit,'(A)') trim(write_buffer) + + integer, external :: align_double + sze_8 = align_double(sze) + + double precision :: delta + + if (s2_eig) then + delta = 1.d0 + else + delta = 0.d0 + endif + + allocate( & + kl_pairs(2,N_st_diag*(N_st_diag+1)/2), & + W(sze_8,N_st_diag,davidson_sze_max), & + U(sze_8,N_st_diag,davidson_sze_max), & + R(sze_8,N_st_diag), & + S(sze_8,N_st_diag,davidson_sze_max), & + h(N_st_diag,davidson_sze_max,N_st_diag,davidson_sze_max), & + y(N_st_diag,davidson_sze_max,N_st_diag,davidson_sze_max), & + residual_norm(N_st_diag), & + overlap(N_st_diag,N_st_diag), & + c(N_st_diag*davidson_sze_max), & + H_small(N_st_diag,N_st_diag), & + s2(N_st_diag), & + lambda(N_st_diag*davidson_sze_max)) + + ASSERT (N_st > 0) + ASSERT (N_st_diag >= N_st) + ASSERT (sze > 0) + ASSERT (Nint > 0) + ASSERT (Nint == N_int) + + ! Davidson iterations + ! =================== + + converged = .False. + + do k=1,N_st_diag + + if (k > N_st) then + do i=1,sze + double precision :: r1, r2 + call random_number(r1) + call random_number(r2) + u_in(i,k) = dsqrt(-2.d0*dlog(r1))*dcos(dtwo_pi*r2) + enddo + endif + + ! Gram-Schmidt + ! ------------ + call dgemv('T',sze,k-1,1.d0,u_in,size(u_in,1), & + u_in(1,k),1,0.d0,c,1) + call dgemv('N',sze,k-1,-1.d0,u_in,size(u_in,1), & + c,1,1.d0,u_in(1,k),1) + call normalize(u_in(1,k),sze) + enddo + + + + do while (.not.converged) + + do k=1,N_st_diag + do i=1,sze + U(i,k,1) = u_in(i,k) + enddo + enddo + + do iter=1,davidson_sze_max-1 + + ! Compute |W_k> = \sum_i |i> + ! ----------------------------------------- + + call H_S2_u_0_nstates(W(1,1,iter),S(1,1,iter),U(1,1,iter),H_jj,S2_jj,sze,dets_in,Nint,N_st_diag,sze_8) + + + ! Compute h_kl = = + ! ------------------------------------------- + + +! do l=1,N_st_diag +! do k=1,N_st_diag +! do iter2=1,iter-1 +! h(k,iter2,l,iter) = u_dot_v(U(1,k,iter2),W(1,l,iter),sze) +! h(k,iter,l,iter2) = h(k,iter2,l,iter) +! enddo +! enddo +! do k=1,l +! h(k,iter,l,iter) = u_dot_v(U(1,k,iter),W(1,l,iter),sze) +! h(l,iter,k,iter) = h(k,iter,l,iter) +! enddo +! enddo + + call dgemm('T','N', N_st_diag*iter, N_st_diag, sze, & + 1.d0, U, size(U,1), W(1,1,iter), size(W,1), & + 0.d0, h(1,1,1,iter), size(h,1)*size(h,2)) + + ! Diagonalize h + ! ------------- + call lapack_diag(lambda,y,h,N_st_diag*davidson_sze_max,N_st_diag*iter) + + ! Express eigenvectors of h in the determinant basis + ! -------------------------------------------------- + + do k=1,N_st_diag + do i=1,sze + U(i,k,iter+1) = 0.d0 + W(i,k,iter+1) = 0.d0 + S(i,k,iter+1) = 0.d0 + enddo + enddo +! do k=1,N_st_diag +! do iter2=1,iter +! do l=1,N_st_diag +! do i=1,sze +! U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1) +! W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1) +! enddo +! enddo +! enddo +! enddo +! +! + call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, & + 1.d0, U, size(U,1), y, size(y,1)*size(y,2), 0.d0, U(1,1,iter+1), size(U,1)) + call dgemm('N','N',sze,N_st_diag,N_st_diag*iter, & + 1.d0, W, size(W,1), y, size(y,1)*size(y,2), 0.d0, W(1,1,iter+1), size(W,1)) + call dgemm('N','N',sze,N_st_diag,1, & + 1.d0, S, size(S,1), y, size(y,1)*size(y,2), 0.d0, S(1,1,iter+1), size(S,1)) + + ! Compute residual vector + ! ----------------------- + + do k=1,N_st_diag + s2(k) = u_dot_v(U(1,k,iter+1), S(1,k,iter+1), sze) + enddo + + do k=1,N_st_diag + do i=1,sze + R(i,k) = (lambda(k) * U(i,k,iter+1) - W(i,k,iter+1) ) & + * (1.d0 + s2(k) * U(i,k,iter+1) - S(i,k,iter+1) ) + enddo + if (k <= N_st) then + residual_norm(k) = u_dot_u(R(1,k),sze) + to_print(1,k) = lambda(k) + nuclear_repulsion + to_print(2,k) = s2(k) + to_print(3,k) = residual_norm(k) + endif + enddo + + write(iunit,'(X,I3,X,100(X,F16.10,X,F11.6,X,E11.3))') iter, to_print(:,1:N_st) + call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_st,converged) + if (converged) then + exit + endif + + ! Davidson step + ! ------------- + + do k=1,N_st_diag + do i=1,sze + U(i,k,iter+1) = - R(i,k)/max(H_jj(i) - lambda(k),1.d-2) + enddo + enddo + + ! Gram-Schmidt + ! ------------ + + do k=1,N_st_diag + +! do iter2=1,iter +! do l=1,N_st_diag +! c(1) = u_dot_v(U(1,k,iter+1),U(1,l,iter2),sze) +! do i=1,sze +! U(i,k,iter+1) = U(i,k,iter+1) - c(1) * U(i,l,iter2) +! enddo +! enddo +! enddo +! + call dgemv('T',sze,N_st_diag*iter,1.d0,U,size(U,1), & + U(1,k,iter+1),1,0.d0,c,1) + call dgemv('N',sze,N_st_diag*iter,-1.d0,U,size(U,1), & + c,1,1.d0,U(1,k,iter+1),1) +! +! do l=1,k-1 +! c(1) = u_dot_v(U(1,k,iter+1),U(1,l,iter+1),sze) +! do i=1,sze +! U(i,k,iter+1) = U(i,k,iter+1) - c(1) * U(i,l,iter+1) +! enddo +! enddo +! + call dgemv('T',sze,k-1,1.d0,U(1,1,iter+1),size(U,1), & + U(1,k,iter+1),1,0.d0,c,1) + call dgemv('N',sze,k-1,-1.d0,U(1,1,iter+1),size(U,1), & + c,1,1.d0,U(1,k,iter+1),1) + + call normalize( U(1,k,iter+1), sze ) + enddo + + enddo + + if (.not.converged) then + iter = davidson_sze_max-1 + endif + + ! Re-contract to u_in + ! ----------- + + do k=1,N_st_diag + energies(k) = lambda(k) + do i=1,sze + u_in(i,k) = 0.d0 + enddo + enddo +! do k=1,N_st_diag +! do i=1,sze +! do iter2=1,iter +! do l=1,N_st_diag +! u_in(i,k) += U(i,l,iter2)*y(l,iter2,k,1) +! enddo +! enddo +! enddo +! enddo + + call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, 1.d0, & + U, size(U,1), y, N_st_diag*davidson_sze_max, & + 0.d0, u_in, size(u_in,1)) + + enddo + + write_buffer = '===== ' + do i=1,N_st + write_buffer = trim(write_buffer)//' ================ =========== ===========' + enddo + write(iunit,'(A)') trim(write_buffer) + write(iunit,'(A)') '' + call write_time(iunit) + + deallocate ( & + kl_pairs, & + W, residual_norm, & + U, overlap, & + R, c, & + h, & + y, & + lambda & + ) +end + From bca504aebdb40029422b160e0d9adc59eb1475c5 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 28 Sep 2016 00:20:26 +0200 Subject: [PATCH 141/216] Minor changes --- plugins/CAS_SD/cas_sd_selected.irp.f | 8 +++---- plugins/MRCC_Utils/mrcc_utils.irp.f | 33 ++++++++++++++++++---------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/plugins/CAS_SD/cas_sd_selected.irp.f b/plugins/CAS_SD/cas_sd_selected.irp.f index caed690c..be893da4 100644 --- a/plugins/CAS_SD/cas_sd_selected.irp.f +++ b/plugins/CAS_SD/cas_sd_selected.irp.f @@ -47,8 +47,8 @@ program full_ci print *, 'N_det = ', N_det print *, 'N_states = ', N_states print *, 'PT2 = ', pt2 - print *, 'E = ', CI_energy - print *, 'E+PT2 = ', CI_energy+pt2 + print *, 'E = ', CI_energy(1:N_states) + print *, 'E+PT2 = ', CI_energy(1:N_states)+pt2(1:N_states) print *, '-----' call ezfio_set_cas_sd_energy(CI_energy(1)) enddo @@ -64,8 +64,8 @@ program full_ci print *, 'N_det = ', N_det print *, 'N_states = ', N_states print *, 'PT2 = ', pt2 - print *, 'E = ', CI_energy - print *, 'E+PT2 = ', CI_energy+pt2 + print *, 'E = ', CI_energy(1:N_states) + print *, 'E+PT2 = ', CI_energy(1:N_states)+pt2(1:N_states) print *, '-----' call ezfio_set_cas_sd_energy_pt2(CI_energy(1)+pt2(1)) endif diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index c429bc03..12ae089b 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -686,12 +686,12 @@ END_PROVIDER nex = hh_shortcut(hh_shortcut(0)+1)-1 print *, "TI", nex, N_det_non_ref - allocate(A_ind(N_det_ref+1, nex), A_val(N_det_ref+1, nex)) + allocate(A_ind(0:N_det_ref+1, nex), A_val(N_det_ref+1, nex)) allocate(AtA_ind(N_det_ref * nex), AtA_val(N_det_ref * nex)) !!!!! MAY BE TOO SMALL ? !!!!!!!! allocate(x(nex), AtB(nex)) allocate(A_val_mwen(nex), A_ind_mwen(nex)) allocate(N_col(nex), col_shortcut(nex)) - allocate (x_new(nex)) + allocate(x_new(nex)) do s = 1, N_states @@ -740,6 +740,7 @@ END_PROVIDER A_ind(wk, pp) = i end if end do + A_ind(0,pp) = wk end do end do !$OMP END DO @@ -748,32 +749,32 @@ END_PROVIDER AtB = 0d0 AtA_size = 0 - wk = 0 col_shortcut = 0 N_col = 0 - !$OMP PARALLEL DO schedule(dynamic, 100) default(none) shared(k, psi_non_ref_coef, A_ind, A_val, x, N_det_ref, nex, N_det_non_ref)& + !$OMP PARALLEL default(none) shared(k, psi_non_ref_coef, A_ind, A_val, x, N_det_ref, nex, N_det_non_ref)& !$OMP private(at_row, a_col, t, i, r1, r2, wk, A_ind_mwen, A_val_mwen)& !$OMP shared(col_shortcut, N_col, AtB, AtA_size, AtA_val, AtA_ind, s) + !$OMP DO schedule(dynamic, 100) do at_row = 1, nex wk = 0 if(mod(at_row, 10000) == 0) print *, "AtA", at_row, "/", nex - do i=1,N_det_ref - if(A_ind(i, at_row) == 0) exit + do i=1,A_ind(0,at_row) AtB(at_row) = AtB(at_row) + psi_non_ref_coef(A_ind(i, at_row), s) * A_val(i, at_row) end do + do a_col = 1, nex t = 0d0 r1 = 1 r2 = 1 do while ((A_ind(r1, at_row) /= 0).and.(A_ind(r2, a_col) /= 0)) if(A_ind(r1, at_row) < A_ind(r2, a_col)) then - r1 += 1 + r1 = r1+1 else if(A_ind(r1, at_row) > A_ind(r2, a_col)) then - r2 += 1 + r2 = r2+1 else t = t - A_val(r1, at_row) * A_val(r2, a_col) - r1 += 1 - r2 += 1 + r1 = r1+1 + r2 = r2+1 end if end do @@ -791,12 +792,20 @@ END_PROVIDER !$OMP CRITICAL col_shortcut(at_row) = AtA_size+1 N_col(at_row) = wk - AtA_ind(AtA_size+1:AtA_size+wk) = A_ind_mwen(:wk) - AtA_val(AtA_size+1:AtA_size+wk) = A_val_mwen(:wk) + if (AtA_size+wk > size(AtA_ind,1)) then + print *, AtA_size+wk , size(AtA_ind,1) + stop 'too small' + endif + do i=1,wk + AtA_ind(AtA_size+i) = A_ind_mwen(i) + AtA_val(AtA_size+i) = A_val_mwen(i) + enddo AtA_size += wk !$OMP END CRITICAL end if end do + !$OMP END DO + !$OMP END PARALLEL if(AtA_size > size(AtA_val)) stop "SIZA" print *, "ATA SIZE", ata_size From 0b769ccf32537d8b217d54427a8cabcb115948c7 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 28 Sep 2016 20:27:59 +0200 Subject: [PATCH 142/216] EZFIO I/O for 1-e integrals --- src/AO_Basis/EZFIO.cfg | 22 +++++ .../ao_overlap.irp.f | 98 ++++++++++--------- src/Integrals_Monoelec/kin_ao_ints.irp.f | 7 +- src/Integrals_Monoelec/pot_ao_ints.irp.f | 7 +- 4 files changed, 82 insertions(+), 52 deletions(-) rename src/{AO_Basis => Integrals_Monoelec}/ao_overlap.irp.f (57%) diff --git a/src/AO_Basis/EZFIO.cfg b/src/AO_Basis/EZFIO.cfg index 34bf2879..9e548514 100644 --- a/src/AO_Basis/EZFIO.cfg +++ b/src/AO_Basis/EZFIO.cfg @@ -54,3 +54,25 @@ type: logical doc: If true, use AOs in Cartesian coordinates (6d,10f,...) interface: ezfio, provider default: false + +[integral_overlap] +type: double precision +doc: Overlap integrals in AO basis set +size: (ao_basis.ao_num,ao_basis.ao_num) +interface: ezfio +default: false + +[integral_nuclear] +type: double precision +doc: Nucleus-electron integrals in AO basis set +size: (ao_basis.ao_num,ao_basis.ao_num) +interface: ezfio +default: false + +[integral_kinetic] +type: double precision +doc: Kinetic energy integrals in AO basis set +size: (ao_basis.ao_num,ao_basis.ao_num) +interface: ezfio +default: false + diff --git a/src/AO_Basis/ao_overlap.irp.f b/src/Integrals_Monoelec/ao_overlap.irp.f similarity index 57% rename from src/AO_Basis/ao_overlap.irp.f rename to src/Integrals_Monoelec/ao_overlap.irp.f index 4487ff77..0b603303 100644 --- a/src/AO_Basis/ao_overlap.irp.f +++ b/src/Integrals_Monoelec/ao_overlap.irp.f @@ -14,51 +14,61 @@ double precision :: alpha, beta, c double precision :: A_center(3), B_center(3) integer :: power_A(3), power_B(3) - dim1=100 - !$OMP PARALLEL DO SCHEDULE(GUIDED) & - !$OMP DEFAULT(NONE) & - !$OMP PRIVATE(A_center,B_center,power_A,power_B,& - !$OMP overlap_x,overlap_y, overlap_z, overlap, & - !$OMP alpha, beta,i,j,c) & - !$OMP SHARED(nucl_coord,ao_power,ao_prim_num, & - !$OMP ao_overlap_x,ao_overlap_y,ao_overlap_z,ao_overlap,ao_num,ao_coef_normalized_ordered_transp,ao_nucl, & - !$OMP ao_expo_ordered_transp,dim1) - do j=1,ao_num - A_center(1) = nucl_coord( ao_nucl(j), 1 ) - A_center(2) = nucl_coord( ao_nucl(j), 2 ) - A_center(3) = nucl_coord( ao_nucl(j), 3 ) - power_A(1) = ao_power( j, 1 ) - power_A(2) = ao_power( j, 2 ) - power_A(3) = ao_power( j, 3 ) - !DEC$ VECTOR ALIGNED - !DEC$ VECTOR ALWAYS - do i= 1,ao_num - ao_overlap(i,j)= 0.d0 - ao_overlap_x(i,j)= 0.d0 - ao_overlap_y(i,j)= 0.d0 - ao_overlap_z(i,j)= 0.d0 - B_center(1) = nucl_coord( ao_nucl(i), 1 ) - B_center(2) = nucl_coord( ao_nucl(i), 2 ) - B_center(3) = nucl_coord( ao_nucl(i), 3 ) - power_B(1) = ao_power( i, 1 ) - power_B(2) = ao_power( i, 2 ) - power_B(3) = ao_power( i, 3 ) - do n = 1,ao_prim_num(j) - alpha = ao_expo_ordered_transp(n,j) - !DEC$ VECTOR ALIGNED - do l = 1, ao_prim_num(i) - beta = ao_expo_ordered_transp(l,i) - call overlap_gaussian_xyz(A_center,B_center,alpha,beta,power_A,power_B,overlap_x,overlap_y,overlap_z,overlap,dim1) - c = ao_coef_normalized_ordered_transp(n,j) * ao_coef_normalized_ordered_transp(l,i) - ao_overlap(i,j) += c * overlap - ao_overlap_x(i,j) += c * overlap_x - ao_overlap_y(i,j) += c * overlap_y - ao_overlap_z(i,j) += c * overlap_z - enddo + if (read_ao_one_integrals) then + call ezfio_get_ao_basis_integral_overlap(ao_overlap(1:ao_num, 1:ao_num)) + call ezfio_set_ao_basis_integral_overlap(ao_overlap(1:ao_num, 1:ao_num)) + print *, 'AO overlap integrals read from disk' + else + dim1=100 + !$OMP PARALLEL DO SCHEDULE(GUIDED) & + !$OMP DEFAULT(NONE) & + !$OMP PRIVATE(A_center,B_center,power_A,power_B,& + !$OMP overlap_x,overlap_y, overlap_z, overlap, & + !$OMP alpha, beta,i,j,c) & + !$OMP SHARED(nucl_coord,ao_power,ao_prim_num, & + !$OMP ao_overlap_x,ao_overlap_y,ao_overlap_z,ao_overlap,ao_num,ao_coef_normalized_ordered_transp,ao_nucl, & + !$OMP ao_expo_ordered_transp,dim1) + do j=1,ao_num + A_center(1) = nucl_coord( ao_nucl(j), 1 ) + A_center(2) = nucl_coord( ao_nucl(j), 2 ) + A_center(3) = nucl_coord( ao_nucl(j), 3 ) + power_A(1) = ao_power( j, 1 ) + power_A(2) = ao_power( j, 2 ) + power_A(3) = ao_power( j, 3 ) + !DEC$ VECTOR ALIGNED + !DEC$ VECTOR ALWAYS + do i= 1,ao_num + ao_overlap(i,j)= 0.d0 + ao_overlap_x(i,j)= 0.d0 + ao_overlap_y(i,j)= 0.d0 + ao_overlap_z(i,j)= 0.d0 + B_center(1) = nucl_coord( ao_nucl(i), 1 ) + B_center(2) = nucl_coord( ao_nucl(i), 2 ) + B_center(3) = nucl_coord( ao_nucl(i), 3 ) + power_B(1) = ao_power( i, 1 ) + power_B(2) = ao_power( i, 2 ) + power_B(3) = ao_power( i, 3 ) + do n = 1,ao_prim_num(j) + alpha = ao_expo_ordered_transp(n,j) + !DEC$ VECTOR ALIGNED + do l = 1, ao_prim_num(i) + beta = ao_expo_ordered_transp(l,i) + call overlap_gaussian_xyz(A_center,B_center,alpha,beta,power_A,power_B,overlap_x,overlap_y,overlap_z,overlap,dim1) + c = ao_coef_normalized_ordered_transp(n,j) * ao_coef_normalized_ordered_transp(l,i) + ao_overlap(i,j) += c * overlap + ao_overlap_x(i,j) += c * overlap_x + ao_overlap_y(i,j) += c * overlap_y + ao_overlap_z(i,j) += c * overlap_z + enddo + enddo enddo - enddo - enddo - !$OMP END PARALLEL DO + enddo + !$OMP END PARALLEL DO + endif + if (write_ao_one_integrals) then + call ezfio_set_ao_basis_integral_overlap(ao_overlap(1:ao_num, 1:ao_num)) + print *, 'AO overlap integrals written to disk' + endif END_PROVIDER diff --git a/src/Integrals_Monoelec/kin_ao_ints.irp.f b/src/Integrals_Monoelec/kin_ao_ints.irp.f index e3e92348..6cb2aa49 100644 --- a/src/Integrals_Monoelec/kin_ao_ints.irp.f +++ b/src/Integrals_Monoelec/kin_ao_ints.irp.f @@ -131,8 +131,8 @@ BEGIN_PROVIDER [double precision, ao_kinetic_integral, (ao_num_align,ao_num)] integer :: i,j,k,l if (read_ao_one_integrals) then - call read_one_e_integrals('ao_kinetic_integral', ao_kinetic_integral,& - size(ao_kinetic_integral,1), size(ao_kinetic_integral,2)) + call ezfio_get_ao_basis_integral_kinetic(ao_kinetic_integral(1:ao_num, 1:ao_num)) + call ezfio_set_ao_basis_integral_kinetic(ao_kinetic_integral(1:ao_num, 1:ao_num)) print *, 'AO kinetic integrals read from disk' else !$OMP PARALLEL DO DEFAULT(NONE) & @@ -151,8 +151,7 @@ BEGIN_PROVIDER [double precision, ao_kinetic_integral, (ao_num_align,ao_num)] !$OMP END PARALLEL DO endif if (write_ao_one_integrals) then - call write_one_e_integrals('ao_kinetic_integral', ao_kinetic_integral,& - size(ao_kinetic_integral,1), size(ao_kinetic_integral,2)) + call ezfio_set_ao_basis_integral_kinetic(ao_kinetic_integral(1:ao_num, 1:ao_num)) print *, 'AO kinetic integrals written to disk' endif END_PROVIDER diff --git a/src/Integrals_Monoelec/pot_ao_ints.irp.f b/src/Integrals_Monoelec/pot_ao_ints.irp.f index 45b9067a..913b1396 100644 --- a/src/Integrals_Monoelec/pot_ao_ints.irp.f +++ b/src/Integrals_Monoelec/pot_ao_ints.irp.f @@ -11,8 +11,8 @@ BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral, (ao_num_align,ao_num)] double precision :: overlap_x,overlap_y,overlap_z,overlap,dx,NAI_pol_mult if (read_ao_one_integrals) then - call read_one_e_integrals('ao_ne_integral', ao_nucl_elec_integral, & - size(ao_nucl_elec_integral,1), size(ao_nucl_elec_integral,2)) + call ezfio_get_ao_basis_integral_nuclear(ao_nucl_elec_integral(1:ao_num, 1:ao_num)) + call ezfio_set_ao_basis_integral_nuclear(ao_nucl_elec_integral(1:ao_num, 1:ao_num)) print *, 'AO N-e integrals read from disk' else @@ -74,8 +74,7 @@ BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral, (ao_num_align,ao_num)] !$OMP END PARALLEL endif if (write_ao_one_integrals) then - call write_one_e_integrals('ao_ne_integral', ao_nucl_elec_integral, & - size(ao_nucl_elec_integral,1), size(ao_nucl_elec_integral,2)) + call ezfio_set_ao_basis_integral_nuclear(ao_nucl_elec_integral(1:ao_num, 1:ao_num)) print *, 'AO N-e integrals written to disk' endif From e3114aa5665fd571c06829780b0e8e178012f7a0 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 28 Sep 2016 21:14:35 +0200 Subject: [PATCH 143/216] Added dummy selection --- plugins/Full_CI/H_apply.irp.f | 5 ++++ plugins/Perturbation/pt2_equations.irp.f | 31 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/plugins/Full_CI/H_apply.irp.f b/plugins/Full_CI/H_apply.irp.f index 9e22b965..d870e4b0 100644 --- a/plugins/Full_CI/H_apply.irp.f +++ b/plugins/Full_CI/H_apply.irp.f @@ -23,6 +23,11 @@ s.unset_skip() #s.unset_openmp() print s +s = H_apply("FCI_no_selection") +s.set_selection_pt2("dummy") +s.unset_skip() +print s + s = H_apply("FCI_mono") s.set_selection_pt2("epstein_nesbet_2x2") s.unset_double_excitations() diff --git a/plugins/Perturbation/pt2_equations.irp.f b/plugins/Perturbation/pt2_equations.irp.f index e406cd03..66083f6f 100644 --- a/plugins/Perturbation/pt2_equations.irp.f +++ b/plugins/Perturbation/pt2_equations.irp.f @@ -345,6 +345,37 @@ subroutine pt2_epstein_nesbet_sc2 ($arguments) end +subroutine pt2_dummy ($arguments) + use bitmasks + implicit none + $declarations + + BEGIN_DOC + ! Dummy perturbation to add all connected determinants. + END_DOC + + integer :: i,j + double precision :: diag_H_mat_elem_fock, h + double precision :: i_H_psi_array(N_st) + PROVIDE selection_criterion + + call i_H_psi_minilist(det_pert,minilist,idx_minilist,N_minilist,psi_selectors_coef,Nint,N_minilist,psi_selectors_size,N_st,i_H_psi_array) + + h = diag_H_mat_elem_fock(det_ref,det_pert,fock_diag_tmp,Nint) + do i =1,N_st + if (i_H_psi_array(i) /= 0.d0) then + c_pert(i) = i_H_psi_array(i) / (electronic_energy(i) - h) + H_pert_diag(i) = h*c_pert(i)*c_pert(i) + e_2_pert(i) = 1.d0 + else + c_pert(i) = 0.d0 + e_2_pert(i) = 0.d0 + H_pert_diag(i) = 0.d0 + endif + enddo + +end + SUBST [ arguments, declarations ] From 7219dda33b97e41ee022438d4b25d3cdf109e4c5 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 29 Sep 2016 22:34:40 +0200 Subject: [PATCH 144/216] Corrected S2 in davidson --- src/Davidson/diagonalization_hs2.irp.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Davidson/diagonalization_hs2.irp.f b/src/Davidson/diagonalization_hs2.irp.f index 7ebf222b..e250c7d3 100644 --- a/src/Davidson/diagonalization_hs2.irp.f +++ b/src/Davidson/diagonalization_hs2.irp.f @@ -270,7 +270,7 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s ! ----------------------- do k=1,N_st_diag - s2(k) = u_dot_v(U(1,k,iter+1), S(1,k,iter+1), sze) + s2(k) = u_dot_v(U(1,k,iter+1), S(1,k,iter+1), sze) + S_z2_Sz enddo do k=1,N_st_diag From cbdc8f68d785c666efafb654332899def4ecc5a2 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 30 Sep 2016 15:12:17 +0200 Subject: [PATCH 145/216] Corrected diagonalize_CI --- plugins/CAS_SD/H_apply.irp.f | 8 +-- plugins/CAS_SD/cas_s_selected.irp.f | 73 +++++++++++++++++------ plugins/CAS_SD/cas_sd.irp.f | 81 ++++++++++++++++++-------- plugins/CAS_SD/cas_sd_selected.irp.f | 65 ++++++++++++++++----- plugins/Full_CI/full_ci.irp.f | 2 +- src/Davidson/EZFIO.cfg | 2 +- src/Davidson/diagonalization_hs2.irp.f | 17 ++++-- src/Davidson/diagonalize_CI.irp.f | 4 +- 8 files changed, 180 insertions(+), 72 deletions(-) diff --git a/plugins/CAS_SD/H_apply.irp.f b/plugins/CAS_SD/H_apply.irp.f index 35c45fb6..f1d0c66b 100644 --- a/plugins/CAS_SD/H_apply.irp.f +++ b/plugins/CAS_SD/H_apply.irp.f @@ -3,6 +3,7 @@ BEGIN_SHELL [ /usr/bin/env python ] from generate_h_apply import * s = H_apply("CAS_SD") +s.unset_skip() print s s = H_apply("CAS_SD_selected_no_skip") @@ -12,6 +13,7 @@ print s s = H_apply("CAS_SD_selected") s.set_selection_pt2("epstein_nesbet_2x2") +s.unset_skip() print s s = H_apply("CAS_SD_PT2") @@ -22,13 +24,9 @@ print s s = H_apply("CAS_S",do_double_exc=False) print s -s = H_apply("CAS_S_selected_no_skip",do_double_exc=False) -s.set_selection_pt2("epstein_nesbet_2x2") -s.unset_skip() -print s - s = H_apply("CAS_S_selected",do_double_exc=False) s.set_selection_pt2("epstein_nesbet_2x2") +s.unset_skip() print s s = H_apply("CAS_S_PT2",do_double_exc=False) diff --git a/plugins/CAS_SD/cas_s_selected.irp.f b/plugins/CAS_SD/cas_s_selected.irp.f index 802de171..7c77b529 100644 --- a/plugins/CAS_SD/cas_s_selected.irp.f +++ b/plugins/CAS_SD/cas_s_selected.irp.f @@ -12,6 +12,7 @@ program full_ci pt2 = 1.d0 diag_algorithm = "Lapack" + if (N_det > N_det_max) then call diagonalize_CI call save_wavefunction @@ -28,49 +29,84 @@ program full_ci 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(1:N_states) = CI_energy(1:N_states) do while (N_det < N_det_max.and.maxval(abs(pt2(1:N_st))) > pt2_max) - call H_apply_CAS_S_selected_no_skip(pt2, norm_pert, H_pert_diag, N_st) + n_det_before = N_det + call H_apply_CAS_SD_selected(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 + + if (N_det > N_det_max) then + N_det = N_det_max + psi_det = psi_det_sorted + psi_coef = psi_coef_sorted + touch N_det psi_det psi_coef psi_det_sorted psi_coef_sorted psi_average_norm_contrib_sorted + endif + + 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 + 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 *, '-----' + 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(1:N_states) = CI_energy(1:N_states) call ezfio_set_cas_sd_energy(CI_energy(1)) enddo - call diagonalize_CI - + N_det = min(N_det_max,N_det) + touch N_det psi_det psi_coef + call diagonalize_CI if(do_pt2_end)then print*,'Last iteration only to compute the PT2' threshold_selectors = 1.d0 threshold_generators = 0.999d0 - call H_apply_CAS_S_PT2(pt2, norm_pert, H_pert_diag, N_st) + call H_apply_CAS_SD_PT2(pt2, norm_pert, H_pert_diag, N_st) print *, 'Final step' print *, 'N_det = ', N_det print *, 'N_states = ', N_states print *, 'PT2 = ', pt2 - print *, 'E = ', CI_energy - print *, 'E+PT2 = ', CI_energy+pt2 + print *, 'E = ', CI_energy(1:N_states) + print *, 'E+PT2 = ', CI_energy(1:N_states)+pt2(1:N_states) print *, '-----' call ezfio_set_cas_sd_energy_pt2(CI_energy(1)+pt2(1)) endif - integer :: exc_max, degree_min exc_max = 0 print *, 'CAS determinants : ', N_det_cas @@ -79,6 +115,7 @@ program full_ci call get_excitation_degree(psi_cas(1,1,k),psi_cas(1,1,i),degree,N_int) exc_max = max(exc_max,degree) enddo + print *, psi_coef_cas_diagonalized(i,:) call debug_det(psi_cas(1,1,i),N_int) print *, '' enddo diff --git a/plugins/CAS_SD/cas_sd.irp.f b/plugins/CAS_SD/cas_sd.irp.f index a5fc39b2..e2e8cb1f 100644 --- a/plugins/CAS_SD/cas_sd.irp.f +++ b/plugins/CAS_SD/cas_sd.irp.f @@ -1,7 +1,6 @@ program full_ci implicit none integer :: i,k - integer :: N_det_old double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) @@ -11,9 +10,9 @@ program full_ci character*(64) :: perturbation PROVIDE N_det_cas - N_det_old = 0 pt2 = 1.d0 diag_algorithm = "Lapack" + if (N_det > N_det_max) then call diagonalize_CI call save_wavefunction @@ -30,36 +29,68 @@ program full_ci 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(1:N_states) = CI_energy(1:N_states) do while (N_det < N_det_max.and.maxval(abs(pt2(1:N_st))) > pt2_max) - N_det_old = N_det + n_det_before = N_det call H_apply_CAS_SD(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 - print *, 'N_det = ', N_det - print *, 'N_states = ', N_states - print *, 'PT2 = ', pt2 - print *, 'E = ', CI_energy - print *, 'E+PT2 = ', CI_energy+pt2 - print *, '-----' - call ezfio_set_cas_sd_energy(CI_energy(1)) - if (N_det == N_det_old) then - exit - endif - enddo - call diagonalize_CI + if (N_det > N_det_max) then + N_det = N_det_max + psi_det = psi_det_sorted + psi_coef = psi_coef_sorted + touch N_det psi_det psi_coef psi_det_sorted psi_coef_sorted psi_average_norm_contrib_sorted + endif + + + 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 *, '-----' + 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(1:N_states) = CI_energy(1:N_states) + call ezfio_set_cas_sd_energy(CI_energy(1)) + enddo + N_det = min(N_det_max,N_det) + touch N_det psi_det psi_coef + call diagonalize_CI if(do_pt2_end)then print*,'Last iteration only to compute the PT2' threshold_selectors = 1.d0 @@ -70,13 +101,12 @@ program full_ci print *, 'N_det = ', N_det print *, 'N_states = ', N_states print *, 'PT2 = ', pt2 - print *, 'E = ', CI_energy - print *, 'E+PT2 = ', CI_energy+pt2 + print *, 'E = ', CI_energy(1:N_states) + print *, 'E+PT2 = ', CI_energy(1:N_states)+pt2(1:N_states) print *, '-----' call ezfio_set_cas_sd_energy_pt2(CI_energy(1)+pt2(1)) endif - integer :: exc_max, degree_min exc_max = 0 print *, 'CAS determinants : ', N_det_cas @@ -85,6 +115,7 @@ program full_ci call get_excitation_degree(psi_cas(1,1,k),psi_cas(1,1,i),degree,N_int) exc_max = max(exc_max,degree) enddo + print *, psi_coef_cas_diagonalized(i,:) call debug_det(psi_cas(1,1,i),N_int) print *, '' enddo diff --git a/plugins/CAS_SD/cas_sd_selected.irp.f b/plugins/CAS_SD/cas_sd_selected.irp.f index be893da4..7c77b529 100644 --- a/plugins/CAS_SD/cas_sd_selected.irp.f +++ b/plugins/CAS_SD/cas_sd_selected.irp.f @@ -12,6 +12,7 @@ program full_ci pt2 = 1.d0 diag_algorithm = "Lapack" + if (N_det > N_det_max) then call diagonalize_CI call save_wavefunction @@ -28,32 +29,68 @@ program full_ci 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(1:N_states) = CI_energy(1:N_states) do while (N_det < N_det_max.and.maxval(abs(pt2(1:N_st))) > pt2_max) + n_det_before = N_det call H_apply_CAS_SD_selected(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 + + if (N_det > N_det_max) then + N_det = N_det_max + psi_det = psi_det_sorted + psi_coef = psi_coef_sorted + touch N_det psi_det psi_coef psi_det_sorted psi_coef_sorted psi_average_norm_contrib_sorted + endif + + call save_wavefunction - print *, 'N_det = ', N_det - print *, 'N_states = ', N_states - print *, 'PT2 = ', pt2 - print *, 'E = ', CI_energy(1:N_states) - print *, 'E+PT2 = ', CI_energy(1:N_states)+pt2(1:N_states) + 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 *, '-----' + 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(1:N_states) = CI_energy(1:N_states) call ezfio_set_cas_sd_energy(CI_energy(1)) enddo - call diagonalize_CI - + N_det = min(N_det_max,N_det) + touch N_det psi_det psi_coef + call diagonalize_CI if(do_pt2_end)then print*,'Last iteration only to compute the PT2' threshold_selectors = 1.d0 @@ -70,7 +107,6 @@ program full_ci call ezfio_set_cas_sd_energy_pt2(CI_energy(1)+pt2(1)) endif - integer :: exc_max, degree_min exc_max = 0 print *, 'CAS determinants : ', N_det_cas @@ -79,6 +115,7 @@ program full_ci call get_excitation_degree(psi_cas(1,1,k),psi_cas(1,1,i),degree,N_int) exc_max = max(exc_max,degree) enddo + print *, psi_coef_cas_diagonalized(i,:) call debug_det(psi_cas(1,1,i),N_int) print *, '' enddo diff --git a/plugins/Full_CI/full_ci.irp.f b/plugins/Full_CI/full_ci.irp.f index 70a6ec43..42e773eb 100644 --- a/plugins/Full_CI/full_ci.irp.f +++ b/plugins/Full_CI/full_ci.irp.f @@ -11,7 +11,7 @@ program full_ci pt2 = 1.d0 diag_algorithm = "Lapack" - + if (N_det > N_det_max) then call diagonalize_CI call save_wavefunction diff --git a/src/Davidson/EZFIO.cfg b/src/Davidson/EZFIO.cfg index de2a6954..415e359e 100644 --- a/src/Davidson/EZFIO.cfg +++ b/src/Davidson/EZFIO.cfg @@ -7,6 +7,6 @@ default: 1.e-12 [n_states_diag] type: States_number doc: n_states_diag -default: 1 +default: 10 interface: ezfio,provider,ocaml diff --git a/src/Davidson/diagonalization_hs2.irp.f b/src/Davidson/diagonalization_hs2.irp.f index e250c7d3..6c82ce1c 100644 --- a/src/Davidson/diagonalization_hs2.irp.f +++ b/src/Davidson/diagonalization_hs2.irp.f @@ -71,7 +71,7 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s ! ! N_st : Number of eigenstates ! - ! N_st_diag : Number of states in which H is diagonalized + ! N_st_diag : Number of states in which H is diagonalized. Assumed > sze ! ! iunit : Unit for the I/O ! @@ -107,6 +107,9 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s include 'constants.include.F' !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: U, W, R, S, y, h, lambda + if (N_st_diag > sze) then + stop 'error in Davidson : N_st_diag > sze' + endif PROVIDE nuclear_repulsion @@ -174,16 +177,13 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s converged = .False. - do k=1,N_st_diag - - if (k > N_st) then + do k=N_st+1,N_st_diag do i=1,sze double precision :: r1, r2 call random_number(r1) call random_number(r2) u_in(i,k) = dsqrt(-2.d0*dlog(r1))*dcos(dtwo_pi*r2) enddo - endif ! Gram-Schmidt ! ------------ @@ -247,12 +247,14 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s S(i,k,iter+1) = 0.d0 enddo enddo + ! do k=1,N_st_diag ! do iter2=1,iter ! do l=1,N_st_diag ! do i=1,sze ! U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1) ! W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1) +! S(i,k,iter+1) = W(i,k,iter+1) + S(i,l,iter2)*y(l,iter2,k,1) ! enddo ! enddo ! enddo @@ -276,13 +278,16 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s do k=1,N_st_diag do i=1,sze R(i,k) = (lambda(k) * U(i,k,iter+1) - W(i,k,iter+1) ) & - * (1.d0 + s2(k) * U(i,k,iter+1) - S(i,k,iter+1) ) + * (1.d0 + s2(k) * U(i,k,iter+1) - S(i,k,iter+1) - S_z2_Sz) enddo if (k <= N_st) then residual_norm(k) = u_dot_u(R(1,k),sze) to_print(1,k) = lambda(k) + nuclear_repulsion to_print(2,k) = s2(k) to_print(3,k) = residual_norm(k) + if (residual_norm(k) > 1.e9) then + stop 'Davidson failed' + endif endif enddo diff --git a/src/Davidson/diagonalize_CI.irp.f b/src/Davidson/diagonalize_CI.irp.f index 8e9a0543..57bee09d 100644 --- a/src/Davidson/diagonalize_CI.irp.f +++ b/src/Davidson/diagonalize_CI.irp.f @@ -57,10 +57,10 @@ END_PROVIDER call davidson_diag_HS2(psi_det,CI_eigenvectors, & size(CI_eigenvectors,1),CI_electronic_energy, & - N_det,N_states,N_states_diag,N_int,output_determinants) + N_det,min(N_det,N_states),min(N_det,N_states_diag),N_int,output_determinants) call u_0_S2_u_0(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int,& - N_states_diag,size(CI_eigenvectors,1)) + min(N_det,N_states_diag),size(CI_eigenvectors,1)) else if (diag_algorithm == "Lapack") then From 02b48aabce9b16081a00c9061e3f959e0b8a58cd Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 30 Sep 2016 15:29:06 +0200 Subject: [PATCH 146/216] shared memory davidson --- src/Davidson/davidson_parallel.irp.f | 366 +++++++++++++++++++++++++++ src/Davidson/u0Hu0.irp.f | 130 +++++----- 2 files changed, 439 insertions(+), 57 deletions(-) create mode 100644 src/Davidson/davidson_parallel.irp.f diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f new file mode 100644 index 00000000..d97e46b4 --- /dev/null +++ b/src/Davidson/davidson_parallel.irp.f @@ -0,0 +1,366 @@ + +!brought to you by garniroy inc. + +use bitmasks + +subroutine davidson_process(block, N, idx, vt, st) + + implicit none + + + integer , intent(in) :: block + integer , intent(inout) :: N + integer , intent(inout) :: idx(N_det) + double precision , intent(inout) :: vt(N_states, N_det) + double precision , intent(inout) :: st(N_states, N_det) + + integer :: i, j, sh, sh2, exa, ext, org_i, org_j, istate, ni, endi + integer(bit_kind) :: sorted_i(N_int) + double precision :: s2, hij + + vt = 0d0 + st = 0d0 + + N = N_det + do i=1,N + idx(i) = i + end do + + sh = block + + do sh2=1,sh + exa = 0 + do ni=1,N_int + exa = exa + popcnt(xor(version_(ni,sh,1), version_(ni,sh2,1))) + end do + if(exa > 2) then + cycle + end if + + do i=shortcut_(sh,1),shortcut_(sh+1,1)-1 + org_i = sort_idx_(i,1) + if(sh==sh2) then + endi = i-1 + else + endi = shortcut_(sh2+1,1)-1 + end if + do ni=1,N_int + sorted_i(ni) = sorted_(ni,i,1) + enddo + + do j=shortcut_(sh2,1),endi + org_j = sort_idx_(j,1) + ext = exa + do ni=1,N_int + ext = ext + popcnt(xor(sorted_i(ni), sorted_(ni,j,1))) + end do + if(ext <= 4) then + call i_h_j (psi_det(1,1,org_j),psi_det(1,1,org_i),n_int,hij) + call get_s2(psi_det(1,1,org_j),psi_det(1,1,org_i),n_int,s2) + do istate=1,N_states + vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) + vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) + st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) + st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) + enddo + endif + enddo + enddo + enddo +end subroutine + + + BEGIN_PROVIDER [ integer, shortcut_, (0:N_det+1, 2) ] +&BEGIN_PROVIDER [ integer(bit_kind), version_, (N_int, N_det, 2) ] +&BEGIN_PROVIDER [ integer(bit_kind), sorted_, (N_int, N_det, 2) ] +&BEGIN_PROVIDER [ integer, sort_idx_, (N_det, 2) ] + implicit none + call sort_dets_ab_v(psi_det, sorted_(1,1,1), sort_idx_(1,1), shortcut_(0,1), version_(1,1,1), n_det, N_int) + call sort_dets_ba_v(psi_det, sorted_(1,1,2), sort_idx_(1,2), shortcut_(0,2), version_(1,1,2), n_det, N_int) +END_PROVIDER + + + +subroutine davidson_collect(block, N, idx, vt, st , v0, s0) + implicit none + + + integer , intent(in) :: block + integer , intent(in) :: N + integer , intent(in) :: idx(N) + double precision , intent(in) :: vt(N_states, N) + double precision , intent(in) :: st(N_states, N) + double precision , intent(inout) :: v0(N_det, N_states) + double precision , intent(inout) :: s0(N_det, N_states) + + integer :: i + + do i=1,N + v0(idx(i), :) += vt(:, i) + s0(idx(i), :) += st(:, i) + end do +end subroutine + + +subroutine davidson_init(zmq_to_qp_run_socket) + use f77_zmq + implicit none + + integer(ZMQ_PTR), intent(out) :: zmq_to_qp_run_socket ! zmq_to_qp_run_socket + + call new_parallel_job(zmq_to_qp_run_socket,'davidson') +end subroutine + + + +subroutine davidson_add_task(zmq_to_qp_run_socket, block) + use f77_zmq + implicit none + + integer(ZMQ_PTR) ,intent(in) :: zmq_to_qp_run_socket + integer ,intent(in) :: block + character*(512) :: task + + + write(task,*) block + call add_task_to_taskserver(zmq_to_qp_run_socket, task) +end subroutine + + + +subroutine davidson_slave_inproc(i) + implicit none + integer, intent(in) :: i + + call davidson_run_slave(1,i) +end + + +subroutine davidson_slave_tcp(i) + implicit none + integer, intent(in) :: i + + call davidson_run_slave(0,i) +end + + + +subroutine davidson_run_slave(thread,iproc) + use f77_zmq + implicit none + + integer, intent(in) :: thread, iproc + + integer :: worker_id, task_id, block + character*(512) :: task + + integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + + integer(ZMQ_PTR), external :: new_zmq_push_socket + integer(ZMQ_PTR) :: zmq_socket_push + + + + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() + zmq_socket_push = new_zmq_push_socket(thread) + call connect_to_taskserver(zmq_to_qp_run_socket,worker_id,thread) + if(worker_id == -1) then + print *, "WORKER -1" + call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) + call end_zmq_push_socket(zmq_socket_push,thread) + return + end if + + call davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) + + call disconnect_from_taskserver(zmq_to_qp_run_socket,zmq_socket_push,worker_id) + call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) + call end_zmq_push_socket(zmq_socket_push,thread) +end subroutine + + + +subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) + use f77_zmq + implicit none + + integer(ZMQ_PTR),intent(in) :: zmq_to_qp_run_socket + integer(ZMQ_PTR),intent(in) :: zmq_socket_push + integer,intent(in) :: worker_id + integer :: task_id + character*(512) :: task + + + integer :: block + integer :: N + integer , allocatable :: idx(:) + double precision , allocatable :: vt(:,:) + double precision , allocatable :: st(:,:) + + + allocate(idx(N_det)) + allocate(vt(N_states, N_det)) + allocate(st(N_states, N_det)) + + do + call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id, task) + if(task_id == 0) exit + read (task,*) block + + call davidson_process(block,N, idx, vt, st) + + call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id) + call davidson_push_results(zmq_socket_push, block, N, idx, vt, st, task_id) + end do +end subroutine + + + +subroutine davidson_push_results(zmq_socket_push, block, N, idx, vt, st, task_id) + use f77_zmq + implicit none + + integer(ZMQ_PTR) ,intent(in) :: zmq_socket_push + integer ,intent(in) :: task_id + + integer ,intent(in) :: block + integer ,intent(in) :: N + integer ,intent(in) :: idx(N) + double precision ,intent(in) :: vt(N_states, N) + double precision ,intent(in) :: st(N_states, N) + integer :: rc + + rc = f77_zmq_send( zmq_socket_push, block, 4, ZMQ_SNDMORE) + if(rc /= 4) stop "davidson_push_results failed to push block" + + rc = f77_zmq_send( zmq_socket_push, N, 4, ZMQ_SNDMORE) + if(rc /= 4) stop "davidson_push_results failed to push N" + + rc = f77_zmq_send( zmq_socket_push, idx, 4*N, ZMQ_SNDMORE) + if(rc /= 4*N) stop "davidson_push_results failed to push idx" + + rc = f77_zmq_send( zmq_socket_push, vt, 8*N_states* N, ZMQ_SNDMORE) + if(rc /= 8*N_states* N) stop "davidson_push_results failed to push vt" + + rc = f77_zmq_send( zmq_socket_push, st, 8*N_states* N, ZMQ_SNDMORE) + if(rc /= 8*N_states* N) stop "davidson_push_results failed to push st" + + rc = f77_zmq_send( zmq_socket_push, task_id, 4, 0) + if(rc /= 4) stop "davidson_push_results failed to push task_id" +end subroutine + + + +subroutine davidson_pull_results(zmq_socket_pull, block, N, idx, vt, st, task_id) + use f77_zmq + implicit none + + integer(ZMQ_PTR) ,intent(in) :: zmq_socket_pull + integer ,intent(out) :: task_id + integer ,intent(out) :: block + integer ,intent(out) :: N + integer ,intent(out) :: idx(N_det) + double precision ,intent(out) :: vt(N_states, N_det) + double precision ,intent(out) :: st(N_states, N_det) + + integer :: rc + + rc = f77_zmq_recv( zmq_socket_pull, block, 4, 0) + if(rc /= 4) stop "davidson_push_results failed to pull block" + + rc = f77_zmq_recv( zmq_socket_pull, N, 4, 0) + if(rc /= 4) stop "davidson_push_results failed to pull N" + + rc = f77_zmq_recv( zmq_socket_pull, idx, 4*N, 0) + if(rc /= 4*N) stop "davidson_push_results failed to pull idx" + + rc = f77_zmq_recv( zmq_socket_pull, vt, 8*N_states* N, 0) + if(rc /= 8*N_states* N) stop "davidson_push_results failed to pull vt" + + rc = f77_zmq_recv( zmq_socket_pull, st, 8*N_states* N, 0) + if(rc /= 8*N_states* N) stop "davidson_push_results failed to pull st" + + rc = f77_zmq_recv( zmq_socket_pull, task_id, 4, 0) + if(rc /= 4) stop "davidson_pull_results failed to pull task_id" +end subroutine + + + +subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) + use f77_zmq + implicit none + + integer(ZMQ_PTR), intent(in) :: zmq_to_qp_run_socket + integer(ZMQ_PTR), intent(in) :: zmq_socket_pull + + double precision ,intent(inout) :: v0(N_det, N_states) + double precision ,intent(inout) :: s0(N_det, N_states) + + integer :: more, task_id + + + integer :: block + integer :: N + integer , allocatable :: idx(:) + double precision , allocatable :: vt(:,:) + double precision , allocatable :: st(:,:) + + + allocate(idx(N_det)) + allocate(vt(N_states, N_det)) + allocate(st(N_states, N_det)) + + more = 1 + + do while (more == 1) + call davidson_pull_results(zmq_socket_pull, block, N, idx, vt, st, task_id) + call davidson_collect(block, N, idx, vt, st , v0, s0) + + call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more) + end do +end subroutine + + +subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) + use f77_zmq + implicit none + + integer(ZMQ_PTR), intent(in) :: zmq_to_qp_run_socket + integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_collector + integer(ZMQ_PTR), external :: new_zmq_pull_socket + integer(ZMQ_PTR) :: zmq_socket_pull + + integer :: i + integer, external :: omp_get_thread_num + + double precision , intent(inout) :: v0(N_det, N_states) + double precision , intent(inout) :: s0(N_det, N_states) + + call zmq_set_running(zmq_to_qp_run_socket) + + zmq_collector = new_zmq_to_qp_run_socket() + zmq_socket_pull = new_zmq_pull_socket() + i = omp_get_thread_num() + + + PROVIDE nproc + + !$OMP PARALLEL DEFAULT(shared) private(i) num_threads(nproc+1) + i = omp_get_thread_num() + if (i==0) then + call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) + call end_zmq_to_qp_run_socket(zmq_collector) + call end_zmq_pull_socket(zmq_socket_pull) + else + call davidson_slave_inproc(i) + endif + !$OMP END PARALLEL + call end_parallel_job(zmq_to_qp_run_socket, 'davidson') +end subroutine + + + + + diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index daef3ee5..39e81f28 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -43,7 +43,8 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) double precision, intent(in) :: H_jj(n) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) double precision :: hij - double precision, allocatable :: vt(:,:), ut(:,:) + double precision, allocatable :: vt(:,:) +! double precision, allocatable :: ut(:,:) integer :: i,j,k,l, jj,ii integer :: i0, j0 @@ -55,9 +56,10 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) integer :: N_st_8 integer, external :: align_double - !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut + !!!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut - N_st_8 = align_double(N_st) + if(N_st /= N_states) stop "H_u_0_nstates N_st /= N_states" + N_st_8 = N_states ! align_double(N_st) ASSERT (Nint > 0) ASSERT (Nint == N_int) @@ -163,7 +165,7 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) v_0(i,istate) += H_jj(i) * u_0(i,istate) enddo enddo - deallocate (shortcut, sort_idx, sorted, version, ut) + !deallocate (shortcut, sort_idx, sorted, version, ut) end BEGIN_PROVIDER [ double precision, psi_energy, (N_states) ] @@ -175,11 +177,14 @@ BEGIN_PROVIDER [ double precision, psi_energy, (N_states) ] END_PROVIDER - +BEGIN_PROVIDER [ double precision, ut, (N_states, N_det) ] + ut = 0d0 +END_PROVIDER subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) use bitmasks + use f77_zmq implicit none BEGIN_DOC ! Computes v_0 = H|u_0> and s_0 = S^2 |u_0> @@ -196,7 +201,8 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) double precision, intent(in) :: H_jj(n), S2_jj(n) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) double precision :: hij,s2 - double precision, allocatable :: vt(:,:), ut(:,:), st(:,:) + double precision, allocatable :: vt(:,:), st(:,:) + !double precision, allocatable :: ut(:,:) integer :: i,j,k,l, jj,ii integer :: i0, j0 @@ -208,9 +214,12 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) integer :: N_st_8 integer, external :: align_double - !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut - - N_st_8 = align_double(N_st) + !!!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut + + integer(ZMQ_PTR) :: handler + + if(N_st /= N_states .or. sze_8 /= N_det) stop "SPEP" + N_st_8 = N_st !! align_double(N_st) ASSERT (Nint > 0) ASSERT (Nint == N_int) @@ -218,20 +227,27 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) PROVIDE ref_bitmask_energy allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2)) - allocate(ut(N_st_8,n)) + !allocate(ut(N_st_8,n)) v_0 = 0.d0 s_0 = 0.d0 - + provide ut do i=1,n do istate=1,N_st - ut(istate,i) = u_0(i,istate) + ut(istate,i) = u_0(i,istate) enddo enddo - call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) + call davidson_init(handler) + + do sh=shortcut(0,1),1,-1 + call davidson_add_task(handler, sh) + enddo + + call davidson_run(handler, v_0, s_0) + !$OMP PARALLEL DEFAULT(NONE) & !$OMP PRIVATE(i,hij,s2,j,k,jj,vt,st,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& !$OMP SHARED(n,keys_tmp,ut,Nint,v_0,s_0,sorted,shortcut,sort_idx,version,N_st,N_st_8) @@ -239,49 +255,49 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) Vt = 0.d0 St = 0.d0 - !$OMP DO SCHEDULE(dynamic) - do sh=1,shortcut(0,1) - do sh2=sh,shortcut(0,1) - exa = 0 - do ni=1,Nint - exa = exa + popcnt(xor(version(ni,sh,1), version(ni,sh2,1))) - end do - if(exa > 2) then - cycle - end if - - do i=shortcut(sh,1),shortcut(sh+1,1)-1 - org_i = sort_idx(i,1) - if(sh==sh2) then - endi = i-1 - else - endi = shortcut(sh2+1,1)-1 - end if - do ni=1,Nint - sorted_i(ni) = sorted(ni,i,1) - enddo - - do j=shortcut(sh2,1),endi - org_j = sort_idx(j,1) - ext = exa - do ni=1,Nint - ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1))) - end do - if(ext <= 4) then - call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij) - call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2) - do istate=1,n_st - vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) - vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) - st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) - st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) - enddo - endif - enddo - enddo - enddo - enddo - !$OMP END DO NOWAIT +! ! !$OMP DO SCHEDULE(dynamic) +! ! do sh=1,shortcut(0,1) +! ! do sh2=sh,shortcut(0,1) +! ! exa = 0 +! ! do ni=1,Nint +! ! exa = exa + popcnt(xor(version(ni,sh,1), version(ni,sh2,1))) +! ! end do +! ! if(exa > 2) then +! ! cycle +! ! end if +! ! +! ! do i=shortcut(sh,1),shortcut(sh+1,1)-1 +! ! org_i = sort_idx(i,1) +! ! if(sh==sh2) then +! ! endi = i-1 +! ! else +! ! endi = shortcut(sh2+1,1)-1 +! ! end if +! ! do ni=1,Nint +! ! sorted_i(ni) = sorted(ni,i,1) +! ! enddo +! ! +! ! do j=shortcut(sh2,1),endi +! ! org_j = sort_idx(j,1) +! ! ext = exa +! ! do ni=1,Nint +! ! ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1))) +! ! end do +! ! if(ext <= 4) then +! ! call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij) +! ! call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2) +! ! do istate=1,n_st +! ! vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) +! ! vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) +! ! st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) +! ! st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) +! ! enddo +! ! endif +! ! enddo +! ! enddo +! ! enddo +! ! enddo +! ! !$OMP END DO NOWAIT !$OMP DO SCHEDULE(dynamic) do sh=1,shortcut(0,2) @@ -326,6 +342,6 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) s_0(i,istate) = s_0(i,istate) + s2_jj(i)* u_0(i,istate) enddo enddo - deallocate (shortcut, sort_idx, sorted, version, ut) + deallocate (shortcut, sort_idx, sorted, version) end From 41e69c56e50ff68ec1d3b2e0b1ec0adb6c2de3d7 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 30 Sep 2016 15:34:59 +0200 Subject: [PATCH 147/216] HF_bitmask in cas definition --- src/Determinants/psi_cas.irp.f | 4 ++-- src/Integrals_Monoelec/pseudopot.f90 | 13 +++++------- src/Utils/util.irp.f | 31 ++++++++++++++++++++-------- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/Determinants/psi_cas.irp.f b/src/Determinants/psi_cas.irp.f index 304a2370..968ced57 100644 --- a/src/Determinants/psi_cas.irp.f +++ b/src/Determinants/psi_cas.irp.f @@ -21,9 +21,9 @@ use bitmasks do k=1,N_int good = good .and. ( & iand(not(cas_bitmask(k,1,l)), psi_det(k,1,i)) == & - iand(not(cas_bitmask(k,1,l)), psi_det(k,1,1)) ) .and. ( & + iand(not(cas_bitmask(k,1,l)), hf_bitmask(k,1)) ) .and. ( & iand(not(cas_bitmask(k,2,l)), psi_det(k,2,i)) == & - iand(not(cas_bitmask(k,2,l)), psi_det(k,2,1)) ) + iand(not(cas_bitmask(k,2,l)), hf_bitmask(k,2)) ) enddo if (good) then exit diff --git a/src/Integrals_Monoelec/pseudopot.f90 b/src/Integrals_Monoelec/pseudopot.f90 index c89bb019..a21ee836 100644 --- a/src/Integrals_Monoelec/pseudopot.f90 +++ b/src/Integrals_Monoelec/pseudopot.f90 @@ -136,7 +136,7 @@ end if(l.eq.2.and.m.eq.2)ylm_real=dsqrt(15.d0/16.d0/pi)*(xchap*xchap-ychap*ychap) if(l.eq.2.and.m.eq.1)ylm_real=dsqrt(15.d0/fourpi)*xchap*zchap - if(l.eq.2.and.m.eq.0)ylm_real=dsqrt(5.d0/16.d0/pi)*(-xchap*xchap-ychap*ychap+2.d0*zchap*zchap) + if(l.eq.2.and.m.eq.0)ylm_real=dsqrt(5.d0/16.d0/pi)*(2.d0*zchap*zchap-xchap*xchap-ychap*ychap) if(l.eq.2.and.m.eq.-1)ylm_real=dsqrt(15.d0/fourpi)*ychap*zchap if(l.eq.2.and.m.eq.-2)ylm_real=dsqrt(15.d0/fourpi)*xchap*ychap @@ -279,8 +279,7 @@ if(ac.eq.0.d0.and.bc.eq.0.d0)then do m=-l,l prod=bigI(0,0,l,m,n_a(1),n_a(2),n_a(3)) prodp=bigI(0,0,l,m,n_b(1),n_b(2),n_b(3)) - - accu=accu+prod*prodp*v_kl(k,l)*int_prod_bessel(ktot+2,g_a+g_b+dz_kl(k,l),0,0,areal,breal,arg) + accu=accu+prod*prodp*v_kl(k,l)*int_prod_bessel(ktot+2,g_a+g_b+dz_kl(k,l),0,0,areal,breal,arg) enddo enddo @@ -1783,10 +1782,8 @@ double precision function coef_nk(n,k) double precision gam,dble_fact,fact gam=dble_fact(n+n+k+k+1) - -! coef_nk=1.d0/(dble(ISHFT(1,k))*fact(k)*gam) - - coef_nk=1.d0/(2.d0**k*fact(k)*gam) +! coef_nk=1.d0/(2.d0**k*fact(k)*gam) + coef_nk=1.d0/(dble(ibset(0,k))*fact(k)*gam) return @@ -1815,7 +1812,7 @@ double precision function int_prod_bessel(l,gam,n,m,a,b,arg) logical done - u=(a+b)/(2.d0*dsqrt(gam)) + u=(a+b)*0.5d0/dsqrt(gam) freal=dexp(-arg) if(a.eq.0.d0.and.b.eq.0.d0)then diff --git a/src/Utils/util.irp.f b/src/Utils/util.irp.f index 751610a5..8d375ac6 100644 --- a/src/Utils/util.irp.f +++ b/src/Utils/util.irp.f @@ -84,10 +84,8 @@ double precision function fact(n) memo(i) = memo(i-1)*dble(i) enddo memomax = min(n,100) - fact = memo(memomax) - do i=101,n - fact = fact*dble(i) - enddo + double precision :: logfact + fact = dexp(logfact(n)) end function double precision function logfact(n) @@ -164,12 +162,27 @@ double precision function dble_fact_even(n) result(fact2) ASSERT (iand(n,1) /= 1) - prod=1.d0 - do k=2,n,2 - prod=prod*dfloat(k) + if (n <= memomax) then + if (n < 2) then + fact2 = 1.d0 + else + fact2 = memo(n) + endif + return + endif + + integer :: i + memo(1)=1.d0 + do i=memomax+2,min(n,100),2 + memo(i) = memo(i-2)* dble(i) enddo - fact2=prod - return + memomax = min(n,100) + fact2 = memo(memomax) + + if (n > 100) then + double precision :: dble_logfact + fact2 = dexp(dble_logfact(n)) + endif end function From 53306453c21a384b175df31dcd4c878529db83ec Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 30 Sep 2016 15:37:45 +0200 Subject: [PATCH 148/216] Corrected bugs in CASSD --- plugins/CAS_SD/cas_sd_selected.irp.f | 2 +- src/Davidson/diagonalization_hs2.irp.f | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/CAS_SD/cas_sd_selected.irp.f b/plugins/CAS_SD/cas_sd_selected.irp.f index 7c77b529..d12e8430 100644 --- a/plugins/CAS_SD/cas_sd_selected.irp.f +++ b/plugins/CAS_SD/cas_sd_selected.irp.f @@ -115,7 +115,7 @@ program full_ci call get_excitation_degree(psi_cas(1,1,k),psi_cas(1,1,i),degree,N_int) exc_max = max(exc_max,degree) enddo - print *, psi_coef_cas_diagonalized(i,:) + print *, psi_cas_coef(i,:) call debug_det(psi_cas(1,1,i),N_int) print *, '' enddo diff --git a/src/Davidson/diagonalization_hs2.irp.f b/src/Davidson/diagonalization_hs2.irp.f index 6c82ce1c..2c5c7387 100644 --- a/src/Davidson/diagonalization_hs2.irp.f +++ b/src/Davidson/diagonalization_hs2.irp.f @@ -177,6 +177,10 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s converged = .False. + do k=1,N_st + call normalize(u_in(1,k),sze) + enddo + do k=N_st+1,N_st_diag do i=1,sze double precision :: r1, r2 @@ -194,7 +198,6 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s call normalize(u_in(1,k),sze) enddo - do while (.not.converged) From c431da38305eafb69a121dc3d4b15b3874464f8f Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 30 Sep 2016 18:33:46 +0200 Subject: [PATCH 149/216] hobo_server - unstable --- src/Davidson/davidson_parallel.irp.f | 130 ++++++++++++++++++++++++--- src/Davidson/u0Hu0.irp.f | 7 +- 2 files changed, 118 insertions(+), 19 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index d97e46b4..37bac8d2 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -2,6 +2,7 @@ !brought to you by garniroy inc. use bitmasks +use f77_zmq subroutine davidson_process(block, N, idx, vt, st) @@ -58,10 +59,10 @@ subroutine davidson_process(block, N, idx, vt, st) call i_h_j (psi_det(1,1,org_j),psi_det(1,1,org_i),n_int,hij) call get_s2(psi_det(1,1,org_j),psi_det(1,1,org_i),n_int,s2) do istate=1,N_states - vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) - vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) - st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) - st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) + vt (istate,org_i) = vt (istate,org_i) + hij*dav_ut(istate,org_j) + vt (istate,org_j) = vt (istate,org_j) + hij*dav_ut(istate,org_i) + st (istate,org_i) = st (istate,org_i) + s2*dav_ut(istate,org_j) + st (istate,org_j) = st (istate,org_j) + s2*dav_ut(istate,org_i) enddo endif enddo @@ -70,15 +71,6 @@ subroutine davidson_process(block, N, idx, vt, st) end subroutine - BEGIN_PROVIDER [ integer, shortcut_, (0:N_det+1, 2) ] -&BEGIN_PROVIDER [ integer(bit_kind), version_, (N_int, N_det, 2) ] -&BEGIN_PROVIDER [ integer(bit_kind), sorted_, (N_int, N_det, 2) ] -&BEGIN_PROVIDER [ integer, sort_idx_, (N_det, 2) ] - implicit none - call sort_dets_ab_v(psi_det, sorted_(1,1,1), sort_idx_(1,1), shortcut_(0,1), version_(1,1,1), n_det, N_int) - call sort_dets_ba_v(psi_det, sorted_(1,1,2), sort_idx_(1,2), shortcut_(0,2), version_(1,1,2), n_det, N_int) -END_PROVIDER - subroutine davidson_collect(block, N, idx, vt, st , v0, s0) @@ -203,6 +195,8 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) allocate(vt(N_states, N_det)) allocate(st(N_states, N_det)) + call hobo_get() + do call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id, task) if(task_id == 0) exit @@ -353,6 +347,9 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) call end_zmq_to_qp_run_socket(zmq_collector) call end_zmq_pull_socket(zmq_socket_pull) + call hobo_server_end() + else if(i==1) then + call hobo_server() else call davidson_slave_inproc(i) endif @@ -362,5 +359,112 @@ end subroutine +subroutine hobo_server() + use f77_zmq + implicit none + integer(ZMQ_PTR) context + integer(ZMQ_PTR) responder + character*(64) address + character(len=:), allocatable :: buffer + integer rc + allocate (character(len=20) :: buffer) + address = 'tcp://*:11223' + + context = f77_zmq_ctx_new() + responder = f77_zmq_socket(context, ZMQ_REP) + rc = f77_zmq_bind(responder,address) + + do + rc = f77_zmq_recv(responder, buffer, 5, 0) + if (buffer(1:rc) /= 'end') then + rc = f77_zmq_send (responder, N_det, 4, ZMQ_SNDMORE) + rc = f77_zmq_send (responder, psi_det, 16*N_int*N_det, ZMQ_SNDMORE) + rc = f77_zmq_send (responder, ut, 8*N_det*N_states, 0) + else + rc = f77_zmq_send (responder, "end", 3, 0) + exit + endif + enddo + rc = f77_zmq_close(responder) + rc = f77_zmq_ctx_destroy(context) +end subroutine + + +subroutine hobo_server_end() + implicit none + use f77_zmq + + integer(ZMQ_PTR) context + integer(ZMQ_PTR) requester + character*(64) address + integer rc + character*(64) buf + + address = trim(qp_run_address)//':11223' + context = f77_zmq_ctx_new() + requester = f77_zmq_socket(context, ZMQ_REQ) + rc = f77_zmq_connect(requester,address) + + rc = f77_zmq_send(requester, "end", 3, 0) + rc = f77_zmq_recv(requester, buf, 3, 0) + rc = f77_zmq_close(requester) + rc = f77_zmq_ctx_destroy(context) +end subroutine + + +subroutine hobo_get() + implicit none + use f77_zmq + + integer(ZMQ_PTR) context + integer(ZMQ_PTR) requester + character*(64) address + character*(20) buffer +! integer(8), intent(inout) :: det(N_int,2,*) +! double precision, intent(inout) :: u_0(*) +! integer,intent(out) :: nd + integer rc + + address = trim(qp_run_address)//':11223' + + context = f77_zmq_ctx_new() + requester = f77_zmq_socket(context, ZMQ_REQ) + rc = f77_zmq_connect(requester,address) + + rc = f77_zmq_send(requester, "Hello", 5, 0) + rc = f77_zmq_recv(requester, dav_size, 4, 0) + TOUCH dav_size + rc = f77_zmq_recv(requester, dav_det, 16*N_int*dav_size, 0) + rc = f77_zmq_recv(requester, dav_ut, 8*dav_size*N_states, 0) + rc = f77_zmq_close(requester) + rc = f77_zmq_ctx_destroy(context) +end subroutine + + + +BEGIN_PROVIDER [ integer(bit_kind), dav_det, (N_int, 2, dav_size) ] +END_PROVIDER + + +BEGIN_PROVIDER [ double precision, dav_ut, (N_states, dav_size) ] +END_PROVIDER + + +BEGIN_PROVIDER [ double precision, ut, (N_states, N_det) ] +END_PROVIDER + + +BEGIN_PROVIDER [ integer, dav_size ] +END_PROVIDER + + + BEGIN_PROVIDER [ integer, shortcut_, (0:dav_size+1, 2) ] +&BEGIN_PROVIDER [ integer(bit_kind), version_, (N_int, dav_size, 2) ] +&BEGIN_PROVIDER [ integer(bit_kind), sorted_, (N_int, dav_size, 2) ] +&BEGIN_PROVIDER [ integer, sort_idx_, (dav_size, 2) ] + implicit none + call sort_dets_ab_v(dav_det, sorted_(1,1,1), sort_idx_(1,1), shortcut_(0,1), version_(1,1,1), dav_size, N_int) + call sort_dets_ba_v(dav_det, sorted_(1,1,2), sort_idx_(1,2), shortcut_(0,2), version_(1,1,2), dav_size, N_int) +END_PROVIDER \ No newline at end of file diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 39e81f28..f23c03bc 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -177,11 +177,6 @@ BEGIN_PROVIDER [ double precision, psi_energy, (N_states) ] END_PROVIDER -BEGIN_PROVIDER [ double precision, ut, (N_states, N_det) ] - ut = 0d0 -END_PROVIDER - - subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) use bitmasks use f77_zmq @@ -231,7 +226,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) v_0 = 0.d0 s_0 = 0.d0 - provide ut + do i=1,n do istate=1,N_st ut(istate,i) = u_0(i,istate) From 5ada23842241b73a88dbac805a5d71861a630f8a Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 30 Sep 2016 21:38:01 +0200 Subject: [PATCH 150/216] S2 is selected by Davidson --- src/Davidson/diagonalization_hs2.irp.f | 176 +++++++++++++++---------- src/Davidson/diagonalize_CI.irp.f | 69 +--------- 2 files changed, 112 insertions(+), 133 deletions(-) diff --git a/src/Davidson/diagonalization_hs2.irp.f b/src/Davidson/diagonalization_hs2.irp.f index 2c5c7387..769f6199 100644 --- a/src/Davidson/diagonalization_hs2.irp.f +++ b/src/Davidson/diagonalization_hs2.irp.f @@ -96,14 +96,15 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s integer :: k_pairs, kl integer :: iter2 - double precision, allocatable :: W(:,:,:), U(:,:,:), R(:,:), S(:,:,:) - double precision, allocatable :: y(:,:,:,:), h(:,:,:,:), lambda(:), s2(:) - double precision, allocatable :: c(:), H_small(:,:) + double precision, allocatable :: W(:,:), U(:,:), R(:,:), S(:,:) + double precision, allocatable :: y(:,:), h(:,:), lambda(:), s2(:) + double precision, allocatable :: c(:), s_(:,:), s_tmp(:,:) double precision :: diag_h_mat_elem double precision, allocatable :: residual_norm(:) character*(16384) :: write_buffer double precision :: to_print(3,N_st) double precision :: cpu, wall + integer :: shift, shift2 include 'constants.include.F' !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: U, W, R, S, y, h, lambda @@ -153,17 +154,18 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s allocate( & kl_pairs(2,N_st_diag*(N_st_diag+1)/2), & - W(sze_8,N_st_diag,davidson_sze_max), & - U(sze_8,N_st_diag,davidson_sze_max), & + W(sze_8,N_st_diag*davidson_sze_max), & + U(sze_8,N_st_diag*davidson_sze_max), & R(sze_8,N_st_diag), & - S(sze_8,N_st_diag,davidson_sze_max), & - h(N_st_diag,davidson_sze_max,N_st_diag,davidson_sze_max), & - y(N_st_diag,davidson_sze_max,N_st_diag,davidson_sze_max), & + S(sze_8,N_st_diag*davidson_sze_max), & + h(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & + y(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & + s_(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & + s_tmp(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & residual_norm(N_st_diag), & overlap(N_st_diag,N_st_diag), & c(N_st_diag*davidson_sze_max), & - H_small(N_st_diag,N_st_diag), & - s2(N_st_diag), & + s2(N_st_diag*davidson_sze_max), & lambda(N_st_diag*davidson_sze_max)) ASSERT (N_st > 0) @@ -203,16 +205,21 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s do k=1,N_st_diag do i=1,sze - U(i,k,1) = u_in(i,k) + U(i,k) = u_in(i,k) enddo enddo do iter=1,davidson_sze_max-1 + shift = N_st_diag*(iter-1) + shift2 = N_st_diag*iter + + ! Compute |W_k> = \sum_i |i> ! ----------------------------------------- - call H_S2_u_0_nstates(W(1,1,iter),S(1,1,iter),U(1,1,iter),H_jj,S2_jj,sze,dets_in,Nint,N_st_diag,sze_8) + + call H_S2_u_0_nstates(W(1,shift+1),S(1,shift+1),U(1,shift+1),H_jj,S2_jj,sze,dets_in,Nint,N_st_diag,sze_8) ! Compute h_kl = = @@ -232,56 +239,95 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s ! enddo ! enddo - call dgemm('T','N', N_st_diag*iter, N_st_diag, sze, & - 1.d0, U, size(U,1), W(1,1,iter), size(W,1), & - 0.d0, h(1,1,1,iter), size(h,1)*size(h,2)) + call dgemm('T','N', shift2, N_st_diag, sze, & + 1.d0, U, size(U,1), W(1,shift+1), size(W,1), & + 0.d0, h(1,shift+1), size(h,1)) + + call dgemm('T','N', shift2, N_st_diag, sze, & + 1.d0, U, size(U,1), S(1,shift+1), size(S,1), & + 0.d0, s_(1,shift+1), size(s_,1)) ! Diagonalize h ! ------------- - call lapack_diag(lambda,y,h,N_st_diag*davidson_sze_max,N_st_diag*iter) + call lapack_diag(lambda,y,h,size(h,1),shift2) + ! Compute S2 for each eigenvector + ! ------------------------------- + + call dgemm('N','N',shift2,shift2,shift2, & + 1.d0, s_, size(s_,1), y, size(y,1), & + 0.d0, s_tmp, size(s_tmp,1)) + + call dgemm('T','N',shift2,shift2,shift2, & + 1.d0, y, size(y,1), s_tmp, size(s_tmp,1), & + 0.d0, s_, size(s_,1)) + + do k=1,shift2 + s2(k) = s_(k,k) + S_z2_Sz + enddo + + if (s2_eig) then + logical :: state_ok(N_st_diag*davidson_sze_max) + do k=1,shift2 + state_ok(k) = (dabs(s2(k)-expected_s2) < 0.3d0) + enddo + do k=1,shift2 + if (.not. state_ok(k)) then + do l=k+1,shift2 + if (state_ok(l)) then + call dswap(shift2, y(1,k), 1, y(1,l), 1) + call dswap(1, s2(k), 1, s2(l), 1) + call dswap(1, lambda(k), 1, lambda(l), 1) + state_ok(k) = .True. + state_ok(l) = .False. + exit + endif + enddo + endif + enddo + endif + + ! Express eigenvectors of h in the determinant basis ! -------------------------------------------------- - do k=1,N_st_diag - do i=1,sze - U(i,k,iter+1) = 0.d0 - W(i,k,iter+1) = 0.d0 - S(i,k,iter+1) = 0.d0 - enddo - enddo - ! do k=1,N_st_diag -! do iter2=1,iter -! do l=1,N_st_diag -! do i=1,sze -! U(i,k,iter+1) = U(i,k,iter+1) + U(i,l,iter2)*y(l,iter2,k,1) -! W(i,k,iter+1) = W(i,k,iter+1) + W(i,l,iter2)*y(l,iter2,k,1) -! S(i,k,iter+1) = W(i,k,iter+1) + S(i,l,iter2)*y(l,iter2,k,1) -! enddo +! do i=1,sze +! U(i,shift2+k) = 0.d0 +! W(i,shift2+k) = 0.d0 +! S(i,shift2+k) = 0.d0 +! enddo +! do l=1,N_st_diag*iter +! do i=1,sze +! U(i,shift2+k) = U(i,shift2+k) + U(i,l)*y(l,k) +! W(i,shift2+k) = W(i,shift2+k) + W(i,l)*y(l,k) +! S(i,shift2+k) = S(i,shift2+k) + S(i,l)*y(l,k) ! enddo ! enddo ! enddo ! ! - call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, & - 1.d0, U, size(U,1), y, size(y,1)*size(y,2), 0.d0, U(1,1,iter+1), size(U,1)) - call dgemm('N','N',sze,N_st_diag,N_st_diag*iter, & - 1.d0, W, size(W,1), y, size(y,1)*size(y,2), 0.d0, W(1,1,iter+1), size(W,1)) - call dgemm('N','N',sze,N_st_diag,1, & - 1.d0, S, size(S,1), y, size(y,1)*size(y,2), 0.d0, S(1,1,iter+1), size(S,1)) + call dgemm('N','N', sze, N_st_diag, shift2, & + 1.d0, U, size(U,1), y, size(y,1), 0.d0, U(1,shift2+1), size(U,1)) + call dgemm('N','N', sze, N_st_diag, shift2, & + 1.d0, W, size(W,1), y, size(y,1), 0.d0, W(1,shift2+1), size(W,1)) + call dgemm('N','N', sze, N_st_diag, shift2, & + 1.d0, S, size(S,1), y, size(y,1), 0.d0, S(1,shift2+1), size(S,1)) ! Compute residual vector ! ----------------------- - do k=1,N_st_diag - s2(k) = u_dot_v(U(1,k,iter+1), S(1,k,iter+1), sze) + S_z2_Sz - enddo - +! do k=1,N_st_diag +! print *, s2(k) +! s2(k) = u_dot_v(U(1,shift2+k), S(1,shift2+k), sze) + S_z2_Sz +! print *, s2(k) +! print *, '' +! pause +! enddo do k=1,N_st_diag do i=1,sze - R(i,k) = (lambda(k) * U(i,k,iter+1) - W(i,k,iter+1) ) & - * (1.d0 + s2(k) * U(i,k,iter+1) - S(i,k,iter+1) - S_z2_Sz) + R(i,k) = (lambda(k) * U(i,shift2+k) - W(i,shift2+k) ) & + * (1.d0 + s2(k) * U(i,shift2+k) - S(i,shift2+k) - S_z2_Sz) enddo if (k <= N_st) then residual_norm(k) = u_dot_u(R(1,k),sze) @@ -305,7 +351,7 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s do k=1,N_st_diag do i=1,sze - U(i,k,iter+1) = - R(i,k)/max(H_jj(i) - lambda(k),1.d-2) + U(i,shift2+k) = - R(i,k)/max(H_jj(i) - lambda(k),1.d-2) enddo enddo @@ -314,33 +360,31 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s do k=1,N_st_diag -! do iter2=1,iter -! do l=1,N_st_diag -! c(1) = u_dot_v(U(1,k,iter+1),U(1,l,iter2),sze) +! do l=1,N_st_diag*iter +! c(1) = u_dot_v(U(1,shift2+k),U(1,l),sze) ! do i=1,sze -! U(i,k,iter+1) = U(i,k,iter+1) - c(1) * U(i,l,iter2) +! U(i,k,iter+1) = U(i,shift2+k) - c(1) * U(i,l) ! enddo -! enddo ! enddo ! call dgemv('T',sze,N_st_diag*iter,1.d0,U,size(U,1), & - U(1,k,iter+1),1,0.d0,c,1) + U(1,shift2+k),1,0.d0,c,1) call dgemv('N',sze,N_st_diag*iter,-1.d0,U,size(U,1), & - c,1,1.d0,U(1,k,iter+1),1) + c,1,1.d0,U(1,shift2+k),1) ! ! do l=1,k-1 -! c(1) = u_dot_v(U(1,k,iter+1),U(1,l,iter+1),sze) +! c(1) = u_dot_v(U(1,shift2+k),U(1,shift2+l),sze) ! do i=1,sze -! U(i,k,iter+1) = U(i,k,iter+1) - c(1) * U(i,l,iter+1) +! U(i,k,iter+1) = U(i,shift2+k) - c(1) * U(i,shift2+l) ! enddo ! enddo ! - call dgemv('T',sze,k-1,1.d0,U(1,1,iter+1),size(U,1), & - U(1,k,iter+1),1,0.d0,c,1) - call dgemv('N',sze,k-1,-1.d0,U(1,1,iter+1),size(U,1), & - c,1,1.d0,U(1,k,iter+1),1) + call dgemv('T',sze,k-1,1.d0,U(1,shift2+1),size(U,1), & + U(1,shift2+k),1,0.d0,c,1) + call dgemv('N',sze,k-1,-1.d0,U(1,shift2+1),size(U,1), & + c,1,1.d0,U(1,shift2+k),1) - call normalize( U(1,k,iter+1), sze ) + call normalize( U(1,shift2+k), sze ) enddo enddo @@ -354,23 +398,19 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s do k=1,N_st_diag energies(k) = lambda(k) - do i=1,sze - u_in(i,k) = 0.d0 - enddo enddo + ! do k=1,N_st_diag ! do i=1,sze -! do iter2=1,iter -! do l=1,N_st_diag -! u_in(i,k) += U(i,l,iter2)*y(l,iter2,k,1) +! do l=1,iter*N_st_diag +! u_in(i,k) += U(i,l)*y(l,k) ! enddo ! enddo ! enddo ! enddo call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, 1.d0, & - U, size(U,1), y, N_st_diag*davidson_sze_max, & - 0.d0, u_in, size(u_in,1)) + U, size(U,1), y, size(y,1), 0.d0, u_in, size(u_in,1)) enddo @@ -386,9 +426,9 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s kl_pairs, & W, residual_norm, & U, overlap, & - R, c, & + R, c, S, & h, & - y, & + y, s_, s_tmp, & lambda & ) end diff --git a/src/Davidson/diagonalize_CI.irp.f b/src/Davidson/diagonalize_CI.irp.f index 57bee09d..ecd2d6b2 100644 --- a/src/Davidson/diagonalize_CI.irp.f +++ b/src/Davidson/diagonalize_CI.irp.f @@ -55,6 +55,10 @@ END_PROVIDER if (diag_algorithm == "Davidson") then +! call davidson_diag(psi_det,CI_eigenvectors,CI_electronic_energy, & +! size(CI_eigenvectors,1), & +! N_det,min(N_det,N_states),min(N_det,N_states_diag),N_int,output_determinants) +! call davidson_diag_HS2(psi_det,CI_eigenvectors, & size(CI_eigenvectors,1),CI_electronic_energy, & N_det,min(N_det,N_states),min(N_det,N_states_diag),N_int,output_determinants) @@ -145,71 +149,6 @@ END_PROVIDER deallocate(eigenvectors,eigenvalues) endif - - if( s2_eig.and.(N_states_diag > 1).and.(N_det >= N_states_diag) )then - ! Diagonalizing S^2 within the "n_states_diag" states found - allocate(s2_eigvalues(N_states_diag), e_array(N_states_diag)) - call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors,N_det,size(psi_det,3), & - size(CI_eigenvectors,1),min(n_states_diag,n_det),s2_eigvalues) - - double precision, allocatable :: psi_coef_tmp(:,:) - allocate(psi_coef_tmp(psi_det_size,N_states_diag)) - do j = 1, N_states_diag - do i = 1, N_det - psi_coef_tmp(i,j) = CI_eigenvectors(i,j) - enddo - enddo - call u_0_H_u_0(e_array,psi_coef_tmp,n_det,psi_det,N_int,N_states_diag,psi_det_size) - - ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value - ! closer to the "expected_s2" set as input - - allocate(index_good_state_array(N_det),good_state_array(N_det)) - good_state_array = .False. - i_state = 0 - do j = 1, N_states_diag - if(dabs(s2_eigvalues(j)-expected_s2).le.0.5d0)then - good_state_array(j) = .True. - i_state +=1 - index_good_state_array(i_state) = j - endif - enddo - ! Sorting the i_state good states by energy - allocate(iorder(i_state)) - do j = 1, i_state - do i = 1, N_det - CI_eigenvectors(i,j) = psi_coef_tmp(i,index_good_state_array(j)) - enddo - CI_eigenvectors_s2(j) = s2_eigvalues(index_good_state_array(j)) - CI_electronic_energy(j) = e_array(j) - iorder(j) = j - enddo - call dsort(e_array,iorder,i_state) - do j = 1, i_state - CI_electronic_energy(j) = e_array(j) - CI_eigenvectors_s2(j) = s2_eigvalues(index_good_state_array(iorder(j))) - do i = 1, N_det - CI_eigenvectors(i,j) = psi_coef_tmp(i,index_good_state_array(iorder(j))) - enddo - enddo - - ! Then setting the other states without any specific energy order - i_other_state = 0 - do j = 1, N_states_diag - if(good_state_array(j))cycle - i_other_state +=1 - do i = 1, N_det - CI_eigenvectors(i,i_state + i_other_state) = psi_coef_tmp(i,j) - enddo - CI_eigenvectors_s2(i_state + i_other_state) = s2_eigvalues(j) - CI_electronic_energy(i_state + i_other_state) = e_array(i_state + i_other_state) - enddo - deallocate(iorder,e_array,index_good_state_array,good_state_array,psi_coef_tmp) - - deallocate(s2_eigvalues) - - endif - END_PROVIDER subroutine diagonalize_CI From 35509fb65f57489d7afee50cb6a19ade72333e9d Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 30 Sep 2016 22:29:22 +0200 Subject: [PATCH 151/216] Added S2 davidson to MRCC --- plugins/MRCC_Utils/davidson.irp.f | 618 ++++++++++++++++++++++++++++ plugins/MRCC_Utils/mrcc_utils.irp.f | 73 +--- 2 files changed, 626 insertions(+), 65 deletions(-) diff --git a/plugins/MRCC_Utils/davidson.irp.f b/plugins/MRCC_Utils/davidson.irp.f index 085799f6..a67ca676 100644 --- a/plugins/MRCC_Utils/davidson.irp.f +++ b/plugins/MRCC_Utils/davidson.irp.f @@ -548,3 +548,621 @@ subroutine H_u_0_mrcc_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,istate_in,N_st,sze_8) end + +subroutine davidson_diag_mrcc_hs2(dets_in,u_in,dim_in,energies,sze,N_st,N_st_diag,Nint,iunit,istate) + use bitmasks + implicit none + BEGIN_DOC + ! Davidson diagonalization. + ! + ! dets_in : bitmasks corresponding to determinants + ! + ! u_in : guess coefficients on the various states. Overwritten + ! on exit + ! + ! dim_in : leftmost dimension of u_in + ! + ! sze : Number of determinants + ! + ! N_st : Number of eigenstates + ! + ! iunit : Unit number for the I/O + ! + ! Initial guess vectors are not necessarily orthonormal + END_DOC + integer, intent(in) :: dim_in, sze, N_st, N_st_diag, Nint, iunit, istate + integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) + double precision, intent(inout) :: u_in(dim_in,N_st_diag) + double precision, intent(out) :: energies(N_st) + double precision, allocatable :: H_jj(:), S2_jj(:) + + double precision :: diag_h_mat_elem + integer :: i + ASSERT (N_st > 0) + ASSERT (sze > 0) + ASSERT (Nint > 0) + ASSERT (Nint == N_int) + PROVIDE mo_bielec_integrals_in_map + allocate(H_jj(sze), S2_jj(sze)) + + !$OMP PARALLEL DEFAULT(NONE) & + !$OMP SHARED(sze,H_jj,S2_jj, dets_in,Nint,N_det_ref,delta_ii, & + !$OMP idx_ref, istate) & + !$OMP PRIVATE(i) + !$OMP DO SCHEDULE(guided) + do i=1,sze + H_jj(i) = diag_h_mat_elem(dets_in(1,1,i),Nint) + call get_s2(dets_in(1,1,i),dets_in(1,1,i),Nint,S2_jj(i)) + enddo + !$OMP END DO + !$OMP DO SCHEDULE(guided) + do i=1,N_det_ref + H_jj(idx_ref(i)) += delta_ii(istate,i) + enddo + !$OMP END DO + !$OMP END PARALLEL + + call davidson_diag_hjj_sjj_mrcc(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_st,N_st_diag,Nint,iunit,istate) + deallocate (H_jj,S2_jj) +end + + +subroutine davidson_diag_hjj_sjj_mrcc(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_st,N_st_diag,Nint,iunit,istate ) + use bitmasks + implicit none + BEGIN_DOC + ! Davidson diagonalization with specific diagonal elements of the H matrix + ! + ! H_jj : specific diagonal H matrix elements to diagonalize de Davidson + ! + ! S2_jj : specific diagonal S^2 matrix elements + ! + ! dets_in : bitmasks corresponding to determinants + ! + ! u_in : guess coefficients on the various states. Overwritten + ! on exit + ! + ! dim_in : leftmost dimension of u_in + ! + ! sze : Number of determinants + ! + ! N_st : Number of eigenstates + ! + ! N_st_diag : Number of states in which H is diagonalized. Assumed > sze + ! + ! iunit : Unit for the I/O + ! + ! Initial guess vectors are not necessarily orthonormal + END_DOC + integer, intent(in) :: dim_in, sze, N_st, N_st_diag, Nint, istate + integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) + double precision, intent(in) :: H_jj(sze), S2_jj(sze) + integer, intent(in) :: iunit + double precision, intent(inout) :: u_in(dim_in,N_st_diag) + double precision, intent(out) :: energies(N_st_diag) + + integer :: sze_8 + integer :: iter + integer :: i,j,k,l,m + logical :: converged + + double precision, allocatable :: overlap(:,:) + double precision :: u_dot_v, u_dot_u + + integer, allocatable :: kl_pairs(:,:) + integer :: k_pairs, kl + + integer :: iter2 + double precision, allocatable :: W(:,:), U(:,:), R(:,:), S(:,:) + double precision, allocatable :: y(:,:), h(:,:), lambda(:), s2(:) + double precision, allocatable :: c(:), s_(:,:), s_tmp(:,:) + double precision :: diag_h_mat_elem + double precision, allocatable :: residual_norm(:) + character*(16384) :: write_buffer + double precision :: to_print(3,N_st) + double precision :: cpu, wall + integer :: shift, shift2 + include 'constants.include.F' + + !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: U, W, R, S, y, h, lambda + if (N_st_diag > sze) then + stop 'error in Davidson : N_st_diag > sze' + endif + + PROVIDE nuclear_repulsion + + call write_time(iunit) + call wall_time(wall) + call cpu_time(cpu) + write(iunit,'(A)') '' + write(iunit,'(A)') 'Davidson Diagonalization' + write(iunit,'(A)') '------------------------' + write(iunit,'(A)') '' + call write_int(iunit,N_st,'Number of states') + call write_int(iunit,N_st_diag,'Number of states in diagonalization') + call write_int(iunit,sze,'Number of determinants') + call write_int(iunit,istate,'Using dressing for state ') + + write(iunit,'(A)') '' + write_buffer = '===== ' + do i=1,N_st + write_buffer = trim(write_buffer)//' ================ =========== ===========' + enddo + write(iunit,'(A)') trim(write_buffer) + write_buffer = ' Iter' + do i=1,N_st + write_buffer = trim(write_buffer)//' Energy S^2 Residual' + enddo + write(iunit,'(A)') trim(write_buffer) + write_buffer = '===== ' + do i=1,N_st + write_buffer = trim(write_buffer)//' ================ =========== ===========' + enddo + write(iunit,'(A)') trim(write_buffer) + + integer, external :: align_double + sze_8 = align_double(sze) + + double precision :: delta + + if (s2_eig) then + delta = 1.d0 + else + delta = 0.d0 + endif + + allocate( & + kl_pairs(2,N_st_diag*(N_st_diag+1)/2), & + W(sze_8,N_st_diag*davidson_sze_max), & + U(sze_8,N_st_diag*davidson_sze_max), & + R(sze_8,N_st_diag), & + S(sze_8,N_st_diag*davidson_sze_max), & + h(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & + y(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & + s_(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & + s_tmp(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & + residual_norm(N_st_diag), & + overlap(N_st_diag,N_st_diag), & + c(N_st_diag*davidson_sze_max), & + s2(N_st_diag*davidson_sze_max), & + lambda(N_st_diag*davidson_sze_max)) + + ASSERT (N_st > 0) + ASSERT (N_st_diag >= N_st) + ASSERT (sze > 0) + ASSERT (Nint > 0) + ASSERT (Nint == N_int) + + ! Davidson iterations + ! =================== + + converged = .False. + + do k=1,N_st + call normalize(u_in(1,k),sze) + enddo + + do k=N_st+1,N_st_diag + do i=1,sze + double precision :: r1, r2 + call random_number(r1) + call random_number(r2) + u_in(i,k) = dsqrt(-2.d0*dlog(r1))*dcos(dtwo_pi*r2) + enddo + + ! Gram-Schmidt + ! ------------ + call dgemv('T',sze,k-1,1.d0,u_in,size(u_in,1), & + u_in(1,k),1,0.d0,c,1) + call dgemv('N',sze,k-1,-1.d0,u_in,size(u_in,1), & + c,1,1.d0,u_in(1,k),1) + call normalize(u_in(1,k),sze) + enddo + + + do while (.not.converged) + + do k=1,N_st_diag + do i=1,sze + U(i,k) = u_in(i,k) + enddo + enddo + + do iter=1,davidson_sze_max-1 + + shift = N_st_diag*(iter-1) + shift2 = N_st_diag*iter + + + ! Compute |W_k> = \sum_i |i> + ! ----------------------------------------- + + + call H_S2_u_0_mrcc_nstates(W(1,shift+1),S(1,shift+1),U(1,shift+1),H_jj,S2_jj,sze,dets_in,Nint,& + istate,N_st_diag,sze_8) + + + ! Compute h_kl = = + ! ------------------------------------------- + + +! do l=1,N_st_diag +! do k=1,N_st_diag +! do iter2=1,iter-1 +! h(k,iter2,l,iter) = u_dot_v(U(1,k,iter2),W(1,l,iter),sze) +! h(k,iter,l,iter2) = h(k,iter2,l,iter) +! enddo +! enddo +! do k=1,l +! h(k,iter,l,iter) = u_dot_v(U(1,k,iter),W(1,l,iter),sze) +! h(l,iter,k,iter) = h(k,iter,l,iter) +! enddo +! enddo + + call dgemm('T','N', shift2, N_st_diag, sze, & + 1.d0, U, size(U,1), W(1,shift+1), size(W,1), & + 0.d0, h(1,shift+1), size(h,1)) + + call dgemm('T','N', shift2, N_st_diag, sze, & + 1.d0, U, size(U,1), S(1,shift+1), size(S,1), & + 0.d0, s_(1,shift+1), size(s_,1)) + + ! Diagonalize h + ! ------------- + call lapack_diag(lambda,y,h,size(h,1),shift2) + + ! Compute S2 for each eigenvector + ! ------------------------------- + + call dgemm('N','N',shift2,shift2,shift2, & + 1.d0, s_, size(s_,1), y, size(y,1), & + 0.d0, s_tmp, size(s_tmp,1)) + + call dgemm('T','N',shift2,shift2,shift2, & + 1.d0, y, size(y,1), s_tmp, size(s_tmp,1), & + 0.d0, s_, size(s_,1)) + + do k=1,shift2 + s2(k) = s_(k,k) + S_z2_Sz + enddo + + if (s2_eig) then + logical :: state_ok(N_st_diag*davidson_sze_max) + do k=1,shift2 + state_ok(k) = (dabs(s2(k)-expected_s2) < 0.3d0) + enddo + do k=1,shift2 + if (.not. state_ok(k)) then + do l=k+1,shift2 + if (state_ok(l)) then + call dswap(shift2, y(1,k), 1, y(1,l), 1) + call dswap(1, s2(k), 1, s2(l), 1) + call dswap(1, lambda(k), 1, lambda(l), 1) + state_ok(k) = .True. + state_ok(l) = .False. + exit + endif + enddo + endif + enddo + endif + + + ! Express eigenvectors of h in the determinant basis + ! -------------------------------------------------- + +! do k=1,N_st_diag +! do i=1,sze +! U(i,shift2+k) = 0.d0 +! W(i,shift2+k) = 0.d0 +! S(i,shift2+k) = 0.d0 +! enddo +! do l=1,N_st_diag*iter +! do i=1,sze +! U(i,shift2+k) = U(i,shift2+k) + U(i,l)*y(l,k) +! W(i,shift2+k) = W(i,shift2+k) + W(i,l)*y(l,k) +! S(i,shift2+k) = S(i,shift2+k) + S(i,l)*y(l,k) +! enddo +! enddo +! enddo +! +! + call dgemm('N','N', sze, N_st_diag, shift2, & + 1.d0, U, size(U,1), y, size(y,1), 0.d0, U(1,shift2+1), size(U,1)) + call dgemm('N','N', sze, N_st_diag, shift2, & + 1.d0, W, size(W,1), y, size(y,1), 0.d0, W(1,shift2+1), size(W,1)) + call dgemm('N','N', sze, N_st_diag, shift2, & + 1.d0, S, size(S,1), y, size(y,1), 0.d0, S(1,shift2+1), size(S,1)) + + ! Compute residual vector + ! ----------------------- + +! do k=1,N_st_diag +! print *, s2(k) +! s2(k) = u_dot_v(U(1,shift2+k), S(1,shift2+k), sze) + S_z2_Sz +! print *, s2(k) +! print *, '' +! pause +! enddo + do k=1,N_st_diag + do i=1,sze + R(i,k) = (lambda(k) * U(i,shift2+k) - W(i,shift2+k) ) & + * (1.d0 + s2(k) * U(i,shift2+k) - S(i,shift2+k) - S_z2_Sz) + enddo + if (k <= N_st) then + residual_norm(k) = u_dot_u(R(1,k),sze) + to_print(1,k) = lambda(k) + nuclear_repulsion + to_print(2,k) = s2(k) + to_print(3,k) = residual_norm(k) + if (residual_norm(k) > 1.e9) then + stop 'Davidson failed' + endif + endif + enddo + + write(iunit,'(X,I3,X,100(X,F16.10,X,F11.6,X,E11.3))') iter, to_print(:,1:N_st) + call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_st,converged) + if (converged) then + exit + endif + + ! Davidson step + ! ------------- + + do k=1,N_st_diag + do i=1,sze + U(i,shift2+k) = - R(i,k)/max(H_jj(i) - lambda(k),1.d-2) + enddo + enddo + + ! Gram-Schmidt + ! ------------ + + do k=1,N_st_diag + +! do l=1,N_st_diag*iter +! c(1) = u_dot_v(U(1,shift2+k),U(1,l),sze) +! do i=1,sze +! U(i,k,iter+1) = U(i,shift2+k) - c(1) * U(i,l) +! enddo +! enddo +! + call dgemv('T',sze,N_st_diag*iter,1.d0,U,size(U,1), & + U(1,shift2+k),1,0.d0,c,1) + call dgemv('N',sze,N_st_diag*iter,-1.d0,U,size(U,1), & + c,1,1.d0,U(1,shift2+k),1) +! +! do l=1,k-1 +! c(1) = u_dot_v(U(1,shift2+k),U(1,shift2+l),sze) +! do i=1,sze +! U(i,k,iter+1) = U(i,shift2+k) - c(1) * U(i,shift2+l) +! enddo +! enddo +! + call dgemv('T',sze,k-1,1.d0,U(1,shift2+1),size(U,1), & + U(1,shift2+k),1,0.d0,c,1) + call dgemv('N',sze,k-1,-1.d0,U(1,shift2+1),size(U,1), & + c,1,1.d0,U(1,shift2+k),1) + + call normalize( U(1,shift2+k), sze ) + enddo + + enddo + + if (.not.converged) then + iter = davidson_sze_max-1 + endif + + ! Re-contract to u_in + ! ----------- + + do k=1,N_st_diag + energies(k) = lambda(k) + enddo + +! do k=1,N_st_diag +! do i=1,sze +! do l=1,iter*N_st_diag +! u_in(i,k) += U(i,l)*y(l,k) +! enddo +! enddo +! enddo +! enddo + + call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, 1.d0, & + U, size(U,1), y, size(y,1), 0.d0, u_in, size(u_in,1)) + + enddo + + write_buffer = '===== ' + do i=1,N_st + write_buffer = trim(write_buffer)//' ================ =========== ===========' + enddo + write(iunit,'(A)') trim(write_buffer) + write(iunit,'(A)') '' + call write_time(iunit) + + deallocate ( & + kl_pairs, & + W, residual_norm, & + U, overlap, & + R, c, S, & + h, & + y, s_, s_tmp, & + lambda & + ) +end + + +subroutine H_S2_u_0_mrcc_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,istate_in,N_st,sze_8) + use bitmasks + implicit none + BEGIN_DOC + ! Computes v_0 = H|u_0> and s_0 = S^2 |u_0> + ! + ! n : number of determinants + ! + ! H_jj : array of + ! + ! S2_jj : array of + END_DOC + integer, intent(in) :: N_st,n,Nint, sze_8, istate_in + double precision, intent(out) :: v_0(sze_8,N_st), s_0(sze_8,N_st) + double precision, intent(in) :: u_0(sze_8,N_st) + double precision, intent(in) :: H_jj(n), S2_jj(n) + integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) + double precision :: hij,s2 + double precision, allocatable :: vt(:,:), ut(:,:), st(:,:) + integer :: i,j,k,l, jj,ii + integer :: i0, j0 + + integer, allocatable :: shortcut(:,:), sort_idx(:,:) + integer(bit_kind), allocatable :: sorted(:,:,:), version(:,:,:) + integer(bit_kind) :: sorted_i(Nint) + + integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi, istate + integer :: N_st_8 + + integer, external :: align_double + !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut + + N_st_8 = align_double(N_st) + + ASSERT (Nint > 0) + ASSERT (Nint == N_int) + ASSERT (n>0) + PROVIDE ref_bitmask_energy + + allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2)) + allocate(ut(N_st_8,n)) + + v_0 = 0.d0 + s_0 = 0.d0 + + do i=1,n + do istate=1,N_st + ut(istate,i) = u_0(i,istate) + enddo + enddo + + call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) + call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) + + !$OMP PARALLEL DEFAULT(NONE) & + !$OMP PRIVATE(i,hij,s2,j,k,jj,vt,st,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& + !$OMP SHARED(n,keys_tmp,ut,Nint,v_0,s_0,sorted,shortcut,sort_idx,version,N_st,N_st_8, & + !$OMP N_det_ref, idx_ref, N_det_non_ref, idx_non_ref, delta_ij,istate_in) + allocate(vt(N_st_8,n),st(N_st_8,n)) + Vt = 0.d0 + St = 0.d0 + + !$OMP DO SCHEDULE(dynamic) + do sh=1,shortcut(0,1) + do sh2=sh,shortcut(0,1) + exa = 0 + do ni=1,Nint + exa = exa + popcnt(xor(version(ni,sh,1), version(ni,sh2,1))) + end do + if(exa > 2) then + cycle + end if + + do i=shortcut(sh,1),shortcut(sh+1,1)-1 + org_i = sort_idx(i,1) + if(sh==sh2) then + endi = i-1 + else + endi = shortcut(sh2+1,1)-1 + end if + do ni=1,Nint + sorted_i(ni) = sorted(ni,i,1) + enddo + + do j=shortcut(sh2,1),endi + org_j = sort_idx(j,1) + ext = exa + do ni=1,Nint + ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1))) + end do + if(ext <= 4) then + call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij) + call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2) + do istate=1,n_st + vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) + vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) + st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) + st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) + enddo + endif + enddo + enddo + enddo + enddo + !$OMP END DO NOWAIT + !$OMP DO SCHEDULE(dynamic) + do sh=1,shortcut(0,2) + do i=shortcut(sh,2),shortcut(sh+1,2)-1 + org_i = sort_idx(i,2) + do j=shortcut(sh,2),i-1 + org_j = sort_idx(j,2) + ext = 0 + do ni=1,Nint + ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2))) + end do + if(ext == 4) then + call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij) + call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2) + do istate=1,n_st + vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) + vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) + st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) + st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) + enddo + end if + end do + end do + enddo + !$OMP END DO NOWAIT + +! -------------------------- +! Begin Specific to dressing +! -------------------------- + + !$OMP DO + do ii=1,n_det_ref + i = idx_ref(ii) + do jj = 1, n_det_non_ref + j = idx_non_ref(jj) + do istate=1,N_st + vt (istate,i) = vt (istate,i) + delta_ij(istate_in,jj,ii)*ut(istate,j) + vt (istate,j) = vt (istate,j) + delta_ij(istate_in,jj,ii)*ut(istate,i) + enddo + enddo + enddo + !$OMP END DO + +! ------------------------ +! End Specific to dressing +! ------------------------ + + !$OMP CRITICAL + do istate=1,N_st + do i=n,1,-1 + v_0(i,istate) = v_0(i,istate) + vt(istate,i) + s_0(i,istate) = s_0(i,istate) + st(istate,i) + enddo + enddo + !$OMP END CRITICAL + + deallocate(vt,st) + !$OMP END PARALLEL + + do istate=1,N_st + do i=1,n + v_0(i,istate) = v_0(i,istate) + H_jj(i) * u_0(i,istate) + s_0(i,istate) = s_0(i,istate) + s2_jj(i)* u_0(i,istate) + enddo + enddo + deallocate (shortcut, sort_idx, sorted, version, ut) +end + diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 12ae089b..fcfb5dd1 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -148,8 +148,14 @@ END_PROVIDER if (diag_algorithm == "Davidson") then - call davidson_diag_mrcc(psi_det,CI_eigenvectors_dressed,CI_electronic_energy_dressed,& - size(CI_eigenvectors_dressed,1),N_det,N_states,N_states_diag,N_int,output_determinants,mrcc_state) +! call davidson_diag_mrcc(psi_det,CI_eigenvectors_dressed,CI_electronic_energy_dressed,& +! size(CI_eigenvectors_dressed,1),N_det,N_states,N_states_diag,N_int,output_determinants,mrcc_state) + + call davidson_diag_mrcc_HS2(psi_det,CI_eigenvectors_dressed,& + size(CI_eigenvectors_dressed,1), & + CI_electronic_energy_dressed,N_det,N_states,N_states_diag,N_int, & + output_determinants,mrcc_state) + call u_0_S2_u_0(CI_eigenvectors_s2_dressed,CI_eigenvectors_dressed,N_det,psi_det,N_int,& N_states_diag,size(CI_eigenvectors_dressed,1)) @@ -236,69 +242,6 @@ END_PROVIDER deallocate(eigenvectors,eigenvalues) endif - if( s2_eig.and.(n_states_diag > 1).and.(n_det >= n_states_diag) )then - ! Diagonalizing S^2 within the "n_states_diag" states found - allocate(s2_eigvalues(N_states_diag), e_array(N_states_diag)) - call diagonalize_s2_betweenstates(psi_det,CI_eigenvectors_dressed,n_det,size(psi_det,3),size(CI_eigenvectors_dressed,1),min(n_states_diag,n_det),s2_eigvalues) - - double precision, allocatable :: psi_coef_tmp(:,:) - allocate(psi_coef_tmp(psi_det_size,N_states_diag)) - do j = 1, N_states_diag - do i = 1, N_det - psi_coef_tmp(i,j) = CI_eigenvectors_dressed(i,j) - enddo - enddo - call u_0_H_u_0_mrcc_nstates(e_array,psi_coef_tmp,n_det,psi_det,N_int,mrcc_state,N_states,psi_det_size) - - ! Browsing the "n_states_diag" states and getting the lowest in energy "n_states" ones that have the S^2 value - ! closer to the "expected_s2" set as input - - allocate(index_good_state_array(N_det),good_state_array(N_det)) - good_state_array = .False. - i_state = 0 - do j = 1, N_states_diag - if(dabs(s2_eigvalues(j)-expected_s2).le.0.5d0)then - good_state_array(j) = .True. - i_state +=1 - index_good_state_array(i_state) = j - endif - enddo - ! Sorting the i_state good states by energy - allocate(iorder(i_state)) - do j = 1, i_state - do i = 1, N_det - CI_eigenvectors_dressed(i,j) = psi_coef_tmp(i,index_good_state_array(j)) - enddo - CI_eigenvectors_s2_dressed(j) = s2_eigvalues(index_good_state_array(j)) - CI_electronic_energy_dressed(j) = e_array(j) - iorder(j) = j - enddo - call dsort(e_array,iorder,i_state) - do j = 1, i_state - CI_electronic_energy_dressed(j) = e_array(j) - CI_eigenvectors_s2_dressed(j) = s2_eigvalues(index_good_state_array(iorder(j))) - do i = 1, N_det - CI_eigenvectors_dressed(i,j) = psi_coef_tmp(i,index_good_state_array(iorder(j))) - enddo - enddo - - ! Then setting the other states without any specific energy order - i_other_state = 0 - do j = 1, N_states_diag - if(good_state_array(j))cycle - i_other_state +=1 - do i = 1, N_det - CI_eigenvectors_dressed(i,i_state + i_other_state) = psi_coef_tmp(i,j) - enddo - CI_eigenvectors_s2_dressed(i_state + i_other_state) = s2_eigvalues(j) - CI_electronic_energy_dressed(i_state + i_other_state) = e_array(i_state + i_other_state) - enddo - deallocate(iorder,e_array,index_good_state_array,good_state_array,psi_coef_tmp) - - deallocate(s2_eigvalues) - - endif - END_PROVIDER BEGIN_PROVIDER [ double precision, CI_energy_dressed, (N_states_diag) ] From ac7ae610169b5f828d3b8cf7113544ec90ec8490 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sat, 1 Oct 2016 17:24:08 +0200 Subject: [PATCH 152/216] Removed debug in pseudo --- src/Integrals_Monoelec/pot_ao_ints.irp.f | 1 - .../pot_ao_pseudo_ints.irp.f | 35 +++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/Integrals_Monoelec/pot_ao_ints.irp.f b/src/Integrals_Monoelec/pot_ao_ints.irp.f index 913b1396..7116d2c7 100644 --- a/src/Integrals_Monoelec/pot_ao_ints.irp.f +++ b/src/Integrals_Monoelec/pot_ao_ints.irp.f @@ -12,7 +12,6 @@ BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral, (ao_num_align,ao_num)] if (read_ao_one_integrals) then call ezfio_get_ao_basis_integral_nuclear(ao_nucl_elec_integral(1:ao_num, 1:ao_num)) - call ezfio_set_ao_basis_integral_nuclear(ao_nucl_elec_integral(1:ao_num, 1:ao_num)) print *, 'AO N-e integrals read from disk' else diff --git a/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f b/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f index 28437b27..b34b201e 100644 --- a/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f +++ b/src/Integrals_Monoelec/pot_ao_pseudo_ints.irp.f @@ -53,6 +53,13 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral_local, (ao_num_align,ao_nu call wall_time(wall_1) call cpu_time(cpu_1) +!write(33,*) 'xxxLOCxxx' +!write(33,*) 'pseudo_klocmax', pseudo_klocmax +!write(33,*) 'pseudo_v_k_transp ', pseudo_v_k_transp +!write(33,*) 'pseudo_n_k_transp ', pseudo_n_k_transp +!write(33,*) 'pseudo_dz_k_transp', pseudo_dz_k_transp +!write(33,*) 'xxxLOCxxx' + thread_num = 0 !$OMP PARALLEL & !$OMP DEFAULT (NONE) & @@ -102,7 +109,15 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral_local, (ao_num_align,ao_nu pseudo_n_k_transp (1,k), & pseudo_dz_k_transp(1,k), & A_center,power_A,alpha,B_center,power_B,beta,C_center) - +! write(33,*) i,j,k +! write(33,*) A_center,power_A,alpha,B_center,power_B,beta,C_center, & +! Vloc(pseudo_klocmax, & +! pseudo_v_k_transp (1,k), & +! pseudo_n_k_transp (1,k), & +! pseudo_dz_k_transp(1,k), & +! A_center,power_A,alpha,B_center,power_B,beta,C_center) +! write(33,*) + enddo ao_pseudo_integral_local(i,j) = ao_pseudo_integral_local(i,j) +& ao_coef_normalized_ordered_transp(l,j)*ao_coef_normalized_ordered_transp(m,i)*c @@ -123,7 +138,6 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral_local, (ao_num_align,ao_nu !$OMP END DO !$OMP END PARALLEL - END_PROVIDER @@ -151,6 +165,13 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral_local, (ao_num_align,ao_nu call wall_time(wall_1) call cpu_time(cpu_1) thread_num = 0 +!write(34,*) 'xxxNONLOCxxx' +!write(34,*) ' pseudo_lmax,pseudo_kmax', pseudo_lmax,pseudo_kmax +!write(34,*) ' pseudo_v_kl_transp(1,0,k)', pseudo_v_kl_transp +!write(34,*) ' pseudo_n_kl_transp(1,0,k)', pseudo_n_kl_transp +!write(34,*) ' pseudo_dz_kl_transp(1,0,k)', pseudo_dz_kl_transp +!write(34,*) 'xxxNONLOCxxx' + !$OMP PARALLEL & !$OMP DEFAULT (NONE) & !$OMP PRIVATE (i,j,k,l,m,alpha,beta,A_center,B_center,C_center,power_A,power_B,& @@ -201,6 +222,15 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral_local, (ao_num_align,ao_nu pseudo_n_kl_transp(1,0,k), & pseudo_dz_kl_transp(1,0,k), & A_center,power_A,alpha,B_center,power_B,beta,C_center) +! write(34,*) i,j,k +! write(34,*) & +! A_center,power_A,alpha,B_center,power_B,beta,C_center, & +! Vpseudo(pseudo_lmax,pseudo_kmax, & +! pseudo_v_kl_transp(1,0,k), & +! pseudo_n_kl_transp(1,0,k), & +! pseudo_dz_kl_transp(1,0,k), & +! A_center,power_A,alpha,B_center,power_B,beta,C_center) +! write(34,*) '' enddo ao_pseudo_integral_non_local(i,j) = ao_pseudo_integral_non_local(i,j) +& ao_coef_normalized_ordered_transp(l,j)*ao_coef_normalized_ordered_transp(m,i)*c @@ -223,7 +253,6 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral_local, (ao_num_align,ao_nu !$OMP END PARALLEL - END_PROVIDER BEGIN_PROVIDER [ double precision, pseudo_v_k_transp, (pseudo_klocmax,nucl_num) ] From 7d320f213fc2b9256a505067fc45956b619a9ff3 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sat, 1 Oct 2016 18:04:25 +0200 Subject: [PATCH 153/216] Accelerated pseudo --- src/Integrals_Monoelec/pseudopot.f90 | 98 +++++++++++++++++++++------- 1 file changed, 75 insertions(+), 23 deletions(-) diff --git a/src/Integrals_Monoelec/pseudopot.f90 b/src/Integrals_Monoelec/pseudopot.f90 index a21ee836..725aa8c7 100644 --- a/src/Integrals_Monoelec/pseudopot.f90 +++ b/src/Integrals_Monoelec/pseudopot.f90 @@ -276,29 +276,17 @@ if(ac.eq.0.d0.and.bc.eq.0.d0)then do k=1,kmax do l=0,lmax ktot=ntot+n_kl(k,l) + if (v_kl(k,l) == 0.d0) cycle do m=-l,l prod=bigI(0,0,l,m,n_a(1),n_a(2),n_a(3)) + if (prod == 0.d0) cycle prodp=bigI(0,0,l,m,n_b(1),n_b(2),n_b(3)) + if (prodp == 0.d0) cycle accu=accu+prod*prodp*v_kl(k,l)*int_prod_bessel(ktot+2,g_a+g_b+dz_kl(k,l),0,0,areal,breal,arg) enddo enddo enddo -! do k=1,kmax -! do l=0,lmax -! ktot=ntot+n_kl(k,l) -! do m=-l,l -! prod =bigI(0,0,l,m,n_a(1),n_a(2),n_a(3))*v_kl(k,l) -! prodp=bigI(0,0,l,m,n_b(1),n_b(2),n_b(3))*prod -! if (dabs (prodp) < 1.d-15) then -! cycle -! endif -! -! accu=accu+prodp*int_prod_bessel(ktot+2,g_a+g_b+dz_kl(k,l),0,0,areal,breal,arg) -! -! enddo -! enddo -! enddo !=!=!=!=! ! E n d ! @@ -385,14 +373,17 @@ else if(ac.ne.0.d0.and.bc.ne.0.d0)then enddo do k3=0,n_a(3) + if (array_coefs_A(k3,3) == 0.d0) cycle do k2=0,n_a(2) + if (array_coefs_A(k2,2) == 0.d0) cycle do k1=0,n_a(1) - + if (array_coefs_A(k1,1) == 0.d0) cycle + do lambda=0,l+ntotA do mu=-lambda,lambda prod=ylm(lambda,mu,theta_AC0,phi_AC0)*array_coefs_A(k1,1)*array_coefs_A(k2,2)*array_coefs_A(k3,3)*array_I_A(mu,lambda,k1,k2,k3) - + if (prod == 0.d0) cycle do k3p=0,n_b(3) do k2p=0,n_b(2) @@ -404,6 +395,7 @@ else if(ac.ne.0.d0.and.bc.ne.0.d0)then array_coefs_B(k1p,1)*array_coefs_B(k2p,2)*array_coefs_B(k3p,3)* & array_I_B(mup,lambdap,k1p,k2p,k3p) + if (prodp == 0.d0) cycle do k=1,kmax ktot=k1+k2+k3+k1p+k2p+k3p+n_kl(k,l) accu=accu+prodp*v_kl(k,l)*array_R(k,ktot,l,lambda,lambdap) @@ -489,13 +481,18 @@ else if(ac.eq.0.d0.and.bc.ne.0.d0)then prod=bigI(0,0,l,m,n_a(1),n_a(2),n_a(3)) do k3p=0,n_b(3) + if (array_coefs_B(k3p,3) == 0.d0) cycle do k2p=0,n_b(2) + if (array_coefs_B(k2p,2) == 0.d0) cycle do k1p=0,n_b(1) + if (array_coefs_B(k1p,1) == 0.d0) cycle do lambdap=0,l+ntotB do mup=-lambdap,lambdap prodp=prod*array_coefs_B(k1p,1)*array_coefs_B(k2p,2)*array_coefs_B(k3p,3)*ylm(lambdap,mup,theta_BC0,phi_BC0)*array_I_B(mup,lambdap,k1p,k2p,k3p) + if (prodp == 0.d0) cycle + do k=1,kmax ktot=ntotA+k1p+k2p+k3p+n_kl(k,l) @@ -572,13 +569,19 @@ else if(ac.ne.0.d0.and.bc.eq.0.d0)then enddo do k3=0,n_a(3) + if (array_coefs_A(k3,3) == 0.d0) cycle do k2=0,n_a(2) + if (array_coefs_A(k2,2) == 0.d0) cycle do k1=0,n_a(1) + if (array_coefs_A(k1,1) == 0.d0) cycle do lambda=0,l+ntotA do mu=-lambda,lambda prod=array_coefs_A(k1,1)*array_coefs_A(k2,2)*array_coefs_A(k3,3)*ylm(lambda,mu,theta_AC0,phi_AC0)*array_I_A(mu,lambda,k1,k2,k3) + if (prod == 0.d0) cycle prodp=prod*bigI(0,0,l,m,n_b(1),n_b(2),n_b(3)) + + if (prodp == 0.d0) cycle do k=1,kmax ktot=k1+k2+k3+ntotB+n_kl(k,l) @@ -811,18 +814,22 @@ double precision int_prod_bessel_loc,binom_func,accu,prod,ylm,bigI,arg phi_DC0=datan2(d(2)/d2,d(1)/d2) do k=1,klocmax + if (v_k(k) == 0.d0) cycle do k1=0,n_a(1) do k2=0,n_a(2) do k3=0,n_a(3) do k1p=0,n_b(1) do k2p=0,n_b(2) do k3p=0,n_b(3) + if (array_coefs(k1,k2,k3,k1p,k2p,k3p) == 0.d0) cycle do l=0,ntot do m=-l,l coef=ylm(l,m,theta_DC0,phi_DC0) + if (coef == 0.d0) cycle + ktot=k1+k2+k3+k1p+k2p+k3p+n_k(k) + if (array_R_loc(ktot,k,l) == 0.d0) cycle prod=coef*array_coefs(k1,k2,k3,k1p,k2p,k3p) & *bigI(l,m,0,0,k1+k1p,k2+k2p,k3+k3p) - ktot=k1+k2+k3+k1p+k2p+k3p+n_k(k) accu=accu+prod*v_k(k)*array_R_loc(ktot,k,l) enddo enddo @@ -863,18 +870,24 @@ double precision pi,sum,factor1,factor2,cylm,cylmp,bigA,binom_func,fact,coef_pm double precision sgn, sgnp pi=dacos(-1.d0) +bigI=0.d0 if(mu.gt.0.and.m.gt.0)then sum=0.d0 factor1=dsqrt((2*lambda+1)*fact(lambda-iabs(mu))/(2.d0*pi*fact(lambda+iabs(mu)))) +if (factor1== 0.d0) return factor2=dsqrt((2*l+1)*fact(l-iabs(m))/(2.d0*pi*fact(l+iabs(m)))) +if (factor2== 0.d0) return sgn = 1.d0 do k=0,mu/2 do i=0,lambda-mu + if (coef_pm(lambda,i+mu) == 0.d0) cycle sgnp = 1.d0 do kp=0,m/2 do ip=0,l-m cylm=sgn*factor1*binom_func(mu,2*k)*fact(mu+i)/fact(i)*coef_pm(lambda,i+mu) + if (cylm == 0.d0) cycle cylmp=sgnp*factor2*binom_func(m,2*kp)*fact(m+ip)/fact(ip)*coef_pm(l,ip+m) + if (cylmp == 0.d0) cycle sum=sum+cylm*cylmp*bigA(mu-2*k+m-2*kp+k1,2*k+2*kp+k2,i+ip+k3) enddo sgnp = -sgnp @@ -888,12 +901,16 @@ endif if(mu.eq.0.and.m.eq.0)then factor1=dsqrt((2*lambda+1)/(4.d0*pi)) +if (factor1== 0.d0) return factor2=dsqrt((2*l+1)/(4.d0*pi)) +if (factor2== 0.d0) return sum=0.d0 do i=0,lambda do ip=0,l cylm=factor1*coef_pm(lambda,i) + if (cylm == 0.d0) cycle cylmp=factor2*coef_pm(l,ip) + if (cylmp == 0.d0) cycle sum=sum+cylm*cylmp*bigA(k1,k2,i+ip+k3) enddo enddo @@ -903,14 +920,18 @@ endif if(mu.eq.0.and.m.gt.0)then factor1=dsqrt((2*lambda+1)/(4.d0*pi)) +if (factor1== 0.d0) return factor2=dsqrt((2*l+1)*fact(l-iabs(m))/(2.d0*pi*fact(l+iabs(m)))) +if (factor2== 0.d0) return sum=0.d0 do i=0,lambda sgnp = 1.d0 do kp=0,m/2 do ip=0,l-m cylm=factor1*coef_pm(lambda,i) + if (cylm == 0.d0) cycle cylmp=sgnp*factor2*binom_func(m,2*kp)*fact(m+ip)/fact(ip)*coef_pm(l,ip+m) + if (cylmp == 0.d0) cycle sum=sum+cylm*cylmp*bigA(m-2*kp+k1,2*kp+k2,i+ip+k3) enddo sgnp = -sgnp @@ -923,13 +944,18 @@ endif if(mu.gt.0.and.m.eq.0)then sum=0.d0 factor1=dsqrt((2*lambda+1)*fact(lambda-iabs(mu))/(2.d0*pi*fact(lambda+iabs(mu)))) +if (factor1== 0.d0) return factor2=dsqrt((2*l+1)/(4.d0*pi)) +if (factor2== 0.d0) return sgn = 1.d0 do k=0,mu/2 do i=0,lambda-mu + if (coef_pm(lambda,i+mu) == 0.d0) cycle do ip=0,l cylm=sgn*factor1*binom_func(mu,2*k)*fact(mu+i)/fact(i)*coef_pm(lambda,i+mu) + if (cylm == 0.d0) cycle cylmp=factor2*coef_pm(l,ip) + if (cylmp == 0.d0) cycle sum=sum+cylm*cylmp*bigA(mu-2*k +k1,2*k +k2,i+ip +k3) enddo enddo @@ -943,16 +969,22 @@ if(mu.lt.0.and.m.lt.0)then mu=-mu m=-m factor1=dsqrt((2*lambda+1)*fact(lambda-iabs(mu))/(2.d0*pi*fact(lambda+iabs(mu)))) +if (factor1== 0.d0) return factor2=dsqrt((2*l+1)*fact(l-iabs(m))/(2.d0*pi*fact(l+iabs(m)))) +if (factor2== 0.d0) return sum=0.d0 sgn = 1.d0 do k=0,(mu-1)/2 do i=0,lambda-mu + if (coef_pm(lambda,i+mu) == 0.d0) cycle sgnp = 1.d0 do kp=0,(m-1)/2 do ip=0,l-m + if (coef_pm(l,ip+m) == 0.d0) cycle cylm=sgn*factor1*binom_func(mu,2*k+1)*fact(mu+i)/fact(i)*coef_pm(lambda,i+mu) + if (cylm == 0.d0) cycle cylmp=sgnp*factor2*binom_func(m,2*kp+1)*fact(m+ip)/fact(ip)*coef_pm(l,ip+m) + if (cylmp == 0.d0) cycle sum=sum+cylm*cylmp*bigA(mu-(2*k+1)+m-(2*kp+1)+k1,(2*k+1)+(2*kp+1)+k2,i+ip+k3) enddo sgnp = -sgnp @@ -969,14 +1001,18 @@ endif if(mu.eq.0.and.m.lt.0)then m=-m factor1=dsqrt((2*lambda+1)/(4.d0*pi)) +if (factor1 == 0.d0) return factor2=dsqrt((2*l+1)*fact(l-iabs(m))/(2.d0*pi*fact(l+iabs(m)))) +if (factor2 == 0.d0) return sum=0.d0 do i=0,lambda sgnp = 1.d0 do kp=0,(m-1)/2 do ip=0,l-m cylm=factor1*coef_pm(lambda,i) + if (cylm == 0.d0) cycle cylmp=sgnp*factor2*binom_func(m,2*kp+1)*fact(m+ip)/fact(ip)*coef_pm(l,ip+m) + if (cylmp == 0.d0) cycle sum=sum+cylm*cylmp*bigA(m-(2*kp+1)+k1,2*kp+1+k2,i+ip+k3) enddo sgnp = -sgnp @@ -991,13 +1027,17 @@ if(mu.lt.0.and.m.eq.0)then sum=0.d0 mu=-mu factor1=dsqrt((2*lambda+1)*fact(lambda-iabs(mu))/(2.d0*pi*fact(lambda+iabs(mu)))) +if (factor1== 0.d0) return factor2=dsqrt((2*l+1)/(4.d0*pi)) +if (factor2== 0.d0) return sgn = 1.d0 do k=0,(mu-1)/2 do i=0,lambda-mu do ip=0,l cylm=sgn*factor1*binom_func(mu,2*k+1)*fact(mu+i)/fact(i)*coef_pm(lambda,i+mu) + if (cylm == 0.d0) cycle cylmp=factor2*coef_pm(l,ip) + if (cylmp == 0.d0) cycle sum=sum+cylm*cylmp*bigA(mu-(2*k+1)+k1,2*k+1+k2,i+ip+k3) enddo enddo @@ -1011,16 +1051,22 @@ endif if(mu.gt.0.and.m.lt.0)then sum=0.d0 factor1=dsqrt((2*lambda+1)*fact(lambda-iabs(mu))/(2.d0*pi*fact(lambda+iabs(mu)))) +if (factor1== 0.d0) return factor2=dsqrt((2*l+1)*fact(l-iabs(m))/(2.d0*pi*fact(l+iabs(m)))) +if (factor2== 0.d0) return m=-m sgn=1.d0 do k=0,mu/2 do i=0,lambda-mu + if (coef_pm(lambda,i+mu) == 0.d0) cycle sgnp=1.d0 do kp=0,(m-1)/2 do ip=0,l-m + if (coef_pm(l,ip+m) == 0.d0) cycle cylm =sgn *factor1*binom_func(mu,2*k)*fact(mu+i)/fact(i)*coef_pm(lambda,i+mu) + if (cylm == 0.d0) cycle cylmp=sgnp*factor2*binom_func(m,2*kp+1)*fact(m+ip)/fact(ip)*coef_pm(l,ip+m) + if (cylmp == 0.d0) cycle sum=sum+cylm*cylmp*bigA(mu-2*k+m-(2*kp+1)+k1,2*k+2*kp+1+k2,i+ip+k3) enddo sgnp = -sgnp @@ -1036,16 +1082,22 @@ endif if(mu.lt.0.and.m.gt.0)then mu=-mu factor1=dsqrt((2*lambda+1)*fact(lambda-iabs(mu))/(2.d0*pi*fact(lambda+iabs(mu)))) +if (factor1== 0.d0) return factor2=dsqrt((2*l+1)*fact(l-iabs(m))/(2.d0*pi*fact(l+iabs(m)))) +if (factor2== 0.d0) return sum=0.d0 sgn = 1.d0 do k=0,(mu-1)/2 do i=0,lambda-mu + if (coef_pm(lambda,i+mu) == 0.d0) cycle sgnp = 1.d0 do kp=0,m/2 do ip=0,l-m + if (coef_pm(l,ip+m) == 0.d0) cycle cylm=sgn*factor1 *binom_func(mu,2*k+1)*fact(mu+i)/fact(i)*coef_pm(lambda,i+mu) + if (cylm == 0.d0) cycle cylmp=sgnp*factor2*binom_func(m,2*kp)*fact(m+ip)/fact(ip)*coef_pm(l,ip+m) + if (cylmp == 0.d0) cycle sum=sum+cylm*cylmp*bigA(mu-(2*k+1)+m-2*kp+k1,2*k+1+2*kp+k2,i+ip+k3) enddo sgnp = -sgnp @@ -1543,7 +1595,7 @@ end r=(i-1)*dr x1=delta1*r x2=delta2*r - sum=sum+dr*r**(n+2)*dexp(-cc*r**2)*bessel_mod(x1,lambda)*bessel_mod(x2,lambdap) + sum=sum+dr*r**(n+2)*dexp(-cc*r*r)*bessel_mod(x1,lambda)*bessel_mod(x2,lambdap) enddo bigR=sum*factor end @@ -1568,8 +1620,8 @@ end return endif if(n.eq.0)a=dsinh(x)/x - if(n.eq.1)a=(x*dcosh(x)-dsinh(x))/x**2 - if(n.ge.2)a=bessel_mod_recur(n-2,x)-(2*n-1)/x*bessel_mod_recur(n-1,x) + if(n.eq.1)a=(x*dcosh(x)-dsinh(x))/(x*x) + if(n.ge.2)a=bessel_mod_recur(n-2,x)-(n+n-1)/x*bessel_mod_recur(n-1,x) end double precision function bessel_mod_exp(n,x) @@ -1578,8 +1630,8 @@ end double precision x,coef,accu,fact,dble_fact accu=0.d0 do k=0,10 - coef=1.d0/fact(k)/dble_fact(2*(n+k)+1) - accu=accu+(x**2/2.d0)**k*coef + coef=1.d0/(fact(k)*dble_fact(2*(n+k)+1)) + accu=accu+(0.5d0*x*x)**k*coef enddo bessel_mod_exp=x**n*accu end From 7ef1cf6e67adaa56530cb9a95bdfb005cca52a2b Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 2 Oct 2016 23:03:52 +0200 Subject: [PATCH 154/216] Put ao_overlap back into ao_basis --- .../ao_overlap.irp.f | 19 +++++++++---------- src/Davidson/diagonalization_hs2.irp.f | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) rename src/{Integrals_Monoelec => AO_Basis}/ao_overlap.irp.f (91%) diff --git a/src/Integrals_Monoelec/ao_overlap.irp.f b/src/AO_Basis/ao_overlap.irp.f similarity index 91% rename from src/Integrals_Monoelec/ao_overlap.irp.f rename to src/AO_Basis/ao_overlap.irp.f index 0b603303..edf48b25 100644 --- a/src/Integrals_Monoelec/ao_overlap.irp.f +++ b/src/AO_Basis/ao_overlap.irp.f @@ -14,11 +14,10 @@ double precision :: alpha, beta, c double precision :: A_center(3), B_center(3) integer :: power_A(3), power_B(3) - if (read_ao_one_integrals) then - call ezfio_get_ao_basis_integral_overlap(ao_overlap(1:ao_num, 1:ao_num)) - call ezfio_set_ao_basis_integral_overlap(ao_overlap(1:ao_num, 1:ao_num)) - print *, 'AO overlap integrals read from disk' - else +! if (read_ao_one_integrals) then +! call ezfio_get_ao_basis_integral_overlap(ao_overlap(1:ao_num, 1:ao_num)) +! print *, 'AO overlap integrals read from disk' +! else dim1=100 !$OMP PARALLEL DO SCHEDULE(GUIDED) & !$OMP DEFAULT(NONE) & @@ -64,11 +63,11 @@ enddo enddo !$OMP END PARALLEL DO - endif - if (write_ao_one_integrals) then - call ezfio_set_ao_basis_integral_overlap(ao_overlap(1:ao_num, 1:ao_num)) - print *, 'AO overlap integrals written to disk' - endif +! endif +! if (write_ao_one_integrals) then +! call ezfio_set_ao_basis_integral_overlap(ao_overlap(1:ao_num, 1:ao_num)) +! print *, 'AO overlap integrals written to disk' +! endif END_PROVIDER diff --git a/src/Davidson/diagonalization_hs2.irp.f b/src/Davidson/diagonalization_hs2.irp.f index 769f6199..848e83ed 100644 --- a/src/Davidson/diagonalization_hs2.irp.f +++ b/src/Davidson/diagonalization_hs2.irp.f @@ -269,7 +269,7 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s if (s2_eig) then logical :: state_ok(N_st_diag*davidson_sze_max) do k=1,shift2 - state_ok(k) = (dabs(s2(k)-expected_s2) < 0.3d0) + state_ok(k) = (dabs(s2(k)-expected_s2) < 0.6d0) enddo do k=1,shift2 if (.not. state_ok(k)) then From 2a0a5f8b6f9b8e0e476e686b73ac05b07416abde Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 2 Oct 2016 23:12:17 +0200 Subject: [PATCH 155/216] Fixed assert:BANDON --- plugins/Selectors_full/selectors.irp.f | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/Selectors_full/selectors.irp.f b/plugins/Selectors_full/selectors.irp.f index 62f0aeaa..27036f33 100644 --- a/plugins/Selectors_full/selectors.irp.f +++ b/plugins/Selectors_full/selectors.irp.f @@ -14,7 +14,7 @@ BEGIN_PROVIDER [ integer, N_det_selectors] integer :: i double precision :: norm, norm_max call write_time(output_determinants) - N_det_selectors = N_det + N_det_selectors = N_det_generators if (threshold_generators < 1.d0) then norm = 0.d0 do i=1,N_det @@ -24,7 +24,7 @@ BEGIN_PROVIDER [ integer, N_det_selectors] exit endif enddo - N_det_selectors = max(N_det_selectors,1) + N_det_selectors = max(N_det_selectors,N_det_generators) endif call write_int(output_determinants,N_det_selectors,'Number of selectors') END_PROVIDER From 272482e8fa860fc6fd5d454aab6de6b2b7cd6c38 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 3 Oct 2016 10:42:47 +0200 Subject: [PATCH 156/216] miniserver when needed - untested --- src/Davidson/davidson_parallel.irp.f | 27 +++++++++++++++------------ src/Davidson/u0Hu0.irp.f | 8 +++++++- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 37bac8d2..0b4a84d8 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -22,7 +22,7 @@ subroutine davidson_process(block, N, idx, vt, st) vt = 0d0 st = 0d0 - N = N_det + N = dav_size ! N_det do i=1,N idx(i) = i end do @@ -56,8 +56,8 @@ subroutine davidson_process(block, N, idx, vt, st) ext = ext + popcnt(xor(sorted_i(ni), sorted_(ni,j,1))) end do if(ext <= 4) then - call i_h_j (psi_det(1,1,org_j),psi_det(1,1,org_i),n_int,hij) - call get_s2(psi_det(1,1,org_j),psi_det(1,1,org_i),n_int,s2) + call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) ! psi_det + call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) do istate=1,N_states vt (istate,org_i) = vt (istate,org_i) + hij*dav_ut(istate,org_j) vt (istate,org_j) = vt (istate,org_j) + hij*dav_ut(istate,org_i) @@ -100,6 +100,7 @@ subroutine davidson_init(zmq_to_qp_run_socket) integer(ZMQ_PTR), intent(out) :: zmq_to_qp_run_socket ! zmq_to_qp_run_socket + touch dav_size dav_det dav_ut call new_parallel_job(zmq_to_qp_run_socket,'davidson') end subroutine @@ -195,7 +196,7 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) allocate(vt(N_states, N_det)) allocate(st(N_states, N_det)) - call hobo_get() + !call hobo_get() do call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id, task) @@ -347,9 +348,9 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) call end_zmq_to_qp_run_socket(zmq_collector) call end_zmq_pull_socket(zmq_socket_pull) - call hobo_server_end() + call davidson_miniserver_end() else if(i==1) then - call hobo_server() + call davidson_miniserver_run() else call davidson_slave_inproc(i) endif @@ -359,7 +360,7 @@ end subroutine -subroutine hobo_server() +subroutine davidson_miniserver_run() use f77_zmq implicit none integer(ZMQ_PTR) context @@ -378,9 +379,9 @@ subroutine hobo_server() do rc = f77_zmq_recv(responder, buffer, 5, 0) if (buffer(1:rc) /= 'end') then - rc = f77_zmq_send (responder, N_det, 4, ZMQ_SNDMORE) - rc = f77_zmq_send (responder, psi_det, 16*N_int*N_det, ZMQ_SNDMORE) - rc = f77_zmq_send (responder, ut, 8*N_det*N_states, 0) + rc = f77_zmq_send (responder, dav_size, 4, ZMQ_SNDMORE) + rc = f77_zmq_send (responder, dav_det, 16*N_int*N_det, ZMQ_SNDMORE) + rc = f77_zmq_send (responder, dav_ut, 8*N_det*N_states, 0) else rc = f77_zmq_send (responder, "end", 3, 0) exit @@ -392,7 +393,7 @@ subroutine hobo_server() end subroutine -subroutine hobo_server_end() +subroutine davidson_miniserver_end() implicit none use f77_zmq @@ -414,7 +415,7 @@ subroutine hobo_server_end() end subroutine -subroutine hobo_get() +subroutine davidson_miniserver_get() implicit none use f77_zmq @@ -440,6 +441,8 @@ subroutine hobo_get() rc = f77_zmq_recv(requester, dav_ut, 8*dav_size*N_states, 0) rc = f77_zmq_close(requester) rc = f77_zmq_ctx_destroy(context) + + touch dav_det dav_ut end subroutine diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index f23c03bc..b4819067 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -227,6 +227,8 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) v_0 = 0.d0 s_0 = 0.d0 + if(n /= N_det) stop "n /= N_det" + do i=1,n do istate=1,N_st ut(istate,i) = u_0(i,istate) @@ -234,7 +236,11 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) enddo call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) - + + dav_size = n + dav_det = psi_det + dav_ut = ut + call davidson_init(handler) do sh=shortcut(0,1),1,-1 From 521c37add9ffd6f402b27c3cf8020395879c1bf6 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 3 Oct 2016 14:02:26 +0200 Subject: [PATCH 157/216] davidson_slave sparse output --- src/Davidson/davidson_parallel.irp.f | 85 +++++++++++++++++----------- src/Davidson/u0Hu0.irp.f | 9 ++- 2 files changed, 57 insertions(+), 37 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 0b4a84d8..9b5130bc 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -11,18 +11,19 @@ subroutine davidson_process(block, N, idx, vt, st) integer , intent(in) :: block integer , intent(inout) :: N - integer , intent(inout) :: idx(N_det) - double precision , intent(inout) :: vt(N_states, N_det) - double precision , intent(inout) :: st(N_states, N_det) + integer , intent(inout) :: idx(dav_size) + double precision , intent(inout) :: vt(N_states, dav_size) + double precision , intent(inout) :: st(N_states, dav_size) integer :: i, j, sh, sh2, exa, ext, org_i, org_j, istate, ni, endi integer(bit_kind) :: sorted_i(N_int) double precision :: s2, hij +! print *, "processing block", block, "/", shortcut_(0,1) vt = 0d0 st = 0d0 - N = dav_size ! N_det + N = dav_size do i=1,N idx(i) = i end do @@ -68,6 +69,19 @@ subroutine davidson_process(block, N, idx, vt, st) enddo enddo enddo + + N = 0 + do i=1, dav_size + if(vt(1, i) /= 0d0 .or. st(1, i) /= 0d0) then + N = N+1 + do istate=1,N_states + vt (istate,N) = vt (istate,i) + st (istate,N) = st (istate,i) + idx(N) = i + enddo + end if + end do +! print *, "done processing block", block, "/", shortcut_(0,1) end subroutine @@ -82,8 +96,8 @@ subroutine davidson_collect(block, N, idx, vt, st , v0, s0) integer , intent(in) :: idx(N) double precision , intent(in) :: vt(N_states, N) double precision , intent(in) :: st(N_states, N) - double precision , intent(inout) :: v0(N_det, N_states) - double precision , intent(inout) :: s0(N_det, N_states) + double precision , intent(inout) :: v0(dav_size, N_states) + double precision , intent(inout) :: s0(dav_size, N_states) integer :: i @@ -101,7 +115,7 @@ subroutine davidson_init(zmq_to_qp_run_socket) integer(ZMQ_PTR), intent(out) :: zmq_to_qp_run_socket ! zmq_to_qp_run_socket touch dav_size dav_det dav_ut - call new_parallel_job(zmq_to_qp_run_socket,'davidson') + call new_parallel_job(zmq_to_qp_run_socket,"davidson") end subroutine @@ -166,7 +180,8 @@ subroutine davidson_run_slave(thread,iproc) end if call davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) - +! print *, "done slavin'" + !call sleep(1) call disconnect_from_taskserver(zmq_to_qp_run_socket,zmq_socket_push,worker_id) call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) call end_zmq_push_socket(zmq_socket_push,thread) @@ -192,11 +207,10 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) double precision , allocatable :: st(:,:) - allocate(idx(N_det)) - allocate(vt(N_states, N_det)) - allocate(st(N_states, N_det)) + allocate(idx(dav_size)) + allocate(vt(N_states, dav_size)) + allocate(st(N_states, dav_size)) - !call hobo_get() do call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id, task) @@ -205,6 +219,7 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) call davidson_process(block,N, idx, vt, st) + ! reverse ? call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id) call davidson_push_results(zmq_socket_push, block, N, idx, vt, st, task_id) end do @@ -255,9 +270,9 @@ subroutine davidson_pull_results(zmq_socket_pull, block, N, idx, vt, st, task_id integer ,intent(out) :: task_id integer ,intent(out) :: block integer ,intent(out) :: N - integer ,intent(out) :: idx(N_det) - double precision ,intent(out) :: vt(N_states, N_det) - double precision ,intent(out) :: st(N_states, N_det) + integer ,intent(out) :: idx(dav_size) + double precision ,intent(out) :: vt(N_states, dav_size) + double precision ,intent(out) :: st(N_states, dav_size) integer :: rc @@ -266,7 +281,7 @@ subroutine davidson_pull_results(zmq_socket_pull, block, N, idx, vt, st, task_id rc = f77_zmq_recv( zmq_socket_pull, N, 4, 0) if(rc /= 4) stop "davidson_push_results failed to pull N" - + rc = f77_zmq_recv( zmq_socket_pull, idx, 4*N, 0) if(rc /= 4*N) stop "davidson_push_results failed to pull idx" @@ -289,8 +304,8 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) integer(ZMQ_PTR), intent(in) :: zmq_to_qp_run_socket integer(ZMQ_PTR), intent(in) :: zmq_socket_pull - double precision ,intent(inout) :: v0(N_det, N_states) - double precision ,intent(inout) :: s0(N_det, N_states) + double precision ,intent(inout) :: v0(dav_size, N_states) + double precision ,intent(inout) :: s0(dav_size, N_states) integer :: more, task_id @@ -300,20 +315,27 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) integer , allocatable :: idx(:) double precision , allocatable :: vt(:,:) double precision , allocatable :: st(:,:) + integer :: deleted + logical, allocatable :: done(:) + allocate(done(shortcut_(0,1))) + deleted = 0 + done = .false. - - allocate(idx(N_det)) - allocate(vt(N_states, N_det)) - allocate(st(N_states, N_det)) + allocate(idx(dav_size)) + allocate(vt(N_states, dav_size)) + allocate(st(N_states, dav_size)) more = 1 do while (more == 1) call davidson_pull_results(zmq_socket_pull, block, N, idx, vt, st, task_id) call davidson_collect(block, N, idx, vt, st , v0, s0) - +! done(block) = .true. call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more) + deleted += 1 +! print *, "DELETED", deleted, done end do +! print *, "done collector" end subroutine @@ -330,8 +352,8 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) integer :: i integer, external :: omp_get_thread_num - double precision , intent(inout) :: v0(N_det, N_states) - double precision , intent(inout) :: s0(N_det, N_states) + double precision , intent(inout) :: v0(dav_size, N_states) + double precision , intent(inout) :: s0(dav_size, N_states) call zmq_set_running(zmq_to_qp_run_socket) @@ -342,7 +364,7 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) PROVIDE nproc - !$OMP PARALLEL DEFAULT(shared) private(i) num_threads(nproc+1) + !$OMP PARALLEL DEFAULT(shared) private(i) num_threads(3) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NPROC !!!!! i = omp_get_thread_num() if (i==0) then call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) @@ -380,8 +402,8 @@ subroutine davidson_miniserver_run() rc = f77_zmq_recv(responder, buffer, 5, 0) if (buffer(1:rc) /= 'end') then rc = f77_zmq_send (responder, dav_size, 4, ZMQ_SNDMORE) - rc = f77_zmq_send (responder, dav_det, 16*N_int*N_det, ZMQ_SNDMORE) - rc = f77_zmq_send (responder, dav_ut, 8*N_det*N_states, 0) + rc = f77_zmq_send (responder, dav_det, 16*N_int*dav_size, ZMQ_SNDMORE) + rc = f77_zmq_send (responder, dav_ut, 8*dav_size*N_states, 0) else rc = f77_zmq_send (responder, "end", 3, 0) exit @@ -412,6 +434,7 @@ subroutine davidson_miniserver_end() rc = f77_zmq_recv(requester, buf, 3, 0) rc = f77_zmq_close(requester) rc = f77_zmq_ctx_destroy(context) +! print *, "closed miniserver" end subroutine @@ -439,6 +462,8 @@ subroutine davidson_miniserver_get() TOUCH dav_size rc = f77_zmq_recv(requester, dav_det, 16*N_int*dav_size, 0) rc = f77_zmq_recv(requester, dav_ut, 8*dav_size*N_states, 0) + TOUCH dav_det dav_ut + rc = f77_zmq_close(requester) rc = f77_zmq_ctx_destroy(context) @@ -455,10 +480,6 @@ BEGIN_PROVIDER [ double precision, dav_ut, (N_states, dav_size) ] END_PROVIDER -BEGIN_PROVIDER [ double precision, ut, (N_states, N_det) ] -END_PROVIDER - - BEGIN_PROVIDER [ integer, dav_size ] END_PROVIDER diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index b4819067..418ada51 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -44,7 +44,7 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) double precision :: hij double precision, allocatable :: vt(:,:) -! double precision, allocatable :: ut(:,:) + double precision, allocatable :: ut(:,:) integer :: i,j,k,l, jj,ii integer :: i0, j0 @@ -197,7 +197,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) double precision :: hij,s2 double precision, allocatable :: vt(:,:), st(:,:) - !double precision, allocatable :: ut(:,:) + double precision, allocatable :: ut(:,:) integer :: i,j,k,l, jj,ii integer :: i0, j0 @@ -222,7 +222,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) PROVIDE ref_bitmask_energy allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2)) - !allocate(ut(N_st_8,n)) + allocate(ut(N_st_8,n)) v_0 = 0.d0 s_0 = 0.d0 @@ -240,9 +240,8 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) dav_size = n dav_det = psi_det dav_ut = ut - + call davidson_init(handler) - do sh=shortcut(0,1),1,-1 call davidson_add_task(handler, sh) enddo From 74ffa71dc663bdc47e037346b8f88c1cb7f6f9b2 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 3 Oct 2016 14:30:13 +0200 Subject: [PATCH 158/216] fci_zmq with N_states > 1 --- plugins/Full_CI_ZMQ/selection_double.irp.f | 38 ++++++++++++---------- plugins/Full_CI_ZMQ/selection_single.irp.f | 26 ++++++++------- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection_double.irp.f b/plugins/Full_CI_ZMQ/selection_double.irp.f index 3e602c21..a98252b0 100644 --- a/plugins/Full_CI_ZMQ/selection_double.irp.f +++ b/plugins/Full_CI_ZMQ/selection_double.irp.f @@ -31,7 +31,6 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) - !call assert(psi_det_generators(1,1,i_generator) == psi_det_sorted(1,1,i_generator), "sorted selex") do s1=1,2 do s2=s1,2 sp = s1 @@ -43,7 +42,6 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p h1 = hole_list(i1,s1) h2 = hole_list(i2,s2) call apply_holes(psi_det_generators(1,1,i_generator), s1,h1,s2,h2, mask, ok, N_int) - !call assert(ok, irp_here) logical :: banned(mo_tot_num, mo_tot_num,2) logical :: bannedOrb(mo_tot_num, 2) @@ -88,14 +86,13 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d double precision, intent(inout) :: pt2(N_states) type(selection_buffer), intent(inout) :: buf logical :: ok - integer :: s1, s2, p1, p2, ib, j + integer :: s1, s2, p1, p2, ib, j, istate integer(bit_kind) :: mask(N_int, 2), det(N_int, 2) - double precision :: e_pert, delta_E, val, Hii + double precision :: e_pert, delta_E, val, Hii, max_e_pert double precision, external :: diag_H_mat_elem_fock logical, external :: detEq - - if(N_states > 1) stop "fill_buffer_double N_states > 1" + if(sp == 3) then s1 = 1 @@ -106,7 +103,7 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d end if call apply_holes(psi_det_generators(1,1,i_generator), s1, h1, s2, h2, mask, ok, N_int) - !call assert(ok, "sosoqs") + do p1=1,mo_tot_num if(bannedOrb(p1, s1)) cycle ib = 1 @@ -116,19 +113,24 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d if(banned(p1,p2)) cycle if(mat(1, p1, p2) == 0d0) cycle call apply_particles(mask, s1, p1, s2, p2, det, ok, N_int) - !call assert(ok, "ododod") + val = mat(1, p1, p2) Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),det,fock_diag_tmp,N_int) - - delta_E = E0(1) - Hii - if (delta_E < 0.d0) then - e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) - else - e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) - endif - pt2(1) += e_pert - if(dabs(e_pert) > buf%mini) then + max_e_pert = 0d0 + + do istate=1,N_states + delta_E = E0(istate) - Hii + if (delta_E < 0.d0) then + e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) + else + e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) + endif + pt2(istate) += e_pert + if(dabs(e_pert) > dabs(max_e_pert)) max_e_pert = e_pert + end do + + if(dabs(max_e_pert) > buf%mini) then ! do j=1,buf%cur-1 ! if(detEq(buf%det(1,1,j), det, N_int)) then ! print *, "tops" @@ -136,7 +138,7 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d ! stop ! end if ! end do - call add_to_selection_buffer(buf, det, e_pert) + call add_to_selection_buffer(buf, det, max_e_pert) end if end do end do diff --git a/plugins/Full_CI_ZMQ/selection_single.irp.f b/plugins/Full_CI_ZMQ/selection_single.irp.f index 77d985af..cdeee318 100644 --- a/plugins/Full_CI_ZMQ/selection_single.irp.f +++ b/plugins/Full_CI_ZMQ/selection_single.irp.f @@ -72,12 +72,11 @@ subroutine fill_buffer_single(i_generator, sp, h1, bannedOrb, fock_diag_tmp, E0, double precision, intent(inout) :: pt2(N_states) type(selection_buffer), intent(inout) :: buf logical :: ok - integer :: s1, s2, p1, p2, ib + integer :: s1, s2, p1, p2, ib, istate integer(bit_kind) :: mask(N_int, 2), det(N_int, 2) - double precision :: e_pert, delta_E, val, Hii + double precision :: e_pert, delta_E, val, Hii, max_e_pert double precision, external :: diag_H_mat_elem_fock - if(N_states > 1) stop "fill_buffer_single N_states > 1" call apply_hole(psi_det_generators(1,1,i_generator), sp, h1, mask, ok, N_int) @@ -88,15 +87,20 @@ subroutine fill_buffer_single(i_generator, sp, h1, bannedOrb, fock_diag_tmp, E0, val = vect(1, p1) Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),det,fock_diag_tmp,N_int) + max_e_pert = 0d0 - delta_E = E0(1) - Hii - if (delta_E < 0.d0) then - e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) - else - e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) - endif - pt2(1) += e_pert - if(dabs(e_pert) > buf%mini) call add_to_selection_buffer(buf, det, e_pert) + do istate=1,N_states + delta_E = E0(istate) - Hii + if (delta_E < 0.d0) then + e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) + else + e_pert = 0.5d0 * ( dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) + endif + pt2(istate) += e_pert + if(dabs(e_pert) > dabs(max_e_pert)) max_e_pert = e_pert + end do + + if(dabs(max_e_pert) > buf%mini) call add_to_selection_buffer(buf, det, max_e_pert) end do end subroutine From eaaf864f2852626d969dd7f3208605c92689c328 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 3 Oct 2016 14:48:43 +0200 Subject: [PATCH 159/216] incorrect nproc in davidson --- src/Davidson/davidson_parallel.irp.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 9b5130bc..2c1d7edc 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -364,7 +364,7 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) PROVIDE nproc - !$OMP PARALLEL DEFAULT(shared) private(i) num_threads(3) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NPROC !!!!! + !$OMP PARALLEL DEFAULT(shared) private(i) num_threads(nproc+2) i = omp_get_thread_num() if (i==0) then call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) From 77f34c67adef29cb69996f02ad32bed3e5c5f43d Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 4 Oct 2016 09:52:41 +0200 Subject: [PATCH 160/216] some cleaning --- plugins/Full_CI_ZMQ/selection.irp.f | 14 ------- plugins/Full_CI_ZMQ/selection_double.irp.f | 43 +--------------------- plugins/Full_CI_ZMQ/selection_single.irp.f | 14 ------- src/Davidson/davidson_parallel.irp.f | 2 - 4 files changed, 1 insertion(+), 72 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index ff32d56b..11b078f3 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -1,19 +1,5 @@ use bitmasks -! BEGIN_PROVIDER [ double precision, integral8, (mo_tot_num, mo_tot_num, mo_tot_num, mo_tot_num) ] -! use bitmasks -! implicit none -! -! integer :: h1, h2 -! -! integral8 = 0d0 -! do h1=1, mo_tot_num -! do h2=1, mo_tot_num -! call get_mo_bielec_integrals_ij(h1, h2 ,mo_tot_num,integral8(1,1,h1,h2),mo_integrals_map) -! end do -! end do -! END_PROVIDER - double precision function integral8(i,j,k,l) implicit none diff --git a/plugins/Full_CI_ZMQ/selection_double.irp.f b/plugins/Full_CI_ZMQ/selection_double.irp.f index a98252b0..a6f95329 100644 --- a/plugins/Full_CI_ZMQ/selection_double.irp.f +++ b/plugins/Full_CI_ZMQ/selection_double.irp.f @@ -131,13 +131,6 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d end do if(dabs(max_e_pert) > buf%mini) then -! do j=1,buf%cur-1 -! if(detEq(buf%det(1,1,j), det, N_int)) then -! print *, "tops" -! print *, i_generator, s1, s2, h1, h2,p1,p2 -! stop -! end if -! end do call add_to_selection_buffer(buf, det, max_e_pert) end if end do @@ -156,10 +149,8 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) integer :: i, j, k, l, h(0:2,2), p(0:4,2), nt integer(bit_kind) :: perMask(N_int, 2), mobMask(N_int, 2), negMask(N_int, 2) - logical :: bandon mat = 0d0 - bandon = .false. do i=1,N_int negMask(i,1) = not(mask(i,1)) @@ -187,14 +178,11 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) call bitstring_to_list(mobMask(1,1), p(1,1), p(0,1), N_int) call bitstring_to_list(mobMask(1,2), p(1,2), p(0,2), N_int) - !call assert(nt >= 2, irp_here//"qsd") if(i < i_gen) then if(nt == 4) call past_d2(banned, p, sp) if(nt == 3) call past_d1(bannedOrb, p) - !call assert(nt /= 2, "should have been discarded") else if(i == i_gen) then - bandon = .true. if(sp == 3) then banned(:,:,2) = transpose(banned(:,:,1)) else @@ -214,7 +202,6 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) end if end if end do - call assert(bandon, "BANDON") end subroutine @@ -243,13 +230,12 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) bant = 1 tip = p(0,1) * p(0,2) - !call assert(p(0,1) + p(0,2) == 4, irp_here//"df") + ma = sp if(p(0,1) > p(0,2)) ma = 1 if(p(0,1) < p(0,2)) ma = 2 mi = mod(ma, 2) + 1 - !print *, "d2 SPtip", SP, tip if(sp == 3) then if(ma == 2) bant = 2 @@ -266,7 +252,6 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) h2 = h(2, ma) hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, ma, ma, h1, p1, h2, p2) - !call debug_hij(hij, gen, mask, mi, ma, puti, putj) if(ma == 1) then mat(:, putj, puti) += coefs * hij else @@ -274,7 +259,6 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) end if end do else - !call assert(tip == 4, "df") do i = 1,2 do j = 1,2 puti = p(i, 1) @@ -287,7 +271,6 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) h2 = h(1,2) hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) - !call debug_hij(hij, gen, mask, 1, 2, puti, putj) mat(:, puti, putj) += coefs * hij end do end do @@ -308,7 +291,6 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) p1 = p(i1, ma) p2 = p(i2, ma) hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, ma, ma, h1, p1, h2, p2) - !call debug_hij(hij, gen, mask, ma, ma, puti, putj) mat(:, puti, putj) += coefs * hij end do end do @@ -316,7 +298,6 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) h1 = h(1, mi) h2 = h(1, ma) p1 = p(1, mi) - !call assert(ma == sp, "dldl") do i=1,3 puti = p(turn3(1,i), ma) putj = p(turn3(2,i), ma) @@ -324,11 +305,9 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) p2 = p(i, ma) hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, mi, ma, h1, p1, h2, p2) - !call debug_hij(hij, gen, mask, ma, ma, puti, putj) mat(:, min(puti, putj), max(puti, putj)) += coefs * hij end do else ! tip == 4 - !call assert(tip == 4, "qsdf") puti = p(1, sp) putj = p(2, sp) if(.not. banned(puti,putj,1)) then @@ -337,7 +316,6 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) h1 = h(1, mi) h2 = h(2, mi) hij = (integral8(p1, p2, h1, h2) - integral8(p2,p1, h1, h2)) * get_phase_bi(phasemask, mi, mi, h1, p1, h2, p2) - !call debug_hij(hij, gen, mask,ma,ma, puti, putj) mat(:, puti, putj) += coefs * hij end if end if @@ -359,7 +337,6 @@ subroutine debug_hij(hij, gen, mask, s1, s2, p1, p2) integer :: exc(0:2,2,2) call apply_particles(mask, s1, p1, s2, p2, det, ok, N_int) - !call assert(ok, "nokey") call i_H_j_phase_out(gen,det,N_int,hij_ref,phase_ref,exc,degree) if(hij /= hij_ref) then print *, hij, hij_ref @@ -368,8 +345,6 @@ subroutine debug_hij(hij, gen, mask, s1, s2, p1, p2) call debug_det(mask, N_int) stop end if - - ! print *, "fourar", hij, hij_ref,s1,s2 end function @@ -411,11 +386,9 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) mi = turn2(ma) bant = 1 - !print *, "d1 SP", sp, p(0,1)*p(0,2) if(sp == 3) then !move MA - !call assert(p(0,1)*p(0,2) == 2, "ddmmm") if(ma == 2) bant = 2 puti = p(1,mi) hfix = h(1,ma) @@ -426,13 +399,11 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) do putj=1, hfix-1 if(lbanned(putj, ma) .or. banned(putj, puti,bant)) cycle hij = (integral8(p1, p2, putj, hfix)-integral8(p2,p1,putj,hfix)) * get_phase_bi(phasemask, ma, ma, putj, p1, hfix, p2) - !call debug_hij(hij, gen, mask, mi, ma, puti, putj) tmp_row(1:N_states,putj) += hij * coefs(1:N_states) end do do putj=hfix+1, mo_tot_num if(lbanned(putj, ma) .or. banned(putj, puti,bant)) cycle hij = (integral8(p1, p2, hfix, putj)-integral8(p2,p1,hfix,putj)) * get_phase_bi(phasemask, ma, ma, hfix, p1, putj, p2) - !call debug_hij(hij, gen, mask, mi, ma, puti, putj) tmp_row(1:N_states,putj) += hij * coefs(1:N_states) end do @@ -456,11 +427,9 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) tmp_row(:,puti) += hij * coefs end if - !call debug_hij(hij, gen, mask, mi, ma, puti, putj) putj = p2 if(.not. banned(putj,puti,bant)) then hij = integral8(p1,pfix,hfix,puti) * get_phase_bi(phasemask, ma, mi, hfix, p1, puti, pfix) - !call debug_hij(hij, gen, mask, mi, ma, puti, putj) tmp_row2(:,puti) += hij * coefs end if end do @@ -483,13 +452,11 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) do putj=1,hfix-1 if(lbanned(putj,ma) .or. banned(puti,putj,1)) cycle hij = (integral8(p1, p2, putj, hfix)-integral8(p2,p1,putj,hfix)) * get_phase_bi(phasemask, ma, ma, putj, p1, hfix, p2) - !call debug_hij(hij, gen, mask, ma, ma, puti, putj) tmp_row(:,putj) += hij * coefs end do do putj=hfix+1,mo_tot_num if(lbanned(putj,ma) .or. banned(puti,putj,1)) cycle hij = (integral8(p1, p2, hfix, putj)-integral8(p2,p1,hfix,putj)) * get_phase_bi(phasemask, ma, ma, hfix, p1, putj, p2) - !call debug_hij(hij, gen, mask, ma, ma, puti, putj) tmp_row(:,putj) += hij * coefs end do @@ -497,7 +464,6 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) mat(:, puti, puti:) += tmp_row(:,puti:) end do else - !call assert(sp == ma, "sp == ma") hfix = h(1,mi) pfix = p(1,mi) p1 = p(1,ma) @@ -509,14 +475,12 @@ subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) putj = p2 if(.not. banned(puti,putj,1)) then hij = integral8(pfix, p1, hfix, puti) * get_phase_bi(phasemask, mi, ma, hfix, pfix, puti, p1) - !call debug_hij(hij, gen, mask, ma, ma, putj, puti) tmp_row(:,puti) += hij * coefs end if putj = p1 if(.not. banned(puti,putj,1)) then hij = integral8(pfix, p2, hfix, puti) * get_phase_bi(phasemask, mi, ma, hfix, pfix, puti, p2) - !call debug_hij(hij, gen, mask, ma, ma, putj, puti) tmp_row2(:,puti) += hij * coefs end if end do @@ -585,13 +549,11 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) if(banned(p1, p2, bant)) cycle ! rentable? if(p1 == h1 .or. p2 == h2) then call apply_particles(mask, 1,p1,2,p2, det, ok, N_int) - !call assert(ok, "zsdq") call i_h_j(gen, det, N_int, hij) mat(:, p1, p2) += coefs(:) * hij else hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) phase = get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) - !call debug_hij(hij, gen, mask, 1, 2, p1, p2) mat(:, p1, p2) += coefs(:) * hij end if end do @@ -611,7 +573,6 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) else hij = (integral8(p1, p2, puti, putj) - integral8(p2, p1, puti, putj))* get_phase_bi(phasemask, sp, sp, puti, p1 , putj, p2) mat(:, puti, putj) += coefs(:) * hij - !call debug_hij(hij, gen, mask, sp, sp, puti, putj) end if end do end do @@ -699,8 +660,6 @@ subroutine spot_isinwf(mask, det, i_gen, N, banned, fullMatch) call bitstring_to_list(myMask(1,1), list(1), na, N_int) call bitstring_to_list(myMask(1,2), list(na+1), nb, N_int) - !call assert(na + nb == 2, "oyo") - !call assert(na == 1 .or. list(1) < list(2), "sqdsmmmm") banned(list(1), list(2)) = .true. end do genl end subroutine diff --git a/plugins/Full_CI_ZMQ/selection_single.irp.f b/plugins/Full_CI_ZMQ/selection_single.irp.f index cdeee318..4b9f3f36 100644 --- a/plugins/Full_CI_ZMQ/selection_single.irp.f +++ b/plugins/Full_CI_ZMQ/selection_single.irp.f @@ -43,7 +43,6 @@ subroutine select_singles(i_gen,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf do i=1, N_holes(sp) h1 = hole_list(i,sp) call apply_hole(psi_det_generators(1,1,i_gen), sp, h1, mask, ok, N_int) - !call assert(ok, irp_here) bannedOrb = .true. do j=1,N_particles(sp) bannedOrb(particle_list(j, sp)) = .false. @@ -183,7 +182,6 @@ subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) p2 = p(turn3_2(2,i), sp) hij = integral8(p1, p2, h1, h2) - integral8(p2, p1, h1, h2) hij *= get_phase_bi(phasemask, sp, sp, h1, p1, h2, p2) - !call debug_hij_mo(hij, gen, mask, sp, puti) vect(:, puti) += hij * coefs end do else if(h(0,sp) == 1) then @@ -197,7 +195,6 @@ subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) pmob = p(turn2(j), sp) hij = integral8(pfix, pmob, hfix, hmob) hij *= get_phase_bi(phasemask, sp, sfix, hmob, pmob, hfix, pfix) - !call debug_hij_mo(hij, gen, mask, sp, puti) vect(:, puti) += hij * coefs end do else @@ -210,7 +207,6 @@ subroutine get_m2(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) h2 = h(2,sfix) hij = (integral8(p1,p2,h1,h2) - integral8(p2,p1,h1,h2)) hij *= get_phase_bi(phasemask, sfix, sfix, h1, p1, h2, p2) - !call debug_hij_mo(hij, gen, mask, sp, puti) vect(:, puti) += hij * coefs end if end if @@ -252,19 +248,16 @@ subroutine get_m1(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) if(lbanned(i)) cycle hij = (integral8(p1, p2, i, hole) - integral8(p2, p1, i, hole)) hij *= get_phase_bi(phasemask, sp, sp, i, p1, hole, p2) - !call debug_hij_mo(hij, gen, mask, sp, i) vect(:,i) += hij * coefs end do do i=hole+1,mo_tot_num if(lbanned(i)) cycle hij = (integral8(p1, p2, hole, i) - integral8(p2, p1, hole, i)) hij *= get_phase_bi(phasemask, sp, sp, hole, p1, i, p2) - !call debug_hij_mo(hij, gen, mask, sp, i) vect(:,i) += hij * coefs end do call apply_particle(mask, sp, p2, det, ok, N_int) - !call assert(ok, "OKE223") call i_h_j(gen, det, N_int, hij) vect(:, p2) += hij * coefs else @@ -273,17 +266,13 @@ subroutine get_m1(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) if(lbanned(i)) cycle hij = integral8(p1, p2, i, hole) hij *= get_phase_bi(phasemask, sp, sh, i, p1, hole, p2) - !call debug_hij_mo(hij, gen, mask, sp, i) vect(:,i) += hij * coefs end do end if call apply_particle(mask, sp, p1, det, ok, N_int) - !call assert(ok, "OKQQE2") call i_h_j(gen, det, N_int, hij) vect(:, p1) += hij * coefs - - !print *, "endouille" end subroutine @@ -307,7 +296,6 @@ subroutine get_m0(gen, phasemask, bannedOrb, vect, mask, h, p, sp, coefs) do i=1,mo_tot_num if(lbanned(i)) cycle call apply_particle(mask, sp, i, det, ok, N_int) - !call assert(ok, "qsdo") call i_h_j(gen, det, N_int, hij) vect(:, i) += hij * coefs end do @@ -379,8 +367,6 @@ subroutine debug_hij_mo(hij, gen, mask, s1, p1) logical, external :: detEq call apply_particle(mask, s1, p1, det, ok, N_int) - !call assert(ok, "nokey_mo") - !call assert(.not. detEq(det, gen, N_int), "Hii ...") call i_H_j_phase_out(gen,det,N_int,hij_ref,phase_ref,exc,degree) if(hij /= hij_ref) then print *, hij, hij_ref diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 2c1d7edc..00c6f9d9 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -19,7 +19,6 @@ subroutine davidson_process(block, N, idx, vt, st) integer(bit_kind) :: sorted_i(N_int) double precision :: s2, hij -! print *, "processing block", block, "/", shortcut_(0,1) vt = 0d0 st = 0d0 @@ -81,7 +80,6 @@ subroutine davidson_process(block, N, idx, vt, st) enddo end if end do -! print *, "done processing block", block, "/", shortcut_(0,1) end subroutine From d8ac4af89d5b09a498e1bf8dd9ad47f88e88af21 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 4 Oct 2016 10:02:07 +0200 Subject: [PATCH 161/216] removed disconnect messages --- src/Integrals_Monoelec/pseudopot.f90 | 7 ++++--- src/ZMQ/utils.irp.f | 27 +++------------------------ 2 files changed, 7 insertions(+), 27 deletions(-) diff --git a/src/Integrals_Monoelec/pseudopot.f90 b/src/Integrals_Monoelec/pseudopot.f90 index 725aa8c7..12f0192e 100644 --- a/src/Integrals_Monoelec/pseudopot.f90 +++ b/src/Integrals_Monoelec/pseudopot.f90 @@ -1860,7 +1860,7 @@ double precision function int_prod_bessel(l,gam,n,m,a,b,arg) double precision :: s_q_0, s_q_k, s_0_0, a_over_b_square double precision :: int_prod_bessel_loc double precision :: inverses(0:300) - double precision :: two_qkmp1, qk + double precision :: two_qkmp1, qk, mk, nk logical done @@ -1908,6 +1908,7 @@ double precision function int_prod_bessel(l,gam,n,m,a,b,arg) s_q_0 = s_0_0 + mk = dble(m) ! Loop over q for the convergence of the sequence do while (.not.done) @@ -1919,10 +1920,10 @@ double precision function int_prod_bessel(l,gam,n,m,a,b,arg) stop 'pseudopot.f90 : q > 300' endif - two_qkmp1 = dble(2*(q+m)+1) qk = dble(q) + two_qkmp1 = 2.d0*(qk+mk)+1.d0 do k=0,q-1 - s_q_k = ( two_qkmp1*qk*inverses(k) ) * s_q_k + s_q_k = two_qkmp1*qk*inverses(k)*s_q_k sum=sum+s_q_k two_qkmp1 = two_qkmp1-2.d0 qk = qk-1.d0 diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index e5a9f8ef..d7dd8002 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -473,26 +473,11 @@ subroutine end_zmq_push_socket(zmq_socket_push,thread) integer :: rc character*(8), external :: zmq_port - if (thread == 1) then - rc = f77_zmq_disconnect(zmq_socket_push,zmq_socket_push_inproc_address) -! if (rc /= 0) then -! print *, 'f77_zmq_disconnect(zmq_socket_push,zmq_socket_push_inproc_address)' -! stop 'error' -! endif - else - rc = f77_zmq_disconnect(zmq_socket_push,zmq_socket_push_tcp_address) - if (rc /= 0) then - print *, 'f77_zmq_disconnect(zmq_socket_push,zmq_socket_push_tcp_address)' - stop 'error' - endif + rc = f77_zmq_setsockopt(zmq_socket_push,ZMQ_LINGER,300000,4) + if (rc /= 0) then + stop 'Unable to set ZMQ_LINGER on push socket' endif - -! rc = f77_zmq_setsockopt(zmq_socket_push,ZMQ_LINGER,20000,4) -! if (rc /= 0) then -! stop 'Unable to set ZMQ_LINGER on push socket' -! endif - rc = f77_zmq_close(zmq_socket_push) if (rc /= 0) then print *, 'f77_zmq_close(zmq_socket_push)' @@ -814,12 +799,6 @@ subroutine end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) character*(8), external :: zmq_port integer :: rc - rc = f77_zmq_disconnect(zmq_to_qp_run_socket, trim(qp_run_address)//':'//trim(zmq_port(0))) -! if (rc /= 0) then -! print *, 'f77_zmq_disconnect(zmq_to_qp_run_socket, trim(qp_run_address)//'':''//trim(zmq_port(0)))' -! stop 'error' -! endif - rc = f77_zmq_setsockopt(zmq_to_qp_run_socket,ZMQ_LINGER,1000,4) if (rc /= 0) then stop 'Unable to set ZMQ_LINGER on zmq_to_qp_run_socket' From ebc1707235490deb29cbe3a879a9474ff53f7591 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 4 Oct 2016 10:05:15 +0200 Subject: [PATCH 162/216] forgot to add davidson_slave --- src/Davidson/davidson_slave.irp.f | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/Davidson/davidson_slave.irp.f diff --git a/src/Davidson/davidson_slave.irp.f b/src/Davidson/davidson_slave.irp.f new file mode 100644 index 00000000..15830b1d --- /dev/null +++ b/src/Davidson/davidson_slave.irp.f @@ -0,0 +1,40 @@ +program davidson_slave + use f77_zmq + implicit none + + + integer(ZMQ_PTR), external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + double precision :: energy(N_states_diag) + character*(64) :: state + +! call provide_everything + call switch_qp_run_to_master + + zmq_context = f77_zmq_ctx_new () + zmq_state = 'davidson' + state = 'Waiting' + + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() + + do + call wait_for_state(zmq_state,state) + if(trim(state) /= "davidson") exit + !print *, 'Getting wave function' + !call zmq_get_psi(zmq_to_qp_run_socket,1,energy,N_states_diag) + call davidson_miniserver_get() + + integer :: rc, i + + print *, 'Davidson slave running' + + !$OMP PARALLEL PRIVATE(i) + i = omp_get_thread_num() + call davidson_slave_tcp(i) + !$OMP END PARALLEL + end do +end + +! subroutine provide_everything +! PROVIDE mo_bielec_integrals_in_map psi_det_sorted_bit N_states zmq_context +! end subroutine From b49085733ae555d7eaa6e3e1c2221b60cb4d024d Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 4 Oct 2016 11:30:49 +0200 Subject: [PATCH 163/216] bug with fci_zmq with N_states > 1 --- plugins/Full_CI_ZMQ/selection_double.irp.f | 2 +- plugins/Full_CI_ZMQ/selection_single.irp.f | 3 ++- src/Davidson/davidson_parallel.irp.f | 3 --- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection_double.irp.f b/plugins/Full_CI_ZMQ/selection_double.irp.f index a6f95329..18aeecfe 100644 --- a/plugins/Full_CI_ZMQ/selection_double.irp.f +++ b/plugins/Full_CI_ZMQ/selection_double.irp.f @@ -114,13 +114,13 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d if(mat(1, p1, p2) == 0d0) cycle call apply_particles(mask, s1, p1, s2, p2, det, ok, N_int) - val = mat(1, p1, p2) Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),det,fock_diag_tmp,N_int) max_e_pert = 0d0 do istate=1,N_states delta_E = E0(istate) - Hii + val = mat(istate, p1, p2) if (delta_E < 0.d0) then e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) else diff --git a/plugins/Full_CI_ZMQ/selection_single.irp.f b/plugins/Full_CI_ZMQ/selection_single.irp.f index 4b9f3f36..8ec4df68 100644 --- a/plugins/Full_CI_ZMQ/selection_single.irp.f +++ b/plugins/Full_CI_ZMQ/selection_single.irp.f @@ -83,12 +83,13 @@ subroutine fill_buffer_single(i_generator, sp, h1, bannedOrb, fock_diag_tmp, E0, if(bannedOrb(p1)) cycle if(vect(1, p1) == 0d0) cycle call apply_particle(mask, sp, p1, det, ok, N_int) - val = vect(1, p1) + Hii = diag_H_mat_elem_fock(psi_det_generators(1,1,i_generator),det,fock_diag_tmp,N_int) max_e_pert = 0d0 do istate=1,N_states + val = vect(istate, p1) delta_E = E0(istate) - Hii if (delta_E < 0.d0) then e_pert = 0.5d0 * (-dsqrt(delta_E * delta_E + 4.d0 * val * val) - delta_E) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 00c6f9d9..93a387bc 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -444,9 +444,6 @@ subroutine davidson_miniserver_get() integer(ZMQ_PTR) requester character*(64) address character*(20) buffer -! integer(8), intent(inout) :: det(N_int,2,*) -! double precision, intent(inout) :: u_0(*) -! integer,intent(out) :: nd integer rc address = trim(qp_run_address)//':11223' From 71c84f78f11131e5894a4c376cc844a3bce95f4a Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 4 Oct 2016 15:08:13 +0200 Subject: [PATCH 164/216] cleaning + microlisted splash_pq --- plugins/Full_CI_ZMQ/selection.irp.f | 27 ----- plugins/Full_CI_ZMQ/selection_double.irp.f | 135 ++++++++++++--------- plugins/Full_CI_ZMQ/selection_single.irp.f | 27 ----- 3 files changed, 80 insertions(+), 109 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection.irp.f b/plugins/Full_CI_ZMQ/selection.irp.f index 11b078f3..a0209cc5 100644 --- a/plugins/Full_CI_ZMQ/selection.irp.f +++ b/plugins/Full_CI_ZMQ/selection.irp.f @@ -42,14 +42,12 @@ subroutine get_mask_phase(det, phasemask) integer :: s, ni, i logical :: change -! phasemask = 0_8 phasemask = 0_1 do s=1,2 change = .false. do ni=1,N_int do i=0,bit_kind_size-1 if(BTEST(det(ni, s), i)) change = .not. change -! if(change) phasemask(ni, s) = ibset(phasemask(ni, s), i) if(change) phasemask((ni-1)*bit_kind_size + i + 1, s) = 1_1 end do end do @@ -86,21 +84,6 @@ subroutine select_connected(i_generator,E0,pt2,b) end subroutine -subroutine spot_occupied(mask, bannedOrb) - use bitmasks - implicit none - - integer(bit_kind),intent(in) :: mask(N_int) - logical, intent(inout) :: bannedOrb(mo_tot_num) - integer :: i, ne, list(mo_tot_num) - - call bitstring_to_list(mask, list, ne, N_int) - do i=1, ne - bannedOrb(list(i)) = .true. - end do -end subroutine - - double precision function get_phase_bi(phasemask, s1, s2, h1, p1, h2, p2) use bitmasks implicit none @@ -111,16 +94,6 @@ double precision function get_phase_bi(phasemask, s1, s2, h1, p1, h2, p2) integer(1) :: np double precision, parameter :: res(0:1) = (/1d0, -1d0/) -! call assert(s1 /= s2 .or. (h1 <= h2 .and. p1 <= p2), irp_here) -! np = 0 -! change = btest(phasemask(1+ishft(h1, -6), s1), iand(h1-1, 63)) -! change = xor(change, btest(phasemask(1+ishft(p1, -6), s1), iand(p1-1, 63))) -! if(xor(change, p1 < h1)) np = 1 -! -! change = btest(phasemask(1+ishft(h2, -6), s2), iand(h2-1, 63)) -! change = xor(change, btest(phasemask(1+ishft(p2, -6), s2), iand(p2-1, 63))) -! if(xor(change, p2 < h2)) np = np + 1 - np = phasemask(h1,s1) + phasemask(p1,s1) + phasemask(h2,s2) + phasemask(p2,s2) if(p1 < h1) np = np + 1_1 if(p2 < h2) np = np + 1_1 diff --git a/plugins/Full_CI_ZMQ/selection_double.irp.f b/plugins/Full_CI_ZMQ/selection_double.irp.f index 18aeecfe..f5c4abd8 100644 --- a/plugins/Full_CI_ZMQ/selection_double.irp.f +++ b/plugins/Full_CI_ZMQ/selection_double.irp.f @@ -12,10 +12,14 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p type(selection_buffer), intent(inout) :: buf double precision :: mat(N_states, mo_tot_num, mo_tot_num) - integer :: h1,h2,s1,s2,s3,i1,i2,ib,sp,k,i - integer(bit_kind) :: hole(N_int,2), particle(N_int,2), mask(N_int, 2) + integer :: h1,h2,s1,s2,s3,i1,i2,ib,sp,k,i,j,nt,ii + integer(bit_kind) :: hole(N_int,2), particle(N_int,2), mask(N_int, 2), pmask(N_int, 2) logical :: fullMatch, ok + integer(bit_kind) :: mobMask(N_int, 2), negMask(N_int, 2) + integer :: preinteresting(0:N_det_selectors), interesting(0:N_det_selectors) + integer(bit_kind) :: minilist(N_int, 2, N_det_selectors) + do k=1,N_int hole (k,1) = iand(psi_det_generators(k,1,i_generator), hole_mask(k,1)) hole (k,2) = iand(psi_det_generators(k,2,i_generator), hole_mask(k,2)) @@ -30,25 +34,72 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call bitstring_to_list_ab(hole , hole_list , N_holes , N_int) call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) + + do i=1,N_int + negMask(i,1) = not(psi_det_generators(i,1,i_generator)) + negMask(i,2) = not(psi_det_generators(i,2,i_generator)) + end do + + preinteresting(0) = 0 + do i=1,N_det_selectors + nt = 0 + do j=1,N_int + mobMask(j,1) = iand(negMask(j,1), psi_det_sorted(j,1,i)) + mobMask(j,2) = iand(negMask(j,2), psi_det_sorted(j,2,i)) + nt += popcnt(mobMask(j, 1)) + popcnt(mobMask(j, 2)) + end do + if(nt <= 4) then + preinteresting(0) += 1 + preinteresting(preinteresting(0)) = i + end if + end do + + do s1=1,2 do s2=s1,2 sp = s1 if(s1 /= s2) sp = 3 do i1=N_holes(s1),1,-1 ! Generate low excitations first + h1 = hole_list(i1,s1) + call apply_hole(psi_det_generators(1,1,i_generator), s1,h1, pmask, ok, N_int) + + + do i=1,N_int + negMask(i,1) = not(pmask(i,1)) + negMask(i,2) = not(pmask(i,2)) + end do + + interesting(0) = 0 + do ii=1,preinteresting(0) + i = preinteresting(ii) + nt = 0 + do j=1,N_int + mobMask(j,1) = iand(negMask(j,1), psi_det_sorted(j,1,i)) + mobMask(j,2) = iand(negMask(j,2), psi_det_sorted(j,2,i)) + nt += popcnt(mobMask(j, 1)) + popcnt(mobMask(j, 2)) + end do + + if(nt <= 4) then + interesting(0) += 1 + interesting(interesting(0)) = i + minilist(:,:,interesting(0)) = psi_det_sorted(:,:,i) + end if + end do ib = 1 if(s1 == s2) ib = i1+1 do i2=N_holes(s2),ib,-1 ! Generate low excitations first - h1 = hole_list(i1,s1) + h2 = hole_list(i2,s2) - call apply_holes(psi_det_generators(1,1,i_generator), s1,h1,s2,h2, mask, ok, N_int) + call apply_hole(pmask, s2,h2, mask, ok, N_int) +! call apply_holes(psi_det_generators(1,1,i_generator), s1,h1,s2,h2, mask, ok, N_int) logical :: banned(mo_tot_num, mo_tot_num,2) logical :: bannedOrb(mo_tot_num, 2) banned = .false. - bannedOrb(h1, s1) = .true. - bannedOrb(h2, s2) = .true. + call spot_isinwf(mask, psi_det_sorted, i_generator, N_det, banned, fullMatch) + if(fullMatch) cycle bannedOrb(1:mo_tot_num, 1:2) = .true. do s3=1,2 @@ -56,15 +107,10 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p bannedOrb(particle_list(i,s3), s3) = .false. enddo enddo - - - call spot_isinwf(mask, psi_det_sorted, i_generator, N_det, banned, fullMatch) - if(fullMatch) cycle - if(sp /= 2) call spot_occupied(mask(1,1), bannedOrb(1,1)) - if(sp /= 1) call spot_occupied(mask(1,2), bannedOrb(1,2)) - + mat = 0d0 - call splash_pq(mask, sp, psi_det_sorted, i_generator, N_det_selectors, bannedOrb, banned, mat) +! call splash_pq(mask, sp, psi_det_sorted, i_generator, N_det_selectors, bannedOrb, banned, mat, interesting) + call splash_pq(mask, sp, minilist, i_generator, interesting(0), bannedOrb, banned, mat, interesting) call fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_diag_tmp, E0, pt2, mat, buf) enddo enddo @@ -138,18 +184,22 @@ subroutine fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_d end subroutine -subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) +subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat, interesting) use bitmasks implicit none - + + integer, intent(in) :: interesting(0:N_sel) + integer(bit_kind),intent(in) :: mask(N_int, 2), det(N_int, 2, N_sel) integer, intent(in) :: sp, i_gen, N_sel logical, intent(inout) :: bannedOrb(mo_tot_num, 2), banned(mo_tot_num, mo_tot_num, 2) double precision, intent(inout) :: mat(N_states, mo_tot_num, mo_tot_num) - integer :: i, j, k, l, h(0:2,2), p(0:4,2), nt + integer :: i, ii, j, k, l, h(0:2,2), p(0:4,2), nt integer(bit_kind) :: perMask(N_int, 2), mobMask(N_int, 2), negMask(N_int, 2) - +! logical :: bandon +! +! bandon = .false. mat = 0d0 do i=1,N_int @@ -157,7 +207,9 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) negMask(i,2) = not(mask(i,2)) end do - do i=1, N_sel + do i=1, N_sel ! interesting(0) + !i = interesting(ii) + nt = 0 do j=1,N_int mobMask(j,1) = iand(negMask(j,1), det(j,1,i)) @@ -166,7 +218,7 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) end do if(nt > 4) cycle - + do j=1,N_int perMask(j,1) = iand(mask(j,1), not(det(j,1,i))) perMask(j,2) = iand(mask(j,2), not(det(j,2,i))) @@ -178,11 +230,12 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) call bitstring_to_list(mobMask(1,1), p(1,1), p(0,1), N_int) call bitstring_to_list(mobMask(1,2), p(1,2), p(0,2), N_int) - if(i < i_gen) then + if(interesting(i) < i_gen) then if(nt == 4) call past_d2(banned, p, sp) if(nt == 3) call past_d1(bannedOrb, p) else - if(i == i_gen) then + if(interesting(i) == i_gen) then +! bandon = .true. if(sp == 3) then banned(:,:,2) = transpose(banned(:,:,1)) else @@ -194,11 +247,11 @@ subroutine splash_pq(mask, sp, det, i_gen, N_sel, bannedOrb, banned, mat) end if end if if(nt == 4) then - call get_d2(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + call get_d2(det(1,1,i), psi_phasemask(1,1,interesting(i)), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, interesting(i))) else if(nt == 3) then - call get_d1(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + call get_d1(det(1,1,i), psi_phasemask(1,1,interesting(i)), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, interesting(i))) else - call get_d0(det(1,1,i), psi_phasemask(1,1,i), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, i)) + call get_d0(det(1,1,i), psi_phasemask(1,1,interesting(i)), bannedOrb, banned, mat, mask, h, p, sp, psi_selectors_coef_transp(1, interesting(i))) end if end if end do @@ -323,31 +376,6 @@ subroutine get_d2(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) end subroutine -subroutine debug_hij(hij, gen, mask, s1, s2, p1, p2) - use bitmasks - implicit none - - integer(bit_kind), intent(in) :: gen(N_int,2), mask(N_int,2) - double precision, intent(in) :: hij - integer, intent(in) :: s1, s2, p1, p2 - integer(bit_kind) :: det(N_int,2) - double precision :: hij_ref, phase_ref - logical :: ok - integer :: degree - integer :: exc(0:2,2,2) - - call apply_particles(mask, s1, p1, s2, p2, det, ok, N_int) - call i_H_j_phase_out(gen,det,N_int,hij_ref,phase_ref,exc,degree) - if(hij /= hij_ref) then - print *, hij, hij_ref - print *, s1, s2, p1, p2 - call debug_det(gen, N_int) - call debug_det(mask, N_int) - stop - end if -end function - - subroutine get_d1(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) use bitmasks implicit none @@ -537,7 +565,6 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) integer :: bant bant = 1 - !print *, "d0 SP", sp if(sp == 3) then ! AB h1 = p(1,1) @@ -550,12 +577,11 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) if(p1 == h1 .or. p2 == h2) then call apply_particles(mask, 1,p1,2,p2, det, ok, N_int) call i_h_j(gen, det, N_int, hij) - mat(:, p1, p2) += coefs(:) * hij else hij = integral8(p1, p2, h1, h2) * get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) phase = get_phase_bi(phasemask, 1, 2, h1, p1, h2, p2) - mat(:, p1, p2) += coefs(:) * hij end if + mat(:, p1, p2) += coefs(:) * hij end do end do else ! AA BB @@ -569,11 +595,10 @@ subroutine get_d0(gen, phasemask, bannedOrb, banned, mat, mask, h, p, sp, coefs) if(puti == p1 .or. putj == p2 .or. puti == p2 .or. putj == p1) then call apply_particles(mask, sp,puti,sp,putj, det, ok, N_int) call i_h_j(gen, det, N_int, hij) - mat(:, puti, putj) += coefs(:) * hij else hij = (integral8(p1, p2, puti, putj) - integral8(p2, p1, puti, putj))* get_phase_bi(phasemask, sp, sp, puti, p1 , putj, p2) - mat(:, puti, putj) += coefs(:) * hij end if + mat(:, puti, putj) += coefs(:) * hij end do end do end if diff --git a/plugins/Full_CI_ZMQ/selection_single.irp.f b/plugins/Full_CI_ZMQ/selection_single.irp.f index 8ec4df68..f107db11 100644 --- a/plugins/Full_CI_ZMQ/selection_single.irp.f +++ b/plugins/Full_CI_ZMQ/selection_single.irp.f @@ -49,7 +49,6 @@ subroutine select_singles(i_gen,hole_mask,particle_mask,fock_diag_tmp,E0,pt2,buf end do call spot_hasBeen(mask, sp, psi_det_sorted, i_gen, N_det, bannedOrb, fullMatch) if(fullMatch) cycle - call spot_occupied(mask(1,sp), bannedOrb) vect = 0d0 call splash_p(mask, sp, psi_selectors(1,1,i_gen), psi_phasemask(1,1,i_gen), psi_selectors_coef_transp(1,i_gen), N_det_selectors - i_gen + 1, bannedOrb, vect) call fill_buffer_single(i_gen, sp, h1, bannedOrb, fock_diag_tmp, E0, pt2, vect, buf) @@ -353,29 +352,3 @@ end subroutine -subroutine debug_hij_mo(hij, gen, mask, s1, p1) - use bitmasks - implicit none - - integer(bit_kind), intent(in) :: gen(N_int,2), mask(N_int,2) - double precision, intent(in) :: hij - integer, intent(in) :: s1, p1 - integer(bit_kind) :: det(N_int,2) - double precision :: hij_ref, phase_ref - logical :: ok - integer :: degree - integer :: exc(0:2,2,2) - logical, external :: detEq - - call apply_particle(mask, s1, p1, det, ok, N_int) - call i_H_j_phase_out(gen,det,N_int,hij_ref,phase_ref,exc,degree) - if(hij /= hij_ref) then - print *, hij, hij_ref - print *, s1, p1 - call debug_det(gen, N_int) - call debug_det(mask, N_int) - call debug_det(det, N_int) - stop - end if -end function - From f46b9ebe87c0041bc53496b4d7710c33ea623c4d Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Tue, 4 Oct 2016 15:29:53 +0200 Subject: [PATCH 165/216] optimized davidson_process --- config/gfortran_avx.cfg | 2 +- src/Davidson/davidson_parallel.irp.f | 26 +++++++++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/config/gfortran_avx.cfg b/config/gfortran_avx.cfg index 6672bca1..80bbbec9 100644 --- a/config/gfortran_avx.cfg +++ b/config/gfortran_avx.cfg @@ -10,7 +10,7 @@ # # [COMMON] -FC : gfortran -ffree-line-length-none -I . -mavx +FC : gfortran -ffree-line-length-none -I . -mavx -g LAPACK_LIB : -llapack -lblas IRPF90 : irpf90 IRPF90_FLAGS : --ninja --align=32 diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 93a387bc..729afaeb 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -18,9 +18,11 @@ subroutine davidson_process(block, N, idx, vt, st) integer :: i, j, sh, sh2, exa, ext, org_i, org_j, istate, ni, endi integer(bit_kind) :: sorted_i(N_int) double precision :: s2, hij + logical :: wrotten(dav_size) + wrotten = .false. - vt = 0d0 - st = 0d0 +! vt = 0d0 +! st = 0d0 N = dav_size do i=1,N @@ -58,11 +60,21 @@ subroutine davidson_process(block, N, idx, vt, st) if(ext <= 4) then call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) ! psi_det call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) + if(.not. wrotten(org_i)) then + wrotten(org_i) = .true. + vt (:,org_i) = 0d0 + st (:,org_i) = 0d0 + end if + if(.not. wrotten(org_j)) then + wrotten(org_j) = .true. + vt (:,org_j) = 0d0 + st (:,org_j) = 0d0 + end if do istate=1,N_states - vt (istate,org_i) = vt (istate,org_i) + hij*dav_ut(istate,org_j) - vt (istate,org_j) = vt (istate,org_j) + hij*dav_ut(istate,org_i) - st (istate,org_i) = st (istate,org_i) + s2*dav_ut(istate,org_j) - st (istate,org_j) = st (istate,org_j) + s2*dav_ut(istate,org_i) + vt (istate,org_i) += hij*dav_ut(istate,org_j) + st (istate,org_i) += s2*dav_ut(istate,org_j) + vt (istate,org_j) += hij*dav_ut(istate,org_i) + st (istate,org_j) += s2*dav_ut(istate,org_i) enddo endif enddo @@ -71,7 +83,7 @@ subroutine davidson_process(block, N, idx, vt, st) N = 0 do i=1, dav_size - if(vt(1, i) /= 0d0 .or. st(1, i) /= 0d0) then + if(wrotten(i)) then N = N+1 do istate=1,N_states vt (istate,N) = vt (istate,i) From 32e578c261e46314fc8f3358c1355cb646a4c292 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 5 Oct 2016 10:10:28 +0200 Subject: [PATCH 166/216] further microlisting splash_pq and spot_isinwf --- plugins/Full_CI_ZMQ/selection_double.irp.f | 109 ++++++++++++++------- src/Davidson/davidson_parallel.irp.f | 11 +-- src/Davidson/u0Hu0.irp.f | 46 +-------- 3 files changed, 75 insertions(+), 91 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection_double.irp.f b/plugins/Full_CI_ZMQ/selection_double.irp.f index f5c4abd8..977622fd 100644 --- a/plugins/Full_CI_ZMQ/selection_double.irp.f +++ b/plugins/Full_CI_ZMQ/selection_double.irp.f @@ -17,8 +17,11 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p logical :: fullMatch, ok integer(bit_kind) :: mobMask(N_int, 2), negMask(N_int, 2) - integer :: preinteresting(0:N_det_selectors), interesting(0:N_det_selectors) - integer(bit_kind) :: minilist(N_int, 2, N_det_selectors) + integer,allocatable :: preinteresting(:), prefullinteresting(:), interesting(:), fullinteresting(:) + integer(bit_kind), allocatable :: minilist(:, :, :), fullminilist(:, :, :) + + allocate(minilist(N_int, 2, N_det_selectors), fullminilist(N_int, 2, N_det)) + allocate(preinteresting(0:N_det_selectors), prefullinteresting(0:N_det), interesting(0:N_det_selectors), fullinteresting(0:N_det)) do k=1,N_int hole (k,1) = iand(psi_det_generators(k,1,i_generator), hole_mask(k,1)) @@ -35,13 +38,15 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p call bitstring_to_list_ab(particle, particle_list, N_particles, N_int) + preinteresting(0) = 0 + prefullinteresting(0) = 0 + do i=1,N_int negMask(i,1) = not(psi_det_generators(i,1,i_generator)) negMask(i,2) = not(psi_det_generators(i,2,i_generator)) end do - preinteresting(0) = 0 - do i=1,N_det_selectors + do i=1,N_det nt = 0 do j=1,N_int mobMask(j,1) = iand(negMask(j,1), psi_det_sorted(j,1,i)) @@ -50,55 +55,85 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p end do if(nt <= 4) then - preinteresting(0) += 1 - preinteresting(preinteresting(0)) = i + if(i <= N_det_selectors) then + preinteresting(0) += 1 + preinteresting(preinteresting(0)) = i + else if(nt <= 2) then + prefullinteresting(0) += 1 + prefullinteresting(prefullinteresting(0)) = i + end if end if end do - + do s1=1,2 - do s2=s1,2 - sp = s1 - if(s1 /= s2) sp = 3 - do i1=N_holes(s1),1,-1 ! Generate low excitations first - h1 = hole_list(i1,s1) - call apply_hole(psi_det_generators(1,1,i_generator), s1,h1, pmask, ok, N_int) - - - do i=1,N_int - negMask(i,1) = not(pmask(i,1)) - negMask(i,2) = not(pmask(i,2)) + do i1=N_holes(s1),1,-1 ! Generate low excitations first + h1 = hole_list(i1,s1) + call apply_hole(psi_det_generators(1,1,i_generator), s1,h1, pmask, ok, N_int) + + do i=1,N_int + negMask(i,1) = not(pmask(i,1)) + negMask(i,2) = not(pmask(i,2)) + end do + + interesting(0) = 0 + fullinteresting(0) = 0 + + do ii=1,preinteresting(0) + i = preinteresting(ii) + nt = 0 + do j=1,N_int + mobMask(j,1) = iand(negMask(j,1), psi_det_sorted(j,1,i)) + mobMask(j,2) = iand(negMask(j,2), psi_det_sorted(j,2,i)) + nt += popcnt(mobMask(j, 1)) + popcnt(mobMask(j, 2)) end do - interesting(0) = 0 - do ii=1,preinteresting(0) - i = preinteresting(ii) - nt = 0 - do j=1,N_int - mobMask(j,1) = iand(negMask(j,1), psi_det_sorted(j,1,i)) - mobMask(j,2) = iand(negMask(j,2), psi_det_sorted(j,2,i)) - nt += popcnt(mobMask(j, 1)) + popcnt(mobMask(j, 2)) - end do - - if(nt <= 4) then - interesting(0) += 1 - interesting(interesting(0)) = i - minilist(:,:,interesting(0)) = psi_det_sorted(:,:,i) + if(nt <= 4) then + interesting(0) += 1 + interesting(interesting(0)) = i + minilist(:,:,interesting(0)) = psi_det_sorted(:,:,i) + if(nt <= 2) then + fullinteresting(0) += 1 + fullinteresting(fullinteresting(0)) = i + fullminilist(:,:,fullinteresting(0)) = psi_det_sorted(:,:,i) end if + end if + end do + + do ii=1,prefullinteresting(0) + i = prefullinteresting(ii) + nt = 0 + do j=1,N_int + mobMask(j,1) = iand(negMask(j,1), psi_det_sorted(j,1,i)) + mobMask(j,2) = iand(negMask(j,2), psi_det_sorted(j,2,i)) + nt += popcnt(mobMask(j, 1)) + popcnt(mobMask(j, 2)) end do + + if(nt <= 2) then + fullinteresting(0) += 1 + fullinteresting(fullinteresting(0)) = i + fullminilist(:,:,fullinteresting(0)) = psi_det_sorted(:,:,i) + end if + end do + + do s2=s1,2 + sp = s1 + if(s1 /= s2) sp = 3 + ib = 1 if(s1 == s2) ib = i1+1 do i2=N_holes(s2),ib,-1 ! Generate low excitations first h2 = hole_list(i2,s2) call apply_hole(pmask, s2,h2, mask, ok, N_int) -! call apply_holes(psi_det_generators(1,1,i_generator), s1,h1,s2,h2, mask, ok, N_int) logical :: banned(mo_tot_num, mo_tot_num,2) logical :: bannedOrb(mo_tot_num, 2) banned = .false. - call spot_isinwf(mask, psi_det_sorted, i_generator, N_det, banned, fullMatch) + + call spot_isinwf(mask, fullminilist, i_generator, fullinteresting(0), banned, fullMatch, fullinteresting) + if(fullMatch) cycle bannedOrb(1:mo_tot_num, 1:2) = .true. @@ -109,7 +144,6 @@ subroutine select_doubles(i_generator,hole_mask,particle_mask,fock_diag_tmp,E0,p enddo mat = 0d0 -! call splash_pq(mask, sp, psi_det_sorted, i_generator, N_det_selectors, bannedOrb, banned, mat, interesting) call splash_pq(mask, sp, minilist, i_generator, interesting(0), bannedOrb, banned, mat, interesting) call fill_buffer_double(i_generator, sp, h1, h2, bannedOrb, banned, fock_diag_tmp, E0, pt2, mat, buf) enddo @@ -647,10 +681,11 @@ end subroutine -subroutine spot_isinwf(mask, det, i_gen, N, banned, fullMatch) +subroutine spot_isinwf(mask, det, i_gen, N, banned, fullMatch, interesting) use bitmasks implicit none + integer, intent(in) :: interesting(0:N) integer(bit_kind),intent(in) :: mask(N_int, 2), det(N_int, 2, N) integer, intent(in) :: i_gen, N logical, intent(inout) :: banned(mo_tot_num, mo_tot_num) @@ -673,7 +708,7 @@ subroutine spot_isinwf(mask, det, i_gen, N, banned, fullMatch) if(iand(det(j,2,i), mask(j,2)) /= mask(j, 2)) cycle genl end do - if(i < i_gen) then + if(interesting(i) < i_gen) then fullMatch = .true. return end if diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 729afaeb..168cdd08 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -19,16 +19,9 @@ subroutine davidson_process(block, N, idx, vt, st) integer(bit_kind) :: sorted_i(N_int) double precision :: s2, hij logical :: wrotten(dav_size) + + wrotten = .false. - -! vt = 0d0 -! st = 0d0 - - N = dav_size - do i=1,N - idx(i) = i - end do - sh = block do sh2=1,sh diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 418ada51..b91513c7 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -213,7 +213,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) integer(ZMQ_PTR) :: handler - if(N_st /= N_states .or. sze_8 /= N_det) stop "SPEP" + if(N_st /= N_states .or. sze_8 < N_det) stop "assert fail in H_S2_u_0_nstates" N_st_8 = N_st !! align_double(N_st) ASSERT (Nint > 0) @@ -255,50 +255,6 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) Vt = 0.d0 St = 0.d0 -! ! !$OMP DO SCHEDULE(dynamic) -! ! do sh=1,shortcut(0,1) -! ! do sh2=sh,shortcut(0,1) -! ! exa = 0 -! ! do ni=1,Nint -! ! exa = exa + popcnt(xor(version(ni,sh,1), version(ni,sh2,1))) -! ! end do -! ! if(exa > 2) then -! ! cycle -! ! end if -! ! -! ! do i=shortcut(sh,1),shortcut(sh+1,1)-1 -! ! org_i = sort_idx(i,1) -! ! if(sh==sh2) then -! ! endi = i-1 -! ! else -! ! endi = shortcut(sh2+1,1)-1 -! ! end if -! ! do ni=1,Nint -! ! sorted_i(ni) = sorted(ni,i,1) -! ! enddo -! ! -! ! do j=shortcut(sh2,1),endi -! ! org_j = sort_idx(j,1) -! ! ext = exa -! ! do ni=1,Nint -! ! ext = ext + popcnt(xor(sorted_i(ni), sorted(ni,j,1))) -! ! end do -! ! if(ext <= 4) then -! ! call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij) -! ! call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2) -! ! do istate=1,n_st -! ! vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) -! ! vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) -! ! st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) -! ! st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) -! ! enddo -! ! endif -! ! enddo -! ! enddo -! ! enddo -! ! enddo -! ! !$OMP END DO NOWAIT - !$OMP DO SCHEDULE(dynamic) do sh=1,shortcut(0,2) do i=shortcut(sh,2),shortcut(sh+1,2)-1 From 7cc21bc38d80f31a432912e54dfa8171ac9aefd1 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Wed, 5 Oct 2016 11:27:35 +0200 Subject: [PATCH 167/216] need to touch dav_size before filling dav_det for ifort --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 2 +- src/Davidson/u0Hu0.irp.f | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 47e79b7c..42337258 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -133,7 +133,7 @@ subroutine ZMQ_selection(N, pt2) integer :: i_generator, i_generator_start, i_generator_max, step ! step = int(max(1.,10*elec_num/mo_tot_num) - step = int(10000000.d0 / dble(N_int * N_states * elec_num * elec_num * mo_tot_num * mo_tot_num )) + step = int(5000000.d0 / dble(N_int * N_states * elec_num * elec_num * mo_tot_num * mo_tot_num )) step = max(1,step) do i= N_det_generators, 1, -step i_generator_start = max(i-step+1,1) diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index b91513c7..8e2ef3f6 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -238,6 +238,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) dav_size = n + touch dav_size dav_det = psi_det dav_ut = ut From 2a53df423f2dade6bc7e17943341c2e206f6bb8d Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 6 Oct 2016 00:36:05 +0200 Subject: [PATCH 168/216] Added qp_create_guess --- ocaml/qp_create_guess.ml | 141 ++++++++++++++++++++++++++++ plugins/MRCC_Utils/mrcc_utils.irp.f | 1 + 2 files changed, 142 insertions(+) create mode 100644 ocaml/qp_create_guess.ml diff --git a/ocaml/qp_create_guess.ml b/ocaml/qp_create_guess.ml new file mode 100644 index 00000000..62af57de --- /dev/null +++ b/ocaml/qp_create_guess.ml @@ -0,0 +1,141 @@ +open Qputils +open Qptypes +open Core.Std + +let run ~multiplicity ezfio_file = + if (not (Sys.file_exists_exn ezfio_file)) then + failwith ("EZFIO directory "^ezfio_file^" not found"); + Ezfio.set_file ezfio_file; + let d = + Input.Determinants_by_hand.read () + in + let m = + Multiplicity.of_int multiplicity + in + let ne = + Ezfio.get_electrons_elec_alpha_num () + + Ezfio.get_electrons_elec_beta_num () + |> Elec_number.of_int + in + let alpha, beta = + let (a,b) = + Multiplicity.to_alpha_beta ne m + in + (Elec_alpha_number.to_int a, Elec_beta_number.to_int b) + in + let n_open_shells = + alpha - beta + in + let mo_tot_num = + Ezfio.get_mo_basis_mo_tot_num () + in + let build_list_of_dets ne n_closed n_open = + let init = + Array.create ~len:n_closed Bit.One + |> Array.to_list + in + let rec set_electron accu = function + | 1 -> [ Bit.One :: accu ] + | i -> + assert (i>1); + let rest = + set_electron (Bit.Zero :: accu) (i-1) + in + (Bit.One::accu) :: rest + in + let rec extend accu = function + | 0 -> List.rev accu + | i -> extend (Bit.Zero::accu) (i-1) + in + let rec set_n_electrons accu imax = function + | 0 -> [] + | 1 -> set_electron accu imax + | i -> + assert (i>1); + let l = + set_electron accu (imax-1) + in + List.map ~f:(fun x -> set_n_electrons x (imax-1) (i-1)) l + |> List.concat + in + set_n_electrons init n_open ne + |> List.filter ~f:(fun x -> List.length x <= n_closed+n_open) + |> List.map ~f:(fun x -> extend x (((mo_tot_num-1)/64+1)*64 - List.length x)) + in + + let alpha_new = + (Elec_number.to_int ne + 1)/2 + and beta_new = + Elec_number.to_int ne/2 + in + let l_alpha = + build_list_of_dets ((alpha-beta+1)/2) beta n_open_shells + in + let l_beta = + if alpha_new = beta_new then + l_alpha + else + build_list_of_dets ((alpha-beta)/2)beta n_open_shells + in + + let n_int = + Bitlist.n_int_of_mo_tot_num mo_tot_num + in + let determinants = + List.map l_alpha ~f:(fun x -> List.map l_beta ~f:(fun y -> (x,y) )) + |> List.concat + |> List.map ~f:(fun pair -> Determinant.of_bitlist_couple ~n_int + ~alpha:(Elec_alpha_number.of_int alpha_new) + ~beta:(Elec_beta_number.of_int beta_new) pair ) + in + let c = + Array.create ~len:(List.length determinants) (Det_coef.of_float 1.) + in + + determinants + |> List.map ~f:(fun x -> Determinant.to_string ~mo_tot_num:(MO_number.of_int mo_tot_num) x) + |> List.iter ~f:(fun x -> Printf.printf "%s\n\n%!" x); + + let l = + List.length determinants + in + if l > 0 then + begin + let d = + let s = (Float.of_int (alpha - beta)) *. 0.5 in + let open Input.Determinants_by_hand in + { d with n_int ; + n_det = Det_number.of_int ~min:1 ~max:l l; + expected_s2 = Positive_float.of_float (s *. (s +. 1.)) ; + psi_coef = c; + psi_det = Array.of_list determinants; + } + in + Input.Determinants_by_hand.write d; + Ezfio.set_determinants_read_wf true + end + else + Ezfio.set_determinants_read_wf false + + + +let spec = + let open Command.Spec in + empty + +> flag "m" (required int) + ~doc:"int Spin multiplicity" + +> anon ("ezfio_file" %: string) + +let () = + Command.basic + ~summary: "Quantum Package command" + ~readme:( fun () -> " +Creates an open-shell multiplet initial guess\n\n" ) + spec + (fun multiplicity ezfio_file () -> + run ~multiplicity ezfio_file + ) + |> Command.run ~version: Git.sha1 ~build_info: Git.message + + + diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index fcfb5dd1..7687b451 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -587,6 +587,7 @@ end subroutine N_ex_exists = 0 n = 0 + !TODO Openmp do i=1, N_det_ref do l=1, N_det_non_ref call get_excitation(psi_ref(1,1,i), psi_non_ref(1,1,l), exc, degree, phase, N_int) From 1afee0681797e5384f213bffecb680b507df9505 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 6 Oct 2016 09:54:52 +0200 Subject: [PATCH 169/216] a davidson task is a range of blocks --- ocaml/TaskServer.ml | 2 +- src/Davidson/davidson_parallel.irp.f | 63 +++++++++++++++------------- src/Davidson/u0Hu0.irp.f | 14 ++++++- 3 files changed, 49 insertions(+), 30 deletions(-) diff --git a/ocaml/TaskServer.ml b/ocaml/TaskServer.ml index 927ac241..474412c9 100644 --- a/ocaml/TaskServer.ml +++ b/ocaml/TaskServer.ml @@ -61,7 +61,7 @@ let bind_socket ~socket_type ~socket ~address = with | Unix.Unix_error _ -> (Time.pause @@ Time.Span.of_float 1. ; loop (i-1) ) | other_exception -> raise other_exception - in loop 10 + in loop 60 let hostname = lazy ( diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 168cdd08..466b2624 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -4,12 +4,12 @@ use bitmasks use f77_zmq -subroutine davidson_process(block, N, idx, vt, st) +subroutine davidson_process(blockb, blocke, N, idx, vt, st) implicit none - integer , intent(in) :: block + integer , intent(in) :: blockb, blocke integer , intent(inout) :: N integer , intent(inout) :: idx(dav_size) double precision , intent(inout) :: vt(N_states, dav_size) @@ -22,8 +22,8 @@ subroutine davidson_process(block, N, idx, vt, st) wrotten = .false. - sh = block - + + do sh = blockb, blocke do sh2=1,sh exa = 0 do ni=1,N_int @@ -73,7 +73,8 @@ subroutine davidson_process(block, N, idx, vt, st) enddo enddo enddo - + enddo + N = 0 do i=1, dav_size if(wrotten(i)) then @@ -90,11 +91,11 @@ end subroutine -subroutine davidson_collect(block, N, idx, vt, st , v0, s0) +subroutine davidson_collect(blockb, blocke, N, idx, vt, st , v0, s0) implicit none - integer , intent(in) :: block + integer , intent(in) :: blockb, blocke integer , intent(in) :: N integer , intent(in) :: idx(N) double precision , intent(in) :: vt(N_states, N) @@ -123,16 +124,16 @@ end subroutine -subroutine davidson_add_task(zmq_to_qp_run_socket, block) +subroutine davidson_add_task(zmq_to_qp_run_socket, blockb, blocke) use f77_zmq implicit none integer(ZMQ_PTR) ,intent(in) :: zmq_to_qp_run_socket - integer ,intent(in) :: block + integer ,intent(in) :: blockb, blocke character*(512) :: task - write(task,*) block + write(task,*) blockb, blocke call add_task_to_taskserver(zmq_to_qp_run_socket, task) end subroutine @@ -161,7 +162,7 @@ subroutine davidson_run_slave(thread,iproc) integer, intent(in) :: thread, iproc - integer :: worker_id, task_id, block + integer :: worker_id, task_id, blockb, blocke character*(512) :: task integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket @@ -203,7 +204,7 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) character*(512) :: task - integer :: block + integer :: blockb, blocke integer :: N integer , allocatable :: idx(:) double precision , allocatable :: vt(:,:) @@ -218,35 +219,38 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) do call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id, task) if(task_id == 0) exit - read (task,*) block + read (task,*) blockb, blocke - call davidson_process(block,N, idx, vt, st) + call davidson_process(blockb, blocke, N, idx, vt, st) ! reverse ? call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id) - call davidson_push_results(zmq_socket_push, block, N, idx, vt, st, task_id) + call davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st, task_id) end do end subroutine -subroutine davidson_push_results(zmq_socket_push, block, N, idx, vt, st, task_id) +subroutine davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st, task_id) use f77_zmq implicit none integer(ZMQ_PTR) ,intent(in) :: zmq_socket_push integer ,intent(in) :: task_id - integer ,intent(in) :: block + integer ,intent(in) :: blockb, blocke integer ,intent(in) :: N integer ,intent(in) :: idx(N) double precision ,intent(in) :: vt(N_states, N) double precision ,intent(in) :: st(N_states, N) integer :: rc - rc = f77_zmq_send( zmq_socket_push, block, 4, ZMQ_SNDMORE) - if(rc /= 4) stop "davidson_push_results failed to push block" + rc = f77_zmq_send( zmq_socket_push, blockb, 4, ZMQ_SNDMORE) + if(rc /= 4) stop "davidson_push_results failed to push blockb" + rc = f77_zmq_send( zmq_socket_push, blocke, 4, ZMQ_SNDMORE) + if(rc /= 4) stop "davidson_push_results failed to push blocke" + rc = f77_zmq_send( zmq_socket_push, N, 4, ZMQ_SNDMORE) if(rc /= 4) stop "davidson_push_results failed to push N" @@ -265,13 +269,13 @@ end subroutine -subroutine davidson_pull_results(zmq_socket_pull, block, N, idx, vt, st, task_id) +subroutine davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st, task_id) use f77_zmq implicit none integer(ZMQ_PTR) ,intent(in) :: zmq_socket_pull integer ,intent(out) :: task_id - integer ,intent(out) :: block + integer ,intent(out) :: blockb, blocke integer ,intent(out) :: N integer ,intent(out) :: idx(dav_size) double precision ,intent(out) :: vt(N_states, dav_size) @@ -279,9 +283,12 @@ subroutine davidson_pull_results(zmq_socket_pull, block, N, idx, vt, st, task_id integer :: rc - rc = f77_zmq_recv( zmq_socket_pull, block, 4, 0) - if(rc /= 4) stop "davidson_push_results failed to pull block" - + rc = f77_zmq_recv( zmq_socket_pull, blockb, 4, 0) + if(rc /= 4) stop "davidson_push_results failed to pull blockb" + + rc = f77_zmq_recv( zmq_socket_pull, blocke, 4, 0) + if(rc /= 4) stop "davidson_push_results failed to pull blocke" + rc = f77_zmq_recv( zmq_socket_pull, N, 4, 0) if(rc /= 4) stop "davidson_push_results failed to pull N" @@ -313,7 +320,7 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) integer :: more, task_id - integer :: block + integer :: blockb, blocke integer :: N integer , allocatable :: idx(:) double precision , allocatable :: vt(:,:) @@ -331,8 +338,8 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) more = 1 do while (more == 1) - call davidson_pull_results(zmq_socket_pull, block, N, idx, vt, st, task_id) - call davidson_collect(block, N, idx, vt, st , v0, s0) + call davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st, task_id) + call davidson_collect(blockb, blocke, N, idx, vt, st , v0, s0) ! done(block) = .true. call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more) deleted += 1 @@ -491,4 +498,4 @@ END_PROVIDER implicit none call sort_dets_ab_v(dav_det, sorted_(1,1,1), sort_idx_(1,1), shortcut_(0,1), version_(1,1,1), dav_size, N_int) call sort_dets_ba_v(dav_det, sorted_(1,1,2), sort_idx_(1,2), shortcut_(0,2), version_(1,1,2), dav_size, N_int) -END_PROVIDER \ No newline at end of file +END_PROVIDER diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 8e2ef3f6..1220a9ba 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -209,6 +209,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) integer :: N_st_8 integer, external :: align_double + integer :: workload, blockb, blocke !!!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut integer(ZMQ_PTR) :: handler @@ -242,10 +243,21 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) dav_det = psi_det dav_ut = ut + workload = 0 + blockb = shortcut(0,1) + blocke = blockb call davidson_init(handler) do sh=shortcut(0,1),1,-1 - call davidson_add_task(handler, sh) + workload += (shortcut(sh+1,1) - shortcut(sh,1))**2 + if(workload > 1000) then + blocke = sh + call davidson_add_task(handler, blocke, blockb) + blockb = sh-1 + workload = 0 + end if enddo + + if(blockb) call davidson_add_task(handler, 1, blockb) call davidson_run(handler, v_0, s_0) From e2154fb892a7d6466b31be73742d72f74fe3fb4f Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 6 Oct 2016 10:54:40 +0200 Subject: [PATCH 170/216] corrected ZMQ bug - removed stack array --- src/Davidson/davidson_parallel.irp.f | 11 ++++------- src/Davidson/u0Hu0.irp.f | 2 +- src/ZMQ/utils.irp.f | 20 -------------------- 3 files changed, 5 insertions(+), 28 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 466b2624..6ab90d44 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -18,9 +18,9 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) integer :: i, j, sh, sh2, exa, ext, org_i, org_j, istate, ni, endi integer(bit_kind) :: sorted_i(N_int) double precision :: s2, hij - logical :: wrotten(dav_size) - + logical, allocatable :: wrotten(:) + allocate(wrotten(dav_size)) wrotten = .false. do sh = blockb, blocke @@ -51,7 +51,7 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) ext = ext + popcnt(xor(sorted_i(ni), sorted_(ni,j,1))) end do if(ext <= 4) then - call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) ! psi_det + call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) if(.not. wrotten(org_i)) then wrotten(org_i) = .true. @@ -116,7 +116,7 @@ subroutine davidson_init(zmq_to_qp_run_socket) use f77_zmq implicit none - integer(ZMQ_PTR), intent(out) :: zmq_to_qp_run_socket ! zmq_to_qp_run_socket + integer(ZMQ_PTR), intent(out) :: zmq_to_qp_run_socket touch dav_size dav_det dav_ut call new_parallel_job(zmq_to_qp_run_socket,"davidson") @@ -184,8 +184,6 @@ subroutine davidson_run_slave(thread,iproc) end if call davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) -! print *, "done slavin'" - !call sleep(1) call disconnect_from_taskserver(zmq_to_qp_run_socket,zmq_socket_push,worker_id) call end_zmq_to_qp_run_socket(zmq_to_qp_run_socket) call end_zmq_push_socket(zmq_socket_push,thread) @@ -444,7 +442,6 @@ subroutine davidson_miniserver_end() rc = f77_zmq_recv(requester, buf, 3, 0) rc = f77_zmq_close(requester) rc = f77_zmq_ctx_destroy(context) -! print *, "closed miniserver" end subroutine diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 1220a9ba..fe8efcf2 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -249,7 +249,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) call davidson_init(handler) do sh=shortcut(0,1),1,-1 workload += (shortcut(sh+1,1) - shortcut(sh,1))**2 - if(workload > 1000) then + if(workload > 10000) then blocke = sh call davidson_add_task(handler, blocke, blockb) blockb = sh-1 diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index e5a9f8ef..da882f3d 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -473,26 +473,6 @@ subroutine end_zmq_push_socket(zmq_socket_push,thread) integer :: rc character*(8), external :: zmq_port - if (thread == 1) then - rc = f77_zmq_disconnect(zmq_socket_push,zmq_socket_push_inproc_address) -! if (rc /= 0) then -! print *, 'f77_zmq_disconnect(zmq_socket_push,zmq_socket_push_inproc_address)' -! stop 'error' -! endif - else - rc = f77_zmq_disconnect(zmq_socket_push,zmq_socket_push_tcp_address) - if (rc /= 0) then - print *, 'f77_zmq_disconnect(zmq_socket_push,zmq_socket_push_tcp_address)' - stop 'error' - endif - endif - - -! rc = f77_zmq_setsockopt(zmq_socket_push,ZMQ_LINGER,20000,4) -! if (rc /= 0) then -! stop 'Unable to set ZMQ_LINGER on push socket' -! endif - rc = f77_zmq_close(zmq_socket_push) if (rc /= 0) then print *, 'f77_zmq_close(zmq_socket_push)' From c5ad63ac0f6d466dd9eef82839102f4fd78fb2ba Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Thu, 6 Oct 2016 11:07:39 +0200 Subject: [PATCH 171/216] bad flag -O0 in ifort.cfg --- config/ifort.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ifort.cfg b/config/ifort.cfg index 255438cc..b04506d4 100644 --- a/config/ifort.cfg +++ b/config/ifort.cfg @@ -32,7 +32,7 @@ OPENMP : 1 ; Append OpenMP flags # [OPT] FC : -traceback -FCFLAGS : -xHost -O0 -ip -ftz -g +FCFLAGS : -xHost -O2 -ip -ftz -g # Profiling flags ################# From 311df93d209c15e3ab5aca3be1b71b7ee3dbd70d Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 6 Oct 2016 14:35:43 +0200 Subject: [PATCH 172/216] Corrected N_states N_states_diag i parallel davidson --- src/Davidson/davidson_parallel.irp.f | 62 +++++------ src/Davidson/davidson_slave.irp.f | 2 +- src/Davidson/u0Hu0.irp.f | 6 +- src/Integrals_Bielec/map_integrals.irp.f | 128 +++++++++++++++++++---- 4 files changed, 143 insertions(+), 55 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 6ab90d44..0e86a9f7 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -12,8 +12,8 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) integer , intent(in) :: blockb, blocke integer , intent(inout) :: N integer , intent(inout) :: idx(dav_size) - double precision , intent(inout) :: vt(N_states, dav_size) - double precision , intent(inout) :: st(N_states, dav_size) + double precision , intent(inout) :: vt(N_states_diag, dav_size) + double precision , intent(inout) :: st(N_states_diag, dav_size) integer :: i, j, sh, sh2, exa, ext, org_i, org_j, istate, ni, endi integer(bit_kind) :: sorted_i(N_int) @@ -63,7 +63,7 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) vt (:,org_j) = 0d0 st (:,org_j) = 0d0 end if - do istate=1,N_states + do istate=1,N_states_diag vt (istate,org_i) += hij*dav_ut(istate,org_j) st (istate,org_i) += s2*dav_ut(istate,org_j) vt (istate,org_j) += hij*dav_ut(istate,org_i) @@ -79,7 +79,7 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) do i=1, dav_size if(wrotten(i)) then N = N+1 - do istate=1,N_states + do istate=1,N_states_diag vt (istate,N) = vt (istate,i) st (istate,N) = st (istate,i) idx(N) = i @@ -98,10 +98,10 @@ subroutine davidson_collect(blockb, blocke, N, idx, vt, st , v0, s0) integer , intent(in) :: blockb, blocke integer , intent(in) :: N integer , intent(in) :: idx(N) - double precision , intent(in) :: vt(N_states, N) - double precision , intent(in) :: st(N_states, N) - double precision , intent(inout) :: v0(dav_size, N_states) - double precision , intent(inout) :: s0(dav_size, N_states) + double precision , intent(in) :: vt(N_states_diag, N) + double precision , intent(in) :: st(N_states_diag, N) + double precision , intent(inout) :: v0(dav_size, N_states_diag) + double precision , intent(inout) :: s0(dav_size, N_states_diag) integer :: i @@ -210,8 +210,8 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) allocate(idx(dav_size)) - allocate(vt(N_states, dav_size)) - allocate(st(N_states, dav_size)) + allocate(vt(N_states_diag, dav_size)) + allocate(st(N_states_diag, dav_size)) do @@ -239,8 +239,8 @@ subroutine davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st integer ,intent(in) :: blockb, blocke integer ,intent(in) :: N integer ,intent(in) :: idx(N) - double precision ,intent(in) :: vt(N_states, N) - double precision ,intent(in) :: st(N_states, N) + double precision ,intent(in) :: vt(N_states_diag, N) + double precision ,intent(in) :: st(N_states_diag, N) integer :: rc rc = f77_zmq_send( zmq_socket_push, blockb, 4, ZMQ_SNDMORE) @@ -255,11 +255,11 @@ subroutine davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st rc = f77_zmq_send( zmq_socket_push, idx, 4*N, ZMQ_SNDMORE) if(rc /= 4*N) stop "davidson_push_results failed to push idx" - rc = f77_zmq_send( zmq_socket_push, vt, 8*N_states* N, ZMQ_SNDMORE) - if(rc /= 8*N_states* N) stop "davidson_push_results failed to push vt" + rc = f77_zmq_send( zmq_socket_push, vt, 8*N_states_diag* N, ZMQ_SNDMORE) + if(rc /= 8*N_states_diag* N) stop "davidson_push_results failed to push vt" - rc = f77_zmq_send( zmq_socket_push, st, 8*N_states* N, ZMQ_SNDMORE) - if(rc /= 8*N_states* N) stop "davidson_push_results failed to push st" + rc = f77_zmq_send( zmq_socket_push, st, 8*N_states_diag* N, ZMQ_SNDMORE) + if(rc /= 8*N_states_diag* N) stop "davidson_push_results failed to push st" rc = f77_zmq_send( zmq_socket_push, task_id, 4, 0) if(rc /= 4) stop "davidson_push_results failed to push task_id" @@ -276,8 +276,8 @@ subroutine davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st integer ,intent(out) :: blockb, blocke integer ,intent(out) :: N integer ,intent(out) :: idx(dav_size) - double precision ,intent(out) :: vt(N_states, dav_size) - double precision ,intent(out) :: st(N_states, dav_size) + double precision ,intent(out) :: vt(N_states_diag, dav_size) + double precision ,intent(out) :: st(N_states_diag, dav_size) integer :: rc @@ -293,11 +293,11 @@ subroutine davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st rc = f77_zmq_recv( zmq_socket_pull, idx, 4*N, 0) if(rc /= 4*N) stop "davidson_push_results failed to pull idx" - rc = f77_zmq_recv( zmq_socket_pull, vt, 8*N_states* N, 0) - if(rc /= 8*N_states* N) stop "davidson_push_results failed to pull vt" + rc = f77_zmq_recv( zmq_socket_pull, vt, 8*N_states_diag* N, 0) + if(rc /= 8*N_states_diag* N) stop "davidson_push_results failed to pull vt" - rc = f77_zmq_recv( zmq_socket_pull, st, 8*N_states* N, 0) - if(rc /= 8*N_states* N) stop "davidson_push_results failed to pull st" + rc = f77_zmq_recv( zmq_socket_pull, st, 8*N_states_diag* N, 0) + if(rc /= 8*N_states_diag* N) stop "davidson_push_results failed to pull st" rc = f77_zmq_recv( zmq_socket_pull, task_id, 4, 0) if(rc /= 4) stop "davidson_pull_results failed to pull task_id" @@ -312,8 +312,8 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) integer(ZMQ_PTR), intent(in) :: zmq_to_qp_run_socket integer(ZMQ_PTR), intent(in) :: zmq_socket_pull - double precision ,intent(inout) :: v0(dav_size, N_states) - double precision ,intent(inout) :: s0(dav_size, N_states) + double precision ,intent(inout) :: v0(dav_size, N_states_diag) + double precision ,intent(inout) :: s0(dav_size, N_states_diag) integer :: more, task_id @@ -330,8 +330,8 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) done = .false. allocate(idx(dav_size)) - allocate(vt(N_states, dav_size)) - allocate(st(N_states, dav_size)) + allocate(vt(N_states_diag, dav_size)) + allocate(st(N_states_diag, dav_size)) more = 1 @@ -360,8 +360,8 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) integer :: i integer, external :: omp_get_thread_num - double precision , intent(inout) :: v0(dav_size, N_states) - double precision , intent(inout) :: s0(dav_size, N_states) + double precision , intent(inout) :: v0(dav_size, N_states_diag) + double precision , intent(inout) :: s0(dav_size, N_states_diag) call zmq_set_running(zmq_to_qp_run_socket) @@ -411,7 +411,7 @@ subroutine davidson_miniserver_run() if (buffer(1:rc) /= 'end') then rc = f77_zmq_send (responder, dav_size, 4, ZMQ_SNDMORE) rc = f77_zmq_send (responder, dav_det, 16*N_int*dav_size, ZMQ_SNDMORE) - rc = f77_zmq_send (responder, dav_ut, 8*dav_size*N_states, 0) + rc = f77_zmq_send (responder, dav_ut, 8*dav_size*N_states_diag, 0) else rc = f77_zmq_send (responder, "end", 3, 0) exit @@ -465,7 +465,7 @@ subroutine davidson_miniserver_get() rc = f77_zmq_recv(requester, dav_size, 4, 0) TOUCH dav_size rc = f77_zmq_recv(requester, dav_det, 16*N_int*dav_size, 0) - rc = f77_zmq_recv(requester, dav_ut, 8*dav_size*N_states, 0) + rc = f77_zmq_recv(requester, dav_ut, 8*dav_size*N_states_diag, 0) TOUCH dav_det dav_ut rc = f77_zmq_close(requester) @@ -480,7 +480,7 @@ BEGIN_PROVIDER [ integer(bit_kind), dav_det, (N_int, 2, dav_size) ] END_PROVIDER -BEGIN_PROVIDER [ double precision, dav_ut, (N_states, dav_size) ] +BEGIN_PROVIDER [ double precision, dav_ut, (N_states_diag, dav_size) ] END_PROVIDER diff --git a/src/Davidson/davidson_slave.irp.f b/src/Davidson/davidson_slave.irp.f index 15830b1d..6cb284a0 100644 --- a/src/Davidson/davidson_slave.irp.f +++ b/src/Davidson/davidson_slave.irp.f @@ -36,5 +36,5 @@ program davidson_slave end ! subroutine provide_everything -! PROVIDE mo_bielec_integrals_in_map psi_det_sorted_bit N_states zmq_context +! PROVIDE mo_bielec_integrals_in_map psi_det_sorted_bit N_states_diag zmq_context ! end subroutine diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index fe8efcf2..66c75659 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -58,8 +58,8 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) integer, external :: align_double !!!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut - if(N_st /= N_states) stop "H_u_0_nstates N_st /= N_states" - N_st_8 = N_states ! align_double(N_st) + if(N_st /= N_states_diag) stop "H_u_0_nstates N_st /= N_states_diag" + N_st_8 = N_states_diag ! align_double(N_st) ASSERT (Nint > 0) ASSERT (Nint == N_int) @@ -214,7 +214,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) integer(ZMQ_PTR) :: handler - if(N_st /= N_states .or. sze_8 < N_det) stop "assert fail in H_S2_u_0_nstates" + if(N_st /= N_states_diag .or. sze_8 < N_det) stop "assert fail in H_S2_u_0_nstates" N_st_8 = N_st !! align_double(N_st) ASSERT (Nint > 0) diff --git a/src/Integrals_Bielec/map_integrals.irp.f b/src/Integrals_Bielec/map_integrals.irp.f index fdcf4038..28b7d2e2 100644 --- a/src/Integrals_Bielec/map_integrals.irp.f +++ b/src/Integrals_Bielec/map_integrals.irp.f @@ -109,6 +109,42 @@ subroutine bielec_integrals_index_reverse(i,j,k,l,i1) end + BEGIN_PROVIDER [ integer, ao_integrals_cache_min ] +&BEGIN_PROVIDER [ integer, ao_integrals_cache_max ] + implicit none + BEGIN_DOC + ! Min and max values of the AOs for which the integrals are in the cache + END_DOC + ao_integrals_cache_min = max(1,ao_num - 63) + ao_integrals_cache_max = ao_num + +END_PROVIDER + +BEGIN_PROVIDER [ double precision, ao_integrals_cache, (ao_integrals_cache_min:ao_integrals_cache_max,ao_integrals_cache_min:ao_integrals_cache_max,ao_integrals_cache_min:ao_integrals_cache_max,ao_integrals_cache_min:ao_integrals_cache_max) ] + implicit none + BEGIN_DOC + ! Cache of AO integrals for fast access + END_DOC + PROVIDE ao_bielec_integrals_in_map + integer :: i,j,k,l + integer(key_kind) :: idx + !$OMP PARALLEL DO PRIVATE (i,j,k,l,idx) + do l=ao_integrals_cache_min,ao_integrals_cache_max + do k=ao_integrals_cache_min,ao_integrals_cache_max + do j=ao_integrals_cache_min,ao_integrals_cache_max + do i=ao_integrals_cache_min,ao_integrals_cache_max + !DIR$ FORCEINLINE + call bielec_integrals_index(i,j,k,l,idx) + !DIR$ FORCEINLINE + call map_get(ao_integrals_map,idx,ao_integrals_cache(i,j,k,l)) + enddo + enddo + enddo + enddo + !$OMP END PARALLEL DO + +END_PROVIDER + double precision function get_ao_bielec_integral(i,j,k,l,map) use map_module @@ -127,8 +163,20 @@ double precision function get_ao_bielec_integral(i,j,k,l,map) else if (ao_bielec_integral_schwartz(i,k)*ao_bielec_integral_schwartz(j,l) < ao_integrals_threshold) then tmp = 0.d0 else - call bielec_integrals_index(i,j,k,l,idx) - call map_get(map,idx,tmp) + if ( (i >= ao_integrals_cache_min) .and. & + (j >= ao_integrals_cache_min) .and. & + (k >= ao_integrals_cache_min) .and. & + (l >= ao_integrals_cache_min) .and. & + (i <= ao_integrals_cache_max) .and. & + (j <= ao_integrals_cache_max) .and. & + (k <= ao_integrals_cache_max) .and. & + (l <= ao_integrals_cache_max) ) then + tmp = ao_integrals_cache(i,j,k,l) + else + !DIR$ FORCEINLINE + call bielec_integrals_index(i,j,k,l,idx) + call map_get(map,idx,tmp) + endif endif get_ao_bielec_integral = tmp end @@ -155,16 +203,9 @@ subroutine get_ao_bielec_integrals(j,k,l,sze,out_val) return endif + double precision :: get_ao_bielec_integral do i=1,sze - if (ao_overlap_abs(i,k)*ao_overlap_abs(j,l) < thresh ) then - out_val(i) = 0.d0 - else if (ao_bielec_integral_schwartz(i,k)*ao_bielec_integral_schwartz(j,l) < thresh) then - out_val(i)=0.d0 - else - !DIR$ FORCEINLINE - call bielec_integrals_index(i,j,k,l,hash) - call map_get(ao_integrals_map, hash, out_val(i)) - endif + out_val(i) = get_ao_bielec_integral(i,j,k,l,ao_integrals_map) enddo end @@ -276,6 +317,43 @@ subroutine insert_into_mo_integrals_map(n_integrals, & call map_update(mo_integrals_map, buffer_i, buffer_values, n_integrals, thr) end + BEGIN_PROVIDER [ integer, mo_integrals_cache_min ] +&BEGIN_PROVIDER [ integer, mo_integrals_cache_max ] + implicit none + BEGIN_DOC + ! Min and max values of the MOs for which the integrals are in the cache + END_DOC + mo_integrals_cache_min = max(1,elec_alpha_num - 31) + mo_integrals_cache_max = min(mo_tot_num,elec_alpha_num + 32) + +END_PROVIDER + +BEGIN_PROVIDER [ double precision, mo_integrals_cache, (mo_integrals_cache_min:mo_integrals_cache_max,mo_integrals_cache_min:mo_integrals_cache_max,mo_integrals_cache_min:mo_integrals_cache_max,mo_integrals_cache_min:mo_integrals_cache_max) ] + implicit none + BEGIN_DOC + ! Cache of MO integrals for fast access + END_DOC + PROVIDE mo_bielec_integrals_in_map + integer :: i,j,k,l + integer(key_kind) :: idx + FREE ao_integrals_cache + !$OMP PARALLEL DO PRIVATE (i,j,k,l,idx) + do l=mo_integrals_cache_min,mo_integrals_cache_max + do k=mo_integrals_cache_min,mo_integrals_cache_max + do j=mo_integrals_cache_min,mo_integrals_cache_max + do i=mo_integrals_cache_min,mo_integrals_cache_max + !DIR$ FORCEINLINE + call bielec_integrals_index(i,j,k,l,idx) + !DIR$ FORCEINLINE + call map_get(mo_integrals_map,idx,mo_integrals_cache(i,j,k,l)) + enddo + enddo + enddo + enddo + !$OMP END PARALLEL DO + +END_PROVIDER + double precision function get_mo_bielec_integral(i,j,k,l,map) use map_module implicit none @@ -287,11 +365,22 @@ double precision function get_mo_bielec_integral(i,j,k,l,map) type(map_type), intent(inout) :: map real(integral_kind) :: tmp PROVIDE mo_bielec_integrals_in_map - !DIR$ FORCEINLINE - call bielec_integrals_index(i,j,k,l,idx) - !DIR$ FORCEINLINE - call map_get(map,idx,tmp) - get_mo_bielec_integral = dble(tmp) + if ( (i >= mo_integrals_cache_min) .and. & + (j >= mo_integrals_cache_min) .and. & + (k >= mo_integrals_cache_min) .and. & + (l >= mo_integrals_cache_min) .and. & + (i <= mo_integrals_cache_max) .and. & + (j <= mo_integrals_cache_max) .and. & + (k <= mo_integrals_cache_max) .and. & + (l <= mo_integrals_cache_max) ) then + get_mo_bielec_integral = mo_integrals_cache(i,j,k,l) + else + !DIR$ FORCEINLINE + call bielec_integrals_index(i,j,k,l,idx) + !DIR$ FORCEINLINE + call map_get(map,idx,tmp) + get_mo_bielec_integral = dble(tmp) + endif end double precision function get_mo_bielec_integral_schwartz(i,j,k,l,map) @@ -306,14 +395,12 @@ double precision function get_mo_bielec_integral_schwartz(i,j,k,l,map) real(integral_kind) :: tmp PROVIDE mo_bielec_integrals_in_map if (mo_bielec_integral_schwartz(i,k)*mo_bielec_integral_schwartz(j,l) > mo_integrals_threshold) then + double precision, external :: get_mo_bielec_integral !DIR$ FORCEINLINE - call bielec_integrals_index(i,j,k,l,idx) - !DIR$ FORCEINLINE - call map_get(map,idx,tmp) + get_mo_bielec_integral_schwartz = get_mo_bielec_integral(i,j,k,l,map) else tmp = 0.d0 endif - get_mo_bielec_integral_schwartz = dble(tmp) end @@ -325,6 +412,7 @@ double precision function mo_bielec_integral(i,j,k,l) integer, intent(in) :: i,j,k,l double precision :: get_mo_bielec_integral PROVIDE mo_bielec_integrals_in_map + !DIR$ FORCEINLINE mo_bielec_integral = get_mo_bielec_integral(i,j,k,l,mo_integrals_map) return end From e7375d1b9a9bed2604327b894d6627cc10dbc3c2 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 6 Oct 2016 16:39:34 +0200 Subject: [PATCH 173/216] Increased task sizes --- ocaml/TaskServer.ml | 1 - plugins/Full_CI_ZMQ/selection_slave.irp.f | 56 ++++++++++++++++------- src/Davidson/davidson.irp.f | 3 -- src/Davidson/davidson_slave.irp.f | 8 ++-- src/Davidson/diagonalization_hs2.irp.f | 22 ++++----- src/Davidson/u0Hu0.irp.f | 4 +- src/ZMQ/utils.irp.f | 34 ++++++++++++++ 7 files changed, 91 insertions(+), 37 deletions(-) delete mode 100644 src/Davidson/davidson.irp.f diff --git a/ocaml/TaskServer.ml b/ocaml/TaskServer.ml index 474412c9..6f012981 100644 --- a/ocaml/TaskServer.ml +++ b/ocaml/TaskServer.ml @@ -547,7 +547,6 @@ let terminate program_state rep_socket = let error msg program_state rep_socket = - Printf.printf "%s\n%!" msg; Message.Error (Message.Error_msg.create msg) |> Message.to_string |> ZMQ.Socket.send rep_socket ; diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index 4c365238..2aba32fe 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -23,31 +23,55 @@ subroutine run_wf integer(ZMQ_PTR), external :: new_zmq_to_qp_run_socket integer(ZMQ_PTR) :: zmq_to_qp_run_socket double precision :: energy(N_states_diag) - character*(64) :: state + character*(64) :: states(2) + integer :: rc, i call provide_everything zmq_context = f77_zmq_ctx_new () - zmq_state = 'selection' - state = 'Waiting' + states(1) = 'selection' + states(2) = 'davidson' zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() do - call wait_for_state(zmq_state,state) - if(trim(state) /= 'selection') exit - print *, 'Getting wave function' - call zmq_get_psi(zmq_to_qp_run_socket,1,energy,N_states_diag) - + + call wait_for_states(states,zmq_state,2) + + if(trim(zmq_state) == 'Stopped') then + + exit + + else if (trim(zmq_state) == 'selection') then + + ! Selection + ! --------- + + print *, 'Selection' + call zmq_get_psi(zmq_to_qp_run_socket,1,energy,N_states_diag) - integer :: rc, i - - print *, 'Selection slave running' - - !$OMP PARALLEL PRIVATE(i) - i = omp_get_thread_num() - call selection_dressing_slave_tcp(i, energy) - !$OMP END PARALLEL + !$OMP PARALLEL PRIVATE(i) + i = omp_get_thread_num() + call selection_dressing_slave_tcp(i, energy) + !$OMP END PARALLEL + print *, 'Selection done' + + else if (trim(zmq_state) == 'davidson') then + + ! Davidson + ! -------- + + print *, 'Davidson' + call davidson_miniserver_get() + + !$OMP PARALLEL PRIVATE(i) + i = omp_get_thread_num() + call davidson_slave_tcp(i) + !$OMP END PARALLEL + print *, 'Davidson done' + + endif + end do end diff --git a/src/Davidson/davidson.irp.f b/src/Davidson/davidson.irp.f deleted file mode 100644 index abe3b504..00000000 --- a/src/Davidson/davidson.irp.f +++ /dev/null @@ -1,3 +0,0 @@ -program davidson - stop 1 -end diff --git a/src/Davidson/davidson_slave.irp.f b/src/Davidson/davidson_slave.irp.f index 6cb284a0..b5ec0592 100644 --- a/src/Davidson/davidson_slave.irp.f +++ b/src/Davidson/davidson_slave.irp.f @@ -8,7 +8,7 @@ program davidson_slave double precision :: energy(N_states_diag) character*(64) :: state -! call provide_everything + call provide_everything call switch_qp_run_to_master zmq_context = f77_zmq_ctx_new () @@ -35,6 +35,6 @@ program davidson_slave end do end -! subroutine provide_everything -! PROVIDE mo_bielec_integrals_in_map psi_det_sorted_bit N_states_diag zmq_context -! end subroutine +subroutine provide_everything + PROVIDE mo_bielec_integrals_in_map psi_det_sorted_bit N_states_diag zmq_context +end subroutine diff --git a/src/Davidson/diagonalization_hs2.irp.f b/src/Davidson/diagonalization_hs2.irp.f index 848e83ed..c44a27d2 100644 --- a/src/Davidson/diagonalization_hs2.irp.f +++ b/src/Davidson/diagonalization_hs2.irp.f @@ -89,7 +89,6 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s integer :: i,j,k,l,m logical :: converged - double precision, allocatable :: overlap(:,:) double precision :: u_dot_v, u_dot_u integer, allocatable :: kl_pairs(:,:) @@ -144,14 +143,6 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s integer, external :: align_double sze_8 = align_double(sze) - double precision :: delta - - if (s2_eig) then - delta = 1.d0 - else - delta = 0.d0 - endif - allocate( & kl_pairs(2,N_st_diag*(N_st_diag+1)/2), & W(sze_8,N_st_diag*davidson_sze_max), & @@ -163,11 +154,20 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s s_(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & s_tmp(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & residual_norm(N_st_diag), & - overlap(N_st_diag,N_st_diag), & c(N_st_diag*davidson_sze_max), & s2(N_st_diag*davidson_sze_max), & lambda(N_st_diag*davidson_sze_max)) + h = 0.d0 + s_ = 0.d0 + s_tmp = 0.d0 + c = 0.d0 + U = 0.d0 + S = 0.d0 + R = 0.d0 + y = 0.d0 + + ASSERT (N_st > 0) ASSERT (N_st_diag >= N_st) ASSERT (sze > 0) @@ -425,7 +425,7 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s deallocate ( & kl_pairs, & W, residual_norm, & - U, overlap, & + U, & R, c, S, & h, & y, s_, s_tmp, & diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 66c75659..e22fbbf9 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -249,7 +249,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) call davidson_init(handler) do sh=shortcut(0,1),1,-1 workload += (shortcut(sh+1,1) - shortcut(sh,1))**2 - if(workload > 10000) then + if(workload > 1000000) then blocke = sh call davidson_add_task(handler, blocke, blockb) blockb = sh-1 @@ -257,7 +257,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) end if enddo - if(blockb) call davidson_add_task(handler, 1, blockb) + if(blockb > 0) call davidson_add_task(handler, 1, blockb) call davidson_run(handler, v_0, s_0) diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index d7dd8002..3b3c912d 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -881,3 +881,37 @@ end +subroutine wait_for_states(state_wait,state,n) + use f77_zmq + implicit none + BEGIN_DOC +! Wait for the ZMQ state to be ready + END_DOC + integer, intent(in) :: n + character*(64), intent(in) :: state_wait(n) + character*(64), intent(out) :: state + integer(ZMQ_PTR) :: zmq_socket_sub + integer(ZMQ_PTR), external :: new_zmq_sub_socket + integer :: rc, i + logical :: condition + + zmq_socket_sub = new_zmq_sub_socket() + state = 'Waiting' + condition = .True. + do while (condition) + rc = f77_zmq_recv( zmq_socket_sub, state, 64, 0) + if (rc > 0) then + state = trim(state(1:rc)) + else + print *, 'Timeout reached. Stopping' + state = "Stopped" + endif + condition = trim(state) /= 'Stopped' + do i=1,n + condition = condition .and. (trim(state) /= trim(state_wait(i))) + enddo + end do + call end_zmq_sub_socket(zmq_socket_sub) +end + + From c2ccbad730742a85eedf12091acea636fa31eff5 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 6 Oct 2016 17:00:20 +0200 Subject: [PATCH 174/216] Repaired broken tests --- plugins/MRCC_CASSD/mrcc_cassd.irp.f | 6 +++--- scripts/ezfio_interface/ei_handler.py | 2 +- scripts/module/qp_module.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/MRCC_CASSD/mrcc_cassd.irp.f b/plugins/MRCC_CASSD/mrcc_cassd.irp.f index 0d49be89..4fef815d 100644 --- a/plugins/MRCC_CASSD/mrcc_cassd.irp.f +++ b/plugins/MRCC_CASSD/mrcc_cassd.irp.f @@ -35,10 +35,10 @@ subroutine run(N_st,energy) print *, 'MRCC Iteration', iteration print *, '===========================' print *, '' - E_old = sum(ci_energy_dressed) + E_old = sum(ci_energy_dressed(1:N_st)) call write_double(6,ci_energy_dressed(1),"MRCC energy") call diagonalize_ci_dressed(lambda) - E_new = sum(ci_energy_dressed) + E_new = sum(ci_energy_dressed(1:N_st)) delta_E = dabs(E_new - E_old) call save_wavefunction call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) @@ -47,7 +47,7 @@ subroutine run(N_st,energy) endif enddo call write_double(6,ci_energy_dressed(1),"Final MRCC energy") - energy(:) = ci_energy_dressed(:) + energy(1:N_st) = ci_energy_dressed(1:N_st) end diff --git a/scripts/ezfio_interface/ei_handler.py b/scripts/ezfio_interface/ei_handler.py index d7cd9c95..ef15c9b8 100755 --- a/scripts/ezfio_interface/ei_handler.py +++ b/scripts/ezfio_interface/ei_handler.py @@ -45,7 +45,7 @@ Optional: (by default is one) Example : 1, =sum(ao_num); (ao_num,3) ATTENTION : The module and the value are separed by a "." not a "_". - For exemple (determinants.n_det) + For example (determinants.n_det) ezfio_name: The name for the EZFIO lib (by default is ) ezfio_dir: Will be the folder of EZFIO. diff --git a/scripts/module/qp_module.py b/scripts/module/qp_module.py index 06ad5dd2..adeb3a46 100755 --- a/scripts/module/qp_module.py +++ b/scripts/module/qp_module.py @@ -213,7 +213,7 @@ def main(arguments): print "[ OK ]" print "" print "You can now compile as usual" - print "`cd {0} ; ninja` for exemple".format(QP_ROOT) + print "`cd {0} ; ninja` for example".format(QP_ROOT) print " or --in developement mode-- you can cd in a directory and compile here" elif arguments["uninstall"]: From 8c8a57139901e7a92d65432b4221ca6d0af8ebc3 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 6 Oct 2016 17:39:15 +0200 Subject: [PATCH 175/216] Corrected bug in pseudo --- plugins/MRCC_Utils/mrcc_dress.irp.f | 1 - src/Integrals_Monoelec/pseudopot.f90 | 9 +++++---- src/Utils/util.irp.f | 12 ++++++++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_dress.irp.f b/plugins/MRCC_Utils/mrcc_dress.irp.f index 412c52e2..e6d0fb81 100644 --- a/plugins/MRCC_Utils/mrcc_dress.irp.f +++ b/plugins/MRCC_Utils/mrcc_dress.irp.f @@ -53,7 +53,6 @@ subroutine mrcc_dress(delta_ij_, delta_ii_, Nstates, Ndet_non_ref, Ndet_ref,i_ge integer :: mobiles(2), smallerlist logical, external :: is_generable - print *, i_generator leng = max(N_det_generators, N_det_non_ref) allocate(miniList(Nint, 2, leng), idx_minilist(leng), hij_cache(N_det_non_ref)) diff --git a/src/Integrals_Monoelec/pseudopot.f90 b/src/Integrals_Monoelec/pseudopot.f90 index 12f0192e..d77b3ca0 100644 --- a/src/Integrals_Monoelec/pseudopot.f90 +++ b/src/Integrals_Monoelec/pseudopot.f90 @@ -282,8 +282,7 @@ if(ac.eq.0.d0.and.bc.eq.0.d0)then if (prod == 0.d0) cycle prodp=bigI(0,0,l,m,n_b(1),n_b(2),n_b(3)) if (prodp == 0.d0) cycle - accu=accu+prod*prodp*v_kl(k,l)*int_prod_bessel(ktot+2,g_a+g_b+dz_kl(k,l),0,0,areal,breal,arg) - + accu=accu+prod*prodp*v_kl(k,l)*int_prod_bessel(ktot+2,g_a+g_b+dz_kl(k,l),0,0,areal,breal,arg) enddo enddo enddo @@ -1829,13 +1828,15 @@ end double precision function coef_nk(n,k) implicit none - integer n,k, ISHFT + integer n,k double precision gam,dble_fact,fact + if (k<0) stop 'pseudopot.f90 : coef_nk' + if (k>63) stop 'pseudopot.f90 : coef_nk' gam=dble_fact(n+n+k+k+1) ! coef_nk=1.d0/(2.d0**k*fact(k)*gam) - coef_nk=1.d0/(dble(ibset(0,k))*fact(k)*gam) + coef_nk=1.d0/(dble(ibset(0_8,k))*fact(k)*gam) return diff --git a/src/Utils/util.irp.f b/src/Utils/util.irp.f index 8d375ac6..4001e9df 100644 --- a/src/Utils/util.irp.f +++ b/src/Utils/util.irp.f @@ -156,12 +156,19 @@ double precision function dble_fact_even(n) result(fact2) ! n!! END_DOC integer :: n,k - double precision, save :: memo(1:100) - integer, save :: memomax = 2 + double precision, save :: memo(0:100) + integer, save :: memomax = 0 double precision :: prod ASSERT (iand(n,1) /= 1) +! prod=1.d0 +! do k=2,n,2 +! prod=prod*dfloat(k) +! enddo +! fact2=prod +! return +! if (n <= memomax) then if (n < 2) then fact2 = 1.d0 @@ -172,6 +179,7 @@ double precision function dble_fact_even(n) result(fact2) endif integer :: i + memo(0)=1.d0 memo(1)=1.d0 do i=memomax+2,min(n,100),2 memo(i) = memo(i-2)* dble(i) From 693604d33886d9c4dcf39616aed077e17ad1b620 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 7 Oct 2016 00:42:03 +0200 Subject: [PATCH 176/216] Improve parallel davidson --- src/Davidson/davidson_parallel.irp.f | 57 ++++++++++--------- src/Davidson/u0Hu0.irp.f | 85 ++++++++++++++-------------- src/Utils/transpose.irp.f | 78 +++++++++++++++++++++++++ 3 files changed, 150 insertions(+), 70 deletions(-) create mode 100644 src/Utils/transpose.irp.f diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 0e86a9f7..90f2ec8f 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -91,7 +91,7 @@ end subroutine -subroutine davidson_collect(blockb, blocke, N, idx, vt, st , v0, s0) +subroutine davidson_collect(blockb, blocke, N, idx, vt, st , v0t, s0t) implicit none @@ -100,14 +100,19 @@ subroutine davidson_collect(blockb, blocke, N, idx, vt, st , v0, s0) integer , intent(in) :: idx(N) double precision , intent(in) :: vt(N_states_diag, N) double precision , intent(in) :: st(N_states_diag, N) - double precision , intent(inout) :: v0(dav_size, N_states_diag) - double precision , intent(inout) :: s0(dav_size, N_states_diag) + double precision , intent(inout) :: v0t(N_states_diag,dav_size) + double precision , intent(inout) :: s0t(N_states_diag,dav_size) - integer :: i + integer :: i, j, k + !DIR$ IVDEP do i=1,N - v0(idx(i), :) += vt(:, i) - s0(idx(i), :) += st(:, i) + k = idx(i) + !DIR$ IVDEP + do j=1,N_states_diag + v0t(j,k) = v0t(j,k) + vt(j,i) + s0t(j,k) = s0t(j,k) + st(j,i) + enddo end do end subroutine @@ -221,7 +226,6 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) call davidson_process(blockb, blocke, N, idx, vt, st) - ! reverse ? call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id) call davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st, task_id) end do @@ -321,7 +325,7 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) integer :: blockb, blocke integer :: N integer , allocatable :: idx(:) - double precision , allocatable :: vt(:,:) + double precision , allocatable :: vt(:,:), v0t(:,:), s0t(:,:) double precision , allocatable :: st(:,:) integer :: deleted logical, allocatable :: done(:) @@ -332,18 +336,23 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) allocate(idx(dav_size)) allocate(vt(N_states_diag, dav_size)) allocate(st(N_states_diag, dav_size)) + allocate(v0t(N_states_diag, dav_size)) + allocate(s0t(N_states_diag, dav_size)) more = 1 do while (more == 1) call davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st, task_id) - call davidson_collect(blockb, blocke, N, idx, vt, st , v0, s0) -! done(block) = .true. + !DIR$ FORCEINLINE + call davidson_collect(blockb, blocke, N, idx, vt, st , v0t, s0t) call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more) deleted += 1 -! print *, "DELETED", deleted, done end do -! print *, "done collector" + deallocate(idx,vt,st,done) + + call dtranspose(v0t,size(v0t,1), v0, size(v0,1), N_states_diag, dav_size) + call dtranspose(s0t,size(s0t,1), s0, size(s0,1), N_states_diag, dav_size) + deallocate(v0t,s0t) end subroutine @@ -382,7 +391,7 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) else if(i==1) then call davidson_miniserver_run() else - call davidson_slave_inproc(i) + call davidson_slave_inproc(i-1) endif !$OMP END PARALLEL call end_parallel_job(zmq_to_qp_run_socket, 'davidson') @@ -393,7 +402,6 @@ end subroutine subroutine davidson_miniserver_run() use f77_zmq implicit none - integer(ZMQ_PTR) context integer(ZMQ_PTR) responder character*(64) address character(len=:), allocatable :: buffer @@ -402,8 +410,7 @@ subroutine davidson_miniserver_run() allocate (character(len=20) :: buffer) address = 'tcp://*:11223' - context = f77_zmq_ctx_new() - responder = f77_zmq_socket(context, ZMQ_REP) + responder = f77_zmq_socket(zmq_context, ZMQ_REP) rc = f77_zmq_bind(responder,address) do @@ -419,7 +426,6 @@ subroutine davidson_miniserver_run() enddo rc = f77_zmq_close(responder) - rc = f77_zmq_ctx_destroy(context) end subroutine @@ -427,21 +433,20 @@ subroutine davidson_miniserver_end() implicit none use f77_zmq - integer(ZMQ_PTR) context integer(ZMQ_PTR) requester character*(64) address integer rc character*(64) buf address = trim(qp_run_address)//':11223' - context = f77_zmq_ctx_new() - requester = f77_zmq_socket(context, ZMQ_REQ) + requester = f77_zmq_socket(zmq_context, ZMQ_REQ) rc = f77_zmq_connect(requester,address) - rc = f77_zmq_send(requester, "end", 3, 0) - rc = f77_zmq_recv(requester, buf, 3, 0) + rc = f77_zmq_send(requester, "end", 3, ZMQ_NOBLOCK) + if (rc > 0) then + rc = f77_zmq_recv(requester, buf, 3, 0) + endif rc = f77_zmq_close(requester) - rc = f77_zmq_ctx_destroy(context) end subroutine @@ -449,7 +454,6 @@ subroutine davidson_miniserver_get() implicit none use f77_zmq - integer(ZMQ_PTR) context integer(ZMQ_PTR) requester character*(64) address character*(20) buffer @@ -457,8 +461,7 @@ subroutine davidson_miniserver_get() address = trim(qp_run_address)//':11223' - context = f77_zmq_ctx_new() - requester = f77_zmq_socket(context, ZMQ_REQ) + requester = f77_zmq_socket(zmq_context, ZMQ_REQ) rc = f77_zmq_connect(requester,address) rc = f77_zmq_send(requester, "Hello", 5, 0) @@ -469,9 +472,7 @@ subroutine davidson_miniserver_get() TOUCH dav_det dav_ut rc = f77_zmq_close(requester) - rc = f77_zmq_ctx_destroy(context) - touch dav_det dav_ut end subroutine diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index e22fbbf9..8c2b373c 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -249,7 +249,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) call davidson_init(handler) do sh=shortcut(0,1),1,-1 workload += (shortcut(sh+1,1) - shortcut(sh,1))**2 - if(workload > 1000000) then + if(workload > 100000) then blocke = sh call davidson_add_task(handler, blocke, blockb) blockb = sh-1 @@ -258,51 +258,51 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) enddo if(blockb > 0) call davidson_add_task(handler, 1, blockb) - call davidson_run(handler, v_0, s_0) - + !$OMP PARALLEL DEFAULT(NONE) & !$OMP PRIVATE(i,hij,s2,j,k,jj,vt,st,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& - !$OMP SHARED(n,keys_tmp,ut,Nint,v_0,s_0,sorted,shortcut,sort_idx,version,N_st,N_st_8) - allocate(vt(N_st_8,n),st(N_st_8,n)) - Vt = 0.d0 - St = 0.d0 - - !$OMP DO SCHEDULE(dynamic) - do sh=1,shortcut(0,2) - do i=shortcut(sh,2),shortcut(sh+1,2)-1 - org_i = sort_idx(i,2) - do j=shortcut(sh,2),i-1 - org_j = sort_idx(j,2) - ext = 0 - do ni=1,Nint - ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2))) - end do - if(ext == 4) then - call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij) - call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2) - do istate=1,n_st - vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) - vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) - st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) - st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) - enddo - end if - end do - end do - enddo - !$OMP END DO NOWAIT - - !$OMP CRITICAL - do istate=1,N_st - do i=n,1,-1 - v_0(i,istate) = v_0(i,istate) + vt(istate,i) - s_0(i,istate) = s_0(i,istate) + st(istate,i) - enddo - enddo - !$OMP END CRITICAL + !$OMP SHARED(n,keys_tmp,ut,Nint,v_0,s_0,sorted,shortcut,sort_idx,version,N_st,N_st_8) - deallocate(vt,st) + allocate(vt(N_st_8,n),st(N_st_8,n)) + Vt = 0.d0 + St = 0.d0 + + !$OMP DO SCHEDULE(dynamic) + do sh=1,shortcut(0,2) + do i=shortcut(sh,2),shortcut(sh+1,2)-1 + org_i = sort_idx(i,2) + do j=shortcut(sh,2),i-1 + org_j = sort_idx(j,2) + ext = 0 + do ni=1,Nint + ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2))) + end do + if(ext == 4) then + call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij) + call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2) + do istate=1,n_st + vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) + vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) + st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) + st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) + enddo + end if + end do + end do + enddo + !$OMP END DO NOWAIT + + !$OMP CRITICAL + do istate=1,N_st + do i=n,1,-1 + v_0(i,istate) = v_0(i,istate) + vt(istate,i) + s_0(i,istate) = s_0(i,istate) + st(istate,i) + enddo + enddo + !$OMP END CRITICAL + + deallocate(vt,st) !$OMP END PARALLEL do istate=1,N_st @@ -311,6 +311,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) s_0(i,istate) = s_0(i,istate) + s2_jj(i)* u_0(i,istate) enddo enddo + deallocate (shortcut, sort_idx, sorted, version) end diff --git a/src/Utils/transpose.irp.f b/src/Utils/transpose.irp.f new file mode 100644 index 00000000..32e502e9 --- /dev/null +++ b/src/Utils/transpose.irp.f @@ -0,0 +1,78 @@ +!DIR$ attributes forceinline :: transpose +recursive subroutine transpose(A,LDA,B,LDB,d1,d2) + implicit none + BEGIN_DOC +! Transpose input matrix A into output matrix B + END_DOC + integer, intent(in) :: d1, d2, LDA, LDB + real, intent(in) :: A(LDA,d2) + real, intent(out) :: B(LDB,d1) + + integer :: i,j,k, mod_align + if ( d2 < 32 ) then + do j=1,d1 + !DIR$ LOOP COUNT (16) + do i=1,d2 + B(i,j ) = A(j ,i) + enddo + enddo + return + else if (d1 > d2) then + !DIR$ forceinline + k=d1/2 + !DIR$ forceinline recursive + call transpose(A(1,1),LDA,B(1,1),LDB,k,d2) + !DIR$ forceinline recursive + call transpose(A(k+1,1),LDA,B(1,k+1),LDB,d1-k,d2) + return + else + !DIR$ forceinline + k=d2/2 + !DIR$ forceinline recursive + call transpose(A(1,k+1),LDA,B(k+1,1),LDB,d1,d2-k) + !DIR$ forceinline recursive + call transpose(A(1,1),LDA,B(1,1),LDB,d1,k) + return + endif + +end + +!DIR$ attributes forceinline :: dtranspose +recursive subroutine dtranspose(A,LDA,B,LDB,d1,d2) + implicit none + BEGIN_DOC +! Transpose input matrix A into output matrix B + END_DOC + integer, intent(in) :: d1, d2, LDA, LDB + double precision, intent(in) :: A(LDA,d2) + double precision, intent(out) :: B(LDB,d1) + + integer :: i,j,k, mod_align + if ( d2 < 32 ) then + do j=1,d1 + !DIR$ LOOP COUNT (16) + do i=1,d2 + B(i,j ) = A(j ,i) + enddo + enddo + return + else if (d1 > d2) then + !DIR$ forceinline + k=d1/2 + !DIR$ forceinline recursive + call dtranspose(A(1,1),LDA,B(1,1),LDB,k,d2) + !DIR$ forceinline recursive + call dtranspose(A(k+1,1),LDA,B(1,k+1),LDB,d1-k,d2) + return + else + !DIR$ forceinline + k=d2/2 + !DIR$ forceinline recursive + call dtranspose(A(1,k+1),LDA,B(k+1,1),LDB,d1,d2-k) + !DIR$ forceinline recursive + call dtranspose(A(1,1),LDA,B(1,1),LDB,d1,k) + return + endif + +end + From f7a2710f5c4f515699b0cb9a338f615b7a251301 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 7 Oct 2016 09:46:59 +0200 Subject: [PATCH 177/216] Corrected bug in transposed collector --- src/Davidson/davidson_parallel.irp.f | 20 +++----- src/Davidson/u0Hu0.irp.f | 72 ++++++++++++++-------------- 2 files changed, 43 insertions(+), 49 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 90f2ec8f..6935256e 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -327,11 +327,6 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) integer , allocatable :: idx(:) double precision , allocatable :: vt(:,:), v0t(:,:), s0t(:,:) double precision , allocatable :: st(:,:) - integer :: deleted - logical, allocatable :: done(:) - allocate(done(shortcut_(0,1))) - deleted = 0 - done = .false. allocate(idx(dav_size)) allocate(vt(N_states_diag, dav_size)) @@ -339,6 +334,9 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) allocate(v0t(N_states_diag, dav_size)) allocate(s0t(N_states_diag, dav_size)) + v0t = 00.d0 + s0t = 00.d0 + more = 1 do while (more == 1) @@ -346,9 +344,8 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) !DIR$ FORCEINLINE call davidson_collect(blockb, blocke, N, idx, vt, st , v0t, s0t) call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more) - deleted += 1 end do - deallocate(idx,vt,st,done) + deallocate(idx,vt,st) call dtranspose(v0t,size(v0t,1), v0, size(v0,1), N_states_diag, dav_size) call dtranspose(s0t,size(s0t,1), s0, size(s0,1), N_states_diag, dav_size) @@ -391,7 +388,7 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) else if(i==1) then call davidson_miniserver_run() else - call davidson_slave_inproc(i-1) + call davidson_slave_inproc(i) endif !$OMP END PARALLEL call end_parallel_job(zmq_to_qp_run_socket, 'davidson') @@ -442,10 +439,8 @@ subroutine davidson_miniserver_end() requester = f77_zmq_socket(zmq_context, ZMQ_REQ) rc = f77_zmq_connect(requester,address) - rc = f77_zmq_send(requester, "end", 3, ZMQ_NOBLOCK) - if (rc > 0) then - rc = f77_zmq_recv(requester, buf, 3, 0) - endif + rc = f77_zmq_send(requester, "end", 3, 0) + rc = f77_zmq_recv(requester, buf, 3, 0) rc = f77_zmq_close(requester) end subroutine @@ -471,7 +466,6 @@ subroutine davidson_miniserver_get() rc = f77_zmq_recv(requester, dav_ut, 8*dav_size*N_states_diag, 0) TOUCH dav_det dav_ut - rc = f77_zmq_close(requester) end subroutine diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 8c2b373c..6b3f2782 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -262,47 +262,47 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) !$OMP PARALLEL DEFAULT(NONE) & !$OMP PRIVATE(i,hij,s2,j,k,jj,vt,st,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& - !$OMP SHARED(n,keys_tmp,ut,Nint,v_0,s_0,sorted,shortcut,sort_idx,version,N_st,N_st_8) + !$OMP SHARED(n,keys_tmp,ut,Nint,v_0,s_0,sorted,shortcut,sort_idx,version,N_st,N_st_8) - allocate(vt(N_st_8,n),st(N_st_8,n)) - Vt = 0.d0 - St = 0.d0 - - !$OMP DO SCHEDULE(dynamic) - do sh=1,shortcut(0,2) - do i=shortcut(sh,2),shortcut(sh+1,2)-1 - org_i = sort_idx(i,2) - do j=shortcut(sh,2),i-1 - org_j = sort_idx(j,2) - ext = 0 - do ni=1,Nint - ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2))) - end do - if(ext == 4) then - call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij) - call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2) - do istate=1,n_st - vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) - vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) - st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) - st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) - enddo - end if + allocate(vt(N_st_8,n),st(N_st_8,n)) + Vt = 0.d0 + St = 0.d0 + + !$OMP DO SCHEDULE(dynamic) + do sh=1,shortcut(0,2) + do i=shortcut(sh,2),shortcut(sh+1,2)-1 + org_i = sort_idx(i,2) + do j=shortcut(sh,2),i-1 + org_j = sort_idx(j,2) + ext = 0 + do ni=1,Nint + ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2))) end do + if(ext == 4) then + call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij) + call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2) + do istate=1,n_st + vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) + vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) + st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) + st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) + enddo + end if end do + end do + enddo + !$OMP END DO NOWAIT + + !$OMP CRITICAL + do istate=1,N_st + do i=n,1,-1 + v_0(i,istate) = v_0(i,istate) + vt(istate,i) + s_0(i,istate) = s_0(i,istate) + st(istate,i) enddo - !$OMP END DO NOWAIT - - !$OMP CRITICAL - do istate=1,N_st - do i=n,1,-1 - v_0(i,istate) = v_0(i,istate) + vt(istate,i) - s_0(i,istate) = s_0(i,istate) + st(istate,i) - enddo - enddo - !$OMP END CRITICAL + enddo + !$OMP END CRITICAL - deallocate(vt,st) + deallocate(vt,st) !$OMP END PARALLEL do istate=1,N_st From 1b63438d688aa9643cb91842f33fed2be180af3d Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 7 Oct 2016 09:57:14 +0200 Subject: [PATCH 178/216] selection_slave does parallel davidson - unstable on fast iterations --- config/ifort.cfg | 2 +- plugins/Full_CI_ZMQ/selection_slave.irp.f | 33 +++++++++++++++-------- src/ZMQ/utils.irp.f | 25 +++++++++++++++++ 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/config/ifort.cfg b/config/ifort.cfg index b04506d4..4b1429b8 100644 --- a/config/ifort.cfg +++ b/config/ifort.cfg @@ -32,7 +32,7 @@ OPENMP : 1 ; Append OpenMP flags # [OPT] FC : -traceback -FCFLAGS : -xHost -O2 -ip -ftz -g +FCFLAGS : -xSSE4.2 -O2 -ip -ftz -g # Profiling flags ################# diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index 4c365238..80a6a64f 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -28,26 +28,37 @@ subroutine run_wf call provide_everything zmq_context = f77_zmq_ctx_new () - zmq_state = 'selection' state = 'Waiting' zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() do - call wait_for_state(zmq_state,state) - if(trim(state) /= 'selection') exit - print *, 'Getting wave function' - call zmq_get_psi(zmq_to_qp_run_socket,1,energy,N_states_diag) + call wait_for_next_state(state) + print *, "STATE ", trim(state) + if(trim(state) == "Stopped") exit + if(trim(state) == 'selection') then + zmq_state = 'selection' + print *, 'Getting wave function' + call zmq_get_psi(zmq_to_qp_run_socket,1,energy,N_states_diag) - integer :: rc, i + integer :: rc, i - print *, 'Selection slave running' + print *, 'Selection slave running' - !$OMP PARALLEL PRIVATE(i) - i = omp_get_thread_num() - call selection_dressing_slave_tcp(i, energy) - !$OMP END PARALLEL + !$OMP PARALLEL PRIVATE(i) + i = omp_get_thread_num() + call selection_dressing_slave_tcp(i, energy) + !$OMP END PARALLEL + else if(trim(state) == "davidson") then + zmq_state = 'davidson' + call davidson_miniserver_get() + print *, "Davidson slave running" + !$OMP PARALLEL PRIVATE(i) + i = omp_get_thread_num() + call davidson_slave_tcp(i) + !$OMP END PARALLEL + end if end do end diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index da882f3d..d3ecd312 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -854,6 +854,31 @@ subroutine zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more) endif end + +subroutine wait_for_next_state(state) + use f77_zmq + implicit none + + character*(64), intent(out) :: state + integer(ZMQ_PTR) :: zmq_socket_sub + integer(ZMQ_PTR), external :: new_zmq_sub_socket + integer :: rc + + zmq_socket_sub = new_zmq_sub_socket() + state = 'Waiting' + do while(state == "Waiting") + rc = f77_zmq_recv( zmq_socket_sub, state, 64, 0) + if (rc > 0) then + state = trim(state(1:rc)) + else + print *, 'Timeout reached. Stopping' + state = "Stopped" + end if + end do + call end_zmq_sub_socket(zmq_socket_sub) +end subroutine + + subroutine wait_for_state(state_wait,state) use f77_zmq implicit none From b75e7dd2c2a51e57388cfaccdf97c9a72e0cff41 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 7 Oct 2016 12:22:43 +0200 Subject: [PATCH 179/216] Fixed bug of dimensions in davidson --- src/Davidson/davidson_parallel.irp.f | 99 +++++++++++++++++++--------- src/Davidson/u0Hu0.irp.f | 27 +++----- 2 files changed, 77 insertions(+), 49 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 6935256e..33b62c6a 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -64,10 +64,10 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) st (:,org_j) = 0d0 end if do istate=1,N_states_diag - vt (istate,org_i) += hij*dav_ut(istate,org_j) - st (istate,org_i) += s2*dav_ut(istate,org_j) - vt (istate,org_j) += hij*dav_ut(istate,org_i) - st (istate,org_j) += s2*dav_ut(istate,org_i) + vt(istate,org_i) = vt(istate,org_i) + hij*dav_ut(istate,org_j) + st(istate,org_i) = st(istate,org_i) + s2 *dav_ut(istate,org_j) + vt(istate,org_j) = vt(istate,org_j) + hij*dav_ut(istate,org_i) + st(istate,org_j) = st(istate,org_j) + s2 *dav_ut(istate,org_i) enddo endif enddo @@ -117,13 +117,33 @@ subroutine davidson_collect(blockb, blocke, N, idx, vt, st , v0t, s0t) end subroutine -subroutine davidson_init(zmq_to_qp_run_socket) +subroutine davidson_init(zmq_to_qp_run_socket,n,n_st_8,ut) use f77_zmq implicit none - integer(ZMQ_PTR), intent(out) :: zmq_to_qp_run_socket + integer(ZMQ_PTR), intent(out) :: zmq_to_qp_run_socket + integer, intent(in) :: n, n_st_8 + double precision, intent(in) :: ut(n_st_8,n) + integer :: i,k + - touch dav_size dav_det dav_ut + dav_size = n + touch dav_size + + do i=1,n + do k=1,N_int + dav_det(k,1,i) = psi_det(k,1,i) + dav_det(k,2,i) = psi_det(k,2,i) + enddo + enddo + do i=1,n + do k=1,N_states_diag + dav_ut(k,i) = ut(k,i) + enddo + enddo + + touch dav_det dav_ut + call new_parallel_job(zmq_to_qp_run_socket,"davidson") end subroutine @@ -309,24 +329,25 @@ end subroutine -subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) +subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0, LDA) use f77_zmq implicit none - integer(ZMQ_PTR), intent(in) :: zmq_to_qp_run_socket - integer(ZMQ_PTR), intent(in) :: zmq_socket_pull - - double precision ,intent(inout) :: v0(dav_size, N_states_diag) - double precision ,intent(inout) :: s0(dav_size, N_states_diag) - - integer :: more, task_id + integer :: LDA + integer(ZMQ_PTR), intent(in) :: zmq_to_qp_run_socket + integer(ZMQ_PTR), intent(in) :: zmq_socket_pull - - integer :: blockb, blocke - integer :: N - integer , allocatable :: idx(:) - double precision , allocatable :: vt(:,:), v0t(:,:), s0t(:,:) - double precision , allocatable :: st(:,:) + double precision ,intent(inout) :: v0(LDA, N_states_diag) + double precision ,intent(inout) :: s0(LDA, N_states_diag) + + integer :: more, task_id + + + integer :: blockb, blocke + integer :: N + integer , allocatable :: idx(:) + double precision , allocatable :: vt(:,:), v0t(:,:), s0t(:,:) + double precision , allocatable :: st(:,:) allocate(idx(dav_size)) allocate(vt(N_states_diag, dav_size)) @@ -353,21 +374,22 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) end subroutine -subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) +subroutine davidson_run(zmq_to_qp_run_socket , v0, s0, LDA) use f77_zmq implicit none - integer(ZMQ_PTR), intent(in) :: zmq_to_qp_run_socket + integer :: LDA + integer(ZMQ_PTR), intent(in) :: zmq_to_qp_run_socket integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket - integer(ZMQ_PTR) :: zmq_collector + integer(ZMQ_PTR) :: zmq_collector integer(ZMQ_PTR), external :: new_zmq_pull_socket integer(ZMQ_PTR) :: zmq_socket_pull integer :: i integer, external :: omp_get_thread_num - double precision , intent(inout) :: v0(dav_size, N_states_diag) - double precision , intent(inout) :: s0(dav_size, N_states_diag) + double precision , intent(inout) :: v0(LDA, N_states_diag) + double precision , intent(inout) :: s0(LDA, N_states_diag) call zmq_set_running(zmq_to_qp_run_socket) @@ -381,7 +403,7 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) !$OMP PARALLEL DEFAULT(shared) private(i) num_threads(nproc+2) i = omp_get_thread_num() if (i==0) then - call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) + call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0, size(v0,1)) call end_zmq_to_qp_run_socket(zmq_collector) call end_zmq_pull_socket(zmq_socket_pull) call davidson_miniserver_end() @@ -471,15 +493,28 @@ end subroutine -BEGIN_PROVIDER [ integer(bit_kind), dav_det, (N_int, 2, dav_size) ] -END_PROVIDER - - -BEGIN_PROVIDER [ double precision, dav_ut, (N_states_diag, dav_size) ] + BEGIN_PROVIDER [ integer(bit_kind), dav_det, (N_int, 2, dav_size) ] +&BEGIN_PROVIDER [ double precision, dav_ut, (N_states_diag, dav_size) ] + use bitmasks + implicit none + BEGIN_DOC +! Temporary arrays for parallel davidson +! +! Touched in davidson_miniserver_get + END_DOC + dav_det = 0_bit_kind + dav_ut = -huge(1.d0) END_PROVIDER BEGIN_PROVIDER [ integer, dav_size ] + implicit none + BEGIN_DOC +! Size of the arrays for Davidson +! +! Touched in davidson_miniserver_get + END_DOC + dav_size = 1 END_PROVIDER diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 6b3f2782..8473e745 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -56,10 +56,10 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) integer :: N_st_8 integer, external :: align_double - !!!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut + !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut if(N_st /= N_states_diag) stop "H_u_0_nstates N_st /= N_states_diag" - N_st_8 = N_states_diag ! align_double(N_st) + N_st_8 = align_double(N_st) ASSERT (Nint > 0) ASSERT (Nint == N_int) @@ -165,7 +165,7 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) v_0(i,istate) += H_jj(i) * u_0(i,istate) enddo enddo - !deallocate (shortcut, sort_idx, sorted, version, ut) + deallocate (shortcut, sort_idx, sorted, version, ut) end BEGIN_PROVIDER [ double precision, psi_energy, (N_states) ] @@ -210,12 +210,12 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) integer, external :: align_double integer :: workload, blockb, blocke - !!!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut +! !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut integer(ZMQ_PTR) :: handler if(N_st /= N_states_diag .or. sze_8 < N_det) stop "assert fail in H_S2_u_0_nstates" - N_st_8 = N_st !! align_double(N_st) + N_st_8 = N_st ! align_double(N_st) ASSERT (Nint > 0) ASSERT (Nint == N_int) @@ -228,8 +228,6 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) v_0 = 0.d0 s_0 = 0.d0 - if(n /= N_det) stop "n /= N_det" - do i=1,n do istate=1,N_st ut(istate,i) = u_0(i,istate) @@ -238,15 +236,10 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) - dav_size = n - touch dav_size - dav_det = psi_det - dav_ut = ut - workload = 0 blockb = shortcut(0,1) blocke = blockb - call davidson_init(handler) + call davidson_init(handler,n,N_st_8,ut) do sh=shortcut(0,1),1,-1 workload += (shortcut(sh+1,1) - shortcut(sh,1))**2 if(workload > 100000) then @@ -258,7 +251,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) enddo if(blockb > 0) call davidson_add_task(handler, 1, blockb) - call davidson_run(handler, v_0, s_0) + call davidson_run(handler, v_0, s_0, size(v_0,1)) !$OMP PARALLEL DEFAULT(NONE) & !$OMP PRIVATE(i,hij,s2,j,k,jj,vt,st,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& @@ -284,8 +277,8 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) do istate=1,n_st vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) - st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) - st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) + st (istate,org_i) = st (istate,org_i) + s2 *ut(istate,org_j) + st (istate,org_j) = st (istate,org_j) + s2 *ut(istate,org_i) enddo end if end do @@ -295,7 +288,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) !$OMP CRITICAL do istate=1,N_st - do i=n,1,-1 + do i=1,n v_0(i,istate) = v_0(i,istate) + vt(istate,i) s_0(i,istate) = s_0(i,istate) + st(istate,i) enddo From a10c1f144b9ce119d6f73664de4c9b640f59539b Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 7 Oct 2016 12:27:30 +0200 Subject: [PATCH 180/216] Allow fci_zmq to select 0 determinants for PT2 --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index 42337258..038fd584 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -89,7 +89,7 @@ program fci_zmq threshold_selectors = 1.d0 threshold_generators = 0.9999d0 E_CI_before(1:N_states) = CI_energy(1:N_states) - call ZMQ_selection(1, pt2) + call ZMQ_selection(0, pt2) print *, 'Final step' print *, 'N_det = ', N_det print *, 'N_states = ', N_states @@ -108,7 +108,7 @@ end -subroutine ZMQ_selection(N, pt2) +subroutine ZMQ_selection(N_in, pt2) use f77_zmq use selection_types @@ -116,13 +116,14 @@ subroutine ZMQ_selection(N, pt2) character*(512) :: task integer(ZMQ_PTR) :: zmq_to_qp_run_socket - integer, intent(in) :: N + integer, intent(in) :: N_in type(selection_buffer) :: b - integer :: i + integer :: i, N integer, external :: omp_get_thread_num double precision, intent(out) :: pt2(N_states) + N = max(N_in,1) provide nproc provide ci_electronic_energy call new_parallel_job(zmq_to_qp_run_socket,"selection") @@ -147,16 +148,18 @@ subroutine ZMQ_selection(N, pt2) if (i==0) then call selection_collector(b, pt2) else - call selection_dressing_slave_inproc(i) + call selection_slave_inproc(i) endif !$OMP END PARALLEL call end_parallel_job(zmq_to_qp_run_socket, 'selection') - call fill_H_apply_buffer_no_selection(b%cur,b%det,N_int,0) !!! PAS DE ROBIN - call copy_H_apply_buffer_to_wf() + if (N_in > 0) then + call fill_H_apply_buffer_no_selection(b%cur,b%det,N_int,0) !!! PAS DE ROBIN + call copy_H_apply_buffer_to_wf() + endif end subroutine -subroutine selection_dressing_slave_inproc(i) +subroutine selection_slave_inproc(i) implicit none integer, intent(in) :: i From 77015118d749868ca814dd4149ac1bba42e2d0a8 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 7 Oct 2016 14:14:26 +0200 Subject: [PATCH 181/216] beta-beta now distributed in davidson --- src/Davidson/davidson_parallel.irp.f | 35 +++++++++++++++++++ src/Davidson/u0Hu0.irp.f | 52 ++-------------------------- 2 files changed, 37 insertions(+), 50 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 6935256e..1bf9baae 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -74,6 +74,41 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) enddo enddo enddo + + do sh=blockb,min(blocke, shortcut_(0,2)) + do sh2=sh, shortcut_(0,2), shortcut_(0,1) + do i=shortcut_(sh2,2),shortcut_(sh2+1,2)-1 + org_i = sort_idx_(i,2) + do j=shortcut_(sh2,2),i-1 + org_j = sort_idx_(j,2) + ext = 0 + do ni=1,N_int + ext = ext + popcnt(xor(sorted_(ni,i,2), sorted_(ni,j,2))) + end do + if(ext == 4) then + call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) + call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) + if(.not. wrotten(org_i)) then + wrotten(org_i) = .true. + vt (:,org_i) = 0d0 + st (:,org_i) = 0d0 + end if + if(.not. wrotten(org_j)) then + wrotten(org_j) = .true. + vt (:,org_j) = 0d0 + st (:,org_j) = 0d0 + end if + do istate=1,N_states_diag + vt (istate,org_i) = vt (istate,org_i) + hij*dav_ut(istate,org_j) + vt (istate,org_j) = vt (istate,org_j) + hij*dav_ut(istate,org_i) + st (istate,org_i) = st (istate,org_i) + s2*dav_ut(istate,org_j) + st (istate,org_j) = st (istate,org_j) + s2*dav_ut(istate,org_i) + enddo + end if + end do + end do + enddo + enddo N = 0 do i=1, dav_size diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 6b3f2782..ce9295d7 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -196,7 +196,6 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) double precision, intent(in) :: H_jj(n), S2_jj(n) integer(bit_kind),intent(in) :: keys_tmp(Nint,2,n) double precision :: hij,s2 - double precision, allocatable :: vt(:,:), st(:,:) double precision, allocatable :: ut(:,:) integer :: i,j,k,l, jj,ii integer :: i0, j0 @@ -210,7 +209,6 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) integer, external :: align_double integer :: workload, blockb, blocke - !!!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut integer(ZMQ_PTR) :: handler @@ -235,8 +233,8 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) ut(istate,i) = u_0(i,istate) enddo enddo - call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) - call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) + call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) + call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) dav_size = n touch dav_size @@ -260,50 +258,6 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) if(blockb > 0) call davidson_add_task(handler, 1, blockb) call davidson_run(handler, v_0, s_0) - !$OMP PARALLEL DEFAULT(NONE) & - !$OMP PRIVATE(i,hij,s2,j,k,jj,vt,st,ii,sh,sh2,ni,exa,ext,org_i,org_j,endi,sorted_i,istate)& - !$OMP SHARED(n,keys_tmp,ut,Nint,v_0,s_0,sorted,shortcut,sort_idx,version,N_st,N_st_8) - - allocate(vt(N_st_8,n),st(N_st_8,n)) - Vt = 0.d0 - St = 0.d0 - - !$OMP DO SCHEDULE(dynamic) - do sh=1,shortcut(0,2) - do i=shortcut(sh,2),shortcut(sh+1,2)-1 - org_i = sort_idx(i,2) - do j=shortcut(sh,2),i-1 - org_j = sort_idx(j,2) - ext = 0 - do ni=1,Nint - ext = ext + popcnt(xor(sorted(ni,i,2), sorted(ni,j,2))) - end do - if(ext == 4) then - call i_h_j (keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,hij) - call get_s2(keys_tmp(1,1,org_j),keys_tmp(1,1,org_i),nint,s2) - do istate=1,n_st - vt (istate,org_i) = vt (istate,org_i) + hij*ut(istate,org_j) - vt (istate,org_j) = vt (istate,org_j) + hij*ut(istate,org_i) - st (istate,org_i) = st (istate,org_i) + s2*ut(istate,org_j) - st (istate,org_j) = st (istate,org_j) + s2*ut(istate,org_i) - enddo - end if - end do - end do - enddo - !$OMP END DO NOWAIT - - !$OMP CRITICAL - do istate=1,N_st - do i=n,1,-1 - v_0(i,istate) = v_0(i,istate) + vt(istate,i) - s_0(i,istate) = s_0(i,istate) + st(istate,i) - enddo - enddo - !$OMP END CRITICAL - - deallocate(vt,st) - !$OMP END PARALLEL do istate=1,N_st do i=1,n @@ -311,7 +265,5 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) s_0(i,istate) = s_0(i,istate) + s2_jj(i)* u_0(i,istate) enddo enddo - - deallocate (shortcut, sort_idx, sorted, version) end From 2b5c93a58aea879ea64ba8803fe34185678580ef Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 7 Oct 2016 19:21:04 +0200 Subject: [PATCH 182/216] Fixed tests --- plugins/FOBOCI/H_apply_dressed_autonom.irp.f | 4 +- plugins/FOBOCI/NEEDED_CHILDREN_MODULES | 2 +- plugins/FOBOCI/hcc_1h1p.irp.f | 7 +- plugins/MRCC_CASSD/.gitignore | 34 --- plugins/MRCC_CASSD/EZFIO.cfg | 17 -- plugins/MRCC_CASSD/NEEDED_CHILDREN_MODULES | 1 - plugins/MRCC_CASSD/README.rst | 80 -------- plugins/MRCC_CASSD/mrcc_cassd.irp.f | 120 ----------- plugins/MRCC_CASSD/mrcc_noiter.irp.f | 91 -------- plugins/MRCC_CASSD/tree_dependency.png | Bin 146992 -> 0 bytes plugins/QmcChem/dressed_dmc.irp.f | 2 +- plugins/Selectors_full/zmq.irp.f | 2 +- plugins/mrcepa0/EZFIO.cfg | 28 +++ plugins/mrcepa0/mrcepa0_general.irp.f | 12 +- src/Davidson/diagonalize_CI_SC2.irp.f | 62 ------ tests/bats/cassd.bats | 17 ++ tests/bats/common.bats.sh | 44 ++++ tests/bats/convert.bats | 27 +++ tests/bats/fci.bats | 52 +++++ tests/bats/foboci.bats | 27 +++ tests/bats/hf.bats | 52 +++++ tests/bats/mrcepa0.bats | 70 +++++++ tests/bats/pseudo.bats | 53 +++++ tests/bats/qp.bats | 205 ------------------- tests/bats_to_sh.py | 4 +- tests/run_tests.sh | 39 +++- 26 files changed, 418 insertions(+), 634 deletions(-) delete mode 100644 plugins/MRCC_CASSD/.gitignore delete mode 100644 plugins/MRCC_CASSD/EZFIO.cfg delete mode 100644 plugins/MRCC_CASSD/NEEDED_CHILDREN_MODULES delete mode 100644 plugins/MRCC_CASSD/README.rst delete mode 100644 plugins/MRCC_CASSD/mrcc_cassd.irp.f delete mode 100644 plugins/MRCC_CASSD/mrcc_noiter.irp.f delete mode 100644 plugins/MRCC_CASSD/tree_dependency.png delete mode 100644 src/Davidson/diagonalize_CI_SC2.irp.f create mode 100644 tests/bats/cassd.bats create mode 100644 tests/bats/common.bats.sh create mode 100644 tests/bats/convert.bats create mode 100644 tests/bats/fci.bats create mode 100644 tests/bats/foboci.bats create mode 100644 tests/bats/hf.bats create mode 100644 tests/bats/mrcepa0.bats create mode 100644 tests/bats/pseudo.bats delete mode 100644 tests/bats/qp.bats diff --git a/plugins/FOBOCI/H_apply_dressed_autonom.irp.f b/plugins/FOBOCI/H_apply_dressed_autonom.irp.f index 69929afd..abe6ef2e 100644 --- a/plugins/FOBOCI/H_apply_dressed_autonom.irp.f +++ b/plugins/FOBOCI/H_apply_dressed_autonom.irp.f @@ -273,7 +273,7 @@ subroutine H_apply_dressed_pert_monoexc(key_in, hole_1,particl_1,i_generator,ipr integer,parameter :: size_max = 3072 integer, intent(in) :: Ndet_generators - double precision, intent(in) :: E_ref + double precision, intent(inout) :: E_ref double precision, intent(inout) :: delta_ij_generators_(Ndet_generators,Ndet_generators) integer(bit_kind), intent(in) :: psi_det_generators_input(N_int,2,Ndet_generators) @@ -438,7 +438,7 @@ subroutine H_apply_dressed_pert(delta_ij_generators_, Ndet_generators,psi_det_g integer, intent(in) :: Ndet_generators - double precision, intent(in) :: E_ref + double precision, intent(inout) :: E_ref double precision, intent(inout) :: delta_ij_generators_(Ndet_generators,Ndet_generators) integer(bit_kind), intent(in) :: psi_det_generators_input(N_int,2,Ndet_generators) diff --git a/plugins/FOBOCI/NEEDED_CHILDREN_MODULES b/plugins/FOBOCI/NEEDED_CHILDREN_MODULES index e40934be..16fce081 100644 --- a/plugins/FOBOCI/NEEDED_CHILDREN_MODULES +++ b/plugins/FOBOCI/NEEDED_CHILDREN_MODULES @@ -1 +1 @@ -Perturbation Selectors_no_sorted Hartree_Fock Davidson +Perturbation Selectors_no_sorted Hartree_Fock Davidson CISD diff --git a/plugins/FOBOCI/hcc_1h1p.irp.f b/plugins/FOBOCI/hcc_1h1p.irp.f index 66cf2fd4..bad073db 100644 --- a/plugins/FOBOCI/hcc_1h1p.irp.f +++ b/plugins/FOBOCI/hcc_1h1p.irp.f @@ -15,11 +15,10 @@ subroutine routine call diagonalize_CI call test_hcc call test_mulliken -! call SC2_1h1p(psi_det,psi_coef,energies, & -! diag_H_elements,size(psi_coef,1),N_det,N_states_diag,N_int,threshold_convergence_SC2) allocate(H_matrix(N_det,N_det)) - call SC2_1h1p_full(psi_det,psi_coef,energies, & - H_matrix,size(psi_coef,1),N_det,N_states_diag,N_int,threshold_convergence_SC2) + stop 'SC2_1h1p_full is not in the git!' +! call SC2_1h1p_full(psi_det,psi_coef,energies, & +! H_matrix,size(psi_coef,1),N_det,N_states_diag,N_int,threshold_convergence_SC2) deallocate(H_matrix) integer :: i,j double precision :: accu,coef_hf diff --git a/plugins/MRCC_CASSD/.gitignore b/plugins/MRCC_CASSD/.gitignore deleted file mode 100644 index 97bd070c..00000000 --- a/plugins/MRCC_CASSD/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# Automatically created by $QP_ROOT/scripts/module/module_handler.py -.ninja_deps -.ninja_log -AO_Basis -Bitmask -Determinants -Electrons -Ezfio_files -Generators_full -Hartree_Fock -IRPF90_man -IRPF90_temp -Integrals_Bielec -Integrals_Monoelec -MOGuess -MO_Basis -MRCC_Utils -Makefile -Makefile.depend -Nuclei -Perturbation -Properties -Pseudo -Psiref_CAS -Psiref_Utils -Selectors_full -Utils -ZMQ -ezfio_interface.irp.f -irpf90.make -irpf90_entities -mrcc_cassd -mrcc_noiter -tags \ No newline at end of file diff --git a/plugins/MRCC_CASSD/EZFIO.cfg b/plugins/MRCC_CASSD/EZFIO.cfg deleted file mode 100644 index 17ee7f29..00000000 --- a/plugins/MRCC_CASSD/EZFIO.cfg +++ /dev/null @@ -1,17 +0,0 @@ -[energy] -type: double precision -doc: Calculated energy -interface: ezfio - -[thresh_mrcc] -type: Threshold -doc: Threshold on the convergence of the MRCC energy -interface: ezfio,provider,ocaml -default: 1.e-5 - -[n_it_mrcc_max] -type: Strictly_positive_int -doc: Maximum number of MRCC iterations -interface: ezfio,provider,ocaml -default: 10 - diff --git a/plugins/MRCC_CASSD/NEEDED_CHILDREN_MODULES b/plugins/MRCC_CASSD/NEEDED_CHILDREN_MODULES deleted file mode 100644 index a8404d62..00000000 --- a/plugins/MRCC_CASSD/NEEDED_CHILDREN_MODULES +++ /dev/null @@ -1 +0,0 @@ -Perturbation Selectors_full Generators_full Psiref_CAS MRCC_Utils diff --git a/plugins/MRCC_CASSD/README.rst b/plugins/MRCC_CASSD/README.rst deleted file mode 100644 index 0e38fe4c..00000000 --- a/plugins/MRCC_CASSD/README.rst +++ /dev/null @@ -1,80 +0,0 @@ -=========== -MRCC Module -=========== - -MRCC as a coupled cluster on a CAS+SD wave function. - -Needed Modules -============== - -.. Do not edit this section. It was auto-generated from the -.. by the `update_README.py` script. - -.. image:: tree_dependency.png - -* `Perturbation `_ -* `Selectors_full `_ -* `Generators_full `_ -* `Psiref_CAS `_ -* `MRCC_Utils `_ - -Documentation -============= - -.. Do not edit this section. It was auto-generated from the -.. by the `update_README.py` script. - -`mrcc `_ - Undocumented - - -`print_cas_coefs `_ - Undocumented - -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_CAS `_ -* `MRCC_Utils `_ - -Documentation -============= -.. Do not edit this section It was auto-generated -.. by the `update_README.py` script. - - -`mrcc `_ - Undocumented - - -`mrcc_noiter `_ - Undocumented - - -`n_it_mrcc_max `_ - Maximum number of MRCC iterations - - -`print_cas_coefs `_ - Undocumented - - -`run `_ - Undocumented - - -`run_pt2 `_ - Undocumented - - -`thresh_mrcc `_ - Threshold on the convergence of the MRCC energy - diff --git a/plugins/MRCC_CASSD/mrcc_cassd.irp.f b/plugins/MRCC_CASSD/mrcc_cassd.irp.f deleted file mode 100644 index 4fef815d..00000000 --- a/plugins/MRCC_CASSD/mrcc_cassd.irp.f +++ /dev/null @@ -1,120 +0,0 @@ -program mrcc - implicit none - double precision, allocatable :: energy(:) - allocate (energy(N_states)) - - read_wf = .True. - SOFT_TOUCH read_wf - call print_cas_coefs - call set_generators_bitmasks_as_holes_and_particles - call run(N_states,energy) - if(do_pt2_end)then - call run_pt2(N_states,energy) - endif - deallocate(energy) -end - -subroutine run(N_st,energy) - implicit none - - integer, intent(in) :: N_st - double precision, intent(out) :: energy(N_st) - - integer :: i - - double precision :: E_new, E_old, delta_e - integer :: iteration - double precision :: E_past(4), lambda - E_new = 0.d0 - delta_E = 1.d0 - iteration = 0 - lambda = 1.d0 - do while (delta_E > thresh_mrcc) - iteration += 1 - print *, '===========================' - print *, 'MRCC Iteration', iteration - print *, '===========================' - print *, '' - E_old = sum(ci_energy_dressed(1:N_st)) - call write_double(6,ci_energy_dressed(1),"MRCC energy") - call diagonalize_ci_dressed(lambda) - E_new = sum(ci_energy_dressed(1:N_st)) - delta_E = dabs(E_new - E_old) - call save_wavefunction - call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) - if (iteration > n_it_mrcc_max) then - exit - endif - enddo - call write_double(6,ci_energy_dressed(1),"Final MRCC energy") - energy(1:N_st) = ci_energy_dressed(1:N_st) - -end - - -subroutine run_pt2(N_st,energy) - implicit none - integer :: i,j,k - double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) - integer, intent(in) :: N_st - double precision, intent(in) :: energy(N_st) - allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st)) - pt2 = 0.d0 - - print*,'Last iteration only to compute the PT2' - threshold_selectors = 1.d0 - threshold_generators = 0.999d0 - - N_det_generators = lambda_mrcc_pt2(0) + N_det_cas - do i=1,N_det_cas - do k=1,N_int - psi_det_generators(k,1,i) = psi_ref(k,1,i) - psi_det_generators(k,2,i) = psi_ref(k,2,i) - enddo - do k=1,N_st - psi_coef_generators(i,k) = psi_ref_coef(i,k) - enddo - enddo - do i=N_det_cas+1,N_det_generators - j = lambda_mrcc_pt2(i) - do k=1,N_int - psi_det_generators(k,1,i) = psi_non_ref(k,1,j) - psi_det_generators(k,2,i) = psi_non_ref(k,2,j) - enddo - do k=1,N_st - psi_coef_generators(i,k) = psi_non_ref_coef(j,k) - enddo - enddo - SOFT_TOUCH N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed - - - call H_apply_mrcc_PT2(pt2, norm_pert, H_pert_diag, N_st) - print *, 'Final step' - print *, 'N_det = ', N_det - print *, 'N_states = ', N_states - print *, 'PT2 = ', pt2 - print *, 'E = ', energy - print *, 'E+PT2 = ', energy+pt2 - print *, '-----' - - - call ezfio_set_full_ci_energy_pt2(energy+pt2) - deallocate(pt2,norm_pert) - -end - - -subroutine print_cas_coefs - implicit none - - integer :: i,j - print *, 'CAS' - print *, '===' - do i=1,N_det_cas - print *, psi_cas_coef(i,:) - call debug_det(psi_cas(1,1,i),N_int) - enddo - call write_double(6,ci_energy(1),"Initial CI energy") - -end - diff --git a/plugins/MRCC_CASSD/mrcc_noiter.irp.f b/plugins/MRCC_CASSD/mrcc_noiter.irp.f deleted file mode 100644 index 8d95cea9..00000000 --- a/plugins/MRCC_CASSD/mrcc_noiter.irp.f +++ /dev/null @@ -1,91 +0,0 @@ -program mrcc_noiter - implicit none - double precision, allocatable :: energy(:) - allocate (energy(N_states)) - read_wf = .True. - threshold_generators = .9999d0 - SOFT_TOUCH read_wf threshold_generators - call print_cas_coefs - call set_generators_bitmasks_as_holes_and_particles - call run(N_states,energy) - if(do_pt2_end)then - call run_pt2(N_states,energy) - endif - deallocate(energy) -end - -subroutine run(N_st,energy) - implicit none - - integer, intent(in) :: N_st - double precision, intent(out) :: energy(N_st) - integer :: i,j - do j=1,N_states_diag - do i=1,N_det - psi_coef(i,j) = CI_eigenvectors_dressed(i,j) - enddo - enddo - SOFT_TOUCH psi_coef ci_energy_dressed - call write_double(6,ci_energy_dressed(1),"Final MRCC energy") - call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) - call save_wavefunction - energy(:) = ci_energy_dressed(:) -end - - -subroutine run_pt2(N_st,energy) - implicit none - integer :: i,j,k - double precision, allocatable :: pt2(:), norm_pert(:), H_pert_diag(:) - integer, intent(in) :: N_st - double precision, intent(in) :: energy(N_st) - allocate (pt2(N_st), norm_pert(N_st),H_pert_diag(N_st)) - pt2 = 0.d0 - - print*,'Last iteration only to compute the PT2' - threshold_selectors = 1.d0 - threshold_generators = 0.999d0 - - N_det_generators = lambda_mrcc_pt2(0) - do i=1,N_det_generators - j = lambda_mrcc_pt2(i) - do k=1,N_int - psi_det_generators(k,1,i) = psi_non_ref(k,1,j) - psi_det_generators(k,2,i) = psi_non_ref(k,2,j) - enddo - do k=1,N_st - psi_coef_generators(i,k) = psi_non_ref_coef(j,k) - enddo - enddo - SOFT_TOUCH N_det_generators psi_det_generators psi_coef_generators ci_eigenvectors_dressed ci_eigenvectors_s2_dressed ci_electronic_energy_dressed - - - call H_apply_mrcc_PT2(pt2, norm_pert, H_pert_diag, N_st) - print *, 'Final step' - print *, 'N_det = ', N_det - print *, 'N_states = ', N_states - print *, 'PT2 = ', pt2 - print *, 'E = ', energy - print *, 'E+PT2 = ', energy+pt2 - print *, '-----' - - call ezfio_set_full_ci_energy_pt2(energy+pt2) - deallocate(pt2,norm_pert) - -end - - -subroutine print_cas_coefs - implicit none - - integer :: i,j - print *, 'CAS' - print *, '===' - do i=1,N_det_cas - print *, psi_cas_coef(i,:) - call debug_det(psi_cas(1,1,i),N_int) - enddo - call write_double(6,ci_energy(1),"Initial CI energy") - -end - diff --git a/plugins/MRCC_CASSD/tree_dependency.png b/plugins/MRCC_CASSD/tree_dependency.png deleted file mode 100644 index e73ff16588824e00b433bf7d4d8f93720b88d85b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146992 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 G 0) then N_det_selectors = N_det_selectors_read endif - SOFT_TOUCH psi_det psi_coef N_det_selectors N_det_generators + SOFT_TOUCH psi_det psi_coef N_det_selectors N_det_generators psi_coef_generators psi_det_generators end diff --git a/plugins/mrcepa0/EZFIO.cfg b/plugins/mrcepa0/EZFIO.cfg index 7580f028..d792390d 100644 --- a/plugins/mrcepa0/EZFIO.cfg +++ b/plugins/mrcepa0/EZFIO.cfg @@ -3,3 +3,31 @@ type: Positive_int doc: lambda type interface: ezfio,provider,ocaml default: 0 + +[energy] +type: double precision +doc: Calculated energy +interface: ezfio + +[energy_pt2] +type: double precision +doc: Calculated energy with PT2 contribution +interface: ezfio + +[energy] +type: double precision +doc: Calculated energy +interface: ezfio + +[thresh_dressed_ci] +type: Threshold +doc: Threshold on the convergence of the dressed CI energy +interface: ezfio,provider,ocaml +default: 1.e-4 + +[n_it_max_dressed_ci] +type: Strictly_positive_int +doc: Maximum number of dressed CI iterations +interface: ezfio,provider,ocaml +default: 10 + diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index b82bc613..1e7ad68d 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -17,8 +17,8 @@ subroutine run(N_st,energy) - thresh_mrcc = 1d-7 - n_it_mrcc_max = 10 + thresh_mrcc = thresh_dressed_ci + n_it_mrcc_max = n_it_max_dressed_ci if(n_it_mrcc_max == 1) then do j=1,N_states_diag @@ -48,8 +48,8 @@ subroutine run(N_st,energy) E_new = sum(ci_energy_dressed) delta_E = dabs(E_new - E_old) call save_wavefunction - call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) - if (iteration > n_it_mrcc_max) then + call ezfio_set_mrcepa0_energy(ci_energy_dressed(1)) + if (iteration >= n_it_mrcc_max) then exit endif enddo @@ -184,7 +184,7 @@ subroutine run_pt2_old(N_st,energy) print *, '-----' -! call ezfio_set_full_ci_energy_pt2(energy+pt2) + call ezfio_set_mrcepa0_energy_pt2(energy(1)+pt2(1)) end @@ -238,5 +238,7 @@ subroutine run_pt2(N_st,energy) print *, 'E+PT2 = ', energy+pt2 print *, '-----' + call ezfio_set_mrcepa0_energy_pt2(energy(1)+pt2(1)) + end diff --git a/src/Davidson/diagonalize_CI_SC2.irp.f b/src/Davidson/diagonalize_CI_SC2.irp.f deleted file mode 100644 index 498792d9..00000000 --- a/src/Davidson/diagonalize_CI_SC2.irp.f +++ /dev/null @@ -1,62 +0,0 @@ -BEGIN_PROVIDER [ double precision, CI_SC2_energy, (N_states_diag) ] - implicit none - BEGIN_DOC - ! N_states_diag lowest eigenvalues of the CI matrix - END_DOC - - integer :: j - character*(8) :: st - call write_time(output_determinants) - do j=1,N_states_diag - CI_SC2_energy(j) = CI_SC2_electronic_energy(j) + nuclear_repulsion - write(st,'(I4)') j - call write_double(output_determinants,CI_SC2_energy(j),'Energy of state '//trim(st)) - enddo - -END_PROVIDER - - BEGIN_PROVIDER [ double precision, threshold_convergence_SC2] - implicit none - BEGIN_DOC - ! convergence of the correlation energy of SC2 iterations - END_DOC - threshold_convergence_SC2 = 1.d-10 - - END_PROVIDER - - BEGIN_PROVIDER [ double precision, CI_SC2_electronic_energy, (N_states_diag) ] -&BEGIN_PROVIDER [ double precision, CI_SC2_eigenvectors, (N_det,N_states_diag) ] -&BEGIN_PROVIDER [ double precision, Diag_H_elements_SC2, (N_det) ] - implicit none - BEGIN_DOC - ! Eigenvectors/values of the CI matrix - END_DOC - integer :: i,j - - do j=1,N_states_diag - do i=1,N_det - CI_SC2_eigenvectors(i,j) = psi_coef(i,j) - enddo - CI_SC2_electronic_energy(j) = CI_electronic_energy(j) - enddo - - call CISD_SC2(psi_det,CI_SC2_eigenvectors,CI_SC2_electronic_energy, & -! size(CI_SC2_eigenvectors,1),N_det,N_states_diag,N_int,threshold_convergence_SC2) - diag_H_elements_SC2,size(CI_SC2_eigenvectors,1),N_det,N_states_diag,N_int,threshold_convergence_SC2) -END_PROVIDER - -subroutine diagonalize_CI_SC2 - implicit none - BEGIN_DOC -! Replace the coefficients of the CI states_diag by the coefficients of the -! eigenstates of the CI matrix - END_DOC - integer :: i,j - do j=1,N_states_diag - do i=1,N_det - psi_coef(i,j) = CI_SC2_eigenvectors(i,j) - enddo - enddo - SOFT_TOUCH psi_coef CI_SC2_electronic_energy CI_SC2_energy CI_SC2_eigenvectors diag_h_elements_sc2 -! SOFT_TOUCH psi_coef CI_SC2_electronic_energy CI_SC2_energy CI_SC2_eigenvectors -end diff --git a/tests/bats/cassd.bats b/tests/bats/cassd.bats new file mode 100644 index 00000000..a21b58ac --- /dev/null +++ b/tests/bats/cassd.bats @@ -0,0 +1,17 @@ +#!/usr/bin/env bats + +source $QP_ROOT/tests/bats/common.bats.sh + +@test "CAS_SD H2O cc-pVDZ" { + test_exe cas_sd_selected || skip + INPUT=h2o.ezfio + qp_edit -c $INPUT + ezfio set_file $INPUT + ezfio set perturbation do_pt2_end False + ezfio set determinants n_det_max 1000 + qp_set_mo_class $INPUT -core "[1]" -inact "[2,5]" -act "[3,4,6,7]" -virt "[8-24]" + qp_run cas_sd_selected $INPUT + energy="$(ezfio get cas_sd energy)" + eq $energy -76.22213389282479 1.E-5 +} + diff --git a/tests/bats/common.bats.sh b/tests/bats/common.bats.sh new file mode 100644 index 00000000..2aaff591 --- /dev/null +++ b/tests/bats/common.bats.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bats + +# floating point number comparison +# Compare two numbers ($1, $2) with a given precision ($3) +# If the numbers are not equal, the exit code is 1 else it is 0 +# So we strip the "-", is the abs value of the poor +function eq() { + declare -a diff + diff=($(awk -v d1=$1 -v d2=$2 -v n1=${1#-} -v n2=${2#-} -v p=$3 'BEGIN{ if ((n1-n2)^2 < p^2) print 0; print 1 " " (d1-d2) " " d1 " " d2 }')) + if [[ "${diff[0]}" == "0" ]] + then + return 0 + else + echo "Test : " ${BATS_TEST_DESCRIPTION} + echo "Error : " ${diff[1]} + echo "Reference : " ${diff[3]} + echo "Computed : " ${diff[2]} + exit 1 + fi +} + + +# ___ +# | ._ o _|_ +# _|_ | | | |_ +# +source ${QP_ROOT}/install/EZFIO/Bash/ezfio.sh +TEST_DIR=${QP_ROOT}/tests/work/ + +mkdir -p "${TEST_DIR}" + +cd "${TEST_DIR}" || exit 1 + +function test_exe() { + l_EXE=$(awk "/^$1 / { print \$2 }" < "${QP_ROOT}"/data/executables) + l_EXE=$(echo $l_EXE | sed "s|\$QP_ROOT|$QP_ROOT|") + if [[ -x "$l_EXE" ]] + then + return 0 + else + return 127 + fi +} + diff --git a/tests/bats/convert.bats b/tests/bats/convert.bats new file mode 100644 index 00000000..a1fbd7ce --- /dev/null +++ b/tests/bats/convert.bats @@ -0,0 +1,27 @@ +#!/usr/bin/env bats + +source $QP_ROOT/tests/bats/common.bats.sh + +#=== Convert +@test "gamess convert HBO.out" { + cp ${QP_ROOT}/tests/input/HBO.out . + qp_convert_output_to_ezfio.py HBO.out + qp_edit -c HBO.out.ezfio + ezfio set_file HBO.out.ezfio + qp_run SCF HBO.out.ezfio + # Check energy + energy="$(ezfio get hartree_fock energy)" + eq $energy -100.0185822590964 1.e-10 +} + +@test "g09 convert H2O.log" { + cp ${QP_ROOT}/tests/input/h2o.log . + qp_convert_output_to_ezfio.py h2o.log + qp_edit -c h2o.log.ezfio + ezfio set_file h2o.log.ezfio + qp_run SCF h2o.log.ezfio + # Check energy + energy="$(ezfio get hartree_fock energy)" + eq $energy -76.0270218704265 1E-10 +} + diff --git a/tests/bats/fci.bats b/tests/bats/fci.bats new file mode 100644 index 00000000..174c8f61 --- /dev/null +++ b/tests/bats/fci.bats @@ -0,0 +1,52 @@ +#!/usr/bin/env bats + +source $QP_ROOT/tests/bats/common.bats.sh + +function run_FCI() { + thresh=5.e-5 + test_exe full_ci || skip + qp_edit -c $1 + ezfio set_file $1 + ezfio set perturbation do_pt2_end True + ezfio set determinants n_det_max $2 + ezfio set davidson threshold_davidson 1.e-10 + + qp_run full_ci $1 + energy="$(ezfio get full_ci energy)" + eq $energy $3 $thresh + energy_pt2="$(ezfio get full_ci energy_pt2)" + eq $energy_pt2 $4 $thresh +} + +function run_FCI_ZMQ() { + thresh=5.e-5 + test_exe full_ci || skip + qp_edit -c $1 + ezfio set_file $1 + ezfio set perturbation do_pt2_end True + ezfio set determinants n_det_max $2 + ezfio set davidson threshold_davidson 1.e-10 + + qp_run fci_zmq $1 + energy="$(ezfio get full_ci energy)" + eq $energy $3 $thresh + energy_pt2="$(ezfio get full_ci energy_pt2)" + eq $energy_pt2 $4 $thresh +} + + + +#=== H2O + +@test "qp_set_mo_class H2O cc-pVDZ" { + qp_set_mo_class h2o.ezfio -core "[1]" -act "[2-12]" -del "[13-24]" +} +@test "FCI H2O cc-pVDZ" { + run_FCI h2o.ezfio 2000 -0.761255633582109E+02 -0.761258377850042E+02 +} + +@test "FCI-ZMQ H2O cc-pVDZ" { + run_FCI_ZMQ h2o.ezfio 2000 -0.761255633582109E+02 -0.761258377850042E+02 +} + + diff --git a/tests/bats/foboci.bats b/tests/bats/foboci.bats new file mode 100644 index 00000000..98255969 --- /dev/null +++ b/tests/bats/foboci.bats @@ -0,0 +1,27 @@ +#!/usr/bin/env bats + +source $QP_ROOT/tests/bats/common.bats.sh + +function run_all_1h_1p() { + thresh=1.e-6 + test_exe all_1h_1p || skip + qp_edit -c $1 + ezfio set_file $1 + ezfio set determinants n_det_max $2 + ezfio set perturbation pt2_max $3 + ezfio set davidson threshold_davidson 1.e-10 + + qp_run all_1h_1p $1 | tee $1.F1h1p.out + energy="$(ezfio get all_singles energy)" + eq $energy $4 $thresh +} + + +#=== DHNO + +@test "all_1h_1p DHNO chipman-dzp" { + qp_set_mo_class -inact "[1-8]" -act "[9]" -virt "[10-64]" dhno.ezfio + run_all_1h_1p dhno.ezfio 10000 0.0000000001 -130.4466283766202 +} + + diff --git a/tests/bats/hf.bats b/tests/bats/hf.bats new file mode 100644 index 00000000..e280c986 --- /dev/null +++ b/tests/bats/hf.bats @@ -0,0 +1,52 @@ +#!/usr/bin/env bats + +source $QP_ROOT/tests/bats/common.bats.sh + +function run_init() { + cp "${QP_ROOT}/tests/input/$1" . + qp_create_ezfio_from_xyz $1 -o $3 $2 + qp_edit -c $3 +} + + +function run_HF() { + thresh=1.e-7 + test_exe SCF || skip + qp_edit -c $1 + ezfio set_file $1 + ezfio set hartree_fock thresh_scf 1.e-11 + qp_run SCF $1 + energy="$(ezfio get hartree_fock energy)" + eq $energy $2 $thresh +} + + + +#=== DHNO +@test "init DHNO chipman-dzp" { + run_init dhno.xyz "-b chipman-dzp -m 2" dhno.ezfio +} + +@test "SCF DHNO chipman-dzp" { + run_HF dhno.ezfio -130.4278777822 +} + +#=== HBO +@test "init HBO STO-3G" { + run_init HBO.xyz "-b STO-3G" hbo.ezfio +} + +@test "SCF HBO STO-3G" { + run_HF hbo.ezfio -98.8251985678084 +} + + +#=== H2O +@test "init H2O cc-pVDZ" { + run_init h2o.xyz "-b cc-pvdz" h2o.ezfio +} + +@test "SCF H2O cc-pVDZ" { + run_HF h2o.ezfio -0.760270218692179E+02 +} + diff --git a/tests/bats/mrcepa0.bats b/tests/bats/mrcepa0.bats new file mode 100644 index 00000000..8b56c606 --- /dev/null +++ b/tests/bats/mrcepa0.bats @@ -0,0 +1,70 @@ +#!/usr/bin/env bats + +source $QP_ROOT/tests/bats/common.bats.sh + +#=== H2O +@test "MRCC-lambda H2O cc-pVDZ" { + INPUT=h2o.ezfio + EXE=mrcc + test_exe $EXE || skip + qp_edit -c $INPUT + ezfio set_file $INPUT + ezfio set determinants threshold_generators 1. + ezfio set determinants threshold_selectors 1. + ezfio set determinants read_wf True + ezfio set mrcepa0 lambda_type 1 + ezfio set mrcepa0 n_it_max_dressed_ci 3 + qp_run $EXE $INPUT + energy="$(ezfio get mrcepa0 energy)" + eq $energy -76.22903276183061 1.e-4 +} + +@test "MRCC H2O cc-pVDZ" { + INPUT=h2o.ezfio + EXE=mrcc + test_exe $EXE || skip + qp_edit -c $INPUT + ezfio set_file $INPUT + ezfio set determinants threshold_generators 1. + ezfio set determinants threshold_selectors 1. + ezfio set determinants read_wf True + ezfio set determinants read_wf True + ezfio set mrcepa0 lambda_type 0 + ezfio set mrcepa0 n_it_max_dressed_ci 3 + qp_run $EXE $INPUT + energy="$(ezfio get mrcepa0 energy)" + eq $energy -76.22899302846875 1.e-4 +} + +@test "MRSC2 H2O cc-pVDZ" { + INPUT=h2o.ezfio + EXE=mrsc2 + test_exe $EXE || skip + qp_edit -c $INPUT + ezfio set_file $INPUT + ezfio set determinants threshold_generators 1. + ezfio set determinants threshold_selectors 1. + ezfio set determinants read_wf True + ezfio set mrcepa0 lambda_type 0 + ezfio set mrcepa0 n_it_max_dressed_ci 3 + qp_run $EXE $INPUT + energy="$(ezfio get mrcepa0 energy)" + eq $energy -76.22647345292708 1.e-4 +} + +@test "MRCEPA0 H2O cc-pVDZ" { + INPUT=h2o.ezfio + EXE=mrcepa0 + test_exe $EXE || skip + qp_edit -c $INPUT + ezfio set_file $INPUT + ezfio set determinants threshold_generators 1. + ezfio set determinants threshold_selectors 1. + ezfio set determinants read_wf True + ezfio set mrcepa0 lambda_type 0 + ezfio set mrcepa0 n_it_max_dressed_ci 3 + qp_run $EXE $INPUT + energy="$(ezfio get mrcepa0 energy)" + eq $energy -76.23199784430074 1.e-4 +} + diff --git a/tests/bats/pseudo.bats b/tests/bats/pseudo.bats new file mode 100644 index 00000000..8cccf229 --- /dev/null +++ b/tests/bats/pseudo.bats @@ -0,0 +1,53 @@ +#!/usr/bin/env bats + +source $QP_ROOT/tests/bats/common.bats.sh + +function run_init() { + cp "${QP_ROOT}/tests/input/$1" . + qp_create_ezfio_from_xyz $1 -o $3 $2 + qp_edit -c $3 +} + + +function run_HF() { + thresh=1.e-7 + test_exe SCF || skip + qp_edit -c $1 + ezfio set_file $1 + ezfio set hartree_fock thresh_scf 1.e-11 + qp_run SCF $1 + energy="$(ezfio get hartree_fock energy)" + eq $energy $2 $thresh +} + + +function run_FCI_ZMQ() { + thresh=5.e-5 + test_exe full_ci || skip + qp_edit -c $1 + ezfio set_file $1 + ezfio set perturbation do_pt2_end True + ezfio set determinants n_det_max $2 + ezfio set davidson threshold_davidson 1.e-10 + + qp_run fci_zmq $1 + energy="$(ezfio get full_ci energy)" + eq $energy $3 $thresh + energy_pt2="$(ezfio get full_ci energy_pt2)" + eq $energy_pt2 $4 $thresh +} + +#=== H2O Pseudo +@test "init H2O VDZ pseudo" { + run_init h2o.xyz "-p bfd -b vdz-bfd" h2o_pseudo.ezfio +} + +@test "SCF H2O VDZ pseudo" { + run_HF h2o_pseudo.ezfio -16.9483703905461 +} + +@test "FCI H2O VDZ pseudo" { + qp_set_mo_class h2o_pseudo.ezfio -core "[1]" -act "[2-12]" -del "[13-23]" + run_FCI_ZMQ h2o_pseudo.ezfio 2000 -0.170399597228904E+02 -0.170400168816800E+02 +} + diff --git a/tests/bats/qp.bats b/tests/bats/qp.bats deleted file mode 100644 index aa283916..00000000 --- a/tests/bats/qp.bats +++ /dev/null @@ -1,205 +0,0 @@ -#!/usr/bin/env bats - -# -# |\/| o _ _ -# | | | _> (_ -# -# floating point number comparison -# Compare two numbers ($1, $2) with a given precision ($3) -# If the numbers are not equal, the exit code is 1 else it is 0 -# So we strip the "-", is the abs value of the poor -function eq() { - declare -a diff - diff=($(awk -v d1=$1 -v d2=$2 -v n1=${1#-} -v n2=${2#-} -v p=$3 'BEGIN{ if ((n1-n2)^2 < p^2) print 0; print 1 " " (d1-d2) " " d1 " " d2 }')) - if [[ "${diff[0]}" == "0" ]] - then - return 0 - else - echo "Test : " ${BATS_TEST_DESCRIPTION} - echo "Error : " ${diff[1]} - echo "Reference : " ${diff[3]} - echo "Computed : " ${diff[2]} - exit 1 - fi -} - - -# ___ -# | ._ o _|_ -# _|_ | | | |_ -# -source ${QP_ROOT}/install/EZFIO/Bash/ezfio.sh -TEST_DIR=${QP_ROOT}/tests/work/ - -mkdir -p "${TEST_DIR}" - -cd "${TEST_DIR}" || exit 1 - -function run_init() { - cp "${QP_ROOT}/tests/input/$1" . - qp_create_ezfio_from_xyz $1 -o $3 $2 - qp_edit -c $3 -} - -function test_exe() { - EXE=$(awk "/^$1 / { print \$2 }" < "${QP_ROOT}"/data/executables) - EXE=$(echo $EXE | sed "s|\$QP_ROOT|$QP_ROOT|") - if [[ -x "$EXE" ]] - then - return 0 - else - return 127 - fi -} - -function run_HF() { - thresh=1.e-7 - test_exe SCF || skip - ezfio set_file $1 - ezfio set hartree_fock thresh_scf 1.e-11 - qp_run SCF $1 - energy="$(ezfio get hartree_fock energy)" - eq $energy $2 $thresh -} - -function run_FCI() { - thresh=5.e-5 - test_exe full_ci || skip - ezfio set_file $1 - ezfio set perturbation do_pt2_end True - ezfio set determinants n_det_max $2 - ezfio set davidson threshold_davidson 1.e-10 - - qp_run full_ci $1 - energy="$(ezfio get full_ci energy)" - eq $energy $3 $thresh - energy_pt2="$(ezfio get full_ci energy_pt2)" - eq $energy_pt2 $4 $thresh -} - -function run_all_1h_1p() { - thresh=1.e-6 - test_exe all_1h_1p || skip - ezfio set_file $1 - ezfio set determinants n_det_max $2 - ezfio set perturbation pt2_max $3 - ezfio set davidson threshold_davidson 1.e-10 - - qp_run all_1h_1p $1 | tee $1.F1h1p.out - energy="$(ezfio get all_singles energy)" - eq $energy $4 $thresh -} - -# ___ -# | _ _ _|_ -# | (/_ _> |_ -# - - -#=== DHNO -@test "init DHNO chipman-dzp" { - run_init dhno.xyz "-b chipman-dzp -m 2" dhno.ezfio -} - -@test "SCF DHNO chipman-dzp" { - run_HF dhno.ezfio -130.4278777822 -} - -@test "all_1h_1p DHNO chipman-dzp" { - qp_set_mo_class -inact "[1-8]" -act "[9]" -virt "[10-64]" dhno.ezfio - run_all_1h_1p dhno.ezfio 10000 0.0000000001 -130.4466283766202 -} - -#=== HBO -@test "init HBO STO-3G" { - run_init HBO.xyz "-b STO-3G" hbo.ezfio -} - -@test "SCF HBO STO-3G" { - run_HF hbo.ezfio -98.8251985678084 -} - - -#=== H2O -@test "init H2O cc-pVDZ" { - run_init h2o.xyz "-b cc-pvdz" h2o.ezfio -} - -@test "SCF H2O cc-pVDZ" { - run_HF h2o.ezfio -0.760270218692179E+02 -} - -@test "FCI H2O cc-pVDZ" { - qp_set_mo_class h2o.ezfio -core "[1]" -act "[2-12]" -del "[13-24]" - run_FCI h2o.ezfio 2000 -0.761255633582109E+02 -0.761258377850042E+02 -} - -@test "CAS_SD H2O cc-pVDZ" { - test_exe cas_sd_selected || skip - INPUT=h2o.ezfio - ezfio set_file $INPUT - ezfio set perturbation do_pt2_end False - ezfio set determinants n_det_max 1000 - qp_set_mo_class $INPUT -core "[1]" -inact "[2,5]" -act "[3,4,6,7]" -virt "[8-24]" - qp_run cas_sd_selected $INPUT - energy="$(ezfio get cas_sd energy)" - eq $energy -0.762219854008117E+02 1.E-5 -} - -@test "MRCC H2O cc-pVDZ" { - test_exe mrcc_cassd || skip - INPUT=h2o.ezfio - ezfio set_file $INPUT - ezfio set determinants threshold_generators 1. - ezfio set determinants threshold_selectors 1. - ezfio set determinants read_wf True - qp_run mrcc_cassd $INPUT - energy="$(ezfio get mrcc_cassd energy)" - eq $energy -76.2288648023833 1.e-4 - -} - - -#=== H2O Pseudo -@test "init H2O VDZ pseudo" { - run_init h2o.xyz "-p bfd -b vdz-bfd" h2o_pseudo.ezfio -} - -@test "SCF H2O VDZ pseudo" { - run_HF h2o_pseudo.ezfio -16.9483703905461 -} - -@test "FCI H2O VDZ pseudo" { - qp_set_mo_class h2o_pseudo.ezfio -core "[1]" -act "[2-12]" -del "[13-23]" - run_FCI h2o_pseudo.ezfio 2000 -0.170399597228904E+02 -0.170400168816800E+02 -} - -#=== Convert -@test "gamess convert HBO.out" { - cp ${QP_ROOT}/tests/input/HBO.out . - qp_convert_output_to_ezfio.py HBO.out - ezfio set_file HBO.out.ezfio - qp_run SCF HBO.out.ezfio - # Check energy - energy="$(ezfio get hartree_fock energy)" - eq $energy -100.0185822590964 1.e-10 -} - -@test "g09 convert H2O.log" { - cp ${QP_ROOT}/tests/input/h2o.log . - qp_convert_output_to_ezfio.py h2o.log - ezfio set_file h2o.log.ezfio - qp_run SCF h2o.log.ezfio - # Check energy - energy="$(ezfio get hartree_fock energy)" - eq $energy -76.0270218704265 1E-10 -} - - -# TODO N_int = 1,2,3,4,5 -# TODO mod(64) MOs -# TODO All G2 SCF energies -# TODO Long and short tests -# TODO MP2 -# TODO CISD_selected - diff --git a/tests/bats_to_sh.py b/tests/bats_to_sh.py index 2c6b4a05..8feb9272 100755 --- a/tests/bats_to_sh.py +++ b/tests/bats_to_sh.py @@ -1,6 +1,8 @@ #!/usr/bin/env python -with open('bats/qp.bats','r') as f: +import sys + +with open(sys.argv[1],'r') as f: raw_data = f.read() output = [] diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 2436c60c..4664ce82 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -1,18 +1,39 @@ #!/bin/bash +LIST=" + +convert.bats +hf.bats +foboci.bats +pseudo.bats +fci.bats +cassd.bats +mrcepa0.bats + +" + + export QP_PREFIX="timeout -s 9 300" export QP_TASK_DEBUG=1 -BATS_FILE=bats/qp.bats - rm -rf work output -if [[ "$1" == "-v" ]] -then - echo "Verbose mode" - ./bats_to_sh.py $BATS_FILE | bash -else - bats $BATS_FILE -fi + +for BATS_FILE in $LIST +do + echo + echo "-~-~-~-~-~-~" + echo + echo "Running tests for ${BATS_FILE%.bats}" + echo + BATS_FILE=bats/$BATS_FILE + if [[ "$1" == "-v" ]] + then + echo "Verbose mode" + ./bats_to_sh.py $BATS_FILE | bash + else + bats $BATS_FILE + fi +done From fc90d61d5e00167f57e5972207dfdd0de72ffb2a Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 7 Oct 2016 19:51:08 +0200 Subject: [PATCH 183/216] Fixed H_u_0_nstates N_st /= N_states_diag --- plugins/MRCC_Utils/mrcc_utils.irp.f | 2 +- src/Davidson/u0Hu0.irp.f | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 7687b451..128c49d7 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -253,7 +253,7 @@ BEGIN_PROVIDER [ double precision, CI_energy_dressed, (N_states_diag) ] integer :: j character*(8) :: st call write_time(output_determinants) - do j=1,min(N_det,N_states_diag) + do j=1,min(N_det,N_states) write(st,'(I4)') j CI_energy_dressed(j) = CI_electronic_energy_dressed(j) + nuclear_repulsion call write_double(output_determinants,CI_energy_dressed(j),'Energy of state '//trim(st)) diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 8473e745..13ba2b46 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -58,7 +58,6 @@ subroutine H_u_0_nstates(v_0,u_0,H_jj,n,keys_tmp,Nint,N_st,sze_8) integer, external :: align_double !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: vt, ut - if(N_st /= N_states_diag) stop "H_u_0_nstates N_st /= N_states_diag" N_st_8 = align_double(N_st) ASSERT (Nint > 0) From 51406760cdede2d400a91ac518471373a2db774d Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 7 Oct 2016 19:55:09 +0200 Subject: [PATCH 184/216] Updated travis.yml file --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 18a13949..672e3370 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,7 +24,7 @@ python: script: - ./configure --production ./config/gfortran.cfg - - source ./quantum_package.rc ; qp_module.py install Full_CI Hartree_Fock CAS_SD MRCC_CASSD All_singles + - source ./quantum_package.rc ; qp_module.py install Full_CI FCI_ZMQ Hartree_Fock CAS_SD mrcepa0 All_singles - source ./quantum_package.rc ; ninja - source ./quantum_package.rc ; cd ocaml ; make ; cd - - source ./quantum_package.rc ; cd tests ; ./run_tests.sh #-v From 497e3fff846fa6312a5b9747ee6552c87ba6724c Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 7 Oct 2016 20:06:43 +0200 Subject: [PATCH 185/216] Updated travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 672e3370..24687b97 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,7 +24,7 @@ python: script: - ./configure --production ./config/gfortran.cfg - - source ./quantum_package.rc ; qp_module.py install Full_CI FCI_ZMQ Hartree_Fock CAS_SD mrcepa0 All_singles + - source ./quantum_package.rc ; qp_module.py install Full_CI Full_CI_ZMQ Hartree_Fock CAS_SD mrcepa0 All_singles - source ./quantum_package.rc ; ninja - source ./quantum_package.rc ; cd ocaml ; make ; cd - - source ./quantum_package.rc ; cd tests ; ./run_tests.sh #-v From bcade01e4631a9f09bd2885f88455829d2a6442c Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 7 Oct 2016 20:58:30 +0200 Subject: [PATCH 186/216] Added Titanium image --- README.md | 4 +++- data/Titanium.png | Bin 0 -> 55445 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 data/Titanium.png diff --git a/README.md b/README.md index 5372b7ac..0eb667f9 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ Set of quantum chemistry programs and libraries. For more information, you can visit the [wiki of the project](http://github.com/LCPQ/quantum_package/wiki>), or below for the installation instructions. +[![Frozen-core Full-CI energy of Ti](https://raw.githubusercontent.com/LCPQ/quantum_package/master/data/Titanium.png)](https://raw.githubusercontent.com/LCPQ/quantum_package/master/data/Titanium.png "Convergence of Ti in cc-pv{DTQ}Z") + Demo ==== @@ -155,7 +157,7 @@ Program exited with code 139. #### Why ? -It's caused when we call the DGEM routine of LAPACK. +It's caused when we call the DGEMM routine of LAPACK. ##### Fix diff --git a/data/Titanium.png b/data/Titanium.png new file mode 100644 index 0000000000000000000000000000000000000000..871babd40b6d93cbd4d0c00f40404829224c5d5a GIT binary patch literal 55445 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 literal 0 HcmV?d00001 From 09b7ed45dacee00bfcf4459499c296671838c200 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 7 Oct 2016 21:00:10 +0200 Subject: [PATCH 187/216] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0eb667f9..bb63b691 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,14 @@ Set of quantum chemistry programs and libraries. For more information, you can visit the [wiki of the project](http://github.com/LCPQ/quantum_package/wiki>), or below for the installation instructions. -[![Frozen-core Full-CI energy of Ti](https://raw.githubusercontent.com/LCPQ/quantum_package/master/data/Titanium.png)](https://raw.githubusercontent.com/LCPQ/quantum_package/master/data/Titanium.png "Convergence of Ti in cc-pv{DTQ}Z") + Demo ==== [![Full-CI energy of C2 in 2 minutes](https://i.vimeocdn.com/video/555047954_295x166.jpg)](https://vimeo.com/scemama/quantum_package_demo "Quantum Package Demo") +[![Frozen-core Full-CI energy of Ti](https://raw.githubusercontent.com/LCPQ/quantum_package/master/data/Titanium.png)](https://raw.githubusercontent.com/LCPQ/quantum_package/master/data/Titanium.png "Convergence of Ti in cc-pv{DTQ}Z") # Installation From e6b528fe03e88211b27b43dfd27d463401823383 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Sat, 8 Oct 2016 00:39:55 +0200 Subject: [PATCH 188/216] openMP davidson slave --- src/Davidson/davidson_parallel.irp.f | 67 +++++++++++++++++++--------- src/Davidson/davidson_slave.irp.f | 11 +++-- 2 files changed, 50 insertions(+), 28 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 1bf9baae..ca128d7c 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -5,7 +5,7 @@ use bitmasks use f77_zmq subroutine davidson_process(blockb, blocke, N, idx, vt, st) - + use f77_zmq implicit none @@ -19,12 +19,21 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) integer(bit_kind) :: sorted_i(N_int) double precision :: s2, hij logical, allocatable :: wrotten(:) + integer, external :: omp_get_thread_num allocate(wrotten(dav_size)) wrotten = .false. + provide dav_det dav_ut shortcut_ + !useless calls not to provide in the parallel section + call i_h_j (dav_det(1,1,1),dav_det(1,1,dav_size),n_int,hij) + call get_s2(dav_det(1,1,1),dav_det(1,1,dav_size),n_int,s2) + !!!!! do sh = blockb, blocke - do sh2=1,sh + !$OMP PARALLEL DO default(none) schedule(dynamic) & + !$OMP shared(vt, st, wrotten, blockb, blocke, sh, shortcut_, version_, sorted_, sort_idx_, dav_det, dav_ut, N_int, N_states_diag) & + !$OMP private(exa, ni, ext, org_i, org_j, sorted_i, endi, hij, s2) + do sh2=1,sh exa = 0 do ni=1,N_int exa = exa + popcnt(xor(version_(ni,sh,1), version_(ni,sh2,1))) @@ -53,6 +62,7 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) if(ext <= 4) then call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) + !$OMP CRITICAL if(.not. wrotten(org_i)) then wrotten(org_i) = .true. vt (:,org_i) = 0d0 @@ -69,13 +79,18 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) vt (istate,org_j) += hij*dav_ut(istate,org_i) st (istate,org_j) += s2*dav_ut(istate,org_i) enddo + !$OMP END CRITICAL endif enddo enddo enddo + !$OMP END PARALLEL DO enddo - + do sh=blockb,min(blocke, shortcut_(0,2)) + !$OMP PARALLEL DO default(none) schedule(dynamic) & + !$OMP shared(vt, st, wrotten, blockb, blocke, sh, shortcut_, version_, sorted_, sort_idx_, dav_det, dav_ut, N_int, N_states_diag) & + !$OMP private(exa, ni, ext, org_i, org_j, sorted_i, endi, hij, s2) do sh2=sh, shortcut_(0,2), shortcut_(0,1) do i=shortcut_(sh2,2),shortcut_(sh2+1,2)-1 org_i = sort_idx_(i,2) @@ -88,6 +103,7 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) if(ext == 4) then call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) + !$OMP CRITICAL if(.not. wrotten(org_i)) then wrotten(org_i) = .true. vt (:,org_i) = 0d0 @@ -104,10 +120,12 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) st (istate,org_i) = st (istate,org_i) + s2*dav_ut(istate,org_j) st (istate,org_j) = st (istate,org_j) + s2*dav_ut(istate,org_i) enddo + !$OMP END CRITICAL end if end do end do enddo + !$OMP END PARALLEL DO enddo N = 0 @@ -120,7 +138,7 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) idx(N) = i enddo end if - end do + end do end subroutine @@ -186,6 +204,12 @@ subroutine davidson_slave_inproc(i) call davidson_run_slave(1,i) end +integer function davidson_slave_inproc_omp() + implicit none + + call davidson_run_slave(1,2) + davidson_slave_inproc_omp = 0 +end subroutine subroutine davidson_slave_tcp(i) implicit none @@ -397,41 +421,39 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) integer(ZMQ_PTR) :: zmq_collector integer(ZMQ_PTR), external :: new_zmq_pull_socket integer(ZMQ_PTR) :: zmq_socket_pull - + integer(ZMQ_PTR) :: pthread_slave, pthread_miniserver + + integer :: i integer, external :: omp_get_thread_num double precision , intent(inout) :: v0(dav_size, N_states_diag) double precision , intent(inout) :: s0(dav_size, N_states_diag) - + integer, external :: davidson_miniserver_run, davidson_slave_inproc_omp call zmq_set_running(zmq_to_qp_run_socket) zmq_collector = new_zmq_to_qp_run_socket() zmq_socket_pull = new_zmq_pull_socket() - i = omp_get_thread_num() PROVIDE nproc - !$OMP PARALLEL DEFAULT(shared) private(i) num_threads(nproc+2) - i = omp_get_thread_num() - if (i==0) then - call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) - call end_zmq_to_qp_run_socket(zmq_collector) - call end_zmq_pull_socket(zmq_socket_pull) - call davidson_miniserver_end() - else if(i==1) then - call davidson_miniserver_run() - else - call davidson_slave_inproc(i) - endif - !$OMP END PARALLEL + + i = pthread_create ( pthread_miniserver, davidson_miniserver_run ) + i = pthread_create ( pthread_slave, davidson_slave_inproc_omp ) + + call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) + call end_zmq_to_qp_run_socket(zmq_collector) + call end_zmq_pull_socket(zmq_socket_pull) + call davidson_miniserver_end() + i = pthread_join(pthread_miniserver) + i = pthread_join(pthread_slave) + call end_parallel_job(zmq_to_qp_run_socket, 'davidson') end subroutine - -subroutine davidson_miniserver_run() +integer function davidson_miniserver_run() use f77_zmq implicit none integer(ZMQ_PTR) responder @@ -458,6 +480,7 @@ subroutine davidson_miniserver_run() enddo rc = f77_zmq_close(responder) + davidson_miniserver_run = 0 end subroutine diff --git a/src/Davidson/davidson_slave.irp.f b/src/Davidson/davidson_slave.irp.f index b5ec0592..9195e46f 100644 --- a/src/Davidson/davidson_slave.irp.f +++ b/src/Davidson/davidson_slave.irp.f @@ -20,21 +20,20 @@ program davidson_slave do call wait_for_state(zmq_state,state) if(trim(state) /= "davidson") exit - !print *, 'Getting wave function' - !call zmq_get_psi(zmq_to_qp_run_socket,1,energy,N_states_diag) call davidson_miniserver_get() integer :: rc, i print *, 'Davidson slave running' - !$OMP PARALLEL PRIVATE(i) - i = omp_get_thread_num() - call davidson_slave_tcp(i) - !$OMP END PARALLEL + ! !$OMP PARALLEL PRIVATE(i) + !i = omp_get_thread_num() + call davidson_slave_tcp(0) + !!$OMP END PARALLEL end do end subroutine provide_everything PROVIDE mo_bielec_integrals_in_map psi_det_sorted_bit N_states_diag zmq_context end subroutine + From c3dd90e1994934ca1b26c10816e06cfb2d0418b1 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Sat, 8 Oct 2016 19:21:53 +0200 Subject: [PATCH 189/216] davidson locally reduces task results --- src/Davidson/davidson_parallel.irp.f | 120 ++++++++++++++------------- src/Davidson/u0Hu0.irp.f | 4 +- 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index ca128d7c..4da50355 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -4,25 +4,20 @@ use bitmasks use f77_zmq -subroutine davidson_process(blockb, blocke, N, idx, vt, st) +subroutine davidson_process(blockb, blocke, vt, st) use f77_zmq implicit none integer , intent(in) :: blockb, blocke - integer , intent(inout) :: N - integer , intent(inout) :: idx(dav_size) double precision , intent(inout) :: vt(N_states_diag, dav_size) double precision , intent(inout) :: st(N_states_diag, dav_size) integer :: i, j, sh, sh2, exa, ext, org_i, org_j, istate, ni, endi integer(bit_kind) :: sorted_i(N_int) double precision :: s2, hij - logical, allocatable :: wrotten(:) integer, external :: omp_get_thread_num - allocate(wrotten(dav_size)) - wrotten = .false. provide dav_det dav_ut shortcut_ !useless calls not to provide in the parallel section call i_h_j (dav_det(1,1,1),dav_det(1,1,dav_size),n_int,hij) @@ -31,7 +26,7 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) do sh = blockb, blocke !$OMP PARALLEL DO default(none) schedule(dynamic) & - !$OMP shared(vt, st, wrotten, blockb, blocke, sh, shortcut_, version_, sorted_, sort_idx_, dav_det, dav_ut, N_int, N_states_diag) & + !$OMP shared(vt, st, blockb, blocke, sh, shortcut_, version_, sorted_, sort_idx_, dav_det, dav_ut, N_int, N_states_diag) & !$OMP private(exa, ni, ext, org_i, org_j, sorted_i, endi, hij, s2) do sh2=1,sh exa = 0 @@ -63,16 +58,6 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) !$OMP CRITICAL - if(.not. wrotten(org_i)) then - wrotten(org_i) = .true. - vt (:,org_i) = 0d0 - st (:,org_i) = 0d0 - end if - if(.not. wrotten(org_j)) then - wrotten(org_j) = .true. - vt (:,org_j) = 0d0 - st (:,org_j) = 0d0 - end if do istate=1,N_states_diag vt (istate,org_i) += hij*dav_ut(istate,org_j) st (istate,org_i) += s2*dav_ut(istate,org_j) @@ -89,7 +74,7 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) do sh=blockb,min(blocke, shortcut_(0,2)) !$OMP PARALLEL DO default(none) schedule(dynamic) & - !$OMP shared(vt, st, wrotten, blockb, blocke, sh, shortcut_, version_, sorted_, sort_idx_, dav_det, dav_ut, N_int, N_states_diag) & + !$OMP shared(vt, st, blockb, blocke, sh, shortcut_, version_, sorted_, sort_idx_, dav_det, dav_ut, N_int, N_states_diag) & !$OMP private(exa, ni, ext, org_i, org_j, sorted_i, endi, hij, s2) do sh2=sh, shortcut_(0,2), shortcut_(0,1) do i=shortcut_(sh2,2),shortcut_(sh2+1,2)-1 @@ -104,16 +89,6 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) !$OMP CRITICAL - if(.not. wrotten(org_i)) then - wrotten(org_i) = .true. - vt (:,org_i) = 0d0 - st (:,org_i) = 0d0 - end if - if(.not. wrotten(org_j)) then - wrotten(org_j) = .true. - vt (:,org_j) = 0d0 - st (:,org_j) = 0d0 - end if do istate=1,N_states_diag vt (istate,org_i) = vt (istate,org_i) + hij*dav_ut(istate,org_j) vt (istate,org_j) = vt (istate,org_j) + hij*dav_ut(istate,org_i) @@ -127,18 +102,6 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st) enddo !$OMP END PARALLEL DO enddo - - N = 0 - do i=1, dav_size - if(wrotten(i)) then - N = N+1 - do istate=1,N_states_diag - vt (istate,N) = vt (istate,i) - st (istate,N) = st (istate,i) - idx(N) = i - enddo - end if - end do end subroutine @@ -262,7 +225,8 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) integer(ZMQ_PTR),intent(in) :: zmq_to_qp_run_socket integer(ZMQ_PTR),intent(in) :: zmq_socket_push integer,intent(in) :: worker_id - integer :: task_id + integer :: i, taskn, myTask, istate + integer, allocatable :: task_id(:) character*(512) :: task @@ -272,32 +236,59 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) double precision , allocatable :: vt(:,:) double precision , allocatable :: st(:,:) - + allocate(task_id(100)) allocate(idx(dav_size)) allocate(vt(N_states_diag, dav_size)) allocate(st(N_states_diag, dav_size)) + vt = 0d0 + st = 0d0 + taskn = 0 do - call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id, task) - if(task_id == 0) exit - read (task,*) blockb, blocke + call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, myTask, task) + if(myTask /= 0) then + read (task,*) blockb, blocke + call davidson_process(blockb, blocke, vt, st) + taskn += 1 + task_id(taskn) = myTask + end if - call davidson_process(blockb, blocke, N, idx, vt, st) - call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id) - call davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st, task_id) + if(myTask == 0 .or. taskn == size(task_id)) then + N = 0 + do i=1, dav_size + if(vt(1,i) /= 0d0 .or. st(1,i) /= 0d0) then + N = N+1 + do istate=1,N_states_diag + vt (istate,N) = vt (istate,i) + st (istate,N) = st (istate,i) + idx(N) = i + enddo + end if + end do + + do i = 1, taskn + call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id(i)) + end do + if(taskn /= 0) call davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st, taskn, task_id) + + if(myTask == 0) exit + vt = 0d0 + st = 0d0 + taskn = 0 + end if end do end subroutine -subroutine davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st, task_id) +subroutine davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st, taskn, task_id) use f77_zmq implicit none integer(ZMQ_PTR) ,intent(in) :: zmq_socket_push - integer ,intent(in) :: task_id + integer ,intent(in) :: task_id(100), taskn integer ,intent(in) :: blockb, blocke integer ,intent(in) :: N @@ -324,18 +315,21 @@ subroutine davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st rc = f77_zmq_send( zmq_socket_push, st, 8*N_states_diag* N, ZMQ_SNDMORE) if(rc /= 8*N_states_diag* N) stop "davidson_push_results failed to push st" - rc = f77_zmq_send( zmq_socket_push, task_id, 4, 0) - if(rc /= 4) stop "davidson_push_results failed to push task_id" + rc = f77_zmq_send( zmq_socket_push, taskn, 4, ZMQ_SNDMORE) + if(rc /= 4) stop "davidson_push_results failed to push taskn" + + rc = f77_zmq_send( zmq_socket_push, task_id, 4*taskn, 0) + if(rc /= 4*taskn) stop "davidson_push_results failed to push task_id" end subroutine -subroutine davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st, task_id) +subroutine davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st, taskn, task_id) use f77_zmq implicit none integer(ZMQ_PTR) ,intent(in) :: zmq_socket_pull - integer ,intent(out) :: task_id + integer ,intent(out) :: task_id(100), taskn integer ,intent(out) :: blockb, blocke integer ,intent(out) :: N integer ,intent(out) :: idx(dav_size) @@ -362,8 +356,11 @@ subroutine davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st rc = f77_zmq_recv( zmq_socket_pull, st, 8*N_states_diag* N, 0) if(rc /= 8*N_states_diag* N) stop "davidson_push_results failed to pull st" - rc = f77_zmq_recv( zmq_socket_pull, task_id, 4, 0) - if(rc /= 4) stop "davidson_pull_results failed to pull task_id" + rc = f77_zmq_recv( zmq_socket_pull, taskn, 4, 0) + if(rc /= 4) stop "davidson_pull_results failed to pull taskn" + + rc = f77_zmq_recv( zmq_socket_pull, task_id, 4*taskn, 0) + if(rc /= 4*taskn) stop "davidson_pull_results failed to pull task_id" end subroutine @@ -378,7 +375,7 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) double precision ,intent(inout) :: v0(dav_size, N_states_diag) double precision ,intent(inout) :: s0(dav_size, N_states_diag) - integer :: more, task_id + integer :: more, task_id(100), taskn integer :: blockb, blocke @@ -387,6 +384,8 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) double precision , allocatable :: vt(:,:), v0t(:,:), s0t(:,:) double precision , allocatable :: st(:,:) + integer :: i + allocate(idx(dav_size)) allocate(vt(N_states_diag, dav_size)) allocate(st(N_states_diag, dav_size)) @@ -399,10 +398,13 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) more = 1 do while (more == 1) - call davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st, task_id) + call davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st, taskn, task_id) + !DIR$ FORCEINLINE call davidson_collect(blockb, blocke, N, idx, vt, st , v0t, s0t) - call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more) + do i=1,taskn + call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id(i),more) + end do end do deallocate(idx,vt,st) diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index ce9295d7..926531aa 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -240,21 +240,19 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) touch dav_size dav_det = psi_det dav_ut = ut - workload = 0 blockb = shortcut(0,1) blocke = blockb call davidson_init(handler) do sh=shortcut(0,1),1,-1 workload += (shortcut(sh+1,1) - shortcut(sh,1))**2 - if(workload > 100000) then + if(workload > 1000) then blocke = sh call davidson_add_task(handler, blocke, blockb) blockb = sh-1 workload = 0 end if enddo - if(blockb > 0) call davidson_add_task(handler, 1, blockb) call davidson_run(handler, v_0, s_0) From 874e6845f0857129c2834da299a452158585bc24 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Sat, 8 Oct 2016 19:35:30 +0200 Subject: [PATCH 190/216] updated selection_slave --- plugins/Full_CI_ZMQ/selection_slave.irp.f | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index 2aba32fe..31f42e7e 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -64,10 +64,10 @@ subroutine run_wf print *, 'Davidson' call davidson_miniserver_get() - !$OMP PARALLEL PRIVATE(i) - i = omp_get_thread_num() - call davidson_slave_tcp(i) - !$OMP END PARALLEL + !!$OMP PARALLEL PRIVATE(i) + !i = omp_get_thread_num() + call davidson_slave_tcp(0) + !!$OMP END PARALLEL print *, 'Davidson done' endif From bd9a93abc9b2efaf571a3fbacbb9ec0bd430dca1 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sat, 8 Oct 2016 21:44:47 +0200 Subject: [PATCH 191/216] Selection only or selection+davidson helper --- .../selection_davidson_slave.irp.f | 108 ++++++++++++++++++ plugins/Full_CI_ZMQ/selection_slave.irp.f | 19 +-- 2 files changed, 110 insertions(+), 17 deletions(-) create mode 100644 plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f diff --git a/plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f b/plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f new file mode 100644 index 00000000..2aba32fe --- /dev/null +++ b/plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f @@ -0,0 +1,108 @@ +program selection_slave + implicit none + BEGIN_DOC +! Helper program to compute the PT2 in distributed mode. + END_DOC + + read_wf = .False. + SOFT_TOUCH read_wf + call provide_everything + call switch_qp_run_to_master + call run_wf +end + +subroutine provide_everything + PROVIDE H_apply_buffer_allocated mo_bielec_integrals_in_map psi_det_generators psi_coef_generators psi_det_sorted_bit psi_selectors n_det_generators n_states generators_bitmask zmq_context +! PROVIDE ci_electronic_energy mo_tot_num N_int +end + +subroutine run_wf + use f77_zmq + implicit none + + integer(ZMQ_PTR), external :: new_zmq_to_qp_run_socket + integer(ZMQ_PTR) :: zmq_to_qp_run_socket + double precision :: energy(N_states_diag) + character*(64) :: states(2) + integer :: rc, i + + call provide_everything + + zmq_context = f77_zmq_ctx_new () + states(1) = 'selection' + states(2) = 'davidson' + + zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() + + do + + call wait_for_states(states,zmq_state,2) + + if(trim(zmq_state) == 'Stopped') then + + exit + + else if (trim(zmq_state) == 'selection') then + + ! Selection + ! --------- + + print *, 'Selection' + call zmq_get_psi(zmq_to_qp_run_socket,1,energy,N_states_diag) + + !$OMP PARALLEL PRIVATE(i) + i = omp_get_thread_num() + call selection_dressing_slave_tcp(i, energy) + !$OMP END PARALLEL + print *, 'Selection done' + + else if (trim(zmq_state) == 'davidson') then + + ! Davidson + ! -------- + + print *, 'Davidson' + call davidson_miniserver_get() + + !$OMP PARALLEL PRIVATE(i) + i = omp_get_thread_num() + call davidson_slave_tcp(i) + !$OMP END PARALLEL + print *, 'Davidson done' + + endif + + end do +end + +subroutine update_energy(energy) + implicit none + double precision, intent(in) :: energy(N_states_diag) + BEGIN_DOC +! Update energy when it is received from ZMQ + END_DOC + integer :: j,k + do j=1,N_states + do k=1,N_det + CI_eigenvectors(k,j) = psi_coef(k,j) + enddo + enddo + call u_0_S2_u_0(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int) + if (.True.) then + do k=1,size(ci_electronic_energy) + ci_electronic_energy(k) = energy(k) + enddo + TOUCH ci_electronic_energy CI_eigenvectors_s2 CI_eigenvectors + endif + + call write_double(6,ci_energy,'Energy') +end + +subroutine selection_dressing_slave_tcp(i,energy) + implicit none + double precision, intent(in) :: energy(N_states_diag) + integer, intent(in) :: i + + call run_selection_slave(0,i,energy) +end + diff --git a/plugins/Full_CI_ZMQ/selection_slave.irp.f b/plugins/Full_CI_ZMQ/selection_slave.irp.f index 2aba32fe..bc8ba76f 100644 --- a/plugins/Full_CI_ZMQ/selection_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_slave.irp.f @@ -23,20 +23,19 @@ subroutine run_wf integer(ZMQ_PTR), external :: new_zmq_to_qp_run_socket integer(ZMQ_PTR) :: zmq_to_qp_run_socket double precision :: energy(N_states_diag) - character*(64) :: states(2) + character*(64) :: states(1) integer :: rc, i call provide_everything zmq_context = f77_zmq_ctx_new () states(1) = 'selection' - states(2) = 'davidson' zmq_to_qp_run_socket = new_zmq_to_qp_run_socket() do - call wait_for_states(states,zmq_state,2) + call wait_for_states(states,zmq_state,1) if(trim(zmq_state) == 'Stopped') then @@ -56,20 +55,6 @@ subroutine run_wf !$OMP END PARALLEL print *, 'Selection done' - else if (trim(zmq_state) == 'davidson') then - - ! Davidson - ! -------- - - print *, 'Davidson' - call davidson_miniserver_get() - - !$OMP PARALLEL PRIVATE(i) - i = omp_get_thread_num() - call davidson_slave_tcp(i) - !$OMP END PARALLEL - print *, 'Davidson done' - endif end do From de4cf9e3e17de95cc9017d55e0690ec5ee61cc80 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 9 Oct 2016 00:11:50 +0200 Subject: [PATCH 192/216] Removed OpenMP in davidson --- .../selection_davidson_slave.irp.f | 5 +- src/Davidson/davidson_parallel.irp.f | 56 +++++++++---------- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f b/plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f index 3cd02620..554c62d5 100644 --- a/plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f @@ -63,7 +63,10 @@ subroutine run_wf print *, 'Davidson' call davidson_miniserver_get() - call davidson_slave_tcp(0) + !$OMP PARALLEL PRIVATE(i) + i = omp_get_thread_num() + call davidson_slave_tcp(i) + !$OMP END PARALLEL print *, 'Davidson done' endif diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 40b11730..f00c7b69 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -16,18 +16,14 @@ subroutine davidson_process(blockb, blocke, vt, st) integer :: i, j, sh, sh2, exa, ext, org_i, org_j, istate, ni, endi integer(bit_kind) :: sorted_i(N_int) double precision :: s2, hij - integer, external :: omp_get_thread_num - provide dav_det dav_ut shortcut_ + provide dav_det dav_ut shortcut_ !useless calls not to provide in the parallel section call i_h_j (dav_det(1,1,1),dav_det(1,1,dav_size),n_int,hij) call get_s2(dav_det(1,1,1),dav_det(1,1,dav_size),n_int,s2) !!!!! do sh = blockb, blocke - !$OMP PARALLEL DO default(none) schedule(dynamic) & - !$OMP shared(vt, st, blockb, blocke, sh, shortcut_, version_, sorted_, sort_idx_, dav_det, dav_ut, N_int, N_states_diag) & - !$OMP private(exa, ni, ext, org_i, org_j, sorted_i, endi, hij, s2) do sh2=1,sh exa = 0 do ni=1,N_int @@ -57,25 +53,23 @@ subroutine davidson_process(blockb, blocke, vt, st) if(ext <= 4) then call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) - !$OMP CRITICAL +! call daxpy(N_states_diag,hij,dav_ut(1,org_j),1,vt(1,org_i),1) +! call daxpy(N_states_diag,hij,dav_ut(1,org_i),1,vt(1,org_j),1) +! call daxpy(N_states_diag,s2, dav_ut(1,org_j),1,st(1,org_i),1) +! call daxpy(N_states_diag,s2, dav_ut(1,org_i),1,st(1,org_j),1) do istate=1,N_states_diag vt(istate,org_i) = vt(istate,org_i) + hij*dav_ut(istate,org_j) st(istate,org_i) = st(istate,org_i) + s2 *dav_ut(istate,org_j) vt(istate,org_j) = vt(istate,org_j) + hij*dav_ut(istate,org_i) st(istate,org_j) = st(istate,org_j) + s2 *dav_ut(istate,org_i) enddo - !$OMP END CRITICAL endif enddo enddo enddo - !$OMP END PARALLEL DO enddo do sh=blockb,min(blocke, shortcut_(0,2)) - !$OMP PARALLEL DO default(none) schedule(dynamic) & - !$OMP shared(vt, st, blockb, blocke, sh, shortcut_, version_, sorted_, sort_idx_, dav_det, dav_ut, N_int, N_states_diag) & - !$OMP private(exa, ni, ext, org_i, org_j, sorted_i, endi, hij, s2) do sh2=sh, shortcut_(0,2), shortcut_(0,1) do i=shortcut_(sh2,2),shortcut_(sh2+1,2)-1 org_i = sort_idx_(i,2) @@ -88,20 +82,22 @@ subroutine davidson_process(blockb, blocke, vt, st) if(ext == 4) then call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) - !$OMP CRITICAL +! call daxpy(N_states_diag,hij,dav_ut(1,org_j),1,vt(1,org_i),1) +! call daxpy(N_states_diag,hij,dav_ut(1,org_i),1,vt(1,org_j),1) +! call daxpy(N_states_diag,s2, dav_ut(1,org_j),1,st(1,org_i),1) +! call daxpy(N_states_diag,s2, dav_ut(1,org_i),1,st(1,org_j),1) do istate=1,N_states_diag vt (istate,org_i) = vt (istate,org_i) + hij*dav_ut(istate,org_j) vt (istate,org_j) = vt (istate,org_j) + hij*dav_ut(istate,org_i) st (istate,org_i) = st (istate,org_i) + s2*dav_ut(istate,org_j) st (istate,org_j) = st (istate,org_j) + s2*dav_ut(istate,org_i) enddo - !$OMP END CRITICAL end if end do end do enddo - !$OMP END PARALLEL DO enddo + end subroutine @@ -273,8 +269,8 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) taskn += 1 task_id(taskn) = myTask end if - - + + if(myTask == 0 .or. taskn == size(task_id)) then N = 0 do i=1, dav_size @@ -287,7 +283,7 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) enddo end if end do - + do i = 1, taskn call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id(i)) end do @@ -299,6 +295,7 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) taskn = 0 end if end do + end subroutine @@ -453,7 +450,6 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0, LDA) double precision , intent(inout) :: v0(LDA, N_states_diag) double precision , intent(inout) :: s0(LDA, N_states_diag) - integer, external :: davidson_miniserver_run, davidson_slave_inproc_omp call zmq_set_running(zmq_to_qp_run_socket) zmq_collector = new_zmq_to_qp_run_socket() @@ -462,21 +458,26 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0, LDA) PROVIDE nproc - i = pthread_create ( pthread_miniserver, davidson_miniserver_run ) - i = pthread_create ( pthread_slave, davidson_slave_inproc_omp ) - call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) - call end_zmq_to_qp_run_socket(zmq_collector) - call end_zmq_pull_socket(zmq_socket_pull) - call davidson_miniserver_end() - i = pthread_join(pthread_miniserver) - i = pthread_join(pthread_slave) + !$OMP PARALLEL NUM_THREADS(nproc+2) PRIVATE(i) + i = omp_get_thread_num() + if (i == 0 ) then + call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) + call end_zmq_to_qp_run_socket(zmq_collector) + call end_zmq_pull_socket(zmq_socket_pull) + call davidson_miniserver_end() + else if (i == 1 ) then + call davidson_miniserver_run () + else + call davidson_slave_inproc(i) + endif + !$OMP END PARALLEL call end_parallel_job(zmq_to_qp_run_socket, 'davidson') end subroutine -integer function davidson_miniserver_run() +subroutine davidson_miniserver_run() use f77_zmq implicit none integer(ZMQ_PTR) responder @@ -503,7 +504,6 @@ integer function davidson_miniserver_run() enddo rc = f77_zmq_close(responder) - davidson_miniserver_run = 0 end subroutine From b167dcebef9cc01e7b5ba83fc88f0c33a8b25b54 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Sun, 9 Oct 2016 15:03:56 +0200 Subject: [PATCH 193/216] reduced synchronization in davidson_process --- src/Davidson/davidson_parallel.irp.f | 51 +++++++++++++++++++++------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 4da50355..a23984d5 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -17,7 +17,8 @@ subroutine davidson_process(blockb, blocke, vt, st) integer(bit_kind) :: sorted_i(N_int) double precision :: s2, hij integer, external :: omp_get_thread_num - + double precision, allocatable :: locals(:,:), localv(:,:) + provide dav_det dav_ut shortcut_ !useless calls not to provide in the parallel section call i_h_j (dav_det(1,1,1),dav_det(1,1,dav_size),n_int,hij) @@ -25,9 +26,15 @@ subroutine davidson_process(blockb, blocke, vt, st) !!!!! do sh = blockb, blocke - !$OMP PARALLEL DO default(none) schedule(dynamic) & + !$OMP PARALLEL & + !$OMP default(none) & !$OMP shared(vt, st, blockb, blocke, sh, shortcut_, version_, sorted_, sort_idx_, dav_det, dav_ut, N_int, N_states_diag) & - !$OMP private(exa, ni, ext, org_i, org_j, sorted_i, endi, hij, s2) + !$OMP private(i,j,sh2, locals, localv, exa, ni, ext, org_i, org_j, sorted_i, endi, hij, s2) + allocate(locals(N_states_diag, shortcut_(sh+1,1) - shortcut_(sh,1))) + allocate(localv(N_states_diag, shortcut_(sh+1,1) - shortcut_(sh,1))) + locals = 0d0 + localv = 0d0 + !$OMP DO do sh2=1,sh exa = 0 do ni=1,N_int @@ -57,21 +64,41 @@ subroutine davidson_process(blockb, blocke, vt, st) if(ext <= 4) then call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) - !$OMP CRITICAL - do istate=1,N_states_diag - vt (istate,org_i) += hij*dav_ut(istate,org_j) - st (istate,org_i) += s2*dav_ut(istate,org_j) - vt (istate,org_j) += hij*dav_ut(istate,org_i) - st (istate,org_j) += s2*dav_ut(istate,org_i) - enddo - !$OMP END CRITICAL + + if(sh == sh2) then + !$OMP CRITICAL + do istate=1,N_states_diag + localv (istate,i+1-shortcut_(sh,1)) += hij*dav_ut(istate,org_j) + locals (istate,i+1-shortcut_(sh,1)) += s2*dav_ut(istate,org_j) + vt (istate,org_j) += hij*dav_ut(istate,org_i) + st (istate,org_j) += s2*dav_ut(istate,org_i) + enddo + !$OMP END CRITICAL + else + do istate=1,N_states_diag + localv (istate,i+1-shortcut_(sh,1)) += hij*dav_ut(istate,org_j) + locals (istate,i+1-shortcut_(sh,1)) += s2*dav_ut(istate,org_j) + vt (istate,org_j) += hij*dav_ut(istate,org_i) + st (istate,org_j) += s2*dav_ut(istate,org_i) + enddo + end if endif enddo enddo enddo - !$OMP END PARALLEL DO + !$OMP ENDDO + !$OMP CRITICAL + do i=1,shortcut_(sh+1,1) - shortcut_(sh,1) + do istate=1,N_states_diag + vt(istate, sort_idx_(shortcut_(sh,1) - 1 + i, 1)) += localv(istate,i) + st(istate, sort_idx_(shortcut_(sh,1) - 1 + i, 1)) += locals(istate,i) + end do + end do + !$OMP END CRITICAL + !$OMP END PARALLEL enddo + do sh=blockb,min(blocke, shortcut_(0,2)) !$OMP PARALLEL DO default(none) schedule(dynamic) & !$OMP shared(vt, st, blockb, blocke, sh, shortcut_, version_, sorted_, sort_idx_, dav_det, dav_ut, N_int, N_states_diag) & From 126ae4030591f8b2ac7707a15d03dd3e17c3078c Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 9 Oct 2016 22:51:40 +0200 Subject: [PATCH 194/216] Reduced memory --- src/Davidson/davidson_parallel.irp.f | 18 ++++++++++++++---- src/Davidson/u0Hu0.irp.f | 18 +++++++++++++----- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index f00c7b69..de197f3b 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -51,8 +51,8 @@ subroutine davidson_process(blockb, blocke, vt, st) ext = ext + popcnt(xor(sorted_i(ni), sorted_(ni,j,1))) end do if(ext <= 4) then - call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) + call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) ! call daxpy(N_states_diag,hij,dav_ut(1,org_j),1,vt(1,org_i),1) ! call daxpy(N_states_diag,hij,dav_ut(1,org_i),1,vt(1,org_j),1) ! call daxpy(N_states_diag,s2, dav_ut(1,org_j),1,st(1,org_i),1) @@ -401,7 +401,7 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0, LD double precision , allocatable :: vt(:,:), v0t(:,:), s0t(:,:) double precision , allocatable :: st(:,:) - integer :: i + integer :: i,j allocate(idx(dav_size)) allocate(vt(N_states_diag, dav_size)) @@ -425,8 +425,18 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0, LD end do deallocate(idx,vt,st) - call dtranspose(v0t,size(v0t,1), v0, size(v0,1), N_states_diag, dav_size) - call dtranspose(s0t,size(s0t,1), s0, size(s0,1), N_states_diag, dav_size) +! call dtranspose(v0t,size(v0t,1), v0, size(v0,1), N_states_diag, dav_size) +! call dtranspose(s0t,size(s0t,1), s0, size(s0,1), N_states_diag, dav_size) + + !DIR$ IVDEP + do j=1,N_states_diag + !DIR$ IVDEP + do i=1,dav_size + vt(i,j) = v0t(j,i) + st(i,j) = s0t(j,i) + enddo + enddo + deallocate(v0t,s0t) end subroutine diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 69b6c354..fe862cbd 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -24,6 +24,7 @@ subroutine u_0_H_u_0(e_0,u_0,n,keys_tmp,Nint,N_st,sze_8) do i=1,N_st e_0(i) = u_dot_v(v_0(1,i),u_0(1,i),n)/u_dot_u(u_0(1,i),n) enddo + deallocate (H_jj, v_0) end @@ -199,8 +200,8 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) integer :: i,j,k,l, jj,ii integer :: i0, j0 - integer, allocatable :: shortcut(:,:), sort_idx(:,:) - integer(bit_kind), allocatable :: sorted(:,:,:), version(:,:,:) + integer, allocatable :: shortcut(:,:), sort_idx(:) + integer(bit_kind), allocatable :: sorted(:,:), version(:,:) integer(bit_kind) :: sorted_i(Nint) integer :: sh, sh2, ni, exa, ext, org_i, org_j, endi, istate @@ -219,8 +220,13 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) ASSERT (n>0) PROVIDE ref_bitmask_energy - allocate (shortcut(0:n+1,2), sort_idx(n,2), sorted(Nint,n,2), version(Nint,n,2)) + allocate (shortcut(0:n+1,2), sort_idx(n), sorted(Nint,n), version(Nint,n)) allocate(ut(N_st_8,n)) +print *, ( size(shortcut)*4)/1048576, ' shortcut ', irp_here +print *, ( size(sort_idx)*4)/1048576, ' sort_idx ', irp_here +print *, ( size(sorted)*4)/1048576, ' sorted ', irp_here +print *, ( size(version)*4)/1048576, ' version ', irp_here +print *, ( size(ut)*8)/1048576, ' ut ', irp_here v_0 = 0.d0 s_0 = 0.d0 @@ -230,8 +236,8 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) ut(istate,i) = u_0(i,istate) enddo enddo - call sort_dets_ab_v(keys_tmp, sorted(1,1,1), sort_idx(1,1), shortcut(0,1), version(1,1,1), n, Nint) - call sort_dets_ba_v(keys_tmp, sorted(1,1,2), sort_idx(1,2), shortcut(0,2), version(1,1,2), n, Nint) + call sort_dets_ab_v(keys_tmp, sorted, sort_idx, shortcut(0,1), version, n, Nint) + call sort_dets_ba_v(keys_tmp, sorted, sort_idx, shortcut(0,2), version, n, Nint) workload = 0 blockb = shortcut(0,1) @@ -255,5 +261,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) s_0(i,istate) = s_0(i,istate) + s2_jj(i)* u_0(i,istate) enddo enddo + deallocate(shortcut, sort_idx, sorted, version) + deallocate(ut) end From 617809538e6a8a06565262382c04431d98da015a Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 9 Oct 2016 22:56:16 +0200 Subject: [PATCH 195/216] Removed prints --- src/Davidson/u0Hu0.irp.f | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index fe862cbd..b30d2385 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -222,11 +222,6 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) allocate (shortcut(0:n+1,2), sort_idx(n), sorted(Nint,n), version(Nint,n)) allocate(ut(N_st_8,n)) -print *, ( size(shortcut)*4)/1048576, ' shortcut ', irp_here -print *, ( size(sort_idx)*4)/1048576, ' sort_idx ', irp_here -print *, ( size(sorted)*4)/1048576, ' sorted ', irp_here -print *, ( size(version)*4)/1048576, ' version ', irp_here -print *, ( size(ut)*8)/1048576, ' ut ', irp_here v_0 = 0.d0 s_0 = 0.d0 From 4e829fd4b8c2ea93dafd879e23f35eef86e0366e Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 9 Oct 2016 23:00:14 +0200 Subject: [PATCH 196/216] Corrected bug --- src/Davidson/davidson_parallel.irp.f | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index de197f3b..aa2fbc23 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -432,8 +432,8 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0, LD do j=1,N_states_diag !DIR$ IVDEP do i=1,dav_size - vt(i,j) = v0t(j,i) - st(i,j) = s0t(j,i) + v0(i,j) = v0t(j,i) + s0(i,j) = s0t(j,i) enddo enddo From f82137ca36b68c14496109cf7ab8d4b0c4f7f0a6 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 9 Oct 2016 23:25:24 +0200 Subject: [PATCH 197/216] Fixed : Forgot argument in davidson function --- src/Davidson/davidson_parallel.irp.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index aa2fbc23..175958f0 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -472,7 +472,7 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0, LDA) !$OMP PARALLEL NUM_THREADS(nproc+2) PRIVATE(i) i = omp_get_thread_num() if (i == 0 ) then - call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) + call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0, LDA) call end_zmq_to_qp_run_socket(zmq_collector) call end_zmq_pull_socket(zmq_socket_pull) call davidson_miniserver_end() From 61f1e0814af6aadf429841103391b68e38e086bd Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 10 Oct 2016 10:13:57 +0200 Subject: [PATCH 198/216] better scheduling in davidson_process --- src/Davidson/davidson_parallel.irp.f | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index a23984d5..9d12a5b4 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -34,8 +34,8 @@ subroutine davidson_process(blockb, blocke, vt, st) allocate(localv(N_states_diag, shortcut_(sh+1,1) - shortcut_(sh,1))) locals = 0d0 localv = 0d0 - !$OMP DO - do sh2=1,sh + !$OMP DO schedule(static, 1) + do sh2=sh, shortcut_(0,1) !1,sh exa = 0 do ni=1,N_int exa = exa + popcnt(xor(version_(ni,sh,1), version_(ni,sh2,1))) From 30eda7b248a60e4edc9d88038f65e5a69c17bdea Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 10 Oct 2016 14:45:58 +0200 Subject: [PATCH 199/216] removed OMP - double work --- src/Davidson/davidson_parallel.irp.f | 279 +++++++++++---------------- src/Davidson/u0Hu0.irp.f | 10 +- 2 files changed, 124 insertions(+), 165 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 9d12a5b4..0e91ac90 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -4,58 +4,44 @@ use bitmasks use f77_zmq -subroutine davidson_process(blockb, blocke, vt, st) - use f77_zmq +subroutine davidson_process(blockb, blocke, N, idx, vt, st, bs) + implicit none - integer , intent(in) :: blockb, blocke - double precision , intent(inout) :: vt(N_states_diag, dav_size) - double precision , intent(inout) :: st(N_states_diag, dav_size) + integer , intent(in) :: blockb, blocke, bs + integer , intent(inout) :: N + integer , intent(inout) :: idx(bs) + double precision , intent(inout) :: vt(N_states_diag, bs) + double precision , intent(inout) :: st(N_states_diag, bs) - integer :: i, j, sh, sh2, exa, ext, org_i, org_j, istate, ni, endi + integer :: i,ii, j, sh, sh2, exa, ext, org_i, org_j, istate, ni, endi integer(bit_kind) :: sorted_i(N_int) double precision :: s2, hij - integer, external :: omp_get_thread_num - double precision, allocatable :: locals(:,:), localv(:,:) + logical, allocatable :: wrotten(:) + - provide dav_det dav_ut shortcut_ - !useless calls not to provide in the parallel section - call i_h_j (dav_det(1,1,1),dav_det(1,1,dav_size),n_int,hij) - call get_s2(dav_det(1,1,1),dav_det(1,1,dav_size),n_int,s2) - !!!!! + allocate(wrotten(bs)) + wrotten = .false. do sh = blockb, blocke - !$OMP PARALLEL & - !$OMP default(none) & - !$OMP shared(vt, st, blockb, blocke, sh, shortcut_, version_, sorted_, sort_idx_, dav_det, dav_ut, N_int, N_states_diag) & - !$OMP private(i,j,sh2, locals, localv, exa, ni, ext, org_i, org_j, sorted_i, endi, hij, s2) - allocate(locals(N_states_diag, shortcut_(sh+1,1) - shortcut_(sh,1))) - allocate(localv(N_states_diag, shortcut_(sh+1,1) - shortcut_(sh,1))) - locals = 0d0 - localv = 0d0 - !$OMP DO schedule(static, 1) - do sh2=sh, shortcut_(0,1) !1,sh + do sh2=1,shortcut_(0,1) exa = 0 do ni=1,N_int exa = exa + popcnt(xor(version_(ni,sh,1), version_(ni,sh2,1))) end do - if(exa > 2) then - cycle - end if + if(exa > 2) cycle do i=shortcut_(sh,1),shortcut_(sh+1,1)-1 - org_i = sort_idx_(i,1) - if(sh==sh2) then - endi = i-1 - else - endi = shortcut_(sh2+1,1)-1 - end if + ii = i - shortcut_(blockb,1) + 1 + + org_i = sort_idx_(i,1) do ni=1,N_int sorted_i(ni) = sorted_(ni,i,1) enddo - do j=shortcut_(sh2,1),endi + do j=shortcut_(sh2,1), shortcut_(sh2+1,1)-1 + if(i == j) cycle org_j = sort_idx_(j,1) ext = exa do ni=1,N_int @@ -64,49 +50,30 @@ subroutine davidson_process(blockb, blocke, vt, st) if(ext <= 4) then call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) - - if(sh == sh2) then - !$OMP CRITICAL - do istate=1,N_states_diag - localv (istate,i+1-shortcut_(sh,1)) += hij*dav_ut(istate,org_j) - locals (istate,i+1-shortcut_(sh,1)) += s2*dav_ut(istate,org_j) - vt (istate,org_j) += hij*dav_ut(istate,org_i) - st (istate,org_j) += s2*dav_ut(istate,org_i) - enddo - !$OMP END CRITICAL - else - do istate=1,N_states_diag - localv (istate,i+1-shortcut_(sh,1)) += hij*dav_ut(istate,org_j) - locals (istate,i+1-shortcut_(sh,1)) += s2*dav_ut(istate,org_j) - vt (istate,org_j) += hij*dav_ut(istate,org_i) - st (istate,org_j) += s2*dav_ut(istate,org_i) - enddo + if(.not. wrotten(ii)) then + wrotten(ii) = .true. + idx(ii) = org_i + vt (:,ii) = 0d0 + st (:,ii) = 0d0 end if + do istate=1,N_states_diag + vt (istate,ii) += hij*dav_ut(istate,org_j) + st (istate,ii) += s2*dav_ut(istate,org_j) + enddo endif enddo enddo enddo - !$OMP ENDDO - !$OMP CRITICAL - do i=1,shortcut_(sh+1,1) - shortcut_(sh,1) - do istate=1,N_states_diag - vt(istate, sort_idx_(shortcut_(sh,1) - 1 + i, 1)) += localv(istate,i) - st(istate, sort_idx_(shortcut_(sh,1) - 1 + i, 1)) += locals(istate,i) - end do - end do - !$OMP END CRITICAL - !$OMP END PARALLEL enddo - + do sh=blockb,min(blocke, shortcut_(0,2)) - !$OMP PARALLEL DO default(none) schedule(dynamic) & - !$OMP shared(vt, st, blockb, blocke, sh, shortcut_, version_, sorted_, sort_idx_, dav_det, dav_ut, N_int, N_states_diag) & - !$OMP private(exa, ni, ext, org_i, org_j, sorted_i, endi, hij, s2) - do sh2=sh, shortcut_(0,2), shortcut_(0,1) + do sh2=sh, shortcut_(0,2), shortcut_(0,1)*51 do i=shortcut_(sh2,2),shortcut_(sh2+1,2)-1 + ii += 1 org_i = sort_idx_(i,2) - do j=shortcut_(sh2,2),i-1 + do j=shortcut_(sh2,2),shortcut_(sh2+1,2)-1 + if(i == j) cycle org_j = sort_idx_(j,2) ext = 0 do ni=1,N_int @@ -115,20 +82,31 @@ subroutine davidson_process(blockb, blocke, vt, st) if(ext == 4) then call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) - !$OMP CRITICAL + if(.not. wrotten(ii)) then + wrotten(ii) = .true. + idx(ii) = org_i + vt (:,ii) = 0d0 + st (:,ii) = 0d0 + end if do istate=1,N_states_diag - vt (istate,org_i) = vt (istate,org_i) + hij*dav_ut(istate,org_j) - vt (istate,org_j) = vt (istate,org_j) + hij*dav_ut(istate,org_i) - st (istate,org_i) = st (istate,org_i) + s2*dav_ut(istate,org_j) - st (istate,org_j) = st (istate,org_j) + s2*dav_ut(istate,org_i) + vt (istate,ii) += hij*dav_ut(istate,org_j) + st (istate,ii) += s2*dav_ut(istate,org_j) enddo - !$OMP END CRITICAL end if end do end do enddo - !$OMP END PARALLEL DO enddo + + N=0 + do i=1,bs + if(wrotten(i)) then + N += 1 + idx(N) = idx(i) + vt(:,N) = vt(:,i) + st(:,N) = st(:,i) + end if + end do end subroutine @@ -194,12 +172,6 @@ subroutine davidson_slave_inproc(i) call davidson_run_slave(1,i) end -integer function davidson_slave_inproc_omp() - implicit none - - call davidson_run_slave(1,2) - davidson_slave_inproc_omp = 0 -end subroutine subroutine davidson_slave_tcp(i) implicit none @@ -252,8 +224,7 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) integer(ZMQ_PTR),intent(in) :: zmq_to_qp_run_socket integer(ZMQ_PTR),intent(in) :: zmq_socket_push integer,intent(in) :: worker_id - integer :: i, taskn, myTask, istate - integer, allocatable :: task_id(:) + integer :: task_id character*(512) :: task @@ -263,59 +234,42 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) double precision , allocatable :: vt(:,:) double precision , allocatable :: st(:,:) - allocate(task_id(100)) - allocate(idx(dav_size)) - allocate(vt(N_states_diag, dav_size)) - allocate(st(N_states_diag, dav_size)) - - vt = 0d0 - st = 0d0 - taskn = 0 + integer :: bs, i, j + allocate(idx(1), vt(1,1), st(1,1)) + do - call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, myTask, task) - if(myTask /= 0) then - read (task,*) blockb, blocke - call davidson_process(blockb, blocke, vt, st) - taskn += 1 - task_id(taskn) = myTask + call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id, task) + if(task_id == 0) exit + read (task,*) blockb, blocke + bs = shortcut_(blocke+1,1) - shortcut_(blockb, 1) + do i=blockb, shortcut_(0,2), shortcut_(0,1) + do j=i, min(i+blocke-blockb, shortcut_(0,2)) + bs += shortcut_(j+1,2) - shortcut_(j, 2) + end do + end do + if(bs > size(idx)) then + deallocate(idx, vt, st) + allocate(idx(bs)) + allocate(vt(N_states_diag, bs)) + allocate(st(N_states_diag, bs)) end if + + call davidson_process(blockb, blocke, N, idx, vt, st, bs) - - if(myTask == 0 .or. taskn == size(task_id)) then - N = 0 - do i=1, dav_size - if(vt(1,i) /= 0d0 .or. st(1,i) /= 0d0) then - N = N+1 - do istate=1,N_states_diag - vt (istate,N) = vt (istate,i) - st (istate,N) = st (istate,i) - idx(N) = i - enddo - end if - end do - - do i = 1, taskn - call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id(i)) - end do - if(taskn /= 0) call davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st, taskn, task_id) - - if(myTask == 0) exit - vt = 0d0 - st = 0d0 - taskn = 0 - end if + call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id) + call davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st, task_id) end do end subroutine -subroutine davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st, taskn, task_id) +subroutine davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st, task_id) use f77_zmq implicit none integer(ZMQ_PTR) ,intent(in) :: zmq_socket_push - integer ,intent(in) :: task_id(100), taskn + integer ,intent(in) :: task_id integer ,intent(in) :: blockb, blocke integer ,intent(in) :: N @@ -342,26 +296,23 @@ subroutine davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st rc = f77_zmq_send( zmq_socket_push, st, 8*N_states_diag* N, ZMQ_SNDMORE) if(rc /= 8*N_states_diag* N) stop "davidson_push_results failed to push st" - rc = f77_zmq_send( zmq_socket_push, taskn, 4, ZMQ_SNDMORE) - if(rc /= 4) stop "davidson_push_results failed to push taskn" - - rc = f77_zmq_send( zmq_socket_push, task_id, 4*taskn, 0) - if(rc /= 4*taskn) stop "davidson_push_results failed to push task_id" + rc = f77_zmq_send( zmq_socket_push, task_id, 4, 0) + if(rc /= 4) stop "davidson_push_results failed to push task_id" end subroutine -subroutine davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st, taskn, task_id) +subroutine davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st, task_id) use f77_zmq implicit none integer(ZMQ_PTR) ,intent(in) :: zmq_socket_pull - integer ,intent(out) :: task_id(100), taskn + integer ,intent(out) :: task_id integer ,intent(out) :: blockb, blocke integer ,intent(out) :: N - integer ,intent(out) :: idx(dav_size) - double precision ,intent(out) :: vt(N_states_diag, dav_size) - double precision ,intent(out) :: st(N_states_diag, dav_size) + integer ,intent(out) :: idx(*) + double precision ,intent(out) :: vt(N_states_diag, *) + double precision ,intent(out) :: st(N_states_diag, *) integer :: rc @@ -383,11 +334,8 @@ subroutine davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st rc = f77_zmq_recv( zmq_socket_pull, st, 8*N_states_diag* N, 0) if(rc /= 8*N_states_diag* N) stop "davidson_push_results failed to pull st" - rc = f77_zmq_recv( zmq_socket_pull, taskn, 4, 0) - if(rc /= 4) stop "davidson_pull_results failed to pull taskn" - - rc = f77_zmq_recv( zmq_socket_pull, task_id, 4*taskn, 0) - if(rc /= 4*taskn) stop "davidson_pull_results failed to pull task_id" + rc = f77_zmq_recv( zmq_socket_pull, task_id, 4, 0) + if(rc /= 4) stop "davidson_pull_results failed to pull task_id" end subroutine @@ -402,7 +350,7 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) double precision ,intent(inout) :: v0(dav_size, N_states_diag) double precision ,intent(inout) :: s0(dav_size, N_states_diag) - integer :: more, task_id(100), taskn + integer :: more, task_id integer :: blockb, blocke @@ -411,11 +359,12 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) double precision , allocatable :: vt(:,:), v0t(:,:), s0t(:,:) double precision , allocatable :: st(:,:) - integer :: i + integer :: msize - allocate(idx(dav_size)) - allocate(vt(N_states_diag, dav_size)) - allocate(st(N_states_diag, dav_size)) + msize = (max_workload + max_blocksize)*2 + allocate(idx(msize)) + allocate(vt(N_states_diag, msize)) + allocate(st(N_states_diag, msize)) allocate(v0t(N_states_diag, dav_size)) allocate(s0t(N_states_diag, dav_size)) @@ -425,13 +374,10 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0) more = 1 do while (more == 1) - call davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st, taskn, task_id) - + call davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st, task_id) !DIR$ FORCEINLINE call davidson_collect(blockb, blocke, N, idx, vt, st , v0t, s0t) - do i=1,taskn - call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id(i),more) - end do + call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more) end do deallocate(idx,vt,st) @@ -450,39 +396,41 @@ subroutine davidson_run(zmq_to_qp_run_socket , v0, s0) integer(ZMQ_PTR) :: zmq_collector integer(ZMQ_PTR), external :: new_zmq_pull_socket integer(ZMQ_PTR) :: zmq_socket_pull - integer(ZMQ_PTR) :: pthread_slave, pthread_miniserver - - + integer :: i integer, external :: omp_get_thread_num double precision , intent(inout) :: v0(dav_size, N_states_diag) double precision , intent(inout) :: s0(dav_size, N_states_diag) - integer, external :: davidson_miniserver_run, davidson_slave_inproc_omp + call zmq_set_running(zmq_to_qp_run_socket) zmq_collector = new_zmq_to_qp_run_socket() zmq_socket_pull = new_zmq_pull_socket() + i = omp_get_thread_num() PROVIDE nproc - - i = pthread_create ( pthread_miniserver, davidson_miniserver_run ) - i = pthread_create ( pthread_slave, davidson_slave_inproc_omp ) - - call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) - call end_zmq_to_qp_run_socket(zmq_collector) - call end_zmq_pull_socket(zmq_socket_pull) - call davidson_miniserver_end() - i = pthread_join(pthread_miniserver) - i = pthread_join(pthread_slave) - + !$OMP PARALLEL DEFAULT(shared) private(i) num_threads(nproc+2) + i = omp_get_thread_num() + if (i==0) then + call davidson_collector(zmq_collector, zmq_socket_pull , v0, s0) + call end_zmq_to_qp_run_socket(zmq_collector) + call end_zmq_pull_socket(zmq_socket_pull) + call davidson_miniserver_end() + else if(i==1) then + call davidson_miniserver_run() + else + call davidson_slave_inproc(i) + endif + !$OMP END PARALLEL call end_parallel_job(zmq_to_qp_run_socket, 'davidson') end subroutine -integer function davidson_miniserver_run() + +subroutine davidson_miniserver_run() use f77_zmq implicit none integer(ZMQ_PTR) responder @@ -509,7 +457,6 @@ integer function davidson_miniserver_run() enddo rc = f77_zmq_close(responder) - davidson_miniserver_run = 0 end subroutine @@ -574,7 +521,11 @@ END_PROVIDER &BEGIN_PROVIDER [ integer(bit_kind), version_, (N_int, dav_size, 2) ] &BEGIN_PROVIDER [ integer(bit_kind), sorted_, (N_int, dav_size, 2) ] &BEGIN_PROVIDER [ integer, sort_idx_, (dav_size, 2) ] - implicit none +&BEGIN_PROVIDER [ integer, max_blocksize ] +implicit none call sort_dets_ab_v(dav_det, sorted_(1,1,1), sort_idx_(1,1), shortcut_(0,1), version_(1,1,1), dav_size, N_int) call sort_dets_ba_v(dav_det, sorted_(1,1,2), sort_idx_(1,2), shortcut_(0,2), version_(1,1,2), dav_size, N_int) + max_blocksize = max(shortcut_(0,1), shortcut_(0,2)) END_PROVIDER + + diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 926531aa..475487d0 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -240,19 +240,21 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) touch dav_size dav_det = psi_det dav_ut = ut + workload = 0 blockb = shortcut(0,1) blocke = blockb call davidson_init(handler) do sh=shortcut(0,1),1,-1 workload += (shortcut(sh+1,1) - shortcut(sh,1))**2 - if(workload > 1000) then + if(workload > max_workload) then blocke = sh call davidson_add_task(handler, blocke, blockb) blockb = sh-1 workload = 0 end if enddo + if(blockb > 0) call davidson_add_task(handler, 1, blockb) call davidson_run(handler, v_0, s_0) @@ -265,3 +267,9 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) enddo end + +BEGIN_PROVIDER [ integer, max_workload ] + max_workload = 1000 +END_PROVIDER + + From c24c13a87611d424db679d9e5a63381db82ab426 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 10 Oct 2016 14:48:49 +0200 Subject: [PATCH 200/216] Fixed openmp private/public bug in MRCC --- plugins/MRCC_Utils/mrcc_utils.irp.f | 73 ++++++++++++++++------------ src/Davidson/davidson_parallel.irp.f | 2 +- src/Davidson/davidson_slave.irp.f | 8 +-- 3 files changed, 46 insertions(+), 37 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 128c49d7..4139ac30 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -349,8 +349,9 @@ integer function searchDet(dets, det, n, Nint) do while(.true.) searchDet = (l+h)/2 c = detCmp(dets(1,1,searchDet), det(1,1), Nint) - if(c == 0) return - if(c == 1) then + if(c == 0) then + return + else if(c == 1) then h = searchDet-1 else l = searchDet+1 @@ -498,12 +499,12 @@ subroutine tamise_exc(key, no, n, N_key) BEGIN_DOC ! Uncodumented : TODO END_DOC - integer,intent(in) :: no, n, N_key + integer,intent(in) :: no, n, N_key integer*2,intent(inout) :: key(4, N_key) - integer :: k,j - integer*2 :: tmp(4) - logical :: exc_inf - integer :: ni + integer :: k,j + integer*2 :: tmp(4) + logical :: exc_inf + integer :: ni k = no j = 2*k @@ -633,7 +634,6 @@ END_PROVIDER allocate(A_ind(0:N_det_ref+1, nex), A_val(N_det_ref+1, nex)) allocate(AtA_ind(N_det_ref * nex), AtA_val(N_det_ref * nex)) !!!!! MAY BE TOO SMALL ? !!!!!!!! allocate(x(nex), AtB(nex)) - allocate(A_val_mwen(nex), A_ind_mwen(nex)) allocate(N_col(nex), col_shortcut(nex)) allocate(x_new(nex)) @@ -645,7 +645,6 @@ END_PROVIDER AtA_val = 0d0 x = 0d0 A_val_mwen = 0d0 - A_ind_mwen = 0 N_col = 0 col_shortcut = 0 @@ -689,7 +688,8 @@ END_PROVIDER end do !$OMP END DO deallocate(lref) - !$OMP END PARALLEL + !$OMP END PARALLEL + print *, 'Done building A_val, A_ind' AtB = 0d0 AtA_size = 0 @@ -698,6 +698,8 @@ END_PROVIDER !$OMP PARALLEL default(none) shared(k, psi_non_ref_coef, A_ind, A_val, x, N_det_ref, nex, N_det_non_ref)& !$OMP private(at_row, a_col, t, i, r1, r2, wk, A_ind_mwen, A_val_mwen)& !$OMP shared(col_shortcut, N_col, AtB, AtA_size, AtA_val, AtA_ind, s) + allocate(A_val_mwen(nex), A_ind_mwen(nex)) + A_ind_mwen = 0 !$OMP DO schedule(dynamic, 100) do at_row = 1, nex wk = 0 @@ -711,10 +713,10 @@ END_PROVIDER r1 = 1 r2 = 1 do while ((A_ind(r1, at_row) /= 0).and.(A_ind(r2, a_col) /= 0)) - if(A_ind(r1, at_row) < A_ind(r2, a_col)) then - r1 = r1+1 - else if(A_ind(r1, at_row) > A_ind(r2, a_col)) then + if(A_ind(r1, at_row) > A_ind(r2, a_col)) then r2 = r2+1 + else if(A_ind(r1, at_row) < A_ind(r2, a_col)) then + r1 = r1+1 else t = t - A_val(r1, at_row) * A_val(r2, a_col) r1 = r1+1 @@ -748,7 +750,8 @@ END_PROVIDER !$OMP END CRITICAL end if end do - !$OMP END DO + !$OMP END DO NOWAIT + deallocate (A_ind_mwen, A_val_mwen) !$OMP END PARALLEL if(AtA_size > size(AtA_val)) stop "SIZA" @@ -1059,18 +1062,20 @@ subroutine apply_hole_local(det, exc, res, ok, Nint) res = det if(h1 /= 0) then - ii = (h1-1)/bit_kind_size + 1 - pos = mod(h1-1, 64)!iand(h1-1,bit_kind_size-1) ! mod 64 - if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) return - res(ii, s1) = ibclr(res(ii, s1), pos) + ii = (h1-1)/bit_kind_size + 1 + pos = iand(h1-1,bit_kind_size-1) ! mod 64 + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) == 0_8) then + return + endif + res(ii, s1) = ibclr(res(ii, s1), pos) end if - ii = (h2-1)/bit_kind_size + 1 - pos = mod(h2-1, 64)!iand(h2-1,bit_kind_size-1) - if(iand(det(ii, s2), ishft(1_bit_kind, pos)) == 0_8) return - res(ii, s2) = ibclr(res(ii, s2), pos) - - + ii = (h2-1)/bit_kind_size + 1 + pos = iand(h2-1,bit_kind_size-1) ! mod 64 + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) == 0_8) then + return + endif + res(ii, s2) = ibclr(res(ii, s2), pos) ok = .true. end subroutine @@ -1094,16 +1099,20 @@ subroutine apply_particle_local(det, exc, res, ok, Nint) res = det if(p1 /= 0) then - ii = (p1-1)/bit_kind_size + 1 - pos = mod(p1-1, 64)!iand(p1-1,bit_kind_size-1) - if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) return - res(ii, s1) = ibset(res(ii, s1), pos) + ii = (p1-1)/bit_kind_size + 1 + pos = iand(p1-1,bit_kind_size-1) + if(iand(det(ii, s1), ishft(1_bit_kind, pos)) /= 0_8) then + return + endif + res(ii, s1) = ibset(res(ii, s1), pos) end if - ii = (p2-1)/bit_kind_size + 1 - pos = mod(p2-1, 64)!iand(p2-1,bit_kind_size-1) - if(iand(det(ii, s2), ishft(1_bit_kind, pos)) /= 0_8) return - res(ii, s2) = ibset(res(ii, s2), pos) + ii = (p2-1)/bit_kind_size + 1 + pos = iand(p2-1,bit_kind_size-1) + if(iand(det(ii, s2), ishft(1_bit_kind, pos)) /= 0_8) then + return + endif + res(ii, s2) = ibset(res(ii, s2), pos) ok = .true. diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 175958f0..09bb3f8d 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -252,7 +252,7 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) double precision , allocatable :: vt(:,:) double precision , allocatable :: st(:,:) - allocate(task_id(100)) + allocate(task_id(10)) allocate(idx(dav_size)) allocate(vt(N_states_diag, dav_size)) allocate(st(N_states_diag, dav_size)) diff --git a/src/Davidson/davidson_slave.irp.f b/src/Davidson/davidson_slave.irp.f index 9195e46f..e28712e2 100644 --- a/src/Davidson/davidson_slave.irp.f +++ b/src/Davidson/davidson_slave.irp.f @@ -26,10 +26,10 @@ program davidson_slave print *, 'Davidson slave running' - ! !$OMP PARALLEL PRIVATE(i) - !i = omp_get_thread_num() - call davidson_slave_tcp(0) - !!$OMP END PARALLEL + !$OMP PARALLEL PRIVATE(i) + i = omp_get_thread_num() + call davidson_slave_tcp(i) + !$OMP END PARALLEL end do end From 3050eedc1fc38da3fce1144499592c4e243883f6 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 10 Oct 2016 16:38:06 +0200 Subject: [PATCH 201/216] Comments --- src/Davidson/davidson_parallel.irp.f | 4 ++-- src/Integrals_Bielec/mo_bi_integrals.irp.f | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index dbed456e..d610bb3d 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -90,8 +90,8 @@ subroutine davidson_process(blockb, blocke, N, idx, vt, st, bs) vt (:,ii) = 0d0 st (:,ii) = 0d0 end if -! call daxpy(N_states_diag,hij,dav_ut(1,org_j),1,vt(1,org_i),1) -! call daxpy(N_states_diag,s2, dav_ut(1,org_j),1,st(1,org_i),1) +! call daxpy(N_states_diag,hij,dav_ut(1,org_j),1,vt(1,ii),1) +! call daxpy(N_states_diag,s2, dav_ut(1,org_j),1,st(1,ii),1) do istate=1,N_states_diag vt (istate,ii) += hij*dav_ut(istate,org_j) st (istate,ii) += s2*dav_ut(istate,org_j) diff --git a/src/Integrals_Bielec/mo_bi_integrals.irp.f b/src/Integrals_Bielec/mo_bi_integrals.irp.f index 0a468c24..28c1e88b 100644 --- a/src/Integrals_Bielec/mo_bi_integrals.irp.f +++ b/src/Integrals_Bielec/mo_bi_integrals.irp.f @@ -240,9 +240,9 @@ subroutine add_integrals_to_map(mask_ijkl) exit endif bielec_tmp_1(i) = c*bielec_tmp_3(i,j0,k0) - enddo - - do i = 1, min(k,j1-i1) +! enddo +! +! do i = 1, min(k,j1-i1) if (abs(bielec_tmp_1(i)) < mo_integrals_threshold) then cycle endif From 6e897584e9d5a40bd26850c30ed771aa26dd2cb7 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 10 Oct 2016 17:08:53 +0200 Subject: [PATCH 202/216] Bug in integrals --- src/Integrals_Bielec/mo_bi_integrals.irp.f | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Integrals_Bielec/mo_bi_integrals.irp.f b/src/Integrals_Bielec/mo_bi_integrals.irp.f index 28c1e88b..0a468c24 100644 --- a/src/Integrals_Bielec/mo_bi_integrals.irp.f +++ b/src/Integrals_Bielec/mo_bi_integrals.irp.f @@ -240,9 +240,9 @@ subroutine add_integrals_to_map(mask_ijkl) exit endif bielec_tmp_1(i) = c*bielec_tmp_3(i,j0,k0) -! enddo -! -! do i = 1, min(k,j1-i1) + enddo + + do i = 1, min(k,j1-i1) if (abs(bielec_tmp_1(i)) < mo_integrals_threshold) then cycle endif From 9fe84ab137eb439ccd2fd57c965b32f6e97297df Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 11 Oct 2016 09:44:28 +0200 Subject: [PATCH 203/216] Add read_wf to overwrite_with_cas --- plugins/Psiref_CAS/overwrite_with_cas.irp.f | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/Psiref_CAS/overwrite_with_cas.irp.f b/plugins/Psiref_CAS/overwrite_with_cas.irp.f index 4d3d217d..d3ced1d1 100644 --- a/plugins/Psiref_CAS/overwrite_with_cas.irp.f +++ b/plugins/Psiref_CAS/overwrite_with_cas.irp.f @@ -1,3 +1,5 @@ program overwrite_w_cas + read_wf = .True. + TOUCH read_wf call extract_ref end From f3a46c55c1f67177ce43968ae7e6a58061700425 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 11 Oct 2016 22:44:51 +0200 Subject: [PATCH 204/216] Fixed selection bug --- plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f | 2 +- plugins/Selectors_full/zmq.irp.f | 2 +- src/Davidson/davidson_parallel.irp.f | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f b/plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f index 554c62d5..6e4cf44f 100644 --- a/plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f +++ b/plugins/Full_CI_ZMQ/selection_davidson_slave.irp.f @@ -12,7 +12,7 @@ program selection_slave end subroutine provide_everything - PROVIDE H_apply_buffer_allocated mo_bielec_integrals_in_map psi_det_generators psi_coef_generators psi_det_sorted_bit psi_selectors n_det_generators n_states generators_bitmask zmq_context + PROVIDE H_apply_buffer_allocated mo_bielec_integrals_in_map psi_det_generators psi_coef_generators psi_det_sorted_bit psi_selectors n_det_generators n_states generators_bitmask zmq_context mo_mono_elec_integral ! PROVIDE ci_electronic_energy mo_tot_num N_int end diff --git a/plugins/Selectors_full/zmq.irp.f b/plugins/Selectors_full/zmq.irp.f index f3dea8f5..dfa94884 100644 --- a/plugins/Selectors_full/zmq.irp.f +++ b/plugins/Selectors_full/zmq.irp.f @@ -114,7 +114,7 @@ subroutine zmq_get_psi(zmq_to_qp_run_socket, worker_id, energy, size_energy) if (N_det_selectors_read > 0) then N_det_selectors = N_det_selectors_read endif - SOFT_TOUCH psi_det psi_coef N_det_selectors N_det_generators psi_coef_generators psi_det_generators + SOFT_TOUCH psi_det psi_coef N_det_selectors N_det_generators end diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index d610bb3d..5243d3e4 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -4,12 +4,12 @@ use bitmasks use f77_zmq -subroutine davidson_process(blockb, blocke, N, idx, vt, st, bs) +subroutine davidson_process(blockb, blockb2, N, idx, vt, st, bs, istep) implicit none - integer , intent(in) :: blockb, blocke, bs + integer , intent(in) :: blockb, bs, blockb2, istep integer , intent(inout) :: N integer , intent(inout) :: idx(bs) double precision , intent(inout) :: vt(N_states_diag, bs) From 7fcb4008de319292a8511c6d7f51099aa518880a Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 11 Oct 2016 22:45:40 +0200 Subject: [PATCH 205/216] Improved parallel davidson --- src/Davidson/davidson_parallel.irp.f | 98 ++++++++++++------------ src/Davidson/u0Hu0.irp.f | 44 +++++++---- src/Integrals_Bielec/map_integrals.irp.f | 6 +- 3 files changed, 79 insertions(+), 69 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index 5243d3e4..cede52c9 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -20,11 +20,12 @@ subroutine davidson_process(blockb, blockb2, N, idx, vt, st, bs, istep) double precision :: s2, hij logical, allocatable :: wrotten(:) - allocate(wrotten(bs)) wrotten = .false. + PROVIDE dav_det - do sh = blockb, blocke + ii=0 + sh = blockb do sh2=1,shortcut_(0,1) exa = 0 do ni=1,N_int @@ -32,7 +33,7 @@ subroutine davidson_process(blockb, blockb2, N, idx, vt, st, bs, istep) end do if(exa > 2) cycle - do i=shortcut_(sh,1),shortcut_(sh+1,1)-1 + do i=blockb2+shortcut_(sh,1),shortcut_(sh+1,1)-1, istep ii = i - shortcut_(blockb,1) + 1 org_i = sort_idx_(i,1) @@ -60,47 +61,43 @@ subroutine davidson_process(blockb, blockb2, N, idx, vt, st, bs, istep) vt (istate,ii) += hij*dav_ut(istate,org_j) st (istate,ii) += s2*dav_ut(istate,org_j) enddo -! call daxpy(N_states_diag,hij,dav_ut(1,org_j),1,vt(1,org_i),1) -! call daxpy(N_states_diag,s2, dav_ut(1,org_j),1,st(1,org_i),1) endif enddo enddo enddo - enddo - do sh=blockb,min(blocke, shortcut_(0,2)) - do sh2=sh, shortcut_(0,2), shortcut_(0,1) - do i=shortcut_(sh2,2),shortcut_(sh2+1,2)-1 - ii += 1 - org_i = sort_idx_(i,2) - do j=shortcut_(sh2,2),shortcut_(sh2+1,2)-1 - if(i == j) cycle - org_j = sort_idx_(j,2) - ext = 0 - do ni=1,N_int - ext = ext + popcnt(xor(sorted_(ni,i,2), sorted_(ni,j,2))) + if (blockb <= shortcut_(0,2)) then + sh=blockb + do sh2=sh, shortcut_(0,2), shortcut_(0,1) + do i=blockb2+shortcut_(sh2,2),shortcut_(sh2+1,2)-1, istep + ii += 1 + org_i = sort_idx_(i,2) + do j=shortcut_(sh2,2),shortcut_(sh2+1,2)-1 + if(i == j) cycle + org_j = sort_idx_(j,2) + ext = 0 + do ni=1,N_int + ext = ext + popcnt(xor(sorted_(ni,i,2), sorted_(ni,j,2))) + end do + if(ext == 4) then + call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) + call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) + if(.not. wrotten(ii)) then + wrotten(ii) = .true. + idx(ii) = org_i + vt (:,ii) = 0d0 + st (:,ii) = 0d0 + end if + do istate=1,N_states_diag + vt (istate,ii) += hij*dav_ut(istate,org_j) + st (istate,ii) += s2*dav_ut(istate,org_j) + enddo + end if end do - if(ext == 4) then - call i_h_j (dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,hij) - call get_s2(dav_det(1,1,org_j),dav_det(1,1,org_i),n_int,s2) - if(.not. wrotten(ii)) then - wrotten(ii) = .true. - idx(ii) = org_i - vt (:,ii) = 0d0 - st (:,ii) = 0d0 - end if -! call daxpy(N_states_diag,hij,dav_ut(1,org_j),1,vt(1,ii),1) -! call daxpy(N_states_diag,s2, dav_ut(1,org_j),1,st(1,ii),1) - do istate=1,N_states_diag - vt (istate,ii) += hij*dav_ut(istate,org_j) - st (istate,ii) += s2*dav_ut(istate,org_j) - enddo - end if end do - end do - enddo - enddo + enddo + endif N=0 do i=1,bs @@ -112,16 +109,16 @@ subroutine davidson_process(blockb, blockb2, N, idx, vt, st, bs, istep) end if end do + end subroutine -subroutine davidson_collect(blockb, blocke, N, idx, vt, st , v0t, s0t) +subroutine davidson_collect(N, idx, vt, st , v0t, s0t) implicit none - integer , intent(in) :: blockb, blocke integer , intent(in) :: N integer , intent(in) :: idx(N) double precision , intent(in) :: vt(N_states_diag, N) @@ -175,16 +172,16 @@ end subroutine -subroutine davidson_add_task(zmq_to_qp_run_socket, blockb, blocke) +subroutine davidson_add_task(zmq_to_qp_run_socket, blockb, blockb2, istep) use f77_zmq implicit none integer(ZMQ_PTR) ,intent(in) :: zmq_to_qp_run_socket - integer ,intent(in) :: blockb, blocke + integer ,intent(in) :: blockb, blockb2, istep character*(512) :: task - write(task,*) blockb, blocke + write(task,*) blockb, blockb2, istep call add_task_to_taskserver(zmq_to_qp_run_socket, task) end subroutine @@ -213,7 +210,7 @@ subroutine davidson_run_slave(thread,iproc) integer, intent(in) :: thread, iproc - integer :: worker_id, task_id, blockb, blocke + integer :: worker_id, task_id, blockb character*(512) :: task integer(ZMQ_PTR),external :: new_zmq_to_qp_run_socket @@ -253,7 +250,7 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) character*(512) :: task - integer :: blockb, blocke + integer :: blockb, blockb2, istep integer :: N integer , allocatable :: idx(:) double precision , allocatable :: vt(:,:) @@ -266,10 +263,10 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) do call get_task_from_taskserver(zmq_to_qp_run_socket,worker_id, task_id, task) if(task_id == 0) exit - read (task,*) blockb, blocke - bs = shortcut_(blocke+1,1) - shortcut_(blockb, 1) + read (task,*) blockb, blockb2, istep + bs = shortcut_(blockb+1,1) - shortcut_(blockb, 1) do i=blockb, shortcut_(0,2), shortcut_(0,1) - do j=i, min(i+blocke-blockb, shortcut_(0,2)) + do j=i, min(i, shortcut_(0,2)) bs += shortcut_(j+1,2) - shortcut_(j, 2) end do end do @@ -280,10 +277,9 @@ subroutine davidson_slave_work(zmq_to_qp_run_socket, zmq_socket_push, worker_id) allocate(st(N_states_diag, bs)) end if - call davidson_process(blockb, blocke, N, idx, vt, st, bs) - + call davidson_process(blockb, blockb2, N, idx, vt, st, bs, istep) call task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id) - call davidson_push_results(zmq_socket_push, blockb, blocke, N, idx, vt, st, task_id) + call davidson_push_results(zmq_socket_push, blockb, blockb2, N, idx, vt, st, task_id) end do end subroutine @@ -387,7 +383,7 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0, LD integer :: msize - msize = (max_workload + max_blocksize)*2 + msize = (1 + max_blocksize)*2 allocate(idx(msize)) allocate(vt(N_states_diag, msize)) allocate(st(N_states_diag, msize)) @@ -402,7 +398,7 @@ subroutine davidson_collector(zmq_to_qp_run_socket, zmq_socket_pull , v0, s0, LD do while (more == 1) call davidson_pull_results(zmq_socket_pull, blockb, blocke, N, idx, vt, st, task_id) !DIR$ FORCEINLINE - call davidson_collect(blockb, blocke, N, idx, vt, st , v0t, s0t) + call davidson_collect(N, idx, vt, st , v0t, s0t) call zmq_delete_task(zmq_to_qp_run_socket,zmq_socket_pull,task_id,more) end do deallocate(idx,vt,st) diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index d1a7b8e2..09843aee 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -208,7 +208,8 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) integer :: N_st_8 integer, external :: align_double - integer :: workload, blockb, blocke + integer :: blockb, blockb2, istep + double precision :: ave_workload, workload integer(ZMQ_PTR) :: handler @@ -234,21 +235,38 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) call sort_dets_ab_v(keys_tmp, sorted, sort_idx, shortcut(0,1), version, n, Nint) call sort_dets_ba_v(keys_tmp, sorted, sort_idx, shortcut(0,2), version, n, Nint) - workload = 0 blockb = shortcut(0,1) - blocke = blockb call davidson_init(handler,n,N_st_8,ut) + + + ave_workload = 0.d0 + do sh=1,shortcut(0,1) + ave_workload += shortcut(0,1) + ave_workload += (shortcut(sh+1,1) - shortcut(sh,1))**2 + do i=sh, shortcut(0,2), shortcut(0,1) + do j=i, min(i, shortcut(0,2)) + ave_workload += (shortcut(j+1,2) - shortcut(j, 2))**2 + end do + end do + enddo + ave_workload = ave_workload/dble(shortcut(0,1)) + + + print *, 'Ave workload :', ave_workload + do sh=shortcut(0,1),1,-1 - workload += (shortcut(sh+1,1) - shortcut(sh,1))**2 - if(workload > max_workload) then - blocke = sh - call davidson_add_task(handler, blocke, blockb) - blockb = sh-1 - workload = 0 - end if + workload = shortcut(0,1)+dble(shortcut(sh+1,1) - shortcut(sh,1))**2 + do i=sh, shortcut(0,2), shortcut(0,1) + do j=i, min(i, shortcut(0,2)) + workload += (shortcut(j+1,2) - shortcut(j, 2))**2 + end do + end do + istep = 1+ int(0.5d0*workload/ave_workload) + do blockb2=0, istep-1 + call davidson_add_task(handler, sh, blockb2, istep) + enddo enddo - if(blockb > 0) call davidson_add_task(handler, 1, blockb) call davidson_run(handler, v_0, s_0, size(v_0,1)) do istate=1,N_st @@ -262,8 +280,4 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) end -BEGIN_PROVIDER [ integer, max_workload ] - max_workload = 1000 -END_PROVIDER - diff --git a/src/Integrals_Bielec/map_integrals.irp.f b/src/Integrals_Bielec/map_integrals.irp.f index 28b7d2e2..afc573aa 100644 --- a/src/Integrals_Bielec/map_integrals.irp.f +++ b/src/Integrals_Bielec/map_integrals.irp.f @@ -364,7 +364,7 @@ double precision function get_mo_bielec_integral(i,j,k,l,map) integer(key_kind) :: idx type(map_type), intent(inout) :: map real(integral_kind) :: tmp - PROVIDE mo_bielec_integrals_in_map + PROVIDE mo_bielec_integrals_in_map mo_integrals_cache if ( (i >= mo_integrals_cache_min) .and. & (j >= mo_integrals_cache_min) .and. & (k >= mo_integrals_cache_min) .and. & @@ -393,7 +393,7 @@ double precision function get_mo_bielec_integral_schwartz(i,j,k,l,map) integer(key_kind) :: idx type(map_type), intent(inout) :: map real(integral_kind) :: tmp - PROVIDE mo_bielec_integrals_in_map + PROVIDE mo_bielec_integrals_in_map mo_integrals_cache if (mo_bielec_integral_schwartz(i,k)*mo_bielec_integral_schwartz(j,l) > mo_integrals_threshold) then double precision, external :: get_mo_bielec_integral !DIR$ FORCEINLINE @@ -411,7 +411,7 @@ double precision function mo_bielec_integral(i,j,k,l) END_DOC integer, intent(in) :: i,j,k,l double precision :: get_mo_bielec_integral - PROVIDE mo_bielec_integrals_in_map + PROVIDE mo_bielec_integrals_in_map mo_integrals_cache !DIR$ FORCEINLINE mo_bielec_integral = get_mo_bielec_integral(i,j,k,l,mo_integrals_map) return From fa3ffdd6966a12f95803b716c40bf37b311814c9 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 11 Oct 2016 22:46:12 +0200 Subject: [PATCH 206/216] Comments in SVD of MRCC --- plugins/MRCC_Utils/mrcc_utils.irp.f | 45 ++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 4139ac30..79249051 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -810,14 +810,18 @@ END_PROVIDER if(res < 1d-8) exit end do - + ! rho_mrcc now contains A.X + norm = 0.d0 do i=1,N_det_non_ref norm = norm + rho_mrcc(i,s)*rho_mrcc(i,s) enddo + ! Norm now contains the norm of A.X + do i=1,N_det_ref norm = norm + psi_ref_coef(i,s)*psi_ref_coef(i,s) enddo + ! Norm now contains the norm of Psi + A.X print *, k, "res : ", res, "norm : ", sqrt(norm) @@ -829,30 +833,46 @@ END_PROVIDER if (rho_mrcc(i,s) == 0.d0) then rho_mrcc(i,s) = 1.d-32 endif + + ! f is such that f.\tilde{c_i} = c_i f = psi_non_ref_coef(i,s) / rho_mrcc(i,s) + ! Avoid numerical instabilities f = min(f,2.d0) f = max(f,-2.d0) + norm = norm + f*f *rho_mrcc(i,s)*rho_mrcc(i,s) rho_mrcc(i,s) = f enddo + ! norm now contains the norm of |T.Psi_0> + ! rho_mrcc now contains the f factors f = 1.d0/norm - norm = 0.d0 - do i=1,N_det_non_ref - norm = norm + psi_non_ref_coef(i,s)*psi_non_ref_coef(i,s) - enddo - f = dsqrt(f*norm) + ! f now contains 1/ - print *, 'norm of |T Psi_0> = ', norm*f*f + norm = 1.d0 + do i=1,N_det_ref + norm = norm - psi_ref_coef(i,s)*psi_ref_coef(i,s) + enddo + ! norm now contains + f = dsqrt(f*norm) + ! f normalises T.Psi_0 such that (1+T)|Psi> is normalized + + norm = norm*f + print *, 'norm of |T Psi_0> = ', dsqrt(norm) + + do i=1,N_det_ref + norm = norm + psi_ref_coef(i,s)*psi_ref_coef(i,s) + enddo do i=1,N_det_non_ref rho_mrcc(i,s) = rho_mrcc(i,s) * f enddo + ! rho_mrcc now contains the product of the scaling factors and the + ! normalization constant end do - print *, "done" END_PROVIDER @@ -860,13 +880,17 @@ BEGIN_PROVIDER [ double precision, dij, (N_det_ref, N_det_non_ref, N_states) ] integer :: s,i,j double precision, external :: get_dij_index print *, "computing amplitudes..." + !$OMP PARALLEL DEFAULT(shared) PRIVATE(s,i,j) do s=1, N_states + !$OMP DO do i=1, N_det_non_ref do j=1, N_det_ref dij(j, i, s) = get_dij_index(j, i, s, N_int) end do end do + !$OMP END DO end do + !$OMP END PARALLEL print *, "done computing amplitudes" END_PROVIDER @@ -879,10 +903,9 @@ double precision function get_dij_index(II, i, s, Nint) double precision :: HIi, phase if(lambda_type == 0) then - get_dij_index = get_dij(psi_ref(1,1,II), psi_non_ref(1,1,i), s, Nint) -! get_dij_index = get_dij_index * rho_mrcc(i,s) call get_phase(psi_ref(1,1,II), psi_non_ref(1,1,i), phase, N_int) - get_dij_index = get_dij_index * rho_mrcc(i,s) * phase + get_dij_index = get_dij(psi_ref(1,1,II), psi_non_ref(1,1,i), s, Nint) * phase + get_dij_index = get_dij_index * rho_mrcc(i,s) else call i_h_j(psi_ref(1,1,II), psi_non_ref(1,1,i), Nint, HIi) get_dij_index = HIi * lambda_mrcc(s, i) From 7906976c5a4545f392421d487c8212cc4705df7b Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 11 Oct 2016 23:00:31 +0200 Subject: [PATCH 207/216] Fixed IRP bug --- plugins/Selectors_full/zmq.irp.f | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/Selectors_full/zmq.irp.f b/plugins/Selectors_full/zmq.irp.f index dfa94884..8046212b 100644 --- a/plugins/Selectors_full/zmq.irp.f +++ b/plugins/Selectors_full/zmq.irp.f @@ -101,6 +101,7 @@ subroutine zmq_get_psi(zmq_to_qp_run_socket, worker_id, energy, size_energy) print *, '77_zmq_recv(zmq_to_qp_run_socket,psi_coef,psi_det_size*N_states*8,ZMQ_SNDMORE)' stop 'error' endif + TOUCH psi_det psi_coef rc = f77_zmq_recv(zmq_to_qp_run_socket,energy,size_energy*8,0) if (rc /= size_energy*8) then @@ -110,11 +111,12 @@ subroutine zmq_get_psi(zmq_to_qp_run_socket, worker_id, energy, size_energy) if (N_det_generators_read > 0) then N_det_generators = N_det_generators_read + TOUCH N_det_generators endif if (N_det_selectors_read > 0) then N_det_selectors = N_det_selectors_read + TOUCH N_det_selectors endif - SOFT_TOUCH psi_det psi_coef N_det_selectors N_det_generators end From c3a6b5ba6b0d9c5896bddb88974229f04c98993a Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 11 Oct 2016 23:42:05 +0200 Subject: [PATCH 208/216] Avoid extra calculation of S2 --- src/Davidson/diagonalization_hs2.irp.f | 46 ++++++++++++++------------ src/Davidson/diagonalize_CI.irp.f | 8 ++--- src/Davidson/u0Hu0.irp.f | 2 -- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/Davidson/diagonalization_hs2.irp.f b/src/Davidson/diagonalization_hs2.irp.f index c44a27d2..c8ac3733 100644 --- a/src/Davidson/diagonalization_hs2.irp.f +++ b/src/Davidson/diagonalization_hs2.irp.f @@ -1,4 +1,4 @@ -subroutine davidson_diag_hs2(dets_in,u_in,dim_in,energies,sze,N_st,N_st_diag,Nint,iunit) +subroutine davidson_diag_hs2(dets_in,u_in,s2_out,dim_in,energies,sze,N_st,N_st_diag,Nint,iunit) use bitmasks implicit none BEGIN_DOC @@ -22,7 +22,7 @@ subroutine davidson_diag_hs2(dets_in,u_in,dim_in,energies,sze,N_st,N_st_diag,Nin integer, intent(in) :: dim_in, sze, N_st, N_st_diag, Nint, iunit integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) double precision, intent(inout) :: u_in(dim_in,N_st_diag) - double precision, intent(out) :: energies(N_st) + double precision, intent(out) :: energies(N_st), s2_out(N_st) double precision, allocatable :: H_jj(:), S2_jj(:) double precision :: diag_h_mat_elem @@ -46,6 +46,9 @@ subroutine davidson_diag_hs2(dets_in,u_in,dim_in,energies,sze,N_st,N_st_diag,Nin !$OMP END PARALLEL call davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_st,N_st_diag,Nint,iunit) + do i=1,N_st_diag + s2_out(i) = S2_jj(i) + enddo deallocate (H_jj,S2_jj) end @@ -79,7 +82,8 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s END_DOC integer, intent(in) :: dim_in, sze, N_st, N_st_diag, Nint integer(bit_kind), intent(in) :: dets_in(Nint,2,sze) - double precision, intent(in) :: H_jj(sze), S2_jj(sze) + double precision, intent(in) :: H_jj(sze) + double precision, intent(inout) :: S2_jj(sze) integer, intent(in) :: iunit double precision, intent(inout) :: u_in(dim_in,N_st_diag) double precision, intent(out) :: energies(N_st_diag) @@ -200,7 +204,7 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s call normalize(u_in(1,k),sze) enddo - + do while (.not.converged) do k=1,N_st_diag @@ -239,12 +243,12 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s ! enddo ! enddo - call dgemm('T','N', shift2, N_st_diag, sze, & - 1.d0, U, size(U,1), W(1,shift+1), size(W,1), & + call dgemm('T','N', shift2, N_st_diag, sze, & + 1.d0, U, size(U,1), W(1,shift+1), size(W,1), & 0.d0, h(1,shift+1), size(h,1)) - call dgemm('T','N', shift2, N_st_diag, sze, & - 1.d0, U, size(U,1), S(1,shift+1), size(S,1), & + call dgemm('T','N', shift2, N_st_diag, sze, & + 1.d0, U, size(U,1), S(1,shift+1), size(S,1), & 0.d0, s_(1,shift+1), size(s_,1)) ! Diagonalize h @@ -254,14 +258,14 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s ! Compute S2 for each eigenvector ! ------------------------------- - call dgemm('N','N',shift2,shift2,shift2, & - 1.d0, s_, size(s_,1), y, size(y,1), & + call dgemm('N','N',shift2,shift2,shift2, & + 1.d0, s_, size(s_,1), y, size(y,1), & 0.d0, s_tmp, size(s_tmp,1)) - - call dgemm('T','N',shift2,shift2,shift2, & - 1.d0, y, size(y,1), s_tmp, size(s_tmp,1), & + + call dgemm('T','N',shift2,shift2,shift2, & + 1.d0, y, size(y,1), s_tmp, size(s_tmp,1), & 0.d0, s_, size(s_,1)) - + do k=1,shift2 s2(k) = s_(k,k) + S_z2_Sz enddo @@ -326,8 +330,8 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s ! enddo do k=1,N_st_diag do i=1,sze - R(i,k) = (lambda(k) * U(i,shift2+k) - W(i,shift2+k) ) & - * (1.d0 + s2(k) * U(i,shift2+k) - S(i,shift2+k) - S_z2_Sz) + R(i,k) = (lambda(k) * U(i,shift2+k) - W(i,shift2+k) ) & + * (1.d0 + s2(k) * U(i,shift2+k) - S(i,shift2+k) - S_z2_Sz) enddo if (k <= N_st) then residual_norm(k) = u_dot_u(R(1,k),sze) @@ -367,10 +371,10 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s ! enddo ! enddo ! - call dgemv('T',sze,N_st_diag*iter,1.d0,U,size(U,1), & - U(1,shift2+k),1,0.d0,c,1) - call dgemv('N',sze,N_st_diag*iter,-1.d0,U,size(U,1), & - c,1,1.d0,U(1,shift2+k),1) + call dgemv('T',sze,N_st_diag*iter,1.d0,U,size(U,1), & + U(1,shift2+k),1,0.d0,c,1) + call dgemv('N',sze,N_st_diag*iter,-1.d0,U,size(U,1), & + c,1,1.d0,U(1,shift2+k),1) ! ! do l=1,k-1 ! c(1) = u_dot_v(U(1,shift2+k),U(1,shift2+l),sze) @@ -379,7 +383,7 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s ! enddo ! enddo ! - call dgemv('T',sze,k-1,1.d0,U(1,shift2+1),size(U,1), & + call dgemv('T',sze,k-1,1.d0,U(1,shift2+1),size(U,1), & U(1,shift2+k),1,0.d0,c,1) call dgemv('N',sze,k-1,-1.d0,U(1,shift2+1),size(U,1), & c,1,1.d0,U(1,shift2+k),1) diff --git a/src/Davidson/diagonalize_CI.irp.f b/src/Davidson/diagonalize_CI.irp.f index ecd2d6b2..3b2c9ed0 100644 --- a/src/Davidson/diagonalize_CI.irp.f +++ b/src/Davidson/diagonalize_CI.irp.f @@ -59,13 +59,13 @@ END_PROVIDER ! size(CI_eigenvectors,1), & ! N_det,min(N_det,N_states),min(N_det,N_states_diag),N_int,output_determinants) ! - call davidson_diag_HS2(psi_det,CI_eigenvectors, & +! call u_0_S2_u_0(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int,& +! min(N_det,N_states_diag),size(CI_eigenvectors,1)) + + call davidson_diag_HS2(psi_det,CI_eigenvectors, CI_eigenvectors_s2, & size(CI_eigenvectors,1),CI_electronic_energy, & N_det,min(N_det,N_states),min(N_det,N_states_diag),N_int,output_determinants) - call u_0_S2_u_0(CI_eigenvectors_s2,CI_eigenvectors,N_det,psi_det,N_int,& - min(N_det,N_states_diag),size(CI_eigenvectors,1)) - else if (diag_algorithm == "Lapack") then diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index 09843aee..a1a72100 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -252,8 +252,6 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) ave_workload = ave_workload/dble(shortcut(0,1)) - print *, 'Ave workload :', ave_workload - do sh=shortcut(0,1),1,-1 workload = shortcut(0,1)+dble(shortcut(sh+1,1) - shortcut(sh,1))**2 do i=sh, shortcut(0,2), shortcut(0,1) From e356e97e167cf865a9129c3d37de5ad763e1feb9 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 12 Oct 2016 11:26:21 +0200 Subject: [PATCH 209/216] Introduced qp_run -slave --- ocaml/Qpackage.ml | 11 +++++++++++ ocaml/TaskServer.ml | 24 +++++++++++------------ ocaml/TaskServer.mli | 4 ++-- ocaml/qp_run.ml | 46 ++++++++++++++++++++++++++++++-------------- src/ZMQ/utils.irp.f | 14 +++++++++----- 5 files changed, 65 insertions(+), 34 deletions(-) diff --git a/ocaml/Qpackage.ml b/ocaml/Qpackage.ml index bd0d34fc..8011b23b 100644 --- a/ocaml/Qpackage.ml +++ b/ocaml/Qpackage.ml @@ -127,3 +127,14 @@ let get_ezfio_default directory data = |> aux ;; +let ezfio_work ezfio_file = + let result = + Filename.concat ezfio_file "work" + in + begin + match Sys.is_directory result with + | `Yes -> () + | _ -> Unix.mkdir result + end; + result +;; diff --git a/ocaml/TaskServer.ml b/ocaml/TaskServer.ml index 6f012981..cfc22cfc 100644 --- a/ocaml/TaskServer.ml +++ b/ocaml/TaskServer.ml @@ -48,20 +48,21 @@ let zmq_context = ZMQ.Context.create () -let bind_socket ~socket_type ~socket ~address = +let bind_socket ~socket_type ~socket ~port = let rec loop = function | 0 -> failwith @@ Printf.sprintf - "Unable to bind the %s socket : %s " - socket_type address + "Unable to bind the %s socket to port : %d " + socket_type port | -1 -> () | i -> try - ZMQ.Socket.bind socket address; + ZMQ.Socket.bind socket @@ Printf.sprintf "tcp://*:%d" port; loop (-1) with | Unix.Unix_error _ -> (Time.pause @@ Time.Span.of_float 1. ; loop (i-1) ) | other_exception -> raise other_exception - in loop 60 + in loop 60; + ZMQ.Socket.bind socket @@ Printf.sprintf "ipc:///tmp/qp_run:%d" port let hostname = lazy ( @@ -115,7 +116,7 @@ let stop ~port = let req_socket = ZMQ.Socket.create zmq_context ZMQ.Socket.req and address = - Printf.sprintf "tcp://%s:%d" (Lazy.force ip_address) port + Printf.sprintf "ipc:///tmp/qp_run:%d" port in ZMQ.Socket.set_linger_period req_socket 1_000_000; ZMQ.Socket.connect req_socket address; @@ -567,10 +568,8 @@ let start_pub_thread ~port = let pub_socket = ZMQ.Socket.create zmq_context ZMQ.Socket.pub - and address = - Printf.sprintf "tcp://*:%d" port in - bind_socket ~socket_type:"PUB" ~socket:pub_socket ~address; + bind_socket ~socket_type:"PUB" ~socket:pub_socket ~port; let pollitem = ZMQ.Poll.mask_of @@ -608,7 +607,7 @@ let run ~port = and address = "inproc://pair" in - bind_socket "PAIR" pair_socket address; + ZMQ.Socket.bind pair_socket address; let pub_thread = start_pub_thread ~port:(port+1) () @@ -617,11 +616,9 @@ let run ~port = (** Bind REP socket *) let rep_socket = ZMQ.Socket.create zmq_context ZMQ.Socket.rep - and address = - Printf.sprintf "tcp://*:%d" port in ZMQ.Socket.set_linger_period rep_socket 1_000_000; - bind_socket "REP" rep_socket address; + bind_socket "REP" rep_socket port; let initial_program_state = { queue = Queuing_system.create () ; @@ -721,6 +718,7 @@ let run ~port = ZMQ.Socket.send pair_socket @@ string_of_pub_state Stopped; Thread.join pub_thread; + ZMQ.Socket.close rep_socket diff --git a/ocaml/TaskServer.mli b/ocaml/TaskServer.mli index f923a18a..e1baab12 100644 --- a/ocaml/TaskServer.mli +++ b/ocaml/TaskServer.mli @@ -23,9 +23,9 @@ val debug : string -> unit (** ZeroMQ context *) val zmq_context : ZMQ.Context.t -(** Bind a ZMQ socket *) +(** Bind a ZMQ socket to a TCP port and to an IPC file /tmp/qp_run. *) val bind_socket : - socket_type:string -> socket:'a ZMQ.Socket.t -> address:string -> unit + socket_type:string -> socket:'a ZMQ.Socket.t -> port:int -> unit (** Name of the host on which the server runs *) val hostname : string lazy_t diff --git a/ocaml/qp_run.ml b/ocaml/qp_run.ml index 8a221614..e8c8d05a 100644 --- a/ocaml/qp_run.ml +++ b/ocaml/qp_run.ml @@ -15,7 +15,7 @@ let print_list () = let () = Random.self_init () -let run ~master exe ezfio_file = +let run slave exe ezfio_file = (** Check availability of the ports *) @@ -28,7 +28,7 @@ let run ~master exe ezfio_file = in let rec try_new_port port_number = try - List.iter [ 0;1;2;3;4 ] ~f:(fun i -> + List.iter [ 0;1;2;3;4;5;6;7;8;9 ] ~f:(fun i -> let address = Printf.sprintf "tcp://%s:%d" (Lazy.force TaskServer.ip_address) (port_number+i) in @@ -75,16 +75,23 @@ let run ~master exe ezfio_file = | 0 -> () | i -> failwith "Error: Input inconsistent\n" end; - begin - match master with - | Some address -> Unix.putenv ~key:"QP_RUN_ADDRESS_MASTER" ~data:address - | None -> () - end; - (** Start task server *) - let address = - Printf.sprintf "tcp://%s:%d" (Lazy.force TaskServer.ip_address) port_number + let qp_run_address_filename = + Filename.concat (Qpackage.ezfio_work ezfio_file) "qp_run_address" in + + let () = + if slave then + try + let address = + In_channel.read_all qp_run_address_filename + |> String.strip + in + Unix.putenv ~key:"QP_RUN_ADDRESS_MASTER" ~data:address + with Sys_error _ -> failwith "No master is not running" + in + + (** Start task server *) let task_thread = let thread = Thread.create ( fun () -> @@ -92,7 +99,16 @@ let run ~master exe ezfio_file = in thread (); in + let address = + Printf.sprintf "tcp://%s:%d" (Lazy.force TaskServer.ip_address) port_number + in Unix.putenv ~key:"QP_RUN_ADDRESS" ~data:address; + let () = + if (not slave) then + Out_channel.with_file qp_run_address_filename ~f:( + fun oc -> Out_channel.output_lines oc [address]) + in + (** Run executable *) let prefix = @@ -111,6 +127,8 @@ let run ~master exe ezfio_file = TaskServer.stop ~port:port_number; Thread.join task_thread; + if (not slave) then + Sys.remove qp_run_address_filename; let duration = Time.diff (Time.now()) time_start |> Core.Span.to_string in @@ -119,8 +137,8 @@ let run ~master exe ezfio_file = let spec = let open Command.Spec in empty - +> flag "master" (optional string) - ~doc:("address Address of the master process") + +> flag "slave" no_arg + ~doc:(" Needed for slave tasks") +> anon ("executable" %: string) +> anon ("ezfio_file" %: string) ;; @@ -138,8 +156,8 @@ Executes a Quantum Package binary file among these:\n\n" ) ) spec - (fun master exe ezfio_file () -> - run ~master exe ezfio_file + (fun slave exe ezfio_file () -> + run slave exe ezfio_file ) |> Command.run ~version: Git.sha1 ~build_info: Git.message diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index c3a55a05..61fb45de 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -670,12 +670,16 @@ subroutine disconnect_from_taskserver(zmq_to_qp_run_socket, & message = trim(message(1:rc)) read(message,*) reply, state - if ( (trim(reply) /= 'disconnect_reply').or. & - (trim(state) /= zmq_state) ) then - print *, 'Unable to disconnect : ', zmq_state - print *, trim(message) - stop -1 + if ((trim(reply) == 'disconnect_reply').and.(trim(state) == trim(zmq_state))) then + return endif + if (trim(message) == 'error No job is running') then + return + endif + + print *, 'Unable to disconnect : ', trim(zmq_state) + print *, trim(message) + stop -1 end From 5f836025780a884021c95b82871b4d56f1090716 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 12 Oct 2016 12:09:25 +0200 Subject: [PATCH 210/216] Introduced IPC for qp_run and sub sockets --- src/Davidson/davidson_parallel.irp.f | 4 +- src/ZMQ/utils.irp.f | 60 ++++++++++------------------ 2 files changed, 22 insertions(+), 42 deletions(-) diff --git a/src/Davidson/davidson_parallel.irp.f b/src/Davidson/davidson_parallel.irp.f index cede52c9..50b58f67 100644 --- a/src/Davidson/davidson_parallel.irp.f +++ b/src/Davidson/davidson_parallel.irp.f @@ -501,7 +501,7 @@ subroutine davidson_miniserver_end() integer rc character*(64) buf - address = trim(qp_run_address)//':11223' + address = trim(qp_run_address_tcp)//':11223' requester = f77_zmq_socket(zmq_context, ZMQ_REQ) rc = f77_zmq_connect(requester,address) @@ -520,7 +520,7 @@ subroutine davidson_miniserver_get() character*(20) buffer integer rc - address = trim(qp_run_address)//':11223' + address = trim(qp_run_address_tcp)//':11223' requester = f77_zmq_socket(zmq_context, ZMQ_REQ) rc = f77_zmq_connect(requester,address) diff --git a/src/ZMQ/utils.irp.f b/src/ZMQ/utils.irp.f index 61fb45de..84665199 100644 --- a/src/ZMQ/utils.irp.f +++ b/src/ZMQ/utils.irp.f @@ -17,6 +17,8 @@ END_PROVIDER BEGIN_PROVIDER [ character*(128), qp_run_address ] +&BEGIN_PROVIDER [ character*(128), qp_run_address_ipc ] +&BEGIN_PROVIDER [ character*(128), qp_run_address_tcp ] &BEGIN_PROVIDER [ integer, zmq_port_start ] use f77_zmq implicit none @@ -34,19 +36,22 @@ END_PROVIDER integer :: i do i=len(buffer),1,-1 if ( buffer(i:i) == ':') then - qp_run_address = trim(buffer(1:i-1)) + qp_run_address_tcp = trim(buffer(1:i-1)) read(buffer(i+1:), *) zmq_port_start exit endif enddo + qp_run_address_ipc = 'ipc:///tmp/qp_run' + qp_run_address = qp_run_address_ipc END_PROVIDER + BEGIN_PROVIDER [ character*(128), zmq_socket_pull_tcp_address ] +&BEGIN_PROVIDER [ character*(128), zmq_socket_pull_inproc_address ] &BEGIN_PROVIDER [ character*(128), zmq_socket_pair_inproc_address ] &BEGIN_PROVIDER [ character*(128), zmq_socket_push_tcp_address ] -&BEGIN_PROVIDER [ character*(128), zmq_socket_pull_inproc_address ] &BEGIN_PROVIDER [ character*(128), zmq_socket_push_inproc_address ] -&BEGIN_PROVIDER [ character*(128), zmq_socket_sub_tcp_address ] +&BEGIN_PROVIDER [ character*(128), zmq_socket_sub_address ] use f77_zmq implicit none BEGIN_DOC @@ -54,12 +59,12 @@ END_PROVIDER END_DOC character*(8), external :: zmq_port - zmq_socket_sub_tcp_address = trim(qp_run_address)//':'//zmq_port(1)//' ' zmq_socket_pull_tcp_address = 'tcp://*:'//zmq_port(2)//' ' - zmq_socket_push_tcp_address = trim(qp_run_address)//':'//zmq_port(2)//' ' zmq_socket_pull_inproc_address = 'inproc://'//zmq_port(2)//' ' - zmq_socket_push_inproc_address = zmq_socket_pull_inproc_address zmq_socket_pair_inproc_address = 'inproc://'//zmq_port(3)//' ' + zmq_socket_push_tcp_address = trim(qp_run_address_tcp)//':'//zmq_port(2)//' ' + zmq_socket_push_inproc_address = zmq_socket_pull_inproc_address + zmq_socket_sub_address = trim(qp_run_address)//':'//zmq_port(1)//' ' ! /!\ Don't forget to change subroutine reset_zmq_addresses END_PROVIDER @@ -72,12 +77,13 @@ subroutine reset_zmq_addresses END_DOC character*(8), external :: zmq_port - zmq_socket_sub_tcp_address = trim(qp_run_address)//':'//zmq_port(1)//' ' zmq_socket_pull_tcp_address = 'tcp://*:'//zmq_port(2)//' ' - zmq_socket_push_tcp_address = trim(qp_run_address)//':'//zmq_port(2)//' ' zmq_socket_pull_inproc_address = 'inproc://'//zmq_port(2)//' ' - zmq_socket_push_inproc_address = zmq_socket_pull_inproc_address zmq_socket_pair_inproc_address = 'inproc://'//zmq_port(3)//' ' + zmq_socket_push_tcp_address = trim(qp_run_address_tcp)//':'//zmq_port(2)//' ' + zmq_socket_push_inproc_address = zmq_socket_pull_inproc_address + zmq_socket_sub_address = trim(qp_run_address)//':'//zmq_port(1)//' ' + end @@ -105,6 +111,7 @@ subroutine switch_qp_run_to_master exit endif enddo + qp_run_address_tcp = qp_run_address call reset_zmq_addresses end @@ -367,7 +374,7 @@ function new_zmq_sub_socket() stop 'Unable to subscribe new_zmq_sub_socket' endif - rc = f77_zmq_connect(new_zmq_sub_socket, zmq_socket_sub_tcp_address) + rc = f77_zmq_connect(new_zmq_sub_socket, zmq_socket_sub_address) if (rc /= 0) then stop 'Unable to connect new_zmq_sub_socket' endif @@ -403,17 +410,6 @@ subroutine end_zmq_pair_socket(zmq_socket_pair) character*(8), external :: zmq_port rc = f77_zmq_unbind(zmq_socket_pair,zmq_socket_pair_inproc_address) -! if (rc /= 0) then -! print *, rc -! print *, irp_here, 'f77_zmq_unbind(zmq_socket_pair,zmq_socket_pair_inproc_address)' -! stop 'error' -! endif - -! rc = f77_zmq_setsockopt(zmq_socket_pair,0ZMQ_LINGER,1000,4) -! if (rc /= 0) then -! stop 'Unable to set ZMQ_LINGER on zmq_socket_pair' -! endif - rc = f77_zmq_close(zmq_socket_pair) if (rc /= 0) then print *, 'f77_zmq_close(zmq_socket_pair)' @@ -433,26 +429,7 @@ subroutine end_zmq_pull_socket(zmq_socket_pull) character*(8), external :: zmq_port rc = f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_inproc_address) -! if (rc /= 0) then -! print *, rc -! print *, irp_here, 'f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_inproc_address)' -! stop 'error' -! endif - rc = f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_tcp_address) -! if (rc /= 0) then -! print *, rc -! print *, irp_here, 'f77_zmq_unbind(zmq_socket_pull,zmq_socket_pull_tcp_address)' -! stop 'error' -! endif - -! call sleep(1) ! see https://github.com/zeromq/libzmq/issues/1922 - -! rc = f77_zmq_setsockopt(zmq_socket_pull,ZMQ_LINGER,10000,4) -! if (rc /= 0) then -! stop 'Unable to set ZMQ_LINGER on zmq_socket_pull' -! endif - rc = f77_zmq_close(zmq_socket_pull) if (rc /= 0) then print *, 'f77_zmq_close(zmq_socket_pull)' @@ -784,6 +761,9 @@ subroutine get_task_from_taskserver(zmq_to_qp_run_socket,worker_id,task_id,task) else if (trim(reply) == 'terminate') then task_id = 0 task = 'terminate' + else if (trim(message) == 'error No job is running') then + task_id = 0 + task = 'terminate' else print *, 'Unable to get the next task' print *, trim(message) From d7b40e6d1fc4056b4d996b852493b153f9089ece Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 13 Oct 2016 12:32:22 +0200 Subject: [PATCH 211/216] Removed core from queuing_system --- ocaml/Id.ml | 24 +++---- ocaml/Id.mli | 23 +++++++ ocaml/Queuing_system.ml | 143 ++++++++++++++++++++++++++++----------- ocaml/Queuing_system.mli | 63 +++++++++++++++++ ocaml/TaskServer.ml | 6 +- 5 files changed, 201 insertions(+), 58 deletions(-) create mode 100644 ocaml/Id.mli create mode 100644 ocaml/Queuing_system.mli diff --git a/ocaml/Id.ml b/ocaml/Id.ml index 660c3452..3e616922 100644 --- a/ocaml/Id.ml +++ b/ocaml/Id.ml @@ -1,26 +1,22 @@ -open Core.Std - -module Id : sig - type t - val of_int : int -> t - val to_int : t -> int - val of_string : string -> t - val to_string : t -> string - val increment : t -> t - val decrement : t -> t -end -= struct +module Id = struct type t = int + let of_int x = assert (x>0); x + let to_int x = x + let of_string x = - Int.of_string x + int_of_string x |> of_int + let to_string x = - Int.to_string x + string_of_int x + let increment x = x + 1 let decrement x = x - 1 + + let compare = compare end module Task = struct diff --git a/ocaml/Id.mli b/ocaml/Id.mli new file mode 100644 index 00000000..02d1efca --- /dev/null +++ b/ocaml/Id.mli @@ -0,0 +1,23 @@ +module Id : + sig + type t + val of_int : int -> t + val to_int : t -> int + val of_string : string -> t + val to_string : t -> string + val increment : t -> t + val decrement : t -> t + val compare : t -> t -> int + end + + +module Task : + sig + include (module type of Id) + end + + +module Client : + sig + include (module type of Id) + end diff --git a/ocaml/Queuing_system.ml b/ocaml/Queuing_system.ml index 29a60538..5ee263a1 100644 --- a/ocaml/Queuing_system.ml +++ b/ocaml/Queuing_system.ml @@ -1,27 +1,33 @@ -open Core.Std -open Qptypes - +module RunningMap = Map.Make (Id.Task) +module TasksMap = Map.Make (Id.Task) +module ClientsSet = Set.Make (Id.Client) type t = { queued : Id.Task.t list ; - running : (Id.Task.t, Id.Client.t) Map.Poly.t ; - tasks : (Id.Task.t, string) Map.Poly.t; - clients : Id.Client.t Set.Poly.t; + running : Id.Client.t RunningMap.t; + tasks : string TasksMap.t; + clients : ClientsSet.t; next_client_id : Id.Client.t; next_task_id : Id.Task.t; - number_of_queued : int; + number_of_queued : int; + number_of_running : int; + number_of_tasks : int; + number_of_clients : int; } let create () = { queued = [] ; - running = Map.Poly.empty ; - tasks = Map.Poly.empty; - clients = Set.Poly.empty; + running = RunningMap.empty ; + tasks = TasksMap.empty; + clients = ClientsSet.empty; next_client_id = Id.Client.of_int 1; next_task_id = Id.Task.of_int 1; - number_of_queued = 0; + number_of_queued = 0; + number_of_running = 0; + number_of_tasks = 0; + number_of_clients = 0; } @@ -33,9 +39,10 @@ let add_task ~task q = in { q with queued = task_id :: q.queued ; - tasks = Map.add q.tasks ~key:task_id ~data:task ; + tasks = TasksMap.add task_id task q.tasks; next_task_id = Id.Task.increment task_id ; number_of_queued = q.number_of_queued + 1; + number_of_tasks = q.number_of_tasks + 1; } @@ -46,8 +53,9 @@ let add_client q = q.next_client_id in { q with - clients = Set.add q.clients client_id; + clients = ClientsSet.add client_id q.clients; next_client_id = Id.Client.increment client_id; + number_of_clients = q.number_of_clients + 1; }, client_id @@ -55,47 +63,57 @@ let pop_task ~client_id q = let { queued ; running ; _ } = q in - assert (Set.mem q.clients client_id); + assert (ClientsSet.mem client_id q.clients); match queued with | task_id :: new_queue -> let new_q = { q with queued = new_queue ; - running = Map.add running ~key:task_id ~data:client_id ; - number_of_queued = q.number_of_queued - 1; + running = RunningMap.add task_id client_id running; + number_of_queued = q.number_of_queued - 1; + number_of_running = q.number_of_running + 1; } - in new_q, Some task_id, (Map.find q.tasks task_id) + and found = + try Some (TasksMap.find task_id q.tasks) + with Not_found -> None + in new_q, Some task_id, found | [] -> q, None, None let del_client ~client_id q = - assert (Set.mem q.clients client_id); + assert (ClientsSet.mem client_id q.clients); { q with - clients = Set.remove q.clients client_id } + clients = ClientsSet.remove client_id q.clients; + number_of_clients = q.number_of_clients - 1 + } let end_task ~task_id ~client_id q = let { running ; tasks ; _ } = q in - assert (Set.mem q.clients client_id); - let () = - match Map.Poly.find running task_id with - | None -> failwith "Task already finished" - | Some client_id_check -> assert (client_id_check = client_id) + assert (ClientsSet.mem client_id q.clients); + let () = + let client_id_check = + try RunningMap.find task_id running with + Not_found -> failwith "Task already finished" + in + assert (client_id_check = client_id) in { q with - running = Map.remove running task_id ; + running = RunningMap.remove task_id running ; + number_of_running = q.number_of_running - 1 } - + let del_task ~task_id q = let { tasks ; _ } = q in - if (Map.mem tasks task_id) then + if (TasksMap.mem task_id tasks) then { q with - tasks = Map.remove tasks task_id ; + tasks = TasksMap.remove task_id tasks; + number_of_tasks = q.number_of_tasks - 1; } else Printf.sprintf "Task %d is already deleted" (Id.Task.to_int task_id) @@ -103,36 +121,79 @@ let del_task ~task_id q = -let number q = - Map.length q.tasks +let number_of_tasks q = + assert (q.number_of_tasks >= 0); + q.number_of_tasks let number_of_queued q = + assert (q.number_of_queued >= 0); q.number_of_queued let number_of_running q = - Map.length q.running + assert (q.number_of_running >= 0); + q.number_of_running + +let number_of_clients q = + assert (q.number_of_clients >= 0); + q.number_of_clients -let to_string { queued ; running ; tasks ; _ } = +let to_string qs = + let { queued ; running ; tasks ; _ } = qs in let q = - List.map ~f:Id.Task.to_string queued - |> String.concat ~sep:" ; " + List.map Id.Task.to_string queued + |> String.concat " ; " and r = - Map.Poly.to_alist running - |> List.map ~f:(fun (t,c) -> "("^(Id.Task.to_string t)^", " + RunningMap.bindings running + |> List.map (fun (t,c) -> "("^(Id.Task.to_string t)^", " ^(Id.Client.to_string c)^")") - |> String.concat ~sep:" ; " + |> String.concat " ; " and t = - Map.Poly.to_alist tasks - |> List.map ~f:(fun (t,c) -> "("^(Id.Task.to_string t)^", \"" + TasksMap.bindings tasks + |> List.map (fun (t,c) -> "("^(Id.Task.to_string t)^", \"" ^c^"\")") - |> String.concat ~sep:" ; " + |> String.concat " ; " in Printf.sprintf "{ +Tasks : %d Queued : %d Running : %d Clients : %d queued : { %s } running : { %s } tasks : [ %s ] -}" q r t +}" +(number_of_tasks qs) (number_of_queued qs) (number_of_running qs) (number_of_clients qs) +q r t + +let test () = + let q = + create () + |> add_task ~task:"First Task" + |> add_task ~task:"Second Task" + in + let q, client_id = + add_client q + in + let q, task_id, task_content = + match pop_task ~client_id q with + | q, Some x, Some y -> q, Id.Task.to_int x, y + | _ -> assert false + in + Printf.printf "Task_id : %d \t\t Task : %s\n" task_id task_content; + let q, task_id, task_content = + match pop_task ~client_id q with + | q, Some x, Some y -> q, Id.Task.to_int x, y + | _ -> assert false + in + Printf.printf "Task_id : %d \t\t Task : %s\n" task_id task_content; + let q, task_id, task_content = + match pop_task ~client_id q with + | q, None, None -> q, 0, "None" + | _ -> assert false + in + Printf.printf "Task_id : %d \t\t Task : %s\n" task_id task_content; + q + |> to_string + |> print_endline + diff --git a/ocaml/Queuing_system.mli b/ocaml/Queuing_system.mli new file mode 100644 index 00000000..f0e8f941 --- /dev/null +++ b/ocaml/Queuing_system.mli @@ -0,0 +1,63 @@ +module RunningMap : Map.S with type key = Id.Task.t +module TasksMap : Map.S with type key = Id.Task.t +module ClientsSet : Set.S with type elt = Id.Client.t + +type t = { + queued : Id.Task.t list ; + running : Id.Client.t RunningMap.t ; + tasks : string TasksMap.t ; + clients : ClientsSet.t ; + next_client_id : Id.Client.t ; + next_task_id : Id.Task.t ; + number_of_queued : int ; + number_of_running : int ; + number_of_tasks : int ; + number_of_clients : int ; +} + +(** Creates a new queuing system. Returns the new queue. *) +val create : unit -> t + +(** Add a new task represented as a string. Returns the queue with the added task. *) +val add_task : task:string -> t -> t + +(** Add a new client. Returns the queue and a new client_id. *) +val add_client : t -> t * Id.Client.t + +(** Pops a task from the queue. The task is set as running on client client_id. + Returns the queue, a task_id and the content of the task. If the queue contains + no task, the task_id and the task content are None. *) +val pop_task : + client_id:ClientsSet.elt -> t -> t * Id.Task.t option * string option + +(** Deletes a client from the queuing system *) +val del_client : client_id:ClientsSet.elt -> t -> t + +(** Deletes a client from the queuing system. The client is assumed to be a member + of the set of clients. Returns the queue without the removed client. *) +val end_task : task_id:RunningMap.key -> client_id:ClientsSet.elt -> t -> t + +(** Deletes a task from the queuing system. The task is assumed to be a member + of the map of tasks. Returns the queue without the removed task. *) +val del_task : task_id:TasksMap.key -> t -> t + +(** Returns the number of tasks, assumed >= 0 *) +val number_of_tasks : t -> int + +(** Returns the number of queued tasks, assumed >= 0 *) +val number_of_queued : t -> int + +(** Returns the number of running tasks, assumed >= 0 *) +val number_of_running : t -> int + +(** Returns the number of connected clients, assumed >= 0 *) +val number_of_clients : t -> int + +(** Prints the content of the queue *) +val to_string : t -> string + +(** Test function for debug *) +val test : unit -> unit + + + diff --git a/ocaml/TaskServer.ml b/ocaml/TaskServer.ml index cfc22cfc..9a1797f8 100644 --- a/ocaml/TaskServer.ml +++ b/ocaml/TaskServer.ml @@ -306,7 +306,7 @@ let del_task msg program_state rep_socket = } in let more = - (Queuing_system.number new_program_state.queue > 0) + (Queuing_system.number_of_tasks new_program_state.queue > 0) in Message.DelTaskReply (Message.DelTaskReply_msg.create ~task_id ~more) |> Message.to_string @@ -678,9 +678,9 @@ let run ~port = (** Debug input *) Printf.sprintf "q:%d r:%d n:%d : %s\n%!" - (Queuing_system.number_of_queued program_state.queue) + (Queuing_system.number_of_queued program_state.queue) (Queuing_system.number_of_running program_state.queue) - (Queuing_system.number program_state.queue) + (Queuing_system.number_of_tasks program_state.queue) (Message.to_string message) |> debug; From b780a6540abaa08142be8d8912131a50bb41c6ca Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Fri, 14 Oct 2016 12:40:29 +0200 Subject: [PATCH 212/216] bugs in mrcepa0_general and mrcc_utils --- plugins/MRCC_Utils/mrcc_utils.irp.f | 5 +++-- plugins/mrcepa0/mrcepa0_general.irp.f | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 79249051..81893781 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -644,7 +644,7 @@ END_PROVIDER AtA_ind = 0 AtA_val = 0d0 x = 0d0 - A_val_mwen = 0d0 + !A_val_mwen = 0d0 N_col = 0 col_shortcut = 0 @@ -699,7 +699,8 @@ END_PROVIDER !$OMP private(at_row, a_col, t, i, r1, r2, wk, A_ind_mwen, A_val_mwen)& !$OMP shared(col_shortcut, N_col, AtB, AtA_size, AtA_val, AtA_ind, s) allocate(A_val_mwen(nex), A_ind_mwen(nex)) - A_ind_mwen = 0 + !A_ind_mwen = 0 + !A_val_mwen = 0d0 !$OMP DO schedule(dynamic, 100) do at_row = 1, nex wk = 0 diff --git a/plugins/mrcepa0/mrcepa0_general.irp.f b/plugins/mrcepa0/mrcepa0_general.irp.f index 1e7ad68d..63f03360 100644 --- a/plugins/mrcepa0/mrcepa0_general.irp.f +++ b/plugins/mrcepa0/mrcepa0_general.irp.f @@ -28,7 +28,7 @@ subroutine run(N_st,energy) enddo SOFT_TOUCH psi_coef ci_energy_dressed call write_double(6,ci_energy_dressed(1),"Final MRCC energy") - call ezfio_set_mrcc_cassd_energy(ci_energy_dressed(1)) + call ezfio_set_mrcepa0_energy(ci_energy_dressed(1)) call save_wavefunction energy(:) = ci_energy_dressed(:) else From 1f4cd4c318847520bf7fd84c7e545c5cadabf870 Mon Sep 17 00:00:00 2001 From: Yann Garniron Date: Mon, 17 Oct 2016 14:40:09 +0200 Subject: [PATCH 213/216] optimized calculation of inactive amplitudes --- plugins/MRCC_Utils/mrcc_utils.irp.f | 500 +++++++++++++++++----------- 1 file changed, 301 insertions(+), 199 deletions(-) diff --git a/plugins/MRCC_Utils/mrcc_utils.irp.f b/plugins/MRCC_Utils/mrcc_utils.irp.f index 81893781..14885153 100644 --- a/plugins/MRCC_Utils/mrcc_utils.irp.f +++ b/plugins/MRCC_Utils/mrcc_utils.irp.f @@ -616,204 +616,301 @@ END_PROVIDER BEGIN_PROVIDER [ double precision, dIj_unique, (hh_shortcut(hh_shortcut(0)+1)-1, N_states) ] &BEGIN_PROVIDER [ double precision, rho_mrcc, (N_det_non_ref, N_states) ] - implicit none - logical :: ok - integer :: i, j, k, s, II, pp, hh, ind, wk, nex, a_col, at_row - integer, external :: searchDet, unsortedSearchDet - integer(bit_kind) :: myDet(N_int, 2), myMask(N_int, 2) - integer :: N, INFO, AtA_size, r1, r2 - double precision , allocatable :: AtB(:), AtA_val(:), A_val(:,:), x(:), x_new(:), A_val_mwen(:) - double precision :: t, norm, cx, res - integer, allocatable :: A_ind(:,:), lref(:), AtA_ind(:), A_ind_mwen(:), col_shortcut(:), N_col(:) - double precision :: phase - - - - nex = hh_shortcut(hh_shortcut(0)+1)-1 - print *, "TI", nex, N_det_non_ref - allocate(A_ind(0:N_det_ref+1, nex), A_val(N_det_ref+1, nex)) - allocate(AtA_ind(N_det_ref * nex), AtA_val(N_det_ref * nex)) !!!!! MAY BE TOO SMALL ? !!!!!!!! - allocate(x(nex), AtB(nex)) - allocate(N_col(nex), col_shortcut(nex)) - allocate(x_new(nex)) - - do s = 1, N_states - - A_val = 0d0 - A_ind = 0 - AtA_ind = 0 - AtA_val = 0d0 - x = 0d0 - !A_val_mwen = 0d0 - N_col = 0 - col_shortcut = 0 - - !$OMP PARALLEL default(none) shared(psi_non_ref, hh_exists, pp_exists, N_int, A_val, A_ind)& - !$OMP shared(s, hh_shortcut, psi_ref_coef, N_det_non_ref, psi_non_ref_sorted, psi_non_ref_sorted_idx, psi_ref, N_det_ref)& - !$OMP private(lref, pp, II, ok, myMask, myDet, ind, phase, wk) - allocate(lref(N_det_non_ref)) - !$OMP DO schedule(static,10) - do hh = 1, hh_shortcut(0) - do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 - lref = 0 - do II = 1, N_det_ref - call apply_hole_local(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) - if(.not. ok) cycle - call apply_particle_local(myMask, pp_exists(1, pp), myDet, ok, N_int) - if(.not. ok) cycle - ind = searchDet(psi_non_ref_sorted(1,1,1), myDet(1,1), N_det_non_ref, N_int) - if(ind /= -1) then - call get_phase(myDet(1,1), psi_ref(1,1,II), phase, N_int) - if (phase > 0.d0) then - lref(psi_non_ref_sorted_idx(ind)) = II - else - lref(psi_non_ref_sorted_idx(ind)) = -II - endif - end if - end do - wk = 0 - do i=1, N_det_non_ref - if(lref(i) > 0) then - wk += 1 - A_val(wk, pp) = psi_ref_coef(lref(i), s) - A_ind(wk, pp) = i - else if(lref(i) < 0) then - wk += 1 - A_val(wk, pp) = -psi_ref_coef(-lref(i), s) - A_ind(wk, pp) = i - end if - end do - A_ind(0,pp) = wk - end do - end do - !$OMP END DO - deallocate(lref) - !$OMP END PARALLEL - print *, 'Done building A_val, A_ind' - - AtB = 0d0 - AtA_size = 0 - col_shortcut = 0 - N_col = 0 - !$OMP PARALLEL default(none) shared(k, psi_non_ref_coef, A_ind, A_val, x, N_det_ref, nex, N_det_non_ref)& - !$OMP private(at_row, a_col, t, i, r1, r2, wk, A_ind_mwen, A_val_mwen)& - !$OMP shared(col_shortcut, N_col, AtB, AtA_size, AtA_val, AtA_ind, s) - allocate(A_val_mwen(nex), A_ind_mwen(nex)) - !A_ind_mwen = 0 - !A_val_mwen = 0d0 - !$OMP DO schedule(dynamic, 100) - do at_row = 1, nex - wk = 0 - if(mod(at_row, 10000) == 0) print *, "AtA", at_row, "/", nex - do i=1,A_ind(0,at_row) - AtB(at_row) = AtB(at_row) + psi_non_ref_coef(A_ind(i, at_row), s) * A_val(i, at_row) - end do + implicit none + logical :: ok + integer :: i, j, k, s, II, pp, ppp, hh, ind, wk, nex, a_col, at_row + integer, external :: searchDet, unsortedSearchDet + integer(bit_kind) :: myDet(N_int, 2), myMask(N_int, 2) + integer :: N, INFO, AtA_size, r1, r2 + double precision , allocatable :: AtB(:), AtA_val(:), A_val(:,:), x(:), x_new(:), A_val_mwen(:) + double precision :: t, norm, cx, res + integer, allocatable :: A_ind(:,:), lref(:), AtA_ind(:), A_ind_mwen(:), col_shortcut(:), N_col(:) + double precision :: phase + + + integer, allocatable :: pathTo(:), active_hh_idx(:), active_pp_idx(:) + logical, allocatable :: active(:) + double precision, allocatable :: rho_mrcc_init(:,:) + integer :: nactive + + nex = hh_shortcut(hh_shortcut(0)+1)-1 + print *, "TI", nex, N_det_non_ref + + allocate(pathTo(N_det_non_ref), active(nex)) + allocate(active_pp_idx(nex), active_hh_idx(nex)) + allocate(rho_mrcc_init(N_det_non_ref, N_states)) + + pathTo = 0 + active = .false. + nactive = 0 + + + do hh = 1, hh_shortcut(0) + do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 + do II = 1, N_det_ref + call apply_hole_local(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) + if(.not. ok) cycle + call apply_particle_local(myMask, pp_exists(1, pp), myDet, ok, N_int) + if(.not. ok) cycle + ind = searchDet(psi_non_ref_sorted(1,1,1), myDet(1,1), N_det_non_ref, N_int) + if(ind == -1) cycle + ind = psi_non_ref_sorted_idx(ind) + if(pathTo(ind) == 0) then + pathTo(ind) = pp + else + active(pp) = .true. + active(pathTo(ind)) = .true. + end if + end do + end do + end do + + do hh = 1, hh_shortcut(0) + do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 + if(active(pp)) then + nactive = nactive + 1 + active_hh_idx(nactive) = hh + active_pp_idx(nactive) = pp + end if + end do + end do + + print *, nactive, "inact/", size(active) + + allocate(A_ind(0:N_det_ref+1, nactive), A_val(N_det_ref+1, nactive)) + allocate(AtA_ind(N_det_ref * nactive), AtA_val(N_det_ref * nactive)) + allocate(x(nex), AtB(nex)) + allocate(N_col(nactive), col_shortcut(nactive)) + allocate(x_new(nex)) + - do a_col = 1, nex - t = 0d0 - r1 = 1 - r2 = 1 - do while ((A_ind(r1, at_row) /= 0).and.(A_ind(r2, a_col) /= 0)) - if(A_ind(r1, at_row) > A_ind(r2, a_col)) then - r2 = r2+1 - else if(A_ind(r1, at_row) < A_ind(r2, a_col)) then - r1 = r1+1 - else - t = t - A_val(r1, at_row) * A_val(r2, a_col) - r1 = r1+1 - r2 = r2+1 - end if - end do - - if(a_col == at_row) then - t = t + 1.d0 - end if - if(t /= 0.d0) then - wk += 1 - A_ind_mwen(wk) = a_col - A_val_mwen(wk) = t - end if - end do - - if(wk /= 0) then - !$OMP CRITICAL - col_shortcut(at_row) = AtA_size+1 - N_col(at_row) = wk - if (AtA_size+wk > size(AtA_ind,1)) then - print *, AtA_size+wk , size(AtA_ind,1) - stop 'too small' - endif - do i=1,wk - AtA_ind(AtA_size+i) = A_ind_mwen(i) - AtA_val(AtA_size+i) = A_val_mwen(i) - enddo - AtA_size += wk - !$OMP END CRITICAL - end if - end do - !$OMP END DO NOWAIT - deallocate (A_ind_mwen, A_val_mwen) - !$OMP END PARALLEL - - if(AtA_size > size(AtA_val)) stop "SIZA" - print *, "ATA SIZE", ata_size - do i=1,nex - x(i) = AtB(i) - enddo - - double precision :: factor, resold - factor = 1.d0 - resold = huge(1.d0) - do k=0,100000 - !$OMP PARALLEL default(shared) private(cx, i, j, a_col) - - !$OMP DO - do i=1,N_det_non_ref - rho_mrcc(i,s) = 0.d0 - enddo - !$OMP END DO - - !$OMP DO - do a_col = 1, nex - cx = 0d0 - do i=col_shortcut(a_col), col_shortcut(a_col) + N_col(a_col) - 1 - cx = cx + x(AtA_ind(i)) * AtA_val(i) - end do - x_new(a_col) = AtB(a_col) + cx * factor - end do - !$OMP END DO - - !$OMP END PARALLEL - - res = 0.d0 - do a_col=1,nex - res = res + (X_new(a_col) - X(a_col))*(X_new(a_col) - X(a_col)) - end do - - if (res < resold) then - do a_col=1,nex - do j=1,N_det_non_ref - i = A_ind(j,a_col) - if (i==0) exit - rho_mrcc(i,s) = rho_mrcc(i,s) + A_val(j,a_col) * X_new(a_col) - enddo - X(a_col) = X_new(a_col) - end do -! factor = 1.d0 - else - factor = -factor * 0.5d0 - endif - resold = res + + do s = 1, N_states + + A_val = 0d0 + A_ind = 0 + AtA_ind = 0 + AtB = 0d0 + AtA_val = 0d0 + x = 0d0 + N_col = 0 + col_shortcut = 0 + + !$OMP PARALLEL default(none) shared(psi_non_ref, hh_exists, pp_exists, N_int, A_val, A_ind)& + !$OMP shared(s, hh_shortcut, psi_ref_coef, N_det_non_ref, psi_non_ref_sorted, psi_non_ref_sorted_idx, psi_ref, N_det_ref)& + !$OMP shared(active, active_hh_idx, active_pp_idx, nactive)& + !$OMP private(lref, pp, II, ok, myMask, myDet, ind, phase, wk, ppp, hh) + allocate(lref(N_det_non_ref)) + !$OMP DO schedule(static,10) + do ppp=1,nactive + pp = active_pp_idx(ppp) + hh = active_hh_idx(ppp) + lref = 0 + do II = 1, N_det_ref + call apply_hole_local(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) + if(.not. ok) cycle + call apply_particle_local(myMask, pp_exists(1, pp), myDet, ok, N_int) + if(.not. ok) cycle + ind = searchDet(psi_non_ref_sorted(1,1,1), myDet(1,1), N_det_non_ref, N_int) + if(ind /= -1) then + call get_phase(myDet(1,1), psi_ref(1,1,II), phase, N_int) + if (phase > 0.d0) then + lref(psi_non_ref_sorted_idx(ind)) = II + else + lref(psi_non_ref_sorted_idx(ind)) = -II + endif + end if + end do + wk = 0 + do i=1, N_det_non_ref + if(lref(i) > 0) then + wk += 1 + A_val(wk, ppp) = psi_ref_coef(lref(i), s) + A_ind(wk, ppp) = i + else if(lref(i) < 0) then + wk += 1 + A_val(wk, ppp) = -psi_ref_coef(-lref(i), s) + A_ind(wk, ppp) = i + end if + end do + A_ind(0,ppp) = wk + end do + !$OMP END DO + deallocate(lref) + !$OMP END PARALLEL - if(mod(k, 100) == 0) then - print *, "res", k, res - end if - - if(res < 1d-8) exit - end do - ! rho_mrcc now contains A.X - norm = 0.d0 + print *, 'Done building A_val, A_ind' + + AtA_size = 0 + col_shortcut = 0 + N_col = 0 + integer :: a_coll, at_roww + + + !$OMP PARALLEL default(none) shared(k, psi_non_ref_coef, A_ind, A_val, x, N_det_ref, nex, N_det_non_ref)& + !$OMP private(at_row, a_col, t, i, j, r1, r2, wk, A_ind_mwen, A_val_mwen, a_coll, at_roww)& + !$OMP shared(col_shortcut, N_col, AtB, AtA_size, AtA_val, AtA_ind, s, nactive, active_pp_idx) + allocate(A_val_mwen(nex), A_ind_mwen(nex)) + + !$OMP DO schedule(dynamic, 100) + do at_roww = 1, nactive ! nex + at_row = active_pp_idx(at_roww) + wk = 0 + if(mod(at_roww, 100) == 0) print *, "AtA", at_row, "/", nex + do i=1,A_ind(0,at_roww) + j = active_pp_idx(i) + AtB(at_row) = AtB(at_row) + psi_non_ref_coef(A_ind(i, at_roww), s) * A_val(i, at_roww) + end do + + do a_coll = 1, nactive + a_col = active_pp_idx(a_coll) + t = 0d0 + r1 = 1 + r2 = 1 + do while ((A_ind(r1, at_roww) /= 0).and.(A_ind(r2, a_coll) /= 0)) + if(A_ind(r1, at_roww) > A_ind(r2, a_coll)) then + r2 = r2+1 + else if(A_ind(r1, at_roww) < A_ind(r2, a_coll)) then + r1 = r1+1 + else + t = t - A_val(r1, at_roww) * A_val(r2, a_coll) + r1 = r1+1 + r2 = r2+1 + end if + end do + + if(a_col == at_row) then + t = t + 1.d0 + end if + if(t /= 0.d0) then + wk += 1 + A_ind_mwen(wk) = a_col + A_val_mwen(wk) = t + end if + end do + + if(wk /= 0) then + !$OMP CRITICAL + col_shortcut(at_roww) = AtA_size+1 + N_col(at_roww) = wk + if (AtA_size+wk > size(AtA_ind,1)) then + print *, AtA_size+wk , size(AtA_ind,1) + stop 'too small' + endif + do i=1,wk + AtA_ind(AtA_size+i) = A_ind_mwen(i) + AtA_val(AtA_size+i) = A_val_mwen(i) + enddo + AtA_size += wk + !$OMP END CRITICAL + end if + end do + !$OMP END DO NOWAIT + deallocate (A_ind_mwen, A_val_mwen) + !$OMP END PARALLEL + + print *, "ATA SIZE", ata_size + x = 0d0 + + + do a_coll = 1, nactive + a_col = active_pp_idx(a_coll) + X(a_col) = AtB(a_col) + end do + + rho_mrcc_init = 0d0 + + allocate(lref(N_det_ref)) + !$OMP PARALLEL DO default(shared) schedule(static, 1) & + !$OMP private(lref, hh, pp, II, myMask, myDet, ok, ind, phase) + do hh = 1, hh_shortcut(0) + do pp = hh_shortcut(hh), hh_shortcut(hh+1)-1 + if(active(pp)) cycle + lref = 0 + do II=1,N_det_ref + call apply_hole_local(psi_ref(1,1,II), hh_exists(1, hh), myMask, ok, N_int) + if(.not. ok) cycle + call apply_particle_local(myMask, pp_exists(1, pp), myDet, ok, N_int) + if(.not. ok) cycle + ind = searchDet(psi_non_ref_sorted(1,1,1), myDet(1,1), N_det_non_ref, N_int) + if(ind == -1) cycle + ind = psi_non_ref_sorted_idx(ind) + call get_phase(myDet(1,1), psi_ref(1,1,II), phase, N_int) + X(pp) += psi_ref_coef(II,s)**2 + AtB(pp) += psi_non_ref_coef(ind, s) * psi_ref_coef(II, s) * phase + lref(II) = ind + if(phase < 0d0) lref(II) = -ind + end do + X(pp) = AtB(pp) / X(pp) + do II=1,N_det_ref + if(lref(II) > 0) then + rho_mrcc_init(lref(II),s) = psi_ref_coef(II,s) * X(pp) + else if(lref(II) < 0) then + rho_mrcc_init(-lref(II),s) = -psi_ref_coef(II,s) * X(pp) + end if + end do + end do + end do + !$OMP END PARALLEL DO + + x_new = x + + double precision :: factor, resold + factor = 1.d0 + resold = huge(1.d0) + do k=0,100000 + !$OMP PARALLEL default(shared) private(cx, i, j, a_col, a_coll) + + !$OMP DO + do i=1,N_det_non_ref + rho_mrcc(i,s) = rho_mrcc_init(i,s) ! 0d0 + enddo + !$OMP END DO + + !$OMP DO + do a_coll = 1, nactive !: nex + a_col = active_pp_idx(a_coll) + cx = 0d0 + do i=col_shortcut(a_coll), col_shortcut(a_coll) + N_col(a_coll) - 1 + cx = cx + x(AtA_ind(i)) * AtA_val(i) + end do + x_new(a_col) = AtB(a_col) + cx * factor + end do + !$OMP END DO + + !$OMP END PARALLEL + + res = 0.d0 + + + if (res < resold) then + do a_coll=1,nactive ! nex + a_col = active_pp_idx(a_coll) + do j=1,N_det_non_ref + i = A_ind(j,a_coll) + if (i==0) exit + rho_mrcc(i,s) = rho_mrcc(i,s) + A_val(j,a_coll) * X_new(a_col) + enddo + res = res + (X_new(a_col) - X(a_col))*(X_new(a_col) - X(a_col)) + X(a_col) = X_new(a_col) + end do + factor = 1.d0 + else + factor = -factor * 0.5d0 + endif + resold = res + + if(mod(k, 5) == 0) then + print *, "res ", k, res + end if + + if(res < 1d-12) exit + end do + + + + norm = 0.d0 do i=1,N_det_non_ref norm = norm + rho_mrcc(i,s)*rho_mrcc(i,s) enddo @@ -826,7 +923,7 @@ END_PROVIDER print *, k, "res : ", res, "norm : ", sqrt(norm) - dIj_unique(:size(X), s) = X(:) + !dIj_unique(:size(X), s) = X(:) norm = 0.d0 double precision :: f @@ -871,12 +968,14 @@ END_PROVIDER enddo ! rho_mrcc now contains the product of the scaling factors and the ! normalization constant - - end do - + + dIj_unique(:size(X), s) = X(:) + end do END_PROVIDER + + BEGIN_PROVIDER [ double precision, dij, (N_det_ref, N_det_non_ref, N_states) ] integer :: s,i,j double precision, external :: get_dij_index @@ -1142,3 +1241,6 @@ subroutine apply_particle_local(det, exc, res, ok, Nint) ok = .true. end subroutine + + + From 85596d9e7a512df29215c604b66fd82cf1098205 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 17 Oct 2016 17:40:51 +0200 Subject: [PATCH 214/216] Queuing_system.ml pops from the back and adds to the front --- ocaml/Queuing_system.ml | 26 ++++++++++++++++++-------- ocaml/Queuing_system.mli | 4 ++-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/ocaml/Queuing_system.ml b/ocaml/Queuing_system.ml index 5ee263a1..0c668e16 100644 --- a/ocaml/Queuing_system.ml +++ b/ocaml/Queuing_system.ml @@ -3,7 +3,8 @@ module TasksMap = Map.Make (Id.Task) module ClientsSet = Set.Make (Id.Client) type t = -{ queued : Id.Task.t list ; +{ queued_front : Id.Task.t list ; + queued_back : Id.Task.t list ; running : Id.Client.t RunningMap.t; tasks : string TasksMap.t; clients : ClientsSet.t; @@ -18,7 +19,8 @@ type t = let create () = - { queued = [] ; + { queued_front = [] ; + queued_back = [] ; running = RunningMap.empty ; tasks = TasksMap.empty; clients = ClientsSet.empty; @@ -38,7 +40,7 @@ let add_task ~task q = q.next_task_id in { q with - queued = task_id :: q.queued ; + queued_front = task_id :: q.queued_front ; tasks = TasksMap.add task_id task q.tasks; next_task_id = Id.Task.increment task_id ; number_of_queued = q.number_of_queued + 1; @@ -60,15 +62,21 @@ let add_client q = let pop_task ~client_id q = - let { queued ; running ; _ } = + let { queued_front ; queued_back ; running ; _ } = q in assert (ClientsSet.mem client_id q.clients); - match queued with + let queued_front', queued_back' = + match queued_front, queued_back with + | (l, []) -> ( [], List.rev l) + | t -> t + in + match queued_back' with | task_id :: new_queue -> let new_q = { q with - queued = new_queue ; + queued_front= queued_front' ; + queued_back = new_queue ; running = RunningMap.add task_id client_id running; number_of_queued = q.number_of_queued - 1; number_of_running = q.number_of_running + 1; @@ -139,9 +147,10 @@ let number_of_clients q = let to_string qs = - let { queued ; running ; tasks ; _ } = qs in + let { queued_back ; queued_front ; running ; tasks ; _ } = qs in let q = - List.map Id.Task.to_string queued + (List.map Id.Task.to_string queued_front) @ + (List.map Id.Task.to_string @@ List.rev queued_back) |> String.concat " ; " and r = RunningMap.bindings running @@ -181,6 +190,7 @@ let test () = | _ -> assert false in Printf.printf "Task_id : %d \t\t Task : %s\n" task_id task_content; + to_string q |> print_endline ; let q, task_id, task_content = match pop_task ~client_id q with | q, Some x, Some y -> q, Id.Task.to_int x, y diff --git a/ocaml/Queuing_system.mli b/ocaml/Queuing_system.mli index f0e8f941..dc6836d2 100644 --- a/ocaml/Queuing_system.mli +++ b/ocaml/Queuing_system.mli @@ -3,7 +3,8 @@ module TasksMap : Map.S with type key = Id.Task.t module ClientsSet : Set.S with type elt = Id.Client.t type t = { - queued : Id.Task.t list ; + queued_front : Id.Task.t list ; + queued_back : Id.Task.t list ; running : Id.Client.t RunningMap.t ; tasks : string TasksMap.t ; clients : ClientsSet.t ; @@ -60,4 +61,3 @@ val to_string : t -> string val test : unit -> unit - From 62e8d1a0ac21f1981f08f85ed41cd038c3dcd2df Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 18 Oct 2016 13:38:45 +0200 Subject: [PATCH 215/216] The qp_run queue now pops from the back --- plugins/Full_CI_ZMQ/fci_zmq.irp.f | 2 +- src/Davidson/u0Hu0.irp.f | 2 +- src/Determinants/H_apply_zmq.template.f | 2 +- src/Integrals_Bielec/ao_bi_integrals.irp.f | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index c81b1266..a5dd8dcf 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -134,7 +134,7 @@ subroutine ZMQ_selection(N_in, pt2) step = int(5000000.d0 / dble(N_int * N_states * elec_num * elec_num * mo_tot_num * mo_tot_num )) step = max(1,step) - do i= N_det_generators, 1, -step + do i= 1,N_det_generators, step i_generator_start = max(i-step+1,1) i_generator_max = i write(task,*) i_generator_start, i_generator_max, 1, N diff --git a/src/Davidson/u0Hu0.irp.f b/src/Davidson/u0Hu0.irp.f index a1a72100..3787370a 100644 --- a/src/Davidson/u0Hu0.irp.f +++ b/src/Davidson/u0Hu0.irp.f @@ -252,7 +252,7 @@ subroutine H_S2_u_0_nstates(v_0,s_0,u_0,H_jj,S2_jj,n,keys_tmp,Nint,N_st,sze_8) ave_workload = ave_workload/dble(shortcut(0,1)) - do sh=shortcut(0,1),1,-1 + do sh=1,shortcut(0,1),1 workload = shortcut(0,1)+dble(shortcut(sh+1,1) - shortcut(sh,1))**2 do i=sh, shortcut(0,2), shortcut(0,1) do j=i, min(i, shortcut(0,2)) diff --git a/src/Determinants/H_apply_zmq.template.f b/src/Determinants/H_apply_zmq.template.f index d59f2994..59544b79 100644 --- a/src/Determinants/H_apply_zmq.template.f +++ b/src/Determinants/H_apply_zmq.template.f @@ -35,7 +35,7 @@ subroutine $subroutine($params_main) call zmq_put_psi(zmq_to_qp_run_socket,1,energy,size(energy)) - do i_generator=N_det_generators,1,-1 + do i_generator=1,N_det_generators $skip write(task,*) i_generator call add_task_to_taskserver(zmq_to_qp_run_socket,task) diff --git a/src/Integrals_Bielec/ao_bi_integrals.irp.f b/src/Integrals_Bielec/ao_bi_integrals.irp.f index 2ebb402e..9eadbf35 100644 --- a/src/Integrals_Bielec/ao_bi_integrals.irp.f +++ b/src/Integrals_Bielec/ao_bi_integrals.irp.f @@ -368,7 +368,7 @@ BEGIN_PROVIDER [ logical, ao_bielec_integrals_in_map ] call new_parallel_job(zmq_to_qp_run_socket,'ao_integrals') - do l=1,ao_num + do l=ao_num,1,-1 write(task,*) "triangle ", l call add_task_to_taskserver(zmq_to_qp_run_socket,task) enddo From 973065319ce7bdd46c3fab86f4edfb102341e107 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 18 Oct 2016 19:29:50 +0200 Subject: [PATCH 216/216] Introduced QR in Davidson --- ocaml/Progress_bar.ml | 4 +- src/Davidson/diagonalization_hs2.irp.f | 143 ++++++------------------- src/Utils/LinearAlgebra.irp.f | 44 +++++++- 3 files changed, 71 insertions(+), 120 deletions(-) diff --git a/ocaml/Progress_bar.ml b/ocaml/Progress_bar.ml index 2ca8bd00..b8e97a59 100644 --- a/ocaml/Progress_bar.ml +++ b/ocaml/Progress_bar.ml @@ -14,13 +14,13 @@ type t = let init ?(bar_length=20) ?(start_value=0.) ?(end_value=1.) ~title = { title ; start_value ; end_value ; bar_length ; cur_value=start_value ; - init_time= Time.now () ; dirty = true ; next = Time.now () } + init_time= Time.now () ; dirty = false ; next = Time.now () } let update ~cur_value bar = { bar with cur_value ; dirty=true } let increment_end bar = - { bar with end_value=(bar.end_value +. 1.) ; dirty=true } + { bar with end_value=(bar.end_value +. 1.) ; dirty=false } let increment_cur bar = { bar with cur_value=(bar.cur_value +. 1.) ; dirty=true } diff --git a/src/Davidson/diagonalization_hs2.irp.f b/src/Davidson/diagonalization_hs2.irp.f index c8ac3733..2db6b4cd 100644 --- a/src/Davidson/diagonalization_hs2.irp.f +++ b/src/Davidson/diagonalization_hs2.irp.f @@ -95,7 +95,6 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s double precision :: u_dot_v, u_dot_u - integer, allocatable :: kl_pairs(:,:) integer :: k_pairs, kl integer :: iter2 @@ -107,12 +106,14 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s character*(16384) :: write_buffer double precision :: to_print(3,N_st) double precision :: cpu, wall - integer :: shift, shift2 + integer :: shift, shift2, itermax include 'constants.include.F' !DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: U, W, R, S, y, h, lambda - if (N_st_diag > sze) then - stop 'error in Davidson : N_st_diag > sze' + if (N_st_diag*3 > sze) then + print *, 'error in Davidson :' + print *, 'Increase n_det_max_jacobi to ', N_st_diag*3 + stop -1 endif PROVIDE nuclear_repulsion @@ -147,26 +148,26 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s integer, external :: align_double sze_8 = align_double(sze) + itermax = min(davidson_sze_max, sze/N_st_diag) allocate( & - kl_pairs(2,N_st_diag*(N_st_diag+1)/2), & - W(sze_8,N_st_diag*davidson_sze_max), & - U(sze_8,N_st_diag*davidson_sze_max), & + W(sze_8,N_st_diag*itermax), & + U(sze_8,N_st_diag*itermax), & R(sze_8,N_st_diag), & - S(sze_8,N_st_diag*davidson_sze_max), & - h(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & - y(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & - s_(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & - s_tmp(N_st_diag*davidson_sze_max,N_st_diag*davidson_sze_max), & + S(sze_8,N_st_diag*itermax), & + h(N_st_diag*itermax,N_st_diag*itermax), & + y(N_st_diag*itermax,N_st_diag*itermax), & + s_(N_st_diag*itermax,N_st_diag*itermax), & + s_tmp(N_st_diag*itermax,N_st_diag*itermax), & residual_norm(N_st_diag), & - c(N_st_diag*davidson_sze_max), & - s2(N_st_diag*davidson_sze_max), & - lambda(N_st_diag*davidson_sze_max)) + c(N_st_diag*itermax), & + s2(N_st_diag*itermax), & + lambda(N_st_diag*itermax)) h = 0.d0 s_ = 0.d0 s_tmp = 0.d0 - c = 0.d0 U = 0.d0 + W = 0.d0 S = 0.d0 R = 0.d0 y = 0.d0 @@ -183,10 +184,6 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s converged = .False. - do k=1,N_st - call normalize(u_in(1,k),sze) - enddo - do k=N_st+1,N_st_diag do i=1,sze double precision :: r1, r2 @@ -194,14 +191,6 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s call random_number(r2) u_in(i,k) = dsqrt(-2.d0*dlog(r1))*dcos(dtwo_pi*r2) enddo - - ! Gram-Schmidt - ! ------------ - call dgemv('T',sze,k-1,1.d0,u_in,size(u_in,1), & - u_in(1,k),1,0.d0,c,1) - call dgemv('N',sze,k-1,-1.d0,u_in,size(u_in,1), & - c,1,1.d0,u_in(1,k),1) - call normalize(u_in(1,k),sze) enddo @@ -213,11 +202,12 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s enddo enddo - do iter=1,davidson_sze_max-1 + do iter=1,itermax-1 shift = N_st_diag*(iter-1) shift2 = N_st_diag*iter + call ortho_qr(U,size(U,1),sze,shift2) ! Compute |W_k> = \sum_i |i> ! ----------------------------------------- @@ -229,20 +219,6 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s ! Compute h_kl = = ! ------------------------------------------- - -! do l=1,N_st_diag -! do k=1,N_st_diag -! do iter2=1,iter-1 -! h(k,iter2,l,iter) = u_dot_v(U(1,k,iter2),W(1,l,iter),sze) -! h(k,iter,l,iter2) = h(k,iter2,l,iter) -! enddo -! enddo -! do k=1,l -! h(k,iter,l,iter) = u_dot_v(U(1,k,iter),W(1,l,iter),sze) -! h(l,iter,k,iter) = h(k,iter,l,iter) -! enddo -! enddo - call dgemm('T','N', shift2, N_st_diag, sze, & 1.d0, U, size(U,1), W(1,shift+1), size(W,1), & 0.d0, h(1,shift+1), size(h,1)) @@ -295,22 +271,6 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s ! Express eigenvectors of h in the determinant basis ! -------------------------------------------------- -! do k=1,N_st_diag -! do i=1,sze -! U(i,shift2+k) = 0.d0 -! W(i,shift2+k) = 0.d0 -! S(i,shift2+k) = 0.d0 -! enddo -! do l=1,N_st_diag*iter -! do i=1,sze -! U(i,shift2+k) = U(i,shift2+k) + U(i,l)*y(l,k) -! W(i,shift2+k) = W(i,shift2+k) + W(i,l)*y(l,k) -! S(i,shift2+k) = S(i,shift2+k) + S(i,l)*y(l,k) -! enddo -! enddo -! enddo -! -! call dgemm('N','N', sze, N_st_diag, shift2, & 1.d0, U, size(U,1), y, size(y,1), 0.d0, U(1,shift2+1), size(U,1)) call dgemm('N','N', sze, N_st_diag, shift2, & @@ -321,13 +281,6 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s ! Compute residual vector ! ----------------------- -! do k=1,N_st_diag -! print *, s2(k) -! s2(k) = u_dot_v(U(1,shift2+k), S(1,shift2+k), sze) + S_z2_Sz -! print *, s2(k) -! print *, '' -! pause -! enddo do k=1,N_st_diag do i=1,sze R(i,k) = (lambda(k) * U(i,shift2+k) - W(i,shift2+k) ) & @@ -338,14 +291,17 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s to_print(1,k) = lambda(k) + nuclear_repulsion to_print(2,k) = s2(k) to_print(3,k) = residual_norm(k) - if (residual_norm(k) > 1.e9) then - stop 'Davidson failed' - endif endif enddo - write(iunit,'(X,I3,X,100(X,F16.10,X,F11.6,X,E11.3))') iter, to_print(:,1:N_st) + write(iunit,'(X,I3,X,100(X,F16.10,X,F11.6,X,E11.3,A20))') iter, to_print(:,1:N_st), '' call davidson_converged(lambda,residual_norm,wall,iter,cpu,N_st,converged) + do k=1,N_st + if (residual_norm(k) > 1.e9) then + print *, '' + stop 'Davidson failed' + endif + enddo if (converged) then exit endif @@ -359,42 +315,10 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s enddo enddo - ! Gram-Schmidt - ! ------------ - - do k=1,N_st_diag - -! do l=1,N_st_diag*iter -! c(1) = u_dot_v(U(1,shift2+k),U(1,l),sze) -! do i=1,sze -! U(i,k,iter+1) = U(i,shift2+k) - c(1) * U(i,l) -! enddo -! enddo -! - call dgemv('T',sze,N_st_diag*iter,1.d0,U,size(U,1), & - U(1,shift2+k),1,0.d0,c,1) - call dgemv('N',sze,N_st_diag*iter,-1.d0,U,size(U,1), & - c,1,1.d0,U(1,shift2+k),1) -! -! do l=1,k-1 -! c(1) = u_dot_v(U(1,shift2+k),U(1,shift2+l),sze) -! do i=1,sze -! U(i,k,iter+1) = U(i,shift2+k) - c(1) * U(i,shift2+l) -! enddo -! enddo -! - call dgemv('T',sze,k-1,1.d0,U(1,shift2+1),size(U,1), & - U(1,shift2+k),1,0.d0,c,1) - call dgemv('N',sze,k-1,-1.d0,U(1,shift2+1),size(U,1), & - c,1,1.d0,U(1,shift2+k),1) - - call normalize( U(1,shift2+k), sze ) - enddo - enddo if (.not.converged) then - iter = davidson_sze_max-1 + iter = itermax-1 endif ! Re-contract to u_in @@ -404,20 +328,14 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s energies(k) = lambda(k) enddo -! do k=1,N_st_diag -! do i=1,sze -! do l=1,iter*N_st_diag -! u_in(i,k) += U(i,l)*y(l,k) -! enddo -! enddo -! enddo -! enddo - call dgemm('N','N', sze, N_st_diag, N_st_diag*iter, 1.d0, & U, size(U,1), y, size(y,1), 0.d0, u_in, size(u_in,1)) enddo + do k=1,N_st_diag + S2_jj(k) = s2(k) + enddo write_buffer = '===== ' do i=1,N_st write_buffer = trim(write_buffer)//' ================ =========== ===========' @@ -427,7 +345,6 @@ subroutine davidson_diag_hjj_sjj(dets_in,u_in,H_jj,S2_jj,energies,dim_in,sze,N_s call write_time(iunit) deallocate ( & - kl_pairs, & W, residual_norm, & U, & R, c, S, & diff --git a/src/Utils/LinearAlgebra.irp.f b/src/Utils/LinearAlgebra.irp.f index 00f61101..e44e8c2c 100644 --- a/src/Utils/LinearAlgebra.irp.f +++ b/src/Utils/LinearAlgebra.irp.f @@ -11,9 +11,9 @@ subroutine svd(A,LDA,U,LDU,D,Vt,LDVt,m,n) integer, intent(in) :: LDA, LDU, LDVt, m, n double precision, intent(in) :: A(LDA,n) - double precision, intent(out) :: U(LDU,n) + double precision, intent(out) :: U(LDU,m) double precision,intent(out) :: Vt(LDVt,n) - double precision,intent(out) :: D(n) + double precision,intent(out) :: D(min(m,n)) double precision,allocatable :: work(:) integer :: info, lwork, i, j, k @@ -24,13 +24,13 @@ subroutine svd(A,LDA,U,LDU,D,Vt,LDVt,m,n) ! Find optimal size for temp arrays allocate(work(1)) lwork = -1 - call dgesvd('A','A', n, n, A_tmp, LDA, & + call dgesvd('A','A', m, n, A_tmp, LDA, & D, U, LDU, Vt, LDVt, work, lwork, info) lwork = work(1) deallocate(work) allocate(work(lwork)) - call dgesvd('A','A', n, n, A_tmp, LDA, & + call dgesvd('A','A', m, n, A_tmp, LDA, & D, U, LDU, Vt, LDVt, work, lwork, info) deallocate(work,A_tmp) @@ -125,6 +125,40 @@ subroutine ortho_canonical(overlap,LDA,N,C,LDC,m) end +subroutine ortho_qr(A,LDA,m,n) + implicit none + BEGIN_DOC + ! Orthogonalization using Q.R factorization + ! + ! A : matrix to orthogonalize + ! + ! LDA : leftmost dimension of A + ! + ! n : Number of rows of A + ! + ! m : Number of columns of A + ! + END_DOC + integer, intent(in) :: m,n, LDA + double precision, intent(inout) :: A(LDA,n) + + integer :: lwork, info + integer, allocatable :: jpvt(:) + double precision, allocatable :: tau(:), work(:) + + allocate (jpvt(n), tau(n), work(1)) + LWORK=-1 +! call dgeqp3(m, n, A, LDA, jpvt, tau, WORK, LWORK, INFO) + call dgeqrf( m, n, A, LDA, TAU, WORK, LWORK, INFO ) + LWORK=WORK(1) + deallocate(WORK) + allocate(WORK(LWORK)) +! call dgeqp3(m, n, A, LDA, jpvt, tau, WORK, LWORK, INFO) + call dgeqrf( m, n, A, LDA, TAU, WORK, LWORK, INFO ) + call dorgqr(m, n, n, A, LDA, tau, WORK, LWORK, INFO) + deallocate(WORK,jpvt,tau) +end + subroutine ortho_lowdin(overlap,LDA,N,C,LDC,m) implicit none BEGIN_DOC @@ -161,7 +195,7 @@ subroutine ortho_lowdin(overlap,LDA,N,C,LDC,m) allocate(U(ldc,n),Vt(lda,n),S_half(lda,n),D(n)) - call svd(overlap,lda,U,ldc,D,Vt,lda,m,n) + call svd(overlap,lda,U,ldc,D,Vt,lda,n,n) !$OMP PARALLEL DEFAULT(NONE) & !$OMP SHARED(S_half,U,D,Vt,n,C,m) &

      re!mfYSImddQ1U*=ltc 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 +`conversion_factor_cm_1_hcc `_ + Conversion factor for the calculation of the hcc, according to the nuclear charge + + +`conversion_factor_gauss_hcc `_ + Conversion factor for the calculation of the hcc, according to the nuclear charge + + +`conversion_factor_mhz_hcc `_ + Conversion factor for the calculation of the hcc, according to the nuclear charge + + `delta_z `_ Undocumented @@ -62,6 +74,16 @@ Documentation Computes +`electronic_population_alpha `_ + spin population on the ao basis : + spin_population(i,j) = rho_AO(alpha)(i,j) - rho_AO(beta)(i,j) * + + +`electronic_population_beta `_ + spin population on the ao basis : + spin_population(i,j) = rho_AO(alpha)(i,j) - rho_AO(beta)(i,j) * + + `filter_connected_mono `_ Filters out the determinants that are not connected through PURE .br @@ -82,6 +104,14 @@ Documentation and with the density is stored in "density" +`gross_orbital_product_alpha `_ + gross orbital product + + +`gross_orbital_product_beta `_ + gross orbital product + + `i_o1_j `_ Returns where i and j are determinants and O1 is a ONE BODY OPERATOR @@ -128,6 +158,18 @@ Documentation .br +`iso_hcc_cm_1 `_ + isotropic hyperfine coupling constants among the various atoms + + +`iso_hcc_gauss `_ + isotropic hyperfine coupling constants among the various atoms + + +`iso_hcc_mhz `_ + isotropic hyperfine coupling constants among the various atoms + + `mo_integrated_delta_rho_one_point `_ .br array of the integrals needed of integrated_rho(alpha,z) - integrated_rho(beta,z) for z = z_one_point @@ -135,10 +177,71 @@ Documentation .br +`mulliken_densities_alpha `_ + .br + + +`mulliken_densities_beta `_ + .br + + +`mulliken_spin_densities `_ + ATOMIC SPIN POPULATION (ALPHA MINUS BETA) + + `n_z_pts `_ Undocumented +`print_hcc `_ + Undocumented + + +`print_hcc_main `_ + Undocumented + + +`print_mulliken `_ + Undocumented + + +`print_mulliken_sd `_ + Undocumented + + +`spin_density_at_nucleous `_ + value of the spin density at each nucleus + + +`spin_density_at_nucleous_contrib_mo `_ + value of the spin density at each nucleus + + +`spin_density_at_nucleous_contrib_mo_test `_ + value of the spin density at each nucleus + + +`spin_density_at_nucleous_contrib_per_mo `_ + value of the spin density at each nucleus + + +`spin_density_at_nucleous_from_mo `_ + value of the spin density at each nucleus + + +`spin_gross_orbital_product `_ + gross orbital product for the spin population + + +`spin_population `_ + spin population on the ao basis : + spin_population(i,j) = rho_AO(alpha)(i,j) - rho_AO(beta)(i,j) * + + +`spin_population_angular_momentum `_ + Undocumented + + `test_average_value `_ Undocumented diff --git a/plugins/Properties/tree_dependency.png b/plugins/Properties/tree_dependency.png index 1ba8d487bd079e5b22648688ccd8573aaa8be561..bab94f08b663a4ee522f3422b82bfc4fdc65b15e 100644 GIT binary patch literal 67884 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 z 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:uDP1X! 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

    2UT! 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 * `Generators_full `_ * `Psiref_Utils `_ +* `Psiref_CAS `_ Documentation ============= @@ -21,14 +22,6 @@ Documentation 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)) @@ -43,11 +36,11 @@ Documentation Compute 1st dimension such that it is aligned for vectorization. -`apply_rotation `_ +`apply_rotation `_ Apply the rotation found by find_rotation -`approx_dble `_ +`approx_dble `_ Undocumented @@ -70,23 +63,19 @@ Documentation 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 `_ +`ci_eigenvectors_dressed `_ Eigenvectors/values of the CI matrix -`ci_eigenvectors_s2_dressed `_ +`ci_eigenvectors_s2_dressed `_ Eigenvectors/values of the CI matrix -`ci_electronic_energy_dressed `_ +`ci_electronic_energy_dressed `_ Eigenvectors/values of the CI matrix -`ci_energy_dressed `_ +`ci_energy_dressed `_ N_states lowest eigenvalues of the dressed CI matrix @@ -150,15 +139,15 @@ Documentation Undocumented -`delta_ii `_ +`delta_ii `_ Dressing matrix in N_det basis -`delta_ij `_ +`delta_ij `_ Dressing matrix in N_det basis -`diagonalize_ci_dressed `_ +`diagonalize_ci_dressed `_ Replace the coefficients of the CI states by the coefficients of the eigenstates of the CI matrix @@ -198,11 +187,15 @@ Documentation 1/n! -`find_rotation `_ +`find_rotation `_ Find A.C = B -`find_triples_and_quadruples `_ +`find_triples_and_quadruples `_ + Undocumented + + +`find_triples_and_quadruples_micro `_ Undocumented @@ -228,23 +221,7 @@ Documentation Undocumented -`gen_det_idx `_ - Undocumented - - -`gen_det_shortcut `_ - Undocumented - - -`gen_det_sorted `_ - Undocumented - - -`gen_det_version `_ - Undocumented - - -`get_pseudo_inverse `_ +`get_pseudo_inverse `_ Find C = A^-1 @@ -304,7 +281,32 @@ h_apply_mrcc_monoexc Assume N_int is already provided. -`h_matrix_dressed `_ +h_apply_mrcc_pt2 + 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_pt2_diexc + Undocumented + + +h_apply_mrcc_pt2_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_pt2_diexcp + Undocumented + + +h_apply_mrcc_pt2_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 @@ -390,7 +392,11 @@ h_apply_mrcc_monoexc Hermite polynomial -`i2radix_sort `_ +`hij_mrcc `_ + < ref | H | Non-ref > matrix + + +`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. @@ -415,14 +421,14 @@ h_apply_mrcc_monoexc contains the new order of the elements. -`i8radix_sort `_ +`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 `_ +`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. @@ -521,14 +527,14 @@ h_apply_mrcc_monoexc 1/i -`iradix_sort `_ +`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 `_ +`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. @@ -553,19 +559,15 @@ h_apply_mrcc_monoexc contains the new order of the elements. -`lambda_mrcc `_ +`lambda_mrcc `_ cm/ or perturbative 1/Delta_E(m) -`lambda_mrcc_tmp `_ - Undocumented - - -`lambda_pert `_ +`lambda_mrcc_pt2 `_ cm/ or perturbative 1/Delta_E(m) -`lapack_diag `_ +`lapack_diag `_ Diagonalize matrix H .br H is untouched between input and ouptut @@ -576,7 +578,7 @@ h_apply_mrcc_monoexc .br -`lapack_diag_s2 `_ +`lapack_diag_s2 `_ Diagonalize matrix H .br H is untouched between input and ouptut @@ -587,7 +589,7 @@ h_apply_mrcc_monoexc .br -`lapack_diagd `_ +`lapack_diagd `_ Diagonalize matrix H .br H is untouched between input and ouptut @@ -598,7 +600,7 @@ h_apply_mrcc_monoexc .br -`lapack_partial_diag `_ +`lapack_partial_diag `_ Diagonalize matrix H .br H is untouched between input and ouptut @@ -613,7 +615,11 @@ h_apply_mrcc_monoexc n! -`mrcc_dress `_ +`lowercase `_ + Transform to lower case + + +`mrcc_dress `_ Undocumented @@ -626,7 +632,7 @@ h_apply_mrcc_monoexc D(t) =! D(t) +( B(t)*C(t)) -`normalize `_ +`normalize `_ Normalizes vector u u is expected to be aligned in memory. @@ -635,8 +641,8 @@ h_apply_mrcc_monoexc Number of current OpenMP threads -`ortho_lowdin `_ - Compute C_new=C_old.S^-1/2 canonical orthogonalization. +`ortho_canonical `_ + Compute C_new=C_old.U.s^-1/2 canonical orthogonalization. .br overlap : overlap matrix .br @@ -653,8 +659,22 @@ h_apply_mrcc_monoexc .br -`oscillations `_ - Undocumented +`ortho_lowdin `_ + Compute C_new=C_old.S^-1/2 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 `overlap_a_b_c `_ @@ -683,7 +703,7 @@ h_apply_mrcc_monoexc .br -`pert_determinants `_ +`pouet `_ Undocumented @@ -754,7 +774,7 @@ h_apply_mrcc_monoexc Undocumented -`set_generators_bitmasks_as_holes_and_particles `_ +`set_generators_bitmasks_as_holes_and_particles `_ Undocumented @@ -770,7 +790,7 @@ h_apply_mrcc_monoexc to be in integer*8 format -`set_zero_extra_diag `_ +`set_zero_extra_diag `_ Undocumented @@ -788,11 +808,16 @@ h_apply_mrcc_monoexc Stop the progress bar -`trap_signals `_ - What to do when a signal is caught. Here, trap Ctrl-C and call the control_C subroutine. +`svd `_ + Compute A = U.D.Vt + .br + LDx : leftmost dimension of x + .br + Dimsneion of A is m x n + .br -`u_dot_u `_ +`u_dot_u `_ Compute diff --git a/plugins/MRCC_Utils/tree_dependency.png b/plugins/MRCC_Utils/tree_dependency.png index 500e5d43cef50c14d1fbe3da85a9b19213ad6866..3c535b5c832fdbcd1dde7741345f090585b615f1 100644 GIT binary patch literal 131196 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