From 3967b197fa0ab8cbce39584b4e70ac6d0bd78e35 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 3 Jul 2019 08:29:59 +0200 Subject: [PATCH 1/2] Biblio --- docs/source/research.bib | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/source/research.bib b/docs/source/research.bib index 67a40766..124e1539 100644 --- a/docs/source/research.bib +++ b/docs/source/research.bib @@ -1,4 +1,14 @@ %%% ARXIV TO BE UPDATED %%% +@article{Giner2019Jul, + author = {Giner, Emmanuel and Scemama, Anthony and Toulouse, Julien and Loos, Pierre-Fran{\ifmmode\mbox{\c{c}}\else\c{c}\fi}ois}, + title = {{Chemically Accurate Excitation Energies With Small Basis Sets}}, + journal = {arXiv}, + year = {2019}, + month = {Jul}, + eprint = {1907.01245}, + url = {https://arxiv.org/abs/1907.01245} +} + @article{Dash2019May, author = {Dash, Monika and Feldt, Jonas and Moroni, Saverio and Scemama, Anthony and Filippi, Claudia}, title = {{Excited states with selected CI-QMC: chemically accurate excitation energies and geometries}}, From 3763767f778aa7abef876e34959a234adf178532 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 9 Jul 2019 13:40:06 +0200 Subject: [PATCH 2/2] Fix bug with deterministic PT2 --- src/cipsi/run_pt2_slave.irp.f | 2 +- src/cipsi/run_selection_slave.irp.f | 72 +++++++++++++++-------------- src/cipsi/slave_cipsi.irp.f | 2 +- src/ezfio_files/ezfio.irp.f | 2 + src/fci/pt2.irp.f | 9 +++- src/utils/c_functions.f90 | 19 ++++++++ src/utils/memory.irp.f | 3 ++ src/zmq/utils.irp.f | 1 - 8 files changed, 70 insertions(+), 40 deletions(-) create mode 100644 src/utils/c_functions.f90 diff --git a/src/cipsi/run_pt2_slave.irp.f b/src/cipsi/run_pt2_slave.irp.f index 21def8f2..cb1bc83f 100644 --- a/src/cipsi/run_pt2_slave.irp.f +++ b/src/cipsi/run_pt2_slave.irp.f @@ -148,7 +148,7 @@ subroutine run_pt2_slave_small(thread,iproc,energy) integer, external :: disconnect_from_taskserver do i=1,300 if (disconnect_from_taskserver(zmq_to_qp_run_socket,worker_id) /= -2) exit - call sleep(1) + call usleep(500) print *, 'Retry disconnect...' end do diff --git a/src/cipsi/run_selection_slave.irp.f b/src/cipsi/run_selection_slave.irp.f index c1542445..ac889794 100644 --- a/src/cipsi/run_selection_slave.irp.f +++ b/src/cipsi/run_selection_slave.irp.f @@ -74,7 +74,7 @@ subroutine run_selection_slave(thread,iproc,energy) if(done .or. ctask == size(task_id)) then do i=1, ctask if (task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id(i)) == -1) then - call sleep(1) + call usleep(100) if (task_done_to_taskserver(zmq_to_qp_run_socket,worker_id,task_id(i)) == -1) then ctask = 0 done = .true. @@ -85,6 +85,7 @@ subroutine run_selection_slave(thread,iproc,energy) if(ctask > 0) then call sort_selection_buffer(buf) ! call merge_selection_buffers(buf,buf2) +print *, task_id(1), pt2(1), buf%cur, ctask call push_selection_results(zmq_socket_push, pt2, variance, norm, buf, task_id(1), ctask) ! buf%mini = buf2%mini pt2(:) = 0d0 @@ -132,23 +133,24 @@ subroutine push_selection_results(zmq_socket_push, pt2, variance, norm, b, task_ print *, 'f77_zmq_send( zmq_socket_push, b%cur, 4, ZMQ_SNDMORE)' endif + + rc = f77_zmq_send( zmq_socket_push, pt2, 8*N_states, ZMQ_SNDMORE) + if(rc /= 8*N_states) then + print *, 'f77_zmq_send( zmq_socket_push, pt2, 8*N_states, ZMQ_SNDMORE)' + endif + + rc = f77_zmq_send( zmq_socket_push, variance, 8*N_states, ZMQ_SNDMORE) + if(rc /= 8*N_states) then + print *, 'f77_zmq_send( zmq_socket_push, variance, 8*N_states, ZMQ_SNDMORE)' + endif + + rc = f77_zmq_send( zmq_socket_push, norm, 8*N_states, ZMQ_SNDMORE) + if(rc /= 8*N_states) then + print *, 'f77_zmq_send( zmq_socket_push, norm, 8*N_states, ZMQ_SNDMORE)' + endif + if (b%cur > 0) then - rc = f77_zmq_send( zmq_socket_push, pt2, 8*N_states, ZMQ_SNDMORE) - if(rc /= 8*N_states) then - print *, 'f77_zmq_send( zmq_socket_push, pt2, 8*N_states, ZMQ_SNDMORE)' - endif - - rc = f77_zmq_send( zmq_socket_push, variance, 8*N_states, ZMQ_SNDMORE) - if(rc /= 8*N_states) then - print *, 'f77_zmq_send( zmq_socket_push, variance, 8*N_states, ZMQ_SNDMORE)' - endif - - rc = f77_zmq_send( zmq_socket_push, norm, 8*N_states, ZMQ_SNDMORE) - if(rc /= 8*N_states) then - print *, 'f77_zmq_send( zmq_socket_push, norm, 8*N_states, ZMQ_SNDMORE)' - endif - rc = f77_zmq_send( zmq_socket_push, b%val(1), 8*b%cur, ZMQ_SNDMORE) if(rc /= 8*b%cur) then print *, 'f77_zmq_send( zmq_socket_push, b%val(1), 8*b%cur, ZMQ_SNDMORE)' @@ -203,22 +205,26 @@ subroutine pull_selection_results(zmq_socket_pull, pt2, variance, norm, val, det print *, 'f77_zmq_recv( zmq_socket_pull, N, 4, 0)' endif + pt2(:) = 0.d0 + variance(:) = 0.d0 + norm(:) = 0.d0 + + rc = f77_zmq_recv( zmq_socket_pull, pt2, N_states*8, 0) + if(rc /= 8*N_states) then + print *, 'f77_zmq_recv( zmq_socket_pull, pt2, N_states*8, 0)' + endif + + rc = f77_zmq_recv( zmq_socket_pull, variance, N_states*8, 0) + if(rc /= 8*N_states) then + print *, 'f77_zmq_recv( zmq_socket_pull, variance, N_states*8, 0)' + endif + + rc = f77_zmq_recv( zmq_socket_pull, norm, N_states*8, 0) + if(rc /= 8*N_states) then + print *, 'f77_zmq_recv( zmq_socket_pull, norm, N_states*8, 0)' + endif + if (N>0) then - rc = f77_zmq_recv( zmq_socket_pull, pt2, N_states*8, 0) - if(rc /= 8*N_states) then - print *, 'f77_zmq_recv( zmq_socket_pull, pt2, N_states*8, 0)' - endif - - rc = f77_zmq_recv( zmq_socket_pull, variance, N_states*8, 0) - if(rc /= 8*N_states) then - print *, 'f77_zmq_recv( zmq_socket_pull, variance, N_states*8, 0)' - endif - - rc = f77_zmq_recv( zmq_socket_pull, norm, N_states*8, 0) - if(rc /= 8*N_states) then - print *, 'f77_zmq_recv( zmq_socket_pull, norm, N_states*8, 0)' - endif - rc = f77_zmq_recv( zmq_socket_pull, val(1), 8*N, 0) if(rc /= 8*N) then print *, 'f77_zmq_recv( zmq_socket_pull, val(1), 8*N, 0)' @@ -228,10 +234,6 @@ subroutine pull_selection_results(zmq_socket_pull, pt2, variance, norm, val, det if(rc /= bit_kind*N_int*2*N) then print *, 'f77_zmq_recv( zmq_socket_pull, det(1,1,1), bit_kind*N_int*2*N, 0)' endif - else - pt2(:) = 0.d0 - variance(:) = 0.d0 - norm(:) = 0.d0 endif rc = f77_zmq_recv( zmq_socket_pull, ntask, 4, 0) diff --git a/src/cipsi/slave_cipsi.irp.f b/src/cipsi/slave_cipsi.irp.f index c9710c18..3e33dfa8 100644 --- a/src/cipsi/slave_cipsi.irp.f +++ b/src/cipsi/slave_cipsi.irp.f @@ -63,7 +63,7 @@ subroutine run_slave_main if (mpi_master) then call wait_for_states(states,zmq_state,size(states)) if (zmq_state(1:64) == old_state(1:64)) then - call sleep(1) + call usleep(200) cycle else old_state(1:64) = zmq_state(1:64) diff --git a/src/ezfio_files/ezfio.irp.f b/src/ezfio_files/ezfio.irp.f index 70277992..e7a7a159 100644 --- a/src/ezfio_files/ezfio.irp.f +++ b/src/ezfio_files/ezfio.irp.f @@ -39,6 +39,8 @@ BEGIN_PROVIDER [ character*(128), ezfio_filename ] write(command,*) 'echo 15 > /proc//'//trim(adjustl(pidc))//'/oom_adj' call system(command) + PROVIDE file_lock + END_PROVIDER BEGIN_PROVIDER [ character*(128), ezfio_work_dir ] diff --git a/src/fci/pt2.irp.f b/src/fci/pt2.irp.f index 6135864f..c916e0ef 100644 --- a/src/fci/pt2.irp.f +++ b/src/fci/pt2.irp.f @@ -43,8 +43,13 @@ subroutine run E_CI_before(:) = psi_energy(:) + nuclear_repulsion relative_error=PT2_relative_error - call ZMQ_pt2(psi_energy_with_nucl_rep,pt2,relative_error,error, variance, & - norm,0) ! Stochastic PT2 + if (do_pt2) then + call ZMQ_pt2(psi_energy_with_nucl_rep,pt2,relative_error,error, variance, & + norm,0) ! Stochastic PT2 + else + call ZMQ_selection(0, pt2, variance, norm) + endif + do k=1,N_states rpt2(k) = pt2(k)/(1.d0 + norm(k)) enddo diff --git a/src/utils/c_functions.f90 b/src/utils/c_functions.f90 new file mode 100644 index 00000000..32bd5005 --- /dev/null +++ b/src/utils/c_functions.f90 @@ -0,0 +1,19 @@ +module c_functions + use iso_c_binding + + interface + subroutine usleep_c(us) bind (C,name="usleep") + use iso_c_binding + integer(c_int), value :: us + end subroutine usleep_c + end interface + +end module + +subroutine usleep(us) + use c_functions + use iso_c_binding + implicit none + integer, intent(in) :: us + call usleep_c(int(us,c_int)) +end diff --git a/src/utils/memory.irp.f b/src/utils/memory.irp.f index f9e4bb69..3e077f97 100644 --- a/src/utils/memory.irp.f +++ b/src/utils/memory.irp.f @@ -15,6 +15,7 @@ BEGIN_PROVIDER [ integer, qp_max_mem ] END_PROVIDER subroutine resident_memory(value) + use c_functions implicit none BEGIN_DOC ! Returns the current used memory in gigabytes used by the current process. @@ -25,6 +26,8 @@ subroutine resident_memory(value) double precision, intent(out) :: value call omp_set_lock(file_lock) + call usleep(10) + value = 0.d0 iunit = getUnitAndOpen('/proc/self/status','r') do diff --git a/src/zmq/utils.irp.f b/src/zmq/utils.irp.f index 1205e09e..e936f268 100644 --- a/src/zmq/utils.irp.f +++ b/src/zmq/utils.irp.f @@ -275,7 +275,6 @@ IRP_ENDIF rc = f77_zmq_bind(new_zmq_pull_socket, zmq_socket_pull_tcp_address) if (rc /= 0) then icount = icount-1 -! call sleep(3) zmq_socket_pull_tcp_address = 'tcp://*:'//zmq_port(2+icount*100)//' ' zmq_socket_push_tcp_address = trim(qp_run_address)//':'//zmq_port(2+icount*100)//' ' else