#!/bin/bash

if [ $# -lt 4 ]; then
  echo 'gencell <volume> <units> n x [<species> <number>]'
  exit 1
fi

if [ -z "${PSPOT_DIR}" ]; then
PSPOT_DIR=~/pspot
fi

numspecies=`echo "($#-2)/2" | bc`

seedname=`for i in ${*:2}
do
if [ $i != "1" ]; then
echo -n $i
fi
done`
length=`echo "scale=6;e(l($1)/3.0)" | bc -l`

# Prepare the cell file

echo '%BLOCK LATTICE_CART' > $seedname.cell
echo $length 0 0 >> $seedname.cell
echo 0 $length 0 >> $seedname.cell
echo 0 0 $length >> $seedname.cell
echo '%ENDBLOCK LATTICE_CART' >> $seedname.cell
echo ' ' >> $seedname.cell
echo '#VARVOL='$1 >> $seedname.cell
echo ' ' >> $seedname.cell
echo '%BLOCK POSITIONS_FRAC' >> $seedname.cell
for (( i = 1; i <= $numspecies; i++ ))  
  do
    num=0
    for (( j = 1; j <= $2; j++ ))  
    do
	for (( k = 1; k <= ${*:$[2*($i-1)+4]:1}; k++ ))  
	do
	    num=$[$num+1]
	    
	    echo ${*:$[2*($i-1)+3]:1}' 0.0 0.0 0.0 # '${*:$[2*($i-1)+3]:1}$num' % NUM=1' >> $seedname.cell
	    
	done
    done
done
echo '%ENDBLOCK POSITIONS_FRAC' >> $seedname.cell
echo ' ' >> $seedname.cell
echo -n '##SPECIES='  >> $seedname.cell
for (( i = 1; i <= $numspecies; i++ ))
do
    species=${*:$[2*($i-1)+3]:1}
    echo -n $species >> $seedname.cell
    if [[ $i < $numspecies ]]; then
	echo -n ',' >> $seedname.cell
    else
	echo >> $seedname.cell
    fi
done
echo '##NATOM=3-9'  >> $seedname.cell
echo '##FOCUS='$numspecies  >> $seedname.cell
echo ' ' >> $seedname.cell
echo '#SYMMOPS=2-4' >> $seedname.cell
echo '##SGRANK=20' >> $seedname.cell
echo '#NFORM=1' >> $seedname.cell
echo '##ADJGEN=0-1' >> $seedname.cell
echo '##SLACK=0.25' >> $seedname.cell
echo '##OVERLAP=0.1' >> $seedname.cell
echo '#MINSEP=1-3 AUTO' >> $seedname.cell
echo '#COMPACT' >> $seedname.cell
echo '#CELLADAPT' >> $seedname.cell
echo '##SYSTEM={Rhom,Tric,Mono,Cubi,Hexa,Orth,Tetra}' >> $seedname.cell
echo ' ' >> $seedname.cell
echo 'KPOINTS_MP_SPACING 0.07' >> $seedname.cell
echo ' ' >> $seedname.cell
echo 'SYMMETRY_GENERATE' >> $seedname.cell
echo 'SNAP_TO_SYMMETRY' >> $seedname.cell
echo ' ' >> $seedname.cell
echo '%BLOCK SPECIES_POT' >> $seedname.cell
maxcut=0
for (( i = 1; i <= $numspecies; i++ ))  
do
    species=${*:$[2*($i-1)+3]:1}
    if [[ -e $PSPOT_DIR/"$species"_00PBE.usp ]]; then
	newcut=`grep FINE $PSPOT_DIR/"$species"_00PBE.usp | head -1 | awk '{print $1}'`
	if [[ $newcut > $maxcut ]]; then
	    let maxcut=$newcut
	fi
	echo $species $PSPOT_DIR/"$species"_00PBE.usp  >> $seedname.cell
    else
	if [[ -e $PSPOT_DIR/"$species"_00PW91.usp ]]; then
	    newcut=`grep FINE $PSPOT_DIR/"$species"_00PW91.usp | head -1 | awk '{print $1}'`
	    if [[ $newcut > $maxcut ]]; then
		let maxcut=$newcut
	    fi
	    echo $species $PSPOT_DIR/"$species"_00PW91.usp  >> $seedname.cell
	else
	    if [[ -e $PSPOT_DIR/"$species"_00.usp ]]; then
		newcut=`grep FINE $PSPOT_DIR/"$species"_00.usp | head -1 | awk '{print $1}'`
		if [[ $newcut > $maxcut ]]; then
		    let maxcut=$newcut
		fi
		echo $species $PSPOT_DIR/"$species"_00.usp  >> $seedname.cell
	    else	    
		echo Pseudopotential not found - using OTFG, set cut_off_energy manually
	    fi
	fi
    fi
done
echo '%ENDBLOCK SPECIES_POT' >> $seedname.cell
echo ' ' >> $seedname.cell
echo '%BLOCK EXTERNAL_PRESSURE' >> $seedname.cell
echo '0 0 0' >> $seedname.cell
echo '0 0' >> $seedname.cell
echo '0' >> $seedname.cell
echo '%ENDBLOCK EXTERNAL_PRESSURE' >> $seedname.cell

# Prepare the param file

echo 'task                 : geometryoptimization ' > $seedname.param
echo 'xc_functional        : PBE ' >> $seedname.param
echo 'spin_polarized       : false ' >> $seedname.param
echo 'fix_occupancy        : false ' >> $seedname.param
echo 'metals_method        : dm ' >> $seedname.param
echo 'mixing_scheme        : pulay ' >> $seedname.param
echo 'max_scf_cycles       : 1000 ' >> $seedname.param
echo 'cut_off_energy       : '$maxcut' eV' >> $seedname.param
echo 'opt_strategy         : speed ' >> $seedname.param
echo 'page_wvfns           : 0 ' >> $seedname.param
echo 'num_dump_cycles      : 0 ' >> $seedname.param
echo 'backup_interval      : 0 ' >> $seedname.param
echo 'geom_method          : LBFGS ' >> $seedname.param
echo 'geom_max_iter        : 20 ' >> $seedname.param
echo 'mix_history_length   : 20 ' >> $seedname.param
echo 'finite_basis_corr    : 0' >> $seedname.param
echo 'fixed_npw            : true' >> $seedname.param
echo 'write_cell_structure : true' >> $seedname.param
echo 'write_checkpoint     : none' >> $seedname.param
echo 'write_bib            : false' >> $seedname.param
echo 'write_otfg           : false' >> $seedname.param
echo 'write_cst_esp        : false # Requires Castep 17 and above' >> $seedname.param
echo 'write_bands          : false # Requires Castep 17 and above' >> $seedname.param
echo 'write_geom           : false # Requires Castep 17 and above' >> $seedname.param
echo 'bs_write_eigenvalues : false' >> $seedname.param
echo 'calculate_stress     : true' >> $seedname.param

exit 0
