From 54e523953096b2ff36452ab939e54123766b889d Mon Sep 17 00:00:00 2001 From: Alberto Otero de la Roza Date: Tue, 6 Aug 2019 00:55:15 +0200 Subject: [PATCH 1/2] add the diagonalization option to ph.x: allows changing the diagonalization method in the non-scf calcs --- LR_Modules/setup_nscf.f90 | 7 ++++++- PHonon/Doc/INPUT_PH.def | 19 +++++++++++++++++++ PHonon/PH/bcast_ph_input.f90 | 4 +++- PHonon/PH/phcom.f90 | 5 +++-- PHonon/PH/phq_readin.f90 | 16 ++++++++++++++-- PHonon/PH/run_nscf.f90 | 6 +++--- 6 files changed, 48 insertions(+), 9 deletions(-) diff --git a/LR_Modules/setup_nscf.f90 b/LR_Modules/setup_nscf.f90 index 3f640048d..5a30790ab 100644 --- a/LR_Modules/setup_nscf.f90 +++ b/LR_Modules/setup_nscf.f90 @@ -6,7 +6,7 @@ ! or http://www.gnu.org/copyleft/gpl.txt . ! !---------------------------------------------------------------------------- -SUBROUTINE setup_nscf ( newgrid, xq, elph_mat ) +SUBROUTINE setup_nscf ( newgrid, xq, elph_mat, isolveph ) !---------------------------------------------------------------------------- ! ! ... This routine initializes variables for the non-scf calculations at k @@ -53,6 +53,7 @@ SUBROUTINE setup_nscf ( newgrid, xq, elph_mat ) REAL (DP), INTENT(IN) :: xq(3) LOGICAL, INTENT (IN) :: newgrid LOGICAL, INTENT (IN) :: elph_mat ! used to be passed through a module. + INTEGER, INTENT (IN), OPTIONAL :: isolveph ! if present, use this diagonalization method ! REAL (DP), ALLOCATABLE :: rtau (:,:,:) LOGICAL :: magnetic_sym, sym(48) @@ -69,6 +70,10 @@ SUBROUTINE setup_nscf ( newgrid, xq, elph_mat ) ! ... Davdson: isolve=0, david=4 ; CG: isolve=1, david=1 isolve = 0 david = 4 + IF (PRESENT(isolveph)) THEN + isolve = isolveph + IF (isolveph == 1) david = 1 + END IF nbndx = david*nbnd max_cg_iter=20 natomwfc = n_atom_wfc( nat, ityp, noncolin ) diff --git a/PHonon/Doc/INPUT_PH.def b/PHonon/Doc/INPUT_PH.def index c198d99f0..66b7c13e6 100644 --- a/PHonon/Doc/INPUT_PH.def +++ b/PHonon/Doc/INPUT_PH.def @@ -414,6 +414,25 @@ input_description -distribution {Quantum Espresso} -package PWscf -program ph.x } } + var diagonalization -type CHARACTER { + default { 'david' } + options { + info { + Diagonalization method for the non-SCF calculations. + } + opt -val 'david' { + Davidson iterative diagonalization with overlap matrix + (default). Fast, may in some rare cases fail. + } + + opt -val 'cg' { + Conjugate-gradient-like band-by-band diagonalization. + Slower than 'david' but uses less memory and is + (a little bit) more robust. + } + } + } + var read_dns_bare -type LOGICAL { default { .false. } info { diff --git a/PHonon/PH/bcast_ph_input.f90 b/PHonon/PH/bcast_ph_input.f90 index 6d8078c1b..71db0fc9f 100644 --- a/PHonon/PH/bcast_ph_input.f90 +++ b/PHonon/PH/bcast_ph_input.f90 @@ -22,7 +22,8 @@ subroutine bcast_ph_input ( ) niter_ph, lnoloc, alpha_mix, tr2_ph, recover, & ldisp, reduce_io, zue, zeu, epsil, trans, & ldiag, lqdir, search_sym, electron_phonon, & - qplot, only_init, only_wfc, low_directory_check + qplot, only_init, only_wfc, low_directory_check, & + isolveph USE gamma_gamma, ONLY : asr USE disp, ONLY : nq1, nq2, nq3 USE partial, ONLY : nat_todo @@ -94,6 +95,7 @@ subroutine bcast_ph_input ( ) CALL mp_bcast( k2, meta_ionode_id, world_comm ) CALL mp_bcast( k3, meta_ionode_id, world_comm ) CALL mp_bcast( low_directory_check, meta_ionode_id, world_comm ) + CALL mp_bcast( isolveph, meta_ionode_id, world_comm ) CALL mp_bcast( elph_nbnd_min, meta_ionode_id, world_comm ) CALL mp_bcast( elph_nbnd_max, meta_ionode_id, world_comm ) CALL mp_bcast( el_ph_ngauss, meta_ionode_id, world_comm ) diff --git a/PHonon/PH/phcom.f90 b/PHonon/PH/phcom.f90 index 58cd7e2b5..47b1a14e5 100644 --- a/PHonon/PH/phcom.f90 +++ b/PHonon/PH/phcom.f90 @@ -214,8 +214,9 @@ MODULE control_ph CHARACTER(LEN=10) :: where_rec='no_recover'! where the ph run recovered CHARACTER(LEN=12) :: electron_phonon CHARACTER(LEN=256) :: flmixdpot, tmp_dir_ph, tmp_dir_phq - INTEGER :: rec_code=-1000, &! code for recover - rec_code_read=-1000 ! code for recover. Not changed during the run + INTEGER :: rec_code=-1000, & ! code for recover + rec_code_read=-1000,& ! code for recover. Not changed during the run + isolveph = 0 ! diagonalization method used in the nscf calcs LOGICAL :: lgamma_gamma,&! if .TRUE. this is a q=0 computation with k=0 only convt, &! if .TRUE. the phonon has converged epsil, &! if .TRUE. computes dielec. const and eff. charges diff --git a/PHonon/PH/phq_readin.f90 b/PHonon/PH/phq_readin.f90 index 57ed4dd3e..5a1595ff8 100644 --- a/PHonon/PH/phq_readin.f90 +++ b/PHonon/PH/phq_readin.f90 @@ -43,7 +43,7 @@ SUBROUTINE phq_readin() ext_recover, ext_restart, u_from_file, ldiag, & search_sym, lqdir, electron_phonon, tmp_dir_phq, & rec_code_read, qplot, only_init, only_wfc, & - low_directory_check + low_directory_check, isolveph USE save_ph, ONLY : tmp_dir_save, save_ph_input_variables USE gamma_gamma, ONLY : asr @@ -105,6 +105,7 @@ SUBROUTINE phq_readin() REAL(DP), ALLOCATABLE :: xqaux(:,:) INTEGER, ALLOCATABLE :: wqaux(:) INTEGER :: nqaux, iq + CHARACTER(len=80) :: diagonalization='david' ! NAMELIST / INPUTPH / tr2_ph, amass, alpha_mix, niter_ph, nmix_ph, & nat_todo, verbosity, iverbosity, outdir, epsil, & @@ -119,7 +120,7 @@ SUBROUTINE phq_readin() elph_nbnd_min, elph_nbnd_max, el_ph_ngauss, & el_ph_nsigma, el_ph_sigma, electron_phonon, & q_in_band_form, q2d, qplot, low_directory_check, & - lshift_q + lshift_q, diagonalization ! tr2_ph : convergence threshold ! amass : atomic masses @@ -193,6 +194,7 @@ SUBROUTINE phq_readin() ! d2ns_type='diag': if okvan=.true. the matrix is calculated retaining only ! for <\beta_J|\phi_I> products where for J==I. ! d2ns_type='dmmp': same as 'diag', but also assuming a m <=> m'. + ! diagonalization : diagonalization method used in the nscf calc ! ! Note: meta_ionode is a single processor that reads the input ! (ionode is also a single processor but per image) @@ -338,6 +340,16 @@ SUBROUTINE phq_readin() ELSE IF ( ABS(ios) /= 0 ) THEN CALL errore( 'phq_readin', 'reading inputph namelist', ABS( ios ) ) END IF + ! diagonalization option + SELECT CASE(TRIM(diagonalization)) + CASE ('david','davidson') + isolveph = 0 + CASE ('cg') + isolveph = 1 + CASE DEFAULT + CALL errore('phq_readin','diagonalization '//trim(diagonalization)//' not implemented',1) + END SELECT + ! ! ... broadcast all input variables ! diff --git a/PHonon/PH/run_nscf.f90 b/PHonon/PH/run_nscf.f90 index c8da93d77..0a0a73f3a 100644 --- a/PHonon/PH/run_nscf.f90 +++ b/PHonon/PH/run_nscf.f90 @@ -13,7 +13,7 @@ SUBROUTINE run_nscf(do_band, iq) ! ... phonon code. ! ! - USE control_flags, ONLY : conv_ions + USE control_flags, ONLY : conv_ions, isolve USE basis, ONLY : starting_wfc, starting_pot, startingconfig USE io_files, ONLY : prefix, tmp_dir, wfc_dir, seqopn USE lsda_mod, ONLY : nspin @@ -29,7 +29,7 @@ SUBROUTINE run_nscf(do_band, iq) USE disp, ONLY : lgamma_iq USE control_ph, ONLY : reduce_io, recover, tmp_dir_phq, & ext_restart, bands_computed, newgrid, qplot, & - only_wfc + only_wfc, isolveph USE io_global, ONLY : stdout USE save_ph, ONLY : tmp_dir_save ! @@ -98,7 +98,7 @@ SUBROUTINE run_nscf(do_band, iq) CALL fft_type_allocate ( dfftp, at, bg, gcutm, intra_bgrp_comm, nyfft=nyfft ) CALL fft_type_allocate ( dffts, at, bg, gcutms, intra_bgrp_comm, nyfft=nyfft) ! - CALL setup_nscf ( newgrid, xq, elph_mat ) + CALL setup_nscf ( newgrid, xq, elph_mat, isolveph ) ! CALL init_run() ! From 2e5ab4458107e427aa7a84d61168fac79a74ae08 Mon Sep 17 00:00:00 2001 From: Alberto Otero de la Roza Date: Wed, 7 Aug 2019 11:43:49 +0200 Subject: [PATCH 2/2] make the isolveph argument of LR_Modules/setup_nscf.f90 non-optional --- HP/src/hp_run_nscf.f90 | 2 +- LR_Modules/setup_nscf.f90 | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/HP/src/hp_run_nscf.f90 b/HP/src/hp_run_nscf.f90 index ae9c47e76..2bd4ea6a2 100644 --- a/HP/src/hp_run_nscf.f90 +++ b/HP/src/hp_run_nscf.f90 @@ -71,7 +71,7 @@ SUBROUTINE hp_run_nscf (do_band) CALL fft_type_allocate ( dfftp, at, bg, gcutm, intra_bgrp_comm, nyfft=nyfft ) CALL fft_type_allocate ( dffts, at, bg, gcutms, intra_bgrp_comm, nyfft=nyfft) ! - CALL setup_nscf ( .FALSE., xq, .FALSE. ) + CALL setup_nscf ( .FALSE., xq, .FALSE., 0) ! CALL init_run() ! diff --git a/LR_Modules/setup_nscf.f90 b/LR_Modules/setup_nscf.f90 index 5a30790ab..370458629 100644 --- a/LR_Modules/setup_nscf.f90 +++ b/LR_Modules/setup_nscf.f90 @@ -53,7 +53,7 @@ SUBROUTINE setup_nscf ( newgrid, xq, elph_mat, isolveph ) REAL (DP), INTENT(IN) :: xq(3) LOGICAL, INTENT (IN) :: newgrid LOGICAL, INTENT (IN) :: elph_mat ! used to be passed through a module. - INTEGER, INTENT (IN), OPTIONAL :: isolveph ! if present, use this diagonalization method + INTEGER, INTENT (IN) :: isolveph ! if present, use this diagonalization method ! REAL (DP), ALLOCATABLE :: rtau (:,:,:) LOGICAL :: magnetic_sym, sym(48) @@ -68,11 +68,13 @@ SUBROUTINE setup_nscf ( newgrid, xq, elph_mat, isolveph ) ! ! ... variables for iterative diagonalization ! ... Davdson: isolve=0, david=4 ; CG: isolve=1, david=1 - isolve = 0 - david = 4 - IF (PRESENT(isolveph)) THEN - isolve = isolveph - IF (isolveph == 1) david = 1 + isolve = isolveph + IF (isolveph == 0) THEN + david = 4 + ELSE IF (isolveph == 1) THEN + david = 1 + ELSE + call errore('setup_nscf','erroneous value for diagonalization method (isolveph). Should be 0 (david) or 1 (cg)',1) END IF nbndx = david*nbnd max_cg_iter=20