#!/bin/bash
#Name:sumup_dos
#Function: sum up the DOS files split by dos_split according to the selected range
#Usage: sumup_dos [begin] [end] [element_name]
#Author:weibingchen.thu@gmail.com
#License:GPL 3.0
#Version:0.01

#Define format
if [ "$#" -lt "3" ];then
		echo "Usage: sumup_dos [begin] [end] [element_name]"
		echo "   eg. sumup_dos 1 16 Zn"
		echo "   it sums up files from DOS1 to DOS16 and output Zn Zn_s Zn_p Zn_d"
		exit 1
elif [ ! -e "DOS$1" ]||[ ! -e "DOS$2" ];then
		echo "Either DOS$1 or DOS$2 is not found! Check your files."
		exit 1
fi

echo "SUM UP BEGIN!"
begin=$1
end=$2
elementname=$3
echo "DOS$begin to DOS$end will be summed up to generate $elementname files"
orbitname=("s" "p" "d" "f")

#Ispin 
if [ -e "DOS0" ];then
		ISspin=`awk '{print $4}' DOS0` 
		if [ -n "$ISspin" ];then
				ISPIN=2
				echo "Polarized DOS calculation!"
		else 
				ISPIN=1
				echo "NONPolarized DOS calculation!"
		fi
else
		echo 'No DOS0 file! I cannot tell whether it is polarized'
		echo 'Input the ISPIN,1 for nonpolarized and 2 for polarized'
		read -e -p"ISPIN=" ISPIN
		if [ "$ISPIN" -lt "1" ]||[ "$ISPIN" -gt "2" ];then
				echo "Wrong input! Are you kidding me?"
				exit 1
		fi
fi

#Lorbit number
if [ "$ISPIN" -eq "1" ];then
		ISdorbit=`awk '{print $4}' DOS$begin`
		ISforbit=`awk '{print $5}' DOS$begin`
		if [ -z "$ISdorbit" ];then
#这里的orbitnum比实际少1，是因为数组计数的方便
				orbitnum=1
		elif [ -z "$ISforbit" ];then
				orbitnum=2
		else 
				orbitnum=3
		fi
else 
		ISdorbit=`awk '{print $6}' DOS$begin`
		ISforbit=`awk '{print $8}' DOS$begin`
		if [ -z "$ISdorbit" ];then
				orbitnum=1
		elif [ -z "$ISforbit" ];then
				orbitnum=2
		else 
				orbitnum=3
		fi
fi
echo "There is $((orbitnum + 1)) orbits in this element"

#cleanup
for i in `seq 0 $orbitnum`;do
		rm $elementname\_${orbitname[$i]} -rf
done


#Sumup
for filenum in `seq $begin $end`;do
		echo "DOS$filenum is summed up!"
		if [ "$ISPIN" -eq "1" ];then
				for orbitseq in `seq 0 $orbitnum`;do
					    orbit=${orbitname[$orbitseq]}
						row=$((orbitseq + 2))
						awk '{if (NR > 1)printf "%12.5f %12.5f\n",$1,$v1}' v1=$row DOS$filenum > tmp_$orbit
						if [ -e "$elementname"_"$orbit" ];then
								join $elementname\_$orbit tmp_$orbit > tmp2_$orbit
								awk '{printf "%12.5f %12.5f\n",$1,$2+$3}' tmp2_$orbit >$elementname\_$orbit 
#								awk '{print $1,$2+$3}' tmp2_$orbit >$elementname\_$orbit 
						 else
								mv tmp_$orbit $elementname\_$orbit
						fi
				done
		else 
				for orbitseq in `seq 0 $orbitnum`;do
					    orbit=${orbitname[$orbitseq]}
						row=$((2 * orbitseq + 2))
						nrow=$((row + 1))
						awk '{if (NR > 1)printf "%12.5f %12.5f %12.5f\n",$1,$v1,$v2}' v1=$row v2=$nrow DOS$filenum > tmp_$orbit
						if [ -e "$elementname"_"$orbit" ];then
								join $elementname\_$orbit tmp_$orbit > tmp2_$orbit
								awk '{printf "%12.5f %12.5f %12.5f\n",$1,$2+$4,$3+$5}' tmp2_$orbit >$elementname\_$orbit 
						 else
								mv tmp_$orbit $elementname\_$orbit
						fi
				done
		fi
done

#Merge files
rm $elementname
for i in `seq 0 $orbitnum`;do
		echo "$elementname"_"${orbitname[$i]} is done!"
		if [ -e $elementname ];then
				join $elementname $elementname\_${orbitname[$i]} > tmp3 
				mv tmp3 $elementname
		else
				cp $elementname\_${orbitname[$i]} $elementname
		fi
done

rm tmp_* tmp2_* tmp3 -rf
exit 0
