source: tags/libIGCM_v2.0_rc2/AA_create_ts @ 1267

Last change on this file since 1267 was 758, checked in by mafoipsl, 11 years ago

On curie, delete #MSUB -E '--no-requeue' option. The system will requeue jobs automatically.

  • Property licence set to
    The following licence information concerns ONLY the libIGCM tools
    ==================================================================

    Copyright © Centre National de la Recherche Scientifique CNRS
    Commissariat à l'Énergie Atomique CEA

    libIGCM : Library for Portable Models Computation of IGCM Group.

    IGCM Group is the french IPSL Global Climate Model Group.

    This library is a set of shell scripts and functions whose purpose is
    the management of the initialization, the launch, the transfer of
    output files, the post-processing and the monitoring of datas produce
    by any numerical program on any plateforme.

    This software is governed by the CeCILL license under French law and
    abiding by the rules of distribution of free software. You can use,
    modify and/ or redistribute the software under the terms of the CeCILL
    license as circulated by CEA, CNRS and INRIA at the following URL
    "http://www.cecill.info".

    As a counterpart to the access to the source code and rights to copy,
    modify and redistribute granted by the license, users are provided only
    with a limited warranty and the software's author, the holder of the
    economic rights, and the successive licensors have only limited
    liability.

    In this respect, the user's attention is drawn to the risks associated
    with loading, using, modifying and/or developing or reproducing the
    software by the user in light of its specific status of free software,
    that may mean that it is complicated to manipulate, and that also
    therefore means that it is reserved for developers and experienced
    professionals having in-depth computer knowledge. Users are therefore
    encouraged to load and test the software's suitability as regards their
    requirements in conditions enabling the security of their systems and/or
    data to be ensured and, more generally, to use and operate it in the
    same conditions as regards security.

    The fact that you are presently reading this means that you have had
    knowledge of the CeCILL license and that you accept its terms.
  • Property svn:keywords set to Revision Author Date
File size: 33.5 KB
Line 
1#-Q- cesium #!/bin/ksh
2#-Q- cesium ######################
3#-Q- cesium ## CESIUM   CEA ##
4#-Q- cesium ######################
5#-Q- cesium #MSUB -r TS             # Nom du job               
6#-Q- cesium #MSUB -N 1              # Reservation du noeud
7#-Q- cesium #MSUB -n 1              # Reservation du processus
8#-Q- cesium #MSUB -T 86400          # Limite de temps elapsed du job
9#-Q- cesium #MSUB -E "-j o"
10#-Q- cesium #MSUB -E "-S /bin/ksh"
11#-Q- curie ######################
12#-Q- curie ## CURIE   TGCC/CEA ##
13#-Q- curie ######################
14#-Q- curie #MSUB -r TS             # Nom du job               
15#-Q- curie #MSUB -eo
16#-Q- curie #MSUB -n 1              # Reservation du processus
17#-Q- curie #MSUB -T 86400          # Limite de temps elapsed du job
18#-Q- curie #MSUB -q xlarge
19#-Q- curie #MSUB -Q normal
20#-Q- curie set +x
21#-Q- platine #!/usr/bin/ksh
22#-Q- platine ###################
23#-Q- platine ## PLATINE   CEA ##
24#-Q- platine ###################
25#-Q- platine #BSUB -J TS                     # Nom du job
26#-Q- platine #BSUB -N                        # message a la fin du job
27#-Q- platine #BSUB -n 1                      # reservation des processeurs pour le job
28#-Q- platine #BSUB -W 1:00                   # Limite temps
29#-Q- platine #BSUB -q post                   # Passage en queue post
30#-Q- platine #BSUB -L /bin/ksh
31#-Q- sx8brodie #!/bin/ksh
32#-Q- sx8brodie #######################
33#-Q- sx8brodie ## SX8BRODIE   IDRIS ##
34#-Q- sx8brodie #######################
35#-Q- sx8brodie # Temps Elapsed max. d'une requete hh:mm:ss
36#-Q- sx8brodie # @ wall_clock_limit = 20:00:00
37#-Q- sx8brodie # Nom du travail LoadLeveler
38#-Q- sx8brodie # @ job_name   = TS
39#-Q- sx8brodie # Fichier de sortie standard du travail       
40#-Q- sx8brodie # @ output     = $(job_name).$(jobid)
41#-Q- sx8brodie # Fichier de sortie d'erreur du travail
42#-Q- sx8brodie # @ error      =  $(job_name).$(jobid)
43#-Q- sx8brodie # pour recevoir un mail en cas de depassement du temps Elapsed (ou autre pb.)
44#-Q- sx8brodie # @ notification = error
45#-Q- sx8brodie # @ environment  = $DEBUG_debug ; $MODIPSL ; $libIGCM ; $libIGCM_SX ; $SUBMIT_DIR ; $REBUILD_DIR ; $RebuildFromArchive ; $POST_DIR ; $MASTER ; $RebuildFrequency ; $DateBegin ; $PeriodDateBegin ; $PeriodDateEnd ; $NbRebuildDir ; $StandAlone ; $CompletedFlag ; $TsTask ; $CompToRead ; $FlagToRead ; $RESOL_ATM ; $RESOL_OCE ; $RESOL_ICE ; $RESOL_MBG ; $RESOL_SRF ; $RESOL_SBG ; $MASTER
46#-Q- sx8brodie # @ queue
47#-Q- aix6 #!/bin/ksh
48#-Q- aix6 #######################
49#-Q- aix6 ##   VARGAS   IDRIS  ##
50#-Q- aix6 #######################
51#-Q- aix6 # Temps Elapsed max. d'une requete hh:mm:ss
52#-Q- aix6 # @ wall_clock_limit = 20:00:00
53#-Q- aix6 # Nom du travail LoadLeveler
54#-Q- aix6 # @ job_name   = TS
55#-Q- aix6 # Fichier de sortie standard du travail
56#-Q- aix6 # @ output     = $(job_name).$(jobid)
57#-Q- aix6 # Fichier de sortie d'erreur du travail
58#-Q- aix6 # @ error      =  $(job_name).$(jobid)
59#-Q- aix6 # pour recevoir un mail en cas de depassement du temps Elapsed (ou autre pb.)
60#-Q- aix6 # @ notification = error
61#-Q- aix6 # @ environment  = $DEBUG_debug ; $MODIPSL ; $libIGCM ; $libIGCM_SX ; $SUBMIT_DIR ; $REBUILD_DIR ; $RebuildFromArchive ; $POST_DIR ; $MASTER ; $RebuildFrequency ; $DateBegin ; $PeriodDateBegin ; $PeriodDateEnd ; $NbRebuildDir ; $StandAlone ; $CompletedFlag ; $TsTask ; $CompToRead ; $FlagToRead ; $RESOL_ATM ; $RESOL_OCE ; $RESOL_ICE ; $RESOL_MBG ; $RESOL_SRF ; $RESOL_SBG ; $MASTER
62#-Q- aix6 # @ queue
63#-Q- ulam #!/bin/ksh
64#-Q- ulam #######################
65#-Q- ulam ##   ULAM   IDRIS  ##
66#-Q- ulam #######################
67#-Q- ulam # Temps Elapsed max. d'une requete hh:mm:ss
68#-Q- ulam # @ wall_clock_limit = 20:00:00
69#-Q- ulam # Nom du travail LoadLeveler
70#-Q- ulam # @ job_name   = TS
71#-Q- ulam # Fichier de sortie standard du travail
72#-Q- ulam # @ output     = $(job_name).$(jobid)
73#-Q- ulam # Fichier de sortie d'erreur du travail
74#-Q- ulam # @ error      =  $(job_name).$(jobid)
75#-Q- ulam # pour recevoir un mail en cas de depassement du temps Elapsed (ou autre pb.)
76#-Q- ulam # @ notification = error
77#-Q- ulam # @ environment  = $DEBUG_debug ; $MODIPSL ; $libIGCM ; $libIGCM_SX ; $SUBMIT_DIR ; $REBUILD_DIR ; $RebuildFromArchive ; $POST_DIR ; $MASTER ; $RebuildFrequency ; $DateBegin ; $PeriodDateBegin ; $PeriodDateEnd ; $NbRebuildDir ; $StandAlone ; $CompletedFlag ; $TsTask ; $CompToRead ; $FlagToRead ; $RESOL_ATM ; $RESOL_OCE ; $RESOL_ICE ; $RESOL_MBG ; $RESOL_SRF ; $RESOL_SBG ; $MASTER
78#-Q- ulam # @ queue
79#-Q- sx8mercure #!/bin/ksh
80#-Q- sx8mercure ######################
81#-Q- sx8mercure ## SX8MERCURE   CEA ##
82#-Q- sx8mercure ######################
83#-Q- sx8mercure #PBS -N TS                   # Nom du job
84#-Q- sx8mercure #PBS -j o                    # regroupement des stdout et stderr
85#-Q- sx8mercure #PBS -S /usr/bin/ksh         # shell de soumission
86#-Q- sx8mercure #PBS -l memsz_job=1gb        # Limite memoire a 1 Go
87#-Q- sx8mercure #PBS -l cputim_job=24:00:00   # Limite temps a 2 heures
88#-Q- sx8mercure #PBS -q scalaire
89#-Q- sx8mercure #PBS -r n
90#-Q- sx9mercure #!/bin/ksh
91#-Q- sx9mercure ######################
92#-Q- sx9mercure ## SX9MERCURE  CCRT ##
93#-Q- sx9mercure ######################
94#-Q- sx9mercure #PBS -N TS                   # Nom du job
95#-Q- sx9mercure #PBS -j o                    # regroupement des stdout et stderr
96#-Q- sx9mercure #PBS -S /usr/bin/ksh         # shell de soumission
97#-Q- sx9mercure #PBS -l memsz_job=1gb        # Limite memoire a 1 Go
98#-Q- sx9mercure #PBS -l elapstim_req=24:00:00   # Limite temps a 2 heures
99#-Q- sx9mercure #PBS -q scalaire
100#-Q- sx9mercure #PBS -r n
101#-Q- titane #!/bin/ksh
102#-Q- titane ######################
103#-Q- titane ## TITANE   CEA ##
104#-Q- titane ######################
105#-Q- titane #MSUB -r TS             # Nom du job               
106#-Q- titane #MSUB -eo
107#-Q- titane #MSUB -n 1              # Reservation du processus
108#-Q- titane #MSUB -T 86400          # Limite de temps elapsed du job
109#-Q- titane #MSUB -q mono
110#-Q- titane #MSUB -E '-rn'
111#-Q- lxiv8 ######################
112#-Q- lxiv8 ## OBELIX      LSCE ##
113#-Q- lxiv8 ######################
114#-Q- lxiv8 #PBS -N TS
115#-Q- lxiv8 #PBS -m a
116#-Q- lxiv8 #PBS -j oe
117#-Q- lxiv8 #PBS -q medium
118#-Q- lxiv8 #PBS -o TS.$$
119#-Q- lxiv8 #PBS -S /bin/ksh
120#-Q- default #!/bin/ksh
121#-Q- default ##################
122#-Q- default ## DEFAULT HOST ##
123#-Q- default ##################
124
125#**************************************************************
126# Author: Sebastien Denvil
127# Contact: Sebastien.Denvil__at__ipsl.jussieu.fr
128# $Revision::                                          $ Revision of last commit
129# $Author::                                            $ Author of last commit
130# $Date::                                              $ Date of last commit
131# IPSL (2006)
132#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC
133#
134#**************************************************************
135
136#set -eu
137#set -vx
138
139date
140
141#-Q- sx8brodie export OMP_NUM_THREADS=1
142#-Q- aix6 export OMP_NUM_THREADS=1
143#-Q- ulam export OMP_NUM_THREADS=1
144
145#D- Task type (computing or post-processing)
146TaskType=post-processing
147
148########################################################################
149
150#D- Flag to determine if this job in a standalone mode
151#D- Default : value from AA_job if any
152StandAlone=${StandAlone:=true}
153
154#D- Path to libIGCM
155#D- Default : value from AA_job if any
156# WARNING For StandAlone use : To run this script on some machine (ulam and cesium)
157# WARNING you must check MirrorlibIGCM variable in sys library.
158# WARNING If this variable is true, you must use libIGCM_POST path instead
159# WARNING of your running libIGCM directory.
160libIGCM=${libIGCM:=::modipsl::/libIGCM}
161
162#D- Flag to determine allready produced time series. Empty if you start from the beginning
163#D- Default : Value from AA_job if any. Usefull in StandAlone case if you want to continue a time series
164CompletedFlag=${CompletedFlag:=}
165
166#D- Flag to determine task type this script will perform.
167#D- Possible Value : 2D, 3D, Chunck2D, Chunck3D
168#D- Default : Value from AA_job if any. Usefull in StandAlone case.
169TsTask=${TsTask:=2D}
170if [ X${TsTask} = Xempty ] ; then
171    TsTask=""
172fi
173
174#D- Flag to determine if rebuild process has been performed asynchronously
175#D- Possible value true or false.
176#D- If true raw files has allready been patched by rebuild job
177#D- If false create_ts will patch the raw files
178#D- Default : Value from AA_job if any. Usefull in StandAlone case.
179RebuildFrequency=${RebuildFrequency:=true}
180
181#D- Flag to determine job's output directory
182#D- Default : value from libIGCM_post.ksh if any
183POST_DIR=${POST_DIR:=${PBS_O_WORKDIR:=$(pwd)}}
184
185#D- Increased verbosity (1, 2, 3)
186#D- Default : value from AA_job if any
187Verbosity=${Verbosity:=3}
188
189#D- Low level debug : to bypass lib test checks and stack construction
190#D- Default : value from AA_job if any
191DEBUG_debug=${DEBUG_debug:=false}
192
193#D- TEMPORARY Flag to determine atmospheric resolution
194#D- Default : value from atmospheric driver if any
195RESOL_ATM=ALL
196
197#D- Flag to determine surface resolution
198#D- Default : value from surface driver if any
199RESOL_SRF=ALL
200
201#D- Flag to determine surface resolution
202#D- Default : value from surface driver if any
203RESOL_SBG=ALL
204
205#D- TEMPORARY Flag to determine ocean resolution
206#D- Default : value from ocean driver if any
207RESOL_OCE=${RESOL_OCE:=ORCA2}
208
209#D- TEMPORARY Flag to determine ice resolution
210#D- Default : value from ice driver if any
211RESOL_ICE=${RESOL_ICE:=ORCA2}
212
213#D- TEMPORARY Flag to determine marine biogeochemistry resolution
214#D- Default : value from ice driver if any
215RESOL_MBG=${RESOL_MBG:=ORCA2}
216
217########################################################################
218
219. ${libIGCM}/libIGCM_debug/libIGCM_debug.ksh
220      ( ${DEBUG_debug} ) && IGCM_debug_Check
221. ${libIGCM}/libIGCM_card/libIGCM_card.ksh
222     ( ${DEBUG_debug} ) && IGCM_card_Check
223. ${libIGCM}/libIGCM_date/libIGCM_date.ksh
224     ( ${DEBUG_debug} ) && IGCM_date_Check
225#-------
226. ${libIGCM}/libIGCM_sys/libIGCM_sys.ksh
227. ${libIGCM}/libIGCM_config/libIGCM_config.ksh
228
229########################################################################
230
231#set -vx
232
233# Useful cleaning function
234MENAGE () 
235{
236    [ -f $3 ] && ( IGCM_sys_RshArchive rm -f $1/$2 ;)
237}
238
239########################################################################
240
241IGCM_sys_MkdirWork ${RUN_DIR_PATH}
242IGCM_sys_Cd ${RUN_DIR_PATH}
243
244# ------------------------------------------------------------------
245# Test if all was right before proceeding further
246# ------------------------------------------------------------------
247IGCM_debug_Verif_Exit_Post
248
249if [ ${StandAlone} = true ] ; then
250    CARD_DIR=${SUBMIT_DIR}
251else
252    CARD_DIR=${RUN_DIR_PATH}
253    IGCM_sys_Get_Master ${SUBMIT_DIR}/config.card ${RUN_DIR_PATH}
254    IGCM_sys_Get_Master ${SUBMIT_DIR}/run.card    ${RUN_DIR_PATH}
255    IGCM_sys_Get_Master ${SUBMIT_DIR}/COMP        ${RUN_DIR_PATH}
256    IGCM_sys_Get_Master ${SUBMIT_DIR}/POST        ${RUN_DIR_PATH}
257fi
258
259#==================================
260# First of all
261#
262# Read libIGCM compatibility version in config.card
263# Read UserChoices section
264# Read Ensemble section
265# Read Post section
266# Define all netcdf output directories
267#==================================
268IGCM_config_CommonConfiguration ${CARD_DIR}/config.card
269
270#==================================
271# Define default value to keep compatibility with previous card: means before changes due to TGCC
272if [ X${PackDefault} = Xtrue ] ; then
273  [ X${config_Post_PackFrequency} = X ] && config_Post_PackFrequency=${config_Post_RebuildFrequency}
274else
275  config_Post_PackFrequency=NONE
276fi
277
278#==================================
279# If pack is active then PackFrequency overule the config_UserChoices_PeriodLength
280if ( [ ! X${config_Post_PackFrequency} = X${NULL_STR} ] && [ ! X${config_Post_PackFrequency} = XNONE ] ) ; then
281  config_UserChoices_PeriodLength=${config_Post_PackFrequency}
282fi
283
284#
285# Determine component to take care of depending on kind of task create_ts will perform
286#
287[ ${CompToRead} ] && set -A config_ListOfComponents ${CompToRead} || IGCM_card_DefineArrayFromSection ${CARD_DIR}/config.card ListOfComponents
288#
289# Determine period for time series. Default : value from AA_job or from launch_TS if any
290#
291[ X${CompletedFlag} = X ] || CompletedFlag=$( IGCM_date_ConvertFormatToGregorian ${CompletedFlag} )
292
293DateBegin=${DateBegin:=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateBegin} )}
294#
295PeriodDateEnd=${PeriodDateEnd:=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )}
296#
297# Determine Dimension of the produced time series : 2D or 3D
298if (   [ X${TsTask} = XChunck2D ] || [ X${TsTask} = X2D ] ) ; then
299    Dimension=2D
300elif ( [ X${TsTask} = XChunck3D ] || [ X${TsTask} = X3D ] ) ; then
301    Dimension=3D
302else
303    Dimension=""
304fi
305
306# ------------------------------------------------------------------
307#D- Test if all was right before entering the loop
308# ------------------------------------------------------------------
309IGCM_debug_Verif_Exit_Post
310
311########################################################################
312#
313#      Depending on requested time series fill following variables :
314#
315#                           - LISTE_FILE_${comp}[*]
316#                           - LISTE_VARS_${file}[*]
317#                           - LISTE_AXIS_${file}[*]
318#                           - LISTE_PATCH_${file}[*]
319########################################################################
320
321#
322# For each selected component determine which files need post-processing
323#
324DoJob=false
325for comp in ${config_ListOfComponents[*]} ; do
326    #
327    ActiveComp=false
328    #
329    IGCM_card_DefineArrayFromOption ${CARD_DIR}/config.card ListOfComponents ${comp}
330    eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
331    #
332    card=${CARD_DIR}/COMP/${compname}.card
333
334    IGCM_card_DefineArrayFromOption ${card} OutputFiles List
335    #
336    ListFilesName=${compname}_OutputFiles_List
337    eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
338    #
339    if [ X${FileName0} != X${NULL_STR} ] ; then
340        #
341        #IGCM_debug_Print 1 "Component      : ${compname}"
342        #
343        # INITIALISATION
344        #
345        typeset i
346        if [ ${FlagToRead} ] ; then
347            ((NbFiles=${FlagToRead}))
348            ((i=${NbFiles}))
349        else
350            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
351            i=2
352        fi
353        #
354        until [ $i -gt $NbFiles ]; do
355            #
356            eval flag_post=\${${ListFilesName}[$i]} > /dev/null 2>&1
357            #
358            if [ X${flag_post} != XNONE ] ; then
359                #
360                # For each comp and each file who needs post-processing
361                # determine which variables need time series.
362                #
363                FILE=$( echo ${flag_post} | awk "-FPost_" '{print $2}' )
364                IGCM_card_DefineArrayFromOption ${card}    Post_${FILE} TimeSeriesVars${Dimension}
365                IGCM_card_DefineVariableFromOption ${card} Post_${FILE} ChunckJob${Dimension}
366                #
367                # If TimeSeriesVars list is empty we skip
368                #
369                if [ $( eval echo \${${compname}_Post_${FILE}_TimeSeriesVars${Dimension}} ) = ${NULL_STR} ] ; then
370                    #
371                    IGCM_debug_Print 3 "Nothing to do for ${FILE} according to ${card}"
372                    IGCM_debug_Print 3 "TimeSeriesVars${Dimension} for ${FILE} is empty"
373                    (( i=i+3 ))
374                    continue
375                    #
376                fi
377                #
378                # If files/variables has been switch off by ChunckJob${Dimension}=0 we skip
379                #
380                if [ X$( eval echo \${${compname}_Post_${FILE}_ChunckJob${Dimension}} ) = XOFF ] ; then
381                    IGCM_debug_Print 3 "Nothing to do for ${FILE} according to ${card}"
382                    IGCM_debug_Print 3 "ChunckJob${Dimension}=OFF for ${FILE} so it has been switched off"
383                    (( i=i+3 ))
384                    continue
385                fi
386                #
387                # If we are not a Chunck type task, we skip files/variables handled by chunck task
388                #
389                if ( [ ! X${TsTask} = XChunck${Dimension} ] && [ ! X${TsTask} = X ] && [ ! XChunck${Dimension} = XChunck ] ) ; then
390                    if [ ! $( eval echo \${${compname}_Post_${FILE}_ChunckJob${Dimension}} ) = NONE ] ; then
391                        IGCM_debug_Print 3 "Nothing to do for ${FILE} TimeSeriesVars${Dimension} according to ${card}"
392                        IGCM_debug_Print 3 "Let another chunck task do the job $( eval echo \${${compname}_Post_${FILE}_ChunckJob${Dimension}} )"
393                        (( i=i+3 ))
394                        continue
395                    fi
396                fi
397                #
398                # Now on we know we have things to do
399                #
400
401                #
402                #  We need coordinates axis to properly fill produced time series
403                #
404                IGCM_card_DefineArrayFromOption ${card} Post_${FILE} GatherWithInternal
405                #
406                if [ $( eval echo \${${compname}_Post_${FILE}_GatherWithInternal} ) = ${NULL_STR} ] ; then
407                    #
408                    IGCM_debug_Print 1 "ERROR !! We miss coordinate axis for ${FILE} according to ${card}"
409                    IGCM_debug_Print 1 "So no time series will be produced for ${FILE} !!"
410                    (( i=i+3 ))
411                    continue
412                    #
413                fi
414                #
415                # We need LIST of variables not allready produced (useful for standalone mode)
416                #
417                FlagDir=$( echo ${FILE} | awk -F "_" '{print $1}' )
418                case ${FlagDir} in
419                    *Y)  TS_Dir=TS_YE  ;;
420                    *M)  TS_Dir=TS_MO  ;;
421                    *D)  TS_Dir=TS_DA  ;;
422                    HF)  TS_Dir=TS_HF  ;;
423                    3H)  TS_Dir=TS_HF  ;;
424                    INS) TS_Dir=TS_INS ;;
425                esac
426                #
427                count=0
428                for var in $( eval echo \${${compname}_Post_${FILE}_TimeSeriesVars${Dimension}[*]} ) ; do
429                    #
430                    DIRECTORY=${R_SAVE}/${comp}/Analyse/${TS_Dir}
431                    TestedFile=${config_UserChoices_JobName}_${DateBegin}_${PeriodDateEnd}_${FlagDir}_${var}.nc
432                    #
433                    IGCM_sys_TestFileArchive ${DIRECTORY}/${TestedFile}
434                    if [ ! $? = 0 ] ; then
435                        eval set +A LISTE_VARS_${FILE} \${LISTE_VARS_${FILE}[*]} ${var}
436                        ActiveComp=true
437                        (( count = count + 1 ))
438                    fi
439                done
440                #
441                if [ ${count} -gt 0 ] ; then
442                    #
443                    eval set +A LISTE_FILE_${comp} \${LISTE_FILE_${comp}[*]} ${FILE}
444                    eval set +A LISTE_AXIS_${FILE} \${${compname}_Post_${FILE}_GatherWithInternal[*]}
445                    #
446                    if [ ! X${RebuildFrequency} = Xtrue ] ; then
447                        IGCM_card_DefineArrayFromOption ${card} Post_${FILE} Patches
448                        eval set +A LISTE_PATCHES_${FILE} \${${compname}_Post_${FILE}_Patches[*]}
449                        if [ X$( eval echo \${LISTE_PATCHES_${FILE}[0]} ) !=  X${NULL_STR} ]; then
450                            for Patch in $( eval echo \${LISTE_PATCHES_${FILE}[*]} ); do
451                                if [ Xload${Patch} != X ] ; then
452                                    . ${libIGCM}/libIGCM_post/IGCM_${Patch}.ksh
453                                    eval load${Patch}=loaded
454                                fi
455                            done
456                        fi
457                    fi
458                fi
459            fi
460            (( i=i+3 ))
461        done
462    fi
463    #
464    if [ ${ActiveComp} = true ] ; then
465        set +A ActiveListOfComponents ${ActiveListOfComponents[*]} ${comp}
466    fi
467done
468
469set -A config_ListOfComponents ${ActiveListOfComponents[*]}
470[ ! -z "${ActiveListOfComponents}" ] && DoJob=true
471
472########################################################################
473#
474#               IS THERE SOME ALLREADY PRODUCED TIME SERIES ?
475#                 IF SO BRING THEM IN THE WORKING DIRECTORY
476#
477# PS : Keep in mind that IGCM_sys_Get here is a weak link :
478#      - especially for IDRiS
479#      - no special protection against "command too long" !
480#      - libIGCM_sys should handle that or modify following code part
481#
482########################################################################
483
484if [ ${StandAlone} != true ] ; then
485    Running_Flag=$( IGCM_sys_RshMaster "IGCM_card_DefineVariableFromOption \
486       ${SUBMIT_DIR}/run.card PostProcessing TimeSeriesRunning ; \
487       echo \${run_PostProcessing_TimeSeriesRunning}" )
488
489    #if [ X${Running_Flag} = Xy ] ; then
490    #    # Time Series Job allready running
491    #   IGCM_debug_Print 1 "Time Series Job allready running exit"
492    #   exit
493    #fi
494    # Now run.card know we are running
495
496
497
498
499    IGCM_sys_RshMaster IGCM_card_WriteOption ${SUBMIT_DIR}/run.card PostProcessing TimeSeriesRunning "y"
500
501
502
503
504
505    # Get information from last execution
506    #CompletedFlag=$( IGCM_sys_RshMaster \
507    #   "IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card PostProcessing TimeSeriesCompleted ;\
508    #        echo \${run_PostProcessing_TimeSeriesCompleted}" )
509fi
510
511# Is it the first submission or not ?
512
513if ( [ X${CompletedFlag} = X ] || [ X${CompletedFlag} = X$( IGCM_date_AddDaysToGregorianDate ${DateBegin} -1 ) ] ) ; then
514    # First Time Series Submission
515    FIRST_PASS=TRUE
516    Length=$( IGCM_date_DaysInPreviousPeriod ${DateBegin} ${config_UserChoices_PeriodLength} begin)
517    DATE_FIN_JOB_B=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} $(( Length - 1 )) )
518else
519    # Last Completed Time Series
520    FIRST_PASS=FALSE
521    DATE_FIN_JOB_B=${CompletedFlag}
522    date=${DateBegin}_${DATE_FIN_JOB_B}
523    for comp in ${config_ListOfComponents[*]} ; do
524        #
525        IGCM_sys_Mkdir ${RUN_DIR_PATH}/${comp}
526        #
527        IGCM_sys_Cd ${RUN_DIR_PATH}/${comp}
528        #
529        #set -A liste_file
530        unset liste_file
531        #
532        file_path=${R_SAVE}/${comp}/Analyse
533        #
534        i=0
535        file=${NULL_STR}
536        #
537        for file in $( eval echo \${LISTE_FILE_${comp}[*]} ); do
538            #
539            # Determine in which output can we find file
540            # IE : Analyse/TS or Analyse/DA2TS or ...
541            #
542            FlagDir=$( echo ${file} | awk -F "_" '{print $1}' )
543            case ${FlagDir} in
544                *Y)  TS_Dir=TS_YE  ;;
545                *M)  TS_Dir=TS_MO  ;;
546                *D)  TS_Dir=TS_DA  ;;
547                HF)  TS_Dir=TS_HF  ;;
548                3H)  TS_Dir=TS_HF  ;;
549                INS) TS_Dir=TS_INS ;;
550            esac
551            for var in $( eval echo \${LISTE_VARS_${file}[*]} ) ; do
552                #
553                #set +A liste_file ${liste_file[*]} ${file_path}/${TS_Dir}/${config_UserChoices_JobName}_${date}_${FlagDir}_${var}.nc
554                liste_file[${#liste_file[*]}]=${file_path}/${TS_Dir}/${config_UserChoices_JobName}_${date}_${FlagDir}_${var}.nc
555                #
556            done
557        done
558        if [ X${file} != X${NULL_STR} ] ; then
559            IGCM_sys_Get /l liste_file[*] ${RUN_DIR_PATH}/${comp}
560            # Even if some files are missing we tried to continue
561            # Either ListVar in compname.card are asked but not present in original history file
562            # Either a previous TS task failed
563            ExitFlag=false
564            IGCM_debug_Verif_Exit_Post
565        fi
566    done
567    #
568    LEVEL=0
569    #
570fi
571
572########################################################################
573#
574#                          DEFINE LOOP PARAMETERS
575#
576########################################################################
577
578DATE_COUNT=${DATE_FIN_JOB_B}
579DATE_FIN_JOB_B_LOOP=${DATE_FIN_JOB_B}
580
581( [ -n "${LEVEL}" ] && [ ${LEVEL} -eq 0 ] ) && NBRE_FILE_TOT=0 || NBRE_FILE_TOT=1
582
583if [ ${DoJob} = true ] ; then
584    while [ ${DATE_COUNT} -lt ${PeriodDateEnd} ] ; do
585        (( NBRE_FILE_TOT = NBRE_FILE_TOT + 1 ))
586        Length=$( IGCM_date_DaysInNextPeriod ${DATE_COUNT} ${config_UserChoices_PeriodLength} )
587        DATE_COUNT=$( IGCM_date_AddDaysToGregorianDate ${DATE_COUNT} ${Length} )
588    done
589else
590    NBRE_FILE_TOT=0
591fi
592
593if [ ${NBRE_FILE_TOT} -le ${UNIX_MAX_LIMIT} ] ; then
594    NBRE_TOUR=1
595elif [ ${NBRE_FILE_TOT}%${UNIX_MAX_LIMIT} -eq 0 ] ; then
596    let NBRE_TOUR=${NBRE_FILE_TOT}/${UNIX_MAX_LIMIT} 
597else
598    let NBRE_TOUR=${NBRE_FILE_TOT}/${UNIX_MAX_LIMIT}+1
599fi
600
601CURRENT_LOOP=1
602# THIS LOOP GIVES PARAMETERS FOR THE DATE'S LOOP ie : DATE_COURANTE, DATE_FIN.
603# WE HAVE 3 LEVELS
604#    - LEVEL 1 : JUST ONE LOOP TO COMPLETE
605#    - LEVEL 2 : WE ARE IN THE "DEEP" LOOP
606#    - LEVEL 3 : WE ARE IN THE LAST LOOP
607
608while [ ${CURRENT_LOOP} -le  ${NBRE_TOUR} ] ; do
609     
610    if [ ${NBRE_FILE_TOT} -le ${UNIX_MAX_LIMIT} ] ; then 
611        # - LEVEL 1 : JUST ONE LOOP TO COMPLETE
612        NBRE_FILE_LOOP=${NBRE_FILE_TOT}
613
614        if [ ${FIRST_PASS} = TRUE ] ; then
615            DATE_COURANTE=${DATE_FIN_JOB_B_LOOP}
616        else
617            Length=$( IGCM_date_DaysInNextPeriod ${DATE_FIN_JOB_B_LOOP} ${config_UserChoices_PeriodLength} )
618            DATE_COURANTE=$( IGCM_date_AddDaysToGregorianDate ${DATE_FIN_JOB_B_LOOP} ${Length} )
619        fi
620
621        DATE_FIN=${PeriodDateEnd}
622        DATE_FIN_JOB_B_LOOP_PREC=${DATE_FIN_JOB_B_LOOP}
623
624        [ -n "${DATE_LOOP}" ] && DATE_FIN_JOB_B_LOOP=${DATE_LOOP}
625        [ -n "${LEVEL}" ] && FLAG_B="TRUE" || FLAG_B="FALSE"
626
627        LEVEL=1
628        DEPOT="TRUE"     
629    elif [ ${CURRENT_LOOP} -ne  ${NBRE_TOUR} ] ; then
630        # - LEVEL 2 : WE ARE IN THE "DEEP" LOOP
631        NBRE_FILE_LOOP=${UNIX_MAX_LIMIT}
632
633        if [ ! ${FIRST_PASS} = TRUE ] && [ ${CURRENT_LOOP} -eq 1 ] ; then
634            Length=$( IGCM_date_DaysInNextPeriod ${DATE_FIN_JOB_B_LOOP} ${config_UserChoices_PeriodLength} )
635            DATE_COURANTE=$( IGCM_date_AddDaysToGregorianDate ${DATE_FIN_JOB_B_LOOP} ${Length} )
636        elif [ -z "${DATE_COURANTE}" ] ; then
637            DATE_COURANTE=${DATE_FIN_JOB_B}
638        else
639            Length=$( IGCM_date_DaysInNextPeriod ${DATE_FIN} ${config_UserChoices_PeriodLength} )
640            DATE_COURANTE=$( IGCM_date_AddDaysToGregorianDate ${DATE_FIN} ${Length} )
641        fi
642         
643        (( TotLength = 0 ))
644        COMPTEUR=1
645        DATE_LOOP=${DATE_COURANTE}
646
647        while [ ${COMPTEUR} -lt ${NBRE_FILE_LOOP} ] ; do
648            #
649            Length=$( IGCM_date_DaysInNextPeriod ${DATE_LOOP} ${config_UserChoices_PeriodLength} )
650            DATE_LOOP=$( IGCM_date_AddDaysToGregorianDate ${DATE_LOOP} ${Length} )
651            (( TotLength = TotLength + Length ))
652            (( COMPTEUR = COMPTEUR + 1 ))
653            #
654        done # while [ ${COMPTEUR} -le ${NBRE_FILE_LOOP} ] done
655        DATE_FIN=$( IGCM_date_AddDaysToGregorianDate ${DATE_COURANTE} ${TotLength} )
656
657        [ -n "${DATE_LOOP}" ] && DATE_FIN_JOB_B_LOOP_PREC=${DATE_FIN_JOB_B_LOOP} ; DATE_FIN_JOB_B_LOOP=${DATE_LOOP}
658        [ -n "${LEVEL}" ] && [ ${LEVEL} -eq 0 ] && FLAG_B="TRUE" || [ ${CURRENT_LOOP} -gt 1 ] && FLAG_B="TRUE" || FLAG_B="FALSE"
659        DEPOT="FALSE"
660        LEVEL=2
661    else
662        # - LEVEL 3 : WE ARE IN THE LAST LOOP
663        NBRE_FILE_LOOP=$(( ${NBRE_FILE_TOT} % ( ${UNIX_MAX_LIMIT} * ( ${CURRENT_LOOP} - 1 ) ) ))
664        [ ${NBRE_FILE_LOOP} -eq 0 ] && NBRE_FILE_LOOP=${UNIX_MAX_LIMIT}
665
666        Length=$( IGCM_date_DaysInNextPeriod ${DATE_FIN} ${config_UserChoices_PeriodLength} )
667        DATE_COURANTE=$(IGCM_date_AddDaysToGregorianDate ${DATE_FIN} ${Length} )
668        DATE_FIN=${PeriodDateEnd}
669        [ -n "${DATE_LOOP}" ] && DATE_FIN_JOB_B_LOOP_PREC=${DATE_FIN_JOB_B_LOOP} ; DATE_FIN_JOB_B_LOOP=${DATE_LOOP}
670
671        LEVEL=3
672        DEPOT="TRUE"
673        FLAG_B="TRUE"
674    fi
675
676    # THEN FOR EACH FILE TYPE WE LOOP BETWEEN DATE_COURANTE AND DATE_FIN.
677    for comp in ${config_ListOfComponents[*]} ; do
678        #
679        IGCM_sys_Mkdir ${RUN_DIR_PATH}/${comp}
680        #
681        IGCM_sys_Cd ${RUN_DIR_PATH}/${comp}
682        #
683        eval R_OUT_${comp}=${R_SAVE}/${comp}
684        #
685        i=0
686        #
687        for file in $( eval echo \${LISTE_FILE_${comp}[*]} ); do
688            #
689            # Determine in which output can we find file
690            # IE : Output/MO or Output/DA or ...
691            #
692            FlagDir=$( echo ${file} | awk -F "_" '{print $1}' )
693            case ${FlagDir} in
694                *Y)    TS_Dir=TS_YE  ; FreqDir=YE  ;;
695                *M)    TS_Dir=TS_MO  ; FreqDir=MO  ;;
696                *D)    TS_Dir=TS_DA  ; FreqDir=DA  ;;
697                HF)    TS_Dir=TS_HF  ; FreqDir=HF  ;;
698                3H)    TS_Dir=TS_HF  ; FreqDir=HF  ;;
699                INS)   TS_Dir=TS_INS ; FreqDir=INS ;;
700                *) 
701                       IGCM_debug_Print 1 "Error in FlagDir=${FlagDir} for file ${file}."
702                       IGCM_sys_Exit "Job create_ts" ;;
703            esac
704
705            # Initialize array
706            #set -A liste_file
707            #set -A liste_file_tmp
708            unset liste_file
709            unset liste_file_tmp
710            eval file_path=\${R_OUT_${comp}}/Output/${FreqDir}/
711
712            COMPTEUR=1
713            DATE_LOOP=${DATE_COURANTE}
714
715            while [ ${COMPTEUR} -le ${NBRE_FILE_LOOP} ] ; do
716                #
717                Length1=$( IGCM_date_DaysInPreviousPeriod ${DATE_LOOP} ${config_UserChoices_PeriodLength} end)
718                DATE_TAB=$(  IGCM_date_AddDaysToGregorianDate ${DATE_LOOP} $(( 1 - Length1 )) )_${DATE_LOOP}
719
720                Length2=$( IGCM_date_DaysInNextPeriod ${DATE_LOOP} ${config_UserChoices_PeriodLength} )
721                DATE_LOOP=$( IGCM_date_AddDaysToGregorianDate ${DATE_LOOP} ${Length2} )
722
723                #set +A liste_file ${liste_file[*]} ${file_path}${config_UserChoices_JobName}_${DATE_TAB}_${file}.nc
724                #set +A liste_file_tmp ${liste_file_tmp[*]} ${config_UserChoices_JobName}_${DATE_TAB}_${file}.nc
725                liste_file[${#liste_file[*]}]=${file_path}${config_UserChoices_JobName}_${DATE_TAB}_${file}.nc
726                liste_file_tmp[${#liste_file_tmp[*]}]=${config_UserChoices_JobName}_${DATE_TAB}_${file}.nc
727                (( COMPTEUR = COMPTEUR + 1 ))
728                #
729            done # while [ ${COMPTEUR} -le ${NBRE_FILE_LOOP} ] done
730            DATE_LOOP=$( IGCM_date_AddDaysToGregorianDate ${DATE_LOOP} -${Length2} )
731
732            # Get selected files
733            IGCM_sys_Get /l liste_file[*] ${RUN_DIR_PATH}/${comp}
734            IGCM_debug_Verif_Exit_Post
735
736            # Apply IGCM_Patch if needed
737            if [ ! X${RebuildFrequency} = Xtrue ] ; then
738                if [ X$( eval echo \${LISTE_PATCHES_${file}[0]} ) !=  X${NULL_STR} ]; then
739                    for file_t in $( eval echo ${liste_file_tmp[*]} ); do               
740                        for Patch in $( eval echo \${LISTE_PATCHES_${file}[*]} ); do
741                            IGCM_${Patch} ${file_t}
742                            IGCM_debug_Verif_Exit_Post
743                        done
744                    done
745                fi
746            fi
747
748            # WE CAN CONCATENATE FILES AT THIS POINT
749            [ "${FLAG_B}" = "TRUE" ] && DATE_BUILD_B=${DateBegin}_${DATE_FIN_JOB_B_LOOP_PREC}
750            Length=$( IGCM_date_DaysInPreviousPeriod ${DATE_COURANTE} ${config_UserChoices_PeriodLength} end)
751            DATE_BUILD1=$( IGCM_date_AddDaysToGregorianDate ${DATE_COURANTE} -$(( Length - 1 )) )
752            DATE_BUILD=${DATE_BUILD1}_${DATE_FIN}
753            DATE_BUILD_END=${DateBegin}_${DATE_FIN}
754
755            liste_coord=" "
756            for axis in $( eval echo \${LISTE_AXIS_${file}[*]} ); do
757              liste_coord=${liste_coord}${axis}","
758            done
759
760            # Time axis must be the last dimension
761            time_axis=${axis}
762
763            # SWITCH BETWEEN MODEL TO FIT PARTICULAR CASE
764            for var in $( eval echo \${LISTE_VARS_${file}[*]} ) ; do
765                #
766                if [ "${FLAG_B}" = "TRUE" ] ; then
767                    # WE CONCATENATE WITH EXISTING FILES
768                    file1=${config_UserChoices_JobName}_${DATE_BUILD_B}_${FlagDir}_${var}.nc
769                    file_out=${config_UserChoices_JobName}_${DATE_BUILD_END}_${FlagDir}_${var}.nc
770                    IGCM_sys_ncrcat --hst -v ${liste_coord}${var} ${file1} ${liste_file_tmp[*]} ${file_out}
771                    #
772                    IGCM_sys_Rm ${file1}
773                    if [ ! "${DEPOT}" = "TRUE" ] ; then
774                        eval IGCM_sys_Put_Out ${file_out} \${R_OUT_${comp}}/Analyse/${TS_Dir}/${file_out}
775                        # "${file1} = file_before ?
776                        [ ! "${file1}" = "${config_UserChoices_JobName}_${DateBegin}_${DATE_FIN_JOB_B}_${FlagDir}_${var}.nc" ] && eval MENAGE \${R_OUT_${comp}}/Analyse/${TS_Dir} ${file1} ${file_out}
777                    fi
778
779                    ExitFlag=false
780                else
781                    # OR NOT
782                    IGCM_sys_ncrcat --hst -v ${liste_coord}${var} ${liste_file_tmp[*]} ${config_UserChoices_JobName}_${DATE_BUILD}_${FlagDir}_${var}.nc
783                fi
784
785                #
786                if [ "${DEPOT}" = "TRUE" ] ; then
787                    # WE PUT FINAL FILE ON FILE SYSTEM
788                    [ "${FLAG_B}" = "FALSE" ] && file_out=${config_UserChoices_JobName}_${DATE_BUILD}_${FlagDir}_${var}.nc
789                    file_before=${config_UserChoices_JobName}_${DateBegin}_${DATE_FIN_JOB_B}_${FlagDir}_${var}.nc
790                    #
791                    eval IGCM_sys_Put_Out ${file_out} \${R_OUT_${comp}}/Analyse/${TS_Dir}/${file_out}
792                    [ "${FLAG_B}" = "TRUE" ] && eval MENAGE \${R_OUT_${comp}}/Analyse/${TS_Dir} ${file_before} ${file_out}
793                    if [ ! "X${file1}" = "X" ] ; then
794                        [ ! "${file1}" = "${config_UserChoices_JobName}_${DateBegin}_${DATE_FIN_JOB_B}_${FlagDir}_${var}.nc" ] && eval MENAGE \${R_OUT_${comp}}/Analyse/${TS_Dir} ${file1} ${file_out}
795                    fi
796                    #
797                    if ( [ ${FlagDir} = "1M" ] && [ -f ${file_out} ] ) ; then
798                        file_before_YE=${config_UserChoices_JobName}_${DateBegin}_${DATE_FIN_JOB_B}_1Y_${var}.nc
799                        file_out_YE=${config_UserChoices_JobName}_${DATE_BUILD_END}_1Y_${var}.nc
800                        #
801                        # Compute yearly average considering calendar
802                        # and set date of the mid year to 01/07 at 00:00
803                        IGCM_sys_cdo -settime,00:00 -setday,1 -setmon,7 -settunits,days -divdpy -yearsum -muldpm -selvar,${var} ${file_out} ${file_out_YE}
804                        # Extract all ancillary variables except $var, they will be appended after the cdo command
805                        # Needed because cdo applies calculs on all variables
806                        IGCM_sys_ncks -Oh -x -v ${var} ${file_out} ${file_out_YE%%.nc}_tmp1.nc
807                        # This will remove the time axis because cdo rewrites severely with only considered useful variables
808                        IGCM_sys_cdo -mulc,1 ${file_out_YE%%.nc}_tmp1.nc ${file_out_YE%%.nc}_tmp2.nc 2>/dev/null
809                        if [ $? -eq 0 ] ; then
810                                # Now append all ancillary variables if previous cdo operator ok
811                                IGCM_sys_ncks -h -A ${file_out_YE%%.nc}_tmp2.nc ${file_out_YE}
812                        fi
813
814                        # Put global history attribut
815                        IGCM_sys_ncatted -Oh -a history,global,o,c,"build by libIGCM/create_ts" ${file_out_YE}
816                        #
817                        eval IGCM_sys_Put_Out ${file_out_YE} \${R_OUT_${comp}}/Analyse/TS_MO_YE/${file_out_YE}
818                        [ "${FLAG_B}" = "TRUE" ] && eval MENAGE \${R_OUT_${comp}}/Analyse/TS_MO_YE/ ${file_before_YE} ${file_out_YE}
819                        IGCM_sys_Rm ${file_out_YE%%.nc}_tmp*.nc
820                    fi
821                    #
822                    IGCM_sys_Rm ${file_out}
823                    ExitFlag=false
824                    #
825                fi
826                #
827            done     # for var in ${liste_var} ; do
828            IGCM_sys_Rm ${liste_file_tmp[*]}
829        done         # for file in ${liste_file_brut} do
830    done             # for comp in ${config_ListOfComponents[*]} ; do
831    # GO AHEAD IN DEEPEST LOOP
832    (( CURRENT_LOOP = CURRENT_LOOP + 1 ))
833done                 # while [ ${CURRENT_LOOP} -le  ${NBRE_TOUR} ] do
834# FINISH
835
836# DODS copy
837for comp in ${config_ListOfComponents[*]} ; do
838    for TS_Dir in TS_YE TS_MO TS_MO_YE TS_DA TS_HF TS_INS ; do
839        IGCM_sys_TestDirArchive ${R_SAVE}/${comp}/Analyse/${TS_Dir}
840        [ $? = 0 ] && IGCM_sys_Put_Dods ${comp}/Analyse/${TS_Dir}
841    done
842done
843
844export POST_DIR; export SUBMIT_DIR; export libIGCM; export R_INIT; export R_BC; export StandAlone
845export RESOL_ATM; export RESOL_OCE ; export RESOL_ICE ; export RESOL_MBG ; export RESOL_SRF ; export RESOL_SBG
846
847listVarEnv="POST_DIR,SUBMIT_DIR,libIGCM,R_INIT,R_BC,StandAlone,RESOL_ATM,RESOL_OCE,RESOL_ICE,RESOL_MBG,RESOL_SRF,RESOL_SBG"
848export listVarEnv
849
850#D-
851# --------------------------------------------------------------------
852#D- Test if all was right
853# --------------------------------------------------------------------
854IGCM_debug_Verif_Exit_Post
855# --------------------------------------------------------------------
856#D- Submit MONITORING
857# --------------------------------------------------------------------
858if ( [ X${TsTask} = X2D ] || [ X${TsTask} = X3D ] || [ X${TsTask} = X ] ) ; then
859    Script_Post_Output=monitoring.${PeriodDateEnd}
860    IGCM_sys_QsubPost monitoring
861fi
862
863#D-
864# --------------------------------------------------------------------
865#D- Update the run.card
866# --------------------------------------------------------------------
867if [ ${StandAlone} != true ] ; then
868    # Put in run.card end period of time series
869    [ X"${DATE_FIN}" = X ] || IGCM_sys_RshMaster IGCM_card_WriteOption ${SUBMIT_DIR}/run.card PostProcessing TimeSeriesCompleted "${DATE_FIN}"
870    # We have finish the job !
871    IGCM_sys_RshMaster IGCM_card_WriteOption ${SUBMIT_DIR}/run.card PostProcessing TimeSeriesRunning "n"
872fi
873
874# Clean RUN_DIR_PATH (necessary for cesium and titane only)
875IGCM_sys_RmRunDir -Rf ${RUN_DIR_PATH}
876
877date
Note: See TracBrowser for help on using the repository browser.