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

Last change on this file since 529 was 529, checked in by mmaipsl, 13 years ago

correct launch of SaveSourceModification? with ins_job.

  • 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: 35.4 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
93    echo
94    IGCM_debug_Print 1 "DefineArrayFromSection : ListOfComponents"
95    IGCM_debug_Print 3 ${config_ListOfComponents[*]}
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 2 "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    IGCM_debug_Print 2 "(Re)Define R_INIT, R_BC and PeriodNb"
163    IGCM_debug_Print 3 "R_INIT=${R_INIT}"
164    R_BC=${config_UserChoices_R_BC:=${R_IN}/BC}
165    IGCM_debug_Print 3  "R_BC=${R_BC}"
166    PeriodNb=${config_UserChoices_PeriodNb:=${PeriodNb}}
167    IGCM_debug_Print 3  "Loop in main Job with ${PeriodNb} period(s)"
168
169    # Test Archive input/output.
170    IGCM_sys_TestDirArchive ${ARCHIVE}
171    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
172    IGCM_sys_TestDirArchive ${R_IN}
173    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
174
175    #====================================================
176    #R_SAVE : Job output directory
177    if ( [ ! X${config_UserChoices_SpaceName} = X ] && [ ! X${config_UserChoices_ExperimentName} = X ] ) ; then
178        FreeName=$( echo ${config_UserChoices_JobName} | sed 's/.*_//' )
179        R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
180        R_DODS=${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
181    else
182        R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
183        R_DODS=${config_UserChoices_TagName}/${config_UserChoices_JobName}
184    fi
185
186    if ( ${FirstInitialize} ) ; then
187        IGCM_sys_MkdirArchive ${R_SAVE}
188    else
189        IGCM_sys_TestDirArchive ${R_SAVE}
190        [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
191        #Test state of run in run.card
192        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState
193       
194        if ( [ ${run_Configuration_PeriodState} != "Start" ] && [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then
195            echo
196            IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!"
197            IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this"
198            IGCM_debug_Exit
199            IGCM_debug_Verif_Exit
200        fi
201    fi
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 2 "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 2 "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 "Check coherence between RebuildFrequency and PeriodLength"
334        IGCM_post_CheckModuloFrequency config_Post_RebuildFrequency config_UserChoices_PeriodLength
335        IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and RebuildFrequency"
336        IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_Post_RebuildFrequency
337        IGCM_debug_Print 1 "Check 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 "Check coherence between TimeSeriesFrequency and PeriodLength"
346        IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_UserChoices_PeriodLength
347        IGCM_debug_Print 1 "Check 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 "Check 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 1 "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 "Check 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 1 "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_GetYearMonthDay $DateBegin year month day
399        IGCM_config_Analyse_PeriodLength
400
401        eval PeriodDateBegin=${DateBegin} > /dev/null 2>&1
402        PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} $(( ${PeriodLengthInDays} - 1 )) )
403        eval CumulPeriod=1 > /dev/null 2>&1
404
405        #=================================================#
406        #              Write updated run.card             #
407        #=================================================#
408
409        #Correct run.card Configuration for this period
410        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
411        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
412        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
413        if [ X$( grep "SubmitPath" ${SUBMIT_DIR}/run.card ) != X ] ; then
414            IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration SubmitPath ${SUBMIT_DIR}
415        fi
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 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!"
429            IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this"
430            echo
431            IGCM_debug_Exit
432            IGCM_debug_Verif_Exit
433        fi
434
435        #===================================#
436        #        Read updated run.card      #
437        #===================================#
438
439        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration OldPrefix
440        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin
441        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd
442        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod
443
444        PeriodDateBegin=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateBegin} )
445        PeriodDateEnd=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateEnd} )
446        eval CumulPeriod="${run_Configuration_CumulPeriod}" > /dev/null 2>&1
447
448        LastPeriodDateEnd=$( echo ${run_Configuration_OldPrefix} | sed -e "s/${config_UserChoices_JobName}_//" )
449
450        typeset LastDate
451        set +A LastDate -- $( echo ${LastPeriodDateEnd} | sed -e "s/\([0-9]\{${dY}\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1 \2 \3/" )
452        LastYearDateEnd=${LastDate[0]}
453        LastMonthDateEnd=${LastDate[1]}
454        LastDayDateEnd=${LastDate[2]}
455
456        if [ ${Period} = 1 ]; then
457           # save last Job output
458            typeset LastPeriod iLastPeriod Last_Script_Output_Name
459            (( LastPeriod=CumulPeriod-PeriodNb ))
460            iLastPeriod=$( printf "%06d" ${LastPeriod} )
461            Last_Script_Output_Name="${Script_Output_Prefix}_${config_UserChoices_JobName}.${iLastPeriod}"
462            Last_run_card="run.card.${iLastPeriod}"
463            #eval ls -l ${SUBMIT_DIR}/${Last_Script_Output_Name}
464            #eval IGCM_sys_Put_Out ${SUBMIT_DIR}/${Last_Script_Output_Name} ${R_OUT_KSH}/${Last_Script_Output_Name} > /dev/null 2>&1
465            IGCM_debug_Print 2 "Try to save previous ksh job output"
466            IGCM_sys_Cd ${SUBMIT_DIR}/
467            IGCM_sys_Put_Out ${Last_Script_Output_Name} ${R_OUT_KSH}/${Last_Script_Output_Name}.$$ rw
468
469            IGCM_card_CheckConflict run.card
470            IGCM_sys_Put_Out ${SUBMIT_DIR}/run.card ${R_OUT_KSH}/${Last_run_card}.$$ rw
471
472            IGCM_sys_Cd ${RUN_DIR}
473        else
474            unset FileToBeDeleted
475        fi
476
477        IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
478        IGCM_config_Analyse_PeriodLength
479
480        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
481
482    fi   
483    OldPrefix=${config_UserChoices_JobName}_${PeriodDateEnd}
484
485    # BEGIN: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
486    # Compute year_m1 and year_p1 (year minus 1Y and year plus 1Y)
487    year_m1=$(( year - 1 ))
488    year_p1=$(( year + 1 ))     
489    # Compute month_m1 (month minus 1M)
490    # Compute yyyymm_m1 (yyyymm minus 1M)
491    month_m1=$(( month - 1 ))
492    if [ ${month_m1} = 0 ]; then
493        month_m1=12
494        yyyymm_m1=${year_m1}12
495    elif [ ${month_m1} -le 9 ]; then
496        month_m1=0${month_m1}
497        yyyymm_m1=${year}${month_m1}
498    else
499        yyyymm_m1=${year}${month_m1}
500    fi
501    # Compute month_p1 (month plus 1M)
502    # Compute yyyymm_p1 (yyyymm plus 1M)
503    month_p1=$(( month + 1 ))
504    if [ ${month_p1} = 13 ]; then
505        month_p1=01
506        yyyymm_p1=${year_p1}01
507    elif [ ${month_p1} -le 9 ]; then
508        month_p1=0${month_p1}
509        yyyymm_p1=${year}${month_p1}
510    else
511        yyyymm_p1=${year}${month_p1}
512    fi
513    #IGCM_debug_Print 1 "jg 1 month_m1 = ${month_m1} month_p1 = ${month_p1} "
514    #IGCM_debug_Print 1 "jg 1 calculate yyyymm_m1 = ${yyyymm_m1} "
515    #IGCM_debug_Print 1 "jg 1 calculate yyyymm_p1 = ${yyyymm_p1} "
516
517    # END: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
518
519    #===================================================================#
520    # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
521    #             But available to any son functions                    #
522    #===================================================================#
523
524    # Period Length In Days between DateBegin and DateCurrent (at end of period == PeriodDateEnd !)
525    (( SimulationLengthInDays = $( IGCM_date_DaysBetweenGregorianDate ${PeriodDateEnd} ${DateBegin} ) + 1 ))
526
527    # Debug Print :
528    IGCM_debug_Print 1 "IGCM_config_PeriodStart : Before Execution"
529    IGCM_debug_Print 1 "Year of simulation      : ${year}"
530    IGCM_debug_Print 1 "Month of simulation     : ${month}"
531    IGCM_debug_Print 1 "PeriodLengthInDays      : ${PeriodLengthInDays}"
532    IGCM_debug_Print 1 "PeriodDateBegin         : ${PeriodDateBegin}"
533    IGCM_debug_Print 1 "PeriodDateEnd           : ${PeriodDateEnd}"
534    IGCM_debug_Print 1 "SimulationLengthInDays  : ${SimulationLengthInDays}"
535    IGCM_debug_Print 1 "ExperienceLengthInDays  : ${ExperienceLengthInDays}"
536
537    #================================================================#
538    #         Prepare variables available for comp_finalyze          #
539    #================================================================#
540
541    # Period for save files
542    eval DatesPeriod=${PeriodDateBegin}_${PeriodDateEnd} > /dev/null 2>&1
543
544    # Prefix for save files of this period
545    eval PREFIX=${config_UserChoices_JobName}_${DatesPeriod}  > /dev/null 2>&1
546
547    # List of files that will be deleted in RUN_DIR after run
548    [ -f stack ] && FileToBeDeleted[0]="stack"
549
550    # Test if the same run as already been saved :
551    if [ X${JobType} = XRUN ] ; then
552        if [ ${DRYRUN} -le 0 ] ; then
553            if ( IGCM_sys_TestFileArchive ${R_OUT_KSH}/${PREFIX}_${Exe_Output} ) ; then
554                IGCM_debug_Exit "IGCM_config_PeriodStart" "You are currently RErunning an old job."
555                IGCM_debug_Print 1 "Because of readonly permissions, you can't RErun a job when saved files"
556                IGCM_debug_Print 1 " are still in the ARCHIVE directory. You must deleted those files, or "
557                IGCM_debug_Print 1 " the whole ${R_SAVE} tree. See clean_month.job in ${libIGCM} directory."
558                IGCM_debug_Print 1 " This exit has been initiated because at least ${R_OUT_KSH}/${PREFIX}_${Exe_Output} exists."
559                IGCM_debug_Verif_Exit
560            fi
561        fi
562    else
563        if ( IGCM_sys_TestFileArchive ${R_OUT_KSH}/${PREFIX}_${Exe_Output} ) ; then
564            IGCM_debug_Print 1 "IGCM_config_PeriodStart" "RErun an old job. Allowed in DEBUG or DEV mode."
565        fi
566    fi
567
568    ExecutionFail=false
569
570    IGCM_debug_PopStack "IGCM_config_PeriodStart"
571}
572
573#===================================
574function IGCM_config_SaveSourceModifications
575{
576    IGCM_debug_PushStack "IGCM_config_SaveSourceModifications"
577#set -vx
578    echo "In SaveSourceModifications."
579
580    ExeOutDateMax=$1
581
582    listVarEnv="ExeOutDateMax,R_OUT_EXE,PREFIX,SUBMIT_DIR"
583    IGCM_sys_RshMaster "\
584       . ${libIGCM}/libIGCM_sys/libIGCM_sys.ksh; \
585       export ExeOutDateMax=${ExeOutDateMax};\
586       export R_OUT_EXE=${R_OUT_EXE};\
587       export PREFIX=${PREFIX};\
588       export SUBMIT_DIR=${SUBMIT_DIR};\
589       export listVarEnv=${listVarEnv};\
590       Script_Output=out_SaveSourceModifications;\
591       IGCM_sys_Qsub ${libIGCM}/SaveSourceModifications.job ${ExeOutDateMax} ${R_OUT_EXE} ${PREFIX} ${SUBMIT_DIR}"
592
593    echo "out SaveSourceModifications."
594
595    IGCM_debug_PopStack "IGCM_config_SaveSourceModifications"
596}
597
598#===================================
599function IGCM_config_PeriodEnd
600{
601    IGCM_debug_PushStack "IGCM_config_PeriodEnd"
602
603    echo
604    IGCM_debug_Print 1 "IGCM_config_PeriodEnd"
605    echo
606
607    #==================================#
608    #         Save Job output          #
609    #==================================#
610    IGCM_sys_Put_Out ${Exe_Output} ${R_OUT_KSH}/${PREFIX}_${Exe_Output}
611    eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}"
612
613    IGCM_card_CheckConflict run.card
614    IGCM_sys_Put_Out ${SUBMIT_DIR}/run.card ${R_OUT_KSH}/run.card rw
615
616    IGCM_debug_Print 1 "Check components binary : size and creation date"
617
618    typeset LS_comp LS_bin ExeDate ExeCpuLog NextExeSize LastCompExeSize
619    typeset comp i   
620    typeset ExeNameIn ExeNameOut UpdateExe ExeOutDate ExeOutDateMax
621
622    #==================================#
623    #        Get last Exe Size         #
624    #==================================#
625
626    (( i=0 ))
627    if ( ${FirstInitialize} ) ; then
628        run_Log_LastExeSize=""
629        for comp in ${config_ListOfComponents[*]} ; do
630            run_Log_LastExeSize[$i]=0
631            (( i=i+1 ))
632        done
633    else
634        IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/run.card Log LastExeSize
635    fi
636    #==================================#
637    #         And Build ExeDate        #
638    #==================================#
639
640    # 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
641    # 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")
642    # 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
643    ExeDate=""
644    NextExeSize="( "
645    (( i=0 ))
646    UpdateExe=false
647    (( ExeOutDateMax = 0 ))
648    for comp in ${config_ListOfComponents[*]} ; do
649
650        IGCM_debug_Print 3 ${comp}
651
652        eval ExeNameIn=\${config_Executable_${comp}[0]}
653        eval ExeNameOut=\${config_Executable_${comp}[1]}
654        # Only if we really have an executable for the component :
655        if [ X${ExeNameIn} = X\"\" ] ; then
656            # If there is no exe file for this component
657            (( ExeSize=0 ))
658        else
659            eval LS_bin=${R_EXE}/${ExeNameIn}
660            IGCM_sys_FileSize ${LS_bin} ExeSize
661
662            set +A LS_comp -- $( LC_TIME=en_US ls -l ${LS_bin} )
663            if [ X${ExeDate} = X ] ; then 
664                # First component exe date
665                ExeDate=${comp}_${LS_comp[5]}_${LS_comp[6]}
666            else
667                ExeDate=${ExeDate}-${comp}_${LS_comp[5]}_${LS_comp[6]}
668            fi
669            ExeDate=${ExeDate}_${LS_comp[7]}
670        fi
671
672        if [ ${i} -eq 0 ] ; then
673            # First component
674            NextExeSize="( "${ExeSize}
675        else
676            NextExeSize=${NextExeSize}", "${ExeSize}
677        fi
678        eval LastCompExeSize=${run_Log_LastExeSize[$i]}
679        (( i=i+1 ))
680
681        if [ ${ExeSize} -ne ${LastCompExeSize} ] ; then
682            if ( ${FirstInitialize} ) ; then
683                IGCM_debug_Print 1 "Save first ${ExeNameIn} in ${R_OUT_EXE} !"
684            else
685                IGCM_debug_Print 1 "${ExeNameIn} has changed in ${R_EXE} !"
686                IGCM_debug_Print 1 "Save latest ${ExeNameIn} in ${R_OUT_EXE} !"
687                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${ExeNameOut}
688            fi
689            eval IGCM_sys_Put_Out ${ExeNameOut} ${R_OUT_EXE}/${PREFIX}_${ExeNameIn} rw
690            UpdateExe=true
691
692            ExeOutDate=$( ls -l --full-time --time-style='+%Y%m%d%H%M%S' ${ExeNameOut} | gawk -F  ' ' '{print $6}' )
693            ExeOutDateMax=$(( ( $ExeOutDateMax > $ExeOutDate ) ? $ExeOutDateMax : $ExeOutDate ))
694        fi
695    done
696
697    if ( ${UpdateExe} ) ; then
698        echo "Launch SaveSourceModifications."
699        IGCM_config_SaveSourceModifications ${ExeOutDateMax}
700    fi
701
702    NextExeSize=${NextExeSize}" )"
703    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Log LastExeSize "${NextExeSize}"
704
705    if [ ${DRYRUN} -le 1 ] ; then
706        tail -1500 ${Exe_Output} > ${Exe_Output}_tail.txt
707        ExeCpuLog=$( gawk -f ${libIGCM}/libIGCM_sys/IGCM_add_out.awk ${Exe_Output}_tail.txt )
708        RET=$?
709        if [ $RET -eq 0 ] ; then
710            # ExeCpuLog variable contents 5 fields
711            echo "${CumulPeriod} ${PeriodDateBegin} ${PeriodDateEnd} ${ExeCpuLog} ${ExeDate}" |   \
712             gawk '{printf("# %11d | %15s | %15s | %19s | %19s | %15.5f | %15.5f | %15.5f | %s\n", \
713                              $1,$2,$3,$4,$5,$6,$7,$8,$9)}' >> ${SUBMIT_DIR}/run.card
714        fi
715        eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}_tail.txt"
716    fi
717
718    # All was right ? no ? then we stop.
719    IGCM_debug_Verif_Exit
720
721    # If all was OK, we can delete all files not necessary for next Job
722    echo
723    IGCM_debug_Print 1 "Files that will be deleted before next period-run : "
724
725    if [ ${DRYRUN} -le 2 ] ; then
726        for f in ${FileToBeDeleted[@]} ; do [ -f ${f} ] && ls -la $f ; [ -f ${f} ] && rm -f $f ; done
727    else
728        echo ${FileToBeDeleted[@]}
729    fi
730
731    #=================================================#
732    #         Modification of libIGCM behaviour       #
733    #=================================================#
734
735    # To use this function, one must copy libIGCM.card from ${libIGCM} directory
736    # and put it in ${SUBMIT_DIR} directory. After modifications of ${SUBMIT_DIR}/libIGCM.card,
737    # variables define inside [UserChanges] will be modified for next Period of libIGCM main loop.
738    if [ -f ${SUBMIT_DIR}/libIGCM.card ] ; then
739        echo
740        echo "########################################################################"
741        echo "!!!                 Modification of libIGCM behaviour                !!!"
742        echo
743
744        IGCM_debug_Print 1 "DefineArrayFromOption  : libIGCM_UserChanges in libIGCM.card"
745        IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/libIGCM.card UserChanges
746        IGCM_debug_Print 2 "libIGCM_UserChanges" ${libIGCM_UserChanges[*]}
747
748        # Special treatments for libIGCM internals
749        for option in ${libIGCM_UserChanges[*]} ; do
750            IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/libIGCM.card UserChanges ${option}
751
752            echo "We will change : ${option}."
753            eval echo "Previous value : " \${${option}}
754            eval echo "Change to : " \${libIGCM_UserChanges_${option}}
755           
756            eval ${option}=\${libIGCM_UserChanges_${option}}
757
758            case ${option} in
759                config_UserChoices_DateEnd)
760                    IGCM_debug_PrintVariables 1 config_UserChoices_DateEnd
761                    DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )
762
763                    # Period Length In Days between DateBegin and DateEnd
764                    (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
765                    if [ ${ExperienceLengthInDays} -lt 0 ] ; then
766                        IGCM_debug_Print 1 "Problem with dates in libIGCM.card : ${DateEnd} < ${DateBegin} ! You must check that."
767                        IGCM_debug_Exit "IGCM_PeriodEnd" " Wrong Dates."
768                        IGCM_debug_Verif_Exit
769                    fi
770                    ;;
771                config_UserChoices_PeriodLength)
772                    IGCM_debug_Print 1  "Change config_UserChoices_PeriodLength=${config_UserChoices_PeriodLength}"
773                    ;;
774                PeriodNb)
775                    IGCM_debug_Print 1  "Loop in main Job with ${PeriodNb} period(s)"
776                    ;;
777                config_Post_RebuildFrequency)
778                    IGCM_debug_Print 1  "Change config_Post_RebuildFrequency=${config_Post_RebuildFrequency} : IGCM_post_Configure"
779                    IGCM_post_Configure
780                    ;;
781                config_Post_TimeSeriesFrequency)
782                    IGCM_debug_Print 1  "Change config_Post_TimeSeriesFrequency = ${config_Post_TimeSeriesFrequency} : IGCM_post_Initialize"
783                    IGCM_post_Configure
784                    ;;
785                config_Post_SeasonalFrequency)
786                    IGCM_debug_Print 1  "Change config_Post_SeasonalFrequency = ${config_Post_SeasonalFrequency} : IGCM_post_Initialize"
787                    IGCM_post_Configure
788                    ;;
789            esac
790        done
791
792        echo
793        echo "########################################################################"
794        echo
795    fi
796
797    #=================================================#
798    #         Determine next computed period          #
799    #=================================================#
800
801    PeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateEnd} 1 )
802    IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
803    year_m1=$(( year - 1 ))
804    year_p1=$(( year + 1 ))
805    IGCM_config_Analyse_PeriodLength
806    PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateBegin} $(( ${PeriodLengthInDays} - 1 )) )
807
808    # Debug Print :
809    echo
810    IGCM_debug_Print 1 "IGCM_config_PeriodEnd : Preparing Next Execution"
811    IGCM_debug_Print 1 "PeriodDateBegin       : ${PeriodDateBegin}"
812    IGCM_debug_Print 1 "PeriodDateEnd         : ${PeriodDateEnd}"
813    IGCM_debug_Print 1 "PeriodLengthInDays    : ${PeriodLengthInDays}"
814
815    PeriodDateBegin=$( IGCM_date_ConvertFormatToHuman ${PeriodDateBegin} )
816    PeriodDateEnd=$( IGCM_date_ConvertFormatToHuman ${PeriodDateEnd} )
817
818    (( CumulPeriod = CumulPeriod + 1 ))
819
820    # Debug Print :
821    echo
822    IGCM_debug_Print 3 "PeriodDateBegin Human : ${PeriodDateBegin}"
823    IGCM_debug_Print 3 "PeriodDateEnd Human   : ${PeriodDateEnd}"
824    IGCM_debug_Print 3 "CumulPeriod           : ${CumulPeriod}"
825
826    #=================================================#
827    #             Write updated run.card              #
828    #=================================================#
829
830    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration OldPrefix ${OldPrefix}
831    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
832    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
833    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
834
835    if ( ${FirstInitialize} ) ; then
836        # It's no more the first time
837        FirstInitialize=false
838    fi
839
840    IGCM_debug_PopStack "IGCM_config_PeriodEnd"
841}
842
843#===================================
844function IGCM_config_Finalize
845{
846    IGCM_debug_PushStack "IGCM_config_Finalize"
847
848    echo
849    IGCM_debug_Print 1 "IGCM_config_Finalize"
850    echo
851
852    if [ ${SimulationLengthInDays} -ge ${ExperienceLengthInDays} ] ; then
853        #==========================#
854        # End of entire simulation #
855        #==========================#
856
857        # Mail notification
858        IGCM_sys_SendMail
859
860        #
861        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Completed"
862        IGCM_debug_Print 1 "Normal End of computation."
863        if ( $DEBUG_debug ) ; then
864            echo
865            IGCM_debug_Print 1 "Your files on ${R_OUT} :"
866            IGCM_sys_Tree ${R_SAVE}
867        fi
868    else
869        #=================#
870        # Submit next job #
871        #=================#
872
873        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "OnQueue"
874
875        # Name of next Ksh Script output :
876        eval Script_Output="${Script_Output_Prefix}_${config_UserChoices_JobName}.$( printf "%06d" ${CumulPeriod} )"
877
878        IGCM_debug_Print 1 "Submit next job"
879        # SUBMIT NEXT JOB from SUBMIT_DIR and come back in RUN_DIR
880        IGCM_sys_Cd ${SUBMIT_DIR}
881        # Keep only the 5 latest ${Script_Output_Prefix}_${config_UserChoices_JobName}
882        ScriptTot=$( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? 2>/dev/null | wc -l )
883        [ ${ScriptTot} -gt 5 ] && rm -f $( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? | head -$(( ${ScriptTot} - 5 )) )
884        # Submit next job and come back
885        IGCM_sys_Qsub ${SUBMIT_DIR}/Job_${config_UserChoices_JobName}
886        IGCM_sys_Cd -
887    fi
888
889    # Supress Non Deleted Boundary files
890    if [ ${DRYRUN} -le 2 ] ; then
891        IGCM_comp_DelFixeBoundaryFiles
892        ls -la
893    fi
894   
895    # Clean ${RUN_DIR}=${RUN_DIR_PATH}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
896    # Only for production run (No clean up in DEV or DEB mode)
897    # and command sent from .. directory.
898    IGCM_sys_Cd ..
899    [ X${JobType} = XRUN ] && IGCM_sys_Rm -rf ${RUN_DIR}
900
901    IGCM_debug_PopStack "IGCM_config_Finalize"
902}
903
904#===================================
Note: See TracBrowser for help on using the repository browser.