diff --git a/plugins/Full_CI_ZMQ/EZFIO.cfg b/plugins/Full_CI_ZMQ/EZFIO.cfg index 26f1a8e5..15ebab6d 100644 --- a/plugins/Full_CI_ZMQ/EZFIO.cfg +++ b/plugins/Full_CI_ZMQ/EZFIO.cfg @@ -8,4 +8,31 @@ type: double precision doc: Calculated FCI energy + PT2 interface: ezfio +[iterative_save] +type: integer +doc: Save data at each iteration : 1(Append) | 2(Overwrite) | 3(NoSave) +interface: ezfio,ocaml +default: 1 +[n_iter] +interface: ezfio +doc: number of iterations +type:integer + +[n_det_iter] +interface: ezfio +doc: number of determinants at iteration +type: integer +size: (full_ci_zmq.n_iter) + +[energy_iter] +interface: ezfio +doc: The energy without a pt2 correction for n_det +type: double precision +size: (full_ci_zmq.n_iter) + +[pt2_iter] +interface: ezfio +doc: The pt2 correction for n_det +type: double precision +size: (full_ci_zmq.n_iter) diff --git a/plugins/Full_CI_ZMQ/dump_fci_iterations_value.f90 b/plugins/Full_CI_ZMQ/dump_fci_iterations_value.f90 new file mode 100644 index 00000000..0e7565d8 --- /dev/null +++ b/plugins/Full_CI_ZMQ/dump_fci_iterations_value.f90 @@ -0,0 +1,83 @@ +subroutine dump_fci_iterations_value(n_determinants,energy,pt2) + implicit none + +! Not using an irp.f90 environment because the SAVE statement is needed for simpler code + +! BEGIN_DOC +!! Output the number of determinants, energy, and pt2 correction at each iteration +! END_DOC + integer :: n_determinants + double precision :: energy, pt2 + integer :: N_iterations + integer, allocatable :: n_determinants_list(:) + double precision, allocatable :: energy_list(:) + double precision, allocatable :: pt2_list(:) + integer :: saveMethod + logical :: hasIter + logical,save :: firstAccess=.TRUE. !! every update of firstAccess will be saved + + !!! Check to ensure that we should save iterations (default is Append) + ! saveMethod: 1==Append, 2==Overwrite, 3==NoSave + call ezfio_get_full_ci_zmq_iterative_save(saveMethod) + + !!! Check we are saving data + if (saveMethod/=3) then + + !!! If the iteration number exists get it + !!! otherwise set it to zero + call ezfio_has_full_ci_zmq_n_iter(hasIter) + if (hasIter) then + call ezfio_get_full_ci_zmq_n_iter(N_iterations) + else + N_iterations=0 + endif + + !!! If it is append we don't have to do any more checks + !!! N_iterations will be correct now. + + !!! If we should overwrite and this is the first time + !!! Then we need to reset N_iterations to zero + if ((saveMethod==2).AND.(firstAccess)) then + N_iterations=0 + endif + + !! Now allocate the array for entire size needed + allocate(n_determinants_list(N_iterations+1)) + allocate(energy_list(N_iterations+1)) + allocate(pt2_list(N_iterations+1)) + + !!! Pull previously written data + !!! Unless it is at the beginning of a new/restarted calculation + if((hasIter).AND.(N_iterations>0)) then + call ezfio_get_full_ci_zmq_n_det_iter(n_determinants_list(1:N_iterations)) + call ezfio_get_full_ci_zmq_energy_iter(energy_list(1:N_iterations)) + call ezfio_get_full_ci_zmq_pt2_iter(pt2_list(1:N_iterations)) + endif + + !! Now increment to the current iteration + N_iterations = N_iterations+1 + + !! Add the data from latest iteration + n_determinants_list(N_iterations) = n_determinants + energy_list(N_iterations) = energy + pt2_list(N_iterations) = pt2 + + ! Reset the iteration number + call ezfio_set_full_ci_zmq_n_iter(N_iterations) + + !!!! Now reset the ezfio values + !!!! To include the latest data + call ezfio_set_full_ci_zmq_n_det_iter(n_determinants_list) + call ezfio_set_full_ci_zmq_energy_iter(energy_list) + call ezfio_set_full_ci_zmq_pt2_iter(pt2_list) + + deallocate(n_determinants_list) + deallocate(energy_list) + deallocate(pt2_list) + + endif + + !!! set first access to false + !!! it will be saved + firstAccess=.FALSE. + end subroutine diff --git a/plugins/Full_CI_ZMQ/fci_zmq.irp.f b/plugins/Full_CI_ZMQ/fci_zmq.irp.f index dc9d6d42..80ba5a7b 100644 --- a/plugins/Full_CI_ZMQ/fci_zmq.irp.f +++ b/plugins/Full_CI_ZMQ/fci_zmq.irp.f @@ -44,6 +44,7 @@ program fci_zmq print *, 'E+PT2 = ', CI_energy(k) + pt2(k) print *, '-----' enddo + call dump_fci_iterations_value(N_det,CI_energy(1),pt2(1)) ! This call automatically appends data endif @@ -135,7 +136,7 @@ program fci_zmq call save_wavefunction call ezfio_set_full_ci_zmq_energy(CI_energy(1)) call ezfio_set_full_ci_zmq_energy_pt2(CI_energy(1)+pt2(1)) - + call dump_fci_iterations_value(N_det,CI_energy(1),pt2(1)) ! This call automatically appends data enddo endif @@ -144,6 +145,7 @@ program fci_zmq call diagonalize_CI call save_wavefunction call ezfio_set_full_ci_zmq_energy(CI_energy(1)) + call dump_fci_iterations_value(N_det,CI_energy(1),pt2(1)) ! This call automatically appends data endif if (do_pt2) then @@ -163,6 +165,7 @@ program fci_zmq call ZMQ_selection(0, pt2) ! Deterministic PT2 endif call ezfio_set_full_ci_zmq_energy_pt2(CI_energy(1)+pt2(1)) + call dump_fci_iterations_value(N_det,CI_energy(1),pt2(1)) ! This call automatically appends data endif