From b75e7dd2c2a51e57388cfaccdf97c9a72e0cff41 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 7 Oct 2016 12:22:43 +0200 Subject: [PATCH 01/23] 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 02/23] 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 2b5c93a58aea879ea64ba8803fe34185678580ef Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 7 Oct 2016 19:21:04 +0200 Subject: [PATCH 03/23] 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 04/23] 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 05/23] 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 06/23] 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 07/23] 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 08/23] 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 bd9a93abc9b2efaf571a3fbacbb9ec0bd430dca1 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sat, 8 Oct 2016 21:44:47 +0200 Subject: [PATCH 09/23] 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 10/23] 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 126ae4030591f8b2ac7707a15d03dd3e17c3078c Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 9 Oct 2016 22:51:40 +0200 Subject: [PATCH 11/23] 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 12/23] 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 13/23] 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 14/23] 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 c24c13a87611d424db679d9e5a63381db82ab426 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 10 Oct 2016 14:48:49 +0200 Subject: [PATCH 15/23] 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 16/23] 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 17/23] 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 18/23] 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 19/23] 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 20/23] 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 21/23] 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 22/23] 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 23/23] 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)