source: tags/libIGCM_v1_4/libIGCM_comp/libIGCM_comp.ksh

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