#!/bin/csh

# -----------------------------------------------------------------------------
# Set some general parameters
# -----------------------------------------------------------------------------

# Usage
if ( $#argv == 0 ) then
  echo "install.sh [lib|core|goodies|links|all|docu|clean|convert] "
  exit 0
endif

# Set the mode
set mode = $1

# Set path to SVN repository
set svnpath=https://svn.iac.ethz.ch/pub/lagranto.um/

# Set paths for development and for synchronisation (operational)
set path_devel = "${DYN_TOOLS}/lagranto.um/"
set path_sync  = "${DYN_TOOLS}/lagranto/"

# Init Fortran compiler and set netCDF acccordingly
setenv FORTRAN gfortran 

# Init netCDF library depending on the Fortran compiler
if ( "${FORTRAN}" == "pgf90" ) then
  module load netcdf/4.2.1-pgf90
  module list

else if ( "${FORTRAN}" == "gfortran" ) then
  module load gfortran
  module load netcdf/4.2.1

else if ( "${FORTRAN}" == "ifort" ) then
  module load ifort/10.1.017
  module load netcdf/4.1.1-ifort

else
  echo "Fortran Compiler ${FORTRAN} not supported... Exit"
  exit 1

endif

# Set Lagranto path
setenv LAGRANTO ${path_devel}

# -----------------------------------------------------------------------------
# Create a new tag in SVN repository
# -----------------------------------------------------------------------------

if ( "${mode}" == "tag" ) then
   svn info
   if ( "${#argv}" != 2 ) then
     echo "Usage: install.csh tag id <id=tag number>"
   else
     set tagnr = $2
   endif
   svn copy ${svnpath}/trunk ${svnpath}/tags/${tagnr} -m "Release ${tagnr}"
   exit 0
endif

# -----------------------------------------------------------------------------
# Set internal parameters and detailed installation mode
# -----------------------------------------------------------------------------

# Set Lagranto path
setenv LAGRANTO ${path_devel}

# Set netCDF paths
setenv NETCDF_LIB `nc-config --flibs`
setenv NETCDF_INC `nc-config --fflags`

echo $NETCDF_LIB
echo $NETCDF_INC

# Set list of core programs
set core  = "startf caltra trace select density"

# Set list of goodies
set tools = "changecst changet extract gettidiff getvars list2lsl lsl2list mergetra newtime reformat timeres trainfo difference datelist geo2rot rot2geo" 

# Set list of libraries
set libs  = "iotra ioinp inter times libcdfio libcdfplus rotate"

# Core programs
foreach prog ( $core )
   if ( "${prog}" == "${mode}" ) then
      set core  = ${prog}
      set mode  = "core"
   endif
end

# Goodies
foreach tool ( $tools )
   if ( "${tool}" == "${mode}" ) then
      set tools = ${tool}
      set mode  = "goodies"
   endif
end

# Libraries
foreach lib ( $libs )
   if ( "${lib}" == "${mode}" ) then
      set libs  = ${lib}
      set mode  = "lib"
   endif
end

# Check that the mode is ok 
if ( "${mode}" == "all"     ) goto modeok
if ( "${mode}" == "lib"     ) goto modeok
if ( "${mode}" == "core"    ) goto modeok
if ( "${mode}" == "goodies" ) goto modeok
if ( "${mode}" == "links"   ) goto modeok
if ( "${mode}" == "clean"   ) goto modeok
if ( "${mode}" == "docu"    ) goto modeok
if ( "${mode}" == "convert" ) goto modeok
echo "Unsupported mode ${mode} ... Stop"
exit 1

modeok:

# -----------------------------------------------------------------------------
# Make clean 
# -----------------------------------------------------------------------------

if ( "${mode}" == "clean" ) then

cd ${LAGRANTO}/

foreach prog ( $core )
  \rm -f ${prog}/${prog} ${prog}/${prog}.o
end
\rm -f trace/calvar.o select/special.o

foreach tool ( $tools )
  \rm -f goodies/${tool} goodies/${tool}.o 
end
\rm -f goodies/*.mod goodies/*.o

\rm lib/*.a lib/*.o

foreach prog ( $core )
   \rm -f bin/${prog} bin/${prog}.sh  bin/${prog}.um
end
\rm -f bin/seltra bin/seltra.sh bin/seltra.um
foreach tool ( $tools )
  \rm -f bin/${tool} bin/${tool}.sh bin/${tool}.um
end
\rm -f bin/lagrantohelp.sh bin/lagrantohelp.um
\rm -f bin/startf bin/startf.sh bin/startf.um
\rm -f bin/lagranto.sh bin/lagranto.um

exit 0

endif

# -----------------------------------------------------------------------------
# Install reference 
# -----------------------------------------------------------------------------

if ( ("${mode}" == "docu") | ("${mode}" == "all" ) ) then
    
echo "-----------------------------------------------------------------"
echo "Installing documentation"
echo "-----------------------------------------------------------------"
echo

cd ${LAGRANTO}/docu/reference/

\rm -f reference.ps
\rm -f reference2.ps
groff -man ../man/*.0 > reference2.ps
ps2pdf reference2.ps

latex title
dvips title
ps2pdf title.ps

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=reference.pdf title.pdf reference2.pdf

\rm -f *.aux *.log *.dvi
\rm -f title.ps  reference2.ps
\rm -f title.pdf reference2.pdf

endif

if ( "${mode}" == "docu" ) exit 0

# -----------------------------------------------------------------------------
# Install libraries 
# -----------------------------------------------------------------------------

if ( ("${mode}" == "lib") | ("${mode}" == "all" ) ) then

echo "-----------------------------------------------------------------"
echo "Installing libraries"
echo "-----------------------------------------------------------------"
echo

# Change to library directory
cd ${LAGRANTO}/lib

# Loop over all libraries - compile and make library
foreach lib ( $libs )

\rm -f ${lib}.a
\rm -f ${lib}.o
echo ${FORTRAN} -c -O ${lib}.f
${FORTRAN} -c -O ${NETCDF_INC} ${lib}.f
ar r ${lib}.a ${lib}.o
\rm -f ${lib}.l ${lib}.o
ranlib ${lib}.a
if ( ! -f ${lib}.a ) then
  echo "Problem in compiling ${lib} ... Stop"
  exit 1
endif

end

endif

if ( "${mode}" == "lib" ) exit 0

# -----------------------------------------------------------------------------
# Check that libraries are ok
# -----------------------------------------------------------------------------

echo
echo "-----------------------------------------------------------------"
echo "Check that all libraries are available"
echo "-----------------------------------------------------------------"
echo

# Change to library directory
cd ${LAGRANTO}/lib

# Check whether all libraries are available
foreach lib ( $libs )

if ( ! -f ${lib}.a ) then
  echo "Library ${lib} missing... Stop"
  exit 1
else
  ls -l ${lib}.a    
endif

end

# Exit if only libraries shoudl be installed
if ( "${mode}" == "lib" ) exit 0

# -----------------------------------------------------------------------------
# Compile Lagrango core programs
# -----------------------------------------------------------------------------

if ( ("${mode}" == "all" ) | ("${mode}" == "core" ) ) then

echo
echo "-----------------------------------------------------------------"
echo "Installing Lagranto core programs"
echo "-----------------------------------------------------------------"

foreach prog ( $core )

echo
echo "----- $prog"
echo
cd ${LAGRANTO}/${prog}
\rm -f ${prog}.o 
\rm -f ${prog}
if ( "${prog}" == "trace"  ) \rm calvar.o
if ( "${prog}" == "select" ) \rm special.o
\rm -f ${prog}
make -f ${prog}.make
if ( ! -f ${prog} ) then
  echo "Problem in compiling ${prog} ... Stop"
  exit 1
endif

end

endif

if ( "${mode}" == "core" ) exit 0

# -----------------------------------------------------------------------------
# Check that all Lagranto core programs are available
# -----------------------------------------------------------------------------

echo
echo "-----------------------------------------------------------------"
echo "Check that all Lagranto core programs are available"
echo "-----------------------------------------------------------------"
echo

foreach prog ( $core )

  cd ${LAGRANTO}/${prog}
  if ( ! -f ${prog} ) then
    echo "${prog} is missing... Stop"
    exit 1
  else
    ls -l ${prog}    
  endif

end

# Exit if only core programs shoudl be installed
if ( "${mode}" == "core" ) exit 0

# -----------------------------------------------------------------------------
# Compile Lagrango goodies
# -----------------------------------------------------------------------------

if ( ("${mode}" == "all" ) | ("${mode}" == "goodies" ) ) then

echo
echo "-----------------------------------------------------------------"
echo "Installing Lagranto goodies"
echo "-----------------------------------------------------------------"

cd ${LAGRANTO}/goodies

foreach tool ( $tools )

echo
echo "----- ${tool}"
echo
\rm -f ${tool}.o
\rm -f ${tool}
make -f ${tool}.make
if ( ! -f ${tool} ) then
  echo "Problem in compiling ${tool} ... Stop"
  exit 1
endif

end

endif

if ( "${mode}" == "goodies" ) exit 0

# -----------------------------------------------------------------------------
# Check that all Lagranto goodies are available
# -----------------------------------------------------------------------------

echo
echo "-----------------------------------------------------------------"
echo "Check that all Lagranto goodies are available"
echo "-----------------------------------------------------------------"
echo

cd ${LAGRANTO}/goodies

foreach tool ( $tools )

if ( ! -f ${tool} ) then
  echo "${tool} is missing... Stop"
  exit 1
else
  ls -l ${tool} 
endif

end

endif

# Exit if only goodies should be installed
if ( "${mode}" == "goodies" ) exit 0

# -----------------------------------------------------------------------------
# Compile conversion tool
# -----------------------------------------------------------------------------

if ( ("${mode}" == "all" ) | ("${mode}" == "convert" ) ) then

echo
echo "-----------------------------------------------------------------"
echo "Installing Lagranto conversion tool"
echo "-----------------------------------------------------------------"

cd ${LAGRANTO}/convert

foreach tool ( pp2cdf )

echo
echo "----- ${tool}"
echo
\rm -f ${tool}.o
\rm -f ${tool}
make -f ${tool}.make
if ( ! -f ${tool} ) then
  echo "Problem in compiling ${tool} ... Stop"
  exit 1
endif

end

endif

# Exit if only goodies should be installed
if ( "${mode}" == "convert" ) exit 0

# -----------------------------------------------------------------------------
# Check that all Lagranto conversion tool is available
# -----------------------------------------------------------------------------

echo
echo "-----------------------------------------------------------------"
echo "Check that all Lagranto conversion tool is available"
echo "-----------------------------------------------------------------"
echo

cd ${LAGRANTO}/convert

foreach tool ( pp2cdf  )

if ( ! -f ${tool} ) then
  echo "${tool} is missing... Stop"
  exit 1
else
  ls -l ${tool} 
endif

end

endif

# Exit if only conversion tool should be installed
if ( "${mode}" == "convert" ) exit 0

# -----------------------------------------------------------------------------
# Create links to programs
# -----------------------------------------------------------------------------

if ( ("${mode}" == "all" ) | ("${mode}" == "links" )  ) then

echo
echo "-----------------------------------------------------------------"
echo "Create links in ${LAGRANTO}/bin/"
echo "-----------------------------------------------------------------"
echo

cd ${LAGRANTO}/bin

ln -svf ${LAGRANTO}/bin/lagranto            lagranto.sh
ln -svf ${LAGRANTO}/bin/lagranto            lagranto.um  
ln -svf ${LAGRANTO}/bin/lagrantohelp        lagrantohelp.sh
ln -svf ${LAGRANTO}/bin/lagrantohelp        lagrantohelp.um

ln -svf ${LAGRANTO}/caltra/caltra.sh        caltra.sh
ln -svf ${LAGRANTO}/startf/startf.sh        startf.sh
ln -svf ${LAGRANTO}/select/select.sh        select.sh
ln -svf ${LAGRANTO}/trace/trace.sh          trace.sh
ln -svf ${LAGRANTO}/density/density.sh      density.sh

ln -svf ${LAGRANTO}/caltra/caltra.sh        caltra
ln -svf ${LAGRANTO}/startf/startf.sh        startf
ln -svf ${LAGRANTO}/select/select.sh        select
ln -svf ${LAGRANTO}/trace/trace.sh          trace
ln -svf ${LAGRANTO}/density/density.sh      density

ln -svf ${LAGRANTO}/caltra/caltra.sh        caltra.um
ln -svf ${LAGRANTO}/startf/startf.sh        startf.um
ln -svf ${LAGRANTO}/select/select.sh        select.um
ln -svf ${LAGRANTO}/trace/trace.sh          trace.um
ln -svf ${LAGRANTO}/density/density.sh      density.um

foreach tool ( $tools )

ln -svf ${LAGRANTO}/goodies/${tool}.sh     ${tool}.sh 
ln -svf ${LAGRANTO}/goodies/${tool}.sh     ${tool} 
ln -svf ${LAGRANTO}/goodies/${tool}.sh     ${tool}.um

end

# Set extra name for <select> to avoid conflict in BASH
ln -svf ${LAGRANTO}/select/select.sh        seltra
ln -svf ${LAGRANTO}/select/select.sh        seltra.sh
ln -svf ${LAGRANTO}/select/select.sh        seltra.um


endif

# -----------------------------------------------------------------------------
# Synchronise ( development -> operational ) 
# -----------------------------------------------------------------------------

if ( ("${mode}" == "all" ) | ("${mode}" == "sync" )  ) then

echo
echo "-----------------------------------------------------------------"
echo "Sync ( lagranto.um -> lagranto )"
echo "-----------------------------------------------------------------"
echo

cd ${path_sync}/bin/

ln -svf ${path_devel}/bin/lagrantohelp.sh        lagrantohelp.um

ln -svf ${path_devel}/caltra/caltra.sh           caltra.um
ln -svf ${path_devel}/select/select.sh           select.um
ln -svf ${path_devel}/trace/trace.sh             trace.um
ln -svf ${path_devel}/lidar/seltra.sh            seltra.um

foreach tool ( $tools )

ln -svf ${path_devel}/goodies/${tool}.sh      ${tool}.um

end
 
# Set all permissions
chmod -R og+rx ${path_sync}/bin/

endif


# -----------------------------------------------------------------------------
# Final tasks
# -----------------------------------------------------------------------------

echo
echo "-----------------------------------------------------------------"
echo "Installation complete"
echo "-----------------------------------------------------------------"
echo
echo "Please set the environmental variable LAGRANTO"
echo
echo "    setenv LAGRANTO ${LAGRANTO}"
echo
 




