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

Last change on this file since 341 was 341, checked in by mmaipsl, 14 years ago

Echo SpaceName? and ExperimentName? if they exist in config.card.

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