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

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

Use IGCM_sys_GetDate_FichWork to manage date of executables. Define arrays config_ListOfComponents_${comp}.

  • 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    for comp in ${config_ListOfComponents[*]} ; do
93        IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp}
94    done
95
96    echo
97    IGCM_debug_Print 1 "DefineArrayFromSection : ListOfComponents"
98    IGCM_debug_Print 3 ${config_ListOfComponents[*]}
99
100    NbComponents=${#config_ListOfComponents[*]}
101
102    #==================================
103    # Define principal executable
104
105    IGCM_card_DefineArrayFromSection   ${SUBMIT_DIR}/config.card Executable
106    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Executable Name
107   
108    #==================================
109    # Define Outputs Name
110    IGCM_debug_Print 2 "Define Script_Output_Prefix and Exe_Output"
111    eval Script_Output_Prefix=${config_UserChoices_Script_Output_Prefix:='Script_Output'}
112    IGCM_debug_Print 3 "Script_Output_Prefix = ${Script_Output_Prefix}"
113    eval Exe_Output=out_${config_Executable_Name}
114    IGCM_debug_Print 3 "Exe_Output           = ${Exe_Output}"
115
116    #==================================
117
118    #===================================================================#
119    # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
120    #             But available to any son functions                    #
121    #===================================================================#
122
123    # Convert yyyy-mm-dd date to gregorian yyyymmdd
124    DateBegin=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateBegin} )
125    DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )
126
127    # Period Length In Days between DateBegin and DateEnd
128    (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
129    if [ ${ExperienceLengthInDays} -lt 0 ] ; then
130        IGCM_debug_Print 1 "Problem with dates in config.card : ${DateEnd} < ${DateBegin} ! You must check that."
131        IGCM_debug_Exit "IGCM_config_Initialize" " Wrong Dates."
132        IGCM_debug_Verif_Exit
133    fi
134
135    # Day and Year of Initial State (Given in julian format)
136    InitDay=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) % 1000 ))
137    InitYear=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) / 1000 ))
138
139    #==================================
140    # Restarts : Gerneral rule or local for each component ?
141    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card Restarts
142
143    echo
144    IGCM_debug_Print 1 "DefineArrayFromOption : config_Restarts"
145
146    for option in ${config_Restarts[*]} ; do
147        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Restarts ${option}
148        eval auxprint=\${config_Restarts_${option}}
149        IGCM_debug_Print 3 "${option} : ${auxprint}"
150    done
151
152    #================================================================#
153    #                  Test and Prepare directories                  #
154    #================================================================#
155
156    # ==> 4 kinds of input files :
157    #     1) R_INIT  : Initial State Files   (Etat0, carteveg)
158    #     2) R_BC    : Boundary Conditions   (Forcages, lai)
159    #     3) Parameters files (allready define through ${SUBMIT_DIR})
160    #     4) Restarts files   (allready define in IGCM_config_Initialize)
161
162    # Here we offer the possibility to redefine R_INIT, R_BC
163    # and PeriodNb through config.card
164    R_INIT=${config_UserChoices_R_INIT:=${R_IN}/INIT}
165    IGCM_debug_Print 2 "(Re)Define R_INIT, R_BC and PeriodNb"
166    IGCM_debug_Print 3 "R_INIT=${R_INIT}"
167    R_BC=${config_UserChoices_R_BC:=${R_IN}/BC}
168    IGCM_debug_Print 3  "R_BC=${R_BC}"
169    PeriodNb=${config_UserChoices_PeriodNb:=${PeriodNb}}
170    IGCM_debug_Print 3  "Loop in main Job with ${PeriodNb} period(s)"
171
172    # Test Archive input/output.
173    IGCM_sys_TestDirArchive ${ARCHIVE}
174    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
175    IGCM_sys_TestDirArchive ${R_IN}
176    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
177
178    #====================================================
179    #R_SAVE : Job output directory
180    if ( [ ! X${config_UserChoices_SpaceName} = X ] && [ ! X${config_UserChoices_ExperimentName} = X ] ) ; then
181        FreeName=$( echo ${config_UserChoices_JobName} | sed 's/.*_//' )
182        R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
183        R_DODS=${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
184    else
185        R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
186        R_DODS=${config_UserChoices_TagName}/${config_UserChoices_JobName}
187    fi
188
189    if ( ${FirstInitialize} ) ; then
190        IGCM_sys_MkdirArchive ${R_SAVE}
191    else
192        IGCM_sys_TestDirArchive ${R_SAVE}
193        [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
194        #Test state of run in run.card
195        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState
196       
197        if ( [ ${run_Configuration_PeriodState} != "Start" ] && [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then
198            echo
199            IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!"
200            IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this"
201            IGCM_debug_Exit
202            IGCM_debug_Verif_Exit
203        fi
204    fi
205
206    #==================================
207    # Post :
208    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card Post
209
210    echo
211    IGCM_debug_Print 1 "DefineArrayFromOption : config_Post"
212
213    for option in ${config_Post[*]} ; do
214        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Post ${option}
215        eval auxprint=\${config_Post_${option}}
216        IGCM_debug_Print 3 "${option} : ${auxprint}"
217    done
218
219    #====================================================
220    # Define REBUILD_DIR : where we store files needing rebuild process
221    if [ X${config_Post_RebuildFromArchive} = Xtrue ] ; then
222        REBUILD_DIR=${R_SAVE}/TMP
223        IGCM_sys_MkdirArchive ${REBUILD_DIR}
224    else
225        REBUILD_DIR=${BIG_DIR}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
226        IGCM_sys_MkdirWork ${REBUILD_DIR}
227    fi
228
229    #====================================================
230    # Experience type : DEB(ug), DEV(elopment), RUN
231    if [ X${JobType} != XRUN ] ; then
232        echo
233        echo "===================================================="
234        echo "libIGCM JOB is NOT in RUN type mode."
235        echo "!! OUTPUT files will NOT be PROTECTED !!"
236        echo "Be carefull : you can ERASE the result of this job !"
237
238        case ${JobType} in
239            DEB)
240                echo "DEBUG mode : activation of 'set -vx' mode."
241                echo "DEBUG mode : no protection for output files."
242                echo "DEBUG mode : if active force asynchronous rebuild frequency to PeriodLength frequency."
243                ;;
244            DEV)
245                echo "DEVelopment mode : no protection for output files."
246                echo "DEVelopment mode : if active force asynchronous rebuild frequency to PeriodLength frequency."
247                ;;
248        esac
249
250        if ( [ X${config_Post_RebuildFrequency} != XNONE ] && [ ${DRYRUN} -eq 0 ] ) ; then
251            if [ X${config_Post_RebuildFrequency} != X${config_UserChoices_PeriodLength} ] ; then
252                echo "------------"
253                echo "WARNING : Job is NOT in RUN mode then we will force REBUILD Frequency"
254                echo "          to PeriodLength : ${config_UserChoices_PeriodLength}"
255                echo "------------"
256                config_Post_RebuildFrequency=${config_UserChoices_PeriodLength}
257            fi
258        fi
259        echo "===================================================="
260        echo
261    fi
262
263    #====================================================
264    #R_OUT_KSH : Storage place for job output
265    #R_OUT_EXE : Storage place for binary used during simulation
266    R_OUT_KSH=${R_SAVE}/Out
267    R_OUT_EXE=${R_SAVE}/Exe
268
269    IGCM_debug_PopStack "IGCM_config_Initialize"
270}
271
272#===================================
273function IGCM_config_Analyse_PeriodLength
274{
275    IGCM_debug_PushStack "IGCM_config_Analyse_PeriodLength"
276
277    typeset i
278
279    # Determine number of day(s) in PeriodLength :
280    case ${config_UserChoices_PeriodLength} in
281        *Y|*y)
282            PeriodLengthInYears=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[yY]//' ) 
283            IGCM_debug_Print 2 "Number of years for PeriodLength : ${PeriodLengthInYears}"
284            PeriodLengthInDays=0
285            i=0
286            until [ $i -ge $PeriodLengthInYears ] ; do 
287                (( PeriodLengthInDays = PeriodLengthInDays + $( IGCM_date_DaysInYear $(( year + i )) ) )) 
288                (( i=i+1 )) 
289            done 
290            ;;
291        *M|*m)
292            PeriodLengthInMonths=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[mM]//' ) 
293            IGCM_debug_Print 2 "Number of months for PeriodLength : ${PeriodLengthInMonths}"
294            PeriodLengthInDays=0
295            i=0
296            until [ $i -ge $PeriodLengthInMonths ] ; do
297                if [ $(( month + i )) -lt 13 ] ; then 
298                    (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( month + i )) ) )) 
299                else 
300                    (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( month + i - 12 )) ) )) 
301                fi 
302                (( i=i+1 )) 
303            done 
304            ;;
305        *D|*d) 
306            PeriodLengthInMonths=0
307            PeriodLengthInDays=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[dD]//' );;
308        *) 
309            IGCM_debug_Exit "IGCM_config_Analyse_PeriodLength " ${config_UserChoices_PeriodLength} " invalid period length : choose in *Y, *M, *D."
310            IGCM_debug_Verif_Exit ;;
311    esac
312
313    IGCM_debug_PopStack "IGCM_config_Analyse_PeriodLength"
314}
315
316#===================================
317function IGCM_config_Check
318{
319    IGCM_debug_PushStack "IGCM_config_Check"
320
321    # If one of the following modulo is not zero :
322    # we will issue an error then explain and exit in
323    # AA_job IGCM_debug_Verif_Exit call before binary submission
324
325    echo
326    IGCM_debug_Print 1 "IGCM_config_Check"
327    echo
328
329    typeset i
330
331    if ( [ ! X${config_Post_RebuildFrequency} = X${NULL_STR} ] || [ ! X${config_Post_RebuildFrequency} = XNONE ] ) ; then
332        AsynchronousRebuild=true
333        IGCM_debug_Print 1 "Asynchronous rebuild has been activated."
334        echo
335        # modulo (RebuildFrequency and PeriodLength/TimeSeriesFrequency/SeasonalFrequency) must be zero
336        IGCM_debug_Print 1 "Check coherence between RebuildFrequency and PeriodLength"
337        IGCM_post_CheckModuloFrequency config_Post_RebuildFrequency config_UserChoices_PeriodLength
338        IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and RebuildFrequency"
339        IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_Post_RebuildFrequency
340        IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and RebuildFrequency"
341        IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency config_Post_RebuildFrequency
342    else
343        AsynchronousRebuild=false
344        IGCM_debug_Print 1 "Asynchronous rebuild has not been activated"
345        IGCM_debug_Print 1 "Proceed with standard post-treatment pathway"
346        echo
347        #modulo (TimeSeriesFrequency/SeasonalFrequency and PeriodLenght) must be zero
348        IGCM_debug_Print 1 "Check coherence between TimeSeriesFrequency and PeriodLength"
349        IGCM_post_CheckModuloFrequency config_Post_TimeSeriesFrequency config_UserChoices_PeriodLength
350        IGCM_debug_Print 1 "Check coherence between SeasonalFrequency and PeriodLength"
351        IGCM_post_CheckModuloFrequency config_Post_SeasonalFrequency   config_UserChoices_PeriodLength
352    fi
353
354    #modulo (TimeSeriesFrequency and all Chunck2D) must be zero
355    NbJob=${#CHUNCK2D_SIZE[@]}
356    i=0
357    until [ $i -ge $NbJob ]; do
358        value=${CHUNCK2D_SIZE[${i}]}
359        IGCM_debug_Print 1 "Check coherence between All Chunck2D frequency and TimeSeriesFrequency"
360        IGCM_post_CheckModuloFrequency value config_Post_TimeSeriesFrequency
361        case ${value} in 
362            *Y|*y) ;;
363            *)  IGCM_debug_Print 1 "All ChunckJob2D frequency must be expressed in year *Y|*y in comp.card"
364                IGCM_debug_Exit "This will stop the job" ;;
365        esac
366        (( i=i+1 ))
367    done
368
369    #modulo (TimeSeriesFrequency and all Chunck3D) must be zero
370    NbJob=${#CHUNCK3D_SIZE[@]}
371    i=0
372    until [ $i -ge $NbJob ]; do
373        value=${CHUNCK3D_SIZE[${i}]}
374        IGCM_debug_Print 1 "Check coherence between All Chunck3D frequency and TimeSeriesFrequency"
375        IGCM_post_CheckModuloFrequency value config_Post_TimeSeriesFrequency
376        case ${value} in 
377            *Y|*y) ;;
378            *)  IGCM_debug_Print 1 "All ChunckJob3D frequency must be expressed in year *Y|*y in comp.card"
379                IGCM_debug_Exit "This will stop the job" ;;
380        esac
381        (( i=i+1 ))
382    done
383
384    IGCM_debug_PopStack "IGCM_config_Check"
385}
386
387#===================================
388function IGCM_config_PeriodStart
389{
390    IGCM_debug_PushStack "IGCM_config_PeriodStart"
391
392    echo
393    IGCM_debug_Print 1 "IGCM_config_PeriodStart"
394    echo
395
396    if ( ${FirstInitialize} ) ; then
397        #================================================#
398        #         Initialize date/period information     #
399        #================================================#
400
401        IGCM_date_GetYearMonthDay $DateBegin year month day
402        IGCM_config_Analyse_PeriodLength
403
404        eval PeriodDateBegin=${DateBegin} > /dev/null 2>&1
405        PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} $(( ${PeriodLengthInDays} - 1 )) )
406        eval CumulPeriod=1 > /dev/null 2>&1
407
408        #=================================================#
409        #              Write updated run.card             #
410        #=================================================#
411
412        #Correct run.card Configuration for this period
413        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
414        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
415        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
416        if [ X$( grep "SubmitPath" ${SUBMIT_DIR}/run.card ) != X ] ; then
417            IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration SubmitPath ${SUBMIT_DIR}
418        fi
419
420        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
421 
422    else
423        #================================================#
424        #         The file run.card allready exist       #
425        #================================================#
426
427        #Test state of run in run.card
428        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState
429        if ( [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then
430            echo
431            IGCM_debug_Print 1 "!! Error in run.card with PeriodState : " ${run_Configuration_PeriodState} "!!"
432            IGCM_debug_Print 1 "Try running ${libIGCM}/clean_month.job to fix this"
433            echo
434            IGCM_debug_Exit
435            IGCM_debug_Verif_Exit
436        fi
437
438        #===================================#
439        #        Read updated run.card      #
440        #===================================#
441
442        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration OldPrefix
443        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin
444        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd
445        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod
446
447        PeriodDateBegin=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateBegin} )
448        PeriodDateEnd=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateEnd} )
449        eval CumulPeriod="${run_Configuration_CumulPeriod}" > /dev/null 2>&1
450
451        LastPeriodDateEnd=$( echo ${run_Configuration_OldPrefix} | sed -e "s/${config_UserChoices_JobName}_//" )
452
453        typeset LastDate
454        set +A LastDate -- $( echo ${LastPeriodDateEnd} | sed -e "s/\([0-9]\{${dY}\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1 \2 \3/" )
455        LastYearDateEnd=${LastDate[0]}
456        LastMonthDateEnd=${LastDate[1]}
457        LastDayDateEnd=${LastDate[2]}
458
459        if [ ${Period} = 1 ]; then
460           # save last Job output
461            typeset LastPeriod iLastPeriod Last_Script_Output_Name
462            (( LastPeriod=CumulPeriod-PeriodNb ))
463            iLastPeriod=$( printf "%06d" ${LastPeriod} )
464            Last_Script_Output_Name="${Script_Output_Prefix}_${config_UserChoices_JobName}.${iLastPeriod}"
465            Last_run_card="run.card.${iLastPeriod}"
466            #eval ls -l ${SUBMIT_DIR}/${Last_Script_Output_Name}
467            #eval IGCM_sys_Put_Out ${SUBMIT_DIR}/${Last_Script_Output_Name} ${R_OUT_KSH}/${Last_Script_Output_Name} > /dev/null 2>&1
468            IGCM_debug_Print 2 "Try to save previous ksh job output"
469            IGCM_sys_Cd ${SUBMIT_DIR}/
470            IGCM_sys_Put_Out ${Last_Script_Output_Name} ${R_OUT_KSH}/${Last_Script_Output_Name}.$$ rw
471
472            IGCM_card_CheckConflict run.card
473            IGCM_sys_Put_Out ${SUBMIT_DIR}/run.card ${R_OUT_KSH}/${Last_run_card}.$$ rw
474
475            IGCM_sys_Cd ${RUN_DIR}
476        else
477            unset FileToBeDeleted
478        fi
479
480        IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
481        IGCM_config_Analyse_PeriodLength
482
483        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
484
485    fi   
486    OldPrefix=${config_UserChoices_JobName}_${PeriodDateEnd}
487
488    # BEGIN: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
489    # Compute year_m1 and year_p1 (year minus 1Y and year plus 1Y)
490    year_m1=$(( year - 1 ))
491    year_p1=$(( year + 1 ))     
492    # Compute month_m1 (month minus 1M)
493    # Compute yyyymm_m1 (yyyymm minus 1M)
494    month_m1=$(( month - 1 ))
495    if [ ${month_m1} = 0 ]; then
496        month_m1=12
497        yyyymm_m1=${year_m1}12
498    elif [ ${month_m1} -le 9 ]; then
499        month_m1=0${month_m1}
500        yyyymm_m1=${year}${month_m1}
501    else
502        yyyymm_m1=${year}${month_m1}
503    fi
504    # Compute month_p1 (month plus 1M)
505    # Compute yyyymm_p1 (yyyymm plus 1M)
506    month_p1=$(( month + 1 ))
507    if [ ${month_p1} = 13 ]; then
508        month_p1=01
509        yyyymm_p1=${year_p1}01
510    elif [ ${month_p1} -le 9 ]; then
511        month_p1=0${month_p1}
512        yyyymm_p1=${year}${month_p1}
513    else
514        yyyymm_p1=${year}${month_p1}
515    fi
516    #IGCM_debug_Print 1 "jg 1 month_m1 = ${month_m1} month_p1 = ${month_p1} "
517    #IGCM_debug_Print 1 "jg 1 calculate yyyymm_m1 = ${yyyymm_m1} "
518    #IGCM_debug_Print 1 "jg 1 calculate yyyymm_p1 = ${yyyymm_p1} "
519
520    # END: SHOULD GO IN A FUNCTION FROM libIGCM_date.ksh
521
522    #===================================================================#
523    # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
524    #             But available to any son functions                    #
525    #===================================================================#
526
527    # Period Length In Days between DateBegin and DateCurrent (at end of period == PeriodDateEnd !)
528    (( SimulationLengthInDays = $( IGCM_date_DaysBetweenGregorianDate ${PeriodDateEnd} ${DateBegin} ) + 1 ))
529
530    # Debug Print :
531    IGCM_debug_Print 1 "IGCM_config_PeriodStart : Before Execution"
532    IGCM_debug_Print 1 "Year of simulation      : ${year}"
533    IGCM_debug_Print 1 "Month of simulation     : ${month}"
534    IGCM_debug_Print 1 "PeriodLengthInDays      : ${PeriodLengthInDays}"
535    IGCM_debug_Print 1 "PeriodDateBegin         : ${PeriodDateBegin}"
536    IGCM_debug_Print 1 "PeriodDateEnd           : ${PeriodDateEnd}"
537    IGCM_debug_Print 1 "SimulationLengthInDays  : ${SimulationLengthInDays}"
538    IGCM_debug_Print 1 "ExperienceLengthInDays  : ${ExperienceLengthInDays}"
539
540    #================================================================#
541    #         Prepare variables available for comp_finalyze          #
542    #================================================================#
543
544    # Period for save files
545    eval DatesPeriod=${PeriodDateBegin}_${PeriodDateEnd} > /dev/null 2>&1
546
547    # Prefix for save files of this period
548    eval PREFIX=${config_UserChoices_JobName}_${DatesPeriod}  > /dev/null 2>&1
549
550    # List of files that will be deleted in RUN_DIR after run
551    [ -f stack ] && FileToBeDeleted[0]="stack"
552
553    # Test if the same run as already been saved :
554    if [ X${JobType} = XRUN ] ; then
555        if [ ${DRYRUN} -le 0 ] ; then
556            if ( IGCM_sys_TestFileArchive ${R_OUT_KSH}/${PREFIX}_${Exe_Output} ) ; then
557                IGCM_debug_Exit "IGCM_config_PeriodStart" "You are currently RErunning an old job."
558                IGCM_debug_Print 1 "Because of readonly permissions, you can't RErun a job when saved files"
559                IGCM_debug_Print 1 " are still in the ARCHIVE directory. You must deleted those files, or "
560                IGCM_debug_Print 1 " the whole ${R_SAVE} tree. See clean_month.job in ${libIGCM} directory."
561                IGCM_debug_Print 1 " This exit has been initiated because at least ${R_OUT_KSH}/${PREFIX}_${Exe_Output} exists."
562                IGCM_debug_Verif_Exit
563            fi
564        fi
565    else
566        if ( IGCM_sys_TestFileArchive ${R_OUT_KSH}/${PREFIX}_${Exe_Output} ) ; then
567            IGCM_debug_Print 1 "IGCM_config_PeriodStart" "RErun an old job. Allowed in DEBUG or DEV mode."
568        fi
569    fi
570
571    ExecutionFail=false
572
573    IGCM_debug_PopStack "IGCM_config_PeriodStart"
574}
575
576#===================================
577function IGCM_config_SaveSourceModifications
578{
579    IGCM_debug_PushStack "IGCM_config_SaveSourceModifications"
580
581    typeset ExeOutDateMax listVarEnv
582    ExeOutDateMax=$1
583
584    listVarEnv="ExeOutDateMax,R_OUT_EXE,PREFIX,SUBMIT_DIR"
585    IGCM_sys_RshMaster "\
586       . ${libIGCM}/libIGCM_sys/libIGCM_sys.ksh; \
587       export ExeOutDateMax=${ExeOutDateMax};\
588       export R_OUT_EXE=${R_OUT_EXE};\
589       export PREFIX=${PREFIX};\
590       export SUBMIT_DIR=${SUBMIT_DIR};\
591       export listVarEnv=${listVarEnv};\
592       Script_Output=out_SaveSourceModifications;\
593       IGCM_sys_Qsub ${libIGCM}/SaveSourceModifications.job ${ExeOutDateMax} ${R_OUT_EXE} ${PREFIX} ${SUBMIT_DIR}"
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 ExeSecDateMax
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    (( ExeSecDateMax = 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            IGCM_sys_GetDate_FichWork ${LS_bin} ExeSecDate
693            if [ $ExeSecDateMax -lt $ExeSecDate ] ; then
694                ExeSecDateMax=$ExeSecDate
695            fi
696        fi
697    done
698
699    if ( ${UpdateExe} ) ; then
700        echo "Launch SaveSourceModifications."
701        IGCM_config_SaveSourceModifications ${ExeSecDateMax}
702    fi
703
704    NextExeSize=${NextExeSize}" )"
705    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Log LastExeSize "${NextExeSize}"
706
707    if [ ${DRYRUN} -le 1 ] ; then
708        tail -1500 ${Exe_Output} > ${Exe_Output}_tail.txt
709        ExeCpuLog=$( gawk -f ${libIGCM}/libIGCM_sys/IGCM_add_out.awk ${Exe_Output}_tail.txt )
710        RET=$?
711        if [ $RET -eq 0 ] ; then
712            # ExeCpuLog variable contents 5 fields
713            echo "${CumulPeriod} ${PeriodDateBegin} ${PeriodDateEnd} ${ExeCpuLog} ${ExeDate}" |   \
714             gawk '{printf("# %11d | %15s | %15s | %19s | %19s | %15.5f | %15.5f | %15.5f | %s\n", \
715                              $1,$2,$3,$4,$5,$6,$7,$8,$9)}' >> ${SUBMIT_DIR}/run.card
716        fi
717        eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}_tail.txt"
718    fi
719
720    # All was right ? no ? then we stop.
721    IGCM_debug_Verif_Exit
722
723    # If all was OK, we can delete all files not necessary for next Job
724    echo
725    IGCM_debug_Print 1 "Files that will be deleted before next period-run : "
726
727    if [ ${DRYRUN} -le 2 ] ; then
728        for f in ${FileToBeDeleted[@]} ; do [ -f ${f} ] && ls -la $f ; [ -f ${f} ] && rm -f $f ; done
729    else
730        echo ${FileToBeDeleted[@]}
731    fi
732
733    #=================================================#
734    #         Modification of libIGCM behaviour       #
735    #=================================================#
736
737    # To use this function, one must copy libIGCM.card from ${libIGCM} directory
738    # and put it in ${SUBMIT_DIR} directory. After modifications of ${SUBMIT_DIR}/libIGCM.card,
739    # variables define inside [UserChanges] will be modified for next Period of libIGCM main loop.
740    if [ -f ${SUBMIT_DIR}/libIGCM.card ] ; then
741        echo
742        echo "########################################################################"
743        echo "!!!                 Modification of libIGCM behaviour                !!!"
744        echo
745
746        IGCM_debug_Print 1 "DefineArrayFromOption  : libIGCM_UserChanges in libIGCM.card"
747        IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/libIGCM.card UserChanges
748        IGCM_debug_Print 2 "libIGCM_UserChanges" ${libIGCM_UserChanges[*]}
749
750        # Special treatments for libIGCM internals
751        for option in ${libIGCM_UserChanges[*]} ; do
752            IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/libIGCM.card UserChanges ${option}
753
754            echo "We will change : ${option}."
755            eval echo "Previous value : " \${${option}}
756            eval echo "Change to : " \${libIGCM_UserChanges_${option}}
757           
758            eval ${option}=\${libIGCM_UserChanges_${option}}
759
760            case ${option} in
761                config_UserChoices_DateEnd)
762                    IGCM_debug_PrintVariables 1 config_UserChoices_DateEnd
763                    DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )
764
765                    # Period Length In Days between DateBegin and DateEnd
766                    (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
767                    if [ ${ExperienceLengthInDays} -lt 0 ] ; then
768                        IGCM_debug_Print 1 "Problem with dates in libIGCM.card : ${DateEnd} < ${DateBegin} ! You must check that."
769                        IGCM_debug_Exit "IGCM_PeriodEnd" " Wrong Dates."
770                        IGCM_debug_Verif_Exit
771                    fi
772                    ;;
773                config_UserChoices_PeriodLength)
774                    IGCM_debug_Print 1  "Change config_UserChoices_PeriodLength=${config_UserChoices_PeriodLength}"
775                    ;;
776                PeriodNb)
777                    IGCM_debug_Print 1  "Loop in main Job with ${PeriodNb} period(s)"
778                    ;;
779                config_Post_RebuildFrequency)
780                    IGCM_debug_Print 1  "Change config_Post_RebuildFrequency=${config_Post_RebuildFrequency} : IGCM_post_Configure"
781                    IGCM_post_Configure
782                    ;;
783                config_Post_TimeSeriesFrequency)
784                    IGCM_debug_Print 1  "Change config_Post_TimeSeriesFrequency = ${config_Post_TimeSeriesFrequency} : IGCM_post_Initialize"
785                    IGCM_post_Configure
786                    ;;
787                config_Post_SeasonalFrequency)
788                    IGCM_debug_Print 1  "Change config_Post_SeasonalFrequency = ${config_Post_SeasonalFrequency} : IGCM_post_Initialize"
789                    IGCM_post_Configure
790                    ;;
791            esac
792        done
793
794        echo
795        echo "########################################################################"
796        echo
797    fi
798
799    #=================================================#
800    #         Determine next computed period          #
801    #=================================================#
802
803    PeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateEnd} 1 )
804    IGCM_date_GetYearMonthDay $PeriodDateBegin year month day
805    year_m1=$(( year - 1 ))
806    year_p1=$(( year + 1 ))
807    IGCM_config_Analyse_PeriodLength
808    PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateBegin} $(( ${PeriodLengthInDays} - 1 )) )
809
810    # Debug Print :
811    echo
812    IGCM_debug_Print 1 "IGCM_config_PeriodEnd : Preparing Next Execution"
813    IGCM_debug_Print 1 "PeriodDateBegin       : ${PeriodDateBegin}"
814    IGCM_debug_Print 1 "PeriodDateEnd         : ${PeriodDateEnd}"
815    IGCM_debug_Print 1 "PeriodLengthInDays    : ${PeriodLengthInDays}"
816
817    PeriodDateBegin=$( IGCM_date_ConvertFormatToHuman ${PeriodDateBegin} )
818    PeriodDateEnd=$( IGCM_date_ConvertFormatToHuman ${PeriodDateEnd} )
819
820    (( CumulPeriod = CumulPeriod + 1 ))
821
822    # Debug Print :
823    echo
824    IGCM_debug_Print 3 "PeriodDateBegin Human : ${PeriodDateBegin}"
825    IGCM_debug_Print 3 "PeriodDateEnd Human   : ${PeriodDateEnd}"
826    IGCM_debug_Print 3 "CumulPeriod           : ${CumulPeriod}"
827
828    #=================================================#
829    #             Write updated run.card              #
830    #=================================================#
831
832    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration OldPrefix ${OldPrefix}
833    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
834    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
835    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
836
837    if ( ${FirstInitialize} ) ; then
838        # It's no more the first time
839        FirstInitialize=false
840    fi
841
842    IGCM_debug_PopStack "IGCM_config_PeriodEnd"
843}
844
845#===================================
846function IGCM_config_Finalize
847{
848    IGCM_debug_PushStack "IGCM_config_Finalize"
849
850    echo
851    IGCM_debug_Print 1 "IGCM_config_Finalize"
852    echo
853
854    if [ ${SimulationLengthInDays} -ge ${ExperienceLengthInDays} ] ; then
855        #==========================#
856        # End of entire simulation #
857        #==========================#
858
859        # Mail notification
860        IGCM_sys_SendMail
861
862        #
863        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Completed"
864        IGCM_debug_Print 1 "Normal End of computation."
865        if ( $DEBUG_debug ) ; then
866            echo
867            IGCM_debug_Print 1 "Your files on ${R_OUT} :"
868            IGCM_sys_Tree ${R_SAVE}
869        fi
870    else
871        #=================#
872        # Submit next job #
873        #=================#
874
875        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "OnQueue"
876
877        # Name of next Ksh Script output :
878        eval Script_Output="${Script_Output_Prefix}_${config_UserChoices_JobName}.$( printf "%06d" ${CumulPeriod} )"
879
880        IGCM_debug_Print 1 "Submit next job"
881        # SUBMIT NEXT JOB from SUBMIT_DIR and come back in RUN_DIR
882        IGCM_sys_Cd ${SUBMIT_DIR}
883        # Keep only the 5 latest ${Script_Output_Prefix}_${config_UserChoices_JobName}
884        ScriptTot=$( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? 2>/dev/null | wc -l )
885        [ ${ScriptTot} -gt 5 ] && rm -f $( ls ${Script_Output_Prefix}_${config_UserChoices_JobName}.?????? | head -$(( ${ScriptTot} - 5 )) )
886        # Submit next job and come back
887        IGCM_sys_Qsub ${SUBMIT_DIR}/Job_${config_UserChoices_JobName}
888        IGCM_sys_Cd -
889    fi
890
891    # Supress Non Deleted Boundary files
892    if [ ${DRYRUN} -le 2 ] ; then
893        IGCM_comp_DelFixeBoundaryFiles
894        ls -la
895    fi
896   
897    # Clean ${RUN_DIR}=${RUN_DIR_PATH}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
898    # Only for production run (No clean up in DEV or DEB mode)
899    # and command sent from .. directory.
900    IGCM_sys_Cd ..
901    [ X${JobType} = XRUN ] && IGCM_sys_Rm -rf ${RUN_DIR}
902
903    IGCM_debug_PopStack "IGCM_config_Finalize"
904}
905
906#===================================
Note: See TracBrowser for help on using the repository browser.