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

Last change on this file since 187 was 187, checked in by aclsce, 15 years ago

Use of TMPDIR_IGCM as TMPDIR.
Remove RUN_DIR at the end on RUN mode.
Removed Master variable declared as read-only variable.
Removed echo in count_archive function.
Coherence in filename used by mail function.

  • 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.1 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            if [ X${config_Post_RebuildFrequency} != X${config_UserChoices_PeriodLength} ] ; then
227                echo "------------"
228                echo "WARNING : Job is NOT in RUN mode then we will force REBUILD Frequency"
229                echo "          to PeriodLength : ${config_UserChoices_PeriodLength}"
230                echo "------------"
231                config_Post_RebuildFrequency=${config_UserChoices_PeriodLength}
232            fi
233        fi
234        echo "===================================================="
235        echo
236    fi
237
238    #====================================================
239    #R_OUT_KSH : Storage place for job output
240    #R_OUT_EXE : Storage place for binary used during simulation
241    R_OUT_KSH=${R_SAVE}/Out
242    R_OUT_EXE=${R_SAVE}/Exe
243
244    IGCM_debug_PopStack "IGCM_config_Initialize"
245}
246
247#===================================
248function IGCM_config_Analyse_PeriodLength
249{
250    IGCM_debug_PushStack "IGCM_config_Analyse_PeriodLength"
251
252    typeset i
253
254    # Determine number of day(s) in PeriodLength :
255    case ${config_UserChoices_PeriodLength} in
256        *Y|*y)
257            PeriodLengthInYears=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[yY]//' ) 
258            IGCM_debug_Print 1 "Number of years for PeriodLength : ${PeriodLengthInYears}"
259            PeriodLengthInDays=0
260            i=0
261            until [ $i -ge $PeriodLengthInYears ] ; do 
262                (( PeriodLengthInDays = PeriodLengthInDays + $( IGCM_date_DaysInYear $(( year + i )) ) )) 
263                (( i=i+1 )) 
264            done 
265            ;;
266        *M|*m)
267            PeriodLengthInMonths=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[mM]//' ) 
268            IGCM_debug_Print 1 "Number of months for PeriodLength : ${PeriodLengthInMonths}"
269            PeriodLengthInDays=0
270            i=0
271            until [ $i -ge $PeriodLengthInMonths ] ; do
272                if [ $(( month + i )) -lt 13 ] ; then 
273                    (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( month + i )) ) )) 
274                else 
275                    (( PeriodLengthInDays  = PeriodLengthInDays + $( IGCM_date_DaysInMonth $year $(( month + i - 12 )) ) )) 
276                fi 
277                (( i=i+1 )) 
278            done 
279            ;;
280        *D|*d) 
281            PeriodLengthInMonths=0
282            PeriodLengthInDays=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[dD]//' );;
283        *) 
284            IGCM_debug_Exit "IGCM_config_Analyse_PeriodLength " ${config_UserChoices_PeriodLength} " invalid period length : choose in *Y, *M, *D."
285            IGCM_debug_Verif_Exit ;;
286    esac
287
288    IGCM_debug_PopStack "IGCM_config_Analyse_PeriodLength"
289
290}
291
292#===================================
293function IGCM_config_PeriodStart
294{
295    IGCM_debug_PushStack "IGCM_config_PeriodStart"
296
297    echo
298    IGCM_debug_Print 1 "IGCM_config_PeriodStart :"
299    echo
300
301    if [ ! -r ${SUBMIT_DIR}/run.card ]; then 
302
303        #================================================#
304        #         The file run.card doesn't exist        #
305        #================================================#
306
307        eval FirstInitialize=true
308
309        #copy initial run.card
310        IGCM_sys_Cp ${SUBMIT_DIR}/run.card.init ${SUBMIT_DIR}/run.card
311
312        IGCM_date_GetYearMonth $DateBegin year month
313        IGCM_config_Analyse_PeriodLength
314
315        eval PeriodDateBegin=${DateBegin} > /dev/null 2>&1
316        PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${DateBegin} $(( ${PeriodLengthInDays} - 1 )) )
317        eval CumulPeriod=1 > /dev/null 2>&1
318
319        #=================================================#
320        #        Creation and write updated run.card      #
321        #=================================================#
322
323        #Correct run.card Configuration for this period
324        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
325        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
326        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
327        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
328 
329    else
330        #================================================#
331        #         The file run.card allready exist       #
332        #================================================#
333
334        eval FirstInitialize=false
335
336        #Test state of run in run.card
337        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState
338        if ( [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then
339            echo
340            IGCM_debug_Print 1 "!!!!!! IGCM_config_PeriodStart Error PeriodState : " ${run_Configuration_PeriodState} "!!!!!!!!!!"
341            echo
342            IGCM_debug_Exit "IGCM_config_PeriodStart Error PeriodState : " ${run_Configuration_PeriodState}
343            IGCM_debug_Verif_Exit
344        fi
345
346        #===================================#
347        #        Read updated run.card      #
348        #===================================#
349
350        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration OldPrefix
351        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin
352        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd
353        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod
354
355        PeriodDateBegin=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateBegin} )
356        PeriodDateEnd=$( IGCM_date_ConvertFormatToGregorian ${run_Configuration_PeriodDateEnd} )
357        eval CumulPeriod="${run_Configuration_CumulPeriod}" > /dev/null 2>&1
358
359        if [ ${Period} = 1 ]; then
360           # save last Job output
361            typeset LastPeriod Last_Script_Output_Name
362            (( LastPeriod=CumulPeriod-PeriodNb ))
363            Last_Script_Output_Name="${Script_Output_Prefix}_${config_UserChoices_JobName}.$( printf "%06d" ${LastPeriod} )"
364            #eval ls -l ${SUBMIT_DIR}/${Last_Script_Output_Name}
365            #eval IGCM_sys_Put_Out ${SUBMIT_DIR}/${Last_Script_Output_Name} ${R_OUT_KSH}/${Last_Script_Output_Name} > /dev/null 2>&1
366            IGCM_debug_Print 1 "Try to save previous ksh job output"
367            IGCM_sys_Cd ${SUBMIT_DIR}/
368            IGCM_sys_Put_Out ${Last_Script_Output_Name} ${R_OUT_KSH}/${Last_Script_Output_Name}.$$
369            IGCM_sys_Cd ${RUN_DIR}
370        else
371            unset FileToBeDeleted
372        fi
373
374        IGCM_date_GetYearMonth $PeriodDateBegin year month
375        IGCM_config_Analyse_PeriodLength
376
377        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Running"
378
379    fi   
380    OldPrefix=${config_UserChoices_JobName}_${PeriodDateEnd}
381 
382    #===================================================================#
383    # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
384    #             But available to any son functions                    #
385    #===================================================================#
386
387    # Period Length In Days between DateBegin and DateCurrent (at end of period == PeriodDateEnd !)
388    (( SimulationLengthInDays = $( IGCM_date_DaysBetweenGregorianDate ${PeriodDateEnd} ${DateBegin} ) + 1 ))
389
390    # Debug Print :
391    IGCM_debug_Print 1 "IGCM_config_PeriodStart : Before Execution"
392    IGCM_debug_Print 3 "Year of simulation      : ${year}"
393    IGCM_debug_Print 3 "Month of simulation     : ${month}"
394    IGCM_debug_Print 3 "PeriodLengthInDays      : ${PeriodLengthInDays}"
395    IGCM_debug_Print 3 "PeriodDateBegin         : ${PeriodDateBegin}"
396    IGCM_debug_Print 3 "PeriodDateEnd           : ${PeriodDateEnd}"
397    IGCM_debug_Print 3 "SimulationLengthInDays  : ${SimulationLengthInDays}"
398    IGCM_debug_Print 3 "ExperienceLengthInDays  : ${ExperienceLengthInDays}"
399
400    #================================================================#
401    #         Prepare variables available for comp_finalyze          #
402    #================================================================#
403
404    # Period for save files
405    eval DatesPeriod=${PeriodDateBegin}_${PeriodDateEnd} > /dev/null 2>&1
406
407    # Prefix for save files of this period
408    eval PREFIX=${config_UserChoices_JobName}_${DatesPeriod}  > /dev/null 2>&1
409
410    # List of files that will be deleted in RUN_DIR after run
411    [ -f stack ] && FileToBeDeleted[0]="stack"
412
413    # Test if the same run as already been saved :
414    if [ X${JobType} = XRUN ] ; then
415        if [ ${DRYRUN} -le 0 ] ; then
416            if ( IGCM_sys_TestFileArchive ${R_OUT_KSH}/${PREFIX}_${Exe_Output} ) ; then
417                IGCM_debug_Exit "IGCM_config_PeriodStart" "RErun an old job."
418                IGCM_debug_Print 1 "Because of readonly permissions, you can't RErun a job when saved files"
419                IGCM_debug_Print 1 " are still in the ARCHIVE directory. You must deleted those files, or "
420                IGCM_debug_Print 1 " the whole ${R_SAVE} tree."
421                IGCM_debug_Verif_Exit
422            fi
423        fi
424    else
425        if ( IGCM_sys_TestFileArchive ${R_OUT_KSH}/${PREFIX}_${Exe_Output} ) ; then
426            IGCM_debug_Print 1 "IGCM_config_PeriodStart" "RErun an old job. DEBUG of DEV mode."
427        fi
428    fi
429
430    IGCM_debug_PopStack "IGCM_config_PeriodStart"
431}
432
433#===================================
434function IGCM_config_PeriodEnd
435{
436    IGCM_debug_PushStack "IGCM_config_PeriodEnd"
437
438    echo
439    IGCM_debug_Print 1 "IGCM_config_PeriodEnd :"
440    echo
441
442    #==================================#
443    #         Save Job output          #
444    #==================================#
445    IGCM_sys_Put_Out ${Exe_Output} ${R_OUT_KSH}/${PREFIX}_${Exe_Output}
446    eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}"
447
448    typeset LS_comp LS_bin ExeDate ExeCpuLog ExeSize NextExeSize LastCompExeSize
449    typeset comp i   
450    typeset ExeNameIn ExeNameOut
451
452    #==================================#
453    #        Get last Exe Size         #
454    #==================================#
455
456    (( i=0 ))
457    if ( ${FirstInitialize} ) ; then
458        run_Log_LastExeSize=""
459        for comp in ${config_ListOfComponents[*]} ; do
460            run_Log_LastExeSize[$i]=0
461            (( i=i+1 ))
462        done
463    else
464        IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/run.card Log LastExeSize
465    fi
466
467    #==================================#
468    #         And Build ExeDate        #
469    #==================================#
470
471    # 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
472    # 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")
473    # 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
474    ExeDate=""
475    NextExeSize="( "
476    (( i=0 ))
477
478    for comp in ${config_ListOfComponents[*]} ; do
479
480        IGCM_debug_Print 1 ${comp}
481
482        eval ExeNameIn=\${config_Executable_${comp}[0]}
483        eval ExeNameOut=\${config_Executable_${comp}[1]}
484        # Only if we really have an executable for the component :
485        if [ X${ExeNameIn} = X\"\" ] ; then
486            # If there is no exe file for this component
487            (( ExeSize=0 ))
488        else
489            eval LS_bin=${R_EXE}/${ExeNameIn}
490            IGCM_sys_FileSize ${LS_bin} ExeSize
491
492            set +A LS_comp -- $( LC_TIME=en_US ls -l ${LS_bin} )
493            if [ X${ExeDate} = X ] ; then 
494                # First component exe date
495                ExeDate=${comp}_${LS_comp[5]}_${LS_comp[6]}
496            else
497                ExeDate=${ExeDate}-${comp}_${LS_comp[5]}_${LS_comp[6]}
498            fi
499            ExeDate=${ExeDate}_${LS_comp[7]}
500        fi
501
502        if [ ${i} -eq 0 ] ; then
503            # First component
504            NextExeSize="( "${ExeSize}
505        else
506            NextExeSize=${NextExeSize}", "${ExeSize}
507        fi
508        eval LastCompExeSize=${run_Log_LastExeSize[$i]}
509        (( i=i+1 ))
510
511        if [ ${ExeSize} -ne ${LastCompExeSize} ] ; then
512            if ( ${FirstInitialize} ) ; then
513                IGCM_debug_Print 1 "Put first ${ExeNameIn} in ${R_OUT_EXE} !"
514            else
515                IGCM_debug_Print 1 "${ExeNameIn} has changed in ${R_EXE} !"
516                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${ExeNameOut}
517            fi
518            eval IGCM_sys_Put_Out ${ExeNameOut} ${R_OUT_EXE}/${PREFIX}_${ExeNameIn}
519            IGCM_sys_Chmod u+xw ${ExeNameOut}
520        fi
521    done
522
523    if [ ${DRYRUN} -le 1 ] ; then
524        typeset ExeCpuLog
525        tail -1500 ${Exe_Output} > ${Exe_Output}_tail.txt
526        ExeCpuLog=$( gawk -f ${libIGCM}/libIGCM_sys/IGCM_add_out.awk ${Exe_Output}_tail.txt )
527        RET=$?
528        if [ $RET -eq 0 ] ; then
529            # ExeCpuLog variable contents 5 fields
530            echo "${CumulPeriod} ${PeriodDateBegin} ${PeriodDateEnd} ${ExeCpuLog} ${ExeDate}" |   \
531             gawk '{printf("# %11d | %15s | %15s | %19s | %19s | %15.5f | %15.5f | %15.5f | %s\n", \
532                              $1,$2,$3,$4,$5,$6,$7,$8,$9)}' >> ${SUBMIT_DIR}/run.card
533        fi
534        eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}_tail.txt"
535    fi
536
537    NextExeSize=${NextExeSize}" )"
538    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Log LastExeSize "${NextExeSize}"
539
540    # All was right ? no ? then we stop.
541    IGCM_debug_Verif_Exit
542
543    # If all was OK, we can delete all files not necessary for next Job
544    IGCM_debug_Print 1 "Files that will be deleted before next period-run : "
545
546    if [ ${DRYRUN} -le 2 ] ; then
547        for f in ${FileToBeDeleted[@]} ; do [ -f ${f} ] && ls -la $f ; [ -f ${f} ] && rm -f $f ; done
548    else
549        echo ${FileToBeDeleted[@]}
550    fi
551
552    #=================================================#
553    #         Modification of libIGCM behaviour       #
554    #=================================================#
555
556    # To use this function, one must copy libIGCM.card from ${libIGCM} directory
557    # and put it in ${SUBMIT_DIR} directory. Ater modifications of ${SUBMIT_DIR}/libIGCM.card,
558    # variables define inside [UserChanges] will be modified for next Period of libIGCM main loop.
559    if [ -f ${SUBMIT_DIR}/libIGCM.card ] ; then
560        echo
561        echo "########################################################################"
562        echo "!!!                 Modification of libIGCM behaviour                !!!"
563        echo
564
565        IGCM_debug_Print 1 "DefineArrayFromOption  : libIGCM_UserChanges in libIGCM.card"
566        IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/libIGCM.card UserChanges
567        IGCM_debug_Print 2 "libIGCM_UserChanges" ${libIGCM_UserChanges[*]}
568
569        # Special treatments for libIGCM internals
570        for option in ${libIGCM_UserChanges[*]} ; do
571            IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/libIGCM.card UserChanges ${option}
572
573            echo "We will change : ${option}."
574            eval echo "Previous value : " \${${option}}
575            eval echo "Change to : " \${libIGCM_UserChanges_${option}}
576           
577            eval ${option}=\${libIGCM_UserChanges_${option}}
578
579            case ${option} in
580                config_UserChoices_DateEnd)
581                    IGCM_debug_PrintVariables 3 config_UserChoices_DateEnd
582                    DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )
583
584                    # Period Length In Days between DateBegin and DateEnd
585                    (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
586                    if [ ${ExperienceLengthInDays} -lt 0 ] ; then
587                        IGCM_debug_Print 1 "Problem with dates in libIGCM.card : ${DateEnd} < ${DateBegin} ! You must check that."
588                        IGCM_debug_Exit "IGCM_PeriodEnd" " Wrong Dates."
589                        IGCM_debug_Verif_Exit
590                    fi
591                    ;;
592                config_UserChoices_PeriodLength)
593                    ;;
594                PeriodNb)
595                    IGCM_debug_Print 3  "Loop in main Job with ${PeriodNb} period(s)"
596                    ;;
597                config_Post_RebuildFrequency)
598                    IGCM_debug_Print 3  "Change config_Post_RebuildFrequency=${config_Post_RebuildFrequency} : IGCM_post_Configure"
599                    IGCM_post_Configure
600                    ;;
601                config_Post_TimeSeriesFrequency)
602                    IGCM_debug_Print 3  "Change config_Post_TimeSeriesFrequency = ${config_Post_TimeSeriesFrequency} : IGCM_post_Initialize"
603                    IGCM_post_Configure
604                    ;;
605                config_Post_SeasonalFrequency)
606                    IGCM_debug_Print 3  "Change config_Post_SeasonalFrequency = ${config_Post_SeasonalFrequency} : IGCM_post_Initialize"
607                    IGCM_post_Configure
608                    ;;
609            esac
610        done
611
612        echo
613        echo "########################################################################"
614        echo
615    fi
616
617    #=================================================#
618    #         Determine next computed period          #
619    #=================================================#
620
621    PeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateEnd} 1 )
622    IGCM_date_GetYearMonth $PeriodDateBegin year month
623
624    IGCM_config_Analyse_PeriodLength
625    PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateBegin} $(( ${PeriodLengthInDays} - 1 )) )
626
627    # Debug Print :
628    echo
629    IGCM_debug_Print 1 "IGCM_config_PeriodEnd : Preparing Next Execution"
630    IGCM_debug_Print 3 "PeriodDateBegin       : ${PeriodDateBegin}"
631    IGCM_debug_Print 3 "PeriodDateEnd         : ${PeriodDateEnd}"
632    IGCM_debug_Print 3 "PeriodLengthInDays    : ${PeriodLengthInDays}"
633
634    PeriodDateBegin=$( IGCM_date_ConvertFormatToHuman ${PeriodDateBegin} )
635    PeriodDateEnd=$( IGCM_date_ConvertFormatToHuman ${PeriodDateEnd} )
636
637    (( CumulPeriod = CumulPeriod + 1 ))
638
639    # Debug Print :
640    echo
641    IGCM_debug_Print 3 "PeriodDateBegin Human : ${PeriodDateBegin}"
642    IGCM_debug_Print 3 "PeriodDateEnd Human   : ${PeriodDateEnd}"
643    IGCM_debug_Print 3 "CumulPeriod           : ${CumulPeriod}"
644
645    #=================================================#
646    #             Write updated run.card              #
647    #=================================================#
648
649    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration OldPrefix ${OldPrefix}
650    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
651    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
652    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
653
654    IGCM_debug_PopStack "IGCM_config_PeriodEnd"
655}
656
657#===================================
658function IGCM_config_Finalize
659{
660    IGCM_debug_PushStack "IGCM_config_Finalize"
661
662    echo
663    IGCM_debug_Print 1 "IGCM_config_Finalize :"
664    echo
665
666    if [ ${SimulationLengthInDays} -ge ${ExperienceLengthInDays} ] ; then
667
668        #==========================#
669        # End of entire simulation #
670        #==========================#
671
672        # Mail notification
673        IGCM_sys_SendMail
674
675        #
676        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Completed"
677        IGCM_debug_Print 1 "Normal End of computation."
678        if ( $DEBUG_debug ) ; then
679            echo
680            IGCM_debug_Print 1 "Your files on ${R_OUT} :"
681            IGCM_sys_Tree ${R_SAVE}
682        fi
683   
684    else
685
686        #=================#
687        # Submit next job #
688        #=================#
689
690        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "OnQueue"
691
692        # Name of next Ksh Script output :
693        eval Script_Output="${Script_Output_Prefix}_${config_UserChoices_JobName}.$( printf "%06d" ${CumulPeriod} )"
694
695        IGCM_debug_Print 1 "Submit next job"
696        # SUBMIT NEXT JOB
697        IGCM_sys_Cd ${SUBMIT_DIR}
698        IGCM_sys_Qsub ${SUBMIT_DIR}/Job_${config_UserChoices_JobName}
699    fi
700
701    # Supress Non Deleted Boundary files
702    if [ ${DRYRUN} -le 2 ] ; then
703        IGCM_comp_DelFixeBoundaryFiles
704        ls -la
705    fi
706
707    # Clean ${RUN_DIR}=${RUN_DIR_PATH}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
708    # Only for production run (No clean up in DEV or DEB mode)
709    [ X${JobType} = XRUN ] && IGCM_sys_Rm -rf ${RUN_DIR}
710
711    IGCM_debug_PopStack "IGCM_config_Finalize"
712}
713
714#===================================
Note: See TracBrowser for help on using the repository browser.