10
0
mirror of https://github.com/LCPQ/quantum_package synced 2024-11-03 20:54:00 +01:00

Added progress bar

This commit is contained in:
Anthony Scemama 2014-10-02 01:06:13 +02:00
parent 444c45a06b
commit 9a439a25ac
5 changed files with 108 additions and 3 deletions

View File

@ -197,6 +197,7 @@ class H_apply(object):
wall_1-wall_0 wall_1-wall_0
pt2_old(k) = pt2(k) pt2_old(k) = pt2(k)
enddo enddo
progress_value = norm_psi(1)
""" """
self.data["omp_parallel"] += """& self.data["omp_parallel"] += """&
!$OMP SHARED(N_st) PRIVATE(e_2_pert_buffer,coef_pert_buffer) & !$OMP SHARED(N_st) PRIVATE(e_2_pert_buffer,coef_pert_buffer) &
@ -238,6 +239,7 @@ class H_apply(object):
norm_psi(k) = norm_psi(k) + psi_coef(i_generator,k)*psi_coef(i_generator,k) norm_psi(k) = norm_psi(k) + psi_coef(i_generator,k)*psi_coef(i_generator,k)
delta_pt2(k) = 0.d0 delta_pt2(k) = 0.d0
pt2_old(k) = 0.d0 pt2_old(k) = 0.d0
pt2(k) = select_max(i_generator)
enddo enddo
!$ call omp_unset_lock(lck) !$ call omp_unset_lock(lck)
cycle cycle

View File

@ -379,12 +379,14 @@ BEGIN_PROVIDER [ logical, ao_bielec_integrals_in_map ]
enddo enddo
PROVIDE ao_nucl PROVIDE ao_nucl
PROVIDE progress_bar
call omp_init_lock(lock) call omp_init_lock(lock)
lmax = ao_num*(ao_num+1)/2 lmax = ao_num*(ao_num+1)/2
write(output_BiInts,*) 'providing the AO integrals' write(output_BiInts,*) 'providing the AO integrals'
call wall_time(wall_0) call wall_time(wall_0)
call wall_time(wall_1) call wall_time(wall_1)
call cpu_time(cpu_1) call cpu_time(cpu_1)
call start_progress(lmax,'AO integrals (MB)',0.d0)
!$OMP PARALLEL PRIVATE(i,j,k,l,kk, & !$OMP PARALLEL PRIVATE(i,j,k,l,kk, &
!$OMP integral,buffer_i,buffer_value,n_integrals, & !$OMP integral,buffer_i,buffer_value,n_integrals, &
!$OMP cpu_2,wall_2,i1,j1,thread_num) & !$OMP cpu_2,wall_2,i1,j1,thread_num) &
@ -392,7 +394,7 @@ BEGIN_PROVIDER [ logical, ao_bielec_integrals_in_map ]
!$OMP SHARED (ao_num, jl_pairs, ao_integrals_map,thresh, & !$OMP SHARED (ao_num, jl_pairs, ao_integrals_map,thresh, &
!$OMP cpu_1,wall_1,lock, lmax,n_centers,ao_nucl, & !$OMP cpu_1,wall_1,lock, lmax,n_centers,ao_nucl, &
!$OMP ao_overlap_abs,ao_overlap,output_BiInts,abort_here, & !$OMP ao_overlap_abs,ao_overlap,output_BiInts,abort_here, &
!$OMP wall_0) !$OMP wall_0,progress_bar,progress_value)
allocate(buffer_i(size_buffer)) allocate(buffer_i(size_buffer))
allocate(buffer_value(size_buffer)) allocate(buffer_value(size_buffer))
@ -409,6 +411,9 @@ IRP_ENDIF
if (abort_here) then if (abort_here) then
cycle cycle
endif endif
if (thread_num == 0) then
progress_bar(1) = kk
endif
j = jl_pairs(1,kk) j = jl_pairs(1,kk)
l = jl_pairs(2,kk) l = jl_pairs(2,kk)
j1 = j+ishft(l*l-l,-1) j1 = j+ishft(l*l-l,-1)
@ -457,6 +462,7 @@ IRP_ENDIF
wall_0 = wall_2 wall_0 = wall_2
write(output_BiInts,*) 100.*float(kk)/float(lmax), '% in ', & write(output_BiInts,*) 100.*float(kk)/float(lmax), '% in ', &
wall_2-wall_1, 's', map_mb(ao_integrals_map) ,'MB' wall_2-wall_1, 's', map_mb(ao_integrals_map) ,'MB'
progress_value = dble(map_mb(ao_integrals_map))
endif endif
endif endif
enddo enddo
@ -466,6 +472,7 @@ IRP_ENDIF
deallocate(buffer_value) deallocate(buffer_value)
!$OMP END PARALLEL !$OMP END PARALLEL
call omp_destroy_lock(lock) call omp_destroy_lock(lock)
call stop_progress
if (abort_here) then if (abort_here) then
stop 'Aborting in AO integrals calculation' stop 'Aborting in AO integrals calculation'
endif endif

View File

@ -90,6 +90,8 @@ subroutine add_integrals_to_map(mask_ijkl)
call wall_time(wall_1) call wall_time(wall_1)
call cpu_time(cpu_1) call cpu_time(cpu_1)
PROVIDE progress_bar
call start_progress(ao_num,'MO integrals (MB)',0.d0)
!$OMP PARALLEL PRIVATE(l1,k1,j1,i1,i2,i3,i4,i,j,k,l,c, ii1,kmax, & !$OMP PARALLEL PRIVATE(l1,k1,j1,i1,i2,i3,i4,i,j,k,l,c, ii1,kmax, &
!$OMP bielec_tmp_0_idx, bielec_tmp_0, bielec_tmp_1,bielec_tmp_2,bielec_tmp_3,& !$OMP bielec_tmp_0_idx, bielec_tmp_0, bielec_tmp_1,bielec_tmp_2,bielec_tmp_3,&
@ -100,7 +102,7 @@ subroutine add_integrals_to_map(mask_ijkl)
!$OMP mo_coef_transp,output_BiInts, & !$OMP mo_coef_transp,output_BiInts, &
!$OMP mo_coef_transp_is_built, list_ijkl, & !$OMP mo_coef_transp_is_built, list_ijkl, &
!$OMP mo_coef_is_built, wall_1, abort_here, & !$OMP mo_coef_is_built, wall_1, abort_here, &
!$OMP mo_coef,mo_integrals_threshold,ao_integrals_map,mo_integrals_map) !$OMP mo_coef,mo_integrals_threshold,ao_integrals_map,mo_integrals_map,progress_bar,progress_value)
n_integrals = 0 n_integrals = 0
allocate(bielec_tmp_3(mo_tot_num_align, n_j, n_k), & allocate(bielec_tmp_3(mo_tot_num_align, n_j, n_k), &
bielec_tmp_1(mo_tot_num_align), & bielec_tmp_1(mo_tot_num_align), &
@ -113,6 +115,9 @@ subroutine add_integrals_to_map(mask_ijkl)
!$ thread_num = omp_get_thread_num() !$ thread_num = omp_get_thread_num()
!$OMP DO SCHEDULE(guided) !$OMP DO SCHEDULE(guided)
do l1 = 1,ao_num do l1 = 1,ao_num
if (thread_num == 0) then
progress_bar(1) = l1
endif
IRP_IF COARRAY IRP_IF COARRAY
if (mod(l1-this_image(),num_images()) /= 0 ) then if (mod(l1-this_image(),num_images()) /= 0 ) then
cycle cycle
@ -268,7 +273,9 @@ IRP_ENDIF
if (wall_2 - wall_0 > 1.d0) then if (wall_2 - wall_0 > 1.d0) then
wall_0 = wall_2 wall_0 = wall_2
write(output_BiInts,*) 100.*float(l1)/float(ao_num), '% in ', & write(output_BiInts,*) 100.*float(l1)/float(ao_num), '% in ', &
wall_2-wall_1, 's', map_mb(ao_integrals_map) ,'MB' wall_2-wall_1, 's', map_mb(mo_integrals_map) ,'MB'
progress_value = dble(map_mb(mo_integrals_map))
endif endif
endif endif
enddo enddo
@ -279,6 +286,7 @@ IRP_ENDIF
real(mo_integrals_threshold,integral_kind)) real(mo_integrals_threshold,integral_kind))
deallocate(buffer_i, buffer_value) deallocate(buffer_i, buffer_value)
!$OMP END PARALLEL !$OMP END PARALLEL
call stop_progress
if (abort_here) then if (abort_here) then
stop 'Aborting in MO integrals calculation' stop 'Aborting in MO integrals calculation'
endif endif

View File

@ -387,6 +387,9 @@ subroutine $subroutine($params_main)
call wall_time(wall_1) call wall_time(wall_1)
PROVIDE progress_bar
call start_progress(N_det_generators,'Selection (norm)',0.d0)
!$ call omp_init_lock(lck) !$ call omp_init_lock(lck)
!$OMP PARALLEL DEFAULT(SHARED) & !$OMP PARALLEL DEFAULT(SHARED) &
!$OMP PRIVATE(i_generator,wall_2,ispin,k,mask,iproc) !$OMP PRIVATE(i_generator,wall_2,ispin,k,mask,iproc)
@ -395,6 +398,9 @@ subroutine $subroutine($params_main)
allocate( mask(N_int,2,6) ) allocate( mask(N_int,2,6) )
!$OMP DO SCHEDULE(dynamic,4) !$OMP DO SCHEDULE(dynamic,4)
do i_generator=1,nmax do i_generator=1,nmax
if (iproc == 0) then
progress_bar(1) = i_generator
endif
if (abort_here) then if (abort_here) then
cycle cycle
endif endif
@ -449,10 +455,12 @@ subroutine $subroutine($params_main)
!$OMP END PARALLEL !$OMP END PARALLEL
!$ call omp_destroy_lock(lck) !$ call omp_destroy_lock(lck)
allocate( mask(N_int,2,6) ) allocate( mask(N_int,2,6) )
! do i_generator=1,N_det_generators ! do i_generator=1,N_det_generators
do i_generator=nmax+1,N_det_generators do i_generator=nmax+1,N_det_generators
progress_bar(1) = i_generator
if (abort_here) then if (abort_here) then
exit exit
@ -500,6 +508,7 @@ subroutine $subroutine($params_main)
$printout_now $printout_now
endif endif
enddo enddo
call stop_progress
$copy_buffer $copy_buffer
$generate_psi_guess $generate_psi_guess

79
src/Utils/progress.irp.f Normal file
View File

@ -0,0 +1,79 @@
subroutine start_progress(max,title,progress_init)
implicit none
integer, intent(in) :: max
double precision, intent(in) :: progress_init
character*(*), intent(in) :: title
BEGIN_DOC
! Starts the progress bar
END_DOC
progress_bar(1) = 0
progress_bar(2) = max
progress_title = title
progress_active = .True.
progress_value = progress_init
call run_progress()
end
subroutine stop_progress
implicit none
BEGIN_DOC
! Stop the progress bar
END_DOC
progress_active = .False.
end
BEGIN_PROVIDER [ real, progress_bar, (2) ]
&BEGIN_PROVIDER [ integer, progress_timeout ]
&BEGIN_PROVIDER [ logical, progress_active ]
&BEGIN_PROVIDER [ double precision, progress_value ]
&BEGIN_PROVIDER [ character*(20) , progress_title ]
implicit none
BEGIN_DOC
! Current status for displaying progress bars. Global variable.
END_DOC
progress_bar = 0
progress_value = 0.d0
progress_title = ''
progress_active = .False.
progress_timeout = 1
open (unit=0, carriagecontrol='fortran')
END_PROVIDER
recursive subroutine run_progress
use ifport
implicit none
BEGIN_DOC
! Display a progress bar with documentation of what is happening
END_DOC
character(75), parameter :: bar0= &
' --- : --- | | ---%'
character(75) :: bar
integer :: prog
bar = bar0
if (.not.progress_active) then
call stop_progress
write(unit=0,fmt="(a1,a1,a70)") '+',char(13), bar
else
prog = int( progress_bar(1)*100./progress_bar(2) )
write(bar(1:25),'(A)'),progress_title
write(bar(29:47),'(G17.10)'),progress_value
write(bar(72:74),'(i3)') prog
integer :: k,j
j = int( progress_bar(1)*20./progress_bar(2) )
do k=1, j
bar(49+k:49+k)="="
enddo
write(unit=0,fmt="(a1,a1,a75)") '+',char(13), bar
integer :: istat
istat = alarm(progress_timeout,run_progress)
endif
end