#!/bin/sh

# run from directory where this script is
cd `echo $0 | sed 's/\(.*\)\/.*/\1/'` # extract pathname
EXAMPLE_DIR=`pwd`

# check whether echo has the -e option
if test "`echo -e`" = "-e" ; then ECHO=echo ; else ECHO="echo -e" ; fi

$ECHO
$ECHO "$EXAMPLE_DIR : starting"
$ECHO
$ECHO "This example shows how to use pw.x and postprocessing codes to make a"
$ECHO "contour plot in the [110] plane of the charge density for Si, and to"
$ECHO "plot the band structure of Si."

# set the needed environment variables
. ../../../environment_variables

# required executables and pseudopotentials
BIN_LIST="pw.x pp.x plotrho.x bands.x plotband.x"
PSEUDO_LIST="Si.pz-vbc.UPF"

$ECHO
$ECHO "  executables directory: $BIN_DIR"
$ECHO "  pseudo directory:      $PSEUDO_DIR"
$ECHO "  temporary directory:   $TMP_DIR"
$ECHO "  checking that needed directories and files exist...\c"

# check for directories
for DIR in "$BIN_DIR" "$PSEUDO_DIR" ; do
    if test ! -d $DIR ; then
        $ECHO
        $ECHO "ERROR: $DIR not existent or not a directory"
        $ECHO "Aborting"
        exit 1
    fi
done
for DIR in "$TMP_DIR" "$EXAMPLE_DIR/results" ; do
    if test ! -d $DIR ; then
        mkdir $DIR
    fi
done
cd $EXAMPLE_DIR/results

# check for executables
for FILE in $BIN_LIST ; do
    if test ! -x $BIN_DIR/$FILE ; then
        $ECHO
        $ECHO "ERROR: $BIN_DIR/$FILE not existent or not executable"
        $ECHO "Aborting"
        exit 1
    fi
done

# check for pseudopotentials
for FILE in $PSEUDO_LIST ; do
    if test ! -r $PSEUDO_DIR/$FILE ; then
       $ECHO
       $ECHO "Downloading $FILE to $PSEUDO_DIR...\c"
            $WGET $PSEUDO_DIR/$FILE \
                http://www.quantum-espresso.org/pseudo/1.3/UPF/$FILE 2> /dev/null
    fi
    if test $? != 0; then
        $ECHO
        $ECHO "ERROR: $PSEUDO_DIR/$FILE not existent or not readable"
        $ECHO "Aborting"
        exit 1
    fi
done
$ECHO " done"

# how to run executables
PW_COMMAND="$PARA_PREFIX $BIN_DIR/pw.x $PARA_POSTFIX"
PP_COMMAND="$PARA_PREFIX $BIN_DIR/pp.x $PARA_POSTFIX"
PLOTRHO_COMMAND="$BIN_DIR/plotrho.x"
BANDS_COMMAND="$PARA_PREFIX $BIN_DIR/bands.x $PARA_POSTFIX"
PLOTBAND_COMMAND="$BIN_DIR/plotband.x"
$ECHO
$ECHO "  running pw.x as:       $PW_COMMAND"
$ECHO "  running pp.x as:       $PP_COMMAND"
$ECHO "  running plotrho.x as:  $PLOTRHO_COMMAND"
$ECHO "  running bands.x as:    $BANDS_COMMAND"
$ECHO "  running plotband.x as: $PLOTBAND_COMMAND"
$ECHO

# clean TMP_DIR
$ECHO "  cleaning $TMP_DIR...\c"
rm -rf $TMP_DIR/*
$ECHO " done"

# self-consistent calculation
cat > si.scf.xml << EOF
<?xml version="1.0" encoding="UTF-8"?>

<input calculation="scf" prefix="si">

	<cell type="qecell">
		<qecell ibrav="2" alat="10.20">
			<real rank="1" n1="5">
				0.0 0.0 0.0 0.0 0.0
			</real>
		</qecell>
	</cell>

	<atomic_species ntyp="1">
		<specie name="Si">
			<property name="mass">
				<real>28.086</real>
			</property>
			<property name="pseudofile">
				<string>Si.pz-vbc.UPF</string>
			</property>
		</specie>
	</atomic_species>
	
	<atomic_list units="alat" nat="2" >
		<atom name="Si">
			<position>
				<real rank="1" n1="3">
					0.00 0.00 0.00
				</real>
			</position>
		</atom>	
		<atom name="Si">
			<position>
				<real rank="1" n1="3">
					0.25 0.25 0.25
				</real>
			</position>
		</atom>					
	</atomic_list>	
	
	<field name="InputOutput">

		<parameter name="restart_mode">
			<string>
				from_scratch
			</string>
		</parameter>
		
		<parameter name="pseudo_dir">
			<string>
				$PSEUDO_DIR/
			</string>
		</parameter>
		
		<parameter name="outdir">
			<string>
				$TMP_DIR/
			</string>
		</parameter>
		
	</field>
	
	<field name="Numerics">

		<parameter name="ecutwfc">
			<real>
				18.0
			</real>
		</parameter>
		
		<parameter name="mixing_beta">
			<real>
				0.7
			</real>
		</parameter>
		
		<parameter name="conv_thr">
			<real>
				1.0d-8
			</real>
		</parameter>
		
	</field>	
	
	<k_points type="tpiba">
		<mesh npoints="10">
			<real rank="2" n1="4" n2="10">
	                      0.1250000  0.1250000  0.1250000   1.00
			      0.1250000  0.1250000  0.3750000   3.00
			      0.1250000  0.1250000  0.6250000   3.00
			      0.1250000  0.1250000  0.8750000   3.00
			      0.1250000  0.3750000  0.3750000   3.00
			      0.1250000  0.3750000  0.6250000   6.00
			      0.1250000  0.3750000  0.8750000   6.00
			      0.1250000  0.6250000  0.6250000   3.00
			      0.3750000  0.3750000  0.3750000   1.00
			      0.3750000  0.3750000  0.6250000   3.00
			</real>
		</mesh>
	</k_points>
</input>
EOF
$ECHO "  running the scf calculation...\c"
$PW_COMMAND < si.scf.xml > si.scf.out
check_failure $?
$ECHO " done"

# post-processing for charge density
cat > si.pp_rho.in << EOF
 &inputpp
    prefix  = 'si'
    outdir = '$TMP_DIR/'
    filplot = 'sicharge'
    plot_num= 0
 /
 &plot
    nfile = 1
    filepp(1) = 'sicharge'
    weight(1) = 1.0
    iflag = 2
    output_format = 2
    fileout = 'si.rho.dat'
    e1(1) =1.0, e1(2)=1.0, e1(3) = 0.0,
    e2(1) =0.0, e2(2)=0.0, e2(3) = 1.0,
    nx=56, ny=40
 /
EOF
$ECHO "  running pp.x to do a 2-d plot of the charge density...\c"
$PP_COMMAND < si.pp_rho.in > si.pp_rho.out
check_failure $?
$ECHO " done"

# plotrho
cat > si.plotrho.in << EOF
si.rho.dat
si.rho.ps
n
0 0.09 6
EOF
$ECHO "  running plotrho.x to generate rho.ps...\c"
$PLOTRHO_COMMAND < si.plotrho.in > si.plotrho.out
$ECHO " done"

# band structure calculation along high-symmetry lines
cat > si.band.xml << EOF
<?xml version="1.0" encoding="UTF-8"?>

<input calculation="bands" prefix="si">

	<cell type="qecell">
		<qecell ibrav="2" alat="10.20">
			<real rank="1" n1="5">
				0.0 0.0 0.0 0.0 0.0
			</real>
		</qecell>
	</cell>

	<atomic_species ntyp="1">
		<specie name="Si">
			<property name="mass">
				<real>28.086</real>
			</property>
			<property name="pseudofile">
				<string>Si.pz-vbc.UPF</string>
			</property>
		</specie>
	</atomic_species>

	<atomic_list units="alat" nat="2" >
		<atom name="Si">
			<position>
				<real rank="1" n1="3">
					0.00 0.00 0.00
				</real>
			</position>
		</atom>	
		<atom name="Si">
			<position>
				<real rank="1" n1="3">
					0.25 0.25 0.25
				</real>
			</position>
		</atom>					
	</atomic_list>		
	
	
	<field name="InputOutput">

		<parameter name="pseudo_dir">
			<string>
				$PSEUDO_DIR/
			</string>
		</parameter>
		
		<parameter name="outdir">
			<string>
				$TMP_DIR/
			</string>
		</parameter>
		
	</field>
	
	<field name="Numerics">

		<parameter name="ecutwfc">
			<real>
				18.0
			</real>
		</parameter>
		
	</field>	
	
	<field name="Options">

		<parameter name="nbnd">
			<integer>
				8
			</integer>
		</parameter>
		
	</field>	
	
	<k_points type="tpiba">
		<mesh npoints="36">
			<real rank="2" n1="4" n2="36">
				   0.5 0.5 0.5  1
				   0.4 0.4 0.4  2
				   0.3 0.3 0.3  3
				   0.2 0.2 0.2  4
				   0.1 0.1 0.1  5
				   0.0 0.0 0.0  6
				   0.0 0.0 0.1  7
				   0.0 0.0 0.2  8
				   0.0 0.0 0.3  9
				   0.0 0.0 0.4 10
				   0.0 0.0 0.5 11
				   0.0 0.0 0.6 12
				   0.0 0.0 0.7 13
				   0.0 0.0 0.8 14
				   0.0 0.0 0.9 15
				   0.0 0.0 1.0 16
				   0.0 0.1 1.0 17
				   0.0 0.2 1.0 18
				   0.0 0.3 1.0 19
				   0.0 0.4 1.0 20
				   0.0 0.5 1.0 21
				   0.0 0.6 1.0 22
				   0.0 0.7 1.0 23
				   0.0 0.8 1.0 24
				   0.0 0.9 1.0 25
				   0.0 1.0 1.0 26
				   0.0 0.9 0.9 27
				   0.0 0.8 0.8 28
				   0.0 0.7 0.7 29
				   0.0 0.6 0.6 30
				   0.0 0.5 0.5 31
				   0.0 0.4 0.4 32
				   0.0 0.3 0.3 33
				   0.0 0.2 0.2 34
				   0.0 0.1 0.1 35
				   0.0 0.0 0.0 36
			</real>
		</mesh>
	</k_points>
</input>
EOF
$ECHO "  running the band-structure calculation for Si...\c"
$PW_COMMAND < si.band.xml > si.band.out
check_failure $?
$ECHO " done"

# post-processing for band structure
cat > si.bands.in << EOF
 &inputpp
    prefix  = 'si'
    outdir = '$TMP_DIR/'
    filband = 'sibands.dat'
 /
EOF
$ECHO "  running the post-processing for band structure...\c"
$BANDS_COMMAND < si.bands.in > si.bands.out
check_failure $?
$ECHO " done"

# plotband.x
cat > si.plotband.in << EOF
sibands.dat
-6.0 10
sibands.xmgr
sibands.ps
6.255
1.0 6.255
EOF
$ECHO "  running plotband.x to generate sibands.ps...\c"
$PLOTBAND_COMMAND < si.plotband.in > si.plotband.out
check_failure $?
$ECHO " done"

$ECHO
$ECHO "$EXAMPLE_DIR: done"
