#!/bin/ksh 
#-*-ksh-*-
#set -x
# PROCEDURE DE LANCEMENT DE L ANALYSE VARIATIONNELLE 3D
# AUTEUR: Simon Pellerin ARMA
#
echo " "
echo "                             FELIX"
echo "     Formation d Experiences Lancees Interactivement sur uniX"
echo "     Version: ${version}"
echo " "
LCFG_TEMPLATES_DIR=/home/dormrb02/modeles/ANAL/templates/felix
# Valeurs des arguments par defaut
#
. initfelixkeys.dot
#
# definition de la sequence du fichier d histoire
#
#
. r.lcfg.dot
#
#------------------ Fin des recettes de recherche d historique -------------------------
#
#
. r.entry.dot
eval $(cclargs -D  $0 "[ LANCEUR  DU  3Dvar]"\
 -FELIX ${LANCEUR} "" "[Version de felix; sans effet lors d un lancement interractif]"\
 -exp ${exp} "No._process" "[Pas de numero d experience ; No. d experience]"\
 -gest ${gest} asa:raid2/gestion_job "[mach:repertoire de compilation et d execution]"\
 -exc4dv ${exc4dv} NON "[repertoire d echange pour le 4dvar]"\
 -nml $nml asa:data1/job3dvar/namelist_t21 "[mach:Fichier contenant les namelist]"\
 -trlmod ${trlmod} non "[mach:Fichier std  champ esssai coord modele  ; non requis]"\
 -preconf ${preconf} non "[NON | mach:fullpathname du fichier de preconditionnement de m1qn3]"\
 -djdx ${djdx} non "[NON | mach:fullpathname du fichier de sensibilite]"\
 -numanalyses ${numanalyses} 1 "[Number of analyses to perform]"\
 -analysisgrid ${analysisgrid} NON "[mach:Prototype pour la grille d analyse ; non]"\
 -statens ${statens} non "[mach:Fichier statistique ensemble ; non]"\
 -statbg ${statbg} non "[mach:Fichier statistique ; non]"\
 -statobs ${statobs} non "[mach:Fichier statistique | non]"\
 -statobs_conv ${statobs_conv} non "[mach:Fichier statistique | non]"\
 -statsat ${statsat} non "[mach:Fichier statitisque d erreur sat ; non]"\
 -coefsat ${coefsat} non "[mach:Fichier de coefficients sat ; non]"\
 -biascoeff ${biascoeff} NON "[mach:Fichier de coefficients bias ; non]"\
 -obs "${obs}" "[mach:Fichier obs BURP ; non requis]"\
 -obstyp "${obstyp}" "[liste des types d observations a considerer]"\
 -retour ${retour} $HOME/data/gestion_job "[Pas de retour des fichier de resultats ; mach:Repertoire de retour]"\
 -t $t 1800 "[Temps CPU]"\
 -cm $cm 1200000 "[Memoire demandee]"\
 -ptopo ${ptopo} 1x1 "[Process Topology]" \
 -npeOMP ${npeOMP} 1 "[Nombre de threads demandes]"\
 -edit+ ${edit} oui "[Execution interactive avec editeur non:oui]"\
 -gsor "${gsor}" ${gsordef} "[Groupe ou liste de fichiers de sortie a conserver]"\
 -abs ${abs} "[repertoire/nom de l absolu du 3Dvar a generer et/ou executer]"\
 -abs_AAI ${abs_AAI} "[repertoire/nom de l absolu du AAI a executer]"\
 -exec+ "${exec}" "OUI" "[OUI|NON]"\
 -job ${job} "non" "[machine:fichier d une job a soumettre via qsub apres l analyse]"\
 -pproc ${pproc} "NON" "[machine:pathname du script lance apres le variationnel]"\
 -cfgpproc ${cfgpproc} "NON" "[machine: pathname du fichier de configuration de pproc]"\
 -tmpdir ${tmpdir} "${TMPDIR}" "[a tmporal working directory used ]"\
 -mail+ ${mail} "oui" "[Pour recevoir un message lorsque termine]"\
 -suffix+ ${suffix} "non" "[Pour ajouter on non une .${exp} au nom de fichier dans ${retour}]"\
 -cleanup+ ${cleanup} "[NON : menage partiel; OUI: menage complet du repertoire de gestion]"\
 -_l3dv "" "" "[adresse de sortie de la script de lancement]"\
 -_rmtrf+ "${_rmtrf}" "oui" "[INPUT: OUI=tranfert, NON=pas de transfert; OUTPUT=mach:/fullpathname de la script de transfert]"\
 -help+ non "" "[Manuel d utilisation de felix]"\
 ++ $*)

if [ $? -ne 0 ]; then
    echo "CCLARGS aborted in ${LANCEUR} for calling sequence '$*'"
    exit 1
fi
echo gest=${gest}
if [ -z "${gest}" ]; then
    echo "The variable '\${gest}' is empty in ${LANCEUR}.  Please check your configuration  (${exp})!!!"
    exit 1
fi

FELIX=${LANCEUR}
 [[ "${abs_AAI}" = "NON" ]] && abs_AAI=''
# ecriture preliminaire dans le fichier de configuration
. r.ecfg.dot ${exp}
#
felix.aide ${help}
#
date
#
 # set up tmpdir
 tmp_felix=${tmpdir:-"$TMPDIR"} 
 truehost=$(hostname)
 if [[ "${tmp_felix}" != "${TMPDIR}" ]];then
    tmp_felix=${tmpdir}/${exp}
    truehost=${TRUE_HOST}
    mkdir -p ${tmp_felix}
    if [[ $? != 0 ]];then  
       printf "Can not create $tmp_felix , Abort!\n"
       exit 1 
    fi
 fi
#
#     -------------------- Definition de fonctions ----------------------
#
. func.dot
. felixfunc.dot
#
#     -------------------- Variables d environnement --------------------
#
. felixenv.dot
#
# ecriture finale dans le fichier de configuration
. r.ecfg.dot ${exp}
#
#
# --- Menage preventif ---
#  
echo "Grand menage sur ${gest} >>> rm -f ${gest}/* <<<"
if [[ "${gest_rep}" != "" ]]
then
  ssh ${gest_mach} "mkdir -p ${gest_rep}"
  ssh ${gest_mach} "rm -f ${gest_rep}/*"
else
  echo "${gest_rep} n existe pas"
  exit
fi
#
#  Fichier contenant les NAMELIST
#
. transfert_nml.dot
#
if test "${NCONF}" = "101"
then
  nom_listing=bgchk.${exp}
elif test "${NCONF}" = "121"
then
  nom_listing=eval.${exp}
else
  nom_listing=var3d.${exp}
fi
#
# Initialisation de la machine et du fichier lajob
#
myjob='NOJOB'
if test "${job}" != "NON"
then
  #
  #  Verification de l existance du fichier lajob sur la machine job_mach
  #
  checkfile $job_mach $job_fich
  #
  if test "$?" != "0"
  then
    echo " ---------------------------------------------------------"
    echo " 3Dvar : Le fichier ${job_mach}:${job_fich} n existe pas"
    echo " ---------------------------------------------------------"
    exit 1
  fi
  #
  if [[ -f $job_fich  ]]
  then
    myjob=$(is_a_realjob $job_fich)
#    myjob=$(tar tvf $job_fich > /dev/null 2>&1 && echo realjob)
#    if [[ "$myjob" = "IS_NOT_A_REALJOB" ]]; then myjob=script;fi
  else
    myjob=IS_A_REALJOB
  fi
#
  if [ "${myjob}" = "IS_A_REALJOB" ]
  then
    echo " "
    echo " ----- ----- ----- ----- ----- ----- ----- ----- ----- -----"
    echo " Copie de ${job_mach}:${job_fich} a ${gest_mach}:$gest_rep/usrjob"
    #
    TAILJOB=${HOME}/felixtailjob/tailjob.${exp}

    if [[ ! -d ${HOME}/felixtailjob ]]; then mkdir ${HOME}/felixtailjob; fi

    if [[ "${job_mach}" = "${TRUE_HOST}" ]]
    then
      cp ${job_fich} ${TAILJOB}
      status=$?
    else
      r.scp ${job_mach}:${job_fich} ${TAILJOB}
      status=$?
    fi
    #
    if test $status -ne 0
    then
      echo " Impossible de copier le fichier ${job_mach}:${job_fich} a ${gest_mach}:$gest_rep/usrjob"
      exit 1
    fi
  fi
fi
#
#
#  2. Transfert des fichiers necessaire au 3Dvar sur de la machine-cible
#     -------  option d edition si necessaire ----------------


#
#  2.0 Fichier prototype servant a defenir la grille d'analyses
#
if test "${analysisgrid}" != "NON" ; then
  splitmachfich ${analysisgrid}
  set $FUNC_VAL
  analysisgrid_mach=$2
  analysisgrid_fich=$3
  analysisgrid_home=$4
  analysisgrid=$1
  transfert ${analysisgrid_mach} ${analysisgrid_fich} ${gest_mach} ${gest_rep}/analysisgrid
  if [ ${?} -ne 0 ] ; then
    echo " Impossible de transferer ${analysisgrid_mach}:${analysisgrid}"
    exit 1
  fi
else
  echo " ---------------------------------------------------------"
  echo " Vous devez absolument fournir un fichier prototype pour  "
  echo " definir la grille des increments d'analyse !!!           "
  echo " ---------------------------------------------------------"
  exit 1
fi

#
#  2.1 Fichier contenant les observations format BURP
#
if test "${obsfich[0]}" != "NON"
then
  (cd ${tmp_felix}; rm -f dirbrp* brp* resume resdir excdir 2> /dev/null)
  #
  i=0
  while test ${i} -lt ${nbrfobs}
  do
    #
    transfert ${obs_mach[$i]} ${obs_fich[$i]} ${gest_mach} ${gest_rep}/postfile${i}
    if test "${?}" != "0"
    then
      echo " ---------------------------------------------------------"
      echo " Impossible de transferer ${obs_mach[$i]}:${obs_fich[$i]}"
      echo " ---------------------------------------------------------"
      exit 1
    fi
    #
    i=i+1
  done
  #
  . ecrbrpdir.dot ${obstyp}

  if [ ${nbrbrp} -gt 0 ]
  then
    cp_file $(hostname) ${tmp_felix}/directiveburp.tar ${gest_mach} ${gest_rep}/directiveburp.tar
    status=$?
    if test $status -ne 0
    then
      echo " Impossible de copier les fichiers de directives sur ${gest_rep}"
      exit 1
    fi
  fi
fi
#
#  2.2 Fichier contenant le champ d essai
#
#  Fichier standard point de grille coordonnee modele
#
if test "${trlmod}" != "NON"
then
  #
  # Initialisation de la machine et du fichier du champ d essai coordonnee modele
  #
  i=0
  echo "numanalyses= $numanalyses "
  if [[ ${numanalyses} -gt 1 ]]; then
      indexAnalysis=0
      while [[ ${indexAnalysis} -lt ${numanalyses} ]]; do
          i=0
          let indexAnalysis=indexAnalysis+1
          while [[ ${i} -lt ${trlm_numflds} ]];do
              indexstr=`printf "%3.3d" ${indexAnalysis}`
              transfert ${trlmod_mach[$i]} ${trlmod_fich[$i]} ${gest_mach} ${trlm_gest[$i]}_${indexstr}
              if [ ${?} -ne 0 ]
              then
		  echo " Impossible de transferer ${trlmod_mach}:${trlmod_fich}"
		  exit 1
              fi
              let i=i+1
          done
      done
  else
      while [[ ${i} -lt ${trlm_numflds} ]];do
          transfert ${trlmod_mach[$i]} ${trlmod_fich[$i]} ${gest_mach} ${trlm_gest[$i]}
          if [ ${?} -ne 0 ]
          then
              echo " Impossible de transferer ${trlmod_mach}:${trlmod_fich}"
              exit 1
          fi
          let i=i+1
      done
  fi
fi

#
if test "${preconf}" != "NON"
then
  #
  # Initialisation de la machine et du fichier du champ d essai coordonnee modele
  #
  transfert ${preconf_mach} ${preconf_fich} ${gest_mach} ${gest_rep}/preconin
  if [ ${?} -ne 0 ]
  then
    echo " Impossible de transferer ${preconf_mach}:${preconf_fich}"
    exit 1
  fi
  PRECONF="-ipcon preconin"
else
  PRECONF=""
fi

if test "${djdx}" != "NON"
then
  
  transfert ${djdx_mach} ${djdx_fich} ${gest_mach} ${gest_rep}/djdx.fst
  if [ ${?} -ne 0 ]
  then
    echo " Impossible de transferer ${djdx_mach}:${djdx_fich}"
    exit 1
  fi
fi
#
#  2.3 Fichier contenant les statistiques d erreur de prevision
#      (lu par SUSTAT)
#
if [[ "${statbg}" != "NON" && "${statbg}" != "AUTO" && "${statbg}" != "GLBMESO_NMC" && "${statbg}" != "GLBSTRATO_NMC" && "${statbg}" != "GLBSTRATO_NMC_TAPER" && "${statbg}" != "GLBSTRATO_NMC_T200_TAPER" && "${statbg}" != "GLBSTRATO_NMC_T200_TAPER_FIX_THETA" && "${statbg}" != "GLBSTRATO_NMC_T380_TAPER_FIX_THETA" ]]
then
  #
  # Initialisation de la machine et du fichier contenant les statistiques d erreur de previsions
  #
  transfert ${statbg_mach} ${statbg_fich} ${gest_mach} ${gest_rep}/bgcov
  if test "$?" != "0"
  then
    echo " Impossible de transferer ${statbg_mach}:${statbg_fich}"
    exit 1
  fi
  ssh ${gest_mach} ln -s ${gest_rep}/bgcov ${gest_rep}/glbcov
fi
#
if test "${statens}" != "NON"
then

  if test "${statens_mach}" = "${gest_mach}"
  then
    echo  " "
    echo  " ----- ----- ----- ----- ----- ----- ----- ----- ----- -----"
    echo  " Creation du lien ${gest_rep}/ensemble -> ${statens_fich} sur ${statens_mach}"
    ssh ${statens_mach} ln -s ${statens_fich} ${gest_rep}/ensemble
    if [ ${?} -ne 0 ]
    then
      echo " Impossible de lier ${statens_fich} sur ${statens_mach}"
      exit 1
    fi
  else
    echo "statens_mach et gest_mach doivent etre identiques "
    exit 1
  fi
fi
#
if test "${pproc}" != "NON"
then
  #
  # Transfert de la procedure post variationnelle
  #
  transfert ${pproc_mach} ${pproc_fich} ${gest_mach} ${gest_rep}/pproc.sh
  if test "$?" != "0"
  then
    echo " Impossible de transferer ${pproc_mach}:${pproc_fich}"
    exit 1
  fi
  transfert ${cfgpproc_mach} ${cfgpproc_fich} ${gest_mach} ${gest_rep}/cfgpproc.dot
  if test "$?" != "0"
  then
    echo " Impossible de transferer ${cfgpproc_mach}:${cfgpproc_fich}"
    exit 1
  fi

fi
#
#  2.4 Fichier contenant les statistiques d erreur d'observations
#      (lu par SUSTAT)
#
if [[ "${statobskeyword}" != "OUI" && "${statobs}" != 'NON' ]]
then
  #
  # Initialisation de la machine et du fichier contenant les statistiques d erreur d'observations
  #
  transfert ${statobs_mach} ${statobs_fich} ${gest_mach} ${gest_rep}/obscov
  if test "$?" != "0"
  then
    echo " Impossible de transferer ${statobs_mach}:${statobs_fich}"
    exit 1
  fi
fi
#  cle 'statobs_conv'
if [[ "${statobs_conv}" != "NON" && "${statobs_conv}" != "non" ]]
then
    splitmachfich ${statobs_conv}
    set $FUNC_VAL
    statobs_conv_mach=$2
    statobs_conv_fich=$3
    statobs_conv_home=$4
    statobs_conv=$1

  #
  # Initialisation de la machine et du fichier contenant les statistiques d erreur d'observations
  #
  transfert ${statobs_conv_mach} ${statobs_conv_fich}/obscov ${gest_mach} ${gest_rep}/obscov
  if test "$?" != "0"
  then
    echo " Impossible de transferer ${statobs_mach}:${statobs_fich}/obscov"
    exit 1
  fi
  transfert ${statobs_conv_mach} ${statobs_conv_fich}/obserr ${gest_mach} ${gest_rep}/obserr
  if test "$?" != "0"
  then
    echo " Impossible de transferer ${statobs_mach}:${statobs_fich}/obserr"
    exit 1
  fi
fi
#
#  2.5 Fichier contenant les statistiques d erreur d'observations satellitaire
#     
if [[ "${statsat}" != "NON" && "${statsat}" != "AUTO" ]]
then
  #
  if [[ ${statsat_mach} = ${TRUE_HOST} ]]
  then
    remoteshell=""
  else
    remoteshell="ssh ${statsat_mach}"
  fi

  if [[ ${STATTYPE} = "DIR" ]]
  then
    integer errsat=0
    for file in $(${remoteshell} ls -1L ${statsat_fich})
    do
      transfert ${statsat_mach} ${statsat_fich}/${file} ${gest_mach} ${gest_rep}/${file}
      errsat=errsat+${?}
    done
  elif [[ ${STATTYPE} = "FILE" ]]
  then
    transfert ${statsat_mach} ${statsat_fich} ${gest_mach} ${gest_rep}/rt_coef_fmt.dat
    errsat=$?
  fi
  if test "${errsat}" != "0"
  then
    echo " Impossible de transferer ${statsat_mach}:${statsat_fich}"
    exit 1
  fi
fi
#
#  2.6 Fichier contenant les coefficients satellitaire
#     
#
if [[ "${coefsat}" != "NON" && "${coefsat}" != "AUTO" ]]
then
  #
  if [[ ${coefsat_mach} = ${TRUE_HOST} ]]
  then
    remoteshell=""
  else
    remoteshell="ssh ${coefsat_mach}"
  fi

  if [[ ${COEFTYPE} = "DIR" ]]
  then
    integer errsat=0
    for file in $(${remoteshell} ls -1L ${coefsat_fich})
    do
      transfert ${coefsat_mach} ${coefsat_fich}/${file} ${gest_mach} ${gest_rep}/${file}
      errsat=errsat+${?}
    done
  elif [[ ${COEFTYPE} = "FILE" ]]
  then
    transfert ${coefsat_mach} ${coefsat_fich} ${gest_mach} ${gest_rep}/rt_coef_fmt.dat
    errsat=$?
  fi
  if test "${errsat}" != "0"
  then
    echo " Impossible de transferer ${coefsat_mach}:${coefsat_fich}"
    exit 1
  fi
fi
#
#  2.7 Fichier contenant les coefficients bias correction
#     
#
if [[ "${biascoeff}" != "NON" ]]
then

  splitmachfich ${biascoeff}
  set $FUNC_VAL
  biascoeff_mach=$2
  biascoeff_fich=$3
  biascoeff_home=$4
  biascoeff=$1

  if [[ ${biascoeff_mach} = ${TRUE_HOST} ]]
  then
    remoteshell=""
  else
    remoteshell="ssh ${biascoeff_mach}"
  fi

  integer errbias=0
  for file in $(${remoteshell} ls -1L ${biascoeff_fich})
  do
    # analysis files become background files for the next date
    file2=`echo $file |sed "s/_analysis_/_background_/"`
    transfert ${biascoeff_mach} ${biascoeff_fich}/${file} ${gest_mach} ${gest_rep}/${file2}
    errbias=errbias+${?}
  done
  if test "${errbias}" != "0"
  then
    echo " Impossible de transferer ${biascoeff_mach}:${biascoeff_fich}"
    exit 1
  fi
fi
#
# 3. Ecriture des directives pour l'execution du 3dvar
#
transfert ${abs_mach} ${abs_fich} ${gest_mach} ${gest_rep}/var3d
if test "$?" != "0"
then
  echo " Impossible de transferer ${abs_mach}:${abs_fich}"
  exit 1
fi

echo ${abs_AAI_fich}
if [[ -n ${abs_AAI_fich} ]];then
  transfert ${abs_AAI_mach} ${abs_AAI_fich} ${gest_mach} ${gest_rep}/AAI
  if test "$?" != "0"
  then
       echo " Impossible de transferer ${abs_AAI_mach}:${abs_AAI_fich}"
  exit 1
  fi
fi
#
#     ------ Definition de fonctions pour le sub shell-------------------
#
. lance3dvarfunc.dot

# Definition et initialisation des groupes de resultats
#
. gsor.dot

# -----------------------------------------
  if [[  "$ptopo" = "nompi" ]];then
    npex=1
    npey=1
    NCPUS=1
    TOTCPUS="${npeOMP}"
    MPI=''
  else
    npex=${ptopo%x*}
    npey=${ptopo#*x}
    let NCPUS=${npex}*${npey}
    TOTCPUS="${NCPUS}x${npeOMP}"
    MPI="-mpi"
  fi
#--------------------------------------------------------------
# preparation du script a soumettre
# 1. 
. preprocess_3dvar.dot ${npex} ${npey}
 r.scp ${tmp_felix}/preprocess3dvar.dot ${gest_mach}:${gest_rep}/.
# 2. 
. lanceur_3dvar.dot
 r.scp ${tmp_felix}/lanceur3dvar.dot ${gest_mach}:${gest_rep}/.
# 2a. 
 if [[ -n ${abs_AAI_fich} ]];then
   . lanceur_AAI.dot
   r.scp ${tmp_felix}/lanceurAAI.dot ${gest_mach}:${gest_rep}/.
 fi
# 3.  
. post_3dvar.dot 
 r.scp ${tmp_felix}/post3dvar.dot ${gest_mach}:${gest_rep}/.
#
. exec3dvar.dot 
#
#--------------------------------------------------------------------------------------
#
usrliste=`tail -1 /users/dor/arma/spe/publique/felixusr`
if test "`echo ${usrliste} | grep $USER`" = ""
then
  usrliste=${usrliste},$USER
  echo ${usrliste} > /users/dor/arma/spe/publique/felixusr
fi
#
# 4. Conclusion et transfert du script a executer par la machine "TRUE_HOST" ou a soumettre
#     par une machine "remote"
#
_rmtrf=${gest_mach}:${gest_rep}/jobtrf

chmod +x ${tmp_felix}/lance_3dvar.${exp}
echo " "
echo " ---------> Determiner le nom des fichiers de sortie d execution <----------"
#
 [[ -n ${abs_AAI_fich} ]] && r.scp ${tmp_felix}/lanceurAAI.dot ${gest_mach}:${gest_rep}/lanceurAAI.dot

r.scp ${tmp_felix}/lance_3dvar.${exp} ${gest_mach}:${gest_rep}/lance_3dvar.${exp}
#
_l3dv=${gest_mach}:${gest_rep}/lance_3dvar.${exp}

echo "${gest_rep}/lance_3dvar.${exp} >> ${gest_rep}/${nom_listing} 2>&1" > ${tmp_felix}/l3dv.${exp}

if [[ "${exec}" = "OUI" || "${exec}" = "BATCH" ]]
then

  echo "cat ${gest_rep}/${nom_listing}" >> ${tmp_felix}/l3dv.${exp}
  echo " "
  echo " ---------> Soumission du script ${gest_mach}:${gest_rep}/lance_3dvar.${exp}  <----------"
  echo " "
  typeset -L14 jobname=${exp}
  cd ${tmp_felix}
  ord_soumet l3dv.${exp} -ssmuse envar -jn ${jobname} -cpus ${TOTCPUS} -mach ${gest_mach} -t $t -cm $cm ${MPI} -nosubmit -waste
  r.scp lajob.tar ${gest}/restartjob
  soumet_lajob

elif [[ "${exec}" = "NON" ]]
then

  echo " "
  echo " ---------> La preparation du script ${gest_mach}:${gest_rep}/lance_3dvar.${exp} est terminee <----------"
  echo " "

elif [[ "${exec}" = "INTER" ]] 
then
  if [[ ${gest_mach} != ${TRUE_HOST} ]]
  then
    echo "Impossible de lancer ${gest_mach}:${gest_rep}/lance_3dvar.${exp} interractivement: ${gest_mach} != ${TRUE_HOST}"
  fi
  chmod +x ${tmp_felix}/l3dv.${exp}
  ${tmp_felix}/l3dv.${exp}
fi
 [[ "$tmp_felix" != "${TMPDIR}" && "$tmp_felix" != ${HOME} ]] && rm -rf ${tmp_felix}
. r.return.dot
