diff --git a/src/cipsi/pt2_stoch_routines.irp.f b/src/cipsi/pt2_stoch_routines.irp.f index 5ebe46bb..e058f792 100644 --- a/src/cipsi/pt2_stoch_routines.irp.f +++ b/src/cipsi/pt2_stoch_routines.irp.f @@ -15,7 +15,7 @@ END_PROVIDER e = elec_num - n_core_orb * 2 pt2_n_tasks_max = 1+min((e*(e-1))/2, int(dsqrt(dble(N_det_selectors)))/4) do i=1,N_det_generators - pt2_F(i) = 1 + int(dble(pt2_n_tasks_max)*maxval(dsqrt(dabs(psi_coef_sorted_gen(i,1:N_states))))) + pt2_F(i) = 1 + int(dble(pt2_n_tasks_max)*dsqrt(dabs(psi_coef_sorted_gen(i,pt2_stoch_istate)))) enddo END_PROVIDER diff --git a/src/cipsi/selection.irp.f b/src/cipsi/selection.irp.f index 1e91019f..6ecb8ea7 100644 --- a/src/cipsi/selection.irp.f +++ b/src/cipsi/selection.irp.f @@ -161,19 +161,6 @@ subroutine select_singles_and_doubles(i_generator,hole_mask,particle_mask,fock_d PROVIDE psi_bilinear_matrix_transp_rows_loc psi_bilinear_matrix_transp_columns PROVIDE psi_bilinear_matrix_transp_order psi_selectors_coef_transp - ii = min(N_det,(elec_alpha_num*(mo_num-elec_alpha_num))**2) - rss = memory_of_double( & - 2*N_int*2*ii & ! minilist, fullminilist - + N_states*mo_num*mo_num & ! mat - ) + memory_of_int( & - + 2*ii & ! preinteresting, prefullinteresting, - + 2*ii & ! interesting, fullinteresting - + mo_num*mo_num/2 & ! banned - + mo_num/2 & ! bannedOrb - ) - - call check_mem(rss,irp_here) - monoAdo = .true. monoBdo = .true. diff --git a/src/cipsi/slave_cipsi.irp.f b/src/cipsi/slave_cipsi.irp.f index 2b64326d..4b5f4252 100644 --- a/src/cipsi/slave_cipsi.irp.f +++ b/src/cipsi/slave_cipsi.irp.f @@ -245,6 +245,42 @@ subroutine run_slave_main call mpi_print('Entering OpenMP section') IRP_ENDIF if (.true.) then + integer :: nproc_target, ii + double precision :: mem_collector, mem, rss + + call resident_memory(rss) + + nproc_target = nthreads_pt2 + ii = min(N_det, (elec_alpha_num*(mo_num-elec_alpha_num))**2) + + do + mem = rss + & ! + nproc_target * 8.d0 * & ! bytes + ( 0.5d0*pt2_n_tasks_max & ! task_id + + 64.d0*pt2_n_tasks_max & ! task + + 3.d0*pt2_n_tasks_max*N_states & ! pt2, variance, norm + + 1.d0*pt2_n_tasks_max & ! i_generator, subset + + 2.d0*(N_int*2.d0*N_det+ N_det) & ! selection buffers + + 1.d0*(N_int*2.d0*N_det+ N_det) & ! sort/merge selection buffers + + 2.0d0*(ii) & ! preinteresting, interesting, + ! prefullinteresting, fullinteresting + + 2.0d0*(N_int*2*ii) & ! minilist, fullminilist + + 1.0d0*(N_states*mo_num*mo_num) & ! mat + ) / 1024.d0**3 + + if (nproc_target == 0) then + call check_mem(mem,irp_here) + nproc_target = 1 + exit + endif + + if (mem+rss < qp_max_mem) then + exit + endif + + nproc_target = nproc_target - 1 + + enddo !$OMP PARALLEL PRIVATE(i) i = omp_get_thread_num() call run_pt2_slave(0,i,pt2_e0_denominator)