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

Last change on this file since 373 was 373, checked in by sdipsl, 14 years ago

Remove libIGCM_sys_claude.ksh and libIGCM_sys_calculo.ksh
Update/homogenize all headers usgin the new fixed-length keyword syntax regarding properties keywords
$Rev:: 13 i $: Revision of last commit
$Author:: harry $: Author of last commit
$Date:: 2006-03-15 02:33:03 -0500 (Wed, 15 Mar 2006) $: Date of last commit
Add / update original author and contact when missing

  • Property licence set to
    The following licence information concerns ONLY the libIGCM tools
    ==================================================================

    Copyright © Centre National de la Recherche Scientifique CNRS
    Commissariat à l'Énergie Atomique CEA

    libIGCM : Library for Portable Models Computation of IGCM Group.

    IGCM Group is the french IPSL Global Climate Model Group.

    This library is a set of shell scripts and functions whose purpose is
    the management of the initialization, the launch, the transfer of
    output files, the post-processing and the monitoring of datas produce
    by any numerical program on any plateforme.

    This software is governed by the CeCILL license under French law and
    abiding by the rules of distribution of free software. You can use,
    modify and/ or redistribute the software under the terms of the CeCILL
    license as circulated by CEA, CNRS and INRIA at the following URL
    "http://www.cecill.info".

    As a counterpart to the access to the source code and rights to copy,
    modify and redistribute granted by the license, users are provided only
    with a limited warranty and the software's author, the holder of the
    economic rights, and the successive licensors have only limited
    liability.

    In this respect, the user's attention is drawn to the risks associated
    with loading, using, modifying and/or developing or reproducing the
    software by the user in light of its specific status of free software,
    that may mean that it is complicated to manipulate, and that also
    therefore means that it is reserved for developers and experienced
    professionals having in-depth computer knowledge. Users are therefore
    encouraged to load and test the software's suitability as regards their
    requirements in conditions enabling the security of their systems and/or
    data to be ensured and, more generally, to use and operate it in the
    same conditions as regards security.

    The fact that you are presently reading this means that you have had
    knowledge of the CeCILL license and that you accept its terms.
  • Property svn:keywords set to Revision Author Date
File size: 28.7 KB
Line 
1#!/bin/ksh
2
3#**************************************************************
4# Author: Sebastien Denvil, Martial Mancip
5# Contact: Sebastien.Denvil__at__ipsl.jussieu.fr Martial.Mancip__at__ipsl.jussieu.fr
6# $Revision::                                          $ Revision of last commit
7# $Author::                                            $ Author of last commit
8# $Date::                                              $ Date of last commit
9# IPSL (2006)
10#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC
11#
12#**************************************************************
13
14#===================================
15function IGCM_config_Initialize
16{
17    IGCM_debug_PushStack "IGCM_config_Initialize"
18
19    # Debug Print :
20    echo
21    IGCM_debug_Print 1 "IGCM_config_Initialize :"
22    echo
23
24    # Test modipsl tree existence.
25    IGCM_sys_TestDir ${MODIPSL}
26    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
27    IGCM_sys_TestDir ${libIGCM}
28    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
29    IGCM_sys_TestDir ${R_EXE}
30    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
31    IGCM_sys_TestDir ${SUBMIT_DIR}
32    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
33
34    if ( $DEBUG_debug ) ; then
35        echo "Keep trace of inital SUBMIT_DIR : "
36        ls -lta ${SUBMIT_DIR}
37    fi
38
39    #==================================
40
41    typeset option auxprint CompatibilityTag
42    # Read libIGCM compatibility version in config.card
43    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Compatibility libIGCM
44    eval CompatibilityTag=${config_Compatibility_libIGCM} > /dev/null 2>&1     
45
46    if [ ! "${CompatibilityTag}" = "${libIGCM_CurrentTag}" ] ; then
47        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 ."
48    fi
49
50    #==================================
51    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card UserChoices
52
53    for option in ${config_UserChoices[*]} ; do
54        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card UserChoices ${option}
55    done
56
57    IGCM_debug_Print 1 "DefineArrayFromOption  : config_UserChoices"
58    # Name Space of this experience
59    if [ X${config_UserChoices_SpaceName} != X ] ; then
60        IGCM_debug_PrintVariables 3 config_UserChoices_SpaceName
61    fi
62    # Expericence class of the run
63    if [ X${config_UserChoices_ExperimentName} != X ] ; then
64        IGCM_debug_PrintVariables 3 config_UserChoices_ExperimentName
65    fi
66    IGCM_debug_PrintVariables 3 config_UserChoices_JobName
67    if [ 3 -le ${Verbosity} ] ; then
68        echo "--------------Debug3-->" "config_UserChoices_LongName="
69        echo "--------------Debug3-->" \"${config_UserChoices_LongName}\"
70    fi
71    IGCM_debug_PrintVariables 3 config_UserChoices_TagName
72    IGCM_debug_PrintVariables 3 config_UserChoices_CalendarType
73    IGCM_debug_PrintVariables 3 config_UserChoices_DateBegin
74    IGCM_debug_PrintVariables 3 config_UserChoices_DateEnd
75    IGCM_debug_PrintVariables 3 config_UserChoices_PeriodLength
76
77    #==================================
78
79    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card ListOfComponents
80
81    echo
82    IGCM_debug_Print 1 "DefineArrayFromSection : ListOfComponents"
83    IGCM_debug_Print 3 ${config_ListOfComponents[*]}
84    echo
85
86    NbComponents=${#config_ListOfComponents[*]}
87
88    #==================================
89    # Define principal executable
90
91    IGCM_card_DefineArrayFromSection   ${SUBMIT_DIR}/config.card Executable
92    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Executable Name
93   
94    #==================================
95    # Define Outputs Name
96    IGCM_debug_Print 1 "Define Script_Output_Prefix and Exe_Output"
97    eval Script_Output_Prefix=${config_UserChoices_Script_Output_Prefix:='Script_Output'}
98    IGCM_debug_Print 3 "Script_Output_Prefix = ${Script_Output_Prefix}"
99    eval Exe_Output=out_${config_Executable_Name}
100    IGCM_debug_Print 3 "Exe_Output           = ${Exe_Output}"
101
102    #==================================
103
104    #===================================================================#
105    # Prepare variables available for ${COMP}.card and ${COMP}.driver   #
106    #             But available to any son functions                    #
107    #===================================================================#
108
109    # Convert yyyy-mm-dd date to gregorian yyyymmdd
110    DateBegin=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateBegin} )
111    DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )
112
113    # Period Length In Days between DateBegin and DateEnd
114    (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
115    if [ ${ExperienceLengthInDays} -lt 0 ] ; then
116        IGCM_debug_Print 1 "Problem with dates in config.card : ${DateEnd} < ${DateBegin} ! You must check that."
117        IGCM_debug_Exit "IGCM_config_Initialize" " Wrong Dates."
118        IGCM_debug_Verif_Exit
119    fi
120
121    # Day and Year of Initial State (Given in julian format)
122    InitDay=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) % 1000 ))
123    InitYear=$(( $( IGCM_date_ConvertGregorianDateToJulian $DateBegin ) / 1000 ))
124
125    #==================================
126    # Restarts : Gerneral rule or local for each component ?
127    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card Restarts
128
129    echo
130    IGCM_debug_Print 1 "DefineArrayFromOption : config_Restarts"
131
132    for option in ${config_Restarts[*]} ; do
133        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Restarts ${option}
134        eval auxprint=\${config_Restarts_${option}}
135        IGCM_debug_Print 3 "${option} : ${auxprint}"
136    done
137
138    #================================================================#
139    #                  Test and Prepare directories                  #
140    #================================================================#
141
142    # ==> 4 kinds of input files :
143    #     1) R_INIT  : Initial State Files   (Etat0, carteveg)
144    #     2) R_BC    : Boundary Conditions   (Forcages, lai)
145    #     3) Parameters files (allready define through ${SUBMIT_DIR})
146    #     4) Restarts files   (allready define in IGCM_config_Initialize)
147
148    # Here we offer the possibility to redefine R_INIT, R_BC
149    # and PeriodNb through config.card
150    R_INIT=${config_UserChoices_R_INIT:=${R_IN}/INIT}
151    echo
152    IGCM_debug_Print 1 "(Re)Define R_INIT, R_BC and PeriodNb"
153    IGCM_debug_Print 3 "R_INIT=${R_INIT}"
154    R_BC=${config_UserChoices_R_BC:=${R_IN}/BC}
155    IGCM_debug_Print 3  "R_BC=${R_BC}"
156    PeriodNb=${config_UserChoices_PeriodNb:=${PeriodNb}}
157    IGCM_debug_Print 3  "Loop in main Job with ${PeriodNb} period(s)"
158
159    # Test Archive input/output.
160    IGCM_sys_TestDirArchive ${ARCHIVE}
161    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
162    IGCM_sys_TestDirArchive ${R_IN}
163    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
164
165    #====================================================
166    #R_SAVE : Job output directory
167    if ( [ ! X${config_UserChoices_SpaceName} = X ] && [ ! X${config_UserChoices_ExperimentName} = X ] ) ; then
168        FreeName=$( echo ${config_UserChoices_JobName} | sed 's/.*_//' )
169        R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
170        R_DODS=${config_UserChoices_TagName}/${config_UserChoices_SpaceName}/${config_UserChoices_ExperimentName}/${FreeName}
171    else
172        R_SAVE=${R_OUT}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
173        R_DODS=${config_UserChoices_TagName}/${config_UserChoices_JobName}
174    fi
175
176    if [ ! -f ${SUBMIT_DIR}/run.card ]; then
177        IGCM_sys_MkdirArchive ${R_SAVE}
178    else
179        #Test state of run in run.card
180        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/run.card Configuration PeriodState
181        if ( [ ${run_Configuration_PeriodState} != "Start" ] && [ ${run_Configuration_PeriodState} != "Running" ] && [ ${run_Configuration_PeriodState} != "OnQueue" ] && [ ${run_Configuration_PeriodState} != "Continue" ] ) ; then
182            echo
183            IGCM_debug_Print 1 "!!!! IGCM_config_Initialize Error PeriodState : " ${run_Configuration_PeriodState} "!!!!!!!!!!"
184            echo
185            IGCM_debug_Exit "IGCM_config_Initialize Error PeriodState : " ${run_Configuration_PeriodState}
186            IGCM_debug_Verif_Exit
187        fi
188    fi
189    IGCM_sys_TestDirArchive ${R_SAVE}
190    [ $? != 0 ] && IGCM_debug_Exit "IGCM_sys_TestDirArchive"
191
192    #==================================
193    # Post :
194    IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/config.card Post
195
196    echo
197    IGCM_debug_Print 1 "DefineArrayFromOption : config_Post"
198
199    for option in ${config_Post[*]} ; do
200        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card Post ${option}
201        eval auxprint=\${config_Post_${option}}
202        IGCM_debug_Print 3 "${option} : ${auxprint}"
203    done
204
205    #====================================================
206    # Define REBUILD_DIR : where we store files needing rebuild process
207    if [ X${config_Post_RebuildFromArchive} = Xtrue ] ; then
208        REBUILD_DIR=${R_SAVE}/TMP
209        IGCM_sys_MkdirArchive ${REBUILD_DIR}
210    else
211        REBUILD_DIR=${BIG_DIR}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
212        IGCM_sys_MkdirWork ${REBUILD_DIR}
213    fi
214
215    #====================================================
216    # Experience type : DEB(ug), DEV(elopment), RUN
217    if [ X${JobType} != XRUN ] ; then
218        echo
219        echo "===================================================="
220        echo "libIGCM JOB is NOT in RUN type mode."
221        echo "!! OUTPUT files will NOT be PROTECTED !!"
222        echo "Be carefull : you can ERASE the result of this job !"
223
224        case ${JobType} in
225            DEB)
226                echo "DEBUG mode : activation of 'set -vx' mode."
227                echo "DEBUG mode : no protection for output files."
228                echo "DEBUG mode : if active force asynchronous rebuild frequency to PeriodLength frequency."
229                ;;
230            DEV)
231                echo "DEVelopment mode : no protection for output files."
232                echo "DEVelopment mode : if active force asynchronous rebuild frequency to PeriodLength frequency."
233                ;;
234        esac
235
236        if [ X${config_Post_RebuildFrequency} != XNONE ] ; then
237            if [ X${config_Post_RebuildFrequency} != X${config_UserChoices_PeriodLength} ] ; then
238                echo "------------"
239                echo "WARNING : Job is NOT in RUN mode then we will force REBUILD Frequency"
240                echo "          to PeriodLength : ${config_UserChoices_PeriodLength}"
241                echo "------------"
242                config_Post_RebuildFrequency=${config_UserChoices_PeriodLength}
243            fi
244        fi
245        echo "===================================================="
246        echo
247    fi
248
249    #====================================================
250    #R_OUT_KSH : Storage place for job output
251    #R_OUT_EXE : Storage place for binary used during simulation
252    R_OUT_KSH=${R_SAVE}/Out
253    R_OUT_EXE=${R_SAVE}/Exe
254
255    IGCM_debug_PopStack "IGCM_config_Initialize"
256}
257
258#===================================
259function IGCM_config_Analyse_PeriodLength
260{
261    IGCM_debug_PushStack "IGCM_config_Analyse_PeriodLength"
262
263    typeset i
264
265    # Determine number of day(s) in PeriodLength :
266    case ${config_UserChoices_PeriodLength} in
267        *Y|*y)
268            PeriodLengthInYears=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[yY]//' ) 
269            IGCM_debug_Print 1 "Number of years for PeriodLength : ${PeriodLengthInYears}"
270            PeriodLengthInDays=0
271            typeset i
272            i=0
273            until [ $i -ge $PeriodLengthInYears ] ; do 
274                (( PeriodLengthInDays = PeriodLengthInDays + $( IGCM_date_DaysInYear $(( year + i )) ) )) 
275                (( i=i+1 )) 
276            done 
277            ;;
278        *M|*m)
279            PeriodLengthInMonths=$( echo ${config_UserChoices_PeriodLength} | sed -e 's/[mM]//' ) 
280            IGCM_debug_Print 1 "Number of months for PeriodLength : ${PeriodLengthInMonths}"
281            PeriodLengthInDays=0
282            typeset i
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    typeset i
479    (( i=0 ))
480    if ( ${FirstInitialize} ) ; then
481        run_Log_LastExeSize=""
482        for comp in ${config_ListOfComponents[*]} ; do
483            run_Log_LastExeSize[$i]=0
484            (( i=i+1 ))
485        done
486    else
487        IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/run.card Log LastExeSize
488    fi
489
490    #==================================#
491    #         And Build ExeDate        #
492    #==================================#
493
494    # 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
495    # 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")
496    # 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
497    ExeDate=""
498    NextExeSize="( "
499    (( i=0 ))
500
501    for comp in ${config_ListOfComponents[*]} ; do
502
503        IGCM_debug_Print 1 ${comp}
504
505        eval ExeNameIn=\${config_Executable_${comp}[0]}
506        eval ExeNameOut=\${config_Executable_${comp}[1]}
507        # Only if we really have an executable for the component :
508        if [ X${ExeNameIn} = X\"\" ] ; then
509            # If there is no exe file for this component
510            (( ExeSize=0 ))
511        else
512            eval LS_bin=${R_EXE}/${ExeNameIn}
513            IGCM_sys_FileSize ${LS_bin} ExeSize
514
515            set +A LS_comp -- $( LC_TIME=en_US ls -l ${LS_bin} )
516            if [ X${ExeDate} = X ] ; then 
517                # First component exe date
518                ExeDate=${comp}_${LS_comp[5]}_${LS_comp[6]}
519            else
520                ExeDate=${ExeDate}-${comp}_${LS_comp[5]}_${LS_comp[6]}
521            fi
522            ExeDate=${ExeDate}_${LS_comp[7]}
523        fi
524
525        if [ ${i} -eq 0 ] ; then
526            # First component
527            NextExeSize="( "${ExeSize}
528        else
529            NextExeSize=${NextExeSize}", "${ExeSize}
530        fi
531        eval LastCompExeSize=${run_Log_LastExeSize[$i]}
532        (( i=i+1 ))
533
534        if [ ${ExeSize} -ne ${LastCompExeSize} ] ; then
535            if ( ${FirstInitialize} ) ; then
536                IGCM_debug_Print 1 "Put first ${ExeNameIn} in ${R_OUT_EXE} !"
537            else
538                IGCM_debug_Print 1 "${ExeNameIn} has changed in ${R_EXE} !"
539                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${ExeNameOut}
540            fi
541            eval IGCM_sys_Put_Out ${ExeNameOut} ${R_OUT_EXE}/${PREFIX}_${ExeNameIn} rw
542        fi
543    done
544
545    if [ ${DRYRUN} -le 1 ] ; then
546        typeset ExeCpuLog
547        tail -1500 ${Exe_Output} > ${Exe_Output}_tail.txt
548        ExeCpuLog=$( gawk -f ${libIGCM}/libIGCM_sys/IGCM_add_out.awk ${Exe_Output}_tail.txt )
549        RET=$?
550        if [ $RET -eq 0 ] ; then
551            # ExeCpuLog variable contents 5 fields
552            echo "${CumulPeriod} ${PeriodDateBegin} ${PeriodDateEnd} ${ExeCpuLog} ${ExeDate}" |   \
553             gawk '{printf("# %11d | %15s | %15s | %19s | %19s | %15.5f | %15.5f | %15.5f | %s\n", \
554                              $1,$2,$3,$4,$5,$6,$7,$8,$9)}' >> ${SUBMIT_DIR}/run.card
555        fi
556        eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${Exe_Output}_tail.txt"
557    fi
558
559    NextExeSize=${NextExeSize}" )"
560    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Log LastExeSize "${NextExeSize}"
561
562    # All was right ? no ? then we stop.
563    IGCM_debug_Verif_Exit
564
565    # If all was OK, we can delete all files not necessary for next Job
566    IGCM_debug_Print 1 "Files that will be deleted before next period-run : "
567
568    if [ ${DRYRUN} -le 2 ] ; then
569        for f in ${FileToBeDeleted[@]} ; do [ -f ${f} ] && ls -la $f ; [ -f ${f} ] && rm -f $f ; done
570    else
571        echo ${FileToBeDeleted[@]}
572    fi
573
574    #=================================================#
575    #         Modification of libIGCM behaviour       #
576    #=================================================#
577
578    # To use this function, one must copy libIGCM.card from ${libIGCM} directory
579    # and put it in ${SUBMIT_DIR} directory. Ater modifications of ${SUBMIT_DIR}/libIGCM.card,
580    # variables define inside [UserChanges] will be modified for next Period of libIGCM main loop.
581    if [ -f ${SUBMIT_DIR}/libIGCM.card ] ; then
582        echo
583        echo "########################################################################"
584        echo "!!!                 Modification of libIGCM behaviour                !!!"
585        echo
586
587        IGCM_debug_Print 1 "DefineArrayFromOption  : libIGCM_UserChanges in libIGCM.card"
588        IGCM_card_DefineArrayFromSection ${SUBMIT_DIR}/libIGCM.card UserChanges
589        IGCM_debug_Print 2 "libIGCM_UserChanges" ${libIGCM_UserChanges[*]}
590
591        # Special treatments for libIGCM internals
592        for option in ${libIGCM_UserChanges[*]} ; do
593            IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/libIGCM.card UserChanges ${option}
594
595            echo "We will change : ${option}."
596            eval echo "Previous value : " \${${option}}
597            eval echo "Change to : " \${libIGCM_UserChanges_${option}}
598           
599            eval ${option}=\${libIGCM_UserChanges_${option}}
600
601            case ${option} in
602                config_UserChoices_DateEnd)
603                    IGCM_debug_PrintVariables 3 config_UserChoices_DateEnd
604                    DateEnd=$( IGCM_date_ConvertFormatToGregorian ${config_UserChoices_DateEnd} )
605
606                    # Period Length In Days between DateBegin and DateEnd
607                    (( ExperienceLengthInDays=$( IGCM_date_DaysBetweenGregorianDate ${DateEnd} ${DateBegin} )  + 1 ))
608                    if [ ${ExperienceLengthInDays} -lt 0 ] ; then
609                        IGCM_debug_Print 1 "Problem with dates in libIGCM.card : ${DateEnd} < ${DateBegin} ! You must check that."
610                        IGCM_debug_Exit "IGCM_PeriodEnd" " Wrong Dates."
611                        IGCM_debug_Verif_Exit
612                    fi
613                    ;;
614                config_UserChoices_PeriodLength)
615                    ;;
616                PeriodNb)
617                    IGCM_debug_Print 3  "Loop in main Job with ${PeriodNb} period(s)"
618                    ;;
619                config_Post_RebuildFrequency)
620                    IGCM_debug_Print 3  "Change config_Post_RebuildFrequency=${config_Post_RebuildFrequency} : IGCM_post_Configure"
621                    IGCM_post_Configure
622                    ;;
623                config_Post_TimeSeriesFrequency)
624                    IGCM_debug_Print 3  "Change config_Post_TimeSeriesFrequency = ${config_Post_TimeSeriesFrequency} : IGCM_post_Initialize"
625                    IGCM_post_Configure
626                    ;;
627                config_Post_SeasonalFrequency)
628                    IGCM_debug_Print 3  "Change config_Post_SeasonalFrequency = ${config_Post_SeasonalFrequency} : IGCM_post_Initialize"
629                    IGCM_post_Configure
630                    ;;
631            esac
632        done
633
634        echo
635        echo "########################################################################"
636        echo
637    fi
638
639    #=================================================#
640    #         Determine next computed period          #
641    #=================================================#
642
643    PeriodDateBegin=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateEnd} 1 )
644    IGCM_date_GetYearMonth $PeriodDateBegin year month
645    year_m1=$(( year - 1 ))
646    year_p1=$(( year + 1 ))
647    IGCM_config_Analyse_PeriodLength
648    PeriodDateEnd=$( IGCM_date_AddDaysToGregorianDate ${PeriodDateBegin} $(( ${PeriodLengthInDays} - 1 )) )
649
650    # Debug Print :
651    echo
652    IGCM_debug_Print 1 "IGCM_config_PeriodEnd : Preparing Next Execution"
653    IGCM_debug_Print 3 "PeriodDateBegin       : ${PeriodDateBegin}"
654    IGCM_debug_Print 3 "PeriodDateEnd         : ${PeriodDateEnd}"
655    IGCM_debug_Print 3 "PeriodLengthInDays    : ${PeriodLengthInDays}"
656
657    PeriodDateBegin=$( IGCM_date_ConvertFormatToHuman ${PeriodDateBegin} )
658    PeriodDateEnd=$( IGCM_date_ConvertFormatToHuman ${PeriodDateEnd} )
659
660    (( CumulPeriod = CumulPeriod + 1 ))
661
662    # Debug Print :
663    echo
664    IGCM_debug_Print 3 "PeriodDateBegin Human : ${PeriodDateBegin}"
665    IGCM_debug_Print 3 "PeriodDateEnd Human   : ${PeriodDateEnd}"
666    IGCM_debug_Print 3 "CumulPeriod           : ${CumulPeriod}"
667
668    #=================================================#
669    #             Write updated run.card              #
670    #=================================================#
671
672    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration OldPrefix ${OldPrefix}
673    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateBegin ${PeriodDateBegin}
674    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodDateEnd ${PeriodDateEnd}
675    IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration CumulPeriod ${CumulPeriod}
676
677    IGCM_debug_PopStack "IGCM_config_PeriodEnd"
678}
679
680#===================================
681function IGCM_config_Finalize
682{
683    IGCM_debug_PushStack "IGCM_config_Finalize"
684
685    echo
686    IGCM_debug_Print 1 "IGCM_config_Finalize :"
687    echo
688
689    if [ ${SimulationLengthInDays} -ge ${ExperienceLengthInDays} ] ; then
690
691        #==========================#
692        # End of entire simulation #
693        #==========================#
694
695        # Mail notification
696        IGCM_sys_SendMail
697
698        #
699        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "Completed"
700        IGCM_debug_Print 1 "Normal End of computation."
701        if ( $DEBUG_debug ) ; then
702            echo
703            IGCM_debug_Print 1 "Your files on ${R_OUT} :"
704            IGCM_sys_Tree ${R_SAVE}
705        fi
706   
707    else
708
709        #=================#
710        # Submit next job #
711        #=================#
712
713        IGCM_card_WriteOption ${SUBMIT_DIR}/run.card Configuration PeriodState "OnQueue"
714
715        # Name of next Ksh Script output :
716        eval Script_Output="${Script_Output_Prefix}_${config_UserChoices_JobName}.$( printf "%06d" ${CumulPeriod} )"
717
718        IGCM_debug_Print 1 "Submit next job"
719        # SUBMIT NEXT JOB from SUBMIT_DIR and come back in RUN_DIR
720        IGCM_sys_Cd ${SUBMIT_DIR}
721        IGCM_sys_Qsub ${SUBMIT_DIR}/Job_${config_UserChoices_JobName}
722        IGCM_sys_Cd -
723    fi
724
725    # Supress Non Deleted Boundary files
726    if [ ${DRYRUN} -le 2 ] ; then
727        IGCM_comp_DelFixeBoundaryFiles
728        ls -la
729    fi
730   
731    # Clean ${RUN_DIR}=${RUN_DIR_PATH}/${config_UserChoices_TagName}/${config_UserChoices_JobName}
732    # Only for production run (No clean up in DEV or DEB mode)
733    # and command sent from .. directory.
734    IGCM_sys_Cd ..
735    [ X${JobType} = XRUN ] && IGCM_sys_Rm -rf ${RUN_DIR}
736
737    IGCM_debug_PopStack "IGCM_config_Finalize"
738}
739
740#===================================
Note: See TracBrowser for help on using the repository browser.