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

Last change on this file since 439 was 439, checked in by sdipsl, 13 years ago

ChunckJob? frequency must be expressed as year *Y|*y. Check it's the case. Ticket #55

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