#!/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 a calculation of STM maps." # set the needed environment variables . ../../../environment_variables # required executables and pseudopotentials BIN_LIST="pw.x pp.x plotrho.x projwfc.x sumpdos.x" PSEUDO_LIST="Al.pz-vbc.UPF As.pz-bhs.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 gnuplot GP_COMMAND=`which gnuplot 2>/dev/null` if [ "$GP_COMMAND" = "" ]; then $ECHO $ECHO "gnuplot not in PATH" $ECHO "Results will not be plotted" fi # 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" PP_COMMAND="$PARA_PREFIX $BIN_DIR/pp.x $PARA_POSTFIX" PLOTRHO_COMMAND="$BIN_DIR/plotrho.x" PROJWFC_COMMAND="$PARA_PREFIX $BIN_DIR/projwfc.x $PARA_POSTFIX" SUMPDOS_COMMAND="$BIN_DIR/sumpdos.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 projwfc.x as: $PROJWFC_COMMAND" $ECHO " running sumpdos.x as: $SUMPDOS_COMMAND" $ECHO " running gnuplot as: $GP_COMMAND" $ECHO # self-consistent calculation cat > AlAs110re.scf.in << EOF &control calculation = 'scf' restart_mode='from_scratch', title='AlAs 110 surface slab, relaxed (central plane fixed)' pseudo_dir = '$PSEUDO_DIR/', outdir='$TMP_DIR/', prefix='AlAs110' / &system ibrav= 8, celldm(1) =7.424621202, celldm(2)=1.414213576, celldm(3)= 6.00000, nat= 14, ntyp= 2, ecutwfc =14.0, / &electrons mixing_mode = 'plain' mixing_beta = 0.7 conv_thr = 1.0d-6 / ATOMIC_SPECIES Al 26.98 Al.pz-vbc.UPF As 74.92 As.pz-bhs.UPF ATOMIC_POSITIONS alat As 0.000000000 -0.044777195 -0.058158722 Al 0.500000000 0.251460333 0.113525468 As 0.500000000 0.712279009 0.504183885 Al 0.000000000 1.067633546 0.480460620 As 0.000000000 -0.003937059 0.995826731 Al 0.500000000 0.351400965 1.004220212 As 0.000000000 -0.003937059 2.004173269 Al 0.500000000 0.351400965 1.995779788 As 0.500000000 0.712279009 2.495816115 Al 0.000000000 1.067633546 2.519539380 As 0.000000000 -0.044777195 3.058158722 Al 0.500000000 0.251460333 2.886474532 As 0.500000000 0.707106800 1.500000000 Al 0.000000000 1.060660200 1.500000000 K_POINTS {automatic} 6 2 1 0 0 0 EOF $ECHO " running the scf calculation...\c" $PW_COMMAND < AlAs110re.scf.in > AlAs110re.scf.out check_failure $? $ECHO " done" cat > AlAs110re.nonscf.in << EOF &control calculation = 'nscf' restart_mode='from_scratch', title='AlAs 110 surface slab, relaxed (central plane fixed)' pseudo_dir = '$PSEUDO_DIR/', outdir='$TMP_DIR/', prefix='AlAs110' / &system ibrav= 8, celldm(1) =7.424621202, celldm(2)=1.414213576, celldm(3)= 6.00000, nat= 14, ntyp= 2, occupations='smearing', smearing='gaussian', degauss=0.01, nbnd=34, ecutwfc =14.0, / &electrons mixing_mode = 'plain' mixing_beta = 0.7 conv_thr = 1.0d-6 / ATOMIC_SPECIES Al 26.98 Al.pz-vbc.UPF As 74.92 As.pz-bhs.UPF ATOMIC_POSITIONS alat As 0.000000000 -0.044777195 -0.058158722 Al 0.500000000 0.251460333 0.113525468 As 0.500000000 0.712279009 0.504183885 Al 0.000000000 1.067633546 0.480460620 As 0.000000000 -0.003937059 0.995826731 Al 0.500000000 0.351400965 1.004220212 As 0.000000000 -0.003937059 2.004173269 Al 0.500000000 0.351400965 1.995779788 As 0.500000000 0.712279009 2.495816115 Al 0.000000000 1.067633546 2.519539380 As 0.000000000 -0.044777195 3.058158722 Al 0.500000000 0.251460333 2.886474532 As 0.500000000 0.707106800 1.500000000 Al 0.000000000 1.060660200 1.500000000 K_POINTS {automatic} 12 4 1 0 0 0 EOF $ECHO " running the non-scf calculation...\c" $PW_COMMAND < AlAs110re.nonscf.in > AlAs110re.nonscf.out check_failure $? $ECHO " done" # post-processing for stm images (sample bias given in Ry!) cat > AlAs110.pp_stm-.in << EOF &inputpp prefix = 'AlAs110' outdir='$TMP_DIR/', filplot = 'AlAsresm-1.0' sample_bias=-0.0735d0, plot_num= 5 / &plot nfile=1 filepp(1)='AlAsresm-1.0' weight(1)=1.0 iflag=2 output_format=2 e1(1)=7.0, e1(2)=0.0, e1(3)=0.0 e2(1)=0.0, e2(2)=7.07107, e2(3)=0.0 x0(1)=0.0, x0(2)=-0.18, x0(3)=3.25 nx=36 ,ny=56 fileout='AlAs110-1.0' / EOF $ECHO $ECHO " running the post-processing phase, negative bias...\c" $PP_COMMAND < AlAs110.pp_stm-.in > AlAs110.pp_stm-.out check_failure $? $ECHO " done" # run plotrho to do the figure cat > AlAs110.plotrho-.in << EOF AlAs110-1.0 AlAs110-1.0eV.ps n 0.00005 0.0078 8 EOF $ECHO " running plotrho on negative bias data...\c" $PLOTRHO_COMMAND < AlAs110.plotrho-.in > AlAs110.plotrho-.out check_failure $? $ECHO " done" # post-processing for stm images (negative bias, constant current) cat > AlAs110.pp_isostm-.in << EOF &inputpp / &plot nfile=1 filepp(1)='AlAsresm-1.0' weight(1)=1.0 iflag=2 output_format=7 fileout='AlAs110.pp_isostm-.dat' e1(1)=7.0, e1(2)=0.0, e1(3)=0.0 e2(1)=0.0, e2(2)=7.07107, e2(3)=0.0 nx=150, ny=150 isostm_flag=.true. isovalue=0.00005 heightmin=0.4 heightmax=0.75 direction=1 / EOF $ECHO $ECHO " STM image, negative bias and constant current...\c" $PP_COMMAND < AlAs110.pp_isostm-.in > AlAs110.pp_isostm-.out check_failure $? $ECHO " done" # run gnuplot to do the figure if [ "$GP_COMMAND" = "" ]; then break else cat > gnuplot.tmp < AlAs110.pp_stm+.in << EOF &inputpp prefix = 'AlAs110' outdir='$TMP_DIR/', filplot = 'AlAsresm+1.0' sample_bias=0.0735d0, plot_num= 5 / &plot nfile=1 filepp(1)='AlAsresm+1.0' weight(1)=1.0 iflag=2 output_format=2 e1(1)=7.0, e1(2)=0.0, e1(3)=0.0 e2(1)=0.0, e2(2)=7.07107, e2(3)=0.0 x0(1)=0.0, x0(2)=-0.18, x0(3)=3.25 nx=36 ,ny=56 fileout='AlAs110+1.0' / EOF $ECHO " running the post-processing phase, positive bias...\c" $PP_COMMAND < AlAs110.pp_stm+.in > AlAs110.pp_stm+.out check_failure $? $ECHO " done" # plotrho cat > AlAs110.plotrho+.in << EOF AlAs110+1.0 AlAs110+1.0eV.ps n 0.00002 0.0021 8 EOF $ECHO " running plotrho on positive bias data...\c" $PLOTRHO_COMMAND < AlAs110.plotrho+.in > AlAs110.plotrho+.out check_failure $? $ECHO " done" # post-processing for stm images (positive bias, constant current) cat > AlAs110.pp_isostm+.in << EOF &inputpp / &plot nfile=1 filepp(1)='AlAsresm+1.0' weight(1)=1.0 iflag=2 output_format=7 fileout='AlAs110.pp_isostm+.dat' e1(1)=7.0, e1(2)=0.0, e1(3)=0.0 e2(1)=0.0, e2(2)=7.07107, e2(3)=0.0 nx=150, ny=150 isostm_flag=.true. isovalue=0.00005 heightmin=0.4 heightmax=0.75 direction=1 / EOF $ECHO $ECHO " STM image, positive bias and constant current...\c" $PP_COMMAND < AlAs110.pp_isostm+.in > AlAs110.pp_isostm+.out check_failure $? $ECHO " done" # run gnuplot to do the figure if [ "$GP_COMMAND" = "" ]; then break else cat > gnuplot.tmp < AlAs110.box.projwfc.in << EOF &projwfc prefix = 'AlAs110' outdir='$TMP_DIR/', ngauss=0 degauss=0.01 DeltaE=0.02 tdosinboxes=.true. plotboxes=.true. n_proj_boxes=8 !! Boxes centered on the first vacuum layer: !! 1) above the surface Al irmin(1,1)= 0, irmax(1,1)= 2, irmin(2,1)= 0, irmax(2,1)= 2, irmin(3,1)=63, irmax(3,1)=65, !! 2) above the surface As irmin(1,2)= 9, irmax(1,2)=11, irmin(2,2)= 5, irmax(2,2)= 7, irmin(3,2)=63, irmax(3,2)=65, !! 3) above the 2nd layer Al irmin(1,3)= 9, irmax(1,3)=11, irmin(2,3)=14, irmax(2,3)=16, irmin(3,3)=63, irmax(3,3)=65, !! 4) as large as the surface unit cell irmin(1,4)= 1, irmax(1,4)=18, irmin(2,4)= 1, irmax(2,4)=27, irmin(3,4)=63, irmax(3,4)=65, !! Same as above, centered on the second vacuum layer: irmin(1,5)= 0, irmax(1,5)= 2, irmin(2,5)= 0, irmax(2,5)= 2, irmin(3,5)=72, irmax(3,5)=74, irmin(1,6)= 9, irmax(1,6)=11, irmin(2,6)= 5, irmax(2,6)= 7, irmin(3,6)=72, irmax(3,6)=74, irmin(1,7)= 9, irmax(1,7)=11, irmin(2,7)=14, irmax(2,7)=16, irmin(3,7)=72, irmax(3,7)=74, irmin(1,8)= 1, irmax(1,8)=18, irmin(2,8)= 1, irmax(2,8)=27, irmin(3,8)=72, irmax(3,8)=74, / EOF $ECHO $ECHO " running local DOS calculation...\c" $PROJWFC_COMMAND < AlAs110.box.projwfc.in > AlAs110.box.projwfc.out check_failure $? $ECHO " done" # Projection of the DOS on atomic wavefunctions cat > AlAs110.projwfc.in << EOF &projwfc prefix = 'AlAs110' outdir='$TMP_DIR/', ngauss=0 degauss=0.01 DeltaE=0.02 tdosinboxes=.false. / EOF $ECHO $ECHO " running projected DOS calculation...\c" $PROJWFC_COMMAND < AlAs110.projwfc.in > AlAs110.projwfc.out check_failure $? $ECHO " done" $ECHO $ECHO " summing the atomic PDOS...\c" $SUMPDOS_COMMAND AlAs110.pdos_atm\#10\(Al\)_wfc* > "AlAs110.pdos_atm#10(Al)" 2> /dev/null $SUMPDOS_COMMAND AlAs110.pdos_atm\#11\(As\)_wfc* > "AlAs110.pdos_atm#11(As)" 2> /dev/null $ECHO " done" # # if gnuplot was found, the results are plotted # if [ "$GP_COMMAND" = "" ]; then break else eFermi=`grep "Fermi" AlAs110re.nonscf.out | cut -d \ -f 14` cat > gnuplot.tmp <