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

Last change on this file since 522 was 522, checked in by sdipsl, 12 years ago

Source driver from ${SUBMIT_DIR}/DRIVER/ if it exists ; otherwise back to default
Add yyyymm_m1, yyyymm_p1, month_m1, month_p1 and day as available global variables. Needed by LMDZ-REPROBUS
Add IGCM_date_GetYearMonthDay function
JG

  • 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 Revision Author Date
File size: 40.9 KB
Line 
1#!/bin/ksh
2
3#**************************************************************
4# Author: Sebastien Denvil, Martial Mancip
5# Contact: Sebastien.Denvil__at__ipsl.jussieu.fr Martial.Mancip__at__ipsl.jussieu.fr
6# $Revision::                                          $ Revision of last commit
7# $Author::                                            $ Author of last commit
8# $Date::                                              $ Date of last commit
9# IPSL (2006)
10#  This software is governed by the CeCILL licence see libIGCM/libIGCM_CeCILL.LIC
11#
12#**************************************************************
13
14#========================================================================
15function IGCM_comp_Initialize
16{
17    IGCM_debug_PushStack "IGCM_comp_Initialize"
18
19    # Debug Print :
20    echo
21    IGCM_debug_Print 1 "IGCM_comp_Initialize"
22    echo
23
24    typeset comp compname comptagname CompatibilityTag auxprint card_UserChoices first_option option i j
25    for comp in ${config_ListOfComponents[*]} ; do
26        # Debug Print
27        IGCM_debug_Print 1 ${comp}
28        # Define component
29        IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card ListOfComponents ${comp}
30        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
31        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
32
33        # Read libIGCM compatibility version in ${compname}.card
34        card=${SUBMIT_DIR}/COMP/${compname}.card
35        IGCM_card_DefineVariableFromOption ${card} Compatibility libIGCM
36
37        eval CompatibilityTag=\${${compname}_Compatibility_libIGCM} > /dev/null 2>&1   
38        if [ ! "${CompatibilityTag}" = "${libIGCM_CurrentTag}" ] ; then
39            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 ."
40        fi
41
42        # Manage component executable
43        IGCM_card_DefineArrayFromOption ${SUBMIT_DIR}/config.card Executable ${comp}
44
45        # Read component Write Frequency in config.card
46        IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} WriteFrequency
47        # Debug Print :
48        eval auxprint=\${config_${comp}_WriteFrequency}
49        IGCM_debug_Print 1 "Write frequency for ${compname} : ${auxprint} "
50        #2> /dev/null
51
52        # Debug Print :
53        IGCM_debug_Print 2 "Initialize following component library"
54
55        # Source drivers in directory DRIVER if it exist
56        # else source them from directory COMP
57        if [ -d ${SUBMIT_DIR}/DRIVER ] ; then
58            IGCM_debug_Print 2 ${SUBMIT_DIR}/DRIVER/${compname}.driver
59            # Source component library
60            . ${SUBMIT_DIR}/DRIVER/${compname}.driver
61        else
62            IGCM_debug_Print 2 ${SUBMIT_DIR}/COMP/${compname}.driver
63            # Source component library
64            . ${SUBMIT_DIR}/COMP/${compname}.driver
65        fi
66        IGCM_debug_Print 3 "With tag : ${comptagname}"
67       
68
69        # Debug Print
70        IGCM_debug_Print 3 "Initialize ${comp} output directory."
71        # Define Dirs   
72        eval R_OUT_${comp}=${R_SAVE}/${comp}
73        eval IGCM_sys_MkdirArchive \${R_OUT_${comp}}
74
75        eval R_OUT_${comp}_O=\${R_OUT_${comp}}/Output
76        eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_O}
77
78        eval R_OUT_${comp}_R=\${R_OUT_${comp}}/Restart
79        eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_R}
80
81        eval R_OUT_${comp}_D=\${R_OUT_${comp}}/Debug
82        eval IGCM_sys_MkdirArchive \${R_OUT_${comp}_D}
83
84        eval R_OUT_${comp}_O_I=\${R_OUT_${comp}_O}/INS
85        eval R_OUT_${comp}_O_H=\${R_OUT_${comp}_O}/HF
86        eval R_OUT_${comp}_O_D=\${R_OUT_${comp}_O}/DA
87        eval R_OUT_${comp}_O_M=\${R_OUT_${comp}_O}/MO
88        eval R_OUT_${comp}_O_Y=\${R_OUT_${comp}_O}/YE
89
90        # Read UserChoices section of component card
91        IGCM_debug_Print 2 "DefineArrayFromSection : ${compname}_UserChoices ${card}"
92        IGCM_card_DefineArrayFromSection ${card} UserChoices
93        eval first_option=\${${compname}_UserChoices[0]} > /dev/null 2>&1
94        # If section is not empty we define corresponding variables
95        if [ X${first_option} != X"Error:" ] ; then
96            if [ X${card_UserChoices[0]} != X ] ; then
97                unset card_UserChoices
98            fi
99            eval set +A card_UserChoices -- \${${compname}_UserChoices[*]} > /dev/null 2>&1
100            IGCM_debug_Print 3 "${compname}_UserChoices_values:"
101            for option in ${card_UserChoices[*]} ; do
102                IGCM_card_DefineVariableFromOption ${card} UserChoices ${option}
103                eval IGCM_debug_Print 3 "${option}=\${${compname}_UserChoices_${option}}"
104            done
105        fi
106
107        # Read and Build Output File stuff
108        IGCM_debug_Print 2 "DefineArrayFromOption  : ${compname}_OutputFiles ${card}"
109        IGCM_card_DefineArrayFromOption ${card} OutputFiles List
110        ListFilesName=${compname}_OutputFiles_List
111        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
112        #
113        if [ X${FileName0} != X${NULL_STR} ] ; then
114            #
115            #IGCM_debug_Print 1 "Component      : ${compname}"
116            #
117            # INITIALISATION
118            #
119            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
120            #
121            i=2
122            #
123            until [ $i -ge $NbFiles ]; do
124                #
125                eval flag_post=\${${ListFilesName}[$i]} > /dev/null 2>&1
126                #
127                if [ X${flag_post} != XNONE ] ; then
128                    #
129                    # First of all
130                    #
131                    IGCM_card_DefineArrayFromSection ${card} ${flag_post}
132                    #
133                    # Seasonal case : If option Seasonal is not found (old cards) put SEASONAL ON by default
134                    #
135                    # variable option allready typeset above
136                    for option in $( eval echo \${${compname}_${flag_post}[*]} ) ; do
137                        if [ ${option} = Seasonal ] ; then
138                            FoundSeasonal=true
139                            IGCM_card_DefineVariableFromOption ${card} ${flag_post} Seasonal
140                        fi
141                    done
142                    #
143                    if [ ! X${FoundSeasonal} = Xtrue ] ; then
144                        eval ${compname}_${flag_post}_Seasonal=ON
145                    fi
146                    #
147                    if [ $( eval echo \${${compname}_${flag_post}_Seasonal} ) = ON ] ; then
148                        Seasonal=true
149                    fi
150                   
151                    # Dimension = vide si vieille card.
152                    IGCM_card_DefineArrayFromOption ${card} ${flag_post} TimeSeriesVars
153                    IGCM_card_DefineArrayFromOption ${card} ${flag_post} Patches
154                    if [ X"$( eval echo \${${compname}_${flag_post}_TimeSeriesVars[*]} )" = X"Option not" ] ; then
155                        # New TimeSeriesVar description, with 2D, 3D and associate ChunckJob.
156                        ListDimension[0]=2D
157                        ListDimension[1]=3D
158                        TimeSeries=false
159                        iLoop=${#ListDimension[*]}
160                        j=0
161                        until [ $j -ge ${iLoop} ]; do
162                            Dimension=${ListDimension[${j}]}
163                            IGCM_card_DefineArrayFromOption ${card} ${flag_post} TimeSeriesVars${Dimension}
164                            IGCM_card_DefineVariableFromOption ${card} ${flag_post} ChunckJob${Dimension}
165                            #
166                            # Time series WITHOUT chunk
167                            #
168                            if [ ! $( eval echo \${${compname}_${flag_post}_TimeSeriesVars${Dimension}} ) = ${NULL_STR} ] ; then
169                                if [ $( eval echo \${${compname}_${flag_post}_ChunckJob${Dimension}} ) = NONE ] ; then
170                                    IGCM_debug_Print 3 "${Dimension} time series activated for ${flag_post}"
171                                    eval TimeSeries${Dimension}=true
172                                fi
173                            fi
174                            #
175                            # Time series WITH chunk
176                            #
177                            if [ ! $( eval echo \${${compname}_${flag_post}_TimeSeriesVars${Dimension}} ) = ${NULL_STR} ] ; then
178                                chunck_size=$( eval echo \${${compname}_${flag_post}_ChunckJob${Dimension}} )
179                                if [ ! ${chunck_size} = NONE ] &&  [ ! ${chunck_size} = OFF ] ; then
180                                    IGCM_debug_Print 3 "${Dimension} time series activated with chunck for ${flag_post}"
181                                    eval TimeSeriesChunck${Dimension}=true
182                                    eval set +A CHUNCK${Dimension}_COMP \${CHUNCK${Dimension}_COMP[*]} ${comp}
183                                    eval set +A CHUNCK${Dimension}_FLAG \${CHUNCK${Dimension}_FLAG[*]} ${i}
184                                    eval set +A CHUNCK${Dimension}_NAME \${CHUNCK${Dimension}_NAME[*]} ${flag_post}
185                                    eval set +A CHUNCK${Dimension}_SIZE \${CHUNCK${Dimension}_SIZE[*]} ${chunck_size}
186                                fi
187                            fi
188                            (( j=j+1 ))
189                        done
190                    else
191                        ListDimension[0]=""
192                        TimeSeries=true
193                        TimeSeries2D=false
194                        TimeSeries3D=false
195                        TimeSeriesChunck2D=false
196                        TimeSeriesChunck3D=false
197                    fi
198                fi
199                (( i=i+3 ))
200            done
201        fi
202        # Debug Print
203        IGCM_debug_Print 3 "Initialize ${compname} with driver."
204        # INIT component
205        ${comp}_Initialize
206        echo
207    done
208
209    IGCM_debug_PopStack "IGCM_comp_Initialize"
210}
211
212#=======================================================================
213function IGCM_comp_PrepareDeletedFiles
214{
215    IGCM_debug_PushStack "IGCM_comp_PrepareDeletedFiles" $@
216   
217    if [ X${2} != X. ] ; then
218        eval FileToBeDeleted[${#FileToBeDeleted[@]}]=$( basename ${2} ) > /dev/null 2>&1
219    else
220        eval FileToBeDeleted[${#FileToBeDeleted[@]}]=$( basename ${1} ) > /dev/null 2>&1
221    fi
222
223    IGCM_debug_PopStack "IGCM_comp_PrepareDeletedFiles"
224}
225
226#=======================================================================
227function IGCM_comp_GetInputInitialStateFiles
228{
229    IGCM_debug_PushStack "IGCM_comp_GetInputInitialStateFiles"
230
231    # Debug Print :
232    echo
233    IGCM_debug_Print 1 "IGCM_comp_GetInputInitialStateFiles"
234    echo
235
236    # Only the first time step need InitialStateFiles
237    # otherwise it's BoundaryConditions
238    if ( ${FirstInitialize} ) ; then
239      typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
240      typeset file_in_ file_in file_out_ file_out do_init
241      for comp in ${config_ListOfComponents[*]} ; do
242          # Initialize
243          do_init="y"
244          # Do we need to bring initial state file for this component
245          if [ "${config_Restarts_OverRule}" = "y" ] ; then
246              eval do_init="n"
247          else
248              # Read component Restarts parameters
249              IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
250              eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
251              if [ "${do_start}" = "y" ] ; then
252                    do_init="n"
253              else
254                    do_init="y"
255              fi
256          fi
257
258          if [ "${do_init}" = "y" ] ; then
259              # Define component
260              eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
261              eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
262
263              # Debug Print :
264              IGCM_debug_Print 3 "Initialisation files ${compname}"
265
266              card=${SUBMIT_DIR}/COMP/${compname}.card
267
268              IGCM_card_DefineArrayFromOption ${card} InitialStateFiles List
269              ListFilesName=${compname}_InitialStateFiles_List
270
271              eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
272              if [ X${FileName0} != X${NULL_STR} ] ; then
273                  eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
274                  (( i=0 ))
275                  until [ $i -ge $NbFiles ]; do
276                      eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
277                      eval file_in=${file_in_}
278                      (( i_ = i+1 ))
279                      eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
280                      eval file_out=${file_out_}
281                     
282                      IGCM_sys_Get ${file_in} ${file_out}
283                      #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
284
285                      (( i=i+2 ))
286                  done
287              fi
288          fi
289      done
290    fi
291    IGCM_debug_PopStack "IGCM_comp_GetInputInitialStateFiles"
292}
293
294#=======================================================================
295# Definition of Smooth modulo function
296# usage :
297# IGCM_SmoothModulo StringModulo value
298#
299# StringModulo : A string of min max and modulo like definition of Scilab vectors.
300# [min]:[modulo:][max]
301# where :
302# [] value are optionnals;
303# empty min equal 1
304# empty max equal infinity
305# modulo not given or empty equal 1
306# empty string or just ':' equal always.
307#
308# value : the value to test with the definition
309#
310# return : true(1)/false(0)
311function IGCM_SmoothModulo
312{
313    IGCM_debug_PushStack "IGCM_SmoothModulo"
314    typeset defVector ModValue
315
316    eval set +A defVector -- $( echo "${1}" | \
317        gawk -F ':' '{print ($1 == "" ? 1 : $1) " " (NF==3 ? ($2 == "" ? 1 : $2) : 1) " " (NF==3 ? ($3 == "" ? -1 : $3) : ($2 == "" ? -1 : $2))}' )
318
319    # Save Smooth Min and Max. Needed to call IGCM_sys_Get when appropriate
320    arr[1]=${defVector[0]}
321    arr[2]=${defVector[2]}
322
323    # Test limits :
324    # ${defVector[0]} <= ${2} <= ${defVector[2]}
325    #                                      or ${defVector[2]} == -1
326    if ( [ ${2} -ge ${defVector[0]} ] && \
327         ( [ ${2} -le ${defVector[2]} ] || \
328           [ ${defVector[2]} -lt 0 ] ) ) ; then
329        # Test modulo
330        ModValue=$( expr \( ${2} - ${defVector[0]} \) % ${defVector[1]} )
331        if [ ${ModValue} -eq 0 ] ;  then
332            arr[3]=true
333            echo ${arr[@]}
334            IGCM_debug_PopStack "IGCM_SmoothModulo"
335            return 1
336        else
337            arr[3]=false
338            echo ${arr[@]}
339            IGCM_debug_PopStack "IGCM_SmoothModulo"
340            return 0
341        fi
342    else
343        arr[3]=false
344        echo ${arr[@]}
345        IGCM_debug_PopStack "IGCM_SmoothModulo"
346        return 0
347    fi
348}
349
350#=======================================================================
351function IGCM_comp_GetInputSmoothFiles
352{
353    IGCM_debug_PushStack "IGCM_comp_GetInputSmoothFiles"
354
355    # Debug Print :
356    echo
357    IGCM_debug_Print 1 "IGCM_comp_GetInputSmoothFiles"
358    echo
359
360    typeset comp compname comptagname card ListFilesName FileName0 NbFiles j i i_ i__
361    typeset file_in_ file_in file_out_ file_out ret SmoothDef aux val
362
363    for comp in ${config_ListOfComponents[*]} ; do
364        # Define component
365        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
366        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
367
368        # Debug Print :
369        IGCM_debug_Print 3 "Smooth files ${compname}"
370
371        card=${SUBMIT_DIR}/COMP/${compname}.card
372
373        IGCM_card_DefineArrayFromOption ${card} SmoothFiles List
374        ListFilesName=${compname}_SmoothFiles_List
375        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
376
377        if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != X"Section" ] ) ; then
378            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
379
380            (( i=0 ))
381            until [ $i -ge $NbFiles ]; do
382                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
383                eval file_in=${file_in_}
384                (( i_ = i+1 ))
385                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
386                eval file_out=${file_out_}
387
388                # define CumulPeriod definition for this file
389                (( i__ = i+2 ))
390                eval SmoothDef=\${${ListFilesName}[$i__]}
391                IGCM_debug_Print 3 "  ${file_in} ${SmoothDef}"
392                aux=$( IGCM_SmoothModulo ${SmoothDef} ${CumulPeriod} )
393                j=1
394                for val in ${aux} ; do
395                    [ ${j} -eq 1 ] && SmoothMin=${val}
396                    [ ${j} -eq 2 ] && SmoothMax=${val}
397                    [ ${j} -eq 3 ] && ret=${val}
398                    (( j=j+1 ))
399                done
400                [ ${SmoothMax} -eq -1 ] && SmoothMax=${CumulPeriod}
401                if ( [ X${ret} = Xtrue ] || ( [ ${Period} -eq 1 ] && [ ${CumulPeriod} -ge ${SmoothMin} ] && [ ${CumulPeriod} -le ${SmoothMax} ] ) ) ; then
402                #if ( [ X${ret} = Xtrue ] || [ ${Period} -eq 1 ] ) ; then
403                    IGCM_sys_Get ${file_in} ${file_out}
404                    #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
405                fi
406                (( i=i+3 ))
407            done
408        fi
409    done
410   
411    IGCM_debug_PopStack "IGCM_comp_GetInputSmoothFiles"
412}
413
414#=======================================================================
415function IGCM_comp_GetInputBoundaryFiles
416{
417    IGCM_debug_PushStack "IGCM_comp_GetInputBoundaryFiles"
418
419    # Debug Print :
420    echo
421    IGCM_debug_Print 1 "IGCM_comp_GetInputBoundaryFiles"
422    echo
423
424    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
425    typeset file_in_ file_in file_out_ file_out
426
427    if [ ${Period} = 1 ]; then
428        ListFixBoundary=" "
429    fi
430
431    for comp in ${config_ListOfComponents[*]} ; do
432
433        # Define component
434        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
435        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
436
437        # Debug Print :
438        IGCM_debug_Print 3 "Boundary files ${compname}"
439
440        card=${SUBMIT_DIR}/COMP/${compname}.card
441
442        IGCM_card_DefineArrayFromOption ${card} BoundaryFiles List
443        ListFilesName=${compname}_BoundaryFiles_List
444        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
445
446        if [ X${FileName0} != X${NULL_STR} ] ; then
447            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
448
449            (( i=0 ))
450            until [ $i -ge $NbFiles ]; do
451                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
452                eval file_in=${file_in_}
453                (( i_ = i+1 ))
454                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
455                eval file_out=${file_out_}
456
457                IGCM_sys_Get ${file_in} ${file_out}
458                IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
459
460                (( i=i+2 ))
461            done
462        fi
463
464        # Get non deleted files
465        if [ ${Period} = 1 ]; then
466
467            IGCM_card_DefineArrayFromOption ${card} BoundaryFiles ListNonDel
468            ListFilesName=${compname}_BoundaryFiles_ListNonDel
469            eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
470           
471            if [ X${FileName0} != X${NULL_STR} ] ; then
472                eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
473               
474                (( i=0 ))
475                until [ $i -ge $NbFiles ]; do
476                    eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
477                    eval file_in=${file_in_}
478                    (( i_ = i+1 ))
479                    eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
480                    eval file_out=${file_out_}
481
482                    IGCM_sys_Get ${file_in} ${file_out}
483
484                    if [ X${file_out} != X. ] ; then
485                        ListFixBoundary=${ListFixBoundary}" "${file_out}
486                    else
487                        ListFixBoundary=${ListFixBoundary}" "$( basename ${file_in} )
488                    fi
489
490                    (( i=i+2 ))
491                done
492            fi
493        fi
494    done
495   
496    IGCM_debug_PopStack "IGCM_comp_GetInputBoundaryFiles"
497}
498
499#=======================================================================
500function IGCM_comp_DelFixeBoundaryFiles
501{
502    IGCM_debug_PushStack "IGCM_comp_DelFixeBoundaryFiles"
503
504    # Debug Print :
505    echo
506    IGCM_debug_Print 1 "IGCM_comp_DelFixeBoundaryFiles"
507    echo
508
509    ls -l ${ListFixBoundary}
510    rm -f ${ListFixBoundary}
511
512    IGCM_debug_PopStack "IGCM_comp_DelFixeBoundaryFiles"
513}
514
515#=======================================================================
516function IGCM_comp_GetInputParametersFiles
517{
518    IGCM_debug_PushStack "IGCM_comp_GetInputParametersFiles"
519
520    # Debug Print :
521    echo
522    IGCM_debug_Print 1 "IGCM_comp_GetInputParametersFiles"
523    echo
524
525    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_ file_in file_out
526    for comp in ${config_ListOfComponents[*]} ; do
527        # Define component
528        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
529        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
530
531        # Debug Print :
532        IGCM_debug_Print 3 "Parameters ${compname}"
533
534        card=${SUBMIT_DIR}/COMP/${compname}.card       
535
536        IGCM_card_DefineArrayFromOption ${card} ParametersFiles List
537        ListFilesName=${compname}_ParametersFiles_List
538        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
539
540        if [ X${FileName0} != X${NULL_STR} ] ; then
541            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
542
543            (( i=0 ))
544            until [ $i -ge $NbFiles ]; do
545                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
546                eval file_in=${file_in_}
547                (( i_ = i+1 ))
548                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
549                eval file_out=${file_out_} 
550
551                IGCM_sys_Cp ${file_in} ${file_out} 
552                IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
553
554                (( i=i+2 ))
555            done
556        fi
557    done
558
559    IGCM_debug_PopStack "IGCM_comp_GetInputParametersFiles"
560}
561
562#=======================================================================
563function IGCM_comp_GetInputRestartFiles
564{
565    IGCM_debug_PushStack "IGCM_comp_GetInputRestartFiles"
566
567    # Debug Print :
568    echo
569    IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles"
570    echo
571
572    typeset Date_tmp Date_r Path_r do_start CompOldName Path_temp
573    typeset comp compname comptagname card ListFilesName FileName0 NbFiles i i_
574    typeset file_in file_out file_in_ file_out_ file_in_Name
575    typeset -Z4 j4
576
577    for comp in ${config_ListOfComponents[*]} ; do
578        # Define component
579        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
580        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
581        #
582        card=${SUBMIT_DIR}/COMP/${compname}.card
583        #
584        IGCM_card_DefineArrayFromOption ${card} RestartFiles List
585        ListFilesName=${compname}_RestartFiles_List
586        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
587
588        # Debug Print :
589        IGCM_debug_Print 3 "restart ${compname}"
590
591        if ( ${FirstInitialize} ) ; then
592
593            if [ "${config_Restarts_OverRule}" = "y" ] ; then
594                eval config_${comp}_Restart="y"
595                eval config_${comp}_RestartDate=${config_Restarts_RestartDate}
596                eval config_${comp}_RestartJobName=${config_Restarts_RestartJobName}
597                eval config_${comp}_RestartPath=${config_Restarts_RestartPath}
598                eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
599                eval CompOldName=${comp}
600            else
601                # Read component Restarts parameters
602                IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} Restart
603                eval do_start=\${config_${comp}_Restart} > /dev/null 2>&1
604
605                if [ "${do_start}" = "y" ] ; then
606                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartDate
607                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartJobName
608                    IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} RestartPath
609                else
610                    eval config_${comp}_RestartDate=-1
611                    eval config_${comp}_RestartJobName=${NULL_STR}
612                    eval config_${comp}_RestartPath=${NULL_STR}
613                fi
614                IGCM_card_DefineVariableFromOption ${SUBMIT_DIR}/config.card ${comp} OldName
615                eval CompOldName=\${config_${comp}_OldName}
616                if [ X${CompOldName} = X ] ; then
617                    eval CompOldName=${comp}
618                fi
619            fi
620
621            if [ "${do_start}" = "y" ] ; then
622
623                if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
624                    eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
625
626                    (( i=1 ))
627                    until [ $i -gt $NbFiles ]; do
628                        eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
629                        eval file_in=${file_in_}
630
631                        (( i_ = i+1 ))
632                        eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
633                        eval file_out=${file_out_}
634                       
635                        eval Date_tmp=\${config_${comp}_RestartDate}
636                        Date_r=$( IGCM_date_ConvertFormatToGregorian ${Date_tmp} )
637                        eval Path_r=\${config_${comp}_RestartPath}/\${config_${comp}_RestartJobName}/${CompOldName}/Restart
638                        eval file_in_Name=\${config_${comp}_RestartJobName}_${Date_r}_${file_in}
639
640                        generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
641                        generic_restart_file_name_out=$( basename ${file_out} .nc )
642                       
643                        eval Path_temp=\${Path_r}/${generic_restart_file_name_in}
644                        nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_temp}_????.nc)
645
646                        if [ ${nb_restart_file} -gt 1 ] ; then
647                            j=0
648                            until [ $j -ge $nb_restart_file ]; do
649                                j4=${j}
650                                eval IGCM_sys_Get ${Path_r}/${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
651                                #IGCM_comp_PrepareDeletedFiles ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
652                                #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_out}_${j4}.nc" > /dev/null 2>&1
653                                (( j=j+1 ))
654                            done
655                        else
656                            eval IGCM_sys_Get ${Path_r}/${file_in_Name} ${file_out} 
657                            #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
658                        fi
659               
660                        (( i=i+3 ))
661                    done
662                else
663                    if [ X${FileName0} != XNONE ] ; then
664                        IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
665                    else
666                        IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
667                    fi
668                fi
669            fi
670        elif [ ${Period} -eq 1 ] ; then
671            # if not FirstInitialize and first loop of this job
672
673            # Restore Restarts files
674            #-----------------------
675            if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
676                eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
677
678                (( i=1 ))
679                until [ $i -gt $NbFiles ]; do
680                    eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
681                    eval file_in=${file_in_}
682                    (( i_ = i+1 ))
683                    eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
684                    eval file_out=${file_out_}
685                   
686                    file_in_Name=${run_Configuration_OldPrefix}_${file_in}
687
688                    generic_restart_file_name_in=$( basename ${file_in_Name} .nc )
689                    generic_restart_file_name_out=$( basename ${file_out} .nc )
690
691                    eval Path_temp=\${R_OUT_${comp}_R}/${generic_restart_file_name_in}
692                    nb_restart_file=$(IGCM_sys_CountFileArchive ${Path_temp}_????.nc)
693
694                    if [ ${nb_restart_file} -gt 1 ] ; then
695                        j=0
696                        until [ $j -ge $nb_restart_file ]; do
697                            j4=${j}
698                            eval IGCM_sys_Get \${R_OUT_${comp}_R}/${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
699                            #IGCM_comp_PrepareDeletedFiles ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_out}_${j4}.nc
700                            #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_out}_${j4}.nc" > /dev/null 2>&1
701
702                            (( j=j+1 ))
703                        done
704                    else
705                        eval IGCM_sys_Get \${R_OUT_${comp}_R}/${file_in_Name} ${file_out}
706                        #IGCM_comp_PrepareDeletedFiles ${file_in} ${file_out}
707                    fi
708
709                    (( i=i+3 ))
710                done
711            else
712                if [ X${FileName0} != XNONE ] ; then
713                    IGCM_debug_Exit "IGCM_comp_GetInputRestartFiles : No file in list for ${compname}."
714                else
715                    IGCM_debug_Print 1 "IGCM_comp_GetInputRestartFiles : NONE specified in Restart List ${compname}."
716                fi
717            fi
718        fi
719    done
720
721    typeset NbFichs
722    NbFiles=$( ls * 2> /dev/null | wc -l )
723    if [ ${NbFiles} -gt 0 ] ; then
724        IGCM_sys_Chmod u+rw *
725    fi
726
727    IGCM_debug_PopStack "IGCM_comp_GetInputRestartFiles"
728}
729
730#=======================================================================
731function IGCM_comp_PeriodStart
732{
733    IGCM_debug_PushStack "IGCM_comp_PeriodStart"
734
735    # Debug Print :
736    echo
737    IGCM_debug_Print 1 "IGCM_comp_PeriodStart"
738    echo
739
740    typeset ExeNameIn ExeNameOut
741    typeset comp compname comptagname
742    for comp in ${config_ListOfComponents[*]} ; do
743        # Define component
744        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
745        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
746
747        # Copy executable for this component
748        eval ExeNameIn=\${config_Executable_${comp}[0]}
749        eval ExeNameOut=\${config_Executable_${comp}[1]}
750
751        # Debug Print
752        IGCM_debug_Print 3 "PeriodStart ${compname} Driver Function (if any)."
753        # UPDATE component
754        ${comp}_PeriodStart 2> /dev/null
755
756    done
757
758    IGCM_debug_PopStack "IGCM_comp_PeriodStart"
759}
760
761#=======================================================================
762function IGCM_comp_Update
763{
764    IGCM_debug_PushStack "IGCM_comp_Update"
765
766    # Debug Print :
767    echo
768    IGCM_debug_Print 1 "IGCM_comp_Update"
769    echo
770
771    typeset ExeNameIn ExeNameOut
772    typeset comp compname comptagname
773    for comp in ${config_ListOfComponents[*]} ; do
774        # Define component
775        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
776        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
777
778        # Copy executable for this component
779        eval ExeNameIn=\${config_Executable_${comp}[0]}
780        eval ExeNameOut=\${config_Executable_${comp}[1]}
781
782        # If missing executable then stop!
783        #if [ ! X${ExeNameIn} = X ] && [ ! -f ${R_EXE}/${ExeNameIn} ] ; then
784        #    IGCM_debug_Exit "IGCM_comp_Update missing executable ${ExeNameIn}"
785        #fi
786
787        if [ ${Period} -eq 1 ] && [ -f ${R_EXE}/${ExeNameIn} ] ; then
788            eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
789            if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
790                eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
791            fi
792        elif [ -f ${R_EXE}/${ExeNameIn} ] && [ ! -f ${RUN_DIR}/${ExeNameOut} ] ; then
793            eval IGCM_sys_Cp ${R_EXE}/${ExeNameIn} ${ExeNameOut}
794            if [ -f ${RUN_DIR}/${ExeNameOut} ] ; then
795                eval IGCM_sys_Chmod +rx ${RUN_DIR}/${ExeNameOut}
796            fi
797        fi
798
799        # Debug Print
800        IGCM_debug_Print 1 "Update ${compname} Parameter Files."
801        # UPDATE component
802        ${comp}_Update
803
804    done
805
806    IGCM_debug_PopStack "IGCM_comp_Update"
807}
808
809#=======================================================================
810function IGCM_comp_Finalize
811{
812    IGCM_debug_PushStack "IGCM_comp_Finalize"
813
814    # Debug Print :
815    echo
816    IGCM_debug_Print 1 "IGCM_comp_Finalize"
817    echo
818
819    typeset ListTextName TextName0
820    typeset comp compname comptagname card ListFilesName FileName0 NbFiles SaveOnArchive
821    typeset i i_ file_in file_in_ file_out file_out_ file_outin file_outin_ generic_file_name nb_rebuild_file
822    typeset -Z4 j4
823    typeset list_file nlist_file
824    typeset compactoutputs
825
826    compactoutputs=false
827    if [ X${JobType} != XRUN ] ; then
828        compactoutputs=true
829    elif [ X${config_UserChoices_CompactText} != Xn ] ; then
830        compactoutputs=true
831    fi
832
833    for comp in ${config_ListOfComponents[*]} ; do
834        # Define component
835        eval compname=\${config_ListOfComponents_${comp}[0]} > /dev/null 2>&1
836        eval comptagname=\${config_ListOfComponents_${comp}[1]} > /dev/null 2>&1
837
838        # Debug Print
839        IGCM_debug_Print 1 "Finalize ${compname} component."
840        # FINALIZE component
841        ${comp}_Finalize
842
843        card=${SUBMIT_DIR}/COMP/${compname}.card       
844
845        # Save Restarts files
846        #--------------------
847        IGCM_card_DefineArrayFromOption ${card} RestartFiles List
848        ListFilesName=${compname}_RestartFiles_List
849        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
850       
851        if ( [ X${FileName0} != X${NULL_STR} ] && [ X${FileName0} != XNONE ] ) ; then
852            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
853           
854            (( i=0 ))
855            until [ $i -ge $NbFiles ]; do
856                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
857                eval file_in=${file_in_}
858
859                (( i_ = i+1 ))
860                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
861                eval file_out=${file_out_}
862
863                (( i_ = i+2 ))
864                eval file_outin_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
865                eval file_outin=${file_outin_}
866
867                generic_restart_file_name_in=$(    basename ${file_in} .nc )
868                generic_restart_file_name_out=$(   basename ${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out} .nc )
869                generic_restart_file_name_outin=$( basename ${file_outin} .nc )
870                       
871                nb_restart_file=$( ls ${generic_restart_file_name_in}_????.nc 2>/dev/null | wc -l ) 
872                if [ ${nb_restart_file} -gt 1 ] ; then
873                    j=0
874                    until [ $j -ge $nb_restart_file ]; do
875                        j4=${j}
876                        eval IGCM_sys_Put_Rest ${generic_restart_file_name_in}_${j4}.nc \${R_OUT_${comp}_R}/${generic_restart_file_name_out}_${j4}.nc
877                        if [ ! ${file_in} = ${file_outin} ] ; then
878                            if ( ${ExitFlag} ) ; then
879                                echo "IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc not executed."
880                            else
881                                IGCM_sys_Mv ${generic_restart_file_name_in}_${j4}.nc ${generic_restart_file_name_outin}_${j4}.nc
882                            fi
883                        fi
884                        #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${generic_restart_file_name_in}_${j4}.nc" > /dev/null 2>&1
885                        (( j=j+1 ))
886                    done
887                else
888                    eval IGCM_sys_Put_Rest ${file_in} \${R_OUT_${comp}_R}/${config_UserChoices_JobName}_${PeriodDateEnd}_${file_out}
889                    if [ ! ${file_in} = ${file_outin} ] ; then
890                        if ( ${ExitFlag} ) ; then
891                            echo "IGCM_sys_Mv ${file_in} ${file_outin} not executed."
892                        else
893                            IGCM_sys_Mv ${file_in} ${file_outin}
894                        fi
895                    fi
896                    #eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
897                fi
898
899                (( i=i+3 ))
900            done
901        else
902            if [ X${FileName0} != XNONE ] ; then
903                IGCM_debug_Exit "IGCM_comp_Finalize : No file in restart list for ${compname}."
904            else
905                IGCM_debug_Print 1 "IGCM_comp_Finalize : NONE specified in Restart List ${compname}."
906            fi
907        fi
908
909        # Save Output files
910        #------------------
911        IGCM_card_DefineArrayFromOption ${card} OutputFiles List
912        ListFilesName=${compname}_OutputFiles_List
913        eval FileName0=\${${ListFilesName}[0]} > /dev/null 2>&1
914
915        if [ X${FileName0} != X${NULL_STR} ] ; then
916            eval NbFiles=\${#${ListFilesName}[@]} > /dev/null 2>&1
917
918            (( i=0 ))
919            until [ $i -ge $NbFiles ]; do
920                SaveOnArchive=true
921                eval file_in_=\${${ListFilesName}[$i]} > /dev/null 2>&1
922                eval file_in=${file_in_}
923                (( i_ = i+1 ))
924                eval file_out_=\${${ListFilesName}[$i_]} > /dev/null 2>&1
925                eval file_out=${file_out_}
926                (( i_ = i+2 ))
927                eval flag_post=\${${ListFilesName}[$i_]} > /dev/null 2>&1
928                #
929                generic_file_name=$( basename ${file_in} .nc )
930                nb_rebuild_file=$( ls | grep "^${generic_file_name}_[0-9]*.nc" | wc -l )
931                #
932                if ( [ ${nb_rebuild_file} -eq 1 ] && [ -f ${generic_file_name}_0000.nc ] ) ; then
933                    IGCM_debug_Print 2 "Parallelism with 1 process. Rebuilding ${file_in} not needed"
934                    IGCM_sys_Mv ${generic_file_name}_0000.nc ${file_in}
935                elif [ ${nb_rebuild_file} -gt 1 ] ; then
936                    IGCM_debug_Print 2 "Parallelism detected rebuilding ${file_in} is needed"
937                    if ( [ X${config_Post_RebuildFrequency} = X${NULL_STR} ] || [ X${config_Post_RebuildFrequency} = XNONE ] ) ; then
938                        IGCM_debug_Print 2 "Rebuilding ${file_in} online"
939                        IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc
940                    else
941                        IGCM_debug_Print 2 "Preparing offline rebuild for ${file_in}"
942                        [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
943                        IGCM_sys_Mv ${generic_file_name}_????.nc ${RUN_DIR}/REBUILD_${PeriodDateBegin}
944
945                        # Prepare headers for the shell dedicated to offline rebuild
946                        if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
947                            if [ $DRYRUN -le 1 ]; then
948                            echo "#!/bin/ksh                                          " > ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
949                            echo "function IGCM_FlushRebuild                          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
950                            echo "{                                                   " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
951                            echo "IGCM_debug_PushStack \"IGCM_FlushRebuild\"          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
952                            echo "echo                                                " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
953                            echo "IGCM_debug_Print 1 \"IGCM_FlushRebuild\"            " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
954                            echo "echo                                                " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
955                            echo "export R_SAVE=${R_SAVE}                             " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
956                            echo "export config_UserChoices_JobName=${config_UserChoices_JobName} " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
957                            fi
958                        fi
959                        # Prepare the shell dedicated to offline rebuild
960                        if [ $DRYRUN -le 1 ]; then
961                            echo "IGCM_sys_rebuild ${file_in} ${generic_file_name}_*.nc   " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
962                            echo "IGCM_debug_Verif_Exit_Post                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
963                        fi
964                        #
965                        # Load Patch we need to apply and apply
966                        if [ $DRYRUN -le 1 ]; then
967                            if [ X$( eval echo \${${compname}_${flag_post}_Patches[0]} ) !=  X${NULL_STR} ]; then
968                                for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
969                                    echo ". ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh" >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
970                                    echo "IGCM_${Patch} ${file_in}                        " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
971                                    echo "IGCM_debug_Verif_Exit_Post                      " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
972                                done
973                            fi
974                        fi
975                        #
976                        if [ $DRYRUN -le 1 ]; then
977                            echo "IGCM_sys_Put_Out ${file_in} ${file_out}                 " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
978                            echo "IGCM_debug_Verif_Exit_Post                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
979                            echo "IGCM_sys_Rm ${generic_file_name}_*.nc                   " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
980                        fi
981                        SaveOnArchive=false
982                    fi
983                fi
984                #
985                if [ ${SaveOnArchive} = true ] ; then
986                    #
987                    # If we need to apply a patch we use TMP DIRECTORY before ARCHIVING if asynchronous rebuild is on
988                    #
989                    thereisapatch=$( eval echo \${${compname}_${flag_post}_Patches[0]} )
990                   
991                    if ( [ ! X${thereisapatch} =  X${NULL_STR} ] && [ ! X${config_Post_RebuildFrequency} = X ] && [ ! X${config_Post_RebuildFrequency} = XNONE ] ) ; then
992                        if [ -f ${file_in} ] ; then
993                            [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
994
995                            IGCM_sys_Mv ${file_in} ${RUN_DIR}/REBUILD_${PeriodDateBegin}
996                            eval FileToBeDeleted[${#FileToBeDeleted[@]}]=REBUILD_${PeriodDateBegin}/${file_in} > /dev/null 2>&1
997                            #
998                            if [ $DRYRUN -le 1 ]; then
999                                if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
1000                                    echo "#!/bin/ksh                                          " > ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1001                                    echo "function IGCM_FlushRebuild                          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1002                                    echo "{                                                   " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1003                                    echo "IGCM_debug_PushStack \"IGCM_FlushRebuild\"          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1004                                    echo "echo                                                " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1005                                    echo "IGCM_debug_Print 1 \"IGCM_FlushRebuild\"            " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1006                                    echo "echo                                                " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1007                                fi
1008                                #
1009                                for Patch in $( eval echo \${${compname}_${flag_post}_Patches[*]} ); do
1010                                    echo ". ${libIGCM_POST}/libIGCM_post/IGCM_${Patch}.ksh    " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1011                                    echo "IGCM_${Patch} ${file_in}                            " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1012                                    echo "IGCM_debug_Verif_Exit_Post                          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1013                                done
1014                                #
1015                                echo "IGCM_sys_Put_Out ${file_in} ${file_out}                 " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1016                                echo "IGCM_debug_Verif_Exit_Post                              " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1017                                #
1018                            fi
1019                        fi
1020                    else
1021                        [ ! -d ${RUN_DIR}/REBUILD_${PeriodDateBegin} ] && IGCM_sys_Mkdir ${RUN_DIR}/REBUILD_${PeriodDateBegin}
1022                        if [ ! -f ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh ] ; then
1023                            echo "#!/bin/ksh                                          " > ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1024                            echo "function IGCM_FlushRebuild                          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1025                            echo "{                                                   " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1026                            echo "IGCM_debug_PushStack \"IGCM_FlushRebuild\"          " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1027                            echo "echo                                                " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1028                            echo "IGCM_debug_Print 1 \"IGCM_FlushRebuild\"            " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1029                            echo "echo                                                " >> ${RUN_DIR}/REBUILD_${PeriodDateBegin}/rebuild.ksh
1030                        fi
1031
1032                        IGCM_sys_Put_Out ${file_in} ${file_out}
1033                        [ $? -eq 0 ] && eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
1034                        if [ ${nb_rebuild_file} -gt 1 ] ; then
1035                            for DelFile in $( ls | grep "${generic_file_name}[_0-9]*.nc" ) ; do
1036                                eval FileToBeDeleted[${#FileToBeDeleted[@]}]=${DelFile} > /dev/null 2>&1
1037                            done
1038                        fi
1039                    fi
1040                fi
1041                (( i=i+3 ))
1042            done
1043        fi
1044
1045        # Save Output Text files of models
1046        #---------------------------------
1047       
1048        IGCM_card_DefineArrayFromOption ${card} OutputText List
1049        ListTextName=${compname}_OutputText_List
1050       
1051        eval TextName0=\${${ListTextName}[0]} > /dev/null 2>&1
1052        if [ X${TextName0} != X${NULL_STR} ] ; then
1053            eval NbFiles=\${#${ListTextName}[@]} > /dev/null 2>&1
1054
1055            (( i=0 ))
1056            until [ $i -eq $NbFiles ]; do
1057                eval file_in=\${${ListTextName}[$i]} > /dev/null 2>&1
1058                (( i=i+1 ))
1059
1060                unset list_file
1061                #set +A list_file -- $( ls ${file_in}* | sort 2>/dev/null )
1062                #  result for a a1 a10 a2 with file_in=a a a1 a2 a10
1063                set +A list_file -- $( [ -f ${file_in} ] && ls ${file_in} ; for i in $(ls ${file_in}* 2>/dev/null | sed "s/${file_in}//" | sort -n) ; do ls ${file_in}$i ; done )
1064                nlist_file=${#list_file[@]}
1065                if [ ${nlist_file} -gt 1 ] ; then
1066                    if ( ${compactoutputs} ) ; then
1067                        eval file_out=${PREFIX}_${file_in}
1068
1069                        IGCM_debug_Print 2 "Parallelism of Text Output with ${nlist_file} files."
1070                        IGCM_debug_Print 2 "Compact files in ${file_out} : " ${list_file[*]}
1071                        echo ${list_file[*]} > ${file_out}
1072                        echo "" >> ${file_out}
1073                       
1074                        (( i_ = 0 ))
1075                        for file in ${list_file[@]}
1076                        do
1077                            echo "_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ " >> ${file_out}
1078                            echo "| " ${i_} " " ${file} >> ${file_out}
1079                            echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " >> ${file_out}
1080                            cat ${file} | sed "s/\(.*\)/${i_}\1/" ${file} >> ${file_out}
1081                            echo "" >> ${file_out}
1082                            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
1083                            (( i_ = i_ + 1 ))
1084                        done
1085                        eval IGCM_sys_Put_Out ${file_out} \${R_OUT_${comp}_D}/${file_out}
1086                        eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_out}" > /dev/null 2>&1
1087
1088                        if ( ${ExecutionFail} ) ; then
1089                            IGCM_sys_Cp ${file_out} ${SUBMIT_DIR}/Debug
1090                        fi
1091                    else
1092                        for file in ${list_file[@]}
1093                        do
1094                            eval IGCM_sys_Put_Out ${file} \${R_OUT_${comp}_D}/${PREFIX}_${file}
1095                            eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file}" > /dev/null 2>&1
1096                        done
1097                        if ( ${ExecutionFail} ) ; then
1098                            IGCM_sys_Cp ${file} ${SUBMIT_DIR}/Debug/${PREFIX}_${file}
1099                        fi
1100                    fi
1101                else
1102                    if ( [ -f ${file_in}_0000 ] || [ -f ${file_in}0 ] ) ; then
1103                        eval IGCM_sys_Mv ${file_in}* ${file_in}
1104                    fi
1105                    eval IGCM_sys_Put_Out ${file_in} \${R_OUT_${comp}_D}/${PREFIX}_${file_in}
1106                    [ $? -eq 0 ] && eval FileToBeDeleted[${#FileToBeDeleted[@]}]="${file_in}" > /dev/null 2>&1
1107
1108                    if ( ${ExecutionFail} ) ; then
1109                        IGCM_sys_Cp ${file_in} ${SUBMIT_DIR}/Debug/${PREFIX}_${file_in}
1110                    fi
1111                fi
1112            done
1113        fi
1114    done
1115
1116    IGCM_debug_PopStack "IGCM_comp_Finalize"
1117}
Note: See TracBrowser for help on using the repository browser.