quantum-espresso/PP/postproc.f90

200 lines
6.1 KiB
Fortran

!
! Copyright (C) 2001-2009 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 pp
!-----------------------------------------------------------------------
!
! Program for data analysis and plotting. The two basic steps are:
! 1) read the output file produced by pw.x, extract and calculate
! the desired quantity (rho, V, ...)
! 2) write the desired quantity to file in a suitable format for
! various types of plotting and various plotting programs
! The two steps can be performed independently. Intermediate data
! can be saved to file in step 1 and read from file in step 2.
!
! DESCRIPTION of the INPUT : see file Doc/INPUT_PP.*
!
USE io_global, ONLY : ionode
USE mp_global, ONLY : mp_startup
USE environment,ONLY : environment_start
!
IMPLICIT NONE
CHARACTER(len=256) :: filplot
INTEGER :: plot_num
!
! initialise environment
!
#ifdef __PARA
CALL mp_startup ( )
#endif
CALL environment_start ( 'POST-PROC' )
!
IF ( ionode ) CALL input_from_file ( )
!
CALL extract (filplot, plot_num)
!
CALL chdens (filplot, plot_num)
!
CALL stop_pp()
!
END PROGRAM pp
!
!-----------------------------------------------------------------------
SUBROUTINE extract (filplot,plot_num)
!-----------------------------------------------------------------------
!
! This subroutine reads the data for the output file produced by pw.x
! extracts and calculates the desired quantity (rho, V, ...)
! writes it to a file for further processing or plotting
!
! DESCRIPTION of the INPUT: see file Doc/INPUT_PP
!
USE kinds, ONLY : DP
USE cell_base, ONLY : bg
USE ener, ONLY : ef
USE ions_base, ONLY : nat, ntyp=>nsp, ityp, tau
USE gvect
USE grid_dimensions, ONLY : nr1, nr2, nr3
USE klist, ONLY : two_fermi_energies
USE vlocal, ONLY : strf
USE io_files, ONLY : tmp_dir, prefix, trimcheck
USE io_global, ONLY : ionode, ionode_id
USE mp_global, ONLY : nproc, nproc_pool, nproc_file, nproc_pool_file
USE control_flags, ONLY : twfcollect
USE noncollin_module, ONLY : i_cons
USE paw_variables, ONLY : okpaw
USE mp, ONLY : mp_bcast
IMPLICIT NONE
CHARACTER(len=256), INTENT(out) :: filplot
INTEGER, INTENT(out) :: plot_num
INTEGER :: kpoint, kband, spin_component, ios
LOGICAL :: lsign, needwf
REAL(DP) :: emin, emax, sample_bias, z, dz, epsilon
! directory for temporary files
CHARACTER(len=256) :: outdir
NAMELIST / inputpp / outdir, prefix, plot_num, sample_bias, &
spin_component, z, dz, emin, emax, kpoint, kband, &
filplot, lsign, epsilon
!
! set default values for variables in namelist
!
prefix = 'pwscf'
CALL get_env( 'ESPRESSO_TMPDIR', outdir )
IF ( trim( outdir ) == ' ' ) outdir = './'
filplot = 'tmp.pp'
plot_num = -1
spin_component = 0
sample_bias = 0.01d0
z = 1.d0
dz = 0.05d0
lsign=.false.
emin = -999.0d0
emax = +999.0d0
epsilon=1.d0
!
ios = 0
!
IF ( ionode ) THEN
!
! reading the namelist inputpp
!
READ (5, inputpp, iostat = ios)
!
tmp_dir = trimcheck ( outdir )
!
ENDIF
!
CALL mp_bcast (ios, ionode_id)
!
IF ( ios /= 0) CALL errore ('postproc', 'reading inputpp namelist', abs(ios))
!
! ... Broadcast variables
!
CALL mp_bcast( tmp_dir, ionode_id )
CALL mp_bcast( prefix, ionode_id )
CALL mp_bcast( plot_num, ionode_id )
CALL mp_bcast( sample_bias, ionode_id )
CALL mp_bcast( spin_component, ionode_id )
CALL mp_bcast( z, ionode_id )
CALL mp_bcast( dz, ionode_id )
CALL mp_bcast( emin, ionode_id )
CALL mp_bcast( emax, ionode_id )
CALL mp_bcast( kband, ionode_id )
CALL mp_bcast( kpoint, ionode_id )
CALL mp_bcast( filplot, ionode_id )
CALL mp_bcast( lsign, ionode_id )
CALL mp_bcast( epsilon, ionode_id )
!
! no task specified: do nothing and return
!
IF (plot_num == -1) RETURN
!
IF (plot_num < 0 .or. plot_num > 18) CALL errore ('postproc', &
'Wrong plot_num', abs (plot_num) )
IF (plot_num == 7 .or. plot_num == 13 .or. plot_num==18) THEN
IF (spin_component < 0 .or. spin_component > 3) CALL errore &
('postproc', 'wrong spin_component', 1)
ELSEIF (plot_num == 10) THEN
IF (spin_component < 0 .or. spin_component > 2) CALL errore &
('postproc', 'wrong spin_component', 2)
ELSE
IF (spin_component < 0 ) CALL errore &
('postproc', 'wrong spin_component', 3)
ENDIF
!
! Now allocate space for pwscf variables, read and check them.
!
CALL read_file ( )
needwf=(plot_num==3).or.(plot_num==4).or.(plot_num==5).or.(plot_num==7).or. &
(plot_num==8).or.(plot_num==10)
IF (nproc /= nproc_file .and. .not. twfcollect .and. needwf) &
CALL errore('postproc',&
'pw.x run with a different number of processors. Use wf_collect=.true.',1)
IF (nproc_pool /= nproc_pool_file .and. .not. twfcollect .and. needwf) &
CALL errore('postproc',&
'pw.x run with a different number of pools. Use wf_collect=.true.',1)
IF ( ( two_fermi_energies .or. i_cons /= 0) .and. &
( plot_num==3 .or. plot_num==4 .or. plot_num==5 ) ) &
CALL errore('postproc',&
'Post-processing with constrained magnetization is not available yet',1)
! IF (okpaw) CALL errore('postproc', &
! 'post-processing paw routines not yet tested',1)
CALL openfil_pp ( )
CALL struc_fact (nat, tau, ntyp, ityp, ngm, g, bg, nr1, nr2, nr3, &
strf, eigts1, eigts2, eigts3)
! CALL init_us_1 ( )
!
! The following line sets emax to its default value if not set
! It is done here because Ef must be read from file
!
IF (emax == +999.0d0) emax = ef
IF (plot_num == 10) THEN
emin = emin / 13.6058d0
emax = emax / 13.6058d0
ENDIF
!
!
! Now do whatever you want
!
CALL punch_plot (filplot, plot_num, sample_bias, z, dz, &
emin, emax, kpoint, kband, spin_component, lsign, epsilon)
!
END SUBROUTINE extract