diff --git a/GITHUB.md b/GITHUB.md index 02836a37..cee4cc8c 100644 --- a/GITHUB.md +++ b/GITHUB.md @@ -2,20 +2,23 @@ GitHub Branches =============== master: - The current up-to-date working branch, that users download It should - only contain the latest release and bug fixes. + The current up-to-date working branch, that users download. It should + only contain the latest stable release and bug fixes. -develop-lcpq: - Toulouse development branch - -develop-lct: - Paris development branch - -develop: +dev: It is a fork of the *master* branch with new developments that will be merged in the *master* branch for the next release. Other development branches should be merged on this one. +bugfix: + A fork of the *master* on which the bug fixes are made. + +dev-lcpq: + Toulouse development branch + +dev-lct: + Paris development branch + gh-pages: This is an independent branch, containing only the web site of QP2. diff --git a/INSTALL.rst b/INSTALL.rst index 825c0c4d..979c8edd 100644 --- a/INSTALL.rst +++ b/INSTALL.rst @@ -328,7 +328,7 @@ OCaml echo ${QP_ROOT}/bin ${QP_ROOT}/external/opam_installer.sh --no-backup --fresh - You the :command:`opam` command can be installed in the :file:`${QP_ROOT}/bin` + The :command:`opam` command can be installed in the :file:`${QP_ROOT}/bin` directory. To do this, take the output of ``echo ${QP_ROOT}/bin`` and use it as an answer to where :command:`opam` should be installed. @@ -337,7 +337,14 @@ OCaml .. code:: bash - opam init --disable-sandboxing --comp=4.07.0 + opam init --comp=4.07.1 + eval `${QP_ROOT}/bin/opam env` + + If the installation fails because of bwrap, you can initialize opam using: + + .. code:: bash + + opam init --disable-sandboxing --comp=4.07.1 eval `${QP_ROOT}/bin/opam env` * Install the required external OCaml libraries diff --git a/README.md b/README.md index e7fab0c9..3349f561 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [*Quantum package 2.0: an open-source determinant-driven suite of programs*](https://pubs.acs.org/doi/10.1021/acs.jctc.9b00176)\ Y. Garniron, K. Gasperich, T. Applencourt, A. Benali, A. Ferté, J. Paquier, B. Pradines, R. Assaraf, P. Reinhardt, J. Toulouse, P. Barbaresco, N. Renon, G. David, J. P. Malrieu, M. Véril, M. Caffarel, P. F. Loos, E. Giner and A. Scemama\ -J. Chem. Theory Comput., 15:6, 3591--3609, (2019)\ +[J. Chem. Theory Comput. 2019, 15, 6, 3591-3609](https://doi.org/10.1021/acs.jctc.9b00176)\ https://arxiv.org/abs/1902.08154 ``` diff --git a/REPLACE b/REPLACE index 10a53958..d0b6adce 100755 --- a/REPLACE +++ b/REPLACE @@ -834,3 +834,4 @@ qp_name potential_sr_c_alpha_ao_pbe --rename=potential_c_alpha_ao_sr_pbe qp_name potential_sr_c_beta_ao_pbe --rename=potential_c_beta_ao_sr_pbe qp_name potential_sr_xc_alpha_ao_pbe --rename=potential_xc_alpha_ao_sr_pbe qp_name potential_sr_xc_beta_ao_pbe --rename=potential_xc_beta_ao_sr_pbe +qp_name disk_access_nuclear_repulsion --rename=io_nuclear_repulsion diff --git a/configure b/configure index c3ff8942..98641633 100755 --- a/configure +++ b/configure @@ -303,23 +303,31 @@ EOF rm ${QP_ROOT}/external/opam_installer.sh source ${OPAMROOT}/opam-init/init.sh > /dev/null 2> /dev/null || true - ${QP_ROOT}/bin/opam init --verbose --yes --comp=4.07.1 --disable-sandboxing + opam switch create ocaml-base-compiler.4.07.1 + opam init --verbose --yes --compiler=4.07.1 --disable-sandboxing - eval $(${QP_ROOT}/bin/opam env) + eval $(opam env) opam install -y ${OCAML_PACKAGES} || exit 1 + else # Conventional commands execute << EOF chmod +x "\${QP_ROOT}"/external/opam_installer.sh "\${QP_ROOT}"/external/opam_installer.sh --no-backup +EOF + execute << EOF rm --force \${QP_ROOT}/bin/opam export OPAMROOT=\${OPAMROOT:-\${QP_ROOT}/external/opam} echo \${QP_ROOT}/bin \ | sh \${QP_ROOT}/external/opam_installer.sh - rm \${QP_ROOT}/external/opam_installer.sh - source \${OPAMROOT}/opam-init/init.sh > /dev/null 2> /dev/null || true - \${QP_ROOT}/bin/opam init --verbose --yes --comp=4.07.1 --disable-sandboxing - eval \$(\${QP_ROOT}/bin/opam env) +EOF + rm \${QP_ROOT}/external/opam_installer.sh + source \${OPAMROOT}/opam-init/init.sh > /dev/null 2> /dev/null || true + opam switch create ocaml-base-compiler.4.07.1 || exit 1 + opam init --verbose --yes --compiler=4.07.1 --disable-sandboxing + eval $(opam env) +EOF + execute << EOF opam install -y \${OCAML_PACKAGES} || exit 1 EOF fi diff --git a/docs/source/research.bib b/docs/source/research.bib index 03ffb39f..479b920a 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}}, diff --git a/src/ao_one_e_ints/README.rst b/src/ao_one_e_ints/README.rst index bc8832c3..a87bdb17 100644 --- a/src/ao_one_e_ints/README.rst +++ b/src/ao_one_e_ints/README.rst @@ -6,9 +6,8 @@ All the one-electron integrals in the |AO| basis are here. The most important providers for usual quantum-chemistry calculation are: -* `ao_kinetic_integral` which are the kinetic operator integrals on the |AO| basis (see :file:`kin_ao_ints.irp.f`) -* `ao_nucl_elec_integral` which are the nuclear-elctron operator integrals on the |AO| basis (see :file:`pot_ao_ints.irp.f`) -* `ao_one_e_integrals` which are the the h_core operator integrals on the |AO| basis (see :file:`ao_mono_ints.irp.f`) +* `ao_kinetic_integrals` which are the kinetic operator integrals on the |AO| basis +* `ao_integrals_n_e` which are the nuclear-elctron operator integrals on the |AO| basis +* `ao_one_e_integrals` which are the the h_core operator integrals on the |AO| basis -Note that you can find other interesting integrals related to the position operator in :file:`spread_dipole_ao.irp.f`. 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 a80a9372..17b11250 100644 --- a/src/cipsi/run_selection_slave.irp.f +++ b/src/cipsi/run_selection_slave.irp.f @@ -73,7 +73,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. @@ -84,6 +84,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 @@ -131,23 +132,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)' @@ -202,22 +204,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)' @@ -227,10 +233,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/nuclei/EZFIO.cfg b/src/nuclei/EZFIO.cfg index 7bcbf013..ebdcfead 100644 --- a/src/nuclei/EZFIO.cfg +++ b/src/nuclei/EZFIO.cfg @@ -21,7 +21,7 @@ type: double precision size: (nuclei.nucl_num,3) interface: ezfio -[disk_access_nuclear_repulsion] +[io_nuclear_repulsion] doc: Read/Write Nuclear Repulsion from/to disk [ Write | Read | None ] type: Disk_access interface: ezfio,provider,ocaml diff --git a/src/nuclei/nuclei.irp.f b/src/nuclei/nuclei.irp.f index c797ff30..88ee24e8 100644 --- a/src/nuclei/nuclei.irp.f +++ b/src/nuclei/nuclei.irp.f @@ -143,7 +143,7 @@ BEGIN_PROVIDER [ double precision, nuclear_repulsion ] END_DOC PROVIDE mpi_master nucl_coord nucl_charge nucl_num - if (disk_access_nuclear_repulsion.EQ.'Read') then + if (io_nuclear_repulsion == 'Read') then logical :: has if (mpi_master) then @@ -194,7 +194,7 @@ BEGIN_PROVIDER [ double precision, nuclear_repulsion ] call write_time(6) call write_double(6,nuclear_repulsion,'Nuclear repulsion energy') - if (disk_access_nuclear_repulsion.EQ.'Write') then + if (io_nuclear_repulsion == 'Write') then if (mpi_master) then call ezfio_set_nuclei_nuclear_repulsion(nuclear_repulsion) endif diff --git a/src/utils/c_funcs.c b/src/utils/c_funcs.c new file mode 100644 index 00000000..5b7035fb --- /dev/null +++ b/src/utils/c_funcs.c @@ -0,0 +1,6 @@ +#include + +void usleep_c(int s) +{ + usleep((useconds_t) s); +} diff --git a/src/utils/c_functions.f90 b/src/utils/c_functions.f90 new file mode 100644 index 00000000..425aafd6 --- /dev/null +++ b/src/utils/c_functions.f90 @@ -0,0 +1,21 @@ +module c_functions + use iso_c_binding + + interface + subroutine usleep_c(us) bind (C,name="usleep_c") + 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 + integer(c_int) :: u + u = us + call usleep_c(u) +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 70f0830b..e76238ed 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 @@ -752,7 +751,8 @@ integer function add_task_to_taskserver(zmq_to_qp_run_socket,task) add_task_to_taskserver = 0 - allocate(character(len=len(task)+10+len(zmq_state)) :: message) + sze = len(trim(task)) + len(trim(zmq_state))+11 + allocate(character(len=sze) :: message) message='add_task '//trim(zmq_state)//' '//trim(task) sze = len(message) rc = f77_zmq_send(zmq_to_qp_run_socket, message, sze, 0) @@ -768,6 +768,7 @@ integer function add_task_to_taskserver(zmq_to_qp_run_socket,task) add_task_to_taskserver = -1 return endif + deallocate(message) end