source: tags/libIGCM_v2.0_rc1/AA_create_ts @ 1456

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