!
! Copyright (C) 2009-2010 Quantum ESPRESSO group
! This file is distributed under the terms of the
! GNU General Public License. See the file `License'
! in the root directory of the present distribution,
! or http://www.gnu.org/copyleft/gpl.txt .
!
!----------------------------------------------------------------------------
PROGRAM X_Spectra
USE kinds, ONLY : DP
USE constants, ONLY : rytoev,pi,fpi
USE io_global, ONLY : stdout,ionode,ionode_id ! Modules/io_global.f90
USE io_files, ONLY : prefix, iunwfc, nwordwfc, tmp_dir, diropn
USE cell_base, ONLY : bg, at, celldm
USE parameters, ONLY : ntypx
USE upf_params, ONLY : lmaxx
USE ions_base, ONLY : nat, ntyp => nsp, ityp, tau
USE start_k, ONLY : nk1, nk2, nk3, k1, k2, k3
USE wvfct, ONLY : npwx ,nbnd, et, wg ! et(nbnd,nkstot)
USE radial_grids, ONLY : ndmx
USE atom, ONLY : rgrid
USE becmod, ONLY : becp
USE uspp, ONLY : vkb, nkb, okvan
USE uspp_param, ONLY : upf
USE xspectra
USE ener, ONLY : ef, ef_up, ef_dw !Fermi energy (ef in Ry)
USE symm_base, ONLY : nsym,s
USE paw_gipaw, ONLY : read_recon, &
paw_vkb, & ! |p> projectors
paw_becp, & ! product of projectors and wf.
paw_nkb, & ! total number of beta functions, with st.fact.
paw_lmaxkb, &
paw_recon, &
set_paw_upf
USE klist, ONLY : &
nkstot, & ! total number of k-points
nks, & ! number of k-points for local pool
nelec,nelup,neldw, & !number of electrons
xk, & ! k-points coordinates
wk , & ! k-points weight
ngk, igk_k, & ! number of plane waves and indices of k+G
npk, &
degauss,lgauss,ngauss, &
two_fermi_energies
USE lsda_mod, ONLY : nspin,lsda,isk,current_spin
USE mp, ONLY : mp_bcast, mp_sum !parallelization
USE mp_global, ONLY : mp_startup, mp_global_end
USE mp_pools, ONLY : intra_pool_comm, npool
USE mp_world, ONLY : nproc, world_comm
USE control_flags, ONLY : gamma_only
USE environment, ONLY : environment_start
USE cut_valence_green, ONLY :&
cut_ierror, & ! convergence tolerance for one step in the integral
cut_stepu , & ! integration initial step, upper side
cut_stepl , & ! integration initial step, lower side
cut_startt, & ! integration start value of the t variable
cut_tinf , & ! maximum value of the lower integration boundary
cut_tsup , & ! minimum value of the upper integration boudary
cut_desmooth,& ! size of the interval near the fermi energy
! in which cross section is smoothed
cut_nmemu,& ! size of the memory of the values of the green function, upper side
cut_nmeml,& ! size of the memory of the values of the green function, lower side
cut_occ_states ! true if you want tou remove occupied states from the spectrum
!
USE gamma_variable_mod, ONLY : gamma_value, gamma_energy, &
gamma_lines, gamma_tab, gamma_points, &
gamma_mode, gamma_file
USE xspectra_paw_variables, ONLY : xspectra_paw_nhm, init_xspectra_paw_nhm
USE edge_energy, ONLY: getE
!
IMPLICIT NONE
!
! ... local variables
!
INTEGER :: il,ibnd,ibnd_up,ibnd_dw !,xm_r,nc_r,ncomp_max
!INTEGER :: nt,nb,na,i,j,k,nrest,nline
INTEGER :: nt,na,i,j,k !nrest,nline
INTEGER, ALLOCATABLE :: ncalcv(:,:)
INTEGER, ALLOCATABLE :: paw_iltonhb(:,:,:)
! corresp l, projector, type <--> cumulative over all the species
REAL (DP) :: norm, core_energy
REAL (DP) :: rc(ntypx,0:lmaxx),r_paw(0:lmaxx)
REAL (DP) :: core_wfn(ndmx)
REAL (DP) :: ehomo, elumo, middle_gap ! in eV
REAL (DP) :: e_core, e_core_ryd
REAL (DP), ALLOCATABLE :: a(:,:,:),b(:,:,:),xnorm(:,:) !lanczos vectors
!REAL (DP), EXTERNAL :: efermig,efermit
LOGICAL :: exst !, loc_set
CHARACTER (LEN=10) :: dummy_char
CHARACTER (LEN=256) :: filerecon(ntypx)
!REAL (DP) :: gamma_energy(2), gamma_value(2)
REAL (DP) :: xeps_dot_xk ! scalar product between xepsilon and xkvec
!REAL(dp) :: auxrpol(3,2) non used variable
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
! $ Initialize MPI environment, clocks and a few other things
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
#if defined(__MPI)
CALL mp_startup ( )
#endif
CALL environment_start ( 'XSpectra' )
CALL banner_xspectra()
CALL read_input_and_bcast(filerecon, r_paw)
call write_sym_param_to_stdout()
call select_nl_init(edge, nl_init, two_edges, n_lanczos)
CALL start_clock( calculation )
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
! $ Reads, initializes and writes several things in two cases :
! $ case 1: xonlyplot=.false. (complete calc., i.e. Lanczos + plot)
! $ case 2: xonlyplot=.true. (the plot only)
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
IF(.NOT.xonly_plot) THEN
WRITE(stdout,1000) ! return+line
WRITE(stdout,'(5x,2a)') &
' Reading SCF save directory: ',trim(prefix)//'.save'
WRITE(stdout,1001) ! line+return
CALL read_file()
CALL calculate_and_write_homo_lumo_to_stdout(ehomo,elumo)
! FC
CALL mp_bcast( ef, ionode_id, world_comm )
call reset_k_points_and_reinit_nscf()
call check_orthogonality_k_epsilon( xcoordcrys, xang_mom )
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
!... Is the type associated to xiabs existing ?
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
i=0
IF(xiabs<1 .or. xiabs>ntyp) CALL errore("xspectra","xiabs < 1 or xiabs > ntyp",1)
DO na=1,nat
IF(ityp(na).EQ.xiabs) i=i+1
ENDDO
IF(i.NE.1) THEN
CALL errore( 'main program', 'Wrong xiabs!!!',i)
ENDIF
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
!... Read core wavefunction and reconstruction files
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
WRITE(stdout,1000) ! return+line
WRITE(stdout,'(5x,a)') &
' Reading core wavefunction file for the absorbing atom'
WRITE(stdout,1001) ! line+return
DO nt = 1, ntyp
call set_paw_upf(nt, upf(nt))
ENDDO
CALL read_core_abs(filecore,core_wfn, nl_init)
WRITE(stdout,'(5x,a," successfully read")') TRIM(ADJUSTL(filecore))
IF ( .NOT. paw_recon(xiabs)%gipaw_data_in_upf_file ) &
CALL read_recon ( filerecon(xiabs), xiabs, paw_recon(xiabs) ) !*apsi
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
!... Assign pax radii to species
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
call assign_paw_radii_to_species(rc,r_paw)
!.... to here.
!... write band energies if xread_wf=true
IF(xread_wf.AND.TRIM(verbosity).EQ.'high') THEN
WRITE(stdout,'(5x,a)') &
'Band energies read from scf save file [units: eV]'
WRITE(stdout,'(5x,a)') &
'-------------------------------------------------'
DO i=1,nkstot
WRITE(stdout,'(5x,"k=[",3f14.8,"] spin=",1i2)') &
xk(1,i),xk(2,i),xk(3,i),isk(i)
WRITE(stdout, '(8f9.4)') (et(j,i)*rytoev,j=1,nbnd)
ENDDO
WRITE(stdout,*)
ENDIF
CALL init_gipaw_1
! CALL mp_bcast( ef, ionode_id ) !Why should I need this ?
!... Definition of a specific indexation to avoid M. Profeta's crazy one
CALL init_xspectra_paw_nhm
ALLOCATE (paw_iltonhb(0:paw_lmaxkb,xspectra_paw_nhm, ntyp))
CALL define_index_arrays(paw_iltonhb)
!... Allocates PAW projectors
ALLOCATE (paw_vkb( npwx, paw_nkb))
ALLOCATE (paw_becp(paw_nkb, nbnd))
ELSEIF(xonly_plot) THEN
CALL read_header_save_file(x_save_file)
nks = nkstot
IF(lsda) THEN
isk(1:nkstot/2)=1
isk(nkstot/2+1:nkstot)=2
! wk(1:nkstot)=2.d0/nkstot
ELSEIF(.NOT.lsda) THEN
isk(1:nkstot)=1
! wk(1:nkstot)=2.d0/nkstot
ENDIF
wk(1:nkstot)=2.d0/nkstot
CALL divide_et_impera( nkstot, xk, wk, isk, nks )
ENDIF
!
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
! $ Computing gamma tabulated values
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
! THIS MUST BE CHANGED
IF (TRIM(gamma_mode).EQ.'file') THEN
CALL read_gamma_file
ELSEIF (TRIM(gamma_mode).EQ.'variable') THEN
gamma_lines=2
ALLOCATE(gamma_points(2,2))
gamma_points(1,1)=gamma_energy(1)
gamma_points(2,1)=gamma_energy(2)
gamma_points(1,2)=gamma_value(1)
gamma_points(2,2)=gamma_value(2)
ENDIF
IF ((TRIM(gamma_mode).EQ.'file').OR.(TRIM(gamma_mode).EQ.'variable')) THEN
ALLOCATE( gamma_tab(xnepoint))
CALL initialize_gamma_tab
DEALLOCATE(gamma_points)
ENDIF
!
xnitermax=xniter
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
! $ Checks PAW relations between pseudo partial waves and projector
! $ (radial parts)
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
IF(.NOT.xonly_plot.AND.TRIM(verbosity).EQ.'high') &
CALL check_paw_projectors(xiabs)
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
! $ Allocates and initializes Lanczos variables
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
ALLOCATE(a(xnitermax,n_lanczos,nks))
ALLOCATE(b(xnitermax,n_lanczos,nks))
ALLOCATE(xnorm(n_lanczos,nks))
ALLOCATE(ncalcv(n_lanczos,nks))
a(:,:,:)=0.d0
b(:,:,:)=0.d0
xnorm(:,:)=0.d0
ncalcv(:,:)=0
! for restart
ALLOCATE(calculated(n_lanczos,nks))
calculated(:,:)=0
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
! $ And now we go... XANES CALCULATION
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
IF(TRIM(calculation).EQ.'xanes') THEN
IF(.NOT.xonly_plot) THEN ! complte calculation
call write_calculation_type(xang_mom, nl_init)
IF(TRIM(ADJUSTL(restart_mode)).eq.'restart') THEN
CALL read_header_save_file(x_save_file)
CALL read_save_file(a,b,xnorm,ncalcv,x_save_file,core_energy)
ENDIF
save_file_version = 2 ! adds ef after core_energy
IF(nl_init(2).EQ.0.AND.xang_mom .eq. 1) THEN
save_file_kind='xanes_dipole'
CALL xanes_dipole(a,b,ncalcv,xnorm,core_wfn,&
paw_iltonhb,terminator,verbosity)
ELSEIF(nl_init(2).EQ.0.AND.xang_mom .eq. 2) THEN
save_file_kind='xanes_quadrupole'
CALL xanes_quadrupole(a,b,ncalcv,xnorm,core_wfn,&
paw_iltonhb,terminator,verbosity)
ELSEIF(nl_init(2).EQ.1.AND.xang_mom .eq. 1) then
call xanes_dipole_general_edge(a,b,ncalcv,nl_init,xnorm,core_wfn,paw_iltonhb,terminator, verbosity)
ENDIF
CALL write_save_file(a,b,xnorm,ncalcv,x_save_file)
ELSE ! only the spectrum plot
WRITE(stdout,1000) ! return+line
WRITE(stdout,'(5x,a)')&
' Reading x_save_file'
WRITE(stdout,1001) ! line+return
CALL read_save_file(a,b,xnorm,ncalcv,x_save_file,core_energy)
IF (save_file_version .eq. 1 .AND. abs(xe0-xe0_default)<1.e-3) THEN
WRITE(stdout,'(5x,3a)') &
"STOP: the variable 'xe0' must be assigned in ", &
'input file', ' (since save_file_version = 1)'
CALL stop_xspectra()
ENDIF
ENDIF
IF (TRIM(save_file_kind).eq.'unfinished') CALL stop_xspectra ()
IF (.NOT.xonly_plot) THEN
!
WRITE(stdout,'(5x,"... Begin STEP 2 ...",/)')
WRITE(stdout,'(5x,a)') &
'The spectrum is calculated using the following parameters:'
!
e_core = getE(upf(xiabs)%psd,edge)
ELSE
WRITE(stdout,1000) ! return+line
WRITE(stdout,'(5x,a,a)') &
' Starting the calculation of the spectrum'
WRITE(stdout,1001) !line+return
WRITE(stdout,'(5x,a)') 'Using the following parameters:'
!
e_core = core_energy
!
ENDIF
e_core_ryd = e_core/rytoev
IF (abs(xe0-xe0_default)<1.d-3) THEN ! xe0 not in input_file
write(stdout,'(8x,a,f9.4,a)') 'energy-zero of the spectrum [eV]: ',&
ef
! ef is either read in x_save_file (version 2) if xonlyplot=T
! or determined from the scf calculation
xe0_ry = ef/rytoev ! ef est en eV ici
ELSE ! xe0 is read in the input
WRITE(stdout,'(8x,a,f9.4,a)') 'xe0 [eV]: ', xe0
xe0_ry=xe0/rytoev
ENDIF
call write_report_cut_occ_states(cut_occ_states, e_core)
IF(xang_mom.EQ.1) THEN
CALL plot_xanes_dipole(a,b,xnorm,ncalcv,terminator,e_core_ryd,1)
if(two_edges) CALL plot_xanes_dipole(a,b,xnorm,ncalcv,terminator,e_core_ryd,2)
ELSEIF(xang_mom.EQ.2) THEN
CALL plot_xanes_quadrupole(a,b,xnorm,ncalcv,terminator,e_core_ryd)
ELSEIF(nl_init(2).eq.1) then
ENDIF
!
WRITE(stdout,'(5x,"Cross-section successfully written in ",a,/)') &
xanes_file
IF (.NOT. xonly_plot) WRITE(stdout,'(5x,"... End STEP 2 ...",/)')
ELSEIF(TRIM(calculation).EQ.'rxes') THEN
CALL errore( 'Main', 'rxes Not yet implemented',1)
ELSEIF(TRIM(calculation).EQ.'bethe_salpeter') THEN
CALL errore( 'Main', 'bethe_salpeter Not yet implemented',1)
ENDIF
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
! Deallocation
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
! IF(.NOT.xonly_plot) THEN
! call deallocate_bec_type ( becp )
! ENDIF
DEALLOCATE(a)
DEALLOCATE(b)
DEALLOCATE(xnorm)
DEALLOCATE(ncalcv)
!WRITE (stdout,*) 'End program ', TRIM(calculation)
CALL stop_clock( calculation )
CALL print_clock( calculation )
WRITE (stdout, 1000)
WRITE (stdout,'(5x,a)') ' END JOB XSpectra'
WRITE (stdout, 1001)
CALL stop_xspectra ()
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
! Formats
! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
1000 FORMAT(/,5x,&
'-------------------------------------------------------------------------')
1001 FORMAT(5x,&
'-------------------------------------------------------------------------',&
/)
END program X_Spectra
!------------------------------------------------------------------------------
!------------------------------------------------------------------------------
SUBROUTINE define_index_arrays(paw_iltonhb)
!----------------------------------------------------------------------------
USE paw_gipaw, ONLY: paw_lmaxkb, paw_recon
USE ions_base, ONLY: ntyp => nsp
USE upf_params, ONLY: lmaxx
USE xspectra_paw_variables, ONLY : xspectra_paw_nhm ! CG
IMPLICIT NONE
! Arguments
INTEGER :: paw_iltonhb(0:paw_lmaxkb,xspectra_paw_nhm,ntyp) ! CG
! Local
INTEGER :: nt,ih,nb,l
INTEGER :: ip_per_l(0:lmaxx)
DO nt = 1, ntyp
ih = 1
ip_per_l(:) = 0
DO nb = 1, paw_recon(nt)%paw_nbeta
l = paw_recon(nt)%aephi(nb)%label%l
ip_per_l(l) = ip_per_l(l) + 1
paw_iltonhb(l,ip_per_l(l),nt) = ih
ih = ih + 2*l + 1
ENDDO
ENDDO
END SUBROUTINE define_index_arrays
!------------------------------------------------------------------------------
!------------------------------------------------------------------------------
SUBROUTINE check_paw_projectors(xiabs)
!----------------------------------------------------------------------------
USE kinds, ONLY: DP
USE constants, ONLY: pi
USE paw_gipaw, ONLY: paw_lmaxkb, paw_recon
USE xspectra_paw_variables, ONLY: xspectra_paw_nhm
USE atom, ONLY: rgrid, msh
USE ions_base, ONLY: ntyp => nsp
USE io_global, ONLY: stdout
USE radin_mod
IMPLICIT NONE
INTEGER, INTENT(IN) :: xiabs
! Local variables
INTEGER :: nr, nrc, ip, jp, lmax, l, ip_l, jtyp, n1, n2, nrs, ndm, ih, jh
REAL(dp) :: overlap, rexx, overlap2
REAL (dp), ALLOCATABLE :: aux(:), f(:,:)
REAL(dp) , ALLOCATABLE :: s(:,:), e(:), v(:,:)
ALLOCATE(aux(rgrid(xiabs)%mesh)) !allocation too big, it needs only up to msh
ALLOCATE(f(rgrid(xiabs)%mesh,2)) !allocation too big, it needs only up to msh
WRITE(stdout,'(/,5x,a)')&
'-------------------------------------------------------------------------'
WRITE(stdout,'(5x,a)') &
' Verification of the PAW relations '
WRITE(stdout,'(5x,a,/)')&
'-------------------------------------------------------------------------'
WRITE(stdout,'(8x,a)') 'atom type total number of projectors'
DO jtyp=1,ntyp
WRITE (stdout,'(13x,i4,3x,i4)') jtyp, paw_recon(jtyp)%paw_nbeta
ENDDO
WRITE(stdout,*)
!... I calculate maximum l
!
lmax=0
DO ip = 1, paw_recon(xiabs)%paw_nbeta
IF(paw_recon(xiabs)%psphi(ip)%label%l.GT.lmax) &
lmax = paw_recon(xiabs)%psphi(ip)%label%l
ENDDO
WRITE(stdout,'(8x,a)') 'atom type l number of projectors per ang. mom.'
DO jtyp = 1, ntyp
DO l = 0, lmax
WRITE(stdout,'(13x,i4,3x,i2,3x,i4)') jtyp, l, paw_recon(jtyp)%paw_nl(l)
ENDDO
ENDDO
WRITE(stdout,*)
!... We calculate the overlaps between partial waves and projectors
! to see if they are equal to the Croneker delta.
nr = msh(xiabs) ! extended up to all the NON ZERO points in the mesh.
WRITE(stdout,'(8x,a)')'Overlaps between partial waves and projectors (radial)'
WRITE(stdout,'(8x,a)')'------------------------------------------------------'
WRITE(stdout,*)
WRITE(stdout,'(8x,a)') &
'< \tilde{phi}_{l,n} | \tilde{p}_{l,nn} > = delta_{n,nn} ?'
WRITE(stdout,*)
DO ip = 1, paw_recon(xiabs)%paw_nbeta
DO jp = 1, paw_recon(xiabs)%paw_nbeta
IF(paw_recon(xiabs)%psphi(ip)%label%l .EQ. &
paw_recon(xiabs)%psphi(jp)%label%l) THEN
nrc=Count(rgrid(xiabs)%r(1:nr)<=paw_recon(xiabs)%psphi(ip)%label%rc)
IF(nrc > nr) THEN
WRITE(stdout,'(8x,a,i8,a,i8)') 'STOP: nrc=', nrc,' > nr=', nr
CALL errore ( "nrc > nr", "xanes_dipole", 0 )
ENDIF
aux(1:nrc) = paw_recon(xiabs)%psphi(ip)%psi(1:nrc) &
* paw_recon(xiabs)%paw_betar(1:nrc,jp)
aux(nrc+1:nr) = 0.d0
WRITE(stdout,'(8x,"=",1f14.8)') &
ip,paw_recon(xiabs)%psphi(ip)%label%l,jp, &
paw_recon(xiabs)%psphi(jp)%label%l, &
para_radin(aux(1:nr),rgrid(xiabs)%r(1:nr),nr)
ENDIF
ENDDO
ENDDO
WRITE(stdout,*)
WRITE(stdout,'(8x,a)')'Checking normalization of pseudo,ae wfc and projectors'
WRITE(stdout,'(8x,a)')'(radial part only, integral up to r_c)'
WRITE(stdout,'(8x,a)')'------------------------------------------------------'
WRITE(stdout,*)
WRITE(stdout,'(8x,a)') 'l, n, |proj|^2, |pswf|^2 , |aewf|^2'
DO l = 0, lmax
DO ip = 1, paw_recon(xiabs)%paw_nbeta
IF(paw_recon(xiabs)%psphi(ip)%label%l.EQ.l) THEN
nrc =Count(rgrid(xiabs)%r(1:nr)<=paw_recon(xiabs)%psphi(ip)%label%rc)
aux(1:nrc) = paw_recon(xiabs)%paw_betar(1:nrc,ip) &
* paw_recon(xiabs)%paw_betar(1:nrc,ip)
overlap = para_radin(aux(1:nrc),rgrid(xiabs)%r(1:nrc),nrc)
aux(1:nrc) = paw_recon(xiabs)%aephi(ip)%psi(1:nrc) &
* paw_recon(xiabs)%aephi(ip)%psi(1:nrc)
overlap2 = para_radin(aux(1:nrc),rgrid(xiabs)%r(1:nrc),nrc)
aux(1:nrc) = paw_recon(xiabs)%psphi(ip)%psi(1:nrc) &
* paw_recon(xiabs)%psphi(ip)%psi(1:nrc)
rexx = para_radin(aux(1:nrc),rgrid(xiabs)%r(1:nrc),nrc)
WRITE(stdout,'(8x,2i4,3f14.8)')l,ip,overlap,overlap2,rexx
ENDIF
ENDDO
ENDDO
WRITE(stdout,*)
GOTO 323
WRITE(stdout,'(8x,a)') ' = \sum_nl _nrc ?'
WRITE(stdout,'(8x,a)') '-----------------------------------------------'
WRITE(stdout,'(8x,a)') &
'WARNING: this test assumes a form of the phi/chi function'
! DO l=0,lmax
DO l = 1, 1
ip_l = 0
DO ip = 1, paw_recon(xiabs)%paw_nbeta
IF(ip_l.EQ.0.AND.paw_recon(xiabs)%psphi(ip)%label%l.EQ.l) ip_l = ip
ENDDO
f(:,:) = 0.d0
DO ip = 1, paw_recon(xiabs)%paw_nbeta
IF(paw_recon(xiabs)%psphi(ip)%label%l.EQ.l) THEN
f(1:nr,1) = f(1:nr,1) + &
paw_recon(xiabs)%psphi(ip)%psi(1:nr)/REAL(ip,dp)
f(1:nr,2) = f(1:nr,2) + &
1.123*paw_recon(xiabs)%psphi(ip)%psi(1:nr)/REAL(ip,dp)
ENDIF
ENDDO
rexx = 0.d0
DO ip = 1, paw_recon(xiabs)%paw_nbeta
IF(paw_recon(xiabs)%psphi(ip)%label%l.EQ.l) THEN
nrc=Count(rgrid(xiabs)%r(1:nr)<=paw_recon(xiabs)%psphi(ip)%label%rc)
IF(nrc > nr) THEN
WRITE(stdout,'(8x,a,i8,a,i8)') 'STOP: nrc=', nrc,' > nr=', nr
CALL errore ( "nrc > nr", "xanes_dipole", 0 )
ENDIF
aux(1:nrc) = f(1:nrc,1)*paw_recon(xiabs)%paw_betar(1:nrc,ip)
overlap = para_radin(aux(1:nrc),rgrid(xiabs)%r(1:nrc),nrc)
aux(1:nrc) = f(1:nrc,2)*paw_recon(xiabs)%psphi(ip)%psi(1:nrc)
overlap = overlap*para_radin(aux(1:nrc),rgrid(xiabs)%r(1:nrc),nrc)
WRITE(stdout,'(8x,"overlap(l=",1i2,",n=",1i2,")= ",1f14.8)')&
l, ip, overlap
rexx = rexx + overlap
ENDIF
ENDDO
aux(1:nr) = f(1:nr,1)*f(1:nr,2)
WRITE(stdout,'(8x,"sum/overlap=",1f14.8)') &
rexx/para_radin(aux,rgrid(xiabs)%r(1:nr),nrc)
WRITE(stdout,'(8x,"sum projectors=",1f14.8," overlap=",1f14.8)') &
rexx,para_radin(aux,rgrid(xiabs)%r(1:nr),nrc)
WRITE(stdout,*)
ENDDO
! ENDDO
!WRITE(stdout,*)
!WRITE(stdout,*) '================================================================'
323 CONTINUE
!
! Check linear dependence of projectors
!
WRITE(stdout,'(8x,a)') 'Checking linear dependence of projectors'
WRITE(stdout,'(8x,a)') '----------------------------------------'
WRITE(stdout,*)
DEALLOCATE(aux)
ndm = MAXVAL (msh(1:ntyp))
ALLOCATE(aux(ndm))
DO l = 0, paw_lmaxkb
IF (paw_recon(xiabs)%paw_nl(l)>0) THEN
ALLOCATE (s(paw_recon(xiabs)%paw_nl(l),paw_recon(xiabs)%paw_nl(l)))
ALLOCATE (e(paw_recon(xiabs)%paw_nl(l)),v(paw_recon(xiabs)%paw_nl(l),&
paw_recon(xiabs)%paw_nl(l)))
DO ih = 1, paw_recon(xiabs)%paw_nl(l)
n1 = paw_recon(xiabs)%paw_iltonh(l,ih)
nrc = paw_recon(xiabs)%psphi(n1)%label%nrc
nrs = paw_recon(xiabs)%psphi(n1)%label%nrs
DO jh = 1, paw_recon(xiabs)%paw_nl(l)
n2 = paw_recon(xiabs)%paw_iltonh(l,jh)
CALL step_f(aux,paw_recon(xiabs)%psphi(n1)%psi(1:msh(xiabs)) * &
paw_recon(xiabs)%psphi(n2)%psi(1:msh(xiabs)), &
rgrid(xiabs)%r(1:msh(xiabs)),nrs,nrc, 1.d0, msh(xiabs) )
CALL simpson( msh(xiabs), aux, rgrid(xiabs)%rab(1), s(ih,jh))
ENDDO
ENDDO
WRITE(stdout,'(8x,"atom type:",1i4)') xiabs
WRITE(stdout,'(8x,"number of projectors projector =",1i3, " angular momentum=",1i4)') &
paw_recon(xiabs)%paw_nl(l),l
DO ih = 1, paw_recon(xiabs)%paw_nl(l)
WRITE(stdout,'(8x,10f14.8)') (s(ih,jh),jh=1,paw_recon(xiabs)%paw_nl(l))
ENDDO
WRITE(stdout,'(8x,a)') 'Eigenvalues S matrix:'
IF(paw_recon(xiabs)%paw_nl(l).EQ.1) THEN
WRITE(stdout,'(10x,1i4,1f14.8)') 1,s(1,1)
ELSE
CALL rdiagh(paw_recon(xiabs)%paw_nl(l), s, &
paw_recon(xiabs)%paw_nl(l) , e, v )
DO ih=1,paw_recon(xiabs)%paw_nl(l)
WRITE(stdout,'(10x,1i4,1f14.8)') ih,e(ih)
ENDDO
ENDIF
WRITE(stdout,*)
FLUSH(stdout)
DEALLOCATE(s,e,v)
ENDIF
ENDDO
!WRITE(stdout,*) '================================================================'
DEALLOCATE(aux,f)
END SUBROUTINE check_paw_projectors
!------------------------------------------------------------------------------
!------------------------------------------------------------------------------
SUBROUTINE initialize_gamma_tab
!----------------------------------------------------------------------------
USE kinds, ONLY: dp
USE xspectra, ONLY: xemin, xemax, xnepoint
USE io_global, ONLY: stdout
USE constants, ONLY: rytoev
USE gamma_variable_mod
IMPLICIT NONE
REAL(dp) :: e, x, y, dx
INTEGER :: i, j, n
dx = (xemax-xemin)/DBLE(xnepoint)
DO n = 1, xnepoint
x = xemin + (n-1)*dx
i = 1
DO j = 1, gamma_lines
IF(x > gamma_points(j,1)) i = i + 1
ENDDO
IF (i == 1) THEN
y = gamma_points(1,2)
ELSEIF (i == (gamma_lines+1)) THEN
y = gamma_points(gamma_lines,2)
ELSE
y = ( gamma_points(i-1,2) * (gamma_points(i,1)-x) &
+ gamma_points(i,2) * (x-gamma_points(i-1,1)) )&
/ ( gamma_points(i,1) - gamma_points(i-1,1) )
ENDIF
gamma_tab(n) = y/rytoev
ENDDO
END SUBROUTINE initialize_gamma_tab