#! /bin/ksh
#
cclargs 0$                                "[CALCULE LA COVARIANCE]"  \
              -exp      "pri36_pres"      "[Prefixe commun aux fichiers de donnees]"\
              -rep      "." ",,,,"        "[Repertoire contenant ces donnees]"\
              -outnam   ""  ",,,,"        "[Output file prefix]"\
              -nom1+    "VV WW"           "[Premiere liste de noms des variables a traiter]"\
              -nom2+    "UU VV TT GZ HU"  "[Seconde liste de noms des variables a traiter]"\
              -moyenne  ",,,,"            "[Nom du fichier contenant les moyennes simples]"\
              -date+     NON OUI          "[Ibuf(2) contient une date et non un pas de temps]"\
              -tri+      OUI NON          "[Trier les fichiers de donnees RND avec FSTTRI]"\
              -zoncal+   OUI NON          "[Calcul des moyennes zonale en sus]"\
              -rlats     120 120          "[Nombre de latitudes dans les coupes zonales de grilles de type Z]"\
              -joinup+   OUI NON          "[Faire le calcul de tous les pas de temps en meme temp]"\
              -travail  "." ",,,,"        "[Repertoire ou on cree le repertoire de travail]"\
              -debug+    NON OUI          "[Activer le mode DEBUG]"\
              -do_diag+  OUI NON          "[On fait les diagnostiques en mode DEBUG]"\
              -rndout+   NON NON          "[Parametre obsolete]"\
              ++ $* > ${BIG_TMPDIR}/cclargs_make_covar.out$$
#
. ${BIG_TMPDIR}/cclargs_make_covar.out$$ && /bin/rm -f ${BIG_TMPDIR}/cclargs_make_covar.out$$
#
######################################################################
#
# Description...
#    Cette script calcule les covariances temporelles des variables
#    contenues dans une serie de fichiers. Ces derniers sont tous
#    presents dans un meme repertoire. Les variables a etre
#    traitees sont specifiees en argument. On suppose que
#    les moyennes ont deja ete calculees.
#
######################################################################
#
# Auteurs...
#    Michel Roch et Bernard Dugas
#
######################################################################
#
# Revisions...
#    001 - octobre   1997: version initiale
#    002 - juillet   1998: ajouter le parametre rep
#    003 - decembre  1998: ajouter le mode debug
#    004 - decembre  1998: ajouter le parametre outnam
#    005 - mai       1999: utiliser BIG_TMPDIR
#    006 - juillet   1999: mettre une sortie dans la premiere boucle
#    007 - aout      1999: ajouter l'option TRI
#    008 - octobre   1999: ajouter le mode de fonctionnement JOINUP
#    009 - fevrier   2000: ajouter le support du parametre DATE
#    010 - septembre 2000: quitter en cas d'erreur prealable
#    011 - decembre  2000: utiliser la variable $EDITFST
#    012 - mars      2002: ajouter la cle do_diag
#    013 - aout      2002: utiliser r.diag2000 et editfst2000 par defaut
#    014 - mai       2003: modifier l'appel a cclargs
#    016 - septembre 2004: change counting of files (arg list too long) (KW)
#    017 - novembre  2004: ajouter le parametre "rlats" et
#                          changer la sequence d'appel de tr (BD)
#    018 - fevrier   2005: En mode joinup=OUI...
#                          1) modifier la creation des fichiers de variables
#                          2) ne pas calculer les variances si on le peut
#                          3) ne pas calculer XXYY si on a deja YYXX
#                          4) change selection from editfst to rdiag (KW)
#    019 - avril     2005: rndout est maintenant declare obsolete
#    020 - janvier   2006: 1) utiliser Climat_functions (BD)
#                          2) faire un appel a Climat_check_rdiag (BD)
#    021 - fevrier   2006: verifier l'existence de preclimdiagpr (BD)
#
######################################################################
#
# Parametres...
# exp     - prefixe commun aux fichiers d'entrees
# rep     - repertoire contenant toutes ces donnees
# outnam  - prefixe commun aux fichiers de sorties
# nom1    - premiere liste de noms des variables (MAJUSCULES) a traiter
# nom2    - seconde liste de noms des variables (MAJUSCULES) a traiter
# moyenne - nom du fichier contenant les moyennes simples
# date    - ibuf(2) contient une date et non un pas de temps
# tri     - Trier les fichiers de donnees RND avec FSTTRI.
# zoncal  - OUI: calcul des moyennes zonale en sus
# rlats   - Nombre de latitudes dans les coupes zonales (seulement utilise pour grille de type Z)
# joinup  - OUI: faire le calcul de tous les pas de temps en meme temp
# travail - repertoire ou on cree le repertoire de travail
# debug   - Activer le mode DEBUG
# do_diag - On fait les diagnostiques en mode DEBUG
#
######################################################################
#
if [ ! -d ${travail} ]; then
  echo "Le repertoire de travail ${travail} doit exister a l'entree..."
  exit 1
fi
#
travail=`true_path ${travail}` 
travail=${travail}/$$
mkdir ${travail}
#
# Definir certaines variables d'environnement de R.DIAG
#
export BIG_TMPDIR=${travail}
#
. Climat_functions
#
minimal_rdiag_version=5.4.2
. Climat_check_rdiag
if [ -s ${DIAGNOSTIC_EXIT} ]; then
  echo "Dans Climat_make_covar: Arret apres Climat_check_rdiag"
  exit 2
fi
#
if [ ! -d ${rep} ]; then
  echo "Le repertoire de donnees initiale ${rep} n'existe pas"
  exit 3
fi
#
rep=`true_path ${rep}`
#
if [ ${rep} = ${travail} ]; then
  echo "Les repertoires rep et travail doivent etre differents..."
  echo "  rep = travail = ${travail}"
  exit 4
fi
#
# Conversions de l'anglais au francais
#
if [ ${date} = NO ]; then
  date=NON
elif [ ${date} = YES ]; then
  date=OUI
fi
#
if [ ${debug} = YES ]; then
  debug=OUI
elif [ ${debug} = NO ]; then
  debug=NON
fi
#
if [ ${do_diag} = YES ]; then
  do_diag=OUI
elif [ ${do_diag} = NO ]; then
  do_diag=NON
fi
#
if [ ${joinup} = YES ]; then
  joinup=OUI
elif [ ${joinup} = NO ]; then
  joinup=NON
fi
#
if [ ${tri} = YES ]; then
  tri=OUI
elif [ ${tri} = NO ]; then
  tri=NON
fi
#
if [ ${zoncal} = YES ]; then
  zoncal=OUI
elif [ ${zoncal} = NO ]; then
  zoncal=NON
fi
#
DATE=' '
if [ ${date} = OUI ]; then DATE="-date" ; fi
#
lats=""
if [   "${rlats}"  ]; then lats="-lat ${rlats}" ; fi
if [ ! "${outnam}" ]; then outnam=d${exp} ; fi
#
# Verifier si mode debug est actif
#
if [ ${debug} = OUI ]; then
  echo " "
  echo "Appel a Climat_make_covar..."
  echo "  exp      = ${exp}"
  echo "  rep      = ${rep}"
  echo "  outnam   = ${outnam}"
  echo "  moyenne  = ${moyenne}"
  echo "  date     = ${date}"
  echo "  tri      = ${tri}"
  echo "  zoncal   = ${zoncal}"
  echo "  rlats    = ${rlats}"
  echo "  joinup   = ${joinup}"
  echo "  travail  = ${travail}"
  echo "  do_diag  = ${do_diag}"
  echo " "
  for var1 in ${nom1}
  do
    echo "Premier terme ${var1}"
  done
  for var2 in ${nom2}
  do
    echo "Second terme ${var2}"
  done
#
  if [ ${do_diag} = NON ]; then
    rm -rf ${travail}
    exit 0
  fi
else
  do_diag=OUI
fi
#
r.echo " "
r.echo " Climat_make_covar: BIG_TMPDIR=${BIG_TMPDIR}"
r.echo " Climat_make_covar: RDIAG=${RDIAG}"
r.echo " Climat_make_covar: NOM1=${nom1}"
r.echo " Climat_make_covar: NOM2=${nom2}"
r.echo " Climat_make_covar: Starting at `date +%r`"
r.echo " "
#
if [ ${debug} = OUI ]; then set -x ; fi
#
listvar1=`echo ${nom1} | tr '[:upper:]' '[:lower:]'`
listvar2=`echo ${nom2} | tr '[:upper:]' '[:lower:]'`
#
cd ${rep} ; nombre=`ls -1 ${exp}* 2> /dev/null | wc -l`
#
if [ ${nombre} = 0 -a ! -d ${rep}/preclimdiagpr ]; then 
  r.echo " "
  r.echo "Climat_make_covar: mauvais rep/exp ${rep}/${exp}"
  r.echo " "
  exit 5
fi
#
cd ${travail}
#
if [ "${joinup}" = OUI ]; then
  #
  # S'il le faut, contruire des fichiers pour
  # chacune des variables dans nom1 et nom2
  #
  # Create list of all variables that need to be extracted
  listvar=${listvar1}
  for var2 in ${listvar2} ; do
    LeFaire=OUI
    for var1 in ${listvar1} ; do
      if [ "${var1}" = "${var2}" ] ; then LeFaire=NON ; fi
    done
    if [ "${LeFaire}" = "OUI" ] ; then listvar="${listvar} ${var2}" ; fi
  done
  #
  if [ -d ${rep}/preclimdiagpr ]; then
    #
    for var in ${listvar} ; do
      reditfst -i 0 -d ${var} -s ${rep}/preclimdiagpr/${var}?
    done
    #
  else
    #
    # Extract all variables at each time step
    for ii in ${rep}/${exp}* ; do
      ${RDIAG} select ${ii} ${listvar} -name ${listvar} -kind "****" APPEND
    done
    #
    for var in ${listvar} ; do
      echo "desire(-1,['>>','^^'])" | reditfst -s ${ii} -d ${var} 1> /dev/null 2>&1
    done
    #
  fi
  #
  # Link first and second list of variables to extracted fields
  for var in ${listvar1} ; do
    r.accessf -dn ${var}1 -pdn ${var} -own .
  done
  for var in ${listvar2} ; do
    r.accessf -dn ${var}2 -pdn ${var} -own .
  done
  #
  # Calculer les covariances directement avec ces (gros) fichiers
  #
  DONE=""
  #
  for variable1 in ${listvar1}
  do
    #
    VARIABLE1=`echo ${variable1} | tr '[:lower:]' '[:upper:]'`
    #
    for variable2 in ${listvar2} ; do
      #
      if [ "${variable1}" != "${variable2}" ] ; then
        #
        VARIABLE2=`echo ${variable2} | tr '[:lower:]' '[:upper:]'`
        #
        LeFaire=OUI
        if [ "${DONE}" ] ; then
          for LAutre in ${DONE} ; do
            if [ "${VARIABLE2}${VARIABLE1}" = "${LAutre}" ] ; then LeFaire=NON ; fi
          done
        fi
        if [ "${LeFaire}" = OUI ] ; then
          ${RDIAG} timcov         ${variable1}1 ${variable2}2 mcov_${variable1}${variable2}   -def   ${DATE}
          ${RDIAG} newnam    mcov_${variable1}${variable2}     cov_${variable1}${variable2}   -name  ${VARIABLE1}${VARIABLE2}
          ${RDIAG} xsave hold cov_${variable1}${variable2}         ${variable1}p${variable2}p -label ${VARIABLE1}\"${VARIABLE2}\"
          if [ ${zoncal} = OUI ]; then
            ${RDIAG} zonavg       ${variable1}p${variable2}p      z${variable1}p${variable2}p ${lats}
          fi
          DONE="${VARIABLE1}${VARIABLE2} ${DONE}"
        else
          r.echo "Climat_make_covar: on ne calcule pas ${VARIABLE1}${VARIABLE2}"
        fi
        #
      fi
      #
    done
    #
  done
  #
else
  #
  # Effectuer le calcul en accumulant les resultats
  # en partant des pas-de-temps (fichiers) individuels
  #
  for ii in ${rep}/${exp}*
  do
    #
    r.echo " "
    r.echo " Climat_make_covar: Traitement du fichier ${ii}"
    r.echo " "
    #
    for VARIABLE1 in ${nom1}
    do
      r.echo " "
      r.echo " Climat_make_covar: premiere variable ${VARIABLE1} dans ${ii}"
      r.echo " "
      #
      variable1=`echo ${VARIABLE1} | tr '[:upper:]' '[:lower:]'`
      r.delf -dn $$_variable -f
      #
      if [ "${tri}" = OUI ]; then
        echo "desire(-1,[\"${VARIABLE1}\",\">>\",\"^^\"])" | \
        reditfst -s ${ii} -d $$_variable -nobox
        ${RDIAG} fsttri -s $$_variable -d ${variable1} -f -zdesc 1> $$_fsttri 2>&1
      else
        ${RDIAG} select ${ii} ${variable1} -name ${VARIABLE1}
      fi
      ${RDIAG} repack ${variable1} ${variable1}64 -npg =-64
      #
      for VARIABLE2 in ${nom2}
      do
        r.echo " "
        r.echo " Climat_make_covar: seconde variable ${VARIABLE2} dans ${ii}"
        r.echo " "
        #
        variable2=`echo ${VARIABLE2} | tr '[:upper:]' '[:lower:]'`
        r.delf -dn $$_variable -f
        #
        if [ "${tri}" = OUI ]; then
          echo "desire(-1,[\"${VARIABLE2}\",\">>\",\"^^\"])" | \
          reditfst -s ${ii} -d $$_variable -nobox
          ${RDIAG} fsttri -s $$_variable -d ${variable2} -f -zdesc 1> $$_fsttri 2>&1
        else
          ${RDIAG} select ${ii} ${variable2} -name ${VARIABLE2}
        fi
        #
        # Accumuler la somme des produits
        ${RDIAG} mlt     ${variable1}64 ${variable2} ${variable1}${variable2}
        ${RDIAG} accumul ${variable1}${variable2} total.${variable1}${variable2} ${DATE}
        #
      done
      #
      if [ -s ${DIAGNOSTIC_EXIT} ]; then
        cat ${DIAGNOSTIC_EXIT}
        echo " ...pendant traitement du fichier ${ii}"
        exit 6
      fi
      #
    done
    #
  done
  #
  # Calculer les covariances elles-meme
  #
  for VARIABLE1 in ${nom1}
  do
    #
    variable1=`echo ${VARIABLE1} | tr '[:upper:]' '[:lower:]'`
    ${RDIAG} select ${rep}/${moyenne} ${variable1} -name ${VARIABLE1}
    #
    for VARIABLE2 in ${nom2}
    do
      #
      variable2=`echo ${VARIABLE2} | tr '[:upper:]' '[:lower:]'`
      ${RDIAG} select ${rep}/${moyenne} ${variable2} -name ${VARIABLE2}
      #
      ${RDIAG} mlt    ${variable1} ${variable2} m${variable1}m${variable2}
      ${RDIAG} sub    m${variable1}m${variable2} total.${variable1}${variable2} mcov_${variable1}${variable2}
      ${RDIAG} xlin   mcov_${variable1}${variable2} cov_${variable1}${variable2} -a =-1 -name ${VARIABLE1}${VARIABLE2}
      ${RDIAG} xsave  hold cov_${variable1}${variable2} ${variable1}p${variable2}p -label ${VARIABLE1}\"${VARIABLE2}\"
      if [ ${zoncal} = OUI ]; then
        ${RDIAG} zonavg ${variable1}p${variable2}p z${variable1}p${variable2}p ${lats}
      fi
      #
    done
  done
  #
fi
#
liste_fichiers1=" "
liste_fichiers1z=" "
#
# Construire le fichier des covariances
#
for variable1 in ${listvar1}
do 
  liste_fichiers2=" "
  liste_fichiers2z=" "
  for variable2 in ${listvar2}
  do 
    liste_fichiers2="${liste_fichiers2} ${variable1}p${variable2}p"
    liste_fichiers2z="${liste_fichiers2z} z${variable1}p${variable2}p"
  done
  ${RDIAG} joinup covariance.${variable1} ${liste_fichiers2}
  if [ ${zoncal} = OUI ]; then
    ${RDIAG} joinup zcovariance.${variable1} ${liste_fichiers2z}
  fi
  liste_fichiers1="${liste_fichiers1} covariance.${variable1}"
  liste_fichiers1z="${liste_fichiers1z} zcovariance.${variable1}"
done
#
${RDIAG} joinup ${rep}/${outnam}_covariance ${liste_fichiers1}
if [ ${zoncal} = OUI ]; then
  ${RDIAG} joinup ${rep}/${outnam}_covariancez ${liste_fichiers1z}
fi
#
if [ ! -s ${DIAGNOSTIC_EXIT} ]; then
     cd ${rep}
     rm -rf ${BIG_TMPDIR}
     r.echo " Climat_make_covar: Ending at `date +%r`"
     exit 0
fi
#
exit 7
