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

Last change on this file since 159 was 159, checked in by sdipsl, 15 years ago
  • Bugfix with test regarding Patch files and empty option
  • Bugfix with rebuildFromWorkdir Job
  • 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.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_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                      #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
257
258                      (( i=i+2 ))
259                  done
260              fi
261          fi
262      done
263    fi
264    IGCM_debug_PopStack "IGCM_comp_GetInputInitialStateFiles"
265}
266
267#=======================================================================
268function IGCM_comp_GetInputBoundaryFiles
269{
270    IGCM_debug_PushStack "IGCM_comp_GetInputBoundaryFiles"
271
272    # Debug Print :
273    echo
274    IGCM_debug_Print 1 "IGCM_comp_GetInputBoundaryFiles :"
275    echo
276
277    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
278    typeset file_in_ file_in file_out_ file_out
279
280    if [ ${Period} = 1 ]; then
281        ListFixBoundary=" "
282    fi
283
284    for comp in ${config_ListOfComponents[*]} ; do
285
286        echo "-----"
287        # Define component
288        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
289        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
290
291        # Debug Print :
292        IGCM_debug_Print 3 "Boundary files ${compname}"
293
294        card=${SUBMIT_DIR}/COMP/${compname}.card
295
296        IGCM_card_DefineArrayFromOption ${card} BoundaryFiles List
297        ListFilesName=${compname}_BoundaryFiles_List
298        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
299
300        if [ X${FileName0} != X${NULL_STR} ] ; then
301            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
302
303            (( i=0 ))
304            until [ $i -ge $NbFiles ]; do
305                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
306                eval file_in=${file_in_}
307                (( i_ = i+1 ))
308                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
309                eval file_out=${file_out_}
310
311                IGCM_sys_Get ${file_in} ${file_out}
312                IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
313
314                (( i=i+2 ))
315            done
316        fi
317
318        # Get non deleted files
319        if [ ${Period} = 1 ]; then
320
321            IGCM_card_DefineArrayFromOption ${card} BoundaryFiles ListNonDel
322            ListFilesName=${compname}_BoundaryFiles_ListNonDel
323            eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
324           
325            if [ X${FileName0} != X${NULL_STR} ] ; then
326                eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
327               
328                (( i=0 ))
329                until [ $i -ge $NbFiles ]; do
330                    eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
331                    eval file_in=${file_in_}
332                    (( i_ = i+1 ))
333                    eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
334                    eval file_out=${file_out_}
335
336                    IGCM_sys_Get ${file_in} ${file_out}
337
338                    if [ X${file_out} != X. ] ; then
339                        ListFixBoundary=${ListFixBoundary}" "${file_out}
340                    else
341                        ListFixBoundary=${ListFixBoundary}" "$( basename ${file_in} )
342                    fi
343
344                    (( i=i+2 ))
345                done
346            fi
347        fi
348    done
349   
350    IGCM_debug_PopStack "IGCM_comp_GetInputBoundaryFiles"
351}
352
353#=======================================================================
354function IGCM_comp_DelFixeBoundaryFiles
355{
356    IGCM_debug_PushStack "IGCM_comp_DelFixeBoundaryFiles"
357
358    # Debug Print :
359    echo
360    IGCM_debug_Print 1 "IGCM_comp_DelFixeBoundaryFiles :"
361    echo
362
363    ls -l ${ListFixBoundary}
364    rm -f ${ListFixBoundary}
365
366    IGCM_debug_PopStack "IGCM_comp_DelFixeBoundaryFiles"
367}
368
369#=======================================================================
370function IGCM_comp_GetInputParametersFiles
371{
372    IGCM_debug_PushStack "IGCM_comp_GetInputParametersFiles"
373
374    # Debug Print :
375    echo
376    IGCM_debug_Print 1 "IGCM_comp_GetInputParametersFiles :"
377    echo
378
379    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_ file_in file_out
380    for comp in ${config_ListOfComponents[*]} ; do
381        # Define component
382        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
383        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
384
385        # Debug Print :
386        IGCM_debug_Print 3 "Parameters ${compname}"
387
388        card=${SUBMIT_DIR}/COMP/${compname}.card       
389
390        IGCM_card_DefineArrayFromOption ${card} ParametersFiles List
391        ListFilesName=${compname}_ParametersFiles_List
392        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
393
394        if [ X${FileName0} != X${NULL_STR} ] ; then
395            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
396
397            (( i=0 ))
398            until [ $i -ge $NbFiles ]; do
399                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
400                eval file_in=${file_in_}
401                (( i_ = i+1 ))
402                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
403                eval file_out=${file_out_} 
404
405                IGCM_sys_Cp ${file_in} ${file_out} 
406                IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
407
408                (( i=i+2 ))
409            done
410        fi
411    done
412
413    IGCM_debug_PopStack "IGCM_comp_GetInputParametersFiles"
414}
415
416#=======================================================================
417function IGCM_comp_GetInputRestartFiles
418{
419    IGCM_debug_PushStack "IGCM_comp_GetInputRestartFiles"
420
421    # Debug Print :
422    echo
423    IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles :"
424    echo
425
426    typeset Date_tmp Date_r Path_r do_start CompOldName Path_temp
427    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
428    typeset file_in file_out file_in_ file_out_ file_in_Name
429    typeset -Z4 j4
430
431    for comp in ${config_ListOfComponents[*]} ; do
432        # Define component
433        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
434        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
435        #
436        card=${SUBMIT_DIR}/COMP/${compname}.card
437        #
438        IGCM_card_DefineArrayFromOption ${card} RestartFiles List
439        ListFilesName=${compname}_RestartFiles_List
440        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
441
442        # Debug Print :
443        IGCM_debug_Print 3 "restart ${compname}"
444
445        if ( ${FirstInitialize} ) ; then
446
447            if [ "${config_Restarts_OverRule}" = "y" ] ; then
448                eval config_${comp}_Restart="y"
449                eval config_${comp}_RestartDate=${config_Restarts_RestartDate}
450                eval config_${comp}_RestartJobName=${config_Restarts_RestartJobName}
451                eval config_${comp}_RestartPath=${config_Restarts_RestartPath}
452                eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
453                eval CompOldName=${comp}
454            else
455                # Read component Restarts parameters
456                IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
457                eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
458
459                if [ "${do_start}" = "y" ] ; then
460                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartDate
461                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartJobName
462                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartPath
463                else
464                    eval config_${comp}_RestartDate=-1
465                    eval config_${comp}_RestartJobName=${NULL_STR}
466                    eval config_${comp}_RestartPath=${NULL_STR}
467                fi
468                IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} OldName
469                eval CompOldName=\${config_${comp}_OldName}
470                if [ X${CompOldName} = X ] ; then
471                    eval CompOldName=${comp}
472                fi
473            fi
474
475            if [ "${do_start}" = "y" ] ; then
476
477                if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
478                    eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
479
480                    (( i=1 ))
481                    until [ $i -gt $NbFiles ]; do
482                        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
483                        eval file_in=${file_in_}
484
485                        (( i_ = i+1 ))
486                        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
487                        eval file_out=${file_out_}
488                       
489                        eval Date_tmp=\${config_${comp}_RestartDate}
490                        Date_r=$( IGCM_date_ConvertFormatToGregorian ${Date_tmp} )
491                        eval Path_r=\${config_${comp}_RestartPath}/\${config_${comp}_RestartJobName}/${CompOldName}/Restart
492                        eval file_in_Name=\${config_${comp}_RestartJobName}_${Date_r}_${file_in}
493
494                        generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
495                        generic_restart_file_name_out=$( basename ${file_out} .nc )
496                       
497                        eval Path_temp=\${Path_r}/${generic_restart_file_name_in}
498                        nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_temp}_????.nc)
499
500                        if [ ${nb_restart_file} -gt 1 ] ; then
501                            j=0
502                            until [ $j -ge $nb_restart_file ]; do
503                                j4=${j}
504                                eval IGCM_sys_Get ${Path_r}/${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
505                                #IGCM_comp_PrepareDeletedFiles ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
506                                #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_out}_${j4}.nc" > /dev/null 2>&1
507                                (( j=j+1 ))
508                            done
509                        else
510                            eval IGCM_sys_Get ${Path_r}/${file_in_Name} ${file_out} 
511                            #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
512                        fi
513               
514                        (( i=i+3 ))
515                    done
516                else
517                    if [ X${FileName0} != XNONE ] ; then
518                        IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
519                    else
520                        IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
521                    fi
522                fi
523            fi
524        elif [ ${Period} -eq 1 ] ; then
525            # if not FirstInitialize and first loop of this job
526
527            # Restore Restarts files
528            #-----------------------
529            if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
530                eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
531
532                (( i=1 ))
533                until [ $i -gt $NbFiles ]; do
534                    eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
535                    eval file_in=${file_in_}
536                    (( i_ = i+1 ))
537                    eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
538                    eval file_out=${file_out_}
539                   
540                    file_in_Name=${run_Configuration_OldPrefix}_${file_in}
541
542                    generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
543                    generic_restart_file_name_out=$( basename ${file_out} .nc )
544
545                    eval Path_temp=\${R_OUT_${comp}_R}/${generic_restart_file_name_in}
546                    nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_temp}_????.nc)
547
548                    if [ ${nb_restart_file} -gt 1 ] ; then
549                        j=0
550                        until [ $j -ge $nb_restart_file ]; do
551                            j4=${j}
552                            eval IGCM_sys_Get \${R_OUT_${comp}_R}/${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
553                            #IGCM_comp_PrepareDeletedFiles ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
554                            #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_out}_${j4}.nc" > /dev/null 2>&1
555
556                            (( j=j+1 ))
557                        done
558                    else
559                        eval IGCM_sys_Get \${R_OUT_${comp}_R}/${file_in_Name} ${file_out}
560                        #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
561                    fi
562
563                    (( i=i+3 ))
564                done
565            else
566                if [ X${FileName0} != XNONE ] ; then
567                    IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
568                else
569                    IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
570                fi
571            fi
572        fi
573    done
574    IGCM_sys_Chmod u+rw *
575
576    IGCM_debug_PopStack "IGCM_comp_GetInputRestartFiles"
577}
578
579#=======================================================================
580function IGCM_comp_Update
581{
582    IGCM_debug_PushStack "IGCM_comp_Update"
583
584    # Debug Print :
585    echo
586    IGCM_debug_Print 1 "IGCM_comp_Update :"
587    echo
588
589    typeset ExeNameIn ExeNameOut
590    typeset comp compname comptagname
591    for comp in ${config_ListOfComponents[*]} ; do
592        # Define component
593        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
594        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
595
596        # Copy executable for this component
597        eval ExeNameIn=\${config_Executable_${comp}[0]}
598        eval ExeNameOut=\${config_Executable_${comp}[1]}
599
600        if [ ${Period} -eq 1 ] && [ -f ${R_EXE}/${ExeNameIn} ] ; then
601            eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
602            if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
603                eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
604            fi
605        elif [ -f ${R_EXE}/${ExeNameIn} ] && [ ! -f ${RUN_DIR}/${ExeNameOut} ] ; then
606            eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
607            if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
608                eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
609            fi
610        fi
611
612        # Debug Print
613        IGCM_debug_Print 3 "Update ${compname} Parameter Files."
614        # UPDATE component
615        ${comp}_Update
616
617    done
618
619    IGCM_debug_PopStack "IGCM_comp_Update"
620}
621
622#=======================================================================
623function IGCM_comp_Finalize
624{
625    IGCM_debug_PushStack "IGCM_comp_Finalize"
626
627    # Debug Print :
628    echo
629    IGCM_debug_Print 1 "IGCM_comp_Finalize :"
630    echo
631
632    typeset ListTextName TextName0
633    typeset comp compname comptagname card ListFilesName FileName0 NbFiles SaveOnArchive
634    typeset i i_ file_in file_in_ file_out file_out_ file_outin file_outin_ generic_file_name nb_rebuild_file
635    typeset -Z4 j4
636    for comp in ${config_ListOfComponents[*]} ; do
637        # Define component
638        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
639        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
640
641        # Debug Print
642        IGCM_debug_Print 1 "Finalize ${compname} component."
643        # FINALIZE component
644        ${comp}_Finalize
645
646        card=${SUBMIT_DIR}/COMP/${compname}.card       
647
648        # Save Restarts files
649        #--------------------
650        IGCM_card_DefineArrayFromOption ${card} RestartFiles List
651        ListFilesName=${compname}_RestartFiles_List
652        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
653       
654        if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
655            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
656           
657            (( i=0 ))
658            until [ $i -ge $NbFiles ]; do
659                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
660                eval file_in=${file_in_}
661
662                (( i_ = i+1 ))
663                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
664                eval file_out=${file_out_}
665
666                (( i_ = i+2 ))
667                eval file_outin_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
668                eval file_outin=${file_outin_}
669
670                generic_restart_file_name_in=$(    basename ${file_in} .nc )
671                generic_restart_file_name_out=$(   basename ${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out} .nc )
672                generic_restart_file_name_outin=$( basename ${file_outin} .nc )
673                       
674                nb_restart_file=$( ls ${generic_restart_file_name_in}_????.nc 2>/dev/null | wc -l ) 
675                if [ ${nb_restart_file} -gt 1 ] ; then
676                    j=0
677                    until [ $j -ge $nb_restart_file ]; do
678                        j4=${j}
679                        eval IGCM_sys_Put_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_OUT_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
680                        [ ! ${file_in} = ${file_outin} ] && IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc
681                        #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_in}_${j4}.nc" > /dev/null 2>&1
682                        (( j=j+1 ))
683                    done
684                else
685                    eval IGCM_sys_Put_Rest ${file_in} \${R_OUT_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
686                    [ ! ${file_in} = ${file_outin} ] && IGCM_sys_Mv ${file_in} ${file_outin}
687                    #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
688                fi
689
690                (( i=i+3 ))
691            done
692        else
693            if [ X${FileName0} != XNONE ] ; then
694                IGCM_debug_Exit "IGCM_comp_Finalize : No file in restart list for ${compname}."
695            else
696                IGCM_debug_Print 1 "IGCM_comp_Finalize : NONE specified in Restart List ${compname}."
697            fi
698        fi
699
700        # Save Output files
701        #------------------
702        IGCM_card_DefineArrayFromOption ${card} OutputFiles List
703        ListFilesName=${compname}_OutputFiles_List
704        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
705
706        if [ X${FileName0} != X${NULL_STR} ] ; then
707            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
708
709            (( i=0 ))
710            until [ $i -ge $NbFiles ]; do
711                SaveOnArchive=true
712                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
713                eval file_in=${file_in_}
714                (( i_ = i+1 ))
715                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
716                eval file_out=${file_out_}
717                (( i_ = i+2 ))
718                eval flag_post=\${${ListFilesName}[$i_]} > /dev/null 2>&1
719                #
720                generic_file_name=$( basename ${file_in} .nc )
721                nb_rebuild_file=$( ls | grep "^${generic_file_name}[_0-9]*.nc" | wc -l )
722                #
723                if ( [ ${nb_rebuild_file} -eq 1 ] && [ -f ${generic_file_name}_0000.nc ] ) ; then
724                    IGCM_debug_Print 2 "Parallelism with 1 process. Rebuilding ${file_in} not needed"
725                    IGCM_sys_Mv ${generic_file_name}_0000.nc ${file_in}
726                elif [ ${nb_rebuild_file} -gt 1 ] ; then
727                    IGCM_debug_Print 2 "Parallelism detected rebuilding ${file_in} is needed"
728                    if ( [ X${config_Post_RebuildFrequency} = X${NULL_STR} ] || [ X${config_Post_RebuildFrequency} = XNONE ] ) ; then
729                        IGCM_debug_Print 2 "Rebuilding ${file_in} online"
730                        IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc
731                    else
732                        IGCM_debug_Print 2 "Preparing offline rebuild for ${file_in}"
733                        [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
734                        IGCM_sys_Mv ${generic_file_name}_????.nc ${RUN_DIR}/REBUILD_${PeriodDateBegin}
735
736                        # Prepare headers for the shell dedicated to offline rebuild
737                        if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
738                            echo \#!/bin/ksh                                           > ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
739                            echo function IGCM_FlushRebuild                           >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
740                            echo {                                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
741                            echo IGCM_debug_PushStack "IGCM_FlushRebuild"             >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
742                            echo echo                                                 >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
743                            echo IGCM_debug_Print 1 "IGCM_FlushRebuild"               >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
744                            echo echo                                                 >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
745                        fi
746                        # Prepare the shell dedicated to offline rebuild
747                        echo IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
748                        echo IGCM_debug_Verif_Exit                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
749                        #
750                        # Load Patch we need to apply and apply
751                        if [ X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) !=  X${NULL_STR} ]; then
752                            for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
753                                echo . ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
754                                echo IGCM_${Patch} ${file_in}                         >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
755                            done
756                        fi
757                        #
758                        echo IGCM_sys_Put_Out ${file_in} ${file_out}                  >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
759                        echo IGCM_debug_Verif_Exit                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
760                        echo IGCM_sys_Rm ${generic_file_name}_*.nc                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
761                        SaveOnArchive=false
762                    fi
763                fi
764                #
765                if [ ${SaveOnArchive} = true ] ; then
766                    #
767                    # If we need to apply a patch we use TMP DIRECTORY before ARCHIVING if asynchronous rebuild is on
768                    #
769                    if ( [ ! X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) =  X${NULL_STR} ] && [ ! X${config_Post_RebuildFrequency} = X ] && [ ! X${config_Post_RebuildFrequency} = XNONE ] ) ; then
770                        if [ -f ${file_in} ] ; then
771                            IGCM_sys_Mv ${file_in} ${RUN_DIR}/REBUILD_${PeriodDateBegin}
772                            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=REBUILD_${PeriodDateBegin}/${file_in} > /dev/null 2>&1
773                            #
774                            for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
775                                echo . ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh     >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
776                                echo IGCM_${Patch} ${file_in}                             >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
777                            done
778                            #
779                            echo IGCM_sys_Put_Out ${file_in} ${file_out}                  >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
780                            echo IGCM_debug_Verif_Exit                                    >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
781                            #
782                        fi
783                    else
784                        IGCM_sys_Put_Out ${file_in} ${file_out}
785                        [ $? -eq 0 ] && eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
786                        if [ ${nb_rebuild_file} -gt 1 ] ; then
787                            for DelFile in $( ls | grep "${generic_file_name}[_0-9]*.nc" ) ; do
788                                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${DelFile} > /dev/null 2>&1
789                            done
790                        fi
791                    fi
792                fi
793                (( i=i+3 ))
794            done
795        fi
796
797        # Save Output Text files of models
798        #---------------------------------
799       
800        IGCM_card_DefineArrayFromOption ${card} OutputText List
801        ListTextName=${compname}_OutputText_List
802       
803        eval TextName0=\${${ListTextName}[0]} > /dev/null 2>&1
804        if [ X${TextName0} != X${NULL_STR} ] ; then
805            eval NbFiles=\${#${ListTextName}[@]} > /dev/null 2>&1
806
807            (( i=0 ))
808            until [ $i -eq $NbFiles ]; do
809                eval file_in=\${${ListTextName}[$i]} > /dev/null 2>&1
810                (( i=i+1 ))
811
812                nb_text_file=$( ls ${file_in}* 2>/dev/null | wc -l )
813                if [ ${nb_text_file} -gt 1 ] ; then
814                    list_file=$( ls ${file_in}* )
815                    for file in ${list_file}
816                      do
817                      eval IGCM_sys_Put_Out ${file} \${R_OUT_${comp}_D}/${PREFIX}_${file}
818                      eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
819                    done
820                else
821                    if ( [ -f ${file_in}_0000 ] || [ -f ${file_in}0 ] ) ; then
822                        eval IGCM_sys_Mv ${file_in}* ${file_in}
823                    fi
824                    eval IGCM_sys_Put_Out ${file_in} \${R_OUT_${comp}_D}/${PREFIX}_${file_in}
825                    [ $? -eq 0 ] && eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
826                fi
827            done
828        fi
829    done
830
831    IGCM_debug_PopStack "IGCM_comp_Finalize"
832}
Note: See TracBrowser for help on using the repository browser.