#!/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 to calculate the total energy"
$ECHO "of silicon and of a few small molecules using hybrid functionals."

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

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

x_gamma_extrapolation=".TRUE."
exxdiv_treatment="gygi-baldereschi"
if [ ! -z "$1" ] ; then exxdiv_treatment="$1" ; fi
if [ "$exxdiv_treatment" = "vcut_ws" ] ; then x_gamma_extrapolation=.FALSE. ; fi
if [ "$exxdiv_treatment" = "vcut_spherical" ] ; then x_gamma_extrapolation=.FALSE. ; fi
ecutvcut=0.7

$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 $NETWORK_PSEUDO/$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"
$ECHO
$ECHO "  running pw.x as: $PW_COMMAND"
$ECHO

$ECHO
$ECHO "  running PBE0 calculation for Si with nq=1,2,4 \c"
$ECHO

for nq in 1 2 4 ; do

# self-consistent calculation
cat > si.in << EOF
 &control
    calculation = 'scf'
    restart_mode='from_scratch',
    prefix='silicon',
    pseudo_dir = '$PSEUDO_DIR/',
    outdir='$TMP_DIR/'
    tstress = .TRUE.
 /
 &system    
    ibrav=  2, celldm(1) =10.20, nat=  2, ntyp= 1,
    ecutwfc =12.0,  nbnd = 8,
    input_dft='pbe0', nqx1 = $nq, nqx2 = $nq, nqx3 = $nq, 
    exxdiv_treatment='$exxdiv_treatment'
    ecutvcut=$ecutvcut
    x_gamma_extrapolation = $x_gamma_extrapolation
 /
 &electrons
    mixing_beta = 0.7 
 /
ATOMIC_SPECIES
 Si  28.086  Si.pz-vbc.UPF
ATOMIC_POSITIONS alat
 Si 0.00 0.00 0.00 
 Si 0.25 0.25 0.25 
K_POINTS
  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
EOF
$ECHO "  running the scf calculation for Si with nq = $nq ...\c"
$PW_COMMAND < si.in > si.PBE0_nq=${nq}.out
$ECHO " done"
grep -e ! si.PBE0_nq=${nq}.out | tail -1

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

done

$ECHO
$ECHO "  running HSE calculation for Si with nq=1,2,4 \c"
$ECHO

for nq in 1 2 4 ; do

# self-consistent calculation
cat > si.in << EOF
 &control
    calculation = 'scf'
    restart_mode='from_scratch',
    prefix='silicon',
    pseudo_dir = '$PSEUDO_DIR/',
    outdir='$TMP_DIR/'
 /
 &system    
    ibrav=  2, celldm(1) =10.20, nat=  2, ntyp= 1,
    ecutwfc =12.0,  nbnd = 8,
    input_dft='hse', nqx1 = $nq, nqx2 = $nq, nqx3 = $nq, 
    x_gamma_extrapolation = $x_gamma_extrapolation
    exxdiv_treatment = '$exxdiv_treatment'
 /
 &electrons
    mixing_beta = 0.7 
 /
ATOMIC_SPECIES
 Si  28.086  Si.pz-vbc.UPF
ATOMIC_POSITIONS alat
 Si 0.00 0.00 0.00 
 Si 0.25 0.25 0.25 
K_POINTS
  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
EOF
$ECHO "  running the scf calculation for Si with nq = $nq ...\c"
$PW_COMMAND < si.in > si.hse_nq=${nq}.out
$ECHO " done"
grep -e ! si.hse_nq=${nq}.out | tail -1

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

done


$ECHO
$ECHO "  running Gau-PBE calculation for Si with nq=1,2,4 \c"
$ECHO

for nq in 1 2 4 ; do

# self-consistent calculation
cat > si.in << EOF
 &control
    calculation = 'scf'
    restart_mode='from_scratch',
    prefix='silicon',
    pseudo_dir = '$PSEUDO_DIR/',
    outdir='$TMP_DIR/'
 /
 &system    
    ibrav=  2, celldm(1) =10.20, nat=  2, ntyp= 1,
    ecutwfc =12.0,  nbnd = 8,
    input_dft='gaupbe', nqx1 = $nq, nqx2 = $nq, nqx3 = $nq, 
    x_gamma_extrapolation = .false.
    exxdiv_treatment = 'none'
 /
 &electrons
    mixing_beta = 0.7 
 /
ATOMIC_SPECIES
 Si  28.086  Si.pz-vbc.UPF
ATOMIC_POSITIONS alat
 Si 0.00 0.00 0.00 
 Si 0.25 0.25 0.25 
K_POINTS
  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
EOF
$ECHO "  running the scf calculation for Si with nq = $nq ...\c"
$PW_COMMAND < si.in > si.gaupbe_nq=${nq}.out
$ECHO " done"
grep -e ! si.gaupbe_nq=${nq}.out | tail -1

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

done

$ECHO
$ECHO "  running now a few molecules with Gamma sampling ...\c"
$ECHO
PSEUDO_DIR=$EXAMPLE_DIR/Pseudo
$ECHO "  pseudo directory changed to:      $PSEUDO_DIR"
$ECHO


for xc in pbe0 hse gaupbe; do

$ECHO "  Exchange and correlation is: " $xc "...\c"
$ECHO

if [ "$xc" = "gaupbe" ] ; then x_gamma_extrapolation=.FALSE. ; fi
if [ "$xc" = "gaupbe" ] ; then exxdiv_treatment=none ; fi
if [ "$xc" = "gaupbe" ] ; then ecutvcut=0.0 ; fi

ps=1nlcc
ecut=80

cat > o.inp << EOF
&CONTROL
                 calculation = 'scf' ,
                restart_mode = 'from_scratch' ,
                      outdir = '$TMP_DIR/' ,
                  pseudo_dir = '$PSEUDO_DIR/',
                      prefix = 'o',
                     disk_io = 'minimal' ,
                      iprint = 1
                     tprnfor = .true.
 /
 &SYSTEM
                       ibrav = 1,
                   celldm(1) = 12.0,
                         nat = 1,
                        ntyp = 1,
                     ecutwfc = $ecut ,
                   input_dft = '$xc'
                       nspin = 2
                        nbnd = 4
           tot_magnetization = 2.0
            exxdiv_treatment = '$exxdiv_treatment'
                    ecutvcut = $ecutvcut
       x_gamma_extrapolation = $x_gamma_extrapolation
 /
 &ELECTRONS
                    conv_thr = 0.5d-3
 /
ATOMIC_SPECIES
  O 16.0  OPBE$ps.RRKJ3
ATOMIC_POSITIONS angstrom 
  O  0.1 0.2 0.3 
K_POINTS gamma
#automatic 
#1 1 1  0 0 0 
EOF
$ECHO "  running oxygen atom..\c"
$PW_COMMAND < o.inp > o.$xc.$ps.out-$ecut
$ECHO " done"

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

cat > c.inp << EOF
&CONTROL
                 calculation = 'scf' ,
                restart_mode = 'from_scratch' ,
                      outdir = '$TMP_DIR/' ,
                  pseudo_dir = '$PSEUDO_DIR/',
                      prefix = 'c',
                     disk_io = 'minimal' ,
                      iprint = 1
                     tprnfor = .true.
 /
 &SYSTEM
                       ibrav = 1,
                   celldm(1) = 12.0,
                         nat = 1,
                        ntyp = 1,
                     ecutwfc = $ecut ,
                        input_dft='$xc'
                       nspin = 2
                        nbnd = 4
           tot_magnetization = 2.0
            exxdiv_treatment = '$exxdiv_treatment'
                    ecutvcut = $ecutvcut
       x_gamma_extrapolation = $x_gamma_extrapolation
 /
 &ELECTRONS
                    conv_thr = 0.5d-3
 /
ATOMIC_SPECIES
  C 16.0  CPBE$ps.RRKJ3
ATOMIC_POSITIONS angstrom 
  C  0.1 0.2 0.3 
K_POINTS gamma
#automatic 
#1 1 1  0 0 0 
EOF
$ECHO "  running carbon atom..\c"
$PW_COMMAND < c.inp > c.$xc.$ps.out-$ecut
$ECHO " done"

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

cat > n.inp << EOF
&CONTROL
                 calculation = 'scf' ,
                restart_mode = 'from_scratch' ,
                      outdir = '$TMP_DIR/' ,
                  pseudo_dir = '$PSEUDO_DIR/',
                      prefix = 'n',
                     disk_io = 'minimal' ,
                      iprint = 1
                     tprnfor = .true.
 /
 &SYSTEM
                       ibrav = 1,
                   celldm(1) = 12.0,
                         nat = 1,
                        ntyp = 1,
                     ecutwfc = $ecut ,
                        input_dft='$xc'
                       nspin = 2
                        nbnd = 4
           tot_magnetization = 3.0
            exxdiv_treatment = '$exxdiv_treatment'
                    ecutvcut = $ecutvcut
       x_gamma_extrapolation = $x_gamma_extrapolation
 /
 &ELECTRONS
                    conv_thr = 0.5d-4
 /
ATOMIC_SPECIES
  N 16.0  NPBE$ps.RRKJ3
ATOMIC_POSITIONS angstrom 
  N  0.1 0.2 0.3 
K_POINTS gamma
#automatic 
#1 1 1  0 0 0 
EOF
$ECHO "  running nitrogen atom..\c"
$PW_COMMAND < n.inp > n.$xc.$ps.out-$ecut
$ECHO " done"

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

b=0.3169 
cat > n2.inp << EOF
&CONTROL
                 calculation = 'scf' ,
                restart_mode = 'from_scratch' ,
                      outdir = '$TMP_DIR/' ,
                  pseudo_dir = '$PSEUDO_DIR/',
                      prefix = 'n2',
                     disk_io = 'minimal' ,
                      iprint = 1
                     tprnfor = .true.
 /
 &SYSTEM
                       ibrav = 1,
                   celldm(1) = 12.0,
                         nat = 2,
                        ntyp = 1,
                     ecutwfc = $ecut ,
                        input_dft='$xc'
                        nbnd = 8
            exxdiv_treatment = '$exxdiv_treatment'
                    ecutvcut = $ecutvcut
       x_gamma_extrapolation = $x_gamma_extrapolation
 /
 &ELECTRONS
                    conv_thr = 1.d-4
 /
 &IONS
 /
ATOMIC_SPECIES
  N 16.0  NPBE$ps.RRKJ3
ATOMIC_POSITIONS angstrom 
  N  $b  $b  $b
  N -$b -$b -$b
K_POINTS gamma
#automatic 
#1 1 1  0 0 0 
EOF
$ECHO "  running n2 molecule..\c"
$PW_COMMAND < n2.inp > n2.$xc.$ps.out-$ecut
$ECHO " done"

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

b=0.3256
cat > co.inp << EOF
&CONTROL
                 calculation = 'scf' ,
                restart_mode = 'from_scratch' ,
                      outdir = '$TMP_DIR/' ,
                  pseudo_dir = '$PSEUDO_DIR/',
                      prefix = 'co',
                     disk_io = 'minimal' ,
                      iprint = 1
                     tprnfor = .true.
 /
 &SYSTEM
                       ibrav = 1,
                   celldm(1) = 12.0,
                         nat = 2,
                        ntyp = 2,
                     ecutwfc = $ecut ,
                        input_dft='$xc'
                        nbnd = 8
            exxdiv_treatment = '$exxdiv_treatment'
                    ecutvcut = $ecutvcut
       x_gamma_extrapolation = $x_gamma_extrapolation
 /
 &ELECTRONS
                    conv_thr = 0.5d-3
 /
 &IONS
 /
ATOMIC_SPECIES
  C 16.0  CPBE$ps.RRKJ3
  O 16.0  OPBE$ps.RRKJ3
ATOMIC_POSITIONS angstrom 
  C  $b  $b  $b
  O -$b -$b -$b
K_POINTS gamma
#automatic 
#1 1 1  0 0 0 
EOF
$ECHO "  running co molecule..\c"
$PW_COMMAND < co.inp > co.$xc.$ps.out-$ecut
$ECHO " done" 

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

b=0.3478
cat > o2.inp << EOF
&CONTROL
                 calculation = 'scf' ,
                restart_mode = 'from_scratch' ,
                      outdir = '$TMP_DIR/' ,
                  pseudo_dir = '$PSEUDO_DIR/',
                      prefix = 'o2',
                     disk_io = 'minimal' ,
                      iprint = 1
                     tprnfor = .true.
 /
 &SYSTEM
                       ibrav = 1,
                   celldm(1) = 12.0,
                         nat = 2,
                        ntyp = 1,
                     ecutwfc = $ecut ,
                        input_dft='$xc'
                       nspin = 2
                        nbnd = 8
           tot_magnetization = 2.0
            exxdiv_treatment = '$exxdiv_treatment'
                    ecutvcut = $ecutvcut
       x_gamma_extrapolation = $x_gamma_extrapolation
 /
 &ELECTRONS
                    conv_thr = 0.5d-3
 /
 &IONS
 /
ATOMIC_SPECIES
  O 16.0  OPBE$ps.RRKJ3
ATOMIC_POSITIONS angstrom 
  O  $b  $b  $b
  O -$b -$b -$b
K_POINTS gamma
#automatic 
#1 1 1  0 0 0 
EOF
$ECHO "  running o2 molecule..\c"
$PW_COMMAND < o2.inp > o2.$xc.$ps.out-$ecut
$ECHO " done"
# clean TMP_DIR
$ECHO "  cleaning $TMP_DIR...\c"
rm -rf $TMP_DIR/o2.*
$ECHO " done"

$ECHO
cat > summarize << EOF
grep -e ! n.$xc.$ps.out-$ecut  | tail -1 | awk '{print \$5}' > N
grep -e ! n2.$xc.$ps.out-$ecut | tail -1 | awk '{print \$5}' > N2
paste N2 N  | awk '{be= (\$1-\$2*2.0) * 13.6058 * 23.06; print "N2 : ",be}'
grep -e ! o.$xc.$ps.out-$ecut  | tail -1 | awk '{print \$5}' > O
grep -e ! o2.$xc.$ps.out-$ecut | tail -1 | awk '{print \$5}' > O2
paste O2 O  | awk '{be= (\$1-\$2*2.0) * 13.6058 * 23.06 ; print "O2 : ",be}'
grep -e ! c.$xc.$ps.out-$ecut  | tail -1 | awk '{print \$5}' > C
grep -e ! co.$xc.$ps.out-$ecut | tail -1 | awk '{print \$5}' > CO
paste CO O C | awk '{be= (\$1-\$2-\$3) * 13.6058 * 23.06; print "CO : ",be}'
rm C N O CO O2 N2
EOF
sh summarize
$ECHO 
done

$ECHO "$EXAMPLE_DIR : done"
