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

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