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

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