input_description -distribution {Quantum Espresso} -package PWscf -program pp.x {

    toc {}

    intro {
        @b {Purpose of pp.x:} data analysis and plotting.
        
        The code performs two steps:
	
        (1) reads the output produced by @b pw.x, extracts and calculates
	    the desired quantity/quantities (rho, V, ...)
	
        (2) writes the desired quantity to file in a suitable format for
            various types of plotting and various plotting programs

        The input data of this program is read from standard input
        or from file and has the following format:

        NAMELIST @b &INPUTPP
           containing the variables for step (1), followed by

        NAMELIST @b &PLOT
           containing the variables for step (2)

        The two steps can be performed independently. In order to perform
        only step (2), leave namelist @b &INPUTPP blank. In order to perform
        only step (1), do not specify namelist @b &PLOT

        Intermediate results from step 1 can be saved to disk (see
        variable @ref filplot in @b &INPUTPP) and later read in step 2.
        Since the file with intermediate results is formatted, it
        can be safely transferred to a different machine. This 
        also allows plotting of a linear combination (for instance,
        charge differences) by saving two intermediate files and
        combining them (see variables @ref weight and @ref filepp in @b &PLOT)

        All output quantities are in ATOMIC (RYDBERG) UNITS unless
        otherwise explicitly specified.
    }

    namelist INPUTPP {

        var prefix -type CHARACTER {
            info { 
                prefix of files saved by program pw.x 
            }
        }
        
        var outdir -type CHARACTER {
            info {
                directory containing the input data, i.e. the same as in pw.x
            }
            default {
                value of the @tt ESPRESSO_TMPDIR environment variable if set;
                current directory ('./') otherwise
            }
        }
        
        var filplot -type CHARACTER {
            info { 
                file "filplot" contains the quantity selected by plot_num 
                (can be saved for further processing)
            }
        }
        
        var plot_num -type INTEGER {
            info { 
                Selects what to save in filplot:

                   0  = electron (pseudo-)charge density
		   
                   1  = total potential V_bare + V_H + V_xc
		   
                   2  = local ionic potential V_bare
		   
                   3  = local density of states at specific energy or grid of energies
                        (number of states per volume, in bohr^3, per energy unit, in Ry) 
		   
                   4  = local density of electronic entropy
		   
                   5  = STM images
                        Tersoff and Hamann, PRB 31, 805 (1985)
		   
                   6  = spin polarization (rho(up)-rho(down))
		   
                   7  = contribution of a selected wavefunction to the
                        (pseudo-)charge density. For norm-conserving PPs,
                        |psi|^2 (psi=selected wavefunction). Noncollinear case:
                        contribution of the given state to the charge or
                        to the magnetization along the direction indicated
                        by spin_component (0 = charge, 1 = x, 2 = y, 3 = z )
		   
                   8  = electron localization function (ELF)
		   
                   9  = charge density minus superposition of atomic densities
		   
                   10 = integrated local density of states (ILDOS)
                        from @ref emin to @ref emax (emin, emax in eV)
                        if @ref emax is not specified, @ref emax=E_fermi
		   
                   11 = the V_bare + V_H potential
		   
                   12 = the sawtooth electric field potential (if present)
		   
                   13 = the noncollinear magnetization.
		   
                   17 = all-electron valence charge density
                        can be performed for PAW calculations only 
                        requires a very dense real-space grid!
		   
                   18 = The exchange and correlation magnetic field in the noncollinear case
		   
                   19 = Reduced density gradient 
                        ( J. Chem. Theory Comput. 7, 625 (2011), doi:10.1021/ct100641a )
                        Set the isosurface between 0.3 and 0.6 to plot the 
                        non-covalent interactions (see also plot_num = 20)
		   
                   20 = Product of the electron density (charge) and the second 
                        eigenvalue of the electron-density Hessian matrix;
                        used to colorize the RDG plot (plot_num = 19)
		   
                   21 = all-electron charge density (valence+core).
                        For PAW calculations only; requires a very dense real-space grid. 

            }
        }

        choose {
            when -test "plot_num=0" {
                label {
                    Options for total charge (plot_num=0): 
                }
                
                var spin_component -type INTEGER {
                    default 0 
                    info {
                        0 = total charge (default value),
                        1 = spin up charge,
                        2 = spin down charge.
                    }
                }
            }
            
            elsewhen -test "plot_num=1" {
                label {
                    Options for total potential (plot_num=1): 
                }
                
                var spin_component -type INTEGER {
                    default 0 
                    info {
                        0 = spin averaged potential (default value),
                        1 = spin up potential,
                        2 = spin down potential.
                    }
                }
            }

            elsewhen -test "plot_num=3" {
                label { 
                    Options for LDOS (plot_num=3): 
                    LDOS is plotted on grid [emin, emax] with spacing delta_e.
                }
                
                var emin -type REAL {
                    default e_fermi
                    info {
                        lower boundary of energy grid (in eV).

                        Defaults to Fermi energy.
                    }
                }
                
                var emax -type REAL {
                    status OPTIONAL 
                    info {
                        upper boundary of energy grid (in eV).

                        If not specified, LDOS is computed just for energy @ref emin
                    }
                }

                var delta_e -type REAL {
                    default 0.1
                    status OPTIONAL 
                    info {
                        spacing of energy grid (in eV).
                    }
                }

                var degauss_ldos -type REAL {
                    default {degauss (converted to eV)}
                    status OPTIONAL 
                    info {
                        broadening of energy levels for LDOS (in eV).

                        Defaults to broadening degauss specified for electronic smearing
                        in pw.x calculation.
                    }
                }
            }
            
            elsewhen -test "plot_num=5" {
                label {
                    Options for STM images (plot_num=5): 
                }
                
                var sample_bias -type REAL {
                    info {
                        the bias of the sample (Ry) in stm images
                    }
                }
                
            }
            
            elsewhen -test "plot_num=7" {
                label { 
                    Options for |psi|^2 (plot_num=7): 
                }

                dimension kpoint -start 1 -end 2 -type INTEGER {
                    info {
                        Unpolarized and noncollinear case:
                                k-point to be plotted
                        LSDA:
                                k-point and spin polarization to be plotted
                                (spin-up and spin-down correspond to different k-points!)
                        
                        When both kpoint(1) and kpoint(2) are specified, all
                        kpoints in the range [kpoint(1),kpoint(2)] are plotted.
                    }
                }
                
                dimension kband -start 1 -end 2 -type INTEGER {
                    info { 
                        Band to be plotted.
			
                        When both kband(1) and kband(2) are specified, all
                        bands in the range [kband(1),kband(2)] are plotted.
                    }
                }
                
                var lsign -type LOGICAL {
                    info {
                        if true and k point is Gamma, plot |psi|^2 sign(psi)
                    }
                }
                
                dimension spin_component -start 1 -end 2 -type INTEGER {
                    default 0
                    status OPTIONAL
                    info {
                        @b {Noncollinear case only:}
                        plot the contribution of the given state to the charge 
                        or to the magnetization along the direction indicated 
                        by spin_component:
                                0 = charge (default), 
                                1 = x, 
                                2 = y, 
                                3 = z.

                        Ignored in unpolarized or LSDA case

                        When both spin_component(1) and spin_component(2) are specified,
                        all components in the range [spin_component(1),spin_component(2)]
                        are plotted.
                    }
                }
            }
            
            elsewhen -test "plot_num=10" {
                label { 
                    Options for ILDOS (plot_num=10): 
                }
                
                var emin -type REAL {
                    info {
                        lower energy boundary (in eV)
                    }
                }
                
                var emax -type REAL {
                    info {
                        upper energy boundary (in eV),
                        i.e. compute ILDOS from @ref emin to @ref emax
                    }
                }
                
                var spin_component -type INTEGER {
                    default 0
                    info {
                        for LSDA case only: plot the contribution to ILDOS of
                        0 = spin-up + spin-down (default)
                        1 = spin-up   only
                        2 = spin-down only
                    }
                }           
            }
            
            elsewhen -test "plot_num=13" {
                label { 
                    Options for noncollinear magnetization (plot_num=13): 
                } 
                
                var spin_component -type INTEGER {
                    default 0 
                    info {
                        0 = absolute value (default value)
                        1 = x component of the magnetization
                        2 = y component of the magnetization
                        3 = z component of the magnetization
                    }
                }
            }

            elsewhen -test "plot_num=17" {
                label { 
                    Options for reconstructed charge density (plot_num=17): 
                } 
                
                var spin_component -type INTEGER {
                    default 0
                    info {
                        0 = total charge (default value),
                        1 = spin up charge,
                        2 = spin down charge.
                    }
                }
            }

            #message { 
            #   Unfinished and untested option:
            #   
            #   plot_num = 14, 15, 16  polarisation along x, y, z respectively.
            #   epsilon  = macroscopic dielectric constant
            #}
        }
    }
    # END of namelist &INPUTPP


    # namelist PLOT

    namelist PLOT {
        
        var nfile -type INTEGER {
            default 1 
            status OPTIONAL 
            info {
                the number of data files to read
            }
        }
        
        group {
            
            dimension filepp -start 1 -end nfile -type CHARACTER {
                default { filepp(1)=filplot } 
                info {
                    nfile = 1 : file containing the quantity to be plotted
                    nfile > 1 : see @ref weight
                }
            }
            
            dimension weight -start 1 -end nfile -type REAL {
                default { weight(1)=1.0 } 
                info {
                    weighing factors: assuming that rho(i) is the quantity
                    read from filepp(i), the quantity that will be plotted is:
                    
                    weight(1)*rho(1) + weight(2)*rho(2) + weight(3)*rho(3) + ...
                }
            }   
            
            message {
                @b BEWARE: atomic coordinates are read from the first file;
                        if their number is different for different files,
                        the first file must have the largest number of atoms
            }     
        }
        
        var iflag -type INTEGER {
            info {
                0 = 1D plot of the spherical average
                1 = 1D plot
                2 = 2D plot
                3 = 3D plot
                4 = 2D polar plot on a sphere
            }
        }
        
        var output_format -type INTEGER {
            info {
                (ignored on 1D plot)
                
                0  = format suitable for gnuplot   (1D)
                
                1  = format suitable for contour.x (2D)
                
                2  = format suitable for plotrho   (2D)
                
                3  = format suitable for XCRYSDEN  (2D or user-supplied 3D region)
                
                4  = format suitable for gOpenMol  (3D)
                     (formatted: convert to unformatted *.plt)
                
                5  = format suitable for XCRYSDEN  (3D, using entire FFT grid)

                6  = format as gaussian cube file  (3D)
                     (can be read by many programs)

                7  = format suitable for gnuplot   (2D) x, y, f(x,y)
            }
        }

        var fileout -type CHARACTER {
            default { standard output } 
            info {
                name of the file to which the plot is written
            }   
        }

        var interpolation -type CHARACTER {
            default { 'fourier' }
            options {
                info {
                    Type of interpolation:
                }
                opt -val 'fourier' {}
                opt -val 'bspline' { (EXPERIMENTAL) }
            }
        }

        choose {            
            when -test "iflag = 0 or 1" {
                label { the following variables are REQUIRED: } 
                
                dimension e1 -start 1 -end 3 -type REAL {
                    info {
                        3D vector which determines the plotting line (in alat units)
                    }
                }
                
                dimension x0 -start 1 -end 3  -type REAL {
                    info {
                        3D vector, origin of the line (in alat units)
                    }
                }
                
                var nx -type INTEGER {
                    info {
                        number of points in the line:
                        
                        rho(i) = rho( x0 + e1 * (i-1)/(nx-1) ), i=1, nx
                    }
                }
            }       

            elsewhen -test "iflag = 2" {
                label { the following variables are REQUIRED: } 
                
                dimensiongroup  -start 1 -end 3 -type REAL {
                    dimension e1
                    dimension e2
                    info {
                        3D vectors which determine the plotting plane (in alat units)

                        BEWARE: @b e1 and @b e2 must be orthogonal
                    }
                }
                
                dimension x0 -start 1 -end 3 -type REAL {
                    info {
                        3D vector, origin of the plane (in alat units)
                    }
                }
                
                vargroup -type INTEGER {
                    var nx
                    var ny
                    info {
                        Number of points in the plane:
                        
                        rho(i,j) = rho( x0 + e1 * (i-1)/(nx-1)
                                        + e2 * (j-1)/(ny-1) ), i=1,nx ; j=1,ny
                    }
                }           
            }       
            
            elsewhen -test "iflag = 3" {
                label { the following variables are OPTIONAL: } 
                
                dimensiongroup -start 1 -end 3 -type REAL {
                    dimension e1
                    dimension e2
                    dimension e3
                    info {
                        3D vectors which determine the plotting parallelepiped
                        (if present, must be orthogonal)

                        @ref e1, @ref e2, and @ref e3 are in alat units !
                    }
                }
                
                dimension x0 -start 1 -end 3 -type REAL {
                    info {
                        3D vector, origin of the parallelepiped

                        @ref x0 is in alat units !
                    }
                }
                
                vargroup -type INTEGER {
                    var nx
                    var ny
                    var nz 
                    info {
                        Number of points in the parallelepiped:
                        
                        rho(i,j,k) = rho( x0 + e1 * (i-1)/nx
                                          + e2 * (j-1)/ny
                                          + e3 * (k-1)/nz ),
                                     i = 1, nx ; j = 1, ny ; k = 1, nz

                        - If @ref output_format = 3 (XCRYSDEN), the above variables
                          are used to determine the grid to plot. 
                        
                        - If @ref output_format = 5 (XCRYSDEN), the above variables
                          are ignored, the entire FFT grid is written in the
                          XCRYSDEN format - works for any crystal axis (VERY FAST)
                        
                        - If @ref e1, @ref e2, @ref e3, @ref x0 are present, and @ref e1, @ref e2, @ref e3 are parallel
                          to xyz and parallel to crystal axis, a subset of the
                          FFT grid that approximately covers the parallelepiped
                          defined by @ref e1, @ref e2, @ref e3, @ref x0, is written (presently only
                          if @ref output_format = 4, i.e. gopenmol format) - works only
                          if the crystal axis are parallel to xyz

                        - Otherwise, the required 3D grid is generated from the
                          Fourier components (may be VERY slow)
                    }
                }               
            }       

            elsewhen -test "iflag = 4" {
                label { the following variables are REQUIRED: }
                
                var radius -type REAL {
                    info {
                        Radius of the sphere (alat units), centered at (0,0,0)
                    }
                }
                
                vargroup -type INTEGER {
                    var nx
                    var ny 
                    info {
                        Number of points in the polar plane:

                        phi(i)   = 2 pi * (i - 1)/(nx-1), i=1, nx
                        theta(j) =   pi * (j - 1)/(ny-1), j=1, ny
                    }
                }                               
            }   
        }
    }
    # END of namelist PLOT
}
