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

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