#!/bin/sh

MSI2LMP_LIBRARY=../frc_files
VALGRIND='valgrind -v --track-origins=yes --show-reachable=yes --leak-check=full'
MSI2LMP=../src/msi2lmp.exe
LAMMPS=../../../src/lmp_serial
CHECKDATA=./data-compare.pl

if [ ! -x $MSI2LMP ]
then
   echo "No executable $MSI2LMP"
   exit 1
fi

if [ ! -d $MSI2LMP_LIBRARY ]
then
   echo "No directory $MSI2LMP_LIBRARY"
   exit 1
fi

if [ ! -x $LAMMPS ]
then
   echo "No executable $LAMMPS"
   exit 1
fi

verbose=1
counter=0
errors=0

# Class1 tests with cvff
for m in hydrogen water h2-h2o ethane benzene naphthalene crambin nylon phen3_cff97 hap_crystal
do \
    before=$errors
    vglog=${m}-class1.chk
    ${VALGRIND} --log-file=${vglog}				\
        ${MSI2LMP} ${m}-class1 -c 1 -p ${verbose}		\
        || errors=$(expr $errors + 1)
    ${LAMMPS} -log none -screen none -in in.${m}-class1		\
        || errors=$(expr $errors + 1)
    ${CHECKDATA} ${m}-class1.data reference/${m}-class1.data	\
        || errors=$(expr $errors + 1)
    ${CHECKDATA} ${m}-class1.data2 reference/${m}-class1.data2	\
        || errors=$(expr $errors + 1)
    [ $before -eq $errors ] && rm ${m}-class1.data ${m}-class1.data2 log.${m}-class1
    leak=$(awk '/in use at exit:/ {num=$6;} END {print num;}' $vglog)
    [ $leak != 0 ] && echo "Memory still used: $leak"		\
        && errors=$(expr $errors + 1)
    viol=$(awk '/ERROR SUMMARY/ {num=$4;} END {print num;}' $vglog)
    [ $viol != 0 ] && echo "Valgrind errors: $viol"		\
        && errors=$(expr $errors + 1)
    [ $leak = 0 ] && [ $viol = 0 ] && rm ${vglog}
    counter=$(expr $counter + 6)
done

# Class1 tests with clayff
for m in PyAC_bulk
do \
    before=$errors
    vglog=${m}-clayff.chk
    ${VALGRIND} --log-file=${vglog}				\
        ${MSI2LMP} ${m}-clayff -c 1 -p ${verbose} -f clayff -n	\
        || errors=$(expr $errors + 1)
    ${LAMMPS} -log none -screen none -in in.${m}-clayff		\
        || errors=$(expr $errors + 1)
    ${CHECKDATA} ${m}-clayff.data reference/${m}-clayff.data	\
        || errors=$(expr $errors + 1)
    ${CHECKDATA} ${m}-clayff.data2 reference/${m}-clayff.data2	\
        || errors=$(expr $errors + 1)
    [ $before -eq $errors ] && rm ${m}-clayff.data ${m}-clayff.data2 log.${m}-clayff
    leak=$(awk '/in use at exit:/ {num=$6;} END {print num;}' $vglog)
    [ $leak != 0 ] && echo "Memory still used: $leak"		\
        && errors=$(expr $errors + 1)
    viol=$(awk '/ERROR SUMMARY/ {num=$4;} END {print num;}' $vglog)
    [ $viol != 0 ] && echo "Valgrind errors: $viol"		\
        && errors=$(expr $errors + 1)
    [ $leak = 0 ] && [ $viol = 0 ] && rm ${vglog}
    counter=$(expr $counter + 6)
done

# OPLS-AA tests 
for m in ethane
do \
    before=$errors
    vglog=${m}-oplsaa.chk
    ${VALGRIND} --log-file=${vglog}				\
        ${MSI2LMP} ${m}-oplsaa -c 0 -p ${verbose} -f oplsaa -n	\
        || errors=$(expr $errors + 1)
    ${LAMMPS} -log none -screen none -in in.${m}-oplsaa		\
        || errors=$(expr $errors + 1)
    ${CHECKDATA} ${m}-oplsaa.data reference/${m}-oplsaa.data	\
        || errors=$(expr $errors + 1)
    ${CHECKDATA} ${m}-oplsaa.data2 reference/${m}-oplsaa.data2	\
        || errors=$(expr $errors + 1)
    [ $before -eq $errors ] && rm ${m}-oplsaa.data ${m}-oplsaa.data2 log.${m}-oplsaa
    leak=$(awk '/in use at exit:/ {num=$6;} END {print num;}' $vglog)
    [ $leak != 0 ] && echo "Memory still used: $leak"		\
        && errors=$(expr $errors + 1)
    viol=$(awk '/ERROR SUMMARY/ {num=$4;} END {print num;}' $vglog)
    [ $viol != 0 ] && echo "Valgrind errors: $viol"		\
        && errors=$(expr $errors + 1)
    [ $leak = 0 ] && [ $viol = 0 ] && rm ${vglog}
    counter=$(expr $counter + 6)
done

# Class2 tests with compass
for m in hydrogen ethane benzene naphthalene
do \
    before=$errors
    vglog=${m}-class2a.chk
    ${VALGRIND} --log-file=${vglog}				\
        ${MSI2LMP} ${m}-class2a -c 2 -p ${verbose} -f compass_published	\
        || errors=$(expr $errors + 1)
    ${LAMMPS} -log none -screen none -in in.${m}-class2a		\
        || errors=$(expr $errors + 1)
    ${CHECKDATA} ${m}-class2a.data reference/${m}-class2a.data		\
        || errors=$(expr $errors + 1)
    ${CHECKDATA} ${m}-class2a.data2 reference/${m}-class2a.data2	\
        || errors=$(expr $errors + 1)
    [ $before -eq $errors ] && rm ${m}-class2a.data ${m}-class2a.data2 log.${m}-class2a
    leak=$(awk '/in use at exit:/ {num=$6;} END {print num;}' $vglog)
    [ $leak != 0 ] && echo "Memory still used: $leak"		\
        && errors=$(expr $errors + 1)
    viol=$(awk '/ERROR SUMMARY/ {num=$4;} END {print num;}' $vglog)
    [ $viol != 0 ] && echo "Valgrind errors: $viol"		\
        && errors=$(expr $errors + 1)
    [ $leak = 0 ] && [ $viol = 0 ] && rm ${vglog}
    counter=$(expr $counter + 6)
done

# Class2 tests with pcff
for m in water h2-h2o ethane benzene naphthalene hap_crystal
do \
    before=$errors
    vglog=${m}-class2b.chk
    ${VALGRIND} --log-file=${vglog}				\
        ${MSI2LMP} ${m}-class2b -c 2 -p ${verbose} -f pcff	\
        || errors=$(expr $errors + 1)
    ${LAMMPS} -log none -screen none -in in.${m}-class2b		\
        || errors=$(expr $errors + 1)
    ${CHECKDATA} ${m}-class2b.data reference/${m}-class2b.data		\
        || errors=$(expr $errors + 1)
    ${CHECKDATA} ${m}-class2b.data2 reference/${m}-class2b.data2	\
        || errors=$(expr $errors + 1)
    [ $before -eq $errors ] && rm ${m}-class2b.data ${m}-class2b.data2 log.${m}-class2b
    leak=$(awk '/in use at exit:/ {num=$6;} END {print num;}' $vglog)
    [ $leak != 0 ] && echo "Memory still used: $leak"		\
        && errors=$(expr $errors + 1)
    viol=$(awk '/ERROR SUMMARY/ {num=$4;} END {print num;}' $vglog)
    [ $viol != 0 ] && echo "Valgrind errors: $viol"		\
        && errors=$(expr $errors + 1)
    [ $leak = 0 ] && [ $viol = 0 ] && rm ${vglog}
    counter=$(expr $counter + 6)
done

echo "Total error count: $errors / $counter"
echo

