Index: /trunk/libIGCM/libIGCM_sys/libIGCM_sys_iitm.ksh
===================================================================
--- /trunk/libIGCM/libIGCM_sys/libIGCM_sys_iitm.ksh	(revision 809)
+++ /trunk/libIGCM/libIGCM_sys/libIGCM_sys_iitm.ksh	(revision 810)
@@ -68,5 +68,5 @@
 typeset  LOGIN=${LOGIN:=$( whoami )}
 # $hostname of the MASTER job
-typeset -r MASTER=iitm01
+ntypeset -r MASTER=iitm01
 
 #D-
@@ -75,12 +75,35 @@
 #D-#==================================================
 
+# Submit command
+typeset SUBMIT=${SUBMIT:=/usr/lpp/LoadL/full/bin/llsubmit}
 # rsync with path
 typeset -r RSYNC=/usr/bin/rsync
 # RSYNC_opt args to rsync
 typeset -r RSYNC_opt="-va"
+# ie storage filesystem
+typeset -r STOREHOST=iitm01
+typeset -r REMOTE_RSYNC=/usr/bin/rsync
+
+#====================================================
+# Source default environment
+#====================================================
+##. /etc/profile
+
+#====================================================
+# Set environment tools (ferret, nco, cdo)
+#====================================================
+# Not applicable here
 
 #====================================================
 # Host specific DIRECTORIES
 #====================================================
+
+#====================================================
+#- Mirror libIGCM from iitm to a post-processing machine
+typeset -r MirrorlibIGCM=${MirrorlibIGCM:=false}
+
+#====================================================
+#- libIGCM_POST for frontend
+typeset -r libIGCM_POST=${libIGCM}
 
 #====================================================
@@ -99,18 +122,21 @@
 #====================================================
 #- ARCHIVE
-typeset -r ARCHIVE=$( echo ${HOME} | sed -e "s/gpfs1/gpfs3/" )
-
-#====================================================
-#- Mirror libIGCM from iitm to a post-processing machine
-typeset -r MirrorlibIGCM=${MirrorlibIGCM:=false}
-
-#====================================================
-#- libIGCM_POST
-typeset -r HOME_POST=${HOME}
-typeset -r libIGCM_POST=${libIGCM}
-
-#====================================================
-#- OUT
-typeset -r R_OUT=${ARCHIVE}/IGCM_OUT
+typeset ARCHIVE=$( echo ${HOME} | sed -e "s/gpfs1/gpfs3/" )
+
+#====================================================
+#- STORAGE (dedicated to small/medium files)
+typeset STORAGE=${ARCHIVE}
+
+#====================================================
+#- R_OUT
+typeset R_OUT=${ARCHIVE}/IGCM_OUT
+
+#====================================================
+#- R_FIG (hosting figures : monitoring and atlas, and/or small files)
+typeset R_FIG=${WORKDIR}/IGCM_OUT
+
+#====================================================
+#- R_BUF (ONLY FOR double copy an scratch)
+typeset -r R_BUF=${WORKDIR}/IGCM_OUT
 
 #====================================================
@@ -120,5 +146,5 @@
 #====================================================
 #- HOST_MPIRUN_COMMAND
-typeset -r HOST_MPIRUN_COMMAND=${HOST_MPIRUN_COMMAND:="time poe"}
+typeset -r HOST_MPIRUN_COMMAND=${HOST_MPIRUN_COMMAND:="/usr/bin/time poe"}
 
 #====================================================
@@ -126,4 +152,21 @@
 UNIX_MAX_LIMIT=360
 
+#====================================================
+#- set PackDefault true on curie
+PackDefault=false
+
+#====================================================
+#- Number of core per node (max number of OpenMP task)
+NUM_COREPERNODE=2
+
+#====================================================
+#- Default number of MPI task for IPSL coupled model
+#- required for backward compatibility
+#-
+DEFAULT_NUM_PROC_OCE=5
+DEFAULT_NUM_PROC_CPL=1
+(( DEFAULT_NUM_PROC_ATM = BATCH_NUM_PROC_TOT - DEFAULT_NUM_PROC_OCE - DEFAULT_NUM_PROC_CPL ))
+DEFAULT_NUM_PROC_TOTAL=${BATCH_NUM_PROC_TOT}
+
 #D-#==================================================
 #D-function IGCM_sys_ChangeArchive
@@ -132,7 +175,5 @@
 #D-
 function IGCM_sys_ChangeArchive {
-
   IGCM_debug_Print 1 " dummy function : IGCM_sys_ChangeArchive "
-
 }
 
@@ -147,30 +188,43 @@
 #D-
 function IGCM_sys_RshMaster {
-    IGCM_debug_PushStack "IGCM_sys_RshMaster" $@
+  IGCM_debug_PushStack "IGCM_sys_RshMaster" $@
+  /bin/ksh <<-EOF
+    export libIGCM=${libIGCM}
+    export DEBUG_debug=${DEBUG_debug}
+    . ${libIGCM}/libIGCM_debug/libIGCM_debug.ksh
+    . ${libIGCM}/libIGCM_card/libIGCM_card.ksh
+    ${@}
+EOF
+  if [ $? -gt 0 ] ; then
+    echo "IGCM_sys_RshMaster : erreur."
+    IGCM_debug_Exit "IGCM_sys_RshMaster"
+  fi
+  IGCM_debug_PopStack "IGCM_sys_RshMaster"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_RshArchive
+#D-* Purpose: Archive rsh command
+#D-* Examples:
+#D-
+function IGCM_sys_RshArchive {
+  IGCM_debug_PushStack "IGCM_sys_RshArchive" $@
+  DEBUG_sys=false IGCM_sys_IsFileArchived "$@"
+  if [ $? = 0 ] ; then
     /bin/ksh <<-EOF
     ${@}
 EOF
-    if [ $? -gt 0 ] ; then
-      echo "IGCM_sys_RshArchive : erreur."
-      IGCM_debug_Exit "IGCM_sys_RshArchive"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_RshMaster"
-}
-
-#D-#==================================================
-#D-function IGCM_sys_RshArchive
-#D-* Purpose: Archive rsh command
-#D-* Examples:
-#D-
-function IGCM_sys_RshArchive {
-    IGCM_debug_PushStack "IGCM_sys_RshArchive" $@
+    status=$?
+  else
     /bin/ksh <<-EOF
     ${@}
 EOF
-    if [ $? -gt 0 ] ; then
-      echo "IGCM_sys_RshArchive : erreur."
-      IGCM_debug_Exit "IGCM_sys_RshArchive"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_RshArchive"
+    status=$?
+  fi
+  if [ ${status} -gt 0 ] ; then
+    IGCM_debug_Print 2 "IGCM_sys_RshArchive : command failed error code ${status}"
+    IGCM_debug_Exit "IGCM_sys_RshArchive"
+  fi
+  IGCM_debug_PopStack "IGCM_sys_RshArchive"
 }
 
@@ -181,15 +235,21 @@
 #D-
 function IGCM_sys_RshPost {
-    IGCM_debug_PushStack "IGCM_sys_RshPost" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_RshPost :" $@
-    fi
-    /bin/ksh ${@}
-    #rsh ulam exec /bin/ksh ${@}
-    if [ $? -gt 0 ] ; then
-      echo "IGCM_sys_RshPost : erreur."
-      IGCM_debug_Exit "IGCM_sys_RshPost"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_RshPost"
+  IGCM_debug_PushStack "IGCM_sys_RshPost" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_RshPost :" $@
+  fi
+
+  # keep standard input to keep it for postpone if ulam don't answer
+  cat >/tmp/tmp_IGCM_sys_RshPost_$$_${LOGNAME}
+
+  /bin/ksh </tmp/tmp_IGCM_sys_RshPost_$$_${LOGNAME}
+  if [ $? -gt 0 ] ; then
+    echo "IGCM_sys_RshPost : erreur."
+    IGCM_debug_Exit "IGCM_sys_RshPost"
+  fi
+  # delete temporary file
+  \rm /tmp/tmp_IGCM_sys_RshPost_$$_${LOGNAME}
+
+  IGCM_debug_PopStack "IGCM_sys_RshPost"
 }
 
@@ -200,15 +260,16 @@
 #D-
 function IGCM_sys_SendMail {
-    IGCM_debug_PushStack "IGCM_sys_SendMail" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_SendMail :" $@
-    fi
-
-    if ( ${ExitFlag} ) ; then
-      status=failed
-    else
-      status=completed
-    fi
-    cat  << END_MAIL > job_end.mail
+  IGCM_debug_PushStack "IGCM_sys_SendMail" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_SendMail :" $@
+  fi
+
+  if ( ${ExitFlag} ) ; then
+    status=failed
+  else
+    status=completed
+  fi
+
+  cat  << END_MAIL > job_end.mail
 Dear ${LOGIN},
 
@@ -216,21 +277,26 @@
   Job started : ${DateBegin}
   Job ended   : ${DateEnd}
-  Ouput files are available in ${R_SAVE}
+  Output files are available in ${R_SAVE}
+  Files to be rebuild are temporarily available in ${REBUILD_DIR}
+  Pre-packed files are temporarily available in ${R_BUFR}
   Script files, Script Outputs and Debug files (if necessary) are available in ${SUBMIT_DIR}
 END_MAIL
 
-    if [ ! -z ${config_UserChoices_MailName} ] ; then
-      mailx -s "${config_UserChoices_JobName} ${status}" ${config_UserChoices_MailName} <  job_end.mail
-    elif [ -f ~/.forward ] ; then
-      mailx -s "${config_UserChoices_JobName} ${status}" $( cat ~/.forward ) < job_end.mail
-    else
-      mailx -s "${config_UserChoices_JobName} ${status}" ${USER} < job_end.mail
-    fi
-
-    if [ $? -gt 0 ] ; then
-      echo "IGCM_sys_SendMail : erreur."
-      IGCM_debug_Exit "IGCM_sys_SendMail"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_SendMail"
+  if [ ! -z ${config_UserChoices_MailName} ] ; then
+    mailx -s "${config_UserChoices_JobName} ${status}" ${config_UserChoices_MailName} <  job_end.mail
+  elif [ -f ~/.forward ] ; then
+    mailx -s "${config_UserChoices_JobName} ${status}" $( cat ~/.forward ) < job_end.mail
+  else
+    mailx -s "${config_UserChoices_JobName} ${status}" ${USER} < job_end.mail
+  fi
+
+  sleep 10
+  rm -f job_end.mail
+
+  if [ $? -gt 0 ] ; then
+    echo "IGCM_sys_SendMail : erreur."
+    IGCM_debug_Exit "IGCM_sys_SendMail"
+  fi
+  IGCM_debug_PopStack "IGCM_sys_SendMail"
 }
 
@@ -241,21 +307,21 @@
 #D-
 function IGCM_sys_Mkdir {
-    IGCM_debug_PushStack "IGCM_sys_Mkdir" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Mkdir :" $@
-    fi
-    if [ ! -d ${1} ]; then
-      \mkdir -p $1
-      if [ $? -gt 0 ] ; then
-        echo "IGCM_sys_Mkdir : erreur."
-        IGCM_debug_Exit "IGCM_sys_Mkdir"
-      fi
-    fi
-    # vérification :
-    if [ ! -d ${1} ] ; then
+  IGCM_debug_PushStack "IGCM_sys_Mkdir" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Mkdir :" $@
+  fi
+  if [ ! -d ${1} ]; then
+    \mkdir -p $1
+    if [ $? -gt 0 ] ; then
       echo "IGCM_sys_Mkdir : erreur."
       IGCM_debug_Exit "IGCM_sys_Mkdir"
     fi
-    IGCM_debug_PopStack "IGCM_sys_Mkdir"
+  fi
+  # vérification :
+  if [ ! -d ${1} ] ; then
+    echo "IGCM_sys_Mkdir : erreur."
+    IGCM_debug_Exit "IGCM_sys_Mkdir"
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Mkdir"
 }
 
@@ -266,16 +332,17 @@
 #D-
 function IGCM_sys_MkdirArchive {
-    IGCM_debug_PushStack "IGCM_sys_MkdirArchive" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_MkdirArchive :" $@
-    fi
-    #- creation de repertoire sur le serveur fichier
-    mkdir -p $1
-
-    if [ $? -gt 0 ] ; then
-      echo "IGCM_sys_MkdirArchive : erreur."
-      IGCM_debug_Exit "IGCM_sys_MkdirArchive"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_MkdirArchive"
+  IGCM_debug_PushStack "IGCM_sys_MkdirArchive" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_MkdirArchive :" $@
+  fi
+  #- creation de repertoire sur le serveur fichier
+  mkdir -p $1
+  status=$?
+
+  if [ ${status} -gt 0 ] ; then
+    IGCM_debug_Print 2 "IGCM_sys_MkdirArchive : mkdir failed error code ${status}"
+    IGCM_debug_Exit "IGCM_sys_MkdirArchive"
+  fi
+  IGCM_debug_PopStack "IGCM_sys_MkdirArchive"
 }
 
@@ -286,17 +353,17 @@
 #D-
 function IGCM_sys_MkdirWork {
-    IGCM_debug_PushStack "IGCM_sys_MkdirWork" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_MkdirWork :" $@
-    fi
-    #- creation de repertoire sur le serveur fichier
-    if [ ! -d ${1} ]; then
-      \mkdir -p $1
-      if [ $? -gt 0 ] ; then
-        echo "IGCM_sys_MkdirWork : erreur."
-        IGCM_debug_Exit "IGCM_sys_MkdirWork"
-      fi
-    fi
-    IGCM_debug_PopStack "IGCM_sys_MkdirWork"
+  IGCM_debug_PushStack "IGCM_sys_MkdirWork" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_MkdirWork :" $@
+  fi
+  #- creation de repertoire sur le serveur fichier
+  if [ ! -d ${1} ]; then
+    \mkdir -p $1
+    if [ $? -gt 0 ] ; then
+      echo "IGCM_sys_MkdirWork : erreur."
+      IGCM_debug_Exit "IGCM_sys_MkdirWork"
+    fi
+  fi
+  IGCM_debug_PopStack "IGCM_sys_MkdirWork"
 }
 
@@ -307,14 +374,14 @@
 #D-
 function IGCM_sys_Cd {
-    IGCM_debug_PushStack "IGCM_sys_Cd" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Cd :" $@
-    fi
-    \cd $1
-    if [ $? -gt 0 ] ; then
-      echo "IGCM_sys_Cd : erreur."
-      IGCM_debug_Exit "IGCM_sys_Cd"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_Cd"
+  IGCM_debug_PushStack "IGCM_sys_Cd" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Cd :" $@
+  fi
+  \cd $1
+  if [ $? -gt 0 ] ; then
+    echo "IGCM_sys_Cd : erreur."
+    IGCM_debug_Exit "IGCM_sys_Cd"
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Cd"
 }
 
@@ -325,14 +392,14 @@
 #D-
 function IGCM_sys_Chmod {
-    IGCM_debug_PushStack "IGCM_sys_Chmod" -- $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Chmod :" $@
-    fi
-    \chmod $@
-    if [ $? -gt 0 ] ; then
-      echo "IGCM_sys_Chmod : erreur."
-      IGCM_debug_Exit "IGCM_sys_Chmod"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_Chmod"
+  IGCM_debug_PushStack "IGCM_sys_Chmod" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Chmod :" $@
+  fi
+  \chmod $@
+  if [ $? -gt 0 ] ; then
+    echo "IGCM_sys_Chmod : erreur."
+    IGCM_debug_Exit "IGCM_sys_Chmod"
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Chmod"
 }
 
@@ -343,14 +410,14 @@
 #D-
 function IGCM_sys_FileSize {
-    IGCM_debug_PushStack "IGCM_sys_FileSize" $@
-
-    typeset sizeF
-    set +A sizeF -- $( ls -la ${1} )
-    if [ $? -gt 0 ] ; then
-      IGCM_debug_Exit "IGCM_sys_FileSize"
-    fi
-    eval ${2}=${sizeF[4]}
-
-    IGCM_debug_PopStack "IGCM_sys_FileSize"
+  IGCM_debug_PushStack "IGCM_sys_FileSize" $@
+
+  typeset sizeF
+  set +A sizeF -- $( ls -la ${1} )
+  if [ $? -gt 0 ] ; then
+    IGCM_debug_Exit "IGCM_sys_FileSize"
+  fi
+  eval ${2}=${sizeF[4]}
+
+  IGCM_debug_PopStack "IGCM_sys_FileSize"
 }
 
@@ -361,13 +428,13 @@
 #D-
 function IGCM_sys_TestDir {
-    IGCM_debug_PushStack "IGCM_sys_TestDir" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_TestDir :" $@
-    fi
-    typeset ExistFlag
-    ExistFlag=$( [ -d $1 ] && echo 0 || echo 1 )
-    IGCM_debug_PopStack "IGCM_sys_TestDir"
-
-    return ${ExistFlag}
+  IGCM_debug_PushStack "IGCM_sys_TestDir" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_TestDir :" $@
+  fi
+  typeset ExistFlag
+  ExistFlag=$( [ -d $1 ] && echo 0 || echo 1 )
+  IGCM_debug_PopStack "IGCM_sys_TestDir"
+
+  return ${ExistFlag}
 }
 
@@ -378,13 +445,29 @@
 #D-
 function IGCM_sys_TestDirArchive {
-    IGCM_debug_PushStack "IGCM_sys_TestDirArchive" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_TestDirArchive :" $@
-    fi
-    typeset ExistFlag
-    ExistFlag=$( IGCM_sys_RshArchive "[ -d $1 ] && echo 0 || echo 1" )
-    IGCM_debug_PopStack "IGCM_sys_TestDirArchive"
-
-    return ${ExistFlag}
+  IGCM_debug_PushStack "IGCM_sys_TestDirArchive" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_TestDirArchive :" $@
+  fi
+  typeset ExistFlag
+  ExistFlag=$( IGCM_sys_RshArchive "[ -d $1 ] && echo 0 || echo 1" )
+  IGCM_debug_PopStack "IGCM_sys_TestDirArchive"
+  return ${ExistFlag}
+}
+
+#D-#==================================================
+#D-function IGCM_sys_IsFileArchived
+#D-* Purpose: Test file that must NOT EXISTS on Archive
+#D-* Examples:
+#D-
+function IGCM_sys_IsFileArchived {
+  IGCM_debug_PushStack "IGCM_sys_IsFileArchived" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_IsFileArchived :" $@
+  fi
+  typeset IsArchivedFlag
+  IsArchivedFlag=$( [ "X$( echo $1 | grep \/gpfs3 )" != "X" ] && echo 0 || echo 1 )
+  IGCM_debug_PopStack "IGCM_sys_IsFileArchived"
+
+  return ${IsArchivedFlag}
 }
 
@@ -395,10 +478,24 @@
 #D-
 function IGCM_sys_TestFileArchive {
-    IGCM_debug_PushStack "IGCM_sys_TestFileArchive" $@
-    typeset ExistFlag
-    ExistFlag=$( IGCM_sys_RshArchive "[ -f $1 ] && echo 0 || echo 1" )
-    IGCM_debug_PopStack "IGCM_sys_TestFileArchive"
-
-    return ${ExistFlag}
+  IGCM_debug_PushStack "IGCM_sys_TestFileArchive" $@
+  typeset ExistFlag
+  ExistFlag=$( IGCM_sys_RshArchive "[ -f $1 ] && echo 0 || echo 1" )
+  IGCM_debug_PopStack "IGCM_sys_TestFileArchive"
+
+  return ${ExistFlag}
+}
+
+#D-#==================================================
+#D-function IGCM_sys_TestFileBuffer
+#D-* Purpose: Test file that must NOT EXISTS on Buffer
+#D-* Examples:
+#D-
+function IGCM_sys_TestFileBuffer {
+  IGCM_debug_PushStack "IGCM_sys_TestFileBuffer" $@
+  typeset ExistFlag
+  ExistFlag=$( [ -f $1 ] && echo 0 || echo 1 )
+  IGCM_debug_PopStack "IGCM_sys_TestFileBuffer"
+
+  return ${ExistFlag}
 }
 
@@ -409,10 +506,32 @@
 #D-
 function IGCM_sys_CountFileArchive {
-    IGCM_debug_PushStack "IGCM_sys_CountFileArchive" $@
+  IGCM_debug_PushStack "IGCM_sys_CountFileArchive" $@
+  #Command depends on targeted file system
+  DEBUG_sys=false IGCM_sys_IsFileArchived $1
+  if [ $? = 0 ] ; then
     IGCM_sys_RshArchive "ls ${@} 2>/dev/null | wc -l"
-    if [ $? -gt 0 ] ; then
-      echo "IGCM_sys_CountFileArchive : erreur."
-    fi
-    IGCM_debug_PopStack "IGCM_sys_CountFileArchive"
+    status=$?
+  else
+    ls ${@} 2>/dev/null | wc -l
+    status=$?
+  fi
+  if [ ${status} -gt 0 ] ; then
+    echo "IGCM_sys_CountFileArchive : erreur."
+  fi
+  IGCM_debug_PopStack "IGCM_sys_CountFileArchive"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_CountFileBuffer
+#D-* Purpose: Count files on Scratch filesystem
+#D-* Examples:
+#D-
+function IGCM_sys_CountFileBuffer {
+  IGCM_debug_PushStack "IGCM_sys_CountFileBuffer" $@
+  ls ${@} 2>/dev/null | wc -l
+  if [ $? -gt 0 ] ; then
+    echo "IGCM_sys_CountFileBuffer : erreur."
+  fi
+  IGCM_debug_PopStack "IGCM_sys_CountFileBuffer"
 }
 
@@ -423,32 +542,30 @@
 #D-
 function IGCM_sys_Tree {
-    IGCM_debug_PushStack "IGCM_sys_Tree" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Tree :" $@
-    fi
-
-    \ls -r $@
-
-    IGCM_debug_PopStack "IGCM_sys_Tree"
+  IGCM_debug_PushStack "IGCM_sys_Tree" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Tree :" $@
+  fi
+
+  \ls -r $@
+
+  IGCM_debug_PopStack "IGCM_sys_Tree"
 }
 
 #D-#==================================================
 #D-function IGCM_sys_Tar
-#D-* Purpose: master un-tar command
+#D-* Purpose: master tar command
 #D-* Examples:
 #D-
 function IGCM_sys_Tar {
-    IGCM_debug_PushStack "IGCM_sys_Tar" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Tar :" $@
-    fi
-    \tar cvf $@
-    if [ $? -gt 0 ] ; then
-      echo "IGCM_sys_Tar : erreur."
-      IGCM_debug_Exit "IGCM_sys_Tar"
-    fi
-    \tar tvf $1
-
-    IGCM_debug_PopStack "IGCM_sys_Tar"
+  IGCM_debug_PushStack "IGCM_sys_Tar" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Tar :" $@
+  fi
+  \tar cf $@
+  if [ $? -gt 0 ] ; then
+    echo "IGCM_sys_Tar : erreur."
+    IGCM_debug_Exit "IGCM_sys_Tar"
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Tar"
 }
 
@@ -459,14 +576,14 @@
 #D-
 function IGCM_sys_UnTar {
-    IGCM_debug_PushStack "IGCM_sys_UnTar" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_UnTar :" $@
-    fi
-    \tar xvf $1
-    if [ $? -gt 0 ] ; then
-      echo "IGCM_sys_UnTar : erreur."
-      IGCM_debug_Exit "IGCM_sys_UnTar"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_UnTar"
+  IGCM_debug_PushStack "IGCM_sys_UnTar" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_UnTar :" $@
+  fi
+  \tar xvf $1
+  if [ $? -gt 0 ] ; then
+    echo "IGCM_sys_UnTar : erreur."
+    IGCM_debug_Exit "IGCM_sys_UnTar"
+  fi
+  IGCM_debug_PopStack "IGCM_sys_UnTar"
 }
 
@@ -477,17 +594,27 @@
 #D-
 function IGCM_sys_Qsub {
-    IGCM_debug_PushStack "IGCM_sys_Qsub" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Qsub :" $@
-    fi
-    {
-      [ ${#@} = 1 ] &&  { cd $LOADL_STEP_INITDIR ; /usr/lpp/LoadL/full/bin/llsubmit $1 ; ERROR=$? ; cd - ; }
-      [ ${#@} = 2 ] &&  { cd $2 ; /usr/lpp/LoadL/full/bin/llsubmit $1 ; ERROR=$? ; cd - ; }
-    }
-    if [ ${ERROR} -gt 0 ] ; then
-      echo "IGCM_sys_Qsub : erreur $@."
-      IGCM_debug_Exit "IGCM_sys_Qsub"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_Qsub"
+  IGCM_debug_PushStack "IGCM_sys_Qsub" $@
+
+  typeset ERROR
+  ERROR=0
+
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Qsub :" $@
+  fi
+  # We have to change output/error file
+  [ ${#@} = 1 ] &&  REP_FOR_JOB=${SUBMIT_DIR}
+  [ ${#@} = 2 ] &&  REP_FOR_JOB=${2}
+  sed -e "s:\# \@ output *= .*:\# \@ output = ${Script_Output}:" \
+      -e "s:\# \@ error *= .*:\# \@ error = ${Script_Output}:"   \
+      $1 > ${REP_FOR_JOB}/JOB_FOR_IGCM
+  cd $REP_FOR_JOB ; /usr/lpp/LoadL/full/bin/llsubmit JOB_FOR_IGCM ; ERROR=$? ; cd - ;
+
+  if [ ${ERROR} -gt 0 ] ; then
+    echo "IGCM_sys_Qsub : erreur $@"
+    IGCM_debug_Exit "IGCM_sys_Qsub"
+  else
+    IGCM_sys_Rm ${REP_FOR_JOB}/JOB_FOR_IGCM
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Qsub"
 }
 
@@ -498,16 +625,29 @@
 #D-
 function IGCM_sys_QsubPost {
-    IGCM_debug_PushStack "IGCM_sys_QsubPost" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_QsubPost :" $@
-    fi
-    cd ${POST_DIR}
-    /usr/lpp/LoadL/full/bin/llsubmit ${libIGCM_POST}/$1.job
-    cd -
-    if [ $? -gt 0 ] ; then
-      echo "IGCM_sys_QsubPost : erreur " $@
-      IGCM_debug_Exit "IGCM_sys_QsubPost"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_QsubPost"
+  IGCM_debug_PushStack "IGCM_sys_QsubPost" $@
+
+  typeset ERROR
+  ERROR=0
+
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_QsubPost :" $@
+  fi
+  # We have to change output/error file
+  [ ${#@} = 1 ] &&  REP_FOR_JOB=${POST_DIR}
+  [ ${#@} = 2 ] &&  REP_FOR_JOB=${2}
+
+  sed -e "s:\# \@ output *= .*:\# \@ output = ${Script_Post_Output}.out:" \
+      -e "s:\# \@ error *= .*:\# \@ error = ${Script_Post_Output}.out:"   \
+      ${libIGCM_POST}/$1.job > ${REP_FOR_JOB}/JOB_FOR_IGCM
+
+  cd $REP_FOR_JOB ; /usr/lpp/LoadL/full/bin/llsubmit JOB_FOR_IGCM ; ERROR=$? ; cd - ;
+  if [ ${ERROR} -gt 0 ] ; then
+    echo "IGCM_sys_QsubPost : erreur $@."
+    IGCM_debug_Exit "IGCM_sys_QsubPost"
+  else
+    IGCM_sys_Rm ${REP_FOR_JOB}/JOB_FOR_IGCM
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_QsubPost"
 }
 
@@ -523,106 +663,132 @@
 #D-  Error values and explanations can depend on your system version.
 function IGCM_sys_Rsync_out {
-    RET=$1
-    if [ ! $RET ] ; then
-      echo "rsync error !"
-    fi
-
-    if [ $MYLANG = "fr" ]; then
-      case $RET in
-          0)  return ;;
-          1)  echo "Erreur de rsync ; RERR_SYNTAX : "
-            echo "Erreur de syntaxe ou d'utilisation."
-            return;;
-          2)  echo "Erreur de rsync ; RERR_PROTOCOL : "
-            echo "Incompatibilité de protocole."
-            return;;
-          3)  echo "Erreur de rsync ; RERR_FILESELECT 3"
-            echo "Erreurs  lors  de  la  sélection des fichiers d'entrée sortie et"
-            echo "répertoires"
-            return;;
-          4)  echo "Erreur de rsync ; RERR_UNSUPPORTED"
-            echo "Action demandée non supportée : une tentative de manipulation de"
-            echo "fichiers  64-bits  sur une plate-forme qui ne les supporte pas a"
-            echo "été faite ; ou une option qui est supportée par le  client  mais"
-            echo "pas par le serveur a été spécifiée."
-            return;;
-          10) echo "Erreur de rsync ; RERR_SOCKETIO"
-            echo "Erreur dans le socket d'entrée sortie"
-            return;;
-          11) echo "Erreur de rsync ; RERR_FILEIO"
-            echo "Erreur d'entrée sortie fichier"
-            return;;
-          12) echo "Erreur de rsync ; RERR_STREAMIO"
-            echo "Erreur dans flux de donnée du protocole rsync"
-            return;;
-          13) echo "Erreur de rsync ; RERR_MESSAGEIO"
-            echo "Erreur avec les diagnostics du programme"
-            return;;
-          14) echo "Erreur de rsync ; RERR_IPC"
-            echo "Erreur dans le code IPC"
-            return;;
-          20) echo "Erreur de rsync ; RERR_SIGNAL"
-            echo "SIGUSR1 ou SIGINT reçu"
-            return;;
-          21) echo "Erreur de rsync ; RERR_WAITCHILD"
-            echo "Une erreur retournée par waitpid()"
-            return;;
-          22) echo "Erreur de rsync ; RERR_MALLOC"
-            echo "Erreur lors de l'allocation des tampons de mémoire de coeur"
-            return;;
-          23) echo ""
-                echo "Erreur fichier inexistant"
-            return;;
-          30) echo "Erreur de rsync ; RERR_TIMEOUT"
-            echo "Temps d'attente écoulé dans l'envoi/réception de données"
-            return;;
-          *)  echo "Erreur de rsync : code de retour de rsync inconnu :" $RET
-            return;;
-      esac
-    elif [ $MYLANG = "en" ] ; then
-      case $RET in
-          0)  return;;
-          1)  echo "rsync error : Syntax or usage error "
-            return;;
-          2)  echo "rsync error : Protocol incompatibility "
-            return;;
-          3)  echo "rsync error : Errors selecting input/output files, dirs"
-            return;;
-          4)  echo "rsync error : Requested action not supported: an attempt"
-            echo "was made to manipulate 64-bit files on a platform that cannot support"
-            echo "them; or an option was specified that is supported by the client and"
-            echo "not by the server."
-            return;;
-          5)  echo "rsync error : Error starting client-server protocol"
-            return;;
-          10) echo "rsync error : Error in socket I/O "
-            return;;
-          11) echo "rsync error : Error in file I/O "
-            return;;
-          12) echo "rsync error : Error in rsync protocol data stream "
-            return;;
-          13) echo "rsync error : Errors with program diagnostics "
-            return;;
-          14) echo "rsync error : Error in IPC code "
-            return;;
-          20) echo "rsync error : Received SIGUSR1 or SIGINT "
-            return;;
-          21) echo "rsync error : Some error returned by waitpid() "
-            return;;
-          22) echo "rsync error : Error allocating core memory buffers "
-            return;;
-          23) echo "rsync error : Partial transfer due to error"
-            return;;
-          24) echo "rsync error : Partial transfer due to vanished source files"
-            return;;
-          30) echo "rsync error : Timeout in data send/receive "
-            return;;
-          *)  echo "rsync error : return code of rsync unknown :" $RET
-            return;;
-      esac
-    else
-      echo "unknown language $MYLANG."
-      return
-    fi
+  status=$1
+  if [ ! $status ] ; then
+    echo "rsync error !"
+  fi
+
+  if [ $MYLANG = "fr" ]; then
+    case $status in
+    0)  return ;;
+    1)  echo "Erreur de rsync ; RERR_SYNTAX : "
+      echo "Erreur de syntaxe ou d'utilisation."
+      return;;
+    2)  echo "Erreur de rsync ; RERR_PROTOCOL : "
+      echo "Incompatibilité de protocole."
+      return;;
+    3)  echo "Erreur de rsync ; RERR_FILESELECT 3"
+      echo "Erreurs  lors  de  la  sélection des fichiers d'entrée sortie et"
+      echo "répertoires"
+      return;;
+    4)  echo "Erreur de rsync ; RERR_UNSUPPORTED"
+      echo "Action demandée non supportée : une tentative de manipulation de"
+      echo "fichiers  64-bits  sur une plate-forme qui ne les supporte pas a"
+      echo "été faite ; ou une option qui est supportée par le  client  mais"
+      echo "pas par le serveur a été spécifiée."
+      return;;
+    10) echo "Erreur de rsync ; RERR_SOCKETIO"
+      echo "Erreur dans le socket d'entrée sortie"
+      return;;
+    11) echo "Erreur de rsync ; RERR_FILEIO"
+      echo "Erreur d'entrée sortie fichier"
+      return;;
+    12) echo "Erreur de rsync ; RERR_STREAMIO"
+      echo "Erreur dans flux de donnée du protocole rsync"
+      return;;
+    13) echo "Erreur de rsync ; RERR_MESSAGEIO"
+      echo "Erreur avec les diagnostics du programme"
+      return;;
+    14) echo "Erreur de rsync ; RERR_IPC"
+      echo "Erreur dans le code IPC"
+      return;;
+    20) echo "Erreur de rsync ; RERR_SIGNAL"
+      echo "SIGUSR1 ou SIGINT reçu"
+      return;;
+    21) echo "Erreur de rsync ; RERR_WAITCHILD"
+      echo "Une erreur retournée par waitpid()"
+      return;;
+    22) echo "Erreur de rsync ; RERR_MALLOC"
+      echo "Erreur lors de l'allocation des tampons de mémoire de coeur"
+      return;;
+    23) echo ""
+      echo "Erreur fichier inexistant"
+      return;;
+    30) echo "Erreur de rsync ; RERR_TIMEOUT"
+      echo "Temps d'attente écoulé dans l'envoi/réception de données"
+      return;;
+    *)  echo "Erreur de rsync : code de retour de rsync inconnu :" $status
+      return;;
+    esac
+  elif [ $MYLANG = "en" ] ; then
+    case $status in
+    0)  return;;
+    1)  echo "rsync error : Syntax or usage error "
+      return;;
+    2)  echo "rsync error : Protocol incompatibility "
+      return;;
+    3)  echo "rsync error : Errors selecting input/output files, dirs"
+      return;;
+    4)  echo "rsync error : Requested action not supported: an attempt"
+      echo "was made to manipulate 64-bit files on a platform that cannot support"
+      echo "them; or an option was specified that is supported by the client and"
+      echo "not by the server."
+      return;;
+    5)  echo "rsync error : Error starting client-server protocol"
+      return;;
+    10) echo "rsync error : Error in socket I/O "
+      return;;
+    11) echo "rsync error : Error in file I/O "
+      return;;
+    12) echo "rsync error : Error in rsync protocol data stream "
+      return;;
+    13) echo "rsync error : Errors with program diagnostics "
+      return;;
+    14) echo "rsync error : Error in IPC code "
+      return;;
+    20) echo "rsync error : Received SIGUSR1 or SIGINT "
+      return;;
+    21) echo "rsync error : Some error returned by waitpid() "
+      return;;
+    22) echo "rsync error : Error allocating core memory buffers "
+      return;;
+    23) echo "rsync error : Partial transfer due to error"
+      return;;
+    24) echo "rsync error : Partial transfer due to vanished source files"
+      return;;
+    30) echo "rsync error : Timeout in data send/receive "
+      return;;
+    *)  echo "rsync error : return code of rsync unknown :" $status
+      return;;
+    esac
+  else
+    echo "unknown language $MYLANG."
+    return
+  fi
+}
+
+#D-#==================================================
+#D-function IGCM_sys_Miror_libIGCM
+#D-* Purpose: Mirror libIGCM PATH and lib to frontend
+#D-* Examples:
+#D-
+function IGCM_sys_Mirror_libIGCM {
+  IGCM_debug_PushStack "IGCM_sys_Mirror_libIGCM"
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Mirror_libIGCM"
+  fi
+
+  typeset status
+
+  mkdir -p ${HOME}/MIRROR/${PATHlibIGCM}
+
+  echo ${RSYNC} ${RSYNC_opt} ${libIGCM} ${HOME}/MIRROR/${PATHlibIGCM} > out_rsync 2>&1
+  ${RSYNC} ${RSYNC_opt} ${libIGCM} ${HOME}/MIRROR/${PATHlibIGCM} >> out_rsync 2>&1
+  status=$?
+
+  if [ ${status} -gt 0 ] ; then
+    echo "IGCM_sys_Mirror_libIGCM Warning : no libIGCM on frontend."
+    cat out_rsync
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Mirror_libIGCM"
 }
 
@@ -633,21 +799,23 @@
 #D-
 function IGCM_sys_Cp {
-    IGCM_debug_PushStack "IGCM_sys_Cp" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Cp :" $@
-    fi
-
-    typeset RET
-
-    echo cp $@ > out_rsync 2>&1
-    \cp $@ >> out_rsync 2>&1
-    RET=$?
-
-    if [ ${RET} -gt 0 ] ; then
-      echo "IGCM_sys_Cp : error."
-      cat out_rsync
-      IGCM_debug_Exit "IGCM_sys_Cp"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_Cp"
+  IGCM_debug_PushStack "IGCM_sys_Cp" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Cp :" $@
+  fi
+
+  typeset status
+
+  echo cp $@ > out_rsync 2>&1
+  \cp $@ >> out_rsync 2>&1
+  status=$?
+
+  if [ ${status} -gt 0 ] ; then
+    echo "IGCM_sys_Cp : error code ${status}"
+    cat out_rsync
+    IGCM_debug_Exit "IGCM_sys_Cp"
+  else
+    \rm out_rsync
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Cp"
 }
 
@@ -658,21 +826,23 @@
 #D-
 function IGCM_sys_Rm {
-    IGCM_debug_PushStack "IGCM_sys_Rm" -- $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Rm :" $@
-    fi
-
-    typeset RET
-
-    echo rm $@ > out_rsync 2>&1
-    \rm $@ >> out_rsync 2>&1
-    RET=$?
-
-    if [ ${RET} -gt 0 ] ; then
-      echo "IGCM_sys_Rm : error."
-      cat out_rsync
-      IGCM_debug_Exit "IGCM_sys_Rm"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_Rm"
+  IGCM_debug_PushStack "IGCM_sys_Rm" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Rm :" $@
+  fi
+
+  typeset status
+
+  echo rm $@ > out_rsync 2>&1
+  \rm $@ >> out_rsync 2>&1
+  status=$?
+
+  if [ ${status} -gt 0 ] ; then
+    echo "IGCM_sys_Rm : error code ${status}"
+    cat out_rsync
+    IGCM_debug_Exit "IGCM_sys_Rm"
+  else
+    \rm out_rsync
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Rm"
 }
 
@@ -684,24 +854,24 @@
 #D-
 function IGCM_sys_RmRunDir {
-    IGCM_debug_PushStack "IGCM_sys_RmRunDir" -- $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_RmRunDir :" $@
-    fi
-
-    typeset RET
-
-    echo rm $@ > out_rsync 2>&1
-    \rm $@ >> out_rsync 2>&1
-    RET=$?
-
-    if [ ${RET} -gt 0 ] ; then
-      echo "IGCM_sys_RmRunDir : error."
-      cat out_rsync
-      IGCM_debug_Exit "IGCM_sys_RmRunDir"
-    else
-      \rm out_rsync
-    fi
-
-    IGCM_debug_PopStack "IGCM_sys_RmRunDir"
+  IGCM_debug_PushStack "IGCM_sys_RmRunDir" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_RmRunDir :" $@
+  fi
+
+  typeset status
+
+  echo rm $@ > out_rsync 2>&1
+  \rm $@ >> out_rsync 2>&1
+  status=$?
+
+  if [ ${status} -gt 0 ] ; then
+    echo "IGCM_sys_RmRunDir : rm error code is ${status}."
+    cat out_rsync
+    IGCM_debug_Exit "IGCM_sys_RmRunDir"
+  else
+    \rm out_rsync
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_RmRunDir"
 }
 
@@ -712,27 +882,29 @@
 #D-
 function IGCM_sys_Mv {
-    IGCM_debug_PushStack "IGCM_sys_Mv" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Mv :" $@
-    fi
-
-    if [ $DRYRUN = 0 ]; then
-
-        typeset RET
-
-        echo mv $@ > out_rsync 2>&1
-        \mv $@ >> out_rsync 2>&1
-        RET=$?
-
-        if [ ${RET} -gt 0 ] ; then
-            echo "IGCM_sys_Mv : error in mv."
-            cat out_rsync
-            IGCM_debug_Exit "IGCM_sys_Mv"
-        fi
-    else
-        ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
-    fi
-
-    IGCM_debug_PopStack "IGCM_sys_Mv"
+  IGCM_debug_PushStack "IGCM_sys_Mv" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Mv :" $@
+  fi
+
+  if [ $DRYRUN = 0 ]; then
+
+    typeset status
+
+    echo mv $@ > out_rsync 2>&1
+    \mv $@ >> out_rsync 2>&1
+    status=$?
+
+    if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_Mv : error code ${status}"
+      cat out_rsync
+      IGCM_debug_Exit "IGCM_sys_Mv"
+    else
+      \rm out_rsync
+    fi
+  else
+    ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_Mv"
 }
 
@@ -743,67 +915,71 @@
 #D-
 function IGCM_sys_Put_Dir {
-    IGCM_debug_PushStack "IGCM_sys_Put_Dir" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Put_Dir :" $@
-    fi
-    if [ $DRYRUN = 0 ]; then
-      if [ ! -d ${1} ] ; then
-          echo "WARNING : IGCM_sys_Put_Dir ${1} DOES NOT EXIST ."
-          IGCM_debug_PopStack "IGCM_sys_Put_Dir"
-          return
-      fi
-
-      typeset RET
-
-      # Only if we use rsync
-      #IGCM_sys_TestDirArchive $( dirname $2 )
-      #
+  IGCM_debug_PushStack "IGCM_sys_Put_Dir" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Put_Dir :" $@
+  fi
+  if [ $DRYRUN = 0 ]; then
+    if [ ! -d ${1} ] ; then
+      echo "WARNING : IGCM_sys_Put_Dir ${1} DOES NOT EXIST ."
+      IGCM_debug_PopStack "IGCM_sys_Put_Dir"
+      return
+    fi
+
+    typeset status
+
+    # Only if we use rsync
+    #IGCM_sys_TestDirArchive $( dirname $2 )
+    #
+    #USUAL WAY
+    \cp -r $1 $2 > out_rsync 2>&1
+    status=$?
+
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_Put_Dir : cp failed error code ${status}"
+      cat out_rsync
+      IGCM_debug_Exit "IGCM_sys_Put_Dir"
+    else
+      \rm out_rsync
+    fi
+  else
+    ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Put_Dir"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_Get_Dir
+#D-* Purpose: Copy a complete directory from ${ARCHIVE}
+#D-* Examples:
+#D-
+function IGCM_sys_Get_Dir {
+  IGCM_debug_PushStack "IGCM_sys_Get_Dir" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Get_Dir :" $@
+  fi
+  if [ $DRYRUN = 0 ]; then
+    if [ ! -d ${1} ] ; then
+      echo "WARNING : IGCM_sys_Get_Dir ${1} DOES NOT EXIST ."
+      IGCM_debug_PopStack "IGCM_sys_Get_Dir"
+      return
+    fi
+
+    typeset status
+
       #USUAL WAY
-      \cp -r $1 $2 > out_rsync 2>&1
-      RET=$?
-
-      if [ ${RET} -gt 0 ] ; then
-          echo "IGCM_sys_Put_Dir : error."
-          cat out_rsync
-          IGCM_debug_Exit "IGCM_sys_Put_Dir"
-      fi
-    else
-      ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
-    fi
-    IGCM_debug_PopStack "IGCM_sys_Put_Dir"
-}
-
-#D-#==================================================
-#D-function IGCM_sys_Get_Dir
-#D-* Purpose: Copy a complete directory from $(ARCHIVE)
-#D-* Examples:
-#D-
-function IGCM_sys_Get_Dir {
-    IGCM_debug_PushStack "IGCM_sys_Get_Dir" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Get_Dir :" $@
-    fi
-    if [ $DRYRUN = 0 ]; then
-      if [ ! -d ${1} ] ; then
-          echo "WARNING : IGCM_sys_Get_Dir ${1} DOES NOT EXIST ."
-          IGCM_debug_PopStack "IGCM_sys_Get_Dir"
-          return
-      fi
-
-      typeset RET
-
-      #USUAL WAY
-      \cp -rp $1 $2 > out_rsync 2>&1
-      RET=$?
-
-      if [ ${RET} -gt 0 ] ; then
-          echo "IGCM_sys_Get_Dir : error."
-          cat out_rsync
-          IGCM_debug_Exit "IGCM_sys_Get_Dir"
-      fi
-    else
-      ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
-    fi
-    IGCM_debug_PopStack "IGCM_sys_Get_Dir"
+    \cp -rp $1 $2 > out_rsync 2>&1
+    status=$?
+
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_Get_Dir : cp failed error code ${status}"
+      cat out_rsync
+      IGCM_debug_Exit "IGCM_sys_Get_Dir"
+    else
+      \rm out_rsync
+    fi
+  else
+    ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Get_Dir"
 }
 
@@ -814,71 +990,138 @@
 #D-
 function IGCM_sys_Get_Master {
-    IGCM_debug_PushStack "IGCM_sys_Get_Master" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Get_Master :" $@
-    fi
-    if [ $DRYRUN = 0 ]; then
-        if ( [ ! -d ${1} ] && [ ! -f ${1} ] ) ; then
-            echo "WARNING : IGCM_sys_Get_Dir ${1} DOES NOT EXIST ."
-            IGCM_debug_PopStack "IGCM_sys_Get_Dir"
-            return
-        fi
-
-        typeset RET
-
-        #USUAL WAY
-        \cp -rp $1 $2 > out_rsync 2>&1
-        RET=$?
-
-        if [ ${RET} -gt 0 ] ; then
-            echo "IGCM_sys_Get_Dir : error."
-            cat out_rsync
-            IGCM_debug_Exit "IGCM_sys_Get_Dir"
-        fi
-    else
-      ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
-    fi
-    IGCM_debug_PopStack "IGCM_sys_Get_Master"
-}
+  IGCM_debug_PushStack "IGCM_sys_Get_Master" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Get_Master :" $@
+  fi
+  if [ $DRYRUN = 0 ]; then
+    if ( [ ! -d ${1} ] && [ ! -f ${1} ] ) ; then
+      echo "WARNING : IGCM_sys_Get_Master ${1} DOES NOT EXIST ."
+      IGCM_debug_PopStack "IGCM_sys_Get_Master"
+      return
+    fi
+
+    typeset NB_ESSAI DELAI status i
+    # number of tentative
+    NB_ESSAI=3
+    # time delay between tentative
+    DELAI=2
+
+    i=0
+    while [ $i -lt $NB_ESSAI ] ; do
+      \cp -urL $1 $2 > out_rsync 2>&1
+      status=$?
+      if [ ${status} -gt 0 ]; then
+        IGCM_debug_Print 2 "IGCM_sys_Get_Master : cp failed error code ${status} ${i}/${NB_ESSAI}"
+        IGCM_debug_Print 2 "IGCM_sys_Get_Master : sleep ${DELAI} seconds and try again."
+        sleep $DELAI
+      else
+        break
+      fi
+      (( i = i + 1 ))
+    done
+
+    if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_Get_Master : error."
+      cat out_rsync
+      IGCM_debug_Exit "IGCM_sys_Get_Master"
+    else
+      \rm out_rsync
+    fi
+  else
+    ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Get_Master"
+}
+
+#====================================================
+#- Call IGCM_sys_Mirror_libIGCM now !
+if ( $MirrorlibIGCM ) ; then
+  IGCM_sys_Mirror_libIGCM
+fi
 
 #D-#==================================================
 #D-function IGCM_sys_Put_Rest
-#D-* Purpose: Put computied restarts on $(ARCHIVE).
+#D-* Purpose: Put computied restarts on ${ARCHIVE}.
 #D-           File and target directory must exist.
 #D-* Examples:
 #D-
 function IGCM_sys_Put_Rest {
-    IGCM_debug_PushStack "IGCM_sys_Put_Rest" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Put_Rest :" $@
-    fi
-    if [ $DRYRUN = 0 ]; then
-      if [ ! -f ${1} ] ; then
-          echo "ERROR : IGCM_sys_Put_Rest ${1} DOES NOT EXIST ."
-          IGCM_debug_Exit "IGCM_sys_Put_Rest"
-      fi
-
-      typeset RET
-      #
-      if [ X${JobType} = XRUN ] ; then
-          IGCM_sys_Chmod 444 ${1}
-      fi
-      #
-      # Only if we use rsync
-      #IGCM_sys_MkdirArchive $( dirname $2 )
-      #
-      #USUAL WAY
-      \cp $1 $2 > out_rsync 2>&1
-      RET=$?
-
-      if [ ${RET} -gt 0 ] ; then
-          echo "IGCM_sys_Put_Rest : error."
-          cat out_rsync
-          IGCM_debug_Exit "IGCM_sys_Put_Rest"
-      fi
-    else
-      ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
-    fi
-    IGCM_debug_PopStack "IGCM_sys_Put_Rest"
+  IGCM_debug_PushStack "IGCM_sys_Put_Rest" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Put_Rest :" $@
+  fi
+  if [ $DRYRUN = 0 ]; then
+    if [ ! -f ${1} ] ; then
+      echo "ERROR : IGCM_sys_Put_Rest ${1} DOES NOT EXIST ."
+      IGCM_debug_Exit "IGCM_sys_Put_Rest"
+    fi
+
+    typeset status
+    #
+    if [ X${JobType} = XRUN ] ; then
+      IGCM_sys_Chmod 444 ${1}
+    fi
+    #
+    # Only if we use rsync
+    #IGCM_sys_MkdirArchive $( dirname $2 )
+    #
+    #USUAL WAY
+    \cp $1 $2 > out_rsync 2>&1
+    status=$?
+
+    if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_Put_Rest : cp failed error code ${status}"
+      cat out_rsync
+      IGCM_debug_Exit "IGCM_sys_Put_Rest"
+    else
+      \rm out_rsync
+    fi
+  else
+    ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Put_Rest"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_PutBuffer_Rest
+#D-* Purpose: Put computied restarts on ${SCRATCHDIR}.
+#D-           File and target directory must exist.
+#D-* Examples:
+#D-
+function IGCM_sys_PutBuffer_Rest {
+  IGCM_debug_PushStack "IGCM_sys_PutBuffer_Rest" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_PutBuffer_Rest :" $@
+  fi
+  if [ $DRYRUN = 0 ]; then
+    if [ ! -f ${1} ] ; then
+      echo "ERROR : IGCM_sys_PutBuffer_Rest ${1} DOES NOT EXIST ."
+      IGCM_debug_Exit "IGCM_sys_PutBuffer_Rest"
+    fi
+
+    typeset status
+    #
+    if [ X${JobType} = XRUN ] ; then
+      IGCM_sys_Chmod 444 ${1}
+    fi
+
+    #
+    # USUAL WAY
+    \cp $1 $2 > out_rsync 2>&1
+    status=$?
+
+    if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_PutBuffer_Rest : error code ${status}"
+      [ -f ${2} ] && ls -l ${2}
+      [ -f ${2}/${1} ] && ls -l ${2}/${1}
+      cat out_rsync
+      IGCM_debug_Exit "IGCM_sys_PutBuffer_Rest"
+    else
+      \rm out_rsync
+    fi
+  else
+    ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
+  fi
+  IGCM_debug_PopStack "IGCM_sys_PutBuffer_Rest"
 }
 
@@ -896,43 +1139,138 @@
 #D-#==================================================
 #D-function IGCM_sys_Put_Out
-#D-* Purpose: Copy a file on $(ARCHIVE) after have chmod it in readonly
+#D-* Purpose: Copy a file on ${ARCHIVE} after having chmod it in readonly
 #D-* Examples:
 #D-
 function IGCM_sys_Put_Out {
-    IGCM_debug_PushStack "IGCM_sys_Put_Out" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Put_Out :" $@
-    fi
-    if [ $DRYRUN = 0 ]; then
-      if [ ! -f ${1} ] ; then
-          echo "WARNING : IGCM_sys_Put_Out ${1} DOES NOT EXIST ."
-          IGCM_debug_PopStack "IGCM_sys_Put_Out"
-          return 1
+  IGCM_debug_PushStack "IGCM_sys_Put_Out" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Put_Out :" $@
+  fi
+
+  typeset status
+
+  if [ $DRYRUN = 0 ]; then
+    if [ ! -f ${1} ] ; then
+      echo "WARNING : IGCM_sys_Put_Out ${1} DOES NOT EXIST ."
+      IGCM_debug_PopStack "IGCM_sys_Put_Out"
+      return 1
+    fi
+    #
+    IGCM_sys_MkdirArchive $( dirname $2 )
+    #
+    typeset RET
+    #
+    if [ X${JobType} = XRUN ] ; then
+      if [ X${3} = X ] ; then
+        IGCM_sys_Chmod 444 ${1}
       fi
-      #
-      IGCM_sys_MkdirArchive $( dirname $2 )
-      #
-      typeset RET
-      #
+    fi
+    #
+    #USUAL WAY
+    \cp $1 $2 > out_rsync 2>&1
+    status=$?
+
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_Put_Out : cp failed error code ${status}"
+      cat out_rsync
+      IGCM_debug_Exit "IGCM_sys_Put_Out"
+    else
+      \rm out_rsync
+    fi
+  else
+    ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Put_Out"
+  return 0
+}
+
+#D-#==================================================
+#D-function IGCM_sys_PutBuffer_Out
+#D-* Purpose: Copy a file on ${WORKDIR} after having chmod it in readonly
+#D-* Examples:
+#D-
+function IGCM_sys_PutBuffer_Out {
+  IGCM_debug_PushStack "IGCM_sys_PutBuffer_Out" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_PutBuffer_Out :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i exist skip
+
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  if [ $DRYRUN = 0 ]; then
+    if [ ! -f ${1} ] ; then
+      echo "WARNING : IGCM_sys_PutBuffer_Out ${1} DOES NOT EXIST ."
+      IGCM_debug_PopStack "IGCM_sys_PutBuffer_Out"
+      return 1
+    fi
+    #
+    IGCM_sys_Mkdir $( dirname $2 )
+    #
+
+    exist=false
+    skip=false
+    if [ -f $2 ] ; then
+      IGCM_debug_Print 1 "$2 already exist"
+      exist=true
+      if [ "X$( diff $1 $2 )" = X ] ; then
+        IGCM_debug_Print 2 "$1 and $2 are the same file, we skip the copy"
+        status=0
+        skip=true
+      else
+        IGCM_debug_Print 2 "$1 and $2 are not the same file, we force the copy"
+        skip=false
+      fi
+    fi
+    #
+    if ( [ X${exist} = Xtrue ] && [ X${skip} = Xfalse ] ) ; then
+      IGCM_sys_Chmod u+w $2
+    fi
+
+    if [ X${skip} = Xfalse ] ; then
+      i=0
+      while [ $i -lt $NB_ESSAI ] ; do
+        # USUAL WAY
+        \cp $1 $2 > out_rsync 2>&1
+        status=$?
+        if [ ${status} -gt 0 ]; then
+          IGCM_debug_Print 2 "IGCM_sys_PutBuffer_Out : cp failed error code ${status} ${i}/${NB_ESSAI}"
+          IGCM_debug_Print 2 "IGCM_sys_PutBuffer_Out : sleep ${DELAI} seconds and try again."
+          [ -f ${2} ] && ls -l ${2}
+          [ -f ${2}/${1} ] && ls -l ${2}/${1}
+          sleep $DELAI
+        else
+          break
+        fi
+        (( i = i + 1 ))
+      done
+    fi
+
+    if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_PutBuffer_Out : error."
+      [ -f ${2} ] && ls -l ${2}
+      [ -f ${2}/${1} ] && ls -l ${2}/${1}
+      cat out_rsync
+      IGCM_debug_Exit "IGCM_sys_PutBuffer_Out"
+    else
+
       if [ X${JobType} = XRUN ] ; then
-          if [ X${3} = X ] ; then
-            IGCM_sys_Chmod 444 ${1}
-          fi
+        if [ X${3} = X ] ; then
+          [ -f ${2} ] && IGCM_sys_Chmod 444 ${2}
+          [ -f ${2}/${1} ] && IGCM_sys_Chmod 444 ${2}/${1}
+        fi
       fi
-      #
-      #USUAL WAY
-      \cp $1 $2 > out_rsync 2>&1
-      RET=$?
-
-      if [ ${RET} -gt 0 ] ; then
-          echo "IGCM_sys_Put_Out : error."
-          cat out_rsync
-          IGCM_debug_Exit "IGCM_sys_Put_Out"
-      fi
-    else
-      ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
-    fi
-    IGCM_debug_PopStack "IGCM_sys_Put_Out"
-    return 0
+
+      \rm out_rsync
+    fi
+  else
+    ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
+  fi
+  IGCM_debug_PopStack "IGCM_sys_PutBuffer_Out"
+  return 0
 }
 
@@ -943,56 +1281,147 @@
 #D-            IGCM_sys_Get /l Array_contain_myfiles /destpath/
 function IGCM_sys_Get {
-    IGCM_debug_PushStack "IGCM_sys_Get" $@
-
-    typeset DEST RET dm_liste ifile target
-
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_Get :" $@
-    fi
-    if [ $DRYRUN -le 2 ]; then
-      if [ X${1} = X'/l' ] ; then
-            # test if the first file is present in the old computation :
-          eval set +A dm_liste \${${2}}
+  IGCM_debug_PushStack "IGCM_sys_Get" $@
+
+  typeset DEST status dm_liste
+
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Get :" $@
+  fi
+  if [ $DRYRUN -le 2 ]; then
+    if [ X${1} = X'/l' ] ; then
+      # test if the first file is present in the old computation :
+      eval set +A dm_liste \${${2}}
+    else
+      dm_liste=${1}
+    fi
+    eval DEST=\${${#}}
+
+    # test if the (first) file is present in the old computation :
+    DEBUG_sys=false IGCM_sys_IsFileArchived ${dm_liste[0]}
+    if [ $? = 0 ] ; then
+      IGCM_sys_TestFileArchive ${dm_liste[0]}
+      status=$?
+    else
+      IGCM_sys_TestFileBuffer ${dm_liste[0]}
+      status=$?
+    fi
+
+    if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_Get, ERROR : regular file ${dm_liste[0]} DOES NOT EXIST ."
+      IGCM_debug_Exit "IGCM_sys_Get"
+      return
+    fi
+
+    # SD : dm_liste is not suited for computing job
+    #      because we change filename during transfert
+    #      dm_liste is better suited for post-treatment
+    #dm_liste=" "
+    #(( ifile=1 ))
+    #while [ $ifile -lt $# ] ; do
+    #    dm_liste=$( eval echo ${dm_liste} " "\${${ifile}} )
+    #    (( ifile = ifile + 1 ))
+    #done
+    #DEST=$( eval echo \${${#}} )
+
+    #USUAL WAY
+    \cp ${dm_liste[*]} ${DEST} > out_rsync 2>&1
+    status=$?
+
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_Get : cp failed error code ${status}"
+      cat out_rsync
+      IGCM_debug_Exit "IGCM_sys_Get"
+    else
+      \rm out_rsync
+    fi
+  else
+    ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Get"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_GetBuffer
+#D-* Purpose: Get a file from ${SCRATCHDIR}
+#D-* Examples: IGCM_sys_GetBuffer myfile /destpath/myfile_with_PREFIX
+#D-            IGCM_sys_GetBuffer /l Array_contain_myfiles /destpath/
+function IGCM_sys_GetBuffer {
+  IGCM_debug_PushStack "IGCM_sys_GetBuffer" $@
+
+  typeset DEST buf_liste target file_work
+  typeset NB_ESSAI DELAI status i
+
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_GetBuffer :" $@
+  fi
+
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  if [ $DRYRUN -le 2 ]; then
+    if [ X${1} = X'/l' ] ; then
+      # test if the first file is present in the old computation :
+      eval set +A buf_liste \${${2}}
+    else
+      eval set +A buf_liste ${1}
+    fi
+    eval DEST=\${${#}}
+
+    #USUAL WAY
+    if [ X${1} = X'/l' ] ; then
+      for target in ${buf_liste[*]} ; do
+        local_file=$( basename ${target} )
+        i=0
+        while [ $i -lt $NB_ESSAI ] ; do
+          \cp ${target} ${DEST}/${local_file} >> out_rsync 2>&1
+          status=$?
+          if [ ${status} -gt 0 ]; then
+            IGCM_debug_Print 2 "IGCM_sys_GetBuffer : cp failed error code ${status} ${i}/${NB_ESSAI}"
+            IGCM_debug_Print 2 "IGCM_sys_GetBuffer : sleep ${DELAI} seconds and try again."
+            sleep $DELAI
+          else
+            break
+          fi
+          (( i = i + 1 ))
+        done
+        if [ ${status} -gt 0 ] ; then
+          echo "IGCM_sys_Get : error"
+          cat out_rsync
+          \rm out_rsync
+          IGCM_debug_Exit "IGCM_sys_GetBuffer"
+        else
+          \rm out_rsync
+        fi
+      done
+    else
+      i=0
+      while [ $i -lt $NB_ESSAI ] ; do
+        \cp ${buf_liste} ${DEST} >> out_rsync 2>&1
+        status=$?
+        if [ ${status} -gt 0 ]; then
+          IGCM_debug_Print 2 "IGCM_sys_GetBuffer : cp failed error code ${status} ${i}/${NB_ESSAI}"
+          IGCM_debug_Print 2 "IGCM_sys_GetBuffer : sleep ${DELAI} seconds and try again."
+          sleep $DELAI
+        else
+          break
+        fi
+        (( i = i + 1 ))
+      done
+      if [ ${status} -gt 0 ] ; then
+        echo "IGCM_sys_Get : error"
+        cat out_rsync
+        \rm out_rsync
+        IGCM_debug_Exit "IGCM_sys_GetBuffer"
       else
-          dm_liste=${1}
+        \rm out_rsync
       fi
-      eval DEST=\${${#}}
-
-        # test if the (first) file is present in the old computation :
-      IGCM_sys_TestFileArchive ${dm_liste[0]}
-      RET=$?
-        if [ ${RET} -gt 0 ] ; then
-          echo "IGCM_sys_Get, ERROR : regular file ${dm_liste[0]} DOES NOT EXIST ."
-          IGCM_debug_Exit "IGCM_sys_Get"
-          return
-        fi
-
-      # SD : dm_liste is not suited for computing job
-      #      because we change filename during transfert
-      #      dm_liste is better suited for post-treatment
-      #dm_liste=" "
-      #(( ifile=1 ))
-      #while [ $ifile -lt $# ] ; do
-      #    dm_liste=$( eval echo ${dm_liste} " "\${${ifile}} )
-      #    (( ifile = ifile + 1 ))
-      #done
-      #DEST=$( eval echo \${${#}} )
-
-      #USUAL WAY
-      \cp ${dm_liste[*]} ${DEST} > out_rsync 2>&1
-      RET=$?
-
-      if [ ${RET} -gt 0 ] ; then
-          echo "IGCM_sys_Get : copy error."
-          cat out_rsync
-          IGCM_debug_Exit "IGCM_sys_Get"
-      fi
-    else
-      ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
-    fi
-    IGCM_debug_PopStack "IGCM_sys_Get"
-}
-
-############################################################## A FINIR !!
+    fi
+  else
+    ( ${DEBUG_debug} ) && echo "DRYRUN mode = " $DRYRUN >> stack
+  fi
+  IGCM_debug_PopStack "IGCM_sys_GetBuffer"
+}
 
 #D-#==================================================
@@ -1002,10 +1431,10 @@
 #D-
 function IGCM_sys_GetDate_FichWork {
-    IGCM_debug_PushStack "IGCM_sys_FichWork" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_GetDate_FichWork :" $@
-    fi
-    # donne la date filesys d'un fichier sur la machine work
-    IGCM_debug_PopStack "IGCM_sys_FichWork"
+  IGCM_debug_PushStack "IGCM_sys_FichWork" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_GetDate_FichWork :" $@
+  fi
+  # donne la date filesys d'un fichier sur la machine work
+  IGCM_debug_PopStack "IGCM_sys_FichWork"
 }
 
@@ -1016,9 +1445,22 @@
 #D-
 function IGCM_sys_GetDate_FichArchive {
-    IGCM_debug_PushStack "IGCM_sys_FichArchive" $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_GetDate_FichArchive :" $@
-    fi
-    IGCM_debug_PopStack "IGCM_sys_FichArchive"
+  IGCM_debug_PushStack "IGCM_sys_FichArchive" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_GetDate_FichArchive :" $@
+  fi
+  IGCM_debug_PopStack "IGCM_sys_FichArchive"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_Put_Dods
+#D-* Purpose: Put ${ARCHIVE} files on DODS internet protocole. Dummy function here
+#D-* Examples:
+#D-
+function IGCM_sys_Put_Dods {
+  IGCM_debug_PushStack "IGCM_sys_Put_Dods" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_Put_Dods :" $@
+  fi
+  IGCM_debug_PopStack "IGCM_sys_Put_Dods"
 }
 
@@ -1026,16 +1468,142 @@
 # REBUILD OPERATOR
 
+#D-#==================================================
+#D-function IGCM_sys_rebuild
+#D-* Purpose: rebuild parallel files
+#D-* Examples:
+#D-
 function IGCM_sys_rebuild {
-    IGCM_debug_PushStack "IGCM_sys_rebuild" -- $@
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_rebuild :" $@
-    fi
-    /gpfs1/home/sebastien/REBUILD/rebuild -f -o $@
-    if [ $? -gt 0 ] ; then
-       echo "IGCM_sys_rebuild : erreur ${@}."
-       IGCM_debug_Exit "rebuild"
-    fi
-
-    IGCM_debug_PopStack "IGCM_sys_rebuild"
+  IGCM_debug_PushStack "IGCM_sys_rebuild" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_rebuild :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i firstArg
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    /gpfs1/home/sebastien/REBUILD/rebuild -f -o $@ > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_rebuild : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_rebuild : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      firstArg=${1}
+      \rm ${firstArg}
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+    echo "IGCM_sys_rebuild : rebuild error code is ${status}"
+    IGCM_debug_Exit "rebuild"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_rebuild"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_rebuild_station
+#D-* Purpose: rebuild parallel files describing station 
+#D-* Examples:
+#D-
+function IGCM_sys_rebuild_station {
+  IGCM_debug_PushStack "IGCM_sys_rebuild_station" -- $@
+  typeset i list_opt file_in file_out prefix_invert list_invert
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_rebuild_station :" $@
+  fi
+  list_opt=$@
+
+  # Invert Axis : t,x -> x,t
+  #               t,pres,x -> x,t,pres
+  # So that we can concatenate along x
+  i=0
+  for file_in in ${list_opt} ; do
+    (( i = i + 1))
+    [ ${i} = 1 ] && file_out=${file_in} && continue
+    prefix_invert=$( basename ${file_in} .nc )
+    IGCM_sys_ncpdq -a x,time_counter -a x,time_counter,presnivs ${file_in} ${prefix_invert}_xt.nc
+    list_invert[${#list_invert[*]}]=${prefix_invert}_xt.nc
+  done
+
+  # Concatenate
+  IGCM_sys_ncrcat ${list_invert[*]} histstn_xt.nc
+
+  # Re-ivert file
+  IGCM_sys_ncpdq -a time_counter,x -a time_counter,presnivs,x histstn_xt.nc ${file_out}
+
+  # Station re-ordering is too expansive to be run within libICGM
+  # This is due to (ncpdq - nrcat - ncpdq) I/O sequence.
+  # This re-ordering must be done "in memory" by the cmorization process
+  # Anyway this is the best sequence using (ncpdq - nrcat - ncpdq)
+  # BEGIN reordering
+
+  # Only LMDZ text output contains the exact ordering of the station.
+  # We isolate this in the code below:
+  #  0  38  -157.5000000000000  70.98591549295774
+  #  0  54  27.49999999999999   67.18309859154928
+  #  0  56  -62.50000000000001  82.39436619718309
+  #  0  79  12.49999999999999   78.59154929577466
+  #  0  116 -165.0000000000000  76.05633802816901
+  #  0  117 130.0000000000000   70.98591549295774
+  #  0  118 110.0000000000000   87.46478873239437
+  #  1  40  4.999999999999995   51.97183098591550
+#  typeset iStation iProc list_opt file_in file_out prefix_invert
+#  typeset -Z4 j4
+#  typeset -Z3 j3
+
+#  unset list_opt
+#  set +A list_opt $@
+
+  # Filename after rebuild
+#  file_out=${list_opt[0]}
+  # Prefix of output files
+#  prefix_invert=$( basename ${file_out} .nc )
+  # Number of procs
+#  num_proc=$( grep -i mpi_size ${PREFIX}_${Exe_Output} | wc -l )
+
+#  iProc=0
+#  while [ ${iProc} -lt ${num_proc} ] ; do
+    # Array containing Station as a number
+#    unset proc_stn
+#    set +A proc_stn $( grep "iophy_mpi rank ip lon lat  $iProc" ${PREFIX}_${Exe_Output} | sed -e "s/iophy_mpi rank ip lon lat //g" | awk ' {print $2}' )
+    # Number of stations produced by processor proc
+#    stationLast=${#proc_stn[*]}
+    # Proc number on 4 digits
+#    j4=${iProc}
+    # Init
+#    iStation=0
+#    while [ ${iStation} -lt ${stationLast} ] ; do
+      # Station number on 3 digits
+#      j3=${proc_stn[${iStation}]}
+      # Extract station
+      # Invert Axis : t,x -> x,t
+      #               t,pres,x -> x,t,pres
+      # So that we can concatenate along x
+#      IGCM_sys_ncpdq -a x,time_counter -a x,time_counter,presnivs -d x,$iStation,$iStation ${prefix_invert}_${j4}.nc ${prefix_invert}_stn_${j3}.nc
+#      (( iStation = iStation + 1 ))
+#    done
+#    (( iProc = iProc + 1 ))
+#  done
+
+  # Concatenate all station along x
+#  IGCM_sys_ncrcat ${prefix_invert}_stn_???.nc ${prefix_invert}_xt.nc
+
+  # Re-invert file
+#  IGCM_sys_ncpdq -a time_counter,x -a time_counter,presnivs,x ${prefix_invert}_xt.nc ${file_out}
+
+  # END reordering
+
+  IGCM_debug_PopStack "IGCM_sys_rebuild_station"
 }
 
@@ -1043,9 +1611,14 @@
 # Activate Running Environnment Variables
 
+#D-#==================================================
+#D-function IGCM_sys_desactiv_variables
+#D-* Purpose: set environement variables prior to execution
+#D-* Examples:
+#D-
 function IGCM_sys_activ_variables {
-    IGCM_debug_PushStack "IGCM_sys_activ_variables"
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_activ_variables "
-    fi
+  IGCM_debug_PushStack "IGCM_sys_activ_variables"
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_activ_variables "
+  fi
 
 # --------------------------------------------------------------------
@@ -1057,6 +1630,5 @@
 # --------------------------------------------------------------------
 
-    IGCM_debug_PopStack "IGCM_sys_activ_variables"
-
+  IGCM_debug_PopStack "IGCM_sys_activ_variables"
 }
 
@@ -1064,9 +1636,14 @@
 # Desactivate Running Environnment Variables
 
+#D-#==================================================
+#D-function IGCM_sys_desactiv_variables
+#D-* Purpose: unset environement variables after execution
+#D-* Examples:
+#D-
 function IGCM_sys_desactiv_variables {
-    IGCM_debug_PushStack "IGCM_sys_desactiv_variables"
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_desactiv_variables "
-    fi
+  IGCM_debug_PushStack "IGCM_sys_desactiv_variables"
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_desactiv_variables "
+  fi
 # --------------------------------------------------------------------
 #D- MPI specifications
@@ -1077,63 +1654,811 @@
 # --------------------------------------------------------------------
 
-    IGCM_debug_PopStack "IGCM_sys_desactiv_variables"
-
+  IGCM_debug_PopStack "IGCM_sys_desactiv_variables"
 }
 
 ############################################################
-# Build run file
-
+# Build MPI/OMP scripts run file (dummy function)
+
+#D-#==================================================
+#D-function IGCM_sys_build_run_file
+#D-* Purpose: build run file (deprecated)
+#D-* Examples:
+#D-
 function IGCM_sys_build_run_file {
-    IGCM_debug_PushStack "IGCM_sys_build_run_file" $@
-set -x
+
+IGCM_debug_Print 3 " dummy function : IGCM_sys_build_run_file "
+
+}
+
+############################################################
+# Build MPI/OMP scripts
+
+#D-#==================================================
+#D-function IGCM_sys_build_execution_scripts
+#D-* Purpose: build execution scripts to be launch by ${HOST_MPIRUN_COMMAND}
+#D-* Examples:
+#D-
+function IGCM_sys_build_execution_scripts
+{
+  IGCM_debug_PushStack "IGCM_sys_build_execution_scripts" $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_build_execution_scripts " $@
+  fi
+
+  typeset NbNodes_Job NbProc_Job comp_proc_mpi_loc comp_proc_omp_loc mpi_count
+
+  if [ ! -f ${SUBMIT_DIR}/Job_${config_UserChoices_JobName} ]  ; then
+    IGCM_debug_Exit "IGCM_sys_iitm build_execution_scripts : Job_${config_UserChoices_JobName} don't exist in SUBMIT_DIR : ${SUBMIT_DIR} "
+  fi
+
+  if ( ${OK_PARA_MPMD} ) ; then
+
+    if [ -f run_file ] ; then
+      IGCM_sys_Rm -f run_file
+    fi
+    touch run_file
+
+    if ( ${OK_PARA_OMP} ) ; then
+# NEW : 2 Noeuds
+# @ task_geometry={(0)(1,2,3)}
+# Nombre de processus demandes
+      echo "Job_${config_UserChoices_JobName} includes task_geometry = \c"
+      cat ${SUBMIT_DIR}/Job_${config_UserChoices_JobName} | grep "task_geometry" | sed -e "s/[^(]*([^(]*/(/g"
+      echo "Job_${config_UserChoices_JobName} includes task_geometry  with NbNodes = \c"
+      cat ${SUBMIT_DIR}/Job_${config_UserChoices_JobName} | grep "task_geometry" | sed -e "s/[^(]*([^(]*/(/g" | wc -c
+      NbNodes_Job=$(( $( cat ${SUBMIT_DIR}/Job_${config_UserChoices_JobName} | grep "task_geometry" | sed -e "s/[^(]*([^(]*/(/g" | wc -c ) - 1 ))
+
+      if [ ${NbNodes_Job} -eq 0 ] ; then
+        IGCM_debug_Print 2 "Error in Job_${config_UserChoices_JobName} ressources : no task_geometry defined with OpenMP run."
+        exit 1
+      fi
+    else
+
+# OLD :
+# @ total_tasks = 3
+# @ environment = "BATCH_NUM_PROC_TOT=3"
+# Pas d OpenMP
+# @ resources = ConsumableCpus(1)
+
+      echo "Job_${config_UserChoices_JobName} includes total_tasks = \c"
+      cat ${SUBMIT_DIR}/Job_${config_UserChoices_JobName} | grep "total_tasks" | sed -e "s/.*total_tasks = //"
+      NbProc_Job=$( cat ${SUBMIT_DIR}/Job_${config_UserChoices_JobName} | grep "total_tasks" | sed -e "s/.*total_tasks = //" )
+      NbProc_Job=${NbProc_Job:=0}
+      if [ ${NbProc_Job} -eq 0 ] ; then
+        IGCM_debug_Print 2 "Error in Job_${config_UserChoices_JobName} ressources : no total_tasks defined with MPI only run."
+        exit 1
+      fi
+      if ( $( egrep '^# *@ *resources *= *ConsumableCpus\(1\)' ${SUBMIT_DIR}/Job_${config_UserChoices_JobName} >/dev/null 2>&1 ) ) ; then
+        IGCM_debug_Print 2 "ressources =  ConsumableCpus(1) line found into Job_${config_UserChoices_JobName}"
+      else
+        IGCM_debug_Print 2 "Error in Job_${config_UserChoices_JobName} ressources = line not found. Job should include resources = ConsumableCpus(1) "
+        exit 1
+      fi
+    fi
+
+# run_file construction
+
+# Then first loop on the components for the coupler ie oasis
+
+### the coupler ie oasis must be the first one
+    for comp in ${config_ListOfComponents[*]} ; do
+
+      eval ExeNameIn=\${config_Executable_${comp}[0]}
+      eval ExeNameOut=\${config_Executable_${comp}[1]}
+
+      # for CPL component only
+      if [ "X${comp}" = "XCPL" ] ; then
+
+        eval comp_proc_mpi_loc=\${${comp}_PROC_MPI}
+        eval comp_proc_omp_loc=\${${comp}_PROC_OMP}
+
+        if ( ${OK_PARA_MPI} ) ; then
+
+          (( mpi_count = 1 ))
+          until [ ${mpi_count} -gt ${comp_proc_mpi_loc} ] ; do
+            if ( ${OK_PARA_OMP} ) ; then
+              echo "env OMP_NUM_THREADS=${comp_proc_omp_loc} ./${ExeNameOut} " >> run_file
+            else
+              echo "./${ExeNameOut}" >> run_file
+            fi
+            (( mpi_count = mpi_count + 1 ))
+          done
+        else
+          if ( ${OK_PARA_OMP} ) ; then
+            echo "env OMP_NUM_THREADS=${comp_proc_omp_loc} ./${ExeNameOut} " >> run_file
+          else
+            echo "./${ExeNameOut} " >> run_file
+          fi
+        fi
+      fi
+    done
+
+# Then second loop on the components
+
+    for comp in ${config_ListOfComponents[*]} ; do
+
+      eval ExeNameIn=\${config_Executable_${comp}[0]}
+      eval ExeNameOut=\${config_Executable_${comp}[1]}
+
+      # Only if we really have an executable for the component and not the coupler ie oasis:
+      if ( [ "X${ExeNameOut}" != X\"\" ] && [ "X${comp}" != "XCPL" ] ) ; then
+
+        eval comp_proc_mpi_loc=\${${comp}_PROC_MPI}
+        eval comp_proc_omp_loc=\${${comp}_PROC_OMP}
+
+        if ( ${OK_PARA_MPI} ) ; then
+
+          (( mpi_count = 1 ))
+          until [ ${mpi_count} -gt ${comp_proc_mpi_loc} ] ; do
+            if ( ${OK_PARA_OMP} ) ; then
+              echo "env OMP_NUM_THREADS=${comp_proc_omp_loc} ./${ExeNameOut} " >> run_file
+            else
+              echo "./${ExeNameOut}" >> run_file
+            fi
+            (( mpi_count = mpi_count + 1 ))
+          done
+        else
+          if ( ${OK_PARA_OMP} ) ; then
+            echo "env OMP_NUM_THREADS=${comp_proc_omp_loc} ./${ExeNameOut} " >> run_file
+          else
+                    # to be tested : no MPI only OpenMP into MPMD mode
+            echo "./${ExeNameOut} " >> run_file
+          fi
+        fi
+      fi
+    done
+
+    EXECUTION="${HOST_MPIRUN_COMMAND} -pgmmodel mpmd -cmdfile ./run_file"
+
+    IGCM_sys_Chmod u+x run_file
     if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_build_run_file " $@
-    fi
-
-    NUM_PROC_OASIS=1
-
-    # Set the number of processors for OCE here
-    NUM_PROC_OCE=5
-
-    (( NUM_PROC_ATM = BATCH_NUM_PROC_TOT - NUM_PROC_OASIS - NUM_PROC_OCE ))
-
-    if [ $1 = MPI2 ]; then
-       echo "IGCM_sys_build_run_file : error - MPI2 not available on iitm. "
-       IGCM_debug_Exit "IGCM_sys_build_run_file"
-    elif [ $1 = MPI1 ]; then
-      cat <<EOF > run_file
-./oasis
-EOF
-
-      typeset i
-      (( i = 0 ))
-      while [ ${i} -lt ${NUM_PROC_ATM} ] ; do
-        (( i = i + 1 ))
-        cat <<EOF >> run_file
-./lmdz.x
-EOF
-      done
-
-        (( i = 0 ))
-        while [ ${i} -lt ${NUM_PROC_OCE} ] ; do
-          (( i = i + 1 ))
-          cat <<EOF >> run_file
-./opa.xx
-EOF
-        done
-
-      wc -l run_file
-    fi
-set +x
-    IGCM_debug_PopStack "IGCM_sys_build_run_file"
+      echo "run_file contains : "
+      cat run_file
+    fi
+
+  else # Only one executable. launch it.
+
+    for comp in ${config_ListOfComponents[*]} ; do
+
+      # Only if we really have an executable for the component :
+      eval ExeNameOut=\${config_Executable_${comp}[1]}
+      if ( [ "X${ExeNameOut}" != X\"\" ] && [ "X${ExeNameOut}" != "Xinca.dat" ] ) ; then
+        EXECUTION="${HOST_MPIRUN_COMMAND} ./${ExeNameOut}"
+      fi
+
+    done
+
+  fi
+
+  IGCM_debug_Print 1 "sys iitm : execution command is "
+  IGCM_debug_Print 1 "$EXECUTION"
+
+  IGCM_debug_PopStack "IGCM_sys_build_execution_scripts"
 }
 
 ############################################################
-# Check of space available on temporary filesytems
+# Check of space available on temporary filesytems. Dummy function here
+
+#D-#==================================================
+#D-function IGCM_sys_check_quota. Dummy call here
+#D-* Purpose: check user quota. Stop the simulation if quota above 90%
+#D-* Examples:
+#D-
 function IGCM_sys_check_quota {
-    IGCM_debug_PushStack "IGCM_sys_check_quota"
-    if ( $DEBUG_sys ) ; then
-      echo "IGCM_sys_check_quota"
-    fi
-    IGCM_debug_PopStack "IGCM_sys_check_quota"
-}
+  IGCM_debug_PushStack "IGCM_sys_check_quota"
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_check_quota"
+  fi
+  IGCM_debug_PopStack "IGCM_sys_check_quota"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_CountJobInQueue
+#D-* Purpose: Check if job_name is currently
+#D-  running or in queue
+#D-* Examples: IGCM_sys_CountJobInQueue ${JobName} NbRun
+#D-
+function IGCM_sys_CountJobInQueue {
+  IGCM_debug_PushStack "IGCM_sys_CountJobInQueue"
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_CountJobInQueue"
+  fi
+
+  # Print only the full (-W) JobName (%jn)
+  NbRun=$( llq -W -f %jn | grep -c "$1" )
+
+  eval ${2}=${NbRun}
+
+  IGCM_debug_PopStack "IGCM_sys_CountJobInQueue"
+}
+
+##############################################################
+# NCO OPERATOR
+
+#D-#==================================================
+#D-function IGCM_sys_ncap2
+#D-* Purpose: encapsulate ncap2 call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncap2 {
+  IGCM_debug_PushStack "IGCM_sys_ncap2" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncap2 :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncap2 "$@" > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncap2 : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncap2 : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncap2 : ncap2 error"
+      IGCM_debug_Exit "ncap2"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncap2"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_ncatted
+#D-* Purpose: encapsulate ncatted call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncatted {
+  IGCM_debug_PushStack "IGCM_sys_ncatted" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncatted :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncatted "$@" > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncatted : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncatted : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncatted : ncatted error"
+      IGCM_debug_Exit "ncatted"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncatted"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_ncbo
+#D-* Purpose: encapsulate ncbo call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncbo {
+  IGCM_debug_PushStack "IGCM_sys_ncbo" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncbo :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncbo $@ > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncbo : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncbo : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncbo : ncbo error"
+      IGCM_debug_Exit "ncbo"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncbo"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_ncdif
+#D-* Purpose: encapsulate ncdiff call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncdiff {
+  IGCM_debug_PushStack "IGCM_sys_ncdiff" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncdiff :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncdiff $@ > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncdiff : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncdiff : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncdiff : ncdiff error"
+      IGCM_debug_Exit "ncdiff"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncdiff"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_ncea
+#D-* Purpose: encapsulate ncea call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncea {
+  IGCM_debug_PushStack "IGCM_sys_ncea" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncea :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncea $@ > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncea : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncea : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncea : ncea error"
+      IGCM_debug_Exit "ncea"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncea"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_ncecat
+#D-* Purpose: encapsulate ncecat call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncecat {
+  IGCM_debug_PushStack "IGCM_sys_ncecat" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncecat :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncecat $@ > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncecat : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncecat : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncecat : ncecat error"
+      IGCM_debug_Exit "ncecat"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncecat"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_ncflint
+#D-* Purpose: encapsulate ncflint call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncflint {
+  IGCM_debug_PushStack "IGCM_sys_ncflint" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncflint :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncflint $@ > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncflint : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncflint : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncflint : ncflint error"
+      IGCM_debug_Exit "ncflint"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncflint"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_ncks
+#D-* Purpose: encapsulate ncks call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncks {
+  IGCM_debug_PushStack "IGCM_sys_ncks" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncks :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncks $@ > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncks : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncks : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncks : ncks error"
+      IGCM_debug_Exit "ncks"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncks"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_ncpdq
+#D-* Purpose: encapsulate ncpdq call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncpdq {
+  IGCM_debug_PushStack "IGCM_sys_ncpdq" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncpdq :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncpdq $@ > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncpdq : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncpdq : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncpdq : ncpdq error"
+      IGCM_debug_Exit "ncpdq"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncpdq"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_ncra
+#D-* Purpose: encapsulate ncra call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncra {
+  IGCM_debug_PushStack "IGCM_sys_ncra" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncra :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncra $@ > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncra : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncra : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncra : ncra error"
+      IGCM_debug_Exit "ncra"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncra"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_ncrcat
+#D-* Purpose: encapsulate ncrcat call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncrcat {
+  IGCM_debug_PushStack "IGCM_sys_ncrcat" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncrcat :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i lastArg
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncrcat $@ > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncrcat : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncrcat : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    elif [ ! "X$( grep "WARNING Intra-file non-monotonicity" out_rsync )" = "X" ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncrcat : WARNING Intra-file non-monotonicity"
+      cat out_rsync
+      # remove files having corrupted time axis
+      eval lastArg=\${$#}
+      IGCM_debug_Print 2 "IGCM_sys_ncrcat : Delete ${lastArg}"
+      \rm ${lastArg}
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncrcat : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncrcat : ncrcat error"
+      #IGCM_debug_Exit "ncrcat"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncrcat"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_ncrename
+#D-* Purpose: encapsulate ncrename call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncrename {
+  IGCM_debug_PushStack "IGCM_sys_ncrename" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncrename :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncrename $@ > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncrename : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncrename : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncrename : ncrename error"
+      IGCM_debug_Exit "ncrename"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncrename"
+}
+
+#D-#==================================================
+#D-function IGCM_sys_ncwa
+#D-* Purpose: encapsulate ncwa call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_ncwa {
+  IGCM_debug_PushStack "IGCM_sys_ncwa" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_ncwa :" $@
+  fi
+
+  typeset NB_ESSAI DELAI status i
+  # number of tentative
+  NB_ESSAI=3
+  # time delay between tentative
+  DELAI=2
+
+  i=0
+  while [ $i -lt $NB_ESSAI ] ; do
+    ncwa $@ > out_rsync 2>&1
+    status=$?
+    if [ ${status} -gt 0 ] ; then
+      IGCM_debug_Print 2 "IGCM_sys_ncwa : error code ${status}"
+      cat out_rsync
+      \rm out_rsync
+      IGCM_debug_Print 2 "IGCM_sys_ncwa : ${i}/${NB_ESSAI} sleep ${DELAI} seconds and try again."
+      sleep $DELAI
+    else
+      \rm out_rsync
+      break
+    fi
+    (( i = i + 1 ))
+  done
+
+  if [ ${status} -gt 0 ] ; then
+      echo "IGCM_sys_ncwa : ncwa error"
+      IGCM_debug_Exit "ncwa"
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_ncwa"
+}
+
+##############################################################
+# CDO OPERATOR
+
+#D-#==================================================
+#D-function IGCM_sys_cdo
+#D-* Purpose: encapsulate cdo call so as to manage error code and retry
+#D-* Examples:
+#D-
+function IGCM_sys_cdo {
+  IGCM_debug_PushStack "IGCM_sys_cdo" -- $@
+  if ( $DEBUG_sys ) ; then
+    echo "IGCM_sys_cdo :" $@
+  fi
+
+  typeset status
+
+  \cdo $@ > out_rsync 2>&1
+  status=$?
+  if [ ${status} -gt 0 ] ; then
+    echo "IGCM_sys_cdo : error code ${status}"
+    cat out_rsync
+    \rm out_rsync
+    IGCM_debug_PopStack "IGCM_sys_cdo"
+    return 1
+  else
+    IGCM_debug_PopStack "IGCM_sys_cdo"
+    return 0
+  fi
+
+  IGCM_debug_PopStack "IGCM_sys_cdo"
+}
