source: trunk/libIGCM/libIGCM_comp/libIGCM_comp.ksh @ 157

Last change on this file since 157 was 157, checked in by sdipsl, 15 years ago
  • RebuildFromWorkdir? is back. Will use BIG_DIR as temp storage directory
    • ideally RUN_DIR_PATH and BIG_DIR are on the same filesystem (mv REBUILD_DIR BIG_DIR)
    • save lot of time between iteration for IO intensive simulation up to 3 minutes by iteration for CMIP5 like IO.
  • rebuild.ksh will be usable as it is (in case you need to run it by hand)
  • clean Up : if rebuild run smoothly we clean everything (either FromArchive? or FromWorkdir?)
  • Watch your quota on the BIG_DIR (SCRATCHDIR OR WORKDIR depending on machine) before you play with that.
  • 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: 30.3 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_comp_Initialize
18{
19    IGCM_debug_PushStack "IGCM_comp_Initialize"
20
21    # Debug Print :
22    echo
23    IGCM_debug_Print 1 "IGCM_comp_Initialize :"
24    echo
25
26    typeset comp compname comptagname CompatibilityTag auxprint card_UserChoices first_option i j
27    for comp in ${config_ListOfComponents[*]} ; do
28        # Debug Print
29        IGCM_debug_Print 1 ${comp}
30        # Define component
31        IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp}
32        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
33        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
34
35        # Read libIGCM compatibility version in ${compname}.card
36        card=${SUBMIT_DIR}/COMP/${compname}.card
37        IGCM_card_DefineVariableFromOption ${card} Compatibility libIGCM
38        eval CompatibilityTag=\${${compname}_Compatibility_libIGCM} > /dev/null 2>&1   
39
40        if [ ! "${CompatibilityTag}" = "${libIGCM_CurrentTag}" ] ; then
41            IGCM_debug_Exit "${compname}.card is not compatible with libIGCM version ${libIGCM_CurrentTag} see libIGCM FAQ http://wiki.ipsl.jussieu.fr/wiki_ipsl/IGCMG/libIGCM/DocUtilisateur/FAQ ."
42        fi
43
44        # Manage component executable
45        IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card Executable ${comp}
46
47        # Read component Write Frequency in config.card
48        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} WriteFrequency
49        # Debug Print :
50        eval auxprint=\${config_${comp}_WriteFrequency}
51        IGCM_debug_Print 1 "Write frequency for ${compname} : ${auxprint} "
52        #2> /dev/null
53
54        # Debug Print :
55        IGCM_debug_Print 1 "Initialize following component library :"
56        IGCM_debug_Print 1 ${SUBMIT_DIR}/COMP/${compname}.driver
57        IGCM_debug_Print 3 "With tag : ${comptagname}"
58        # Source component library
59        . ${SUBMIT_DIR}/COMP/${compname}.driver
60
61        # Debug Print
62        IGCM_debug_Print 3 "Initialize ${comp} output directory."
63        # Define Dirs   
64        eval R_OUT_${comp}=${R_SAVE}/${comp}
65        eval IGCM_sys_MkdirArchive \${R_OUT_${comp}}
66
67        eval R_OUT_${comp}_O=\${R_OUT_${comp}}/Output
68        eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_O}
69
70        eval R_OUT_${comp}_R=\${R_OUT_${comp}}/Restart
71        eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_R}
72
73        eval R_OUT_${comp}_D=\${R_OUT_${comp}}/Debug
74        eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_D}
75
76        eval R_OUT_${comp}_O_I=\${R_OUT_${comp}_O}/INS
77        eval R_OUT_${comp}_O_H=\${R_OUT_${comp}_O}/HF
78        eval R_OUT_${comp}_O_D=\${R_OUT_${comp}_O}/DA
79        eval R_OUT_${comp}_O_M=\${R_OUT_${comp}_O}/MO
80        eval R_OUT_${comp}_O_Y=\${R_OUT_${comp}_O}/YE
81
82        # Read UserChoices section of component card
83        IGCM_debug_Print 1 "DefineArrayFromSection : ${compname}_UserChoices ${card}"
84        IGCM_card_DefineArrayFromSection ${card} UserChoices
85        eval first_option=\${${compname}_UserChoices[0]} > /dev/null 2>&1
86        if [ X${first_option} != X"Error:" ] ; then
87            eval IGCM_debug_Print 2 "${compname}_UserChoices_Options:" \${${compname}_UserChoices[*]}
88            if [ X${card_UserChoices[0]} != X ] ; then
89                unset card_UserChoices
90            fi
91            eval set +A card_UserChoices -- \${${compname}_UserChoices[*]} > /dev/null 2>&1
92            typeset option
93            for option in ${card_UserChoices[*]} ; do
94                IGCM_card_DefineVariableFromOption ${card} UserChoices ${option}
95                eval IGCM_debug_Print 3 "${compname}_UserChoices_values: ${option} \${card_UserChoices_${option}}"
96            done
97        fi
98
99        # Read and Build Output File stuff
100        IGCM_debug_Print 1 "DefineArrayFromOption  : ${compname}_OutputFiles ${card}"
101        IGCM_card_DefineArrayFromOption ${card} OutputFiles List
102        ListFilesName=${compname}_OutputFiles_List
103        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
104        #
105        if [ X${FileName0} != X${NULL_STR} ] ; then
106            #
107            #IGCM_debug_Print 1 "Component      : ${compname}"
108            #
109            # INITIALISATION
110            #
111            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
112            i=2
113            #
114            until [ $i -ge $NbFiles ]; do
115                #
116                eval flag_post=\${${ListFilesName}[$i]} > /dev/null 2>&1
117                #
118                if [ X${flag_post} != XNONE ] ; then
119                    # A mettre demain (11/08/2009) : dépendance Dimension 2D:3D
120                    # Dimension = vide si vieille card.
121                    IGCM_card_DefineArrayFromOption ${card} ${flag_post} TimeSeriesVars
122                    IGCM_card_DefineArrayFromOption ${card} ${flag_post} Patches
123                    if [ "$( eval echo \${${compname}_${flag_post}_TimeSeriesVars[*]} )" = "Option not found ${flag_post}" ] ; then
124                        # New TimeSeriesVar description, with 2D, 3D and associate ChunckJob.
125                        ListDimension[0]=2D
126                        ListDimension[1]=3D
127                        TimeSeries=false
128                        iLoop=${#ListDimension[*]}
129                        j=0
130                        until [ $j -ge ${iLoop} ]; do
131                            Dimension=${ListDimension[${j}]}
132                            IGCM_card_DefineArrayFromOption ${card} ${flag_post} TimeSeriesVars${Dimension}
133                            IGCM_card_DefineVariableFromOption ${card} ${flag_post} ChunckJob${Dimension}
134                            #
135                            # Time series WITHOUT chunk
136                            #
137                            if [ ! $( eval echo \${${compname}_${flag_post}_TimeSeriesVars${Dimension}} ) = ${NULL_STR} ] ; then
138                                if [ $( eval echo \${${compname}_${flag_post}_ChunckJob${Dimension}} ) = NONE ] ; then
139                                    IGCM_debug_Print 3 "${Dimension} time series activated for ${flag_post} according to ${card}"
140                                    eval TimeSeries${Dimension}=true
141                                fi
142                            fi
143                            #
144                            # Time series WITH chunk
145                            #
146                            if [ ! $( eval echo \${${compname}_${flag_post}_TimeSeriesVars${Dimension}} ) = ${NULL_STR} ] ; then
147                                chunck_size=$( eval echo \${${compname}_${flag_post}_ChunckJob${Dimension}} )
148                                if [ ! ${chunck_size} = NONE ] ; then
149                                    IGCM_debug_Print 3 "${Dimension} time series activated with chunck for ${flag_post} according to ${card}"
150                                    eval TimeSeriesChunck${Dimension}=true
151                                    eval set +A CHUNCK${Dimension}_COMP \${CHUNCK${Dimension}_COMP[*]} ${comp}
152                                    eval set +A CHUNCK${Dimension}_FLAG \${CHUNCK${Dimension}_FLAG[*]} ${i}
153                                    eval set +A CHUNCK${Dimension}_SIZE \${CHUNCK${Dimension}_SIZE[*]} ${chunck_size}
154                                fi
155                            fi
156                            (( j=j+1 ))
157                        done
158                    else
159                        ListDimension[0]=""
160                        TimeSeries=true
161                        TimeSeries2D=false
162                        TimeSeries3D=false
163                        TimeSeriesChunck2D=false
164                        TimeSeriesChunck3D=false
165                    fi
166                fi
167                (( i=i+3 ))
168            done
169        fi
170        # Debug Print
171        IGCM_debug_Print 3 "Initialize ${compname} with driver."
172        # INIT component
173        ${comp}_Initialize
174        echo
175    done
176    echo "-----"
177    echo
178    IGCM_debug_Print 1 "DefineArrayFromOption  : ListOfComponents"
179    IGCM_debug_PrintVariables 3 config_ListOfComponents
180
181    IGCM_debug_PopStack "IGCM_comp_Initialize"
182}
183
184#=======================================================================
185function IGCM_comp_PrepareDeletedFiles
186{
187    IGCM_debug_PushStack "IGCM_comp_PrepareDeletedFiles" $@
188   
189    if [ X${2} != X. ] ; then
190        eval FileToBeDeleted[${#FileToBeDeleted[@]}]=$( basename ${2} ) > /dev/null 2>&1
191    else
192        eval FileToBeDeleted[${#FileToBeDeleted[@]}]=$( basename ${1} ) > /dev/null 2>&1
193    fi
194
195    IGCM_debug_PopStack "IGCM_comp_PrepareDeletedFiles"
196}
197
198#=======================================================================
199function IGCM_comp_GetInputInitialStateFiles
200{
201    IGCM_debug_PushStack "IGCM_comp_GetInputInitialStateFiles"
202
203    # Debug Print :
204    echo
205    IGCM_debug_Print 1 "IGCM_comp_GetInputInitialStateFiles :"
206    echo
207
208    # Only the first time step need InitialStateFiles
209    # otherwise it's BoundaryConditions
210    if ( ${FirstInitialize} ) ; then
211      typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
212      typeset file_in_ file_in file_out_ file_out do_init
213      for comp in ${config_ListOfComponents[*]} ; do
214          # Initialize
215          do_init="y"
216          # Do we need to bring initial state file for this component
217          if [ "${config_Restarts_OverRule}" = "y" ] ; then
218              eval do_init="n"
219          else
220              # Read component Restarts parameters
221              IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
222              eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
223              if [ "${do_start}" = "y" ] ; then
224                    do_init="n"
225              else
226                    do_init="y"
227              fi
228          fi
229
230          if [ "${do_init}" = "y" ] ; then
231              # Define component
232              eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
233              eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
234
235              # Debug Print :
236              IGCM_debug_Print 3 "Initialisation files ${compname}"
237
238              card=${SUBMIT_DIR}/COMP/${compname}.card
239
240              IGCM_card_DefineArrayFromOption ${card} InitialStateFiles List
241              ListFilesName=${compname}_InitialStateFiles_List
242
243              eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
244              if [ X${FileName0} != X${NULL_STR} ] ; then
245                  eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
246
247                  (( i=0 ))
248                  until [ $i -ge $NbFiles ]; do
249                      eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
250                      eval file_in=${file_in_}
251                      (( i_ = i+1 ))
252                      eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
253                      eval file_out=${file_out_}
254                     
255                      IGCM_sys_Get ${file_in} ${file_out}
256
257                      IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
258
259                      (( i=i+2 ))
260                  done
261              fi
262          fi
263      done
264    fi
265    IGCM_debug_PopStack "IGCM_comp_GetInputInitialStateFiles"
266}
267
268#=======================================================================
269function IGCM_comp_GetInputBoundaryFiles
270{
271    IGCM_debug_PushStack "IGCM_comp_GetInputBoundaryFiles"
272
273    # Debug Print :
274    echo
275    IGCM_debug_Print 1 "IGCM_comp_GetInputBoundaryFiles :"
276    echo
277
278    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
279    typeset file_in_ file_in file_out_ file_out
280
281    if [ ${Period} = 1 ]; then
282        ListFixBoundary=" "
283    fi
284
285    for comp in ${config_ListOfComponents[*]} ; do
286
287        echo "-----"
288        # Define component
289        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
290        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
291
292        # Debug Print :
293        IGCM_debug_Print 3 "Boundary files ${compname}"
294
295        card=${SUBMIT_DIR}/COMP/${compname}.card
296
297        IGCM_card_DefineArrayFromOption ${card} BoundaryFiles List
298        ListFilesName=${compname}_BoundaryFiles_List
299        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
300
301        if [ X${FileName0} != X${NULL_STR} ] ; then
302            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
303
304            (( i=0 ))
305            until [ $i -ge $NbFiles ]; do
306                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
307                eval file_in=${file_in_}
308                (( i_ = i+1 ))
309                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
310                eval file_out=${file_out_}
311
312                IGCM_sys_Get ${file_in} ${file_out}
313
314                IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
315
316                (( i=i+2 ))
317            done
318        fi
319
320        # Get non deleted files
321        if [ ${Period} = 1 ]; then
322
323            IGCM_card_DefineArrayFromOption ${card} BoundaryFiles ListNonDel
324            ListFilesName=${compname}_BoundaryFiles_ListNonDel
325            eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
326           
327            if [ X${FileName0} != X${NULL_STR} ] ; then
328                eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
329               
330                (( i=0 ))
331                until [ $i -ge $NbFiles ]; do
332                    eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
333                    eval file_in=${file_in_}
334                    (( i_ = i+1 ))
335                    eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
336                    eval file_out=${file_out_}
337
338                    IGCM_sys_Get ${file_in} ${file_out}
339
340                    if [ X${file_out} != X. ] ; then
341                        ListFixBoundary=${ListFixBoundary}" "${file_out}
342                    else
343                        ListFixBoundary=${ListFixBoundary}" "$( basename ${file_in} )
344                    fi
345
346                    (( i=i+2 ))
347                done
348            fi
349        fi
350    done
351   
352    IGCM_debug_PopStack "IGCM_comp_GetInputBoundaryFiles"
353}
354
355#=======================================================================
356function IGCM_comp_DelFixeBoundaryFiles
357{
358    IGCM_debug_PushStack "IGCM_comp_DelFixeBoundaryFiles"
359
360    # Debug Print :
361    echo
362    IGCM_debug_Print 1 "IGCM_comp_DelFixeBoundaryFiles :"
363    echo
364
365    ls -l ${ListFixBoundary}
366    rm -f ${ListFixBoundary}
367
368    IGCM_debug_PopStack "IGCM_comp_DelFixeBoundaryFiles"
369}
370
371#=======================================================================
372function IGCM_comp_GetInputParametersFiles
373{
374    IGCM_debug_PushStack "IGCM_comp_GetInputParametersFiles"
375
376    # Debug Print :
377    echo
378    IGCM_debug_Print 1 "IGCM_comp_GetInputParametersFiles :"
379    echo
380
381    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_ file_in file_out
382    for comp in ${config_ListOfComponents[*]} ; do
383        # Define component
384        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
385        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
386
387        # Debug Print :
388        IGCM_debug_Print 3 "Parameters ${compname}"
389
390        card=${SUBMIT_DIR}/COMP/${compname}.card       
391
392        IGCM_card_DefineArrayFromOption ${card} ParametersFiles List
393        ListFilesName=${compname}_ParametersFiles_List
394        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
395
396        if [ X${FileName0} != X${NULL_STR} ] ; then
397            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
398
399            (( i=0 ))
400            until [ $i -ge $NbFiles ]; do
401                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
402                eval file_in=${file_in_}
403                (( i_ = i+1 ))
404                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
405                eval file_out=${file_out_} 
406
407                IGCM_sys_Cp ${file_in} ${file_out} 
408
409                IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
410
411                (( i=i+2 ))
412            done
413        fi
414    done
415
416    IGCM_debug_PopStack "IGCM_comp_GetInputParametersFiles"
417}
418
419#=======================================================================
420function IGCM_comp_GetInputRestartFiles
421{
422    IGCM_debug_PushStack "IGCM_comp_GetInputRestartFiles"
423
424    # Debug Print :
425    echo
426    IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles :"
427    echo
428
429    typeset Date_tmp Date_r Path_r do_start CompOldName Path_temp
430    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
431    typeset file_in file_out file_in_ file_out_ file_in_Name
432    typeset -Z4 j4
433
434    for comp in ${config_ListOfComponents[*]} ; do
435        # Define component
436        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
437        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
438        #
439        card=${SUBMIT_DIR}/COMP/${compname}.card
440        #
441        IGCM_card_DefineArrayFromOption ${card} RestartFiles List
442        ListFilesName=${compname}_RestartFiles_List
443        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
444
445        # Debug Print :
446        IGCM_debug_Print 3 "restart ${compname}"
447
448        if ( ${FirstInitialize} ) ; then
449
450            if [ "${config_Restarts_OverRule}" = "y" ] ; then
451                eval config_${comp}_Restart="y"
452                eval config_${comp}_RestartDate=${config_Restarts_RestartDate}
453                eval config_${comp}_RestartJobName=${config_Restarts_RestartJobName}
454                eval config_${comp}_RestartPath=${config_Restarts_RestartPath}
455                eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
456                eval CompOldName=${comp}
457            else
458                # Read component Restarts parameters
459                IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
460                eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
461
462                if [ "${do_start}" = "y" ] ; then
463                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartDate
464                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartJobName
465                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartPath
466                else
467                    eval config_${comp}_RestartDate=-1
468                    eval config_${comp}_RestartJobName=${NULL_STR}
469                    eval config_${comp}_RestartPath=${NULL_STR}
470                fi
471                IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} OldName
472                eval CompOldName=\${config_${comp}_OldName}
473                if [ X${CompOldName} = X ] ; then
474                    eval CompOldName=${comp}
475                fi
476            fi
477
478            if [ "${do_start}" = "y" ] ; then
479
480                if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
481                    eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
482
483                    (( i=1 ))
484                    until [ $i -gt $NbFiles ]; do
485                        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
486                        eval file_in=${file_in_}
487
488                        (( i_ = i+1 ))
489                        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
490                        eval file_out=${file_out_}
491                       
492                        eval Date_tmp=\${config_${comp}_RestartDate}
493                        Date_r=$( IGCM_date_ConvertFormatToGregorian ${Date_tmp} )
494                        eval Path_r=\${config_${comp}_RestartPath}/\${config_${comp}_RestartJobName}/${CompOldName}/Restart
495                        eval file_in_Name=\${config_${comp}_RestartJobName}_${Date_r}_${file_in}
496
497                        generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
498                        generic_restart_file_name_out=$( basename ${file_out} .nc )
499                       
500                        eval Path_temp=\${Path_r}/${generic_restart_file_name_in}
501                        nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_temp}_????.nc)
502
503                        if [ ${nb_restart_file} -gt 1 ] ; then
504                            j=0
505                            until [ $j -ge $nb_restart_file ]; do
506                                j4=${j}
507                                eval IGCM_sys_Get ${Path_r}/${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
508                                #IGCM_comp_PrepareDeletedFiles ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
509                                #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_out}_${j4}.nc" > /dev/null 2>&1
510                                (( j=j+1 ))
511                            done
512                        else
513                            eval IGCM_sys_Get ${Path_r}/${file_in_Name} ${file_out} 
514                            #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
515                        fi
516               
517                        (( i=i+3 ))
518                    done
519                else
520                    if [ X${FileName0} != XNONE ] ; then
521                        IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
522                    else
523                        IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
524                    fi
525                fi
526            fi
527        elif [ ${Period} -eq 1 ] ; then
528            # if not FirstInitialize and first loop of this job
529
530            # Restore Restarts files
531            #-----------------------
532            if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
533                eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
534
535                (( i=1 ))
536                until [ $i -gt $NbFiles ]; do
537                    eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
538                    eval file_in=${file_in_}
539                    (( i_ = i+1 ))
540                    eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
541                    eval file_out=${file_out_}
542                   
543                    file_in_Name=${run_Configuration_OldPrefix}_${file_in}
544
545                    generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
546                    generic_restart_file_name_out=$( basename ${file_out} .nc )
547
548                    eval Path_temp=\${R_OUT_${comp}_R}/${generic_restart_file_name_in}
549                    nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_temp}_????.nc)
550
551                    if [ ${nb_restart_file} -gt 1 ] ; then
552                        j=0
553                        until [ $j -ge $nb_restart_file ]; do
554                            j4=${j}
555                            eval IGCM_sys_Get \${R_OUT_${comp}_R}/${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
556                            #IGCM_comp_PrepareDeletedFiles ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
557                            #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_out}_${j4}.nc" > /dev/null 2>&1
558
559                            (( j=j+1 ))
560                        done
561                    else
562                        eval IGCM_sys_Get \${R_OUT_${comp}_R}/${file_in_Name} ${file_out}
563                        #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
564                    fi
565
566                    (( i=i+3 ))
567                done
568            else
569                if [ X${FileName0} != XNONE ] ; then
570                    IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
571                else
572                    IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
573                fi
574            fi
575        fi
576    done
577    IGCM_sys_Chmod u+rw *
578
579    IGCM_debug_PopStack "IGCM_comp_GetInputRestartFiles"
580}
581
582#=======================================================================
583function IGCM_comp_Update
584{
585    IGCM_debug_PushStack "IGCM_comp_Update"
586
587    # Debug Print :
588    echo
589    IGCM_debug_Print 1 "IGCM_comp_Update :"
590    echo
591
592    typeset ExeNameIn ExeNameOut
593    typeset comp compname comptagname
594    for comp in ${config_ListOfComponents[*]} ; do
595        # Define component
596        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
597        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
598
599        # Copy executable for this component
600        eval ExeNameIn=\${config_Executable_${comp}[0]}
601        eval ExeNameOut=\${config_Executable_${comp}[1]}
602
603        if [ ${Period} -eq 1 ] && [ -f ${R_EXE}/${ExeNameIn} ] ; then
604            eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
605            if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
606                eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
607            fi
608        elif [ -f ${R_EXE}/${ExeNameIn} ] && [ ! -f ${RUN_DIR}/${ExeNameOut} ] ; then
609            eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
610            if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
611                eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
612            fi
613        fi
614
615        # Debug Print
616        IGCM_debug_Print 3 "Update ${compname} Parameter Files."
617        # UPDATE component
618        ${comp}_Update
619
620    done
621
622    IGCM_debug_PopStack "IGCM_comp_Update"
623}
624
625#=======================================================================
626function IGCM_comp_Finalize
627{
628    IGCM_debug_PushStack "IGCM_comp_Finalize"
629
630    # Debug Print :
631    echo
632    IGCM_debug_Print 1 "IGCM_comp_Finalize :"
633    echo
634
635    typeset ListTextName TextName0
636    typeset comp compname comptagname card ListFilesName FileName0 NbFiles SaveOnArchive
637    typeset i i_ file_in file_in_ file_out file_out_ file_outin file_outin_ generic_file_name nb_rebuild_file
638    typeset -Z4 j4
639    for comp in ${config_ListOfComponents[*]} ; do
640        # Define component
641        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
642        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
643
644        # Debug Print
645        IGCM_debug_Print 1 "Finalize ${compname} component."
646        # FINALIZE component
647        ${comp}_Finalize
648
649        card=${SUBMIT_DIR}/COMP/${compname}.card       
650
651        # Save Restarts files
652        #--------------------
653        IGCM_card_DefineArrayFromOption ${card} RestartFiles List
654        ListFilesName=${compname}_RestartFiles_List
655        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
656       
657        if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
658            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
659           
660            (( i=0 ))
661            until [ $i -ge $NbFiles ]; do
662                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
663                eval file_in=${file_in_}
664
665                (( i_ = i+1 ))
666                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
667                eval file_out=${file_out_}
668
669                (( i_ = i+2 ))
670                eval file_outin_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
671                eval file_outin=${file_outin_}
672
673                generic_restart_file_name_in=$(    basename ${file_in} .nc )
674                generic_restart_file_name_out=$(   basename ${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out} .nc )
675                generic_restart_file_name_outin=$( basename ${file_outin} .nc )
676                       
677                nb_restart_file=$( ls ${generic_restart_file_name_in}_????.nc 2>/dev/null | wc -l ) 
678                if [ ${nb_restart_file} -gt 1 ] ; then
679                    j=0
680                    until [ $j -ge $nb_restart_file ]; do
681                        j4=${j}
682                        eval IGCM_sys_Put_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_OUT_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
683                        [ ! ${file_in} = ${file_outin} ] && IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc
684                        #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_in}_${j4}.nc" > /dev/null 2>&1
685                        (( j=j+1 ))
686                    done
687                else
688                    eval IGCM_sys_Put_Rest ${file_in} \${R_OUT_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
689                    [ ! ${file_in} = ${file_outin} ] && IGCM_sys_Mv ${file_in} ${file_outin}
690                    #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
691                fi
692
693                (( i=i+3 ))
694            done
695        else
696            if [ X${FileName0} != XNONE ] ; then
697                IGCM_debug_Exit "IGCM_comp_Finalize : No file in restart list for ${compname}."
698            else
699                IGCM_debug_Print 1 "IGCM_comp_Finalize : NONE specified in Restart List ${compname}."
700            fi
701        fi
702
703        # Save Output files
704        #------------------
705        IGCM_card_DefineArrayFromOption ${card} OutputFiles List
706        ListFilesName=${compname}_OutputFiles_List
707        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
708
709        if [ X${FileName0} != X${NULL_STR} ] ; then
710            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
711
712            (( i=0 ))
713            until [ $i -ge $NbFiles ]; do
714                SaveOnArchive=true
715                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
716                eval file_in=${file_in_}
717                (( i_ = i+1 ))
718                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
719                eval file_out=${file_out_}
720                (( i_ = i+2 ))
721                eval flag_post=\${${ListFilesName}[$i_]} > /dev/null 2>&1
722                #
723                generic_file_name=$( basename ${file_in} .nc )
724                nb_rebuild_file=$( ls | grep "^${generic_file_name}[_0-9]*.nc" | wc -l )
725                #
726                if ( [ ${nb_rebuild_file} -eq 1 ] && [ -f ${generic_file_name}_0000.nc ] ) ; then
727                    IGCM_debug_Print 2 "Parallelism with 1 process. Rebuilding ${file_in} not needed"
728                    IGCM_sys_Mv ${generic_file_name}_0000.nc ${file_in}
729                elif [ ${nb_rebuild_file} -gt 1 ] ; then
730                    IGCM_debug_Print 2 "Parallelism detected rebuilding ${file_in} is needed"
731                    if ( [ X${config_Post_RebuildFrequency} = X${NULL_STR} ] || [ X${config_Post_RebuildFrequency} = XNONE ] ) ; then
732                        IGCM_debug_Print 2 "Rebuilding ${file_in} online"
733                        IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc
734                    else
735                        IGCM_debug_Print 2 "Preparing offline rebuild for ${file_in}"
736                        [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
737                        IGCM_sys_Mv ${generic_file_name}_????.nc ${RUN_DIR}/REBUILD_${PeriodDateBegin}
738                        # Attention au quota si on tourne dans un RUN_DIR_PATH maison
739                        for DelFile in $( ls REBUILD_${PeriodDateBegin}/* | grep "${generic_file_name}[_0-9]*.nc" ) ; do
740                            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${DelFile} > /dev/null 2>&1
741                        done
742
743                        # Prepare headers for the shell dedicated to offline rebuild
744                        if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
745                            echo \#!/bin/ksh                                           > ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
746                            echo function IGCM_FlushRebuild                           >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
747                            echo {                                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
748                            echo IGCM_debug_PushStack "IGCM_FlushRebuild"             >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
749                            echo echo                                                 >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
750                            echo IGCM_debug_Print 1 "IGCM_FlushRebuild"               >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
751                            echo echo                                                 >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
752                        fi
753                        # Prepare the shell dedicated to offline rebuild
754                        echo IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
755                        echo IGCM_debug_Verif_Exit                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
756                        #
757                        # Load Patch we need to apply and apply
758                        if [ X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) !=  X${NULL_STR} ]; then
759                            for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
760                                echo . ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
761                                echo IGCM_${Patch} ${file_in}                         >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
762                            done
763                        fi
764                        #
765                        echo IGCM_sys_Put_Out ${file_in} ${file_out}                  >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
766                        echo IGCM_debug_Verif_Exit                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
767                        echo IGCM_sys_Rm ${generic_file_name}_*.nc                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
768                        SaveOnArchive=false
769                    fi
770                fi
771                #
772                if [ ${SaveOnArchive} = true ] ; then
773                    #
774                    # If we need to apply a patch we use TMP DIRECTORY before ARCHIVING if asynchronous rebuild is on
775                    #
776                    if ( [ X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) !=  X${NULL_STR} ] && [ ! X${config_Post_RebuildFrequency} = X${NULL_STR} ] && [ ! X${config_Post_RebuildFrequency} = XNONE ] ) ; then
777                        if [ -f ${file_in} ] ; then
778                            IGCM_sys_Mv ${file_in} ${RUN_DIR}/REBUILD_${PeriodDateBegin}
779                            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=REBUILD_${PeriodDateBegin}/${file_in} > /dev/null 2>&1
780                            #
781                            for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
782                                echo . ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh     >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
783                                echo IGCM_${Patch} ${file_in}                             >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
784                            done
785                            #
786                            echo IGCM_sys_Put_Out ${file_in} ${file_out}                  >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
787                            echo IGCM_debug_Verif_Exit                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
788                            #
789                        fi
790                    else
791                        IGCM_sys_Put_Out ${file_in} ${file_out}
792                        [ $? -eq 0 ] && eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
793                        if [ ${nb_rebuild_file} -gt 1 ] ; then
794                            for DelFile in $( ls | grep "${generic_file_name}[_0-9]*.nc" ) ; do
795                                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${DelFile} > /dev/null 2>&1
796                            done
797                        fi
798                    fi
799                fi
800                (( i=i+3 ))
801            done
802        fi
803
804        # Save Output Text files of models
805        #---------------------------------
806       
807        IGCM_card_DefineArrayFromOption ${card} OutputText List
808        ListTextName=${compname}_OutputText_List
809       
810        eval TextName0=\${${ListTextName}[0]} > /dev/null 2>&1
811        if [ X${TextName0} != X${NULL_STR} ] ; then
812            eval NbFiles=\${#${ListTextName}[@]} > /dev/null 2>&1
813
814            (( i=0 ))
815            until [ $i -eq $NbFiles ]; do
816                eval file_in=\${${ListTextName}[$i]} > /dev/null 2>&1
817                (( i=i+1 ))
818
819                nb_text_file=$( ls ${file_in}* 2>/dev/null | wc -l )
820                if [ ${nb_text_file} -gt 1 ] ; then
821                    list_file=$( ls ${file_in}* )
822                    for file in ${list_file}
823                      do
824                      eval IGCM_sys_Put_Out ${file} \${R_OUT_${comp}_D}/${PREFIX}_${file}
825                      eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
826                    done
827                else
828                    if ( [ -f ${file_in}_0000 ] || [ -f ${file_in}0 ] ) ; then
829                        eval IGCM_sys_Mv ${file_in}* ${file_in}
830                    fi
831                    eval IGCM_sys_Put_Out ${file_in} \${R_OUT_${comp}_D}/${PREFIX}_${file_in}
832                    [ $? -eq 0 ] && eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
833                fi
834            done
835        fi
836    done
837
838    IGCM_debug_PopStack "IGCM_comp_Finalize"
839}
Note: See TracBrowser for help on using the repository browser.