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

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