- better definition of northo/ndiag

git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@6696 c92efa57-630b-4861-b058-cf58834340f0
This commit is contained in:
ccavazzoni 2010-05-02 12:04:02 +00:00
parent 5bbe4b1939
commit a4cb3967e5
3 changed files with 21 additions and 45 deletions

View File

@ -139,7 +139,7 @@ END SUBROUTINE diagonalize_parallel
SUBROUTINE mesure_diag_perf( n )
!
USE mp_global, ONLY: nproc_image, me_image, intra_image_comm, root_image
USE mp_global, ONLY: np_ortho2, np_ortho, me_ortho, ortho_comm, ortho_comm_id
USE mp_global, ONLY: nproc_ortho, np_ortho, me_ortho, ortho_comm, ortho_comm_id
USE io_global, ONLY: ionode, stdout
USE mp, ONLY: mp_sum, mp_bcast, mp_barrier
USE mp, ONLY: mp_max
@ -159,7 +159,7 @@ END SUBROUTINE diagonalize_parallel
!
! Check if number of PEs for orthogonalization/diagonalization is given from the input
!
IF( np_ortho2 > 0 ) THEN
IF( nproc_ortho > 0 ) THEN
use_parallel_diag = .TRUE.
RETURN
END IF
@ -284,7 +284,7 @@ END SUBROUTINE diagonalize_parallel
SUBROUTINE mesure_mmul_perf( n )
!
USE mp_global, ONLY: nproc_image, me_image, intra_image_comm, &
root_image, ortho_comm, np_ortho2, np_ortho, &
root_image, ortho_comm, nproc_ortho, np_ortho, &
me_ortho, init_ortho_group, ortho_comm_id
USE io_global, ONLY: ionode, stdout
USE mp, ONLY: mp_sum, mp_bcast, mp_barrier
@ -303,27 +303,14 @@ END SUBROUTINE diagonalize_parallel
REAL(DP) :: cclock
EXTERNAL :: cclock
!
IF( np_ortho2 > 0 ) THEN
!
! Here the number of processors is suggested on input
!
np = np_ortho2
if( np > MIN( n, nproc_image ) ) np = MIN( n, nproc_image )
np = MAX( INT( SQRT( DBLE( np ) + 0.1d0 ) ), 1 )
!
ELSE
!
! Take the maximum number of processors
!
np = MIN( n, nproc_image )
np = MAX( INT( SQRT( DBLE( np ) + 0.1d0 ) ), 1 )
!
END IF
!
! Now test the allowed processors mesh sizes
np = MAX( INT( SQRT( DBLE( nproc_ortho ) + 0.1d0 ) ), 1 )
!
! Make ortho group compatible with the number of electronic states
!
np = MIN( np, n )
!
! Now re-define the ortho group and test the performance
!
CALL init_ortho_group( np * np, intra_image_comm )
CALL descla_init( desc, n, n, np_ortho, me_ortho, ortho_comm, ortho_comm_id )
@ -368,8 +355,6 @@ END SUBROUTINE diagonalize_parallel
#endif
CALL init_ortho_group( np*np, intra_image_comm )
#if defined __PARA
IF( ionode ) THEN
WRITE( stdout, '(/,3X,"Constraints matrixes will be distributed block like on")' )

View File

@ -109,7 +109,7 @@ PROGRAM projwfc
USE io_files, ONLY : nd_nmbr, prefix, tmp_dir, trimcheck
USE noncollin_module, ONLY : noncolin
USE mp, ONLY : mp_bcast
USE mp_global, ONLY : mp_startup, np_ortho2
USE mp_global, ONLY : mp_startup, nproc_ortho
USE environment, ONLY : environment_start
!
! for GWW
@ -216,7 +216,7 @@ PROGRAM projwfc
IF (noncolin) THEN
CALL projwave_nc(filproj, lsym )
ELSE
IF( np_ortho2 > 1 ) THEN
IF( nproc_ortho > 1 ) THEN
CALL pprojwave (filproj, lsym)
ELSE
CALL projwave (filproj, lsym, lgww)

View File

@ -752,13 +752,14 @@ SUBROUTINE check_para_diag( nelec )
USE kinds, ONLY : DP
USE control_flags, ONLY : use_para_diag, gamma_only
USE io_global, ONLY : stdout, ionode, ionode_id
USE mp_global, ONLY : nproc_pool, init_ortho_group, np_ortho2, &
USE mp_global, ONLY : nproc_pool, init_ortho_group, nproc_ortho, &
np_ortho, intra_pool_comm
IMPLICIT NONE
REAL(DP), INTENT(IN) :: nelec
LOGICAL, SAVE :: first = .TRUE.
INTEGER :: np
! avoid synchronization problems when more images are active
@ -768,28 +769,18 @@ SUBROUTINE check_para_diag( nelec )
use_para_diag = .TRUE.
!
! here we initialize the sub group of processors that will take part
! here we re-initialize the sub group of processors that will take part
! in the matrix diagonalization.
! NOTE that the maximum number of processors may not be the optimal one,
! and -ndiag N argument can be used to force a given number N of processors
!
IF( np_ortho2 < 1 ) THEN
!
! use all the available processors
!
np_ortho2 = MIN( INT( nelec )/2, nproc_pool )
!
! avoid problems with systems with a single electron
!
IF ( np_ortho2 < 1) np_ortho2 = 1
!
ELSE
!
np_ortho2 = MIN( INT( nelec )/2, np_ortho2 )
!
END IF
np = MAX( INT( SQRT( DBLE( nproc_ortho ) + 0.1d0 ) ), 1 )
!
! Make ortho group compatible with the number of electronic states
!
np = MIN( INT( nelec )/2, np )
CALL init_ortho_group( np_ortho2, intra_pool_comm )
CALL init_ortho_group( np * np, intra_pool_comm )
IF ( ionode ) THEN
!