source: tags/libIGCM_v1_8-old/libIGCM_config/libIGCM_config.ksh @ 552

Last change on this file since 552 was 309, checked in by mafoipsl, 14 years ago

Use TMPDIR for mercure again. Correct CompletedFlag? initialisation. Delete useless echo. Correct 1st line or rebuild.ksh.

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