source: trunk/libIGCM/libIGCM_config/libIGCM_config.ksh @ 554

Last change on this file since 554 was 554, checked in by sdipsl, 12 years ago
  • Mechanism in place to submit pack jobs.
  • Add a PackFrequency? ; default to RebuildFrequency? if not present in config.card
  • Add coherence checks between PackFrequency? and relevant dependant frequencies
  • pack_restart and pack_debug ready in batch mode. Testing in progress. Submission is still a comment in libIGCM_post
  • Move and generalize create_ts_next_date from AA_create_ts to libIGCM_date. Rename to IGCM_date_DaysInNextPeriod
  • Move and generalyze create_ts_begin_date from AA_create_ts to libIGCM_date. Rename to IGCM_date_DaysInPreviousPeriod
  • Cosmetics
  • 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: 37.2 KB
Line 
1#!/bin/ksh
2
3#**************************************************************
4# Author: Sebastien Denvil, Martial Mancip
5# Contact: Sebastien.Denvil__at__ipsl.jussieu.fr Martial.Mancip__at__ipsl.jussieu.fr
6# $Revision::                                          $ Revision of last commit
7# $Author::                                            $ Author of last commit
8# $Date::                                              $ Date of last commit
9# IPSL (2006)
10#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC
11#
12#**************************************************************
13
14#===================================
15function IGCM_config_Initialize
16{
17  IGCM_debug_PushStack "IGCM_config_Initialize"
18
19  # Debug Print :
20  echo
21  IGCM_debug_Print 1 "IGCM_config_Initialize"
22
23  if [ ! -r ${SUBMIT_DIR}/run.card ]; then 
24    #================================================#
25    #         The file run.card doesn't exist        #
26    #================================================#
27    FirstInitialize=true
28    #copy initial run.card
29    IGCM_sys_Cp ${SUBMIT_DIR}/run.card.init ${SUBMIT_DIR}/run.card
30    IGCM_debug_Print 2 "run.card copied from run.card.init"
31  else
32    FirstInitialize=false
33    IGCM_debug_Print 2 "run.card exists"
34  fi
35
36  # Test modipsl tree existence.
37  IGCM_sys_TestDir ${MODIPSL}
38  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir"
39  IGCM_sys_TestDir ${libIGCM}
40  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir"
41  IGCM_sys_TestDir ${R_EXE}
42  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir"
43  IGCM_sys_TestDir ${SUBMIT_DIR}
44  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir"
45
46  if ( $DEBUG_debug ) ; then
47    echo "Keep trace of inital SUBMIT_DIR : "
48    ls -lta ${SUBMIT_DIR}
49  fi
50
51  #==================================
52
53  typeset option auxprint CompatibilityTag
54  # Read libIGCM compatibility version in config.card
55  IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Compatibility libIGCM
56  eval CompatibilityTag=${config_Compatibility_libIGCM} > /dev/null 2>&1       
57
58  if [ ! "${CompatibilityTag}" = "${libIGCM_CurrentTag}" ] ; then
59    IGCM_debug_Exit "config.card is not compatible with libIGCM version ${libIGCM_CurrentTag} see libIGCM FAQ http://wiki.ipsl.jussieu.fr/wiki_ipsl/IGCMG/libIGCM/DocUtilisateur/FAQ ."
60  fi
61
62  #==================================
63  IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card UserChoices
64
65  for option in ${config_UserChoices[*]} ; do
66    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card UserChoices ${option}
67  done
68  echo
69  IGCM_debug_Print 1 "DefineArrayFromOption  : config_UserChoices"
70  # Name Space of this experience
71  if [ X${config_UserChoices_SpaceName} != X ] ; then
72    IGCM_debug_PrintVariables 3 config_UserChoices_SpaceName
73  fi
74  # Expericence class of the run
75  if [ X${config_UserChoices_ExperimentName} != X ] ; then
76    IGCM_debug_PrintVariables 3 config_UserChoices_ExperimentName
77  fi
78  IGCM_debug_PrintVariables 3 config_UserChoices_JobName
79  if [ 3 -le ${Verbosity} ] ; then
80    echo "--------------Debug3-->" "config_UserChoices_LongName="
81    echo "--------------Debug3-->" \"${config_UserChoices_LongName}\"
82  fi
83  IGCM_debug_PrintVariables 3 config_UserChoices_TagName
84  IGCM_debug_PrintVariables 3 config_UserChoices_CalendarType
85  IGCM_debug_PrintVariables 3 config_UserChoices_DateBegin
86  IGCM_debug_PrintVariables 3 config_UserChoices_DateEnd
87  IGCM_debug_PrintVariables 3 config_UserChoices_PeriodLength
88
89  #==================================
90
91  IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card ListOfComponents
92  for comp in ${config_ListOfComponents[*]} ; do
93    IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp}
94  done
95
96  echo
97  IGCM_debug_Print 1 "DefineArrayFromSection : ListOfComponents"
98  IGCM_debug_Print 3 ${config_ListOfComponents[*]}
99
100  NbComponents=${#config_ListOfComponents[*]}
101
102  #==================================
103  # Define principal executable
104  IGCM_card_DefineArrayFromSection   ${SUBMIT_DIR}/config.card Executable
105  IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Executable Name
106 
107  #==================================
108  # Define Outputs Name
109  IGCM_debug_Print 2 "Define Script_Output_Prefix and Exe_Output"
110  eval Script_Output_Prefix=${config_UserChoices_Script_Output_Prefix:='Script_Output'}
111  IGCM_debug_Print 3 "Script_Output_Prefix = ${Script_Output_Prefix}"
112  eval Exe_Output=out_${config_Executable_Name}
113  IGCM_debug_Print 3 "Exe_Output           = ${Exe_Output}"
114
115  #==================================
116
117  #===================================================================#
118  # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
119  #             But available to any son functions                    #
120  #===================================================================#
121
122  # Convert yyyy-mm-dd date to gregorian yyyymmdd
123  DateBegin=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateBegin} )
124  DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )
125
126  # Period Length In Days between DateBegin and DateEnd
127  (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
128  if [ ${ExperienceLengthInDays} -lt 0 ] ; then
129    IGCM_debug_Print 1 "Problem with dates in config.card : ${DateEnd} < ${DateBegin} ! You must check that."
130    IGCM_debug_Exit "IGCM_config_Initialize" " Wrong Dates."
131    IGCM_debug_Verif_Exit
132  fi
133
134  # Day and Year of Initial State (Given in julian format)
135  InitDay=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) % 1000 ))
136  InitYear=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) / 1000 ))
137
138  #==================================
139  # Restarts : Gerneral rule or local for each component ?
140  IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card Restarts
141
142  echo
143  IGCM_debug_Print 1 "DefineArrayFromOption : config_Restarts"
144
145  for option in ${config_Restarts[*]} ; do
146    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Restarts ${option}
147    eval auxprint=\${config_Restarts_${option}}
148    IGCM_debug_Print 3 "${option} : ${auxprint}"
149  done
150
151  #================================================================#
152  #                  Test and Prepare directories                  #
153  #================================================================#
154
155  # ==> 4 kinds of input files :
156  #     1) R_INIT  : Initial State Files   (Etat0, carteveg)
157  #     2) R_BC    : Boundary Conditions   (Forcages, lai)
158  #     3) Parameters files (allready define through ${SUBMIT_DIR})
159  #     4) Restarts files   (allready define in IGCM_config_Initialize)
160
161  # Here we offer the possibility to redefine R_INIT, R_BC
162  # and PeriodNb through config.card
163  R_INIT=${config_UserChoices_R_INIT:=${R_IN}/INIT}
164  IGCM_debug_Print 2 "(Re)Define R_INIT, R_BC and PeriodNb"
165  IGCM_debug_Print 3 "R_INIT=${R_INIT}"
166  R_BC=${config_UserChoices_R_BC:=${R_IN}/BC}
167  IGCM_debug_Print 3  "R_BC=${R_BC}"
168  PeriodNb=${config_UserChoices_PeriodNb:=${PeriodNb}}
169  IGCM_debug_Print 3  "Loop in main Job with ${PeriodNb} period(s)"
170
171  # Test Archive input/output.
172  IGCM_sys_TestDirArchive ${ARCHIVE}
173  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
174  IGCM_sys_TestDirArchive ${R_IN}
175  [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
176
177  #====================================================
178  #R_SAVE : Job output directory
179  if ( [ ! X${config_UserChoices_SpaceName} = X ] && [ ! X${config_UserChoices_ExperimentName} = X ] ) ; then
180    FreeName=$( echo ${config_UserChoices_JobName} | sed 's/.*_//' )
181    R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
182    R_BUFR=${R_BUF}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
183    R_DODS=${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
184  else
185    R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
186    R_BUFR=${R_BUF}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
187    R_DODS=${config_UserChoices_TagName}/${config_UserChoices_JobName}
188  fi
189
190  if ( ${FirstInitialize} ) ; then
191    IGCM_sys_MkdirArchive ${R_SAVE}
192    IGCM_sys_Mkdir        ${R_BUFR}
193  else
194    IGCM_sys_TestDirArchive ${R_SAVE}
195    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive ${R_SAVE}"
196
197    IGCM_sys_TestDir        ${R_BUFR}
198    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDir ${R_BUFR}"
199
200    #Test state of run in run.card
201    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState
202   
203    if ( [ ${run_Configuration_PeriodState} != "Start" ] && [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then
204      echo
205      IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!"
206      IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this"
207      IGCM_debug_Exit
208      IGCM_debug_Verif_Exit
209    fi
210  fi
211
212  #==================================
213  # Read Post section:
214  IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card Post
215
216  echo
217  IGCM_debug_Print 1 "DefineArrayFromOption : config_Post"
218
219  for option in ${config_Post[*]} ; do
220    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Post ${option}
221    eval auxprint=\${config_Post_${option}}
222    IGCM_debug_Print 3 "${option} : ${auxprint}"
223  done
224
225  #==================================
226  # Define default value to keep compatibility with previous card: means before changes due to TGCC
227  [ X${config_Post_PackFrequency} = X ] && config_Post_PackFrequency=${config_Post_RebuildFrequency}
228
229  #====================================================
230  # Define REBUILD_DIR : where we store files needing rebuild process
231  if [ X${config_Post_RebuildFromArchive} = Xtrue ] ; then
232    REBUILD_DIR=${R_SAVE}/TMP
233    IGCM_sys_MkdirArchive ${REBUILD_DIR}
234  else
235    REBUILD_DIR=${BIG_DIR}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
236    IGCM_sys_MkdirWork ${REBUILD_DIR}
237  fi
238
239  #====================================================
240  # Experience type : DEB(ug), DEV(elopment), RUN
241  if [ X${JobType} != XRUN ] ; then
242    echo
243    echo "===================================================="
244    echo "libIGCM JOB is NOT in RUN type mode."
245    echo "!! OUTPUT files will NOT be PROTECTED !!"
246    echo "Be carefull : you can ERASE the result of this job !"
247
248    case ${JobType} in
249    DEB)
250      echo "DEBUG mode : activation of 'set -vx' mode."
251      echo "DEBUG mode : no protection for output files."
252      echo "DEBUG mode : if active force asynchronous rebuild frequency to PeriodLength frequency."
253      ;;
254    DEV)
255      echo "DEVelopment mode : no protection for output files."
256      echo "DEVelopment mode : if active force asynchronous rebuild frequency to PeriodLength frequency."
257      ;;
258    esac
259
260    if ( [ X${config_Post_RebuildFrequency} != XNONE ] && [ ${DRYRUN} -eq 0 ] ) ; then
261      if [ X${config_Post_RebuildFrequency} != X${config_UserChoices_PeriodLength} ] ; then
262        echo "------------"
263        echo "WARNING : Job is NOT in RUN mode then we will force REBUILD Frequency"
264        echo "          to PeriodLength : ${config_UserChoices_PeriodLength}"
265        echo "------------"
266        config_Post_RebuildFrequency=${config_UserChoices_PeriodLength}
267      fi
268    fi
269    echo "===================================================="
270    echo
271  fi
272
273  #====================================================
274  #R_OUT_KSH : Storage place for job output
275  #R_OUT_EXE : Storage place for binary used during simulation
276  R_OUT_KSH=${R_SAVE}/Out
277  R_OUT_EXE=${R_SAVE}/Exe
278
279  #====================================================
280  #R_BUF_KSH : Buffer place for job output
281  #R_BUF_EXE : Buffer place for binary used during simulation
282  R_BUF_KSH=${R_BUFR}/Out
283  R_BUF_EXE=${R_BUFR}/Exe
284
285  IGCM_debug_PopStack "IGCM_config_Initialize"
286}
287
288#===================================
289function IGCM_config_Analyse_PeriodLength
290{
291  IGCM_debug_PushStack "IGCM_config_Analyse_PeriodLength"
292
293  typeset i
294
295  # Determine number of day(s) in PeriodLength :
296  case ${config_UserChoices_PeriodLength} in
297  *Y|*y)
298    PeriodLengthInYears=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[yY]//' ) 
299    IGCM_debug_Print 2 "Number of years for PeriodLength : ${PeriodLengthInYears}"
300    PeriodLengthInDays=0
301    i=0
302    until [ $i -ge $PeriodLengthInYears ] ; do 
303      (( PeriodLengthInDays = PeriodLengthInDays + $( IGCM_date_DaysInYear $(( year + i )) ) )) 
304      (( i=i+1 )) 
305    done 
306    ;;
307  *M|*m)
308    PeriodLengthInMonths=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[mM]//' ) 
309    IGCM_debug_Print 2 "Number of months for PeriodLength : ${PeriodLengthInMonths}"
310    PeriodLengthInDays=0
311    i=0
312    until [ $i -ge $PeriodLengthInMonths ] ; do
313      if [ $(( month + i )) -lt 13 ] ; then 
314        (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( month + i )) ) )) 
315      else 
316        (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( month + i - 12 )) ) )) 
317      fi 
318      (( i=i+1 )) 
319    done 
320    ;;
321  *D|*d) 
322    PeriodLengthInMonths=0
323    PeriodLengthInDays=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[dD]//' );;
324  *) 
325    IGCM_debug_Exit "IGCM_config_Analyse_PeriodLength " ${config_UserChoices_PeriodLength} " invalid period length : choose in *Y, *M, *D."
326    IGCM_debug_Verif_Exit ;;
327  esac
328
329  IGCM_debug_PopStack "IGCM_config_Analyse_PeriodLength"
330}
331
332#===================================
333function IGCM_config_Check
334{
335  IGCM_debug_PushStack "IGCM_config_Check"
336
337  # If one of the following modulo is not zero :
338  # we will issue an error then explain and exit in
339  # AA_job IGCM_debug_Verif_Exit call before binary submission
340
341  echo
342  IGCM_debug_Print 1 "IGCM_config_Check"
343  echo
344
345  typeset i
346
347  # Check RebuildFrequency against key frequencies : PeriodLength ; PackFrequency ; TimeSeriesFrequency ; SeasonalFrequency
348  if ( [ ! X${config_Post_RebuildFrequency} = X${NULL_STR} ] && [ ! X${config_Post_RebuildFrequency} = XNONE ] ) ; then
349    AsynchronousRebuild=true
350    IGCM_debug_Print 1 "Asynchronous rebuild has been activated."
351    echo
352    # modulo (RebuildFrequency and PeriodLength/TimeSeriesFrequency/SeasonalFrequency) must be zero
353    IGCM_debug_Print 1 "Check coherence between RebuildFrequency and PeriodLength"
354    IGCM_post_CheckModuloFrequency config_Post_RebuildFrequency config_UserChoices_PeriodLength
355    IGCM_debug_Print 1 "Check coherence between PackFrequency and RebuildFrequency"
356    IGCM_post_CheckModuloFrequency config_Post_PackFrequency config_Post_RebuildFrequency
357    IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and RebuildFrequency"
358    IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_Post_RebuildFrequency
359    IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and RebuildFrequency"
360    IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency config_Post_RebuildFrequency
361  else
362    AsynchronousRebuild=false
363    IGCM_debug_Print 1 "Asynchronous rebuild has not been activated"
364    IGCM_debug_Print 1 "Proceed with standard post-treatment pathway"
365    echo
366    #modulo (PeriodLength and TimeSeriesFrequency/SeasonalFrequency) must be zero
367    IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and PeriodLength"
368    IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_UserChoices_PeriodLength
369    IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and PeriodLength"
370    IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency   config_UserChoices_PeriodLength
371  fi
372
373  # Check PackFrequency against other key frequencies
374  # Modulo (PackFrequency and TimeSeriesFrequency/SeasonalFrequency and PeriodLenght) must be zero
375  if ( [ ! X${config_Post_PackFrequency} = X${NULL_STR} ] && [ ! X${config_Post_PackFrequency} = XNONE ] ) ; then
376    Pack=true
377    #
378    IGCM_debug_Print 1 "Check coherence between PackFrequency and PeriodLength"
379    IGCM_post_CheckModuloFrequency config_Post_PackFrequency config_UserChoices_PeriodLength
380    IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and PackFrequency"
381    IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_Post_PackFrequency
382    IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and PackFrequency"
383    IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency config_Post_PackFrequency
384  else
385    Pack=false
386  fi
387
388  #modulo (TimeSeriesFrequency and all Chunck2D) must be zero
389  NbJob=${#CHUNCK2D_SIZE[@]}
390  i=0
391  until [ $i -ge $NbJob ]; do
392    value=${CHUNCK2D_SIZE[${i}]}
393    IGCM_debug_Print 1 "Check coherence between All Chunck2D frequency and TimeSeriesFrequency"
394    IGCM_post_CheckModuloFrequency value config_Post_TimeSeriesFrequency
395    case ${value} in 
396    *Y|*y) ;;
397    *)  IGCM_debug_Print 1 "All ChunckJob2D frequency must be expressed in year *Y|*y in comp.card"
398      IGCM_debug_Exit "This will stop the job" ;;
399    esac
400    (( i=i+1 ))
401  done
402
403  #modulo (TimeSeriesFrequency and all Chunck3D) must be zero
404  NbJob=${#CHUNCK3D_SIZE[@]}
405  i=0
406  until [ $i -ge $NbJob ]; do
407    value=${CHUNCK3D_SIZE[${i}]}
408    IGCM_debug_Print 1 "Check coherence between All Chunck3D frequency and TimeSeriesFrequency"
409    IGCM_post_CheckModuloFrequency value config_Post_TimeSeriesFrequency
410    case ${value} in 
411    *Y|*y) ;;
412    *)  IGCM_debug_Print 1 "All ChunckJob3D frequency must be expressed in year *Y|*y in comp.card"
413      IGCM_debug_Exit "This will stop the job" ;;
414    esac
415    (( i=i+1 ))
416  done
417
418  IGCM_debug_PopStack "IGCM_config_Check"
419}
420
421#===================================
422function IGCM_config_PeriodStart
423{
424  IGCM_debug_PushStack "IGCM_config_PeriodStart"
425
426  echo
427  IGCM_debug_Print 1 "IGCM_config_PeriodStart"
428  echo
429
430  if ( ${FirstInitialize} ) ; then
431    #================================================#
432    #         Initialize date/period information     #
433    #================================================#
434
435    IGCM_date_GetYearMonthDay $DateBegin year month day
436    IGCM_config_Analyse_PeriodLength
437
438    eval PeriodDateBegin=${DateBegin} > /dev/null 2>&1
439    PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} $(( ${PeriodLengthInDays} - 1 )) )
440    eval CumulPeriod=1 > /dev/null 2>&1
441
442    #=================================================#
443    #              Write updated run.card             #
444    #=================================================#
445
446    #Correct run.card Configuration for this period
447    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
448    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
449    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
450    if [ X$( grep "SubmitPath" ${SUBMIT_DIR}/run.card ) != X ] ; then
451      IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration SubmitPath ${SUBMIT_DIR}
452    fi
453
454    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
455   
456  else
457    #================================================#
458    #         The file run.card allready exist       #
459    #================================================#
460
461    #Test state of run in run.card
462    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState
463    if ( [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then
464      echo
465      IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!"
466      IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this"
467      echo
468      IGCM_debug_Exit
469      IGCM_debug_Verif_Exit
470    fi
471
472    #===================================#
473    #        Read updated run.card      #
474    #===================================#
475
476    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration OldPrefix
477    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin
478    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd
479    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod
480
481    PeriodDateBegin=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateBegin} )
482    PeriodDateEnd=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateEnd} )
483    eval CumulPeriod="${run_Configuration_CumulPeriod}" > /dev/null 2>&1
484
485    LastPeriodDateEnd=$( echo ${run_Configuration_OldPrefix} | sed -e "s/${config_UserChoices_JobName}_//" )
486
487    typeset LastDate
488    set +A LastDate -- $( echo ${LastPeriodDateEnd} | sed -e "s/\([0-9]\{${dY}\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1 \2 \3/" )
489    LastYearDateEnd=${LastDate[0]}
490    LastMonthDateEnd=${LastDate[1]}
491    LastDayDateEnd=${LastDate[2]}
492
493    if [ ${Period} = 1 ]; then
494      # save last Job output
495      typeset LastPeriod iLastPeriod Last_Script_Output_Name
496      (( LastPeriod=CumulPeriod-PeriodNb ))
497      iLastPeriod=$( printf "%06d" ${LastPeriod} )
498      Last_Script_Output_Name="${Script_Output_Prefix}_${config_UserChoices_JobName}.${iLastPeriod}"
499      Last_run_card="run.card.${iLastPeriod}"
500      #eval ls -l ${SUBMIT_DIR}/${Last_Script_Output_Name}
501      #eval IGCM_sys_Put_Out ${SUBMIT_DIR}/${Last_Script_Output_Name} ${R_BUF_KSH}/${Last_Script_Output_Name} > /dev/null 2>&1
502      IGCM_debug_Print 2 "Try to save previous ksh job output"
503      IGCM_sys_Cd ${SUBMIT_DIR}/
504      IGCM_sys_PutBuffer_Out ${Last_Script_Output_Name} ${R_BUF_KSH}/${Last_Script_Output_Name}.$$ rw
505
506      IGCM_card_CheckConflict run.card
507      IGCM_sys_PutBuffer_Out ${SUBMIT_DIR}/run.card ${R_BUF_KSH}/${Last_run_card}.$$ rw
508
509      IGCM_sys_Cd ${RUN_DIR}
510    else
511      unset FileToBeDeleted
512    fi
513
514    IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
515    IGCM_config_Analyse_PeriodLength
516
517    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
518
519  fi   
520  OldPrefix=${config_UserChoices_JobName}_${PeriodDateEnd}
521
522  # BEGIN: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
523  # Compute year_m1 and year_p1 (year minus 1Y and year plus 1Y)
524  year_m1=$(( year - 1 ))
525  year_p1=$(( year + 1 ))       
526  # Compute month_m1 (month minus 1M)
527  # Compute yyyymm_m1 (yyyymm minus 1M)
528  month_m1=$(( month - 1 ))
529  if [ ${month_m1} = 0 ]; then
530    month_m1=12
531    yyyymm_m1=${year_m1}12
532  elif [ ${month_m1} -le 9 ]; then
533    month_m1=0${month_m1}
534    yyyymm_m1=${year}${month_m1}
535  else
536    yyyymm_m1=${year}${month_m1}
537  fi
538  # Compute month_p1 (month plus 1M)
539  # Compute yyyymm_p1 (yyyymm plus 1M)
540  month_p1=$(( month + 1 ))
541  if [ ${month_p1} = 13 ]; then
542    month_p1=01
543    yyyymm_p1=${year_p1}01
544  elif [ ${month_p1} -le 9 ]; then
545    month_p1=0${month_p1}
546    yyyymm_p1=${year}${month_p1}
547  else
548    yyyymm_p1=${year}${month_p1}
549  fi
550  #IGCM_debug_Print 1 "jg 1 month_m1 = ${month_m1} month_p1 = ${month_p1} "
551  #IGCM_debug_Print 1 "jg 1 calculate yyyymm_m1 = ${yyyymm_m1} "
552  #IGCM_debug_Print 1 "jg 1 calculate yyyymm_p1 = ${yyyymm_p1} "
553
554  # END: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
555
556  #===================================================================#
557  # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
558  #             But available to any son functions                    #
559  #===================================================================#
560
561  # Period Length In Days between DateBegin and DateCurrent (at end of period == PeriodDateEnd !)
562  (( SimulationLengthInDays = $( IGCM_date_DaysBetweenGregorianDate ${PeriodDateEnd} ${DateBegin} ) + 1 ))
563
564  # Debug Print :
565  IGCM_debug_Print 1 "IGCM_config_PeriodStart : Before Execution"
566  IGCM_debug_Print 1 "Year of simulation      : ${year}"
567  IGCM_debug_Print 1 "Month of simulation     : ${month}"
568  IGCM_debug_Print 1 "PeriodLengthInDays      : ${PeriodLengthInDays}"
569  IGCM_debug_Print 1 "PeriodDateBegin         : ${PeriodDateBegin}"
570  IGCM_debug_Print 1 "PeriodDateEnd           : ${PeriodDateEnd}"
571  IGCM_debug_Print 1 "SimulationLengthInDays  : ${SimulationLengthInDays}"
572  IGCM_debug_Print 1 "ExperienceLengthInDays  : ${ExperienceLengthInDays}"
573
574  #================================================================#
575  #         Prepare variables available for comp_finalyze          #
576  #================================================================#
577
578  # Period for save files
579  eval DatesPeriod=${PeriodDateBegin}_${PeriodDateEnd} > /dev/null 2>&1
580
581  # Prefix for save files of this period
582  eval PREFIX=${config_UserChoices_JobName}_${DatesPeriod}  > /dev/null 2>&1
583
584  # List of files that will be deleted in RUN_DIR after run
585  [ -f stack ] && FileToBeDeleted[0]="stack"
586
587  # Test if the same run as already been saved :
588  if [ X${JobType} = XRUN ] ; then
589    if [ ${DRYRUN} -le 0 ] ; then
590      if ( IGCM_sys_TestFileBuffer ${R_BUF_KSH}/${PREFIX}_${Exe_Output} ) ; then
591        IGCM_debug_Exit "IGCM_config_PeriodStart" "You are currently RErunning an old job."
592        IGCM_debug_Print 1 "Because of readonly permissions, you can't RErun a job when saved files"
593        IGCM_debug_Print 1 " are still in the ARCHIVE directory. You must deleted those files, or "
594        IGCM_debug_Print 1 " the whole ${R_SAVE} tree. See clean_month.job in ${libIGCM} directory."
595        IGCM_debug_Print 1 " This exit has been initiated because at least ${R_BUF_KSH}/${PREFIX}_${Exe_Output} exists."
596        IGCM_debug_Verif_Exit
597      fi
598    fi
599  else
600    if ( IGCM_sys_TestFileBuffer ${R_BUF_KSH}/${PREFIX}_${Exe_Output} ) ; then
601      IGCM_debug_Print 1 "IGCM_config_PeriodStart" "RErun an old job. Allowed in DEBUG or DEV mode."
602    fi
603  fi
604
605  ExecutionFail=false
606
607  IGCM_debug_PopStack "IGCM_config_PeriodStart"
608}
609
610#===================================
611function IGCM_config_SaveSourceModifications
612{
613  IGCM_debug_PushStack "IGCM_config_SaveSourceModifications"
614
615  typeset ExeOutDateMax listVarEnv
616  ExeOutDateMax=$1
617
618  listVarEnv="ExeOutDateMax,R_OUT_EXE,PREFIX,SUBMIT_DIR"
619  IGCM_sys_RshMaster "\
620    . ${libIGCM}/libIGCM_sys/libIGCM_sys.ksh; \
621    export ExeOutDateMax=${ExeOutDateMax};\
622    export R_OUT_EXE=${R_OUT_EXE};\
623    export PREFIX=${PREFIX};\
624    export SUBMIT_DIR=${SUBMIT_DIR};\
625    export listVarEnv=${listVarEnv};\
626    Script_Output=out_SaveSourceModifications;\
627    IGCM_sys_Qsub ${libIGCM}/SaveSourceModifications.job ${ExeOutDateMax} ${R_OUT_EXE} ${PREFIX} ${SUBMIT_DIR}"
628
629  IGCM_debug_PopStack "IGCM_config_SaveSourceModifications"
630}
631
632#===================================
633function IGCM_config_PeriodEnd
634{
635  IGCM_debug_PushStack "IGCM_config_PeriodEnd"
636
637  echo
638  IGCM_debug_Print 1 "IGCM_config_PeriodEnd"
639  echo
640
641  #==================================#
642  #         Save Job output          #
643  #==================================#
644  IGCM_sys_PutBuffer_Out ${Exe_Output} ${R_BUF_KSH}/${PREFIX}_${Exe_Output}
645  eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}"
646
647      IGCM_card_CheckConflict run.card
648      IGCM_sys_PutBuffer_Out ${SUBMIT_DIR}/run.card ${R_BUF_KSH}/run.card rw
649
650      IGCM_debug_Print 1 "Check components binary : size and creation date"
651
652      typeset LS_comp LS_bin ExeDate ExeCpuLog NextExeSize LastCompExeSize
653      typeset comp i   
654      typeset ExeNameIn ExeNameOut UpdateExe ExeSecDateMax
655
656      #==================================#
657      #        Get last Exe Size         #
658      #==================================#
659
660      (( i=0 ))
661      if ( ${FirstInitialize} ) ; then
662        run_Log_LastExeSize=""
663        for comp in ${config_ListOfComponents[*]} ; do
664          run_Log_LastExeSize[$i]=0
665          (( i=i+1 ))
666        done
667      else
668        IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/run.card Log LastExeSize
669      fi
670      #==================================#
671      #         And Build ExeDate        #
672      #==================================#
673
674      # ExeDate = ATM_Jun_12_09:34-SRF_Jun_12_09:34-OCE_Jun_12_09:34-ICE_Jun_12_09:34-CPL_Jun_12_09:33
675      # Would be nice to have next line but no way to format ls output (need to ls -l --time-style "+%Y-%m-%dT%H:%M")
676      # ExeDate = ATM_2009-06-12T09:34+SRF_2009-06-12T09:34+OCE_2009-06-12T09:34+ICE_2009-06-12T09:34+CPL_2009-06-12T09:34
677      ExeDate=""
678      NextExeSize="( "
679      (( i=0 ))
680      UpdateExe=false
681      (( ExeSecDateMax = 0 ))
682      for comp in ${config_ListOfComponents[*]} ; do
683
684        IGCM_debug_Print 3 ${comp}
685
686        eval ExeNameIn=\${config_Executable_${comp}[0]}
687        eval ExeNameOut=\${config_Executable_${comp}[1]}
688        # Only if we really have an executable for the component :
689        if [ X${ExeNameIn} = X\"\" ] ; then
690          # If there is no exe file for this component
691          (( ExeSize=0 ))
692        else
693          eval LS_bin=${R_EXE}/${ExeNameIn}
694          IGCM_sys_FileSize ${LS_bin} ExeSize
695
696          set +A LS_comp -- $( LC_TIME=en_US ls -l ${LS_bin} )
697          if [ X${ExeDate} = X ] ; then 
698            # First component exe date
699            ExeDate=${comp}_${LS_comp[5]}_${LS_comp[6]}
700          else
701            ExeDate=${ExeDate}-${comp}_${LS_comp[5]}_${LS_comp[6]}
702          fi
703          ExeDate=${ExeDate}_${LS_comp[7]}
704        fi
705
706        if [ ${i} -eq 0 ] ; then
707          # First component
708          NextExeSize="( "${ExeSize}
709        else
710          NextExeSize=${NextExeSize}", "${ExeSize}
711        fi
712        eval LastCompExeSize=${run_Log_LastExeSize[$i]}
713        (( i=i+1 ))
714
715        if [ ${ExeSize} -ne ${LastCompExeSize} ] ; then
716          if ( ${FirstInitialize} ) ; then
717            IGCM_debug_Print 1 "Save first ${ExeNameIn} in ${R_OUT_EXE} !"
718          else
719            IGCM_debug_Print 1 "${ExeNameIn} has changed in ${R_EXE} !"
720            IGCM_debug_Print 1 "Save latest ${ExeNameIn} in ${R_OUT_EXE} !"
721            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${ExeNameOut}
722          fi
723          eval IGCM_sys_Put_Out ${ExeNameOut} ${R_OUT_EXE}/${PREFIX}_${ExeNameIn} rw
724          UpdateExe=true
725
726          IGCM_sys_GetDate_FichWork ${LS_bin} ExeSecDate
727          if [ $ExeSecDateMax -lt $ExeSecDate ] ; then
728            ExeSecDateMax=$ExeSecDate
729          fi
730        fi
731      done
732
733# SD : switch off for now
734#      if ( ${UpdateExe} ) ; then
735#       echo "Launch SaveSourceModifications."
736#       IGCM_config_SaveSourceModifications ${ExeSecDateMax}
737#      fi
738
739      NextExeSize=${NextExeSize}" )"
740      IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Log LastExeSize "${NextExeSize}"
741
742      if [ ${DRYRUN} -le 1 ] ; then
743        tail -1500 ${Exe_Output} > ${Exe_Output}_tail.txt
744        ExeCpuLog=$( gawk -f ${libIGCM}/libIGCM_sys/IGCM_add_out.awk ${Exe_Output}_tail.txt )
745        RET=$?
746        if [ $RET -eq 0 ] ; then
747          # ExeCpuLog variable contents 5 fields
748          echo "${CumulPeriod} ${PeriodDateBegin} ${PeriodDateEnd} ${ExeCpuLog} ${ExeDate}" |   \
749            gawk '{printf("# %11d | %15s | %15s | %19s | %19s | %15.5f | %15.5f | %15.5f | %s\n", \
750            $1,$2,$3,$4,$5,$6,$7,$8,$9)}' >> ${SUBMIT_DIR}/run.card
751        fi
752        eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}_tail.txt"
753      fi
754
755      # All was right ? no ? then we stop.
756      IGCM_debug_Verif_Exit
757
758      # If all was OK, we can delete all files not necessary for next Job
759      echo
760      IGCM_debug_Print 1 "Files that will be deleted before next period-run : "
761
762      if [ ${DRYRUN} -le 2 ] ; then
763        for f in ${FileToBeDeleted[@]} ; do [ -f ${f} ] && ls -la $f ; [ -f ${f} ] && rm -f $f ; done
764      else
765        echo ${FileToBeDeleted[@]}
766      fi
767
768      #=================================================#
769      #         Modification of libIGCM behaviour       #
770      #=================================================#
771
772      # To use this function, one must copy libIGCM.card from ${libIGCM} directory
773      # and put it in ${SUBMIT_DIR} directory. After modifications of ${SUBMIT_DIR}/libIGCM.card,
774      # variables define inside [UserChanges] will be modified for next Period of libIGCM main loop.
775      if [ -f ${SUBMIT_DIR}/libIGCM.card ] ; then
776        echo
777        echo "########################################################################"
778        echo "!!!                 Modification of libIGCM behaviour                !!!"
779        echo
780
781        IGCM_debug_Print 1 "DefineArrayFromOption  : libIGCM_UserChanges in libIGCM.card"
782        IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/libIGCM.card UserChanges
783        IGCM_debug_Print 2 "libIGCM_UserChanges" ${libIGCM_UserChanges[*]}
784
785        # Special treatments for libIGCM internals
786        for option in ${libIGCM_UserChanges[*]} ; do
787          IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/libIGCM.card UserChanges ${option}
788
789          echo "We will change : ${option}."
790          eval echo "Previous value : " \${${option}}
791          eval echo "Change to : " \${libIGCM_UserChanges_${option}}
792         
793          eval ${option}=\${libIGCM_UserChanges_${option}}
794
795          case ${option} in
796          config_UserChoices_DateEnd)
797          IGCM_debug_PrintVariables 1 config_UserChoices_DateEnd
798          DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )
799
800          # Period Length In Days between DateBegin and DateEnd
801          (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
802          if [ ${ExperienceLengthInDays} -lt 0 ] ; then
803            IGCM_debug_Print 1 "Problem with dates in libIGCM.card : ${DateEnd} < ${DateBegin} ! You must check that."
804            IGCM_debug_Exit "IGCM_PeriodEnd" " Wrong Dates."
805            IGCM_debug_Verif_Exit
806          fi
807          ;;
808          config_UserChoices_PeriodLength)
809        IGCM_debug_Print 1  "Change config_UserChoices_PeriodLength=${config_UserChoices_PeriodLength}"
810        ;;
811        PeriodNb)
812              IGCM_debug_Print 1  "Loop in main Job with ${PeriodNb} period(s)"
813              ;;
814              config_Post_RebuildFrequency)
815            IGCM_debug_Print 1  "Change config_Post_RebuildFrequency=${config_Post_RebuildFrequency} : IGCM_post_Configure"
816            IGCM_post_Configure
817            ;;
818            config_Post_TimeSeriesFrequency)
819    IGCM_debug_Print 1  "Change config_Post_TimeSeriesFrequency = ${config_Post_TimeSeriesFrequency} : IGCM_post_Initialize"
820    IGCM_post_Configure
821    ;;
822    config_Post_SeasonalFrequency)
823  IGCM_debug_Print 1  "Change config_Post_SeasonalFrequency = ${config_Post_SeasonalFrequency} : IGCM_post_Initialize"
824  IGCM_post_Configure
825  ;;
826  esac
827  done
828
829  echo
830  echo "########################################################################"
831  echo
832  fi
833
834  #=================================================#
835  #         Determine next computed period          #
836  #=================================================#
837
838  PeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateEnd} 1 )
839  IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
840  year_m1=$(( year - 1 ))
841  year_p1=$(( year + 1 ))
842  IGCM_config_Analyse_PeriodLength
843  PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateBegin} $(( ${PeriodLengthInDays} - 1 )) )
844
845  # Debug Print :
846  echo
847  IGCM_debug_Print 1 "IGCM_config_PeriodEnd : Preparing Next Execution"
848  IGCM_debug_Print 1 "PeriodDateBegin       : ${PeriodDateBegin}"
849  IGCM_debug_Print 1 "PeriodDateEnd         : ${PeriodDateEnd}"
850  IGCM_debug_Print 1 "PeriodLengthInDays    : ${PeriodLengthInDays}"
851
852  PeriodDateBegin=$( IGCM_date_ConvertFormatToHuman ${PeriodDateBegin} )
853  PeriodDateEnd=$( IGCM_date_ConvertFormatToHuman ${PeriodDateEnd} )
854
855  (( CumulPeriod = CumulPeriod + 1 ))
856
857  # Debug Print :
858  echo
859  IGCM_debug_Print 3 "PeriodDateBegin Human : ${PeriodDateBegin}"
860  IGCM_debug_Print 3 "PeriodDateEnd Human   : ${PeriodDateEnd}"
861  IGCM_debug_Print 3 "CumulPeriod           : ${CumulPeriod}"
862
863  #=================================================#
864  #             Write updated run.card              #
865  #=================================================#
866
867  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration OldPrefix ${OldPrefix}
868  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
869  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
870  IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
871
872  if ( ${FirstInitialize} ) ; then
873    # It's no more the first time
874    FirstInitialize=false
875  fi
876
877  IGCM_debug_PopStack "IGCM_config_PeriodEnd"
878}
879
880#===================================
881function IGCM_config_Finalize
882{
883  IGCM_debug_PushStack "IGCM_config_Finalize"
884
885  echo
886  IGCM_debug_Print 1 "IGCM_config_Finalize"
887  echo
888
889  if [ ${SimulationLengthInDays} -ge ${ExperienceLengthInDays} ] ; then
890    #==========================#
891    # End of entire simulation #
892    #==========================#
893
894    # Mail notification
895    IGCM_sys_SendMail
896
897    #
898    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Completed"
899    IGCM_debug_Print 1 "Normal End of computation."
900    if ( $DEBUG_debug ) ; then
901      echo
902      IGCM_debug_Print 1 "Your files on ${R_SAVE} :"
903      IGCM_sys_Tree ${R_SAVE}
904
905      IGCM_debug_Print 1 "Your files on ${R_BUFR} :"
906      IGCM_sys_Tree ${R_BUFR}
907    fi
908  else
909    #=================#
910    # Submit next job #
911    #=================#
912
913    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "OnQueue"
914
915    # Name of next Ksh Script output :
916    eval Script_Output="${Script_Output_Prefix}_${config_UserChoices_JobName}.$( printf "%06d" ${CumulPeriod} )"
917
918    IGCM_debug_Print 1 "Submit next job"
919    # SUBMIT NEXT JOB from SUBMIT_DIR and come back in RUN_DIR
920    IGCM_sys_Cd ${SUBMIT_DIR}
921    # Keep only the 5 latest ${Script_Output_Prefix}_${config_UserChoices_JobName}
922    ScriptTot=$( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? 2>/dev/null | wc -l )
923    [ ${ScriptTot} -gt 5 ] && rm -f $( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? | head -$(( ${ScriptTot} - 5 )) )
924    # Submit next job and come back
925    IGCM_sys_Qsub ${SUBMIT_DIR}/Job_${config_UserChoices_JobName}
926    IGCM_sys_Cd -
927  fi
928
929  # Supress Non Deleted Boundary files
930  if [ ${DRYRUN} -le 2 ] ; then
931    IGCM_comp_DelFixeBoundaryFiles
932    ls -la
933  fi
934 
935  # Clean ${RUN_DIR}=${RUN_DIR_PATH}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
936  # Only for production run (No clean up in DEV or DEB mode)
937  # and command sent from .. directory.
938  IGCM_sys_Cd ..
939  [ X${JobType} = XRUN ] && IGCM_sys_Rm -rf ${RUN_DIR}
940
941  IGCM_debug_PopStack "IGCM_config_Finalize"
942}
943
944#===================================
Note: See TracBrowser for help on using the repository browser.