#!/bin/ksh

echo "Running $TEST on $COMPILER_NAME"

# Set up environment variables
export ROPP_ROOT=$DIRECTORY/ropp_deps
export BUFR_LIBRARY=$ROPP_ROOT/data/bufr/
export BUFR_TABLES=$ROPP_ROOT/data/bufr/

# Location of executables (must already be compiled)
export BIN_DIR=$ROPP_ROOT/$COMPILER_NAME/bin

# Create temporary directory for output data
export TMP_DIR=$DIRECTORY/ropp_test_tmp_$TEST
mkdir -p $TMP_DIR
cd $TMP_DIR

# Define source directories for both local and HPC runs
if [ $COMPILER_NAME = ifort ] ; then
  export DATA_SOURCE1=${SPICE_SRV}:$DATA_SOURCE  # test data
  export DATA_SOURCE2=$DIRECTORY/ropp_io/data  # thinning files
else
  export DATA_SOURCE1=$DATA_SOURCE  # test data
  export DATA_SOURCE2=$DIRECTORY/ropp_io/data  # thinning files
fi

# Accumulate any errors with this variable
error_code=0

# IO options
set -A options  'lin-247'  'sglin-247'  'sglog-247'  'asglog-247'
n_opts=${#options[*]}

case $TEST in

    io_01 )
        filet=MT-IO-01.1.nc

        echo "$BIN_DIR/test2ropp  MISSING  -n 100  -o ${filet}_MISSING"
        $BIN_DIR/test2ropp  MISSING  -n 100  -o ${filet}_MISSING
        RC=$? ; echo "Return code = $RC" ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi

        echo "$BIN_DIR/ropp2ropp  -u  ${filet}_MISSING  -o $(echo $filet |sed -es/'1.nc'/'2.nc'/)"
        $BIN_DIR/ropp2ropp  -u  ${filet}_MISSING  -o $(echo $filet |sed -es/'1.nc'/'2.nc'/)
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi

        echo "$BIN_DIR/test2ropp  INVALID  -n 100  -o ${filet}_INVALID"
        $BIN_DIR/test2ropp  INVALID  -n 100  -o ${filet}_INVALID
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi

        echo "$BIN_DIR/ropp2ropp  -u  ${filet}_INVALID  -o $(echo $filet |sed -es/'1.nc'/'3.nc'/)"
        $BIN_DIR/ropp2ropp  -u  ${filet}_INVALID  -o $(echo $filet |sed -es/'1.nc'/'3.nc'/)
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi
# Compare MT-IO-01.2.nc and MT-IO-01.3.nc

        echo "$BIN_DIR/test2ropp  VALID  -n 100  -o ${filet}"
        $BIN_DIR/test2ropp  VALID  -n 100  -o ${filet}
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi

        echo "$BIN_DIR/ropp2ropp  -u  ${filet}          -o $(echo $filet |sed -es/'1.nc'/'2.nc'/)"
        $BIN_DIR/ropp2ropp  -u  ${filet}          -o $(echo $filet |sed -es/'1.nc'/'2.nc'/)
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi
# Compare MT-IO-01.1.nc and MT-IO-01.2.nc

        echo "$BIN_DIR/ropp2ropp  -u  ${filet}          -o $(echo $filet |sed -es/'1.nc'/'5.nc'/)"
        $BIN_DIR/ropp2ropp  -u  ${filet}          -o $(echo $filet |sed -es/'1.nc'/'5.nc'/)
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi

        echo "$BIN_DIR/ropp2bufr  -u  $(echo $filet |sed -es/'1.nc'/'5.nc'/)  -o $(echo $filet |sed -es/'1.nc'/'1.bufr'/)"
        $BIN_DIR/ropp2bufr  -u  $(echo $filet |sed -es/'1.nc'/'5.nc'/)  -o $(echo $filet |sed -es/'1.nc'/'1.bufr'/)
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi

        echo "$BIN_DIR/bufr2ropp  -u  $(echo $filet |sed -es/'1.nc'/'1.bufr'/)  -o $(echo $filet |sed -es/'1.nc'/'4.nc'/)"
        $BIN_DIR/bufr2ropp  -u  $(echo $filet |sed -es/'1.nc'/'1.bufr'/)  -o $(echo $filet |sed -es/'1.nc'/'4.nc'/)
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi

        echo "$BIN_DIR/ropp2bufr  -u  $(echo $filet |sed -es/'1.nc'/'4.nc'/)  -o $(echo $filet |sed -es/'1.nc'/'1.bufr'/)"
        $BIN_DIR/ropp2bufr  -u  $(echo $filet |sed -es/'1.nc'/'4.nc'/)  -o $(echo $filet |sed -es/'1.nc'/'1.bufr'/)
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi

        echo "$BIN_DIR/bufr2ropp  -u  $(echo $filet |sed -es/'1.nc'/'1.bufr'/)  -o $(echo $filet |sed -es/'1.nc'/'3.nc'/)"
        $BIN_DIR/bufr2ropp  -u  $(echo $filet |sed -es/'1.nc'/'1.bufr'/)  -o $(echo $filet |sed -es/'1.nc'/'3.nc'/)
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi
# Compare MT-IO-01.4.nc and MT-IO-01.3.nc

        testf=MT-IO-01.nc
        echo "scp $DATA_SOURCE1/$testf $TMP_DIR/$filet"
              scp $DATA_SOURCE1/$testf $TMP_DIR/$filet

        echo "$BIN_DIR/ropp2ropp  -u  ${filet}          -o $(echo $filet |sed -es/'1.nc'/'3.nc'/)"
        $BIN_DIR/ropp2ropp  -u  ${filet}          -o $(echo $filet |sed -es/'1.nc'/'3.nc'/)
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi
# Compare MT-IO-01.1.nc and MT-IO-01.3.nc

        echo " Error code after running $TEST = $error_code"
    ;;

    io_02 )
        filet=MT-IO-02.nc
        filet1=MT-IO-02.3.nc
        filet2=MT-IO-02.4.nc
        echo "scp $DATA_SOURCE1/$filet $TMP_DIR/$filet1"
              scp $DATA_SOURCE1/$filet $TMP_DIR/$filet1

# Manually alter some variables with units of metres to km
        set -A vars undulation roc phase_L1 impact alt_refrac tph_bangle pblh_refrac
        for i in $(seq 1 ${#vars[*]}) ; do
          var=${vars[$(($i - 1))]}
          echo "Manually adjusting $var in $filet1"
          ncatted -a 'units',${var},o,c,'km' $filet1
          ncap2 -s"${var}/=1000.0; ${var}@valid_range/=1000.0; ${var}@units=${var}@units; ${var}@long_name=${var}@long_name" $filet1 -O temp.nc
          mv temp.nc $filet1
        done
# Manually alter some variables with units of metres to km
        set -A vars r_coc r_leo_ref r_gns
        for i in $(seq 1 ${#vars[*]}) ; do
          var=${vars[$(($i - 1))]}
          echo "Manually adjusting $var in $filet1"
          ncatted -a 'units',${var},o,c,'km' $filet1
          ncap2 -s"${var}/=1000.0; ${var}@valid_range/=1000.0; ${var}@units=${var}@units; ${var}@long_name=${var}@long_name; ${var}@reference_frame=${var}@reference_frame" $filet1 -O temp.nc
          mv temp.nc $filet1
        done
# Manually alter some variables with units of geopotential metres to gpkm
        set -A vars geop tph_temp_lrt pblh_temp
        for i in $(seq 1 ${#vars[*]}) ; do
          var=${vars[$(($i - 1))]}
          echo "Manually adjusting $var in $filet1"
          ncatted -a 'units',${var},o,c,'gpkm' $filet1
          ncap2 -s"${var}/=1000.0; ${var}@valid_range/=1000.0; ${var}@units=${var}@units; ${var}@long_name=${var}@long_name" $filet1 -O temp.nc
          mv temp.nc $filet1
        done
# Manually alter some variables with units of degrees_east to degrees_west
        set -A vars lon lon_tp
        for i in $(seq 1 ${#vars[*]}) ; do
          var=${vars[$(($i - 1))]}
          echo "Manually adjusting $var in $filet1"
          ncatted -a 'units',${var},o,c,'degrees_west' $filet1
          ncap2 -s"${var}/=-1.0; ${var}@valid_range/=-1.0; ${var}@units=${var}@units; ${var}@long_name=${var}@long_name" $filet1 -O temp.nc
          mv temp.nc $filet1
        done
# Manually alter some variables with units of degrees_north, degrees_T or degrees to radians
        set -A vars lat azimuth lat_tp azimuth_tp
        for i in $(seq 1 ${#vars[*]}) ; do
          var=${vars[$(($i - 1))]}
          echo "Manually adjusting $var in $filet1"
          ncatted -a 'units',${var},o,c,'radians' $filet1
          ncap2 -s"${var}/=(180.0d/3.141592653589793238d); ${var}@valid_range/=(180.0d/3.141592653589793238d); ${var}@units=${var}@units; ${var}@long_name=${var}@long_name" $filet1 -O temp.nc
          mv temp.nc $filet1
        done
# Manually alter some variables with units of hPa to pascals
        set -A vars press level_coeff_a
        for i in $(seq 1 ${#vars[*]}) ; do
          var=${vars[$(($i - 1))]}
          echo "Manually adjusting $var in $filet1"
          ncatted -a 'units',${var},o,c,'pascals' $filet1
          ncap2 -s"${var}*=100.0; ${var}@valid_range*=100.0; ${var}@units=${var}@units; ${var}@long_name=${var}@long_name" $filet1 -O temp.nc
          mv temp.nc $filet1
        done
# Manually alter some variables with units of kelvin to degC
        set -A vars dry_temp temp tpt_tdry_lrt pblt_tdry
        for i in $(seq 1 ${#vars[*]}) ; do
          var=${vars[$(($i - 1))]}
          echo "Manually adjusting $var in $filet1"
          ncatted -a 'units',${var},o,c,'degC' $filet1
          ncap2 -s"${var}-=273.15; ${var}@valid_range-=273.15; ${var}@units=${var}@units; ${var}@long_name=${var}@long_name" $filet1 -O temp.nc
          mv temp.nc $filet1
        done
# Manually alter some variables with units of gram / kilogram to gram / gram
        set -A vars shum pblq_shum
        for i in $(seq 1 ${#vars[*]}) ; do
          var=${vars[$(($i - 1))]}
          echo "Manually adjusting $var in $filet1"
          ncatted -a 'units',${var},o,c,'gram / gram' $filet1
          ncap2 -s"${var}/=1000.0; ${var}@valid_range/=1000.0; ${var}@units=${var}@units; ${var}@long_name=${var}@long_name" $filet1 -O temp.nc
          mv temp.nc $filet1
        done
# Manually alter some variables with units of metres / seconds to km / hour
        set -A vars v_leo_ref v_gns
        for i in $(seq 1 ${#vars[*]}) ; do
          var=${vars[$(($i - 1))]}
          echo "Manually adjusting $var in $filet1"
          ncatted -a 'units',${var},o,c,'km / hour' $filet1
          ncap2 -s"${var}*=3.6; ${var}@valid_range*=3.6; ${var}@units=${var}@units; ${var}@long_name=${var}@long_name; ${var}@reference_frame=${var}@reference_frame" $filet1 -O temp.nc
          mv temp.nc $filet1
        done
# Manually alter some variables with units of hours to seconds
        set -A vars hour
        for i in $(seq 1 ${#vars[*]}) ; do
          var=${vars[$(($i - 1))]}
          echo "Manually adjusting $var in $filet1"
          ncatted -a 'units',${var},o,c,'seconds' $filet1
          ncap2 -s"${var}*=3600.0; ${var}@valid_range*=3600.0; ${var}@units=${var}@units; ${var}@long_name=${var}@long_name" $filet1 -O temp.nc
          mv temp.nc $filet1
        done
# Manually alter some variables with units of minutes to seconds
        set -A vars minute
        for i in $(seq 1 ${#vars[*]}) ; do
          var=${vars[$(($i - 1))]}
          echo "Manually adjusting $var in $filet1"
          ncatted -a 'units',${var},o,c,'seconds' $filet1
          ncap2 -s"${var}*=60.0; ${var}@valid_range*=60.0; ${var}@units=${var}@units; ${var}@long_name=${var}@long_name" $filet1 -O temp.nc
          mv temp.nc $filet1
        done

        echo "$BIN_DIR/ropp2ropp  -d  -u  -m  ${filet1}  -o ${filet2}"
        $BIN_DIR/ropp2ropp  -d  -u  -m  ${filet1}  -o ${filet2}
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi
# Compare MT-IO-02.nc and MT-IO-02.4.nc

        echo " Error code after running $TEST = $error_code"
    ;;

    io_03 )
        exec=$BIN_DIR/ropp2ropp
        ifile=MT-IO-03.nc
        echo "scp $DATA_SOURCE1/$ifile $TMP_DIR"
              scp $DATA_SOURCE1/$ifile $TMP_DIR

        for i in $(seq 1 $n_opts) ; do
          opt=${options[$(($i - 1))]}
          echo " Thinning option ${i}: ${opt}"
          ofile=$(echo $ifile | sed -es/".nc"/".${i}.nc"/)
          thin_file=ropp_thin_${opt}.dat
          echo "scp $DATA_SOURCE2/$thin_file $TMP_DIR"
                scp $DATA_SOURCE2/$thin_file $TMP_DIR

          echo "$exec  $ifile  -p $thin_file  -m  -a  -o $ofile"
          $exec  $ifile  -p $thin_file  -m  -a  -o $ofile
          RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi
        done

        echo " Error code after running $TEST = $error_code"
    ;;

    io_04 )
        exec=$BIN_DIR/ucar2ropp
        ifile=MT-IO-04.nc
        ofile=MT-IO-04.1.nc
        echo "scp $DATA_SOURCE1/$ifile $TMP_DIR"
              scp $DATA_SOURCE1/$ifile $TMP_DIR

        echo "$exec  $ifile  -d  -o $ofile"
        $exec  $ifile  -d  -o $ofile
        RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi

        echo " Error code after running $TEST = $error_code"
    ;;

    io_05 )
        exec=$BIN_DIR/gfz2ropp

        idir=MT-IO-05/NRT
        echo "scp $DATA_SOURCE1/$idir/*.dat $TMP_DIR"
              scp $DATA_SOURCE1/$idir/*.dat $TMP_DIR
        echo "scp $DATA_SOURCE1/$idir/*.dsc $TMP_DIR"
              scp $DATA_SOURCE1/$idir/*.dsc $TMP_DIR

        for ifile in $(ls ??-AI-*.dat) ; do
          echo "Processing $ifile"
          ofile=$(echo $ifile |sed -es/'.dat'/'.nc'/)

          echo "$exec  $ifile  -o $ofile"
          $exec  $ifile  -o $ofile
          RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi
        done
        echo " Error code after running $TEST = $error_code"

        idir=MT-IO-05/PD
        echo "scp $DATA_SOURCE1/$idir/*.dat $TMP_DIR"
              scp $DATA_SOURCE1/$idir/*.dat $TMP_DIR
        echo "scp $DATA_SOURCE1/$idir/*.dsc $TMP_DIR"
              scp $DATA_SOURCE1/$idir/*.dsc $TMP_DIR

        for ifile in $(ls ??-AI-*.dat) ; do
          echo "Processing $ifile"
          ofile=$(echo $ifile |sed -es/'.dat'/'.nc'/)

          echo "$exec  $ifile  -o $ofile"
          $exec  $ifile  -o $ofile
          RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi
        done

        echo " Error code after running $TEST = $error_code"
    ;;

    io_op )
        exec=$BIN_DIR/ropp2ropp
        ifile=MT-IO-OP.nc
        echo "scp $DATA_SOURCE1/$ifile $TMP_DIR"
              scp $DATA_SOURCE1/$ifile $TMP_DIR

        for i in $(seq 1 $n_opts) ; do
          opt=${options[$(($i - 1))]}
          echo " Thinning option ${i}: ${opt}"
          ofile=$(echo $ifile | sed -es/".nc"/".${i}.nc"/)
          thin_file=ropp_thin_${opt}.dat
          echo "scp $DATA_SOURCE2/$thin_file $TMP_DIR"
                scp $DATA_SOURCE2/$thin_file $TMP_DIR

          echo "$exec  $ifile  -p $thin_file  -m  -a  -o $ofile"
          $exec  $ifile  -p $thin_file  -m  -a  -o $ofile
          RC=$? ; echo "Return code = $RC" ; if [ $RC -gt 1 ] ; then ; error_code=$(($error_code+$RC)) ; fi
        done

        echo " Error code after running $TEST = $error_code"
    ;;

esac


if [ $error_code -gt 0 ]
   then echo "Errors encountered"
   exit $error_code
else
   exit 0
fi
